var addElemIndexer = 0;
var addRemoveElemCounter = 1;
var maxElemIndex = 40;
var answerPostfix = "_ANSWER";
var errorPostfix = "_ERR";
var messagePostfix = "_MESSAGE";
var questLabelMarker = "_QEST_LABEL";
var headerErrorPrefix = "p_error_";
var answerRegExp = new RegExp(answerPostfix + '$', 'g');
var componentRegExp = new RegExp('^' + componentId, 'g');

function removeElementById(removeElement, pIdPrefix){
    var parrentObj = removeElement.parentNode;
    while (parrentObj && parrentObj != undefined && parrentObj != null) {
        if (parrentObj.id.indexOf(pIdPrefix) == 0) {
            if (parrentObj.id == pIdPrefix) {
                //hiding
                parrentObj.style.display = 'none';
                showHideProperElements(parrentObj, true, true, null);
                var obj = parrentObj.cloneNode(true);
                var mainParrent = parrentObj.parentNode;
                mainParrent.removeChild(parrentObj);
                var laztChild = getLastChild(mainParrent);
                mainParrent.insertBefore(obj, laztChild);
            }
            else {
                //removing
                var mainParrent = parrentObj.parentNode;
                //usuwanie walidacji z listy
                removeUnnecessaryValidations(parrentObj, 'input');
                removeUnnecessaryValidations(parrentObj, 'select');
                mainParrent.removeChild(parrentObj);
                addRemoveElemCounter--;
            }
            break;
        }
        else {
            parrentObj = parrentObj.parentNode;
        }
    }
}

function copyElementById(copyElementId, toElementId, index, insertBeforeId, formId){
    if (addRemoveElemCounter <= maxElemIndex) {
        if ($(copyElementId).style.display == 'none') {
            //showing
            showHideProperElements($(copyElementId), false, true, index);
            $(copyElementId).style.display = '';
        }
        else {
            //adding
            var obj = $(copyElementId).cloneNode(true);
            obj.id = copyElementId + index;
            clearFormElements(obj, index);
            
            if (insertBeforeId != null) {
                $(toElementId).insertBefore(obj, $(insertBeforeId));
            }
            else {
                $(toElementId).appendChild(obj);
            }
            
            manipulateVisualizationElements(obj, 'input', index);
            manipulateVisualizationElements(obj, 'select', index);
        }
        addRemoveElemCounter++;
    }
}

function showHideProperElements(mainElement, disable, clearValues, index){
    var inputs = mainElement.select('input');
    var selects = mainElement.select('select');
    manipulateTableElements(inputs, disable, clearValues, index);
    manipulateTableElements(selects, disable, clearValues, index);
}

function clearFormElements(mainElement, index){
    var inputs = mainElement.select('input');
    var selects = mainElement.select('select');
    manipulateTableElements(inputs, false, true, index);
    manipulateTableElements(selects, false, true, index);
}

function manipulateTableElements(table, disable, clearValues, index){
    if (table && table != undefined && table.length > 0) {
        for (var i = 0; i < table.length; i++) {
            if (disable) {
                table[i].disabled = "disabled";
                if (invisible != null && invisible != undefined) {
                    invisible[table[i].id.replace(componentRegExp, '').replace(answerRegExp, '')] = 1;
                }
            }
            else {
                table[i].disabled = "";
                if (invisible != null && invisible != undefined) {
                    invisible[table[i].id.replace(componentRegExp, '').replace(answerRegExp, '')] = 0;
                }
            }
            if (clearValues) {
                table[i].value = "";
            }
            if (index != null) {
                var earlierInd = table[i].tabIndex;
				if(earlierInd!=null && earlierInd!="") {
	                table[i].tabIndex = index + parseInt(earlierInd);
				}
            }
        }
    }
}

function getLastChild(n){
    x = n.lastChild;
    while (x.nodeType != 1) {
        x = x.previousSibling;
    }
    return x;
}

