/**
 * Provides interactivity for the booking form
 *
 * @author PK
 * @requires jquery-1.3.2.min.js
 * @requires jquery.form-2.28.js
 * @requires Form.js
 * @requires BookingFormHTMLProvider.js
 * @requires BookingFormInterface.js
 */
var BookingForm = function()
{
    this.formPrefix = 'frm';
    this.dataProvider = new BookingFormDataProvider();
    this.arrangementsData = {};
    this.dependencies = {};
    this.formpages = {};
    this.currentpage = 0;
    this.selectedTripId = '';
    this.selectedArrangementId = '';

    this.events = {};


    /**
     * @param   {Number}    pagenum The formpage to return the survey form for
     * @return  {jQuery}            Object containing the form
     */
    this.getFormpage = function(pagenum) {
        return this.formpages[pagenum];
    }

    this.getForm = function(pagenum) {
        return this.getFormpage(pagenum).form;
    }

    this.getFormObject = function(pagenum) {
        return $('#' + this.getForm(pagenum).getAttributes().id);
    }

    this.addFormpage = function(pagenum, formpage, title) {

        // see if the form is already displayed
        if (!(pagenum in this.formpages)) {
            this.formpages[pagenum] = {};
        }

        this.formpages[pagenum]['title'] = title;

        // create and load new form
        var form = new Form(formpage, this.formPrefix, this.dependencies[pagenum], BookingFormHTMLProvider);
        form.load();

        this.formpages[pagenum]['form'] = form;

        var that = this;
        form.bind('elementchange', function(element) { that.onChangeFormElement(element); });
        form.bind('formerror', function(form) { that.trigger('formerror', form); });

        return this.formpages[pagenum]['form'];

    }

    this.draw = function(formPage, obj) {

        var that = this;

        var form = this.getForm(formPage);
        obj.html(form.getHTML());

        // mark required fields
        var rules = form.getRules();
        for (var elementName in rules) {
            for (var i = 0; i < rules[elementName].length; i++) {
                if (rules[elementName][i].getType() == 'required') {

                    // find the object and see if it's not already marked
                    var input = form.getElement(elementName).getObject();
                    var lbl = input.closest('.element').find('.label');
                    if (lbl.text() != '') {
                        lbl.append('<span class="req">*</span>');
                    }
                }
            }
        }

        form.setEvents();

        // enable toggling for preference checkboxes, and trigger it now
        var pref = $('fieldset.preferences .label');
        if (pref.length) {
            pref.click(function() { that.togglePreferences($(this)); }).trigger('click');
        }


        if(formPage == 1) {
            //hide previous button
            document.getElementById('backbutton').style.visibility = 'hidden';

        }

        // fill form with data from DT if needed (only on page 2)
        if (formPage >= 2) {

            var arrangementId = $(':input[name="' + this.formPrefix + 'arrangement_id' + '"]');
            if (arrangementId.length) {

                this.dataProvider.processQueue([['loadTripLocations', [arrangementId.val()]]], that, that.updateLocationOptions);
                this.dataProvider.processQueue([
                                                ['loadArrangementRoomTypes', [arrangementId.val()]],
                                                ['loadRoomTypeDetails', [arrangementId.val()]]
                                               ],
                                               that,
                                               that.updateRoomTypeOptions);
                if (formPage == 3) {
                    this.dataProvider.processQueue([['loadInsurancePrices', [arrangementId.val()]]], that, that.updateInsurancePrices);
                }
            }
        }


        // trigger change event on some inputs
        obj.find('select[name="' + this.formPrefix + 'destination_id"], ' +
                 'select[name="' + this.formPrefix + 'trip_id"], ' +
                 'select[name$="' + this.formPrefix + 'country_id"], ' +
                 ':checked').each(function()
                    {
                        var obj = $(this);

                        // for checked inputs, trigger the group as changed item
                        // TODO fix this
                        if (obj.is(':radio') || obj.is(':checkbox')) {
                            var groupObj = form.getElement(obj.attr('name').replace(/\[.*\]/, ''));
                            if (groupObj) {
                                that.checkElementDependencies(groupObj, true);
                            }
                        } else {
                            obj.trigger('change');
                        }
                    }
                 );


        // for inputs with maxlength attribute, advance to the next field when this is reached
        $(':input[maxlength]').keyup(function() { that.onFieldProgress($(this)); });

        // bind handler to forgotpassword action
        $('.forgot-password a').click(function() { that.trigger('forgotpassword'); return false; });

    }

    this.onFieldProgress = function(obj)
    {
        var maxlength = obj.attr('maxlength');
        var len = obj.val().length;

        if (len == maxlength) {

            // advance to the next field

            // get .element element
            var element = obj.closest('.element');

            // get all inputs of this element
            var inputs = element.find(':input');

            // filter out everything up to this element
            var input = element.find(':input:gt(' + inputs.index(obj) + '):first');

            input.focus();

            obj.trigger('change');

        }
    }

    this.togglePreferences = function(obj)
    {
        var fieldset = obj.closest('fieldset');
        if (fieldset.length) {

            var expand = fieldset.hasClass('collapsed');
            this.toggleObjectVisibility(fieldset.find('.input'), expand, true);

            fieldset.removeClass('collapsed expanded');
            if (expand) {
                fieldset.addClass('expanded');
            } else {
                fieldset.addClass('collapsed');
            }
        }
    }

    this.onChangeFormElement = function(element) {

        var that = this;
        var form = element.form;
        var elementName = element.getName();
        var value = element.getValue();
        var tripElement = $('#frmtrip_id');
        var arrangementElement = $('#frmarrangement_id');

        if (this.selectedTripId == '') {
            this.selectedTripId = tripElement.fieldValue();
        }

        if (this.selectedArrangementId == '') {
            this.selectedArrangementId = arrangementElement.fieldValue();
        }

        if (elementName == this.formPrefix + 'destination_id') {

            this.setElementOptions(':input[name="' + this.formPrefix + 'trip_id"]', this.arrangementsData[value]['trips']);

            if (tripElement.find(':option[value="'+this.selectedTripId+'"]')) {
                tripElement.find(':option[value="'+this.selectedTripId+'"]').attr('selected', 'selected');
            }

        }

        if (elementName == this.formPrefix + 'trip_id') {

            var options = {};
            var destination_id = form.getElement(this.formPrefix + 'destination_id').getValue();

            if ((destination_id in this.arrangementsData) && (value in this.arrangementsData[destination_id]['trips'])) {
                options = this.arrangementsData[destination_id]['trips'][value]['arrangements'];
            }

            this.setElementOptions(':input[name="' + this.formPrefix + 'arrangement_id"]', options);

            this.dataProvider.processQueue([['loadAvailableArrangements', [tripElement.fieldValue()]]], that, that.updateArrangementOptions);

            if (arrangementElement.find(':option[value="'+this.selectedArrangementId+'"]')) {
                arrangementElement.find(':option[value="'+this.selectedArrangementId+'"]').attr('selected', 'selected');
                this.dataProvider.processQueue([['loadArrangementAllotment', [this.selectedArrangementId]]], that, that.updateNumberOfParticipantsOptions);
            }

        }

        if (elementName == this.formPrefix + 'arrangement_id') {

            BookingFormInterface.showDialog('Een ogenblik geduld alstublieft');
            this.dataProvider.processQueue([['loadArrangementAllotment', [value]]], that, that.updateNumberOfParticipantsOptions);


        }

        if (elementName == this.formPrefix + 'extend_trip') {

            if (form.getElement(this.formPrefix + 'num_participants').getValue() == 1) {
                BookingFormInterface.showDialog('Een ogenblik geduld alstublieft');
                that.updateRoomTypeSelection(form.getElement(this.formPrefix + 'extend_trip').getValue(), form);
            }


        }

        // check address fields
        var matches = /^frmaddress\_(\d+)\_frm(postalcode|house\_number)$/.exec(elementName);
        if (matches)  {

            // see if country is NL
            var name = this.formPrefix + 'address_' + matches[1] + '_' + this.formPrefix + 'country_id';
            el = form.getElement(name);
            if (el && (el.getValue() == 142)) {

                var postalcode = '';
                var house_number = '';

                var otherfield;

                // if we have the one, get the other
                if (matches[2] == 'postalcode') {
                    postalcode = value;
                    otherfield = 'house_number';
                } else {
                    house_number = value;
                    otherfield = 'postalcode';
                }

                // get the value
                var obj = form.getElement('frmaddress_' + matches[1] + '_frm' + otherfield);
                if (obj) {
                    (matches[2] == 'postalcode') ? house_number = obj.getValue() : postalcode = obj.getValue();

                    // see if postalcode is a Dutch one
                    if ((postalcode != '') && (house_number != '') && /^\d{4}\s?[a-z]{2}$/i.test(postalcode)) {

                        BookingFormInterface.showDialog('Een ogenblik geduld alstublieft');
                        this.dataProvider.processQueue([['loadAddressInfo', [postalcode, house_number]]], that, function(result) { that.setStreetAndCity(result, form, matches[1]); });

                    }
                }
            }
        }

        var matches2 = /^frmaddress\_(\d+)\_frmcountry\_id$/.exec(elementName);
        if (matches2) {

            // see if selected (DT) value is Dutch
            var disable = (value == 142);

            // fields
            var fields = ['street', 'city'];

            var el;
            for (var i = 0; i < fields.length; i++) {

                var name = this.formPrefix + 'address_' + matches2[1] + '_' + this.formPrefix + fields[i];
                el = form.getElement(name);
                if (el) {

                    var obj = el.getObject();
                    if (obj.length) {
                        if (disable) {
                            obj.attr('readonly', 'readonly').addClass('disabled');
                        } else {
                            obj.removeAttr('readonly').removeClass('disabled');
                        }
                    }
                }
            }

            var pcElementName = 'frmaddress_' + matches2[1] + '_frmpostalcode';

            // remove Belgium-postalcode rule
            if (pcElementName in form.rules) {

                var len = form.rules[pcElementName].length;

                // create new array to fix the pointer (a gap is created when removing an entry, then adding another one)
                var rules = [];

                for (var j = 0; j < len; j++) {

                    // skip regex rules (this is most likely the postalcode check
                    if ((form.rules[pcElementName][j] instanceof Rule) && (form.rules[pcElementName][j].getType() == 'regex')) {
                        continue;
                    }

                    rules.push(form.rules[pcElementName][j]);

                }

                form.rules[pcElementName] = rules;

            }

            // see if selected (DT) value is BE
            if (value == 16) {

                // add rule for Belgium postalcode
                form.rules[pcElementName].push(new Rule({'type' : 'regex', 'format' : '/^B\\-\\d{4}$/', 'message' : 'Geen geldige Belgische postcode'}));

                // add "B-" in pc-field
                pcElement = $('#' + pcElementName);
                if (pcElement.val() == '') {
                    pcElement.val('B-');
                }

            } else {

                pcElement = $('#' + pcElementName);
                if (pcElement.val() == 'B-') {
                    pcElement.val('');
                }

            }

            // see if selected (DT) value is NL
            if (value == 142) {

                // trigger location service by changing postalcode element
                var pcElement = form.getElement(pcElementName);
                if (pcElement instanceof InputElement) {
                    this.onChangeFormElement(pcElement);
                }
            }
        }

        var matches3 = /^frmpersonalia\_(\d+)\_frmroom\_type$/.exec(elementName);
        if (matches3) {

            // get the text of the selected option
            roomTypeElement = $('#' + this.formPrefix + 'personalia_' + matches3[1] + '_' + this.formPrefix + 'room_type :selected');
            if (roomTypeElement) {

                // get the text
                var room_type_title = roomTypeElement.text();
                roomTypeTitleElement = $('#' + this.formPrefix + 'personalia_' + matches3[1] + '_' + this.formPrefix + 'room_type_title');
                roomTypeTitleElement.val(room_type_title);

            }
        }

        // format birthdate
        if (elementName.substr(0, 13) == 'frmpersonalia' && elementName.substr(-10) == 'date_birth') {
            this.checkDateTimeField(element);
        }

        // check dependencies
        this.checkElementDependencies(element, false);
    }

    this.checkDateTimeField = function(frmObj) {

        var dateObj = new Date(0,0,0,0,0,0);
        var dtFormat = 'yyyy-MM-dd';
        var field = document.getElementById(frmObj.name + '_year');
        if (field) {
            y = (this.cleanDatePartField(field, 4));
        }
        field = document.getElementById(frmObj.name + '_month');
        if (field) {
            m = (this.cleanDatePartField(field, 2));
        }
        field = document.getElementById(frmObj.name + '_day');
        if (field) {
            d = (this.cleanDatePartField(field, 2));
        }

        if ((y > 0) && (m > 0) && (d > 0)) {

            // set to 01-01-2000
            dateObj.setFullYear(2000);
            dateObj.setDate(1);
            dateObj.setMonth(0);

            // set actual values
            dateObj.setFullYear(y);
            dateObj.setDate(d);
            dateObj.setMonth(m - 1);

            frmObj.value = this.formatDate(dateObj,dtFormat);

            // fix display input values if needed
            var newYearValue = dateObj.getFullYear();
            if (document.getElementById(frmObj.name + '_year').value != newYearValue) {
                document.getElementById(frmObj.name + '_year').value = newYearValue;
            }
            var newMonthValue = this.zeroFill(dateObj.getMonth() + 1, 2);
            if (document.getElementById(frmObj.name + '_month').value != newMonthValue) {
                document.getElementById(frmObj.name + '_month').value = newMonthValue;
            }
            var newDayValue = this.zeroFill(dateObj.getDate(), 2);
            if (document.getElementById(frmObj.name + '_day').value != newDayValue) {
                document.getElementById(frmObj.name + '_day').value = newDayValue;
            }

        } else {
            if ((y == 0) && (m == 0) && (d == 0)) {
//                frmObj.value = '0000-00-00';
            } else {
                // cannot update value
                frmObj.value = '';
            }
        }
    }

    this.cleanDatePartField = function(fieldObj, len) {
        // strip off leading zeros or other crap
        while ((parseInt(fieldObj.value.charAt(0)) == 0) && (fieldObj.value.length > 1)) fieldObj.value = fieldObj.value.substring(1, fieldObj.value.length);

        value = parseInt(fieldObj.value);
        if (isNaN(value) || value == 0) {
            value = (len == 4) ? 0 : 0;
        }
        if ((fieldObj.name.substr(fieldObj.name.length - 5, 5) == '_year') && (value < 100) && (value > 0)) value = value + ((value < 50) ? 2000 : 1900);

        fieldObj.value = this.zeroFill(value, len);

        return value;
    }

    this.zeroFill = function(value, len) {
        var retVal = value.toString();

        while (retVal.length < len) retVal = '0' + retVal;

        return retVal;

    }

    /**
     * Returns a date in the output format specified. The format string uses the same abbreviations as in getDateFromFormat()
     */
    this.formatDate = function(date, format)
    {
        var result = '';
        var i_format = 0;
        var token = '';

        var y = date.getFullYear().toString();
        var M = date.getMonth() + 1;
        var d = date.getDate();

        // TODO this was fixed to 2000
        if (y.length < 4) y += 1900;

        var dd  = this.zeroFill(d);
        var MM  = this.zeroFill(M);
        var yy  = y.substring(2,4);

        // Convert real date parts into formatted versions
        var value = new Object();

        value["d"]    = d;
        value["dd"]   = dd;
        value["M"]    = M;
        value["MM"]   = MM;
        value["y"]    = y;
        value["yy"]   = yy;
        value["yyyy"] = y;

        // PEAR::Date formats
        value['%d']   = dd;
        value['%e']   = d;
        value["%m"]   = MM;
        value["%y"]   = yy;
        value["%Y"]   = y;

        var chr;
        while (i_format < format.length) {
            chr = format.charAt(i_format);
            token = '';
            while (((format.charAt(i_format)==chr) && (i_format < format.length)) || (token == '%')) {
                token += format.charAt(i_format++);
            }
            if (value[token] != null) {
                result += value[token];
            } else {
                result += token;
            }
        }
        return result;
    }

    this.getDayName = function(dayNum)
    {
        var index = dayNum - 1;
        return this.dayNames[index];
    }
    this.getDayAbbreviation = function(dayNum)
    {
        var index = dayNum - 1;
        return this.dayAbbreviations[index];
    }
    this.setDayNames = function(dayNames)
    {
        this.dayNames = dayNames;
    }
    this.setDayAbbreviations = function(dayAbbrs)
    {
        this.dayAbbreviations = dayAbbrs;
    }
    this.getMonthName = function(monthNum)
    {
        var index = monthNum - 1;
        return this.monthNames[index];
    }
    this.getMonthAbbreviation = function(monthNum)
    {
        var index = monthNum - 1;
        return this.monthAbbreviations[index];
    }
    this.setMonthNames = function(monthNames)
    {
        this.monthNames = monthNames;
    }
    this.setMonthAbbreviations = function(monthAbbrs)
    {
        this.monthAbbreviations = monthAbbrs;
    }

    /**
     * Calendar-specific properties
     */
    this.monthNames = new Array("January","February","March","April","May","June","July","August","September","October","November","December");
    this.monthAbbreviations = new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
    this.dayHeaders = new Array("S","M","T","W","T","F","S");

    /**
     * Removes inputs from given form if their dependencies are not met
     *
     * @param {Form}    form
     */
    this.checkElementDependencies = function(changedElements, instantly) {

        // force changedElements to be array
        if (!$.isArray(changedElements)) changedElements = [changedElements];

        // loop through the elements to check (ie: elements that have changed)
        var element;
        for (var i = 0; i < changedElements.length; i++) {

            element = changedElements[i];

            // see if changed element has a dependency
            if (element.hasDependencies()) {

                var refElement;
                var dependency;
                var value = element.getValue();

                var obj;
                var validated;
                var changed;

                // check all dependencies that are affected by this change
                for (var j = 0; j < element.dependencies.length; j++) {

                    dependency = element.dependencies[j];
                    refElement = dependency.element;

                    // the object referred to
                    obj = refElement.getObject().closest('.element');

                    // validate, always returns false when element is inactive
                    validated = element.isActive() ? dependency.validate(value) : false;

                    // changed is true when current active state doesn't match the outcome of the validation
                    changed = (refElement.isActive() !== validated);

                    if (changed) {

                        // see if this dependency is met
                        this.toggleObjectVisibility(obj, validated, instantly);
                        refElement.setActive(validated);

                        if ((refElement.getName() === (this.formPrefix + 'change_trip_flights')) || (refElement.getName() === (this.formPrefix + 'extend_hotel_booking'))) {

                            // change fieldset column visibility
                            var fieldset = $('fieldset.leftcolumn, fieldset.rightcolumn');
                            this.toggleObjectVisibility(fieldset, validated, instantly);
                        }

                        // add this element to the stack
                        this.checkElementDependencies(refElement, instantly);

                    }
                }
            }

            // if field is personalia, show the next fields
            if (/^frmpersonalia\_(\d+)/.test(element.getName())) {

                // show all fieldset siblings up to the next personalia
                var fieldset = element.getObject().closest('fieldset.personalia');
                if (fieldset.length) {

                    var next = fieldset.next('fieldset.participant-data:hidden');
                    while (next.length) {

                        var value = element.getValue();
                        this.toggleObjectVisibility(next, value, instantly);
                        next = next.next('fieldset.participant-data');
                    }
                }
            }

        }
    }

    this.updateLocationOptions = function(options) {

        var loc;
        var locationOptions;
        var hotelOptions;
        var elements;

        var type;
        var types = ['before', 'after'];
        for (var i = 0; i < types.length; i++) {

            type = types[i];

            elements = {};
            locationOptions = {};
            hotelOptions = {};
            for (var locationId in options[type]) {

                loc = options[type][locationId];
                locationOptions[locationId] = {'title' : loc['title'] };

                for (var hotelId in loc.hotels) {
                    hotelOptions[locationId + '_' + hotelId] = {'title' : loc.hotels[hotelId]['title'] };
                }

            }

            elements['countryarrangement_no_extend_hotel_booking_' + type + '_hotel'] = hotelOptions;
            elements['countryarrangement_yes_extend_hotel_booking_' + type + '_hotel'] = hotelOptions;

            var flight_type = (type == 'before') ? 'flight_departure_to' : 'flight_return_to';
            elements[flight_type] = locationOptions;

            for (var a in elements) {
                this.setElementOptions(':input[name="' + this.formPrefix + a + '"]', elements[a]);
            }
        }
    }

    this.updateInsurancePrices = function(prices) {

        // first check for prices
        if (prices.prices.travelinsurance) {

            // find travelinsurance block
            var parent = $('fieldset.travel_insurance .fieldset .element:nth-child(2)');

            parent.prepend('<div class="lowest-price notice">Een reisverzekering voor deze reis heeft u al vanaf &euro;' + prices.prices.travelinsurance + '</div>');
        }

        if (prices.prices.cancellationinsurance) {

            // find travelinsurance block
            var parent = $('fieldset.cancellation_insurance .fieldset .element:nth-child(2)');

            parent.prepend('<div class="lowest-price notice">De standaard annuleringsverzekering voor deze reis kost &euro;' + prices.prices.cancellationinsurance + '</div>');
        }
    }

    this.updateRoomTypeOptions = function(ids, titles) {

        var options = {};

        if (ids && ('available' in ids)) {

            for (var id in ids.available) {

                // search title
                for (var b in titles) {
                    if (b == id) {
                        options[id] = {'title' : titles[b]['description']};
                    }
                }
            }
        }

        this.setElementOptions('select[name$="room_type"]', options);

        // set '2pk' as default (id = 7)
        var roomTypeElement = $('select[name$="room_type"]');
        if (roomTypeElement.find(':option[value="7"]')) {
            roomTypeElement.find(':option[value="7"]').attr('selected', 'selected').change();
        }


    }

    this.setElementOptions = function(selector, options, selectedoption) {

        var input = $(selector);
        if (input.length && input.is('select')) {

            // empty options
            input.empty();

            // now add all options
            var option;
            for (var a in options) {
                if (options[a]['title']) {
                    option = $('<option>').attr('value', a).text(options[a]['title']);
                    option.appendTo(input);
                }
            }

            // select the first option
            if (selectedoption != undefined && input.find(':option[value="'+selectedoption+'"]')) {
                var obj = input.find(':option[value="'+selectedoption+'"]');
                obj.attr('selected', 'selected');
            } else {
                var obj = input.find('option:first');
                obj.attr('selected', 'selected');
            }

            // trigger the change event of this input
            input.trigger('change');

        }
    }

    this.updateArrangementOptions = function(result) {

        var i = 0;
        var options = {};
        for (var a in result) {

            i++;
            options[a] = result[a];

        }

        this.setElementOptions('#' + this.formPrefix + 'arrangement_id', options, this.selectedArrangementId);
        BookingFormInterface.hideDialog();

    }

    this.updateNumberOfParticipantsOptions = function(result) {

        // limit options to 8
        var i = 0;
        var options = {};
        for (var a in result.options) {

            i++;
            options[a] = result.options[a];

            if (i == 8) break;
        }

        this.setElementOptions(':input[name="' + this.formPrefix + 'num_participants"]', options);
        BookingFormInterface.hideDialog();

    }

    this.updateRoomTypeSelection = function(value, form) {

        var name = this.formPrefix + 'personalia_1_frmroom_type';
        var roomTypeElement = $('#' + name);

        if (value == 1) {

            // set '1pk' (id = 6) and disable
            if (roomTypeElement.find(':option[value="6"]')) {
                roomTypeElement.find(':option[value="6"]').attr('selected', 'selected').change();
            }

            roomTypeElement.attr('disabled', true);
            roomTypeElement.addClass('disabled');

        } else if (value == 0) {

            // set '2pk' as default (id = 7) and enable
            if (roomTypeElement.find(':option[value="7"]')) {
                roomTypeElement.find(':option[value="7"]').attr('selected', 'selected').change();
            }
            roomTypeElement.removeAttr('disabled').removeClass('disabled');

        }

        BookingFormInterface.hideDialog();
    },

    this.setStreetAndCity = function(result, form, number) {

        // fields
        var fields = ['street', 'city'];

        var element;
        var postalcodeFound = false;
        for (var i = 0; i < fields.length; i++) {

            var name = this.formPrefix + 'address_' + number + '_' + this.formPrefix + fields[i];
            element = form.getElement(name);
            if (element) {

                var obj = element.getObject();
                if (obj.length) {
                    if (result[fields[i]] == null) {
//                        obj.removeAttr('readonly').removeClass('disabled');
                    } else {
                        postalcodeFound = true;
                        obj.val(result[fields[i]]);
                        obj.attr('readonly');
                        obj.addClass('disabled');
                    }
                }
            }
        }


        if (!postalcodeFound) {
            BookingFormInterface.showDialog('De adresgegevens bij de door u opgegeven waardes konden niet gevonden worden. Controleer of de postcode en het huisnummer correct zijn en/of neem contact op met Djoser.');
            $('#dialog .loading').remove();
        } else {
            BookingFormInterface.hideDialog();
        }

    }

    this.updateContactFields = function (result)
    {
        var element;
        //reload the form
        var form = this.getForm(2);
        for (var i in result) {

            element = form.getElement(i);
            if (element) {

                var obj = element.getObject();
                if (obj.length) {

                    if(i == "frmpersonalia_1_frmdate_birth_day" || (i == "frmpersonalia_1_frmdate_birth_month")) {
                        result[i] = this.zeroFill(result[i], 2);
                    }
                    if(i == "frmpersonalia_1_frmdate_birth_year") {
                        result[i] = this.zeroFill(result[i], 4);
                    }
                    // set new value
                    obj.val(result[i]);

                }
            }
        }

        BookingFormInterface.hideDialog();
    }

    this.toggleObjectVisibility = function(obj, visible, instantly) {

        if (obj.length) {
            if (visible) {
                instantly ? obj.show() : obj.show('slide', {'direction' : 'up', 'easing' : 'easeOutQuad'}, 'normal');
            } else {
                instantly ? obj.hide() : obj.hide('slide', {'direction' : 'up', 'easing' : 'easeOutQuad'}, 'normal');
            }
        }
    }

    this.bind = function(type, fn)
    {
        this.events[type] = fn;
    }

    this.trigger = function(type, args)
    {
        if (!(args instanceof Array)) args = [args];

        for (var a in this.events) {
            if (a === type) {
                this.events[a].apply(this, args);
            }
        }
    }

    this.updateContactFieldsProvider = function()
    {
        var that = this;

        var arrangementId = $(':input[name="' + this.formPrefix + 'arrangement_id' + '"]');
        this.dataProvider.processQueue([['loadContactFields', [arrangementId.val()]]], that, that.updateContactFields);

    }

}


