/* funkce pro interakci s Javou, potrebuji jQuery */

var formCompletelyLoaded = false;

//provedeni onchange funkci az po registraci Autocomplete
//on ready se provadi v poradi, v jakem jsou registrovany.
//zde se registruje funkce, ktera po nacteni zaregistruje provedeni onchange "nakonci" a navic az za 1s (problem na HD)
YAHOO.util.Event.onDOMReady(function(){
    YAHOO.util.Event.onDOMReady(function(){
        setTimeout(function(){
            var dfStartWith = 'dynamicFieldValue';
            if((typeof HD != "undefined"))
                 dfStartWith = 'dynamicFields.';
            else if((typeof KB != "undefined"))
                dfStartWith = '1:task.dynamicFields.';
            $('*[name^="'+dfStartWith+'"]').trigger('tp_click');
            formCompletelyLoaded = true;
        }, 1000);
    });
});

/* nastavuje hodnotu selectboxu/ostatni klasicky - pro IE se musi vybrat moznost*/
function setValue(jElement, value){
    var validValue = null;
    jElement.find('option').each(function(){
        if(validValue == null) validValue = this.value;
        if(this.value == value) {
            this.selected = 'selected';
            validValue = this.value;
        }
    });
    if(validValue == null) validValue = value;
    jElement.get(0).value = validValue;
}

/* vraci nazev inputu dyn.pole podle pouzitiho modulu*/
function getDfInput(id, name){
    if((typeof HD != "undefined"))
        return 'dynamicFields.'+name;
    if((typeof KB != "undefined"))
        return '1:task.dynamicFields.'+name;
	return 'dynamicFieldValue['+id+']';
}

/* vraci nazev inputu stat.pole podle pouzitiho modulu*/
function getStaticFieldByName(name){
    if((typeof HD != "undefined"))
        return 'hd_'+name;
    if((typeof KB != "undefined"))
        return '1:task.'+name;
	return name;
}

/* vraci identifikator dyn.pole podle pouzitiho modulu*/
function getDfIndent(inputName){
    if((typeof HD != "undefined"))
        return inputName.replace('dynamicFields.','');
    if((typeof KB != "undefined"))
        return inputName.replace('1:task.dynamicFields.','');
	return inputName.replace('dynamicFieldValue[','').replace(']','');
}

/* vraci inicializacni hodnotu daneho pole
* pomoci promenne uninitialOnly rozlisuje, zda ma akceptovat jen prvni inicializaci
*/
function getInitialTaskValues(fieldName){
    if((typeof initialTaskValues == "undefined") || initialTaskValues == null)
        return null;
    var v = null;
    if(fieldName.substring(0,12) == "dynamicField")
        v = initialTaskValues['dynamicFields'][getDfIndent(fieldName)];
    else
        v = initialTaskValues[fieldName];
    if(!formCompletelyLoaded)
        return v;
	return null;
}

function fillSelectBox(selectBoxName, options) {
    var select = $('select[name="' + selectBoxName + '"]');
    var currVal = getInitialTaskValues(selectBoxName);
    if(currVal == null)
        currVal = select.attr('value');
    select.empty();
    if (!select.length) return;
    options.each(function() {
        select.html(select.html()+'<option value="' + $(this).attr('id') + '">' + $(this).text() + '</option>');
    });
    setValue(select, currVal);
    //volani onchange produkuje REKURZI!
}

function alternateRequest(autocompleteName, params, options, updateHiddenInput) {
    var data = AutoComplete.registry[autocompleteName+'_typeBox'];
    if (!data) return;
    var attr;
    for (attr in params) {
        data.acSettings.extraParams[attr] = params[attr];
    }
    var currValue = $('input[name="' + autocompleteName + '"]').get(0).value;
    AutoComplete.updateExtraParams(autocompleteName+'_typeBox', data.acSettings.extraParams);
    if(updateHiddenInput){
        var currValueFound = false;
        var option;
        for(var i = 0; i < options.length; i++){
            option = options.eq(i);
            if(option.attr('id') == currValue){
                $('input[name="' + autocompleteName + '"]').attr('value', option.attr('id'));
                $('input[id="' + autocompleteName + '_typeBox"]').attr('value', option.text());
                currValueFound = true;
            }
            if(currValueFound)
                break;
        }
        if(!currValueFound){
            $('input[name="' + autocompleteName + '"]').attr('value', options.eq(0).attr('id'));
            $('input[id="' + autocompleteName + '_typeBox"]').attr('value', options.eq(0).text());
        }
    }
}

function LoadDependentOptions(dependentDf, selectedValue){
    logger("LoadDependentOptions "+dependentDf);
    showProgress();
    $.ajax({ url:'ajaxFunctionServlet', data: {
            functionName: 'cz.bellman.jobpool.functions.LoadDependentOptions',
            fieldName: dependentDf,
            parentValue: selectedValue
        }, success: function(data) {
            var rootEl = $(data);
            var dfInputName = getDfInput(rootEl.find('fieldId').text(),rootEl.find('name').text());
            var options = $(data).find('option');
            if ($('select[name="'+dfInputName+'"]').length) { /* select box */
                fillSelectBox(dfInputName, options);
            } else { /* autocomplete */
                var acbox = $('input[name="'+dfInputName+'"]');
                if (acbox.length) {
                    alternateRequest(dfInputName, {
                        parentValue: selectedValue
                    }, options, true);
                }
            }
            hideProgress();
        },async: false
    });
}