function addValidationObjectFromList(orgQuestionId, newQuestionId){
    if (validationList != null && validationList.length > 0) {
        for (var i = 0; i < validationList.length; i++) {
            var valObj = validationList[i];
            if (orgQuestionId == valObj.questionId) {
                addValidateFunction(newQuestionId, valObj.pollingId, valObj.functionName);
                return true;
            }
        }
    }
    return false;
}

function removeValidationObjectFromList(orgQuestionId){
    if (validationList != null && validationList.length > 0) {
        for (var i = 0; i < validationList.length; i++) {
            var valObj = validationList[i];
            if (valObj != null && orgQuestionId == valObj.questionId) {
                validationList.splice(i, 1);
                validCount--;
                return true;
            }
        }
    }
    return false;
}

function manipulateVisualizationElements(obj, tableName, index){
    //tworzymy tablice z tagow o odp. nazwie
    var table = obj.select(tableName);
    //iteracja po elementach
    if (table != null && table != undefined) {
        for (i = 0; i < table.length; i++) {
            if (table[i] != null && table[i].id != null && table[i].id.indexOf()) {
                //oryginalna nazwa input/select, przetrzymujemy na pozniej
                var orgTableId = table[i].id;
                //zmieniamy dotychczasowa poprzez dodanie indeksu
                table[i].id = table[i].id.substr(0, table[i].id.indexOf(answerPostfix)).concat(index + answerPostfix);
                var orgQuestionId = orgTableId.replace(componentRegExp, '').replace(answerRegExp, '');
                //zmiana id dla label'a
                var orgLabelId = orgTableId.replace(componentRegExp, '').replace(answerRegExp, questLabelMarker + componentId);
                var thisLabel = obj.select('[id="' + orgLabelId + '"]');
                if (thisLabel != null && thisLabel.length > 0) {
                    thisLabel[0].id = orgQuestionId + index + questLabelMarker + componentId;
                    if (thisLabel[0].hasClassName('questionErr')) {
                        thisLabel[0].removeClassName('questionErr');
                    }
                    if (!thisLabel[0].hasClassName('questionOk')) {
                        thisLabel[0].removeClassName('questionOk');
                    }
                }
                
                //budujemy id bledu
                var orgErrorId = orgTableId.replace(answerRegExp, errorPostfix);
                //pobieramy element o id bledu
                var thisError = obj.select('[id="' + orgErrorId + '"]');
                if (thisError != null && thisError.length > 0) {
                    //zmieniamy id bledu
                    thisError[0].id = orgTableId.replace(answerRegExp, index + errorPostfix);
                    thisError[0].style.display = 'none';//dla bezpieczenstwa - ukryj
                    //pobieramy element o id komunikatu bledu
                    var orgMessageId = orgTableId.replace(answerRegExp, messagePostfix);
                    var thisMessage = obj.select('[id="' + orgMessageId + '"]');
                    //zmieniamy id komunikatu bledu
                    if (thisMessage != null && thisMessage.length > 0) {
                        thisMessage[0].id = orgTableId.replace(answerRegExp, index + messagePostfix);
                    }
                }
                
                //fragment odpowiadajacy za podpiecie generycznej validacji formularza
                var questionId = table[i].id.replace(componentRegExp, '').replace(answerRegExp, '');
                addValidationObjectFromList(orgQuestionId, questionId);
            }
        }
    }
}

function removeUnnecessaryValidations(obj, tableName){
    var table = obj.select(tableName);
    //iteracja po elementach;
    if (table != null && table != undefined) {
        if (table != null && table != undefined && table.length > 0) {
            for (i = 0; i < table.length; i++) {
                var inputId = table[i].id;
                if (inputId != null && inputId != undefined) {
                    var questionId = inputId.replace(componentRegExp, '').replace(answerRegExp, '');
                    removeValidationObjectFromList(questionId);
                    
                    var headerError = $(headerErrorPrefix + questionId);
                    if (headerError != null && headerError != undefined) {
                        var headerErrorParrent = headerError.parentNode;
                        headerErrorParrent.removeChild(headerError);
                    }
                }
            }
        }
    }
}

