// Globale Variablen

var AmisXml;
var AmisRequest;
var AmisResponse;
var AmisDocument;
var runningVorgangsanlageLock = 0;
var lastVorgangsanlagePortalVorgangId;

// callback functions
var callbackVorgangsanlageCompleted;
var callbackVorgangsanlageAborted;

var AmisXmlDoAvailable = false;
var fakingAmisXmlDo = false;
var fakeGUIDCounter = 100000;
var DebugMessages = false;

function checkAmisXmlDoAvailable() {
    if (fakingAmisXmlDo) {
        AmisXmlDoAvailable = true;
        return true;
    }
	try {
		var AmisGUID = new ActiveXObject("AmisXML.CO_GenGUID001");
	}
	catch(exception) {
		return false;
	}
	delete AmisGUID;

	try {
		var AmisKunde = new ActiveXObject("AmisXML.CO_Kunde003");
	}
	catch(exception) {
		return false;
	}
	delete AmisKunde;

	try {
		var AmisVorgang = new ActiveXObject("AmisXML.CO_Antrag003");
	}
	catch(exception) {
		return false;
	}
	delete AmisVorgang;

    AmisXmlDoAvailable = true;
    return true;
}

function fakeAmisXmlDo() {
    if (! AmisXmlDoAvailable) {
        fakingAmisXmlDo = true;
    }
    return fakingAmisXmlDo;
}

function aktivateDebugMessages() {
    DebugMessages = true;
}

function GUID() {
    this.value = "";
}

function getFakeGUID(guid) {
    var d = new Date();
    var t = d.getTime();
    var c = fakeGUIDCounter++;
    guid.value = "ABCDEF1234567" + t + c; 
    return true;
}

function getGUID(guid) {
    if (fakingAmisXmlDo) {
        return(getFakeGUID(guid));
    }
	try {
		var AmisGUID = new ActiveXObject("AmisXML.CO_GenGUID001");
	}
	catch(exception) {
	    if (DebugMessages) { alert(exception.description); }
		return false;
	}
	var amisrequest;
	var amisresponse;
	var amisdocument;
	var Status = 0;
	var version = 105;
	var PStream = ""

	try {
		// initialize the Dienstobjekte
		amisrequest = AmisGUID.CreateRequest();
		amisrequest.SetArgument("OhneDTD","TRUE");
		// retrieve and empty xml-Document
		amisresponse = AmisGUID.GetServiceObject(amisrequest);
		amisdocument = amisresponse.GetDocument();
		PStream = amisdocument.GetContent();
		if (DebugMessages) { alert(PStream); }
		// extract the GUID from the response
   	    var leftPer = PStream.indexOf("<NEW_GUID>")+10;
		var rightPer = PStream.indexOf("</NEW_GUID>");
		if((leftPer >= 0)&&(rightPer >0)&&(leftPer<rightPer)){
		 	guid.value = PStream.substring(leftPer,rightPer);
		}
        if (DebugMessages) { alert(guid.value); }
	} catch(exception) {
		if (DebugMessages) { alert(exception.description); }
		return false;
	}
	delete AmisGUID;
	return true;
}

function KundeVorhanden(PerID) {
    if (fakingAmisXmlDo) {
        return false;
    }
	try {
		var AmisKunde = new ActiveXObject("AmisXML.CO_Kunde003");
	}
	catch(exception) {
	    if (DebugMessages) { alert(exception.description); }
		return false;
	}
	var amisrequest;
	var amisresponse;
	var amisdocument;
	var PStream = ""
	var returncode = false;

	try {
		// Initialisieren der Dienstobjekte
		amisrequest = AmisKunde.CreateRequest();
		amisrequest.SetArgument("OhneDTD","TRUE");
		amisrequest.SetArgument("PerID",PerID);
		//Hole leeres xml-Dokument
		amisresponse = AmisKunde.GetServiceObject(amisrequest);
		amisdocument = amisresponse.GetDocument();
		PStream = amisdocument.GetContent();
		if (DebugMessages) { alert(PStream); }
		//perid extrahieren
	    var leftPerId = PStream.indexOf('<PER_ID rdy="y">');
		if(leftPerId >= 0){
		    returncode = true;
		}
	} catch(exception) {
		if (DebugMessages) { alert(exception.description); }
		return false;
	}
	delete AmisKunde;

	return returncode;
}

