﻿(function ( w , $ ) {

    //* jQuery objects */
    var O_$ = {
            w: $(w),
            d: $(w.document),
            document: {
                viewport: {
                    all: $('.viewport.document > *'),
                    wrap: $('.viewport.document'),
                    scroll: $('.viewport.document .scroll'),
                    clone: $('.viewport.document .clone'),
                    ball: $('.viewport.document .ball'),
                    graphism: $('.viewport.document .graphism')
                }
            },
            features: {},
            modal: {
                wrap: $('.modal'),
                bg: $('.modal.bg'),
                fake: $('#modalFake'),
                btn: {
                    close: $('.modal .btn.close')
                },
                compare: {
                    wrap: $('.modal.compare'),
                    btn: {
                        close: $('.modal.compare .close'),
                        open: $('.btn.compare')
                    }
                },
                sheet: {
                    wrap: $('.modal.sheet'),
                    btn: {
                        compare: $('.modal.sheet .btn.compare'),
                        close: $('.modal.sheet .close')
                    }
                },
                politica: {
                    wrap: $('.modal.politica-privacidade'),
                    btn: {
                        open: $('.lnkPoliticaPrivacidade'),
                        close: $('.modal.politica-privacidade .close')
                    }
                },
                tmpl: {
                    compare: {
                        car: $('#compareCar'),
                        models: $('#compareModels'),
                        price: $('#comparePrice'),
                        items: $('#compareItems'),
                        sheet: $('#compareSheet')
                    }
                }
            }
        };




    var Fiat = {
            w: w,
            $w: O_$.w,
            $: $,
            O_$: O_$,
            /* DATA CACHE for this section */
            D: {},
            /* ERROR */
            E: {},
            /* PARAMS config */
            P: {
                uf: 'SP', // state
                idModelo: 196 // car model
            },
            /* URLS default */
            U: {
                models: '/json/palioData.json',
                compare: 'http://www.fiat.com.br/monte-seu-carro/json/json-comparativo.jsp'
            },
            /* XHR - jQuery Ajax objects */
            $X: {},
            /* jQuery TEMPLATES compiled */
            $T: {},
            /* BIND function */
            bind: function ( action , who , trigger , triggered , ret ) {

                var e, handle;

                ret = ret || B_FALSE;

                try {

                    action = action || S_OPEN_MODAL;

                    trigger = trigger || S_CLICK;

                    if ( typeof action === S_FUNCTION ) {

                        handle = function () { action( who ); return ret; }

                        Fiat.$(triggered).unbind( trigger , handle ).bind( trigger , handle );

                    } else {

                        throw S_ACTION_NOT_FOUND + ': ' + action;

                    }

                } catch ( e ) {

                    Fiat.E = e;

                    F_LOG( S_CANNOT_BIND + ': ' , B_FALSE );
                    F_LOG( action + ' , ' + who + ' , ' + trigger + ' , ' + triggered );

                    return B_FALSE;

                }

                return B_TRUE;

            },
            /* DOWNLOAD function */
            download: function ( who ) {

                var e , win, url , $who;

                try {

                    $who = Fiat.$( who );

                    if ( typeof $who.attr('src') !== S_UNDEFINED ) {
                        url = $who.attr('src');
                    }

                    win = Fiat.w.open( url );

                    win.focus();

                } catch ( e ) {

                    Fiat.E = e;

                    F_LOG( S_CANNOT_DOWNLOAD + ': ' + who );

                    return B_FALSE;

                }

                return B_TRUE;

            },
            /* MODAL */
            modal: ( function () {

                var app,
                    open=false;

                app = {
                        _open: function ( who ) {

                            var e;

                            try {

                                who = who || '*';

                                Fiat.modal.close( '*' );

                                O_$.modal.wrap.filter( who ).add( O_$.modal.bg ).show();

                                open=$(who);

                            } catch ( e ) {

                                Fiat.E = e;

                                F_LOG( S_CANNOT_OPEN_MODAL + ': ' + who );

                                return B_FALSE;

                            }

                            return B_TRUE;

                        },
                        _close: function ( who ) {

                            who = who || '*';

                            O_$.modal.wrap.filter( who ).add( O_$.modal.bg ).hide();

                            O_$.modal.fake.empty().hide();

                            open = false;

                            return B_TRUE;

                        },
                        _isOpen: function ( who ) {
                            if ( open !== false && open.is(who) ) {
                                return true;
                            }
                            return false;
                        }
                };

                return {
                    open: app._open,
                    close: app._close,
                    isOpen: app._isOpen
                };
            }() ),
            /* COMPARE */
            compare: ( function () {

                var app,
                    i,
                    codV;

                app = {
                        __successModels: function ( d ) {
                            Fiat.D.models = d;
                            app._applyModels();
                        },
                        __successItems: function ( d ) {
                            Fiat.D.compare = d;
                            app._applyItems();
                        },
                        __error: function ( e ) {

                            Fiat.E = e;

                            F_LOG( S_CANNOT_GET_JSON );
                            F_LOG( Fiat.E );

                        },
                        _applyModels: function () {

                            /* caching */
                            // compare car
                            if ( typeof Fiat.$T.compareCar === S_UNDEFINED ) {
                                Fiat.$T.compareCar = O_$.modal.tmpl.compare.car.tmpl( Fiat.D.models.object.modelo , {
                                    hyphenateName: function ( idx ) {
                                        return Fiat.compare.hyphenate( Fiat.compare.formatName( this.data.versoes[idx].nome ) );
                                    }
                                });
                            }
                            // compare models
                            if ( typeof Fiat.$T.compareModels === S_UNDEFINED ) {
                                Fiat.$T.compareModels = O_$.modal.tmpl.compare.models.tmpl( Fiat.D.models.object.modelo , {
                                    formatedName: function ( idx ) {
                                        return Fiat.compare.formatName( this.data.versoes[idx].nome );
                                    }
                                });
                            }
                            // compare price
                            if ( typeof Fiat.$T.comparePrice === S_UNDEFINED ) {
                                Fiat.$T.comparePrice = O_$.modal.tmpl.compare.price.tmpl( Fiat.D.models.object.modelo , {
                                    formatedPrice: function ( idx ) {
                                        return Fiat.compare.formatPrice( this.data.versoes[idx].preco );
                                    }
                                });
                            }

                            /* apply templates */
                            // compare car
                            Fiat.$T.compareCar.appendTo( Fiat.$('thead tr.cars', O_$.modal.compare.wrap ).empty() );
                            // habilita link ficha tecnica
                            Fiat.bind( Fiat.modal.open , '.sheet' , S_CLICK , '.btn.sheet', B_FALSE  );
                            for ( i in Fiat.D.models.object.modelo.versoes ) {
                                codV = Fiat.D.models.object.modelo.versoes[i].codigo;
                                Fiat.bind( Fiat.sheet.get , codV , S_CLICK , '.sheet-' + codV , B_FALSE );
                                if ( Fiat.sheet.isHashed( codV ) === B_TRUE ) {
                                    Fiat.$('.sheet-' + codV).click();
                                }
                            }

                            // compare models
                            Fiat.$('thead tr.models th',O_$.modal.compare.wrap).not('.legend').remove();
                            Fiat.$T.compareModels.appendTo('.modal.compare thead tr.models');

                            // compare price
                            Fiat.$('tbody tr.price td',O_$.modal.compare.wrap).not(':first').remove();
                            Fiat.$T.comparePrice.appendTo('.modal.compare tbody tr.price')

                        },
                        _applyItems: function () {

                            /* caching */
                            if ( typeof Fiat.$T.compareItems === S_UNDEFINED ) {

                                Fiat.$T.compareItems = O_$.modal.tmpl.compare.items.tmpl( Fiat.D.compare.object , {
                                    typeName: function ( idxIS , idxV  ) {
                                        switch( this.data.itensSerie[idxIS].values[idxV] ) {
                                            case 'S':
                                                return 'serie';
                                                break;
                                            case 'O':
                                                return 'opcional';
                                                break;
                                            default:
                                                return 'nao-disponivel';
                                                break;
                                        }
                                    },
                                    typeSymbol: function ( idxIS , idxV ) {
                                        switch( this.data.itensSerie[idxIS].values[idxV] ) {
                                            case 'S':
                                                return 'V';
                                                break;
                                            case 'O':
                                                return '+';
                                                break;
                                            default:
                                                return '...';
                                            break;
                                        }
                                    }
                                });

                            }

                            /* apply templates */
                            // items
                            Fiat.$('tbody tr',O_$.modal.compare.wrap).not(':first').not(':first').remove();
                            Fiat.$T.compareItems.appendTo('.modal.compare tbody');

                        },
                        _get: function ( ) {

                            query = {
                                    uf: Fiat.P.uf,
                                    idModelo: Fiat.P.idModelo
                            };

                            if ( typeof Fiat.$X.models === S_UNDEFINED ) {
                                Fiat.$X.models = Fiat.$.ajax( {
                                                       url: Fiat.U.models,
                                                       type: 'GET',
                                                       data: query,
                                                       dataType: 'json',
                                                       success: app.__successModels,
                                                       error: app.__error
                                                   } );
                            }


                            if ( typeof Fiat.$X.compare === S_UNDEFINED ) {
                                Fiat.$X.compare = Fiat.$.ajax( {
                                                        url: Fiat.U.compare,
                                                        type: 'GET',
                                                        data: query,
                                                        dataType: 'jsonp',
                                                        success: app.__successItems,
                                                        error: app.__error
                                                    } );
                            }

                        },
                        _hyphenate: function ( txt ) {
                            return Fiat.$.trim( txt ).toLowerCase().replace(/[^a-zA-Z0-9\.\s]/g,'').replace(/\s+/g,'-');
                        },
                        _formatName: function ( txt ) {
                                return txt; /*.replace(/fiat 500/i,'')
                                          .replace(/autom.tico/i,'AUT')
                                          .replace(/2p/gi,'');*/
                        },
                        _formatPrice: function ( vlr ) {
                            var a, b='', i;

                            if ( typeof vlr === S_UNDEFINED || vlr === N_NULL ) {
                                return '0,00';
                            }

                            a = vlr.toString().split('.');

                            if ( typeof a[1] === S_UNDEFINED ) {
                                a[1] = '00';
                            }

                            a[0] = a[0].split('').reverse();

                            for ( i = a[0].length ; i-- ; ) {

                                b = b + '' +  a[0][i];

                                if ( i % 3 === 0 ) {
                                    b = b + '.';
                                }

                            }

                            a[0] = b.replace(/^\.|\.$/,'');

                            return a.join(',');
                        }
                };

                return {
                    get: app._get,
                    hyphenate: app._hyphenate,
                    formatName: app._formatName,
                    formatPrice: app._formatPrice
                };
            }() ),
            /* SHEET */
            sheet: ( function () {

                var app,
                    i;

                app = {
                        __apply: function ( data ) {
                            // sheet
                            O_$.modal.tmpl.compare.sheet.tmpl( data , {
                                firstFormatedName: function ( ) {
                                    var nome = this.data.nome;
                                    nome = nome.split(' ')[0];
                                    return Fiat.compare.formatName( nome );
                                },
                                lastFormatedName: function ( ) {
                                    var nome = this.data.nome;
                                    nome = nome.split(' ');
                                    nome.shift();
                                    nome = nome.join(' ');
                                    return Fiat.compare.formatName( nome );
                                }

                            }).appendTo( Fiat.$('.wrap',O_$.modal.sheet.wrap).empty() );
                        },
                        _get: function ( modelId ) {
                            for ( i in Fiat.D.models.object.modelo.versoes ) {
                                if ( Fiat.D.models.object.modelo.versoes[i].codigo === modelId ) {
                                    app.__apply( Fiat.D.models.object.modelo.versoes[i] );
                                    return;
                                }
                            }
                        },
                        _ishashed: function ( versionCod ) {
                            var hash = Fiat.$.trim( Fiat.w.location.hash ).replace('#','').toLowerCase().split('-');
                            if ( Fiat.$.trim( versionCod ).toLowerCase() === hash[ hash.length -1 ] ) {
                                return B_TRUE;
                            }
                            return B_FALSE;
                        }
                };

                return {
                    get: app._get,
                    isHashed: app._ishashed
                };
            }() )
    };

    w.Fiat = Fiat;

} ( window , jQuery ) );

