/**
* Zmienna przechowująca formularz, który będzie zatwierdzony
* w przypadku poprawnego PINu
*
* @access public
* @var object
*/
var formObjectPIN = '';

/**
* Zmienna przechowująca link, który będzie użyty do przeładowania strony na niego
* w przypadku poprawnego PINu
*
* @access public
* @var object
*/
var linkPIN = '';
/**
* Zmienna przechowująca funkcję, która zostanie wywołana w przypadku podania poprawnego pinu
*
* @access public
* @var object
*/
var callbackFunctionPIN = function(){};

/**
* Zmienna przechowująca informację, czy zatwierdzanie akcji jest na formularzu czy akcji linkowej
*
* @access public
* @var object
*/
var formOrLinkVersion = 'form';


/**
* Metoda uruchamiająca walidujące formularzy poprzez kontrolę wprowadzanych znaków
*
* @access public
* @param object formObject - formularz, na którym odbywa się walidacja
* @param event event - zdarzenie, jakie wywołano na formularzu
* @param string section - sekcja, do której użytkownik próbuje uzyskać dostęp
* @param string section_action - akcja w sekcji, do którą próbuje wykonać użytkownik
* @param string section_action_operation - operacja w akcji sekcji, którą próbuje wykonać użytkownik
* @param string kind - rodzaj walidacji do przeprowadzenia (standardowo "form_validation"). Od tego parametru zależy jaka metoda zostanie uruchomiona
* @param string error_content_id - element w widoku przechowujący i wyświetlający błędy walidacji
* @return bool - zwraca wynik logiczny czy formularz został zatwierdzony czy wymaga poprawny/walidacji/nie był zatwierdzany
*/
function form_validate(formObject, event, section, section_action, section_action_operation, kind, error_content_id) {
    //sprawdzenie wciskania znaków w formularzu
    if (form_submit_on_enter_ok(formObject, event)) {
        //wciśnięto enter lub klinięto zapis
        form_validate_direct(formObject, section, section_action, section_action_operation, kind, error_content_id)
    } else {
        //nie wciśnięto entera oraz nie kliknięto zapisu, to jest normalne wejście w funkcje bez potwierdzenia
        return false;
    }
}


/**
* Metoda walidująca formularz o podanym identyfikatorze
*
* @access public
* @param object formObject - formularz, na którym odbywa się walidacja
* @param string section - sekcja, do której użytkownik próbuje uzyskać dostęp
* @param string section_action - akcja w sekcji, do którą próbuje wykonać użytkownik
* @param string section_action_operation - operacja w akcji sekcji, którą próbuje wykonać użytkownik
* @param string kind - rodzaj walidacji do przeprowadzenia (standardowo "form_validation"). Od tego parametru zależy jaka metoda zostanie uruchomiona
* @param string error_content_id - element w widoku przechowujący i wyświetlający błędy walidacji
* @return bool - zwraca wynik logiczny czy formularz został zwalidowany poprawnie
*/
function form_validate_direct(formObject, section, section_action, section_action_operation, kind, error_content_id) {
    saving_screen('show', 'Proszę czekać... trwa sprawdzanie danych...');

    if (kind == undefined) {
        //standardowy rodzaj walidacji, jeżeli nie podano żadnego
        kind = 'form_validation';
    }
    if (error_content_id == undefined) {
        //standardowy element przechowujący błędy, jeżeli nie podano żadnego
        error_content_id = 'error_content';
    }
    //walidacja formularza
    if (xajax_call('s', section, kind, section_action, xajax.getFormValues(formObject.getAttribute('id')), formObject.getAttribute('id'), error_content_id) == true) {
        //walidacja się powiodła

        //sprawdzenie, czy wymagany jest PIN i ewentualnie wyświetlenie formatki jego podawania
        return pin_needed(formObject, section, section_action, section_action_operation);
    } else {
        //walidacja się nie powiodła
        saving_screen('hide');
        return false;
    }
}


/**
* Metoda wywołująca sprawdzenie czy potrzebny jest PIN dla akcji i ewentualnie wywołująca
* zatwierdzenie formularza jeżeli PIN jest niepotrzebny lub wyświetlenie okienka do
* wprowadzenia PINu w przypadku konieczności jego podania
*
* @access public
* @param object formObject - formularz, na którym odbywa się walidacja
* @param string section - sekcja, do której użytkownik próbuje uzyskać dostęp
* @param string section_action - akcja w sekcji, do którą próbuje wykonać użytkownik
* @param string section_action_operation - operacja w akcji sekcji, którą próbuje wykonać użytkownik
* @return bool - zwraca wynik logiczny sprawdzenia czy formularz został zatwierdzony (TRUE) czy potrzebne jest podanie PINu
*/
function pin_needed(formObject, section, section_action, section_action_operation) {
    if (formObject != undefined) {
        //PIN nie jest wymagany, można zapisać dane
        saving_screen('show', 'Proszę czekać... trwa zapisywanie danych...');
        //przy zatwierdzaniu formularza można odpiąć ewentualne zdarzenia kontroli utraty danych
        window.beforeunload = null;
        //przesłanie formularza
        formObject.submit();
        return true;
    } else {
        //błąd, brak formularza do zatwierdzenia
        alert('Bardzo przepraszamy, ale wystąpił błąd podczas próby zatwierdzenia formularza.\nKod błędu: JSFVAPPN01');
        return false;
    }
}