function SchreibeKunde(PerID, KundeXML, guid) {
    if (fakingAmisXmlDo) {
        guid.value = PerID;
        return true;
    }
	try {
		var AmisKunde = new ActiveXObject("AmisXML.CO_Kunde003");
	}
	catch(exception) {
	    if (DebugMessages) { alert(exception.description); }
		return false;
	}
	var amisrequest;
	var amisresponse;
	var amisdocument;
	var PStream = ""
	var returncode = false;

	try {
		// Initialisieren der Dienstobjekte
		amisrequest = AmisKunde.CreateRequest();
		amisrequest.SetArgument("OhneDTD","TRUE");
		//Hole leeres xml-Dokument
		amisresponse = AmisKunde.GetServiceObject(amisrequest);
		amisdocument = amisresponse.GetDocument();
		PStream = amisdocument.GetContent();
		amisdocument.SetContent(KundeXML);
		amisrequest.SetArgument("XML",amisdocument);	
		amisresponse = AmisKunde.PutServiceObject(amisrequest);
		amisdocument = amisresponse.GetDocument();
		PStream = amisdocument.GetContent();
		if (DebugMessages) { alert(PStream); }
		//perid extrahieren
	    var leftPer = PStream.indexOf("<AMISID>")+8;
		var rightPer = PStream.indexOf("</AMISID>");
		if((leftPer >= 0)&&(rightPer >0)&&(leftPer<rightPer)){
		 	guid.value = PStream.substring(leftPer,rightPer);
		    returncode = true;
		}
        if (DebugMessages) { alert(guid.value); }
	} catch(exception) {
		if (DebugMessages) { alert(exception.description); }
		return false;
	}
	delete AmisKunde;

	return returncode;
}

function SchreibeVorgang(PerID, VorId, AntragXML, guid) {
    if (fakingAmisXmlDo) {
        guid.value = VorId;
        return true;
    }
	try {
		var AmisVorgang = new ActiveXObject("AmisXML.CO_Antrag003");
	}
	catch(exception) {
	    if (DebugMessages) { alert(exception.description); }
		return false;
	}
	var amisrequest;
	var amisresponse;
	var amisdocument;
	var PStream = ""
	var returncode = false;

	try {
		// Initialisieren der Dienstobjekte
		amisrequest = AmisVorgang.CreateRequest();
		amisrequest.SetArgument("OhneDTD","TRUE");
		//Hole leeres xml-Dokument
		amisresponse = AmisVorgang.GetServiceObject(amisrequest);
		amisdocument = amisresponse.GetDocument();
		PStream = amisdocument.GetContent();
		amisdocument.SetContent(AntragXML);
		amisrequest.SetArgument("xml",amisdocument);	
		amisresponse = AmisVorgang.PutServiceObject(amisrequest);
		amisdocument = amisresponse.GetDocument();
		PStream = amisdocument.GetContent();
		if (DebugMessages) { alert(PStream); }
		//vorid extrahieren
		var leftPer = PStream.indexOf("<AMISID>")+8;
		var rightPer = PStream.indexOf("</AMISID>");
		if((leftPer >= 0)&&(rightPer >0)&&(leftPer<rightPer)){
		    guid.value = PStream.substring(leftPer,rightPer);
		    returncode = true;
		}
        if (DebugMessages) { alert(guid.value); }
	} catch(exception) {
		if (DebugMessages) { alert(exception.description); }
		return false;
	}
	delete AmisVorgang;
	
	return returncode;
}

