function launchEvent(obj, eventname){
    //Internet explorer
    if(window.ActiveXObject){
        eventname = "on" + eventname;
        obj.fireEvent(eventname);
    }
    //Firefox e browser Gecko
    if(navigator.product == 'Gecko'){
        var evt = document.createEvent("HTMLEvents");
        evt.initEvent(eventname, true, true ); // event type,bubbling,cancelable
        return !obj.dispatchEvent(evt);
    }
}
/**
 * Lancia una richiesta asincrona
 */
function asynchronousRequest(method, url, input, outputHandler) {
    var http_request = false;
    
    // Mozilla, Safari,...
    if (window.XMLHttpRequest) {
        http_request = new XMLHttpRequest();
        if (http_request.overrideMimeType) {
            http_request.overrideMimeType('text/xml');
        }
    } 
    
    // IE
    else if (window.ActiveXObject) {
        try {
            http_request = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            try {
                http_request = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) {}
        }
    }
    
    if (!http_request) {
        alert('Giving up :( Non riesco a creare una istanza XMLHTTP');
        return false;
    }
    http_request.onreadystatechange = function() {
        asynchronousResponse(http_request, outputHandler);
    };
    http_request.open(method, url, true);
    http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    http_request.send(input);
    return true;   
}

/**
 * Handler per la gestione della risposta ad una richiesta asincrona
 */
function asynchronousResponse(http_request, outputHandler) {
    //alert('asynchronousResponse http_request.readyState = ' + http_request.readyState);
    if (http_request.readyState == 4) {
        if (http_request.status == 200) {
            outputHandler(http_request.responseText);
        } else {
            alert('Si è verificato un problema con la richiesta: ' + http_request.status);
        }
    }
    
}

/**
 *Consente di leggere un campo nella videata in cui si trova il frame
 *fieldId: l'id del campo che si vuole leggere
 *appLocation: l'indirizzo della macchina su cui si trova l'applicazione, compresa la context root
 */
function readOCSField(fieldId, appLocation, outputHandler){
    var prefix = getFeevoParentPrefix();
    var params = getOCSParameters();
    if(prefix){
        if(params.type == "W"){
            outputHandler("");
            return;
        }
        var textfield = parent.document.getElementById(prefix + "." + fieldId);
        var value;
        if(textfield.tagName.toLowerCase() == "div"){
            if(textfield.innerText)
                value = textfield.innerText;
            else
                value = textfield.textContent;
        }
        else{
            value = textfield.value;
        }
        outputHandler(value);
    }
    else{
        var input = "key=" + params.fid + "&message=" + fieldId + "&ENV=" + params.env + "&SYSTEM=" + params.sys + "&type=" + params.type;
        asynchronousRequest("POST", appLocation + "/CReadFieldValue", input, outputHandler);
    }
}

/**
 *Consente di scrivere un campo nella videata in cui si trova il frame
 *fieldId: l'id del campo che si vuole scrivere
 *fieldValue: il valore della variabile
 *appLocation: l'indirizzo della macchina su cui si trova l'applicazione, compresa la context root
 */
function writeOCSField(fieldId, fieldValue, appLocation, outputHandler){
    var prefix = getFeevoParentPrefix();
    var params = getOCSParameters();
    if(prefix){
        if(params.type == "W"){
            outputHandler("OK");
            return;
        }
        var textfield = parent.document.getElementById(prefix + "." + fieldId);
        if(textfield.tagName.toLowerCase() == "div"){
            textfield.innerText = fieldValue;
            textfield.textContent = fieldValue;
            textfield.value = fieldValue;
        }
        else{
            textfield.value = fieldValue;
        }
        parent.checkFormalId(textfield);
        outputHandler("OK");
    }
    else{
        var input = "key=" + params.fid + "&message=" + fieldValue + "&fldId=" + fieldId + "&ENV=" + params.env + "&SYSTEM=" + params.sys + "&type=" + params.type;
        asynchronousRequest("POST", appLocation + "/CWriteFieldValue", input, outputHandler);
    }
}

/**
 *Consente di lanciare l'azione associata al click di un bottone nella videata in cui si trova il frame
 *buttonId: l'id del bottone che si vuole cliccare
 *appLocation: l'indirizzo della macchina su cui si trova l'applicazione, compresa la context root
 */
function clickOCSButton(buttonId, appLocation, outputHandler){
    var prefix = getFeevoParentPrefix();
    var params = getOCSParameters();
    if(prefix){
        if(params.type == "W"){
            outputHandler("OK");
            return;
        }
        var button = parent.document.getElementById(prefix + "." + buttonId);
        launchEvent(button, "mouseup");
        outputHandler("OK");
    }
    else{
        var input = "key=" + params.fid + "&btId=" + buttonId + "&ENV=" + params.env + "&SYSTEM=" + params.sys + "&type=" + params.type;
        asynchronousRequest("POST", appLocation + "/CClickButton", input, outputHandler);
    }
}