/**
* Metoda wywołująca sprawdzenie czy potrzebny jest PIN dla akcji i ewentualnie wywołująca
* zatwierdzenie formularza jeżeli PIN jest niepotrzebny lub wyświetlenie okienka do
* wprowadzenia PINu w przypadku konieczności jego podania
*
* @access public
* @param string link - link, na który ma być przkierowany użytkownik jeżeli PIN będzie poprawny lub niewymagany
* @param string section - sekcja, do której użytkownik próbuje uzyskać dostęp
* @param string section_action - akcja w sekcji, do którą próbuje wykonać użytkownik
* @param string section_action_operation - operacja w akcji sekcji, którą próbuje wykonać użytkownik
* @return bool - zwraca wynik logiczny sprawdzenia czy formularz został zatwierdzony (TRUE) czy potrzebne jest podanie PINu
*/
function pin_needed_simple(link, section, section_action, section_action_operation) {
    //PIN nie jest wymagany, można zapisać dane
    saving_screen('show', 'Proszę czekać... trwa uruchamianie akcji...');
    //przy zatwierdzaniu formularza można odpiąć ewentualne zdarzenia kontroli utraty danych
    window.beforeunload = null;
    //przesłanie formularza
    window.location.href = link;
    return true;
}


/**
* Metoda wywołująca sprawdzenie czy potrzebny jest PIN dla akcji i ewentualnie wywołująca przekazaną funkcję
* jeżeli PIN jest niepotrzebny lub wyświetlenie okienka do
* wprowadzenia PINu w przypadku konieczności jego podania
*
* @access public
* @param string callback_function - funkcja, która zostanie wywołana, jeżeli PIN będzie poprawny lub niewymagany
* @param string section - sekcja, do której użytkownik próbuje uzyskać dostęp
* @param string section_action - akcja w sekcji, do którą próbuje wykonać użytkownik
* @param string section_action_operation - operacja w akcji sekcji, którą próbuje wykonać użytkownik
* @return bool - zwraca wynik logiczny sprawdzenia czy formularz został zatwierdzony (TRUE) czy potrzebne jest podanie PINu
*/
function pin_needed_with_callback(callback_function, section, section_action, section_action_operation) {
    if (typeof callback_function == 'function') {
        //wywołuję funkcję
        callback_function();
        return true;
    } else {
        //błąd, brak funkcji lub nie jest to funkcja
        alert('Bardzo przepraszamy, ale wystąpił błąd podczas próby wywołania funkcji.\nKod błędu: JSFVAPPNWC01');
        return false;
    }
}


/**
* Metoda sprawdzająca poprawność PINu
*
* @access public
* @param int pinIDLength - długość pola z identyfikatorem
* @param int pinCodeLength - długość pola z PINem
* @param int/string pinID - identyfikator
* @param int/string pinCode - PIN
* @return bool - zwraca wynik logiczny sprawdzenia czy PIN jest poprawny
*/
function pin_check(pinIDLength, pinCodeLength, pinID, pinCode) {
    //przesłanie formularza lub wywołanie linku
    if (formOrLinkVersion == 'form') {
        if (formObjectPIN != undefined) {
            saving_screen('show', 'Proszę czekać... trwa zapisywanie danych...');
            //przy zatwierdzaniu formularza można odpiąć ewentualne zdarzenia kontroli utraty danych
            window.beforeunload = null;
            //zatwierdzenie formularza
            formObjectPIN.submit();
        } else {
            //błąd, brak formularza do zatwierdzenia
            alert('Bardzo przepraszamy, ale wystąpił błąd podczas próby zatwierdzenia formularza z PINem.\nKod błędu: JSFVAPPC01');
            return false;
        }
    } else if (formOrLinkVersion == 'function') {
        //ukrycie okienka
        element_value('pin_popup', 'innerHTML', '');
        element_display('pin_popup', 'none');
        if (typeof callbackFunctionPIN == 'function') {
            //wywołanie funkcji
            callbackFunctionPIN();
        } else {
            //błąd, brak funkcji lub nie jest to funkcja
            alert('Bardzo przepraszamy, ale wystąpił błąd podczas próby wywołania funkcji.\nKod błędu: JSFVAPPC02');
            return false;
        }
    } else {
        saving_screen('show', 'Proszę czekać... trwa uruchamianie akcji...');
        //przy zatwierdzaniu formularza można odpiąć ewentualne zdarzenia kontroli utraty danych
        window.beforeunload = null;
        //przeładowanie na link
        window.location.href = linkPIN;
    }
    return true;
}