function callbackVorgangsanlageMitVollstaendigePortalDaten(transport) {
    if (DebugMessages) { 
        alert("callbackVorgangsanlageMitVollstaendigePortalDaten");
        alert(transport.responseText);
    }
    var json = eval('(' + transport.responseText + ')');
    var id           = json["id"];
    var vn_perid     = json["vn_perid"];
    var amis_vorid   = json["amis_vorid"];
    var kunde003xml  = json["kunde003xml"];
    var antrag003xml = json["antrag003xml"];
    var returncode   = json["returncode"];
    var guid_perid = new GUID();
    guid_perid.value = vn_perid;
    var guid_vorid = new GUID();
    guid_vorid.value = amis_vorid;

    if (!returncode) {
        if (DebugMessages) { alert("aborting"); }
        abortVorgangsanlage(id, "callbackVorgangsanlageMitVollstaendigePortalDaten: retrieving Vorgangsanlage information from portal failed")
        return false;
    }
    else {
        if (DebugMessages) { 
            alert(kunde003xml);
            alert(antrag003xml);
        }
        // check if customer with vn_perid exists
        if ( ! KundeVorhanden(vn_perid)) {
          if (!SchreibeKunde(vn_perid, kunde003xml, guid_perid)) {
            abortVorgangsanlage(id, "callbackVorgangsanlageMitVollstaendigePortalDaten: creating AmisXmlDo Kunde003 failed");
            return false;
          }
        }
        if ( ! SchreibeVorgang(vn_perid, amis_vorid, antrag003xml, guid_vorid)) {
          abortVorgangsanlage(id, "callbackVorgangsanlageMitVollstaendigePortalDaten: creating AmisXmlDo Antrag003 failed");
          return false;
        }
        // update assigned GUIDs and amis_kdv_gespeichert status to portal
        var p = {id: id, vn_perid: guid_perid.value, amis_vorid: guid_vorid.value, amis_kdv_gespeichert: 1};
        var h = $H(p);
        if (DebugMessages) { alert(h.toQueryString()); }
        var params = h.toQueryString();
        new Ajax.Request('/isp-fachmann/amis-kdv-vorgangsanlage.html', {
            parameters: params,
            onSuccess: endVorgangsanlage,
            onException: function(e){
                abortVorgangsanlage(lastVorgangsanlagePortalVorgangId, "callbackVorgangsanlageMitVollstaendigePortalDaten: updating assigned GUIDs and amis_kdv_gespeichert status to amis-kdv-vorgangsanlage exception: " + e);
            },
            onFailure: function(transport){
                abortVorgangsanlage(lastVorgangsanlagePortalVorgangId, "callbackVorgangsanlageMitVollstaendigePortalDaten: updating assigned GUIDs and amis_kdv_gespeichert status to amis-kdv-vorgangsanlage failed: " + transport.status);
                }
            });
    }
    return 1;
}

