/**
 * credit.js
 * JavaScript- und jQuery-Funktionen f?r den PFS-Kreditrechner
 *
 * @category  Geld.de
 * @link      http://www.geld.de/
 * @package   pfs
 * @author    Ronny Springer <ronny.springer@unister.de>
 * @copyright 2007-2011 Unister GmbH
 *
 * @todo:
 *   - Refactoring-Hinweise mit der Bezeichnung @hint bearbeiten
 *   - Vereinheitlichung des JS-Codingstyles
 *   - Selektoren einen Context zuweisen (vgl. context.find('something'))
 *   - Selektoren mit IDs verbinden (vgl. $('#id div.class'))
 *   - Anzahl der var-Definitonen verringern
 *   - DOM-Elemente cachen
 *   - prepend(), append(), after(), etc. reduzieren und html() benutzen (Inhalte in separater Variable speichern)
 *   - Codedokumentation
 *   - Eigenen Namensraum definieren und Verwenung von jQuery als alias von $ entfernen
 */

/**
 * creditObj
 *
 * @hint: Keine eindeutige L?sung mit bei der Verwendung durch die Ladereinfolge im
 *        Bezug zur creditobj.tpl (siehe weiter unten: creditObj)
 */

var creditObj = {
        'step': 1,
        'creditMinDefault': 1000,
        'creditMaxDefault': 100000,
        'termsMinDefault': 12,
        'termsMaxDefault': 120,
        'usage': 'freelance'
    };

/**
 * checkedPolicy
 * Checkboxen checken Radio Funktion wird bei Ready geladen und bei Klick
 *
 * @hint: Alten Code ?berarbeiten.
 */

function checkedPolicy() {
	if (jQuery('#processing').is(':checked')) {
		jQuery('#erKreditgeber').val('true');
		jQuery('#erBonitaet').val('true');
			} else {
		jQuery('#erKreditgeber').val('false');
		jQuery('#erBonitaet').val('false');
	}
			jQuery('#processing').live('click', function () {
		if (jQuery(this).is(':checked')) {
			jQuery('#erKreditgeber').val('true');
			jQuery('#erBonitaet').val('true');
				} else {
			jQuery('#erKreditgeber').val('false');
			jQuery('#erBonitaet').val('false');
		}
	});

	if (jQuery('#agbAccept').is(':checked')) {
		jQuery('#erKreditvermittler').val('true');
			} else {
		jQuery('#erKreditvermittler').val('false');
	}
			jQuery('#agbAccept').live('click', function () {
		if (jQuery(this).is(':checked')) {
			jQuery('#erKreditvermittler').val('true');
				} else {
			jQuery('#erKreditvermittler').val('false');
		}
	});

    jQuery('#sendAgb').live('click', function () {
        jQuery('#perfektForm').submit();
    });
}

/**
 * kreditbetragValidation
 * kredite.html Folgeseiten -> minicalc
 *
 * @hint: Don't repeat code. ;-)
 *        Alten Code ?berarbeiten.
 *        Code besser dokumentieren
 */

function kreditbetragValidation(formID, elementID) {
	var value = parseInt(jQuery('#' + elementID).attr('value'));

	if (isNaN(value)) {
		jQuery('#' + elementID).attr('value', '');

		return false;
	} else if (value > creditObj.creditMaxDefault) {
		jQuery('#' + elementID).attr('value', '');

		return false;
	} else if (value < creditObj.creditMinDefault) {
		jQuery('#' + elementID).attr('value', '');

		return false;
	}
}

/**
 * CheckCreditForm
 *
 * @hint: Alten Code ?berarbeiten und Funktion dokumentieren.
 */