function LoadDfValuesFromDb(authId, sql, selectedValue){
    logger("LoadDfValuesFromDb authId: "+authId+" sql:'"+sql+"', selectedValue: "+selectedValue);
    showProgress();
    $.ajax({url: 'ajaxFunctionServlet', data: {
        functionName: 'cz.bellman.jobpool.functions.LoadDfValuesFromDb',
        authId: authId,
        fieldValue: selectedValue,
        sqlSelect: sql
    }, success: function(data) {
        $(data).find('field').each(function() {
            var inputName;
            var name = $(this).attr('name');
            var value = $(this).text();
            if ($(this).attr('dynamicFieldId')) {
                inputName = getDfInput($(this).attr('dynamicFieldId'), name);
            } else {
                inputName = getStaticFieldByName(name);
            }
            var field = $('*[name="' + inputName + '"]');
            //pri existenci pole - obslouzit, jinak otestovat existenci promenne - pripadne obslouzit
            if (field.length){
                var formValue = getInitialTaskValues(inputName);
                if(formValue == null || formValue == ''){
                    setValue(field, value);
                    executeOnchangeEvents(field);
                }else
                    setValue(field, formValue);
            }else{
                 $(document).data(name,value);
            }
        });
        hideProgress();
    }, async: false});
}

function LoadValuesFromDb(authId, sql, paramValues){
    logger("LoadValuesFromDb authId: "+authId+" sql:'"+sql+"', paramValues: "+paramValues);
    showProgress();
    var result = new Array();
    $.ajax({url: 'ajaxFunctionServlet', data: {
        functionName: 'cz.bellman.jobpool.functions.LoadValuesFromDb',
        authId: authId,
        paramValues: paramValues,
        sqlSelect: sql
    }, success: function(data) {
        $(data).find('row').each(function() {
	        var row = new Object();
	        $(this).find('item').each(function(){
		        var itemXml = $(this);
		        row[itemXml.attr('name')] = itemXml.text();
	        });
	        result[result.length] = row;
        });
    }, async: false, traditional: true});
    hideProgress();
    return result;
}

function LoadDependentOptionsByHdUsername(dependentDf){
    logger("LoadDependentOptionsByHdUsername "+dependentDf);
    showProgress();
    var userId = null;
    if ($('input[name=hd_login]').length) userId = $('input[name=hd_login]').get(0).value;
    if ($('input[name=helpdeskUserId]').length) userId = $('input[name=helpdeskUserId]').get(0).value;
    $.ajax({url:'ajaxFunctionServlet', data:{
        functionName: 'cz.bellman.jobpool.functions.LoadDependentOptionsByHdUsername',
        fieldName: dependentDf,
        helpdeskUserId: userId,
        presentedHelpdeskUserId: userId != null
    }, success: function(data, status) {
        var rootEl = $(data);
        var dfInputName = getDfInput(rootEl.find('fieldId').text(),rootEl.find('name').text());
        var options = $(data).find('option');
        if ($('select[name="'+dfInputName+'"]').length) { /* select box */
            fillSelectBox(dfInputName, options);
        } else { /* autocomplete */
            var acbox = $('input[name="'+dfInputName+'"]');
            if (acbox.length) {
                alternateRequest(dfInputName, {
                    parentValue: userId
                }, options, false);
            }
        }
        hideProgress();
    }, async: false});
}

//AJAX onchange funkce jsou registrovany pomoci YUI, html onchange nepouzivat (zaskrtava v editaci tasku zmenu stavu)
function executeOnchangeEvents(field){
    if(typeof(field.get(0).onchange) == "function"){
        field.get(0).onchange();
        logger("Executed HTML onchange event on field: 'id:"+field.attr('id')+", name:"+field.attr('name')+"'");
    }

    field.trigger('change');
    logger("Triggered YUI change event on field: 'id:"+field.attr('id')+", name:"+field.attr('name')+"'");

    if(typeof HD == "undefined"){
        var el = YAHOO.util.Event.getListeners(field.get(0), 'change');
        if (el != null && el.length > 0){
            el[0].fn.call(field.get(0));
            logger("Executed YUI change listener on field: 'id:"+field.attr('id')+", name:"+field.attr('name')+"'");
        }
    }
}

function logger(message){
    if(typeof Log != "undefined")
        Log.add(message);
    else if(typeof HD != "undefined")
        HD.log(message);
}

function showProgress(){
    logger("show progress for java helpers.");
    //SubmitHandler.run();
}

function hideProgress(){
    logger("hide progress for java helpers.");
    //SubmitHandler.hide();
}

var loadedScriptsIdent = new Object();

function LoadScriptAsync(url){
	$.getScript(url);
}

function LoadScriptSync(url){
	$.ajax({type: "GET", url: url, dataType: "script", async: false});
}

function LoadScriptOnceAsync(ident, url, callback){
	if(typeof loadedScriptsIdent[ident] == 'undefined'){
		LoadScriptAsync(url);
		loadedScriptsIdent[ident] = 1;
	}
    eval(callback);
}

function LoadScriptOnceSync(ident, url, callback){
	if(typeof loadedScriptsIdent[ident] == 'undefined'){
		LoadScriptSync(url);
		loadedScriptsIdent[ident] = 1;
	}
    eval(callback);
}