function callbackVorgangsanlageMitPortalDaten(transport) {
    var json = eval('(' + transport.responseText + ')');
    var id         = json["id"];
    var vn_perid   = json["vn_perid"];
    var amis_vorid = json["amis_vorid"];
    var returncode = json["returncode"];
    var guid;
    if (DebugMessages) { alert("callbackVorgangsanlageMitPortalDaten"); }
    if (!returncode) {
        abortVorgangsanlage(id, "callbackVorgangsanlageMitPortalDaten: retrieving Vorgangsanlage information from portal failed")
    }
    else if (vn_perid == null || vn_perid == "" || amis_vorid == null || amis_vorid == "") {
        // allocate GUIDs and report back to the portal
        if (vn_perid == null || vn_perid == "") {
            guid = new GUID();
            if ( getGUID(guid) ) {
                vn_perid = guid.value;
            }
            else { 
                abortVorgangsanlage(lastVorgangsanlagePortalVorgangId, "callbackVorgangsanlageMitPortalDaten: generating GUIDs for vn_perid failed.");
            }
        }
        
        if (amis_vorid == null || amis_vorid == "") {
            guid = new GUID();
            if ( getGUID(guid) ) {
                amis_vorid = guid.value;
            }
            else { 
                abortVorgangsanlage(lastVorgangsanlagePortalVorgangId, "callbackVorgangsanlageMitPortalDaten: generating GUIDs for amis_vorid failed.");
            }
        }
        
        // report the reserved GUIDs to the portal
        var p = {id: id, vn_perid: vn_perid, amis_vorid: amis_vorid};
        var h = $H(p);
        if (DebugMessages) { alert(h.toQueryString()); }
        var params = h.toQueryString();
        new Ajax.Request('/isp-fachmann/amis-kdv-vorgangsanlage.html', {
            parameters: params,
            onSuccess: callbackVorgangsanlageMitVollstaendigePortalDaten,
            onException: function(e){
                abortVorgangsanlage(lastVorgangsanlagePortalVorgangId, "callbackVorgangsanlageMitPortalDaten: updating reserved GUIDs to amis-kdv-vorgangsanlage exception: " + e);
            },
            onFailure: function(transport){
                abortVorgangsanlage(lastVorgangsanlagePortalVorgangId, "callbackVorgangsanlageMitPortalDaten: updating reserved GUIDs to amis-kdv-vorgangsanlage failed: " + transport.status);
                }
            });
        return 1;
    } else {
        // go ahead and create the vorgang with the known GUIDs
        return callbackVorgangsanlageMitVollstaendigePortalDaten(transport);
    }
}

function beginVorgangsanlageMitPortalVorgangId(PortalVorgangId)
{
    if (runningVorgangsanlageLock) {
      if (DebugMessages) { alert("Eine Vorgangsanlage wurde schon gestartet"); }
      return 0;
    } else {
      runningVorgangsanlageLock = 1;
      lastVorgangsanlagePortalVorgangId = PortalVorgangId
    }
    
    // request the information for creating the vorgang and customer from the portal
    var p = {id: PortalVorgangId};
    var h = $H(p);
    var params = h.toQueryString();
    new Ajax.Request('/isp-fachmann/amis-kdv-vorgangsanlage.html', {
        parameters: params,
        onSuccess: callbackVorgangsanlageMitPortalDaten,
        onException: function(e){
            abortVorgangsanlage(lastVorgangsanlagePortalVorgangId, "beginVorgangsanlageMitPortalVorgangId: Requesting amis-kdv-vorgangsanlage exception: " + e);
        },
        onFailure: function(transport){
            abortVorgangsanlage(lastVorgangsanlagePortalVorgangId, "beginVorgangsanlageMitPortalVorgangId: Requesting amis-kdv-vorgangsanlage failed: " + transport.status);
        }
    });
    
    return 1;
}

function alertVorgangsanlage(PortalVorgangId, kdv_message)
{
    // report an alert message to the portal for logging 
    var p = {id: PortalVorgangId, kdv_message: kdv_message};
    var h = $H(p);
    var params = h.toQueryString();
    new Ajax.Request('/applikation/ajax/amis-kdv-vorgangsanlage-logger.html', {
        parameters: params
    });

}

function abortVorgangsanlage(PortalVorgangId, kdv_message)
{
    if (DebugMessages) { alert(kdv_message); }
    if (typeof callbackVorgangsanlageAborted == 'function') {
        callbackVorgangsanlageAborted(lastVorgangsanlagePortalVorgangId);
    }
    // abort the running Vorgangsanlage and remove the Lock
    runningVorgangsanlageLock = 0;
    // report an alert message to the portal for logging 
    alertVorgangsanlage(PortalVorgangId, kdv_message);
}

function endVorgangsanlage(transport)
{
    if (typeof callbackVorgangsanlageCompleted == 'function') {
        callbackVorgangsanlageCompleted(lastVorgangsanlagePortalVorgangId);
    }
    runningVorgangsanlageLock = 0;
    if (DebugMessages) { alert("Fertig"); }
}

function registerCallbackVorgangsanlageCompleted(func) {
    callbackVorgangsanlageCompleted = func;
}

function registerCallbackVorgangsanlageAborted(func) {
    callbackVorgangsanlageAborted = func;
}