function CheckCreditForm(formid, errid) {
	var isChecked,
		errors = [],
		frmFields = ['kreditbetrag'];

	if (jQuery('#kreditbetrag').val() === "") {
		errors[errors.length] = 'kreditbetrag';
	}
	if (kreditbetragValidation(formid, 'kreditbetrag') === false) {
		errors[errors.length] = 'kreditbetrag';
	}

	function resetErrors() {
		for (var i = 0; i < frmFields.length; i++) {
			jQuery('#' + frmFields[i] + errid + '_error').removeClass('keyErrorActive');
			jQuery('#' + frmFields[i] + errid + '_border').removeClass('keyBorderActive');
		}
		jQuery('#frmErrorBlock' + errid).hide();
	}

	if (errors.length > 0) {
		for (var i = 0; i < errors.length; i++) {
			jQuery('#' + errors[i] + errid + '_error').addClass('keyErrorActive');
			jQuery('#' + errors[i] + errid + '_border').addClass('keyBorderActive');
		}
		jQuery('#frmErrorBlock' + errid).show();
		jQuery('#' + errors[0]).focus();

		return false;
	} else {
		var intervall = 300,
			zeit = intervall;

		jQuery("div.bankbox div.bankboxlist ul.bankboxlist li input[type='checkbox']").each(function () {
			if (this.checked) {
				isChecked = '1';
				var theURL = jQuery(this).attr('rel');

				PopUnder(theURL, '_blank', 'scrollbars=yes,status=yes');
				zeit += intervall;
			}
		});

		/* activate conversion tracking */

		if (isChecked == '1') {
			logThisClick('kredite');
		}
		zeit += 3 * intervall;
		window.setTimeout("jQuery('#" + formid + "').submit();", zeit);

		return true;
	}
	resetErrors();
};