/**
 *Consente di bloccare la finestra in cui risiede il frame
 *appLocation: l'indirizzo della macchina su cui si trova l'applicazione, compresa la context root
 */
function coverOCSWindow(appLocation, outputHandler){
    var prefix = getFeevoParentPrefix();
    if(prefix){
        var window = parent.getWindowById(prefix);
        window.coverContent();
        outputHandler("OK");
    }
    else{
        var params = getOCSParameters();
        var input = "key=" + params.fid + "&put=" + true + "&ENV=" + params.env + "&SYSTEM=" + params.sys;
        asynchronousRequest("POST", appLocation + "/CCoverWindow", input, outputHandler);
    }
}

/**
 *Consente di sbloccare la finestra in cui risiede il frame
 *appLocation: l'indirizzo della macchina su cui si trova l'applicazione, compresa la context root
 */
function unCoverOCSWindow(appLocation, outputHandler){
    var prefix = getFeevoParentPrefix();
    if(prefix){
        var window = parent.getWindowById(prefix);
        window.unCoverContent();
        outputHandler("OK");
    }
    else{
        var params = getOCSParameters();
        var input = "key=" + params.fid + "&put=" + false + "&ENV=" + params.env + "&SYSTEM=" + params.sys;
        asynchronousRequest("POST", appLocation + "/CCoverWindow", input, outputHandler);
    }
}

/**
 * Apre un finestra all'interno della pagina feevo, in cui viene inserito un iframe che punta all'url passato come parametro
 * height: altezza della finestra
 * width: larghezza della finestra
 * left: distanza dal bordo sinistro della finestra del browser
 * top: distanza dal bordo superiore della finestra del browser
 * title: titolo della finestra creata
 * URL: indirizzo a cui punta l'iframe creato
 * La funzione ritorna l'oggetto iframe che viene creato
 */
function openOCSExtWin(height, width, left, top, title, URL){
    var prefix = getFeevoParentPrefix();
    if(!prefix){
        return false;
    }
    
    parent.removeImageWait(prefix);
    var iframe = parent.openExternalWindow(prefix, height, width, left, top, title, URL, this);
    return iframe;
}

/**
 * Chiude una finestra generata dalla funzione openOCSExtWin.
 * iframe: l'iframe ritornato dalla funzione openOCSExtWin
 * N.B.: risulta quindi necessario tenere un rifermento all'iframe, per potere chiudere successivamente la finestra
 */
function closeOCSExtWin(iframe, outputHandler){
    if(!iframe){
        return;
    }
    parent.closeExternalWindow(iframe);
    outputHandler("OK");
}

/**
 *Consente di chiudere una videata aperta con l'api OATKPEXWN
 *appLocation: l'indirizzo della macchina su cui si trova l'applicazione, compresa la context root
 */
function closeOCSWin(appLocation, outputHandler){
    var params = getOCSParameters();
    var input = "key=" + params.fid + "&ENV=" + params.env + "&SYSTEM=" + params.sys + "&type=" + params.type;
    asynchronousRequest("POST", appLocation + "/CCloseWin", input, outputHandler);
}

/**
 * Reperisce i parametri che vengono accodati all'URL per la comunicazione con l'AS400
 */
function getOCSParameters(){
    //Esempio URL: http://localhost:8080/ExtSite/index.html?sys=OCS&env=B2B&fid=094542365120&type=W
    var ss = window.location;
    var ssp = ss.href.substring(ss.href.indexOf('?'));
    var ssv = ssp.split('&');
    var sys = ssv[ssv.length - 4].substring(ssv[ssv.length - 4].indexOf('=') + 1);
    var env = ssv[ssv.length - 3].substring(ssv[ssv.length - 3].indexOf('=') + 1);
    var fid = ssv[ssv.length - 2].substring(ssv[ssv.length - 2].indexOf('=') + 1);
    var type = ssv[ssv.length - 1].substring(ssv[ssv.length - 1].indexOf('=') + 1);
    var res = {};
    res.fid = fid;
    res.env = env;
    res.sys = sys;
    res.type = type;
    return res;
}

/**
 * Controlla l'esistenza di una variabile che viene creata se l'URL dell'iframe punta allo stesso dominio
 * della pagina feest
 */
function getFeevoParentPrefix(){
    var prefix;
    try{
        prefix = feevoParentPrefix;
    }
    catch(exc){
        prefix = false;
    }
    return prefix;
}

/**
 * Ritorna il metodo con cui è stata creata la videata che contiene l'iframe
 * I valori di ritorno sono:
 * -apicobol: la videata è stata creata tramite programma cobol OATKPEXWN
 * -apijavascript: la videata è stata creata tramite funzione javascript openOCSExtWin
 * -false: se per caso la varibile utilizzata per sapere la sorgente non è definita viene ritornato false
 */
function getFeevoCreationSource(){
    var ret = "";
    try{
        ret = feevoCreationSource;
    }
    catch(exc){
        ret = false;
    }
    return ret;
}

function getOpener(){
    try{
        ocsOpener.toString();
        return ocsOpener;
    } catch(ex){
        
    }
    return null;
}