/**
 * @fileoverview frozMortgageCalculator plugin
 * @author Lawrence Natividad
 * @copyright Copyright ( c ) 2010 Frozynart Designs
 * @license Licensed under MIT ( http://www.frozynart.com/license/mit )
 * @version: 1.0 2010-03-05
 */
 
( function( $ ) {
    /**
     * @namespace frozMortgageCalculator Plugin Namespace
     * @requires jQuery 1.2.6 and above
     * @example jQuery( "#id-of-block-that-contains-form" ).frozMortgageCalculator
     * @return {jQuery Object}
     */
    jQuery.fn.frozMortgageCalculator = function( options ) {
        var opts                                    = jQuery.extend( {}, jQuery.fn.frozMortgageCalculator.defaults, options );
        jQuery.fn.frozMortgageCalculator.opts       = opts;
        var $this                                   = jQuery( this );

        var formPrincipal = jQuery(opts.principal, $this);  //principal
        var formDp = jQuery(opts.dp, $this);       //donwpayment
        var formInterest = jQuery(opts.interest, $this);    //interest rate per year
        var formTerm = jQuery(opts.term, $this);            //total number of years to pay
        var payMonth = jQuery(opts.payMonth, $this);
        var payYear = jQuery(opts.payYear, $this);
        var output = opts.output;
        
        var elArray = [formPrincipal, formDp, formInterest];
        var optionArray = [payMonth, payYear, formTerm]
        
        var calculate = function(p, d, i, n){       //formula:     M = (P - DP)[ i(1 + i)^n ] / [ (1 + i)^n - 1] 
            p = p - d;
            interest = 1 + i;
            num = Math.pow(interest, n);
            num = i * num;
            den = Math.pow(interest, n);
            den = den - 1;
            
            if ( i === 0){
                mult = 1 / n;   
            } else {
                mult = num/den;
            }
            
            m = p * mult;       
            return Number(m);
        }
        
        var setResult = function(amount){
            if ( (jQuery(payMonth).attr('checked') === true) && (jQuery(payYear).attr('checked') === true)){
                displayError();
            } else if ( jQuery(payMonth).attr('checked') === true ){
                displayResult(amount, opts.monthlyDisplay);
            } else if ( jQuery(payYear).attr('checked') === true ){
                displayResult((amount * 12), opts.yearlyDisplay);
            }
        }
        
        var placeComma = function(amount){
            var finalAmount = amount.toFixed(2);
            finalAmount = finalAmount.toString();
            var amountPart = finalAmount.split('.', 2);
            var amLength = amountPart[0].length;
            var quo = Math.floor(amLength / 3);
            var mod = amLength % 3;
            var integer = new Array();
            if ( amLength > 3 ){
                if ( mod > 0 ){
                    integer.push(amountPart[0].substr(0, mod));
                }
                if (quo > 1){
                    for ( i = 0; i < quo; i++ ){
                        if ( (i === 0) && ( mod > 0 ) ){
                            integer.push(amountPart[0].substr( (mod), 3 ));
                        } else {
                            integer.push(amountPart[0].substr( (mod + (i * 3)), 3 ));
                        }                        
                    }
                } else {
                    integer.push(amountPart[0].substr( (mod), 3) );
                }
            } else {
                integer.push(amountPart[0]);
            }
            finalInteger = integer.join();
            return finalInteger + '.' + amountPart[1];
        }
        
        var displayResult = function(amount, display){
            finalAmount = placeComma(amount);
            jQuery(output).html(display + opts.currencyDisplay + finalAmount);
            return finalAmount
        }
        
        var displayInterest = function(p, d, m, n){
            interest = Number((m * n) - (p - d));
            if ( interest < 0 ){
                interest = 0;
            }
            finalInterest = placeComma(interest);
            if (opts.interestBlock == null){
                jQuery(output).append('<br>' + opts.interestDisplay + opts.currencyDisplay + finalInterest);
            } else {
                jQuery(opts.interestBlock).html(opts.interestDisplay + opts.currencyDisplay + finalInterest);
            }
        }
        
        var displayError = function(msg){
            if (msg === null){
                jQuery(output, $this).html(opts.errorDisplay);
            } else {
                jQuery(output, $this).html(msg);
            }
            
        }
        
        var checkInput = function(){
            if( (isNaN(formPrincipal.val()) && (formPrincipal.val() !== '')) ||
                (isNaN(formDp.val()) && (formDp.val() !== '')) ||
                (isNaN(formInterest.val()) && (formInterest.val() !== '')) ||
                (isNaN(formTerm.val()) && (formTerm.val() !== '')) ){
                displayError('Please use numeric characters for all fields');
                return true;
            } else if ( parseFloat(formDp.val()) > parseFloat(formPrincipal.val()) ){
                displayError('Downpayment should not be more than principal amount');
                return true;
            } else {
                displayError(null);
                return null;
            }
        }
        
        var setupCalc = function(){
            var principal = parseFloat(formPrincipal.val());
            var dp = parseFloat(formDp.val());
            var interest = parseFloat((formInterest.val()/100)/12);
            var term = parseFloat(formTerm.val() * 12);
            if ( isNaN(dp) ){
                dp = 0;
            }
            result = calculate(principal, dp, interest, term);
            if ( !isNaN(result) ){
                setResult(result);
                if ( true === opts.displayTIP ){
                    displayInterest(principal, dp, result, term);
                }
            }
        }
        
        error = checkInput();
        if (error !== true){
            setupCalc();
        }
        
        for( element in elArray ){
            jQuery(elArray[element]).keyup( function(){
                error = checkInput();
                if (error !== true){
                    setupCalc();
                }
            });
        }
        
        for( element in optionArray ){
            jQuery(optionArray[element]).click( function(){
                if( formPrincipal.val() !== '' ){
                    error = checkInput();
                    if (error !== true){
                        setupCalc();
                    }
                }
            });
        }
        
        
        for( element in optionArray ){
            jQuery(optionArray[element]).change( function(){
                if( formPrincipal.val() !== '' ){
                    error = checkInput();
                    if (error !== true){
                        setupCalc();
                    }
                }
            });
        }
        
        return $this;
    };

    /**
     * <pre> 
     * Settings
     *
     * Setting            Default            Description
     * ------------------------------------------------------------------------------------------
     * navHeadContent:    "header-content"   ID of block which contains slide contents
     * 
     * delayTime:         1000               Time it takes for the slide to return to its position
     *                                          ( if returnOnOut:true )
     * </pre>
     */
    jQuery.fn.frozMortgageCalculator.defaults =   {
        principal: '#froz-mortgage-principal',  //principal
        dp: '#froz-mortgage-downpayment',       //donwpayment
        interest: '#froz-mortgage-interest',    //interest rate per year
        term: '#froz-mortgage-term',            //total number of years to pay
        payMonth: "#froz-mortgage-month",       //option to display monthly payments
        payYear: "#froz-mortgage-year",         //option to display annual payments
        output: "#froz-mortgage-result",
        monthlyDisplay: 'Monthly payment: ',
        yearlyDisplay: 'Yearly payment: ',
        interestDisplay: 'Total interest paid: ',
        errorDisplay: 'Result will be displayed here',
        currencyDisplay: '$',
        displayTIP: false,
        interestBlock: null,
        resetOnClick: true
    };
} )(jQuery);
