/**
 * Super first view and controller
 *
 */

(function () {

    TRAVEL.SuperFirst = function () {
        var self = this;

        var searchId = 0;

        var ampPattern = /&amp;/g;



        function placeMarkers(map, searchOpts, callback) {
            var ajaxLink = baseUrl + 'ajaxCommand.service?command=travel.JSONSearchMapProductsCommand';

            searchOpts = TRAVEL.filterSearchOptions(searchOpts);

            searchOpts.id = (new Date()).getTime().toString();

            TRAVEL.postJSON(ajaxLink, searchOpts, function (markers) {

                if (searchId > markers.id) {
                    // request was returned too late
                    return;
                }

                searchId = markers.id;

                map.placeMarkers(markers.products, function (markerId, marker) {
                    // bubble details provider
                    // this == marker
                    var ajaxLink = baseUrl + 'ajaxCommand.service?command=travel.JSONSingleProductCommand';
                    TRAVEL.getJSON(ajaxLink, 'sp=' + markerId, function (data) {
                        var bubbleHtml = [
                            '<div id="map-bubble-inner">',
                                '<div class="block-title">',
                                    '<p class="location">', data.dest.region.name, ' <span>&rsaquo;</span> ', data.dest.city.name, '</p>',
                                    '<h1><a href="', data.url, '">', data.name, '</a></h1>',
                                    '<div class="rating-wrapper clearfix">',
                                        '<div class="rating">',
                                            '<div class="rating-bar" style="width: ', Math.round(100 * data.rating.average / 5), '%;">',
                                                data.rating.average,
                                            '</div>',
                                        '</div>',
                                        '<div class="text">',
                                            '<span>', Math.round(10 * data.rating.average) / 10, '</span> <em>(', data.rating.votes, ')</em>',
                                        '</div>',
                                    '</div>',
                                    '<p class="producer">', data.producer.name, '</p>',
                                '</div>',
                                '<div class="block-info">', TRAVEL.para(data.info).replace(ampPattern, '&'), '</div>',
                                '<div class="block-bottom">',
                                    '<span class="price">fr. <em>', TRAVEL.formatMoney(data.price, true, true), '</em></span>',
                                    '<span class="s-btn"><span>',
                                        '<a href="', data.url, '">Läs mer</a>',
                                    '</span></span>',
                                '</div>',
                                '<div class="block-image"><img alt="" src="', data.images[0].url, '" /></div>',
                            '</div>'
                        ].join('');

                        marker.openExtInfoWindow(map.getGoogleMap(),
                                'map-bubble', bubbleHtml, {beakOffset: 0, paddingX: 16, paddingY: 16});
                        // fix height
                        $('#map-bubble_t').height($('#map-bubble_contents').height());


                    });
                });

                if ($.isFunction(callback)) {
                    callback(markers);
                }
            });
        }


        self.create = function (model) {

            $(document).ready(function () {

                var searchModel = model.search;

                var cards, i;

                cards = new TRAVEL.SuperFirst.DestinationCardsHolder($('#bd div.body-squeeze'));
                cards.create(model.popularDests);

                cards = new TRAVEL.SuperFirst.ProductCardsHolder($('#bd div.sidebar-right'));
                cards.create('Senast upplagda', 'sideblock-newproducts', model.newProducts);

                for (i = 0; i < model.tobs.length; i++) {
                    //if (model.tobs[i].id === 1 || model.tobs[i].id === 3) {
                        cards = new TRAVEL.SuperFirst.ProductCardsHolder($('#bd div.sidebar-left'));
                        cards.create('Bäst betyg: ' + model.tobs[i].name, '', model.tobs[i].products);
                    //}
                }

                // fix FAQ
                $('div.sidebar div.sideblock-faq li a').each(function (index) {
                    $(this).html(model.faq[index].question);
                });
                $('div.sidebar div.sideblock-faq').each(function () {
                    $(this.parentNode).append(this);
                    $(this).removeClass('hidden');
                })

                // fix sideblock-lastminute
                $('div.sidebar div.sideblock-lastminute').each(function () {
                    var block = $(this);
                    var o = $('li', block);
                    // shuffle
                    for (var i = o.length; i; i--) {
                        var j = parseInt(Math.random() * i);
                        var x = o[i];
                        o[i] = o[j];
                        o[j] = x;
                    }

                    o.slice(4).remove();
                    $('li:last', block).addClass('last');
                    block.removeClass('hidden');
                });


//                $('body').addClass(TRAVEL.isAuthenticated ? 'authenticated' : 'anonymous');

                TRAVEL.Controller.DropDown($('#head-panel ul.head-menu').find('li.my-space, li.login'),
                        $('#head-panel div.dropdown'));

                $('#head-panel div.dropdown li.logout').click(function () {
                    ajaxLogout();
                    return false;
                });

                var loginListener = function () {
                    ajaxLogin(function (message) {
                        alert(message);
                    });
                    return false;
                };

                $('#head-panel div.dropdown span.s-btn.btn-blue').click(loginListener);
                $('#head-panel div.dropdown form').submit(loginListener);




                var searchPanel = new TRAVEL.SuperFirst.Search(document.getElementById('search-gadget-container'));
                searchPanel.create(searchModel);

                searchPanel.attachObserver('modelChanged', function (data) {
                    placeMarkers(map, data, function (data) {
                        searchPanel.updateResults(data.products.length, data.url);
                    });
                });
                
                var map = new TRAVEL.Map.SuperFirst($('#head-map div.map-holder').get(0));
                map.attachObserver('complete', function () {
                    placeMarkers(map, searchModel, function (data) {
                        searchPanel.updateResults(data.products.length, data.url);
                    });
                });
                map.create();


                
                $("#head-panel ul.head-menu li").hover(function () {
                    $(this).addClass("hover");
                }, function () {
                    $(this).removeClass("hover");
                });

            });
        };
    };





    /**
     * Super First Destination Cards Holder
     * @param root
     */
    TRAVEL.SuperFirst.DestinationCardsHolder = function (root) {
        var self = this;

        function Card(root, model, isFirst) {
            var obj = [];

            function getFakePrice(str) {
                var c = 0, i;

                for(i = 0; i < str.length; i++) {
                    c = c + str.charCodeAt(i);
                }

                return 100 + 10 * Math.round(c % 100);
            }

            obj.push('<li', (isFirst ? ' class="first"' : ''), '>',
                    '<div class="card clearfix">',
                        (isFirst && model.images.length > 0 ? '<img src="' + model.images[0].url + '" alt="">' : ''),
                        '<div class="city"><a href="', model.url, '">', model.name, '</a></div>',
                        '<div class="price">fr. <span>', TRAVEL.formatMoney(getFakePrice(model.name), true, true), '</span></div>',
                        (isFirst ? '<div class="description">' + model.info + '</div>' : ''),
                    '</div>',
                '</li>');

            $(root).append(obj.join(''));
        }

        self.create = function (model) {
            var obj = [], i, c;

            if (model.length === 0) {
                return;
            }

            obj.push('<div class="mainblock mainblock-cities">',
                    '<div class="mainblock-head">',
                        '<h1>Populära resmål</h1>',
                    '</div>',
                    '<ul class="cards">',
                    '</ul>',
                    '<div class="see-other"><a href="', TRAVEL.LinkProvider.destinationList, '">Se fler Populära resmål</a> &raquo;</div>',
                '</div>');

            var ele = $(obj.join(''));
            var cardsHolder = $('ul.cards', ele);
            for (i = 0; i < model.length; i++) {
                c = new Card(cardsHolder, model[i], i === 0);
            }

            $(root).append(ele);
        };
    };


    /**
     * Super First Product Cards Holder
     * @param root
     */
    TRAVEL.SuperFirst.ProductCardsHolder = function (root) {
        var self = this;

        function Card(root, model) {
            var obj = [];
            obj.push('<li class="card clearfix">',
                    '<h2><a href="', model.url, '">', model.name, '</a></h2>',
                    '<div class="card-wrapper">',
                        '<div class="card-body">',
                            '<p class="location">', model.dest.region.name, ' <em>&rsaquo;</em> ', model.dest.city.name, '</p>',
                            '<p class="producer">', model.producer.name, '</p>',
                            '<span class="price">', TRAVEL.formatMoney(model.price, true, true), '</span>',
                            '<div class="info-block">',
                                '<span class="rating">', Math.round(10 * model.rating.average) / 10, '</span>',
                                '<span class="s-btn"><span><a href="', model.url, '">Info</a></span></span>',
                            '</div>',
                        '</div>',
                    '</div>',
                    '<div class="card-image">',
                        '<a href="', model.url, '"><img src="', (model.images.length > 0 ? model.images[0].url : baseUrl + 'new-i/s.gif'), '" alt="" /></a>',
                    '</div>',
                '</li>');

            $(root).append(obj.join(''));
        }

        self.create = function (title, className, model) {
            var obj = [], i, c;

            if (model.length === 0) {
                return;
            }

            obj.push('<div class="sideblock ', className, '">',
                    '<div class="sideblock-head">',
                        '<h1>', title, '</h1>',
                    '</div>',
                    '<ul class="cards">',
                    '</ul>',
                    '<div class="see-other hidden"><a href="#">Se fler ', title, '</a> &raquo;</div>',
                '</div>');

            var ele = $(obj.join(''));
            var cardsHolder = $('ul.cards', ele);
            for (i = 0; i < model.length; i++) {
                c = new Card(cardsHolder, model[i]);
            }

            $('li:last', ele).addClass('last');

            $(root).append(ele);
        };
    };





})();