jQuery(function()
{

        /* protected Variables */

    var $_body    = jQuery('body'),
        $_form    = $_body.find('form'),
        $_context = $_body.find('div#gblCnt'),

        $_doc     = document,
        $_win     = window,

        /**
         * getSyncAjaxResponse
         * Synchrones Laden von (externen) Dateninhalten per Ajax-Request
         *
         * @params string requestData
         * @params string requestUrl
         * @return object
         */

        getSyncAjaxResponse = function (requestData, requestUrl) {
            return jQuery.ajax({
                    url: requestUrl,
                    async: false,
                    data: requestData
                });
        },

        /**
         * getHeadline
         *
         * @params object node
         * @params string type
         * @return string
         */

        getHeadline = function (node, type) {
            var output = '';

            if (node.text()) {
                output += '<' + type + '>';
                output += node.text();
                output += '</' + type + '>';
            }

            return output;
        },

        /**
         * getTooltipResponse
         *
         * @params object node
         * @params string type
         * @params string url
         * @params boolean cache
         * @return string
         *
         * @hint: Dopplung der If-Abfrage entfernen
         */

        getTooltipResponse = function (node, type, url, cache) {
            var output = '';

            if (cache) {
                var tooltip = node
                        .parent()
                        .find('.tooltip'),
                    tooltipContent =  tooltip.text();

                if (tooltipContent.length > 0) {
                    output += tooltip.html();
                } else {
                    if (type == '#openProduktdetails' && url !== '') {
                        output += '<div>';
                        output += getSyncAjaxResponse('detail=' + node.attr('name'), url).responseText;
                        output += '</div>';
                    };
                }
            } else {
                if (type == '#openProduktdetails' && url !== '') {
                    output += '<div>';
                    output += getSyncAjaxResponse('detail=' + node.attr('name'), url).responseText;
                    output += '</div>';
                };
            }

            return output;
        },

        /**
         * preloader
         */

        preloader = function () {
            var overlayCss = {
                    'display': 'block',
                    'position': 'absolute',
                    'top': '0',
                    'left': '0',
                    'z-index': '998',
                    'width': '100%',
                    'height': $_body.outerHeight() + 'px',
                    'display': 'none'
                },
                setOverlayHtml = function () {
                    var output;

                    output  = '<div id="overlay" class="boxPreloader">';
                    output +=    '<div class="boxPreloaderContent">';
                    output +=        '<p class="boxTitle">Einen Moment bitte.</p>';
                    output +=        '<p>Der aktuelle Tarifvergleich wird geladen.</p>';
                    output +=        '<p>Dieser Vorgang kann bis zu 1 Minute dauern.</p>';
                    output +=    '</div>';
                    output += '</div>';

                    return output;
                };

            $_body
                .append(setOverlayHtml())
                .find('div#overlay')
                .css(overlayCss);
        },

        /**
         * logClicker
         *
         * @params object node
         * @params string type
         * @return void
         */

        logClicker = function (node, type) {
            var clickoutLink = jQuery(node);

            if (clickoutLink.length !== 0) {
                clickoutLink.live('click', function() {
                    if (type == 'kredite') {
                        logThisClick('kredite_' + jQuery(this).attr('name'));
                    } else if (type == 'schufa') {
                        logThisClick('kredite_shufa');
                    }
                });
            }
        };

    /* preloader */

    preloader();

    /* errors */

    var errors = jQuery('#message ul, #error ul');

    if (errors) {
        var errorMessage = '<span class="errorHint">Bitte geben Sie folgende Daten korrekt an:</span>';

        errors
            .each(function() {
                var node = $(this);

                node.before(errorMessage);
            });
    }

    /* form */

    var creditCalcForm = jQuery('#formular');

    if (creditCalcForm) {
        var setEvenOdd = jQuery('.modul_block');

        setEvenOdd
            .each(function(i) {
                var node = $(this);

                if (i % 2) {
                    node.addClass('odd');
                } else {
                    node.addClass('even');
                }
            });
    }

    /* headline */

    var creditCalcHeadline = jQuery('#contentArea h2');

    if (creditCalcHeadline.length) {
        var headline = getHeadline(creditCalcHeadline, 'h2');

        creditCalcHeadline.remove();
        creditCalcForm.before(headline);
    }

    /* ligthbox */

    var ligthboxButton = jQuery('.info_layer_buttons');

    if (ligthboxButton.length) {
        var parrentLayer = jQuery(".info_layer, #grey");

        ligthboxButton
            .hover(function() {
                $(this)
                    .css({
                        'cursor': 'cursor'
                    });
            })
            .live('click', function() {
                parrentLayer
                    .fadeOut('slow');

                return false;
            });
    }

    /* popupLayer */

    var popupLayer = jQuery('#produktDetailsPopup_layer');

    if (popupLayer.length) {
        popupLayer
            .css({
                'z-index': 900
            });
    }

    /* tab */

    var  creditCalcTab = jQuery('#tabMenue');

    if (creditCalcTab.length) {
        var tabLink = creditCalcTab.find('a');

        /* @hint: Redundanz bei der Selektorverwendung von "#laufzeit option" minimieren */

        tabLink
            .live('click', function() {
                var nodeValue = jQuery(this).attr('name');

                jQuery('#laufzeit option').removeAttr('selected');
                jQuery('#laufzeit option[value=' + nodeValue + ']').attr('selected', true);
                jQuery('#creditCalcForm').submit();

                return false;
            });
    }

    /* table
     * @hint: Langsamer Selektor */

    var tableResult = jQuery('.tableResult');

    if (tableResult.length) {
        tableResult
            .find('tr:last')
            .addClass('lastRow');
    }

    /* switchTeaser
     * Verwendung auf der Ergebnisseite bei PFS beim MVT-Test
     * @hint: Langsamer Selektor */

    var switchTeaser = jQuery('.jsSwitchTeaser');

    if (switchTeaser) {
    switchTeaser.live('click', function () {
            var node = $(this),
            teaser = node.parent('.calcHidden');

            teaser
                .hide()
                .next('.calcHidden')
                .removeClass('displayNone');
        });
    }

    /* tooltip */

    var tooltip = jQuery('.jsTooltip');

    if (tooltip) {
        tooltip.hover(function () {
            var node = jQuery(this),
                nodePosition = node.position(),
            tooltipElement = jQuery('.' + node.attr('id')),
                tooltipWidth = tooltipElement.width();

            tooltipElement
                .addClass('activeTooltip')
                .css({
                    'left': nodePosition.left - tooltipWidth - 5,
                    'top': nodePosition.top - 15
                })
                .show();
        }, function () {
            tooltipElement
                .removeAttr('style')
                .removeClass('activeTooltip');
        });
    }

    /* tooltipLink
     * @page: kredite.html
     * @package: creditCalcResult, creditOffer */

    var tooltipLink = jQuery('.produktdetailsLink .icoInfo');

    if (tooltipLink) {
        var tooltipType = tooltipLink.attr('href');

        tooltipLink
            .each(function () {
                var node = jQuery(this).parent();

                node
                    .addClass('hasTooltip')
                    .append('<div class="tooltip tooltipArrowLeft creditCalcTooltip"></div>');
            })
            .live('mouseenter', function () {
                var node = jQuery(this),
                    tooltip = node.next('.tooltip');

                tooltip
                    .html(getTooltipResponse(node, tooltipType, creditObj.productInfoUrl, true));
        });
    }

    /* tooltip
     * antragsstrecke
     * @hint: Redundanz minimieren */

        if (creditObj.iconurl) {
        var icon = jQuery("a[href=#openInfoPopup]");

            icon
                .css({
                    cursor: 'help'
                })
                .hover(function () {
                    var node = jQuery(this),
                        nodePosition = node.position(),
                        window = jQuery(window),
                        rightPos = nodePosition.left + (node.width() * 2) - 18,
                        topPos = (window.height()) - (window.height() - node.offset().top) - (node.height() / 2) - 12,
                        tooltipElement = jQuery("#infoPopup_layer"),
                        tooltipString = jQuery
                            .ajax({
                url: creditObj.iconurl,
                async: false,
                data: {
                                    "infoName": node.attr("name")
                }
                            })
                            .responseText;

                    if (tooltipString) {
                        jQuery("#infoPopupLayerContent")
                            .html(tooltipString);

                        /* Hier wird die Position des InfoLayer bestimmt */
                        tooltipElement
                            .css({
                    'left': rightPos,
                                'top': topPos
                            })
                            .show()
                            .find("iframe:first")
                            .css({
                                'height': tooltipElement.height(),
                                'width': tooltipElement.width()
                });
            }
                }, function() {
                    jQuery("#infoPopup_layer")
                        .hide();
        });
    }

    /* jsCreditMin + jsCreditMax
     * @hint: Bessere Bezeichnung und Dokumentation verwenden
     *        Refactoring der ausgabe mit .html() */

    if (jQuery('#CreditCalc #jsCreditMin').length !== 0 && jQuery('#CreditCalc #jsCreditMax').length !== 0){
        jQuery('#CreditCalc #jsCreditMin').html(creditObj.creditMinDefault);
        jQuery('#CreditCalc #jsCreditMax').html(creditObj.creditMaxDefault);
    }

    /* Teaser-Slider
     * @hint: Redundanzen minimieren
     *        Verwendung der Variablen optimieren
     *        Selektoren mit Context abfragen */

    var creditForm = jQuery('form#creditCalcForm');

    if (creditForm.length) {

        var creditFormElements = creditForm.find('input#beruf, select#laufzeit, select#verwendung'),
            creditFormSlider = creditForm.find('a.ui-slider-handle'),
			creditFormButton = creditForm.find('#buttonBerechnen'),
            usePreloader = function () {
                var preloader = jQuery('div#overlay');

                // Preloader anzeigen
                preloader.show();

                // Kreditformular abschicken
                creditForm.submit();
            };

        creditFormElements
            .live('change', function () {
                usePreloader();
            });

        creditFormSlider
            .live('mouseup', function () {
                usePreloader();
            });
		creditFormButton
            .live('mouseup', function () {
                usePreloader();
            });
    }


    if(jQuery('#laufzeit').length !== 0){
        if (creditObj.creditMin === undefined || creditObj.creditMin === "") {
            creditObj.creditMin = creditObj.creditMinDefault;
        }
        if (creditObj.creditMax === undefined || creditObj.creditMax === "") {
            creditObj.creditMax = creditObj.creditMaxDefault;
        }

         /* Min- und Maxwerte unter dem Slider */

        jQuery('.jsCreditMin').html(creditObj.creditMin + '&nbsp;&euro;');
        jQuery('.jsCreditMax').html(creditObj.creditMax + '&nbsp;&euro;');
        jQuery('.jsCreditMonthMin').html(creditObj.termsMinDefault + '&nbsp;Monate');
        jQuery('.jsCreditMonthMax').html(creditObj.termsMaxDefault + '&nbsp;Monate');

        /* @hint: ?nderung der Variablenbezeichnung, da Verwechslungen zu schnell m?glich sind (siehe: selectLaufzeit, sliderLaufzeit) */

        var selectLaufzeit = jQuery(".teaser #laufzeit"),
            selectLaufzeitLength = jQuery(".teaser #laufzeit option").length,
            sliderLaufzeit = jQuery(".teaser #laufzeitSlider").slider({
                min: 1,
                max: selectLaufzeitLength,
                range: false,
                value: selectLaufzeit[0].selectedIndex + 1,
                slide: function(event, ui) {
                    selectLaufzeit[0].selectedIndex = ui.value - 1;
                }
            }),
            inputKreditbetrag = jQuery(".teaser #kreditbetrag"),
            sliderKreditbetrag = jQuery(".teaser #kreditbetragSlider").slider({
                range: false,
                value: creditObj.credit,
                step: creditObj.creditMin,
                min: creditObj.creditMin,
                max: creditObj.creditMax,
                slide: function(event, ui) {
                    inputKreditbetrag.val(ui.value);
                }
            });


        selectLaufzeit.change(function() {
            sliderLaufzeit.slider("value", this.selectedIndex + 1);
        });
        inputKreditbetrag.change(function() {
            sliderKreditbetrag.slider("value", inputKreditbetrag.val());
            if (inputKreditbetrag.val() > creditObj.creditMax) {
                jQuery(this).val(creditObj.creditMax);
            }
            if (inputKreditbetrag.val() < creditObj.creditMin) {
                jQuery(this).val(creditObj.creditMin);
            }
        });

        inputKreditbetrag.val(sliderKreditbetrag.slider("value"));
    }

    /* Senden der Daten vom Datenschutz */

    if (jQuery('#processing, #agbAccept').length !== 0) {
        checkedPolicy();
    }

    /* Buttontext aendern bei 'Dahrlehnswunsch'
     * zwischen AGB und Abschluss
     * Bank: Postbank
     * @hint: If-Abfragen optimieren und Selektoren in Variablen speichern */

    if (jQuery('a.submitButton').length !== 0 && jQuery('a.submitButton').text() == 'Angebot annehmen >>') {
        jQuery('a.submitButton').text('weiter');
    }

    /* logClicker */

    logClicker('.buttonClickout', 'kredite');


    /* last modul_block border entfernen */

    jQuery('.modul_block:last').addClass('last');

    /* Kreditablöse */

    var repayCredits = $_form.find('input#ausgaben_kredit1_abloesen, input#ausgaben_kredit2_abloesen, input#ausgaben_kredit3_abloesen');

    if (repayCredits.length) {

        repayCredits
            .bind('change', function () {
                var $this = jQuery(this),
                    $thisValue = $this.val(),
                    nextInput = $this.next('input');

                if ($thisValue == 'true') {
                    nextInput
                        .val('true');
                } else {
                    nextInput
                        .val('false');
                }
            });
    }

});
