/*
 * Create namespaces for wyprawy scripts
 */
window.deco = function() {};
deco.page = function() {};

/**
 * 
 */
$.fn.deco_delayed_slides = function(options) {
    var opts = $.extend({}, $.fn.deco_delayed_slides.defaults, options);
    
    return $(this).each(function() {
        var root = $(this);
        var replacements = $('span[data-img]', root);
        var start_time = new Date();

        function init() {
            replace_images();
            wait_on_load();
        }

        function replace_images() {
            replacements.each(function() {
                var repl = $(this);
                var img = $('<img data-replaced="true">');

                img.attr('src', repl.data('img'));
                $.each(opts.img_attrs, function(attr, value) {
                    img.attr(attr, value);
                });

                repl.replaceWith(img);
            });
        }

        function wait_on_load() {
            var images = root.find('img[data-replaced]');
            var load_count = 0;
            var event_fired = false;

            images.one('load', function() {
                load_count += 1;
                if (load_count == images.size() && event_fired == false) {
                    var now = new Date();
                    opts.on_all_loaded(now.getTime() - start_time.getTime());
                    event_fired = true;
                }
            });

            setTimeout(function() {
                if (event_fired == false) {
                    var now = new Date();
                    opts.on_all_loaded(now.getTime() - start_time.getTime());
                    event_fired = true;
                }
            }, 6000);
        }

        init();
    });
};

$.fn.deco_delayed_slides.defaults = {
    img_attrs: {},
    on_all_loaded: function() {}
};

(function(m) {
    var curr_style = 'bez';
    var gmaps_loaded = false;
    
    m.change_style = function(style) {
        $('#main').removeClass().addClass('c-' + style);
        curr_style = style;
    }

    m.set_full_height = function(elem) {
        var height = elem.offsetParent().height();
        elem.height(height);
    }

    m.Base = function() {
        var $main = $('#main');
        var $cnt = $('#cnt');
        init();

        function init() {

            $('#logo').click(
                function() {
                    window.location = window.location.pathname;
                });

            $.address.change(function(ev) {
                set_menu_focus(ev.pathNames[ev.pathNames.length-1]);
            });

            $('body').each(function() {
                if (window.location.pathname.indexOf('/p/') == 0) {
                    window.location = '/#' + window.location.pathname;
                }
            });

            $.deco_ajax.init({
                before_load: page_before_load,
                before_hide: page_before_hide,
                after_hide: page_after_hide,
                after_show: page_after_show,
                fadein_speed: 700,
                fadeout_speed: 700
            });

            setup_menu();

            $('#menu a:not([href="#"])').click(function() {
                $.address.value($(this).attr('href').replace(/^#/, ''));
                return false;
            });

            $('#langs').deco_lang_change();
            $(window).resize(resize_page);
            resize_page();
        }

        function set_menu_focus(page_id) {
            $('#menu li').removeClass('active');
            $('#p-'+page_id).addClass('active');
        }

        function page_before_load($cnt, url) {
            $('body, a').addClass('loading');
            $cnt.trigger('can_load.deco_ajax', [url]);
        }

        function page_before_hide($cnt, opage, npage) {
            var $inactive = $cnt.children('.p:not(.active)');
            var $active = $cnt.children('.p.active');

            $('#pslides, #full-slides').cycle('destroy');

            $('body, a').removeClass('loading');

            m.page_base($cnt, $inactive, npage);
            if (('page_' + npage.type) in m)
                m['page_' + npage.type]($cnt, $inactive, npage);
            else
                $cnt.trigger('can_hide.deco_ajax');
        }

        function page_after_hide($cnt, opage, npage) {
            if (curr_style != 'bez')
                m.change_style('bez');
            
            $cnt.trigger('can_show.deco_ajax');
        }

        function page_after_show($cnt, opage, npage) {
            if (npage.type == 'contact') {
                m.contact_show_map();
            }
            if ($main.hasClass('invisible')) {
                $main
                    .addClass('hidden')
                    .removeClass('invisible')
                    .fadeIn(2000);
            }
        }

        function resize_page() {
            var width = $main.width();
            var height = Math.round(width / 2.216582);
            $main.height(height + 30);
            $cnt.height(height);
        }

        function setup_menu() {
            $('#menu').deco_dropmenu();
            setup_submenus();
        }
        function setup_submenus() {
            var submenus = $('#menu > li > ul');

            submenus.each(function() {
                var smenu = $(this);
                var button = smenu.prev();

                if (smenu.outerWidth() > button.outerWidth()) {
                    button.width(smenu.width()-16);
                } else {
                    smenu.width(button.width()+16);
                }
            });
        }

    };

    m.page_base = function($cnt, $page, page_info) {

        var slides = $('#pslides', $page);
        if (slides.size() > 0 && slides.children().size() > 0) {
            var first_group = slides.children().eq(0).attr('data-group');
            
            slides.deco_delayed_slides({
                img_attrs: { 'class': 'full-height' },
                on_all_loaded: function(elapsed_time) {
                    slides.cycle({
                        containerResize: 0,
                        slideResize: 0,
                        timeout: slides.data('speed'),
                        speed: 2000,
                        slideExpr: first_group != "None" ? '[data-group="'+first_group+'"]' : null,
                        startingSlide: 0,
                        delay: (slides.data('speed') - elapsed_time > 0 ? -elapsed_time : -slides.data('speed'))
                    });
                }
            });
        }
        

        var full_slides = $('#full-slides', $page);
        if (full_slides.data('nav') == "True") {

                $page.append('<div id="snav"></div>');

               if (full_slides.children().size() > 0) {

                   full_slides.deco_delayed_slides({
                       img_attrs: { 'class': 'full' },
                       on_all_loaded: function(elapsed_time) {
                            
                           full_slides.cycle({
                                containerResize: 0,
                                slideResize: 0,
                                timeout: full_slides.data('speed'),
                                speed: 2000,
                                startingSlide: 0,
                                pager: '#snav',
                                pauseOnPagerHover: true,
                                pagerAnchorBuilder: function(idx, elem) { return $('<a href="#"></a>'); },
                                delay: (full_slides.data('speed') - elapsed_time > 0 ? -elapsed_time : -full_slides.data('speed'))
                            });
                       }
                    });
               }

        }
        else {
           if (full_slides.children().size() > 0) {

           full_slides.deco_delayed_slides({
               img_attrs: { 'class': 'full' },
               on_all_loaded: function(elapsed_time) {
                    
                   full_slides.cycle({
                        containerResize: 0,
                        slideResize: 0,
                        timeout: full_slides.data('speed'),
                        speed: 2000,
                        startingSlide: 0,
                        delay: (full_slides.data('speed') - elapsed_time > 0 ? -elapsed_time : -full_slides.data('speed'))
                    });
                }
            });
            }
        }
    };
    
    m.page_fpage = function($cnt, $page, page_info) {
        init();

        function init() {
            var slides = $cnt.find('div.slides', $page);

            slides.deco_delayed_slides({
                img_attrs: { 'class': 'full' },
                on_all_loaded: function(elapsed_time) {
                    
                    slides.cycle({
                        containerResize: 0,
                        slideResize: 0,
                        timeout: 7000,
                        speed: 2000,
                        startingSlide: 0,
                        delay: (7000 - elapsed_time > 0 ? -elapsed_time : -7000)
                    });
                }
            });

            $cnt.trigger('can_hide.deco_ajax');
        }
        
    }

    m.page_food = function($cnt, $page, page_info) {

        function init() {
            var slides = $cnt.find('ul.slides', $page);
            
            slides.deco_delayed_slides({
                img_attrs: { 'class': 'full' },
                on_all_loaded: function(elapsed_time) {
                    
                    slides.cycle({
                        containerResize: 0,
                        slideResize: 0,
                        timeout: slides.data('speed'),
                        speed: 2000,
                        startingSlide: 0,
                        pause: 0,
                        delay: (slides.data('speed') - elapsed_time > 0 ? -elapsed_time : -slides.data('speed'))
                    });
                }
            });

            $cnt.trigger('can_hide.deco_ajax');
        }

        init();
    }



    m.page_rooms = function($cnt, $page, page_info) {
        var view = $('#view', $page);
        var intro = $('#intro', $page);
        var desc = $('#rooms-desc', $page)
        var nav = $('#tnav', $page);
        var room_cache = {};
        var curr_room_id = null;
        init();

        function init() {
            $('#room-list a').click(function() {
                show_room($(this).data('room'));
                return false;
            });

            position_rooms_menu();
            setTimeout(function() {
                $('#scroll', $page).jScrollPane({ 
                    scrollbarWidth: 6,
                    scrollbarMargin: 15,
                    showArrows: true,
                    arrowSize: 15
                });
                $('.jScrollPaneTrack').fadeIn();
                $('#intro div.text').css('padding-right', '0');
            }, 1000);

            //desc
            //    .bind('recalc.deco-pager', pager_recalc)
            //    .bind('before-seek.deco-pager', pager_seek)
            //    .deco_pager();

//            $(window).unbind('resize').resize(onresize);
//            onresize();
//
//            nav.find('a.prev')
//                .click(function() {
//                    desc.deco_pager().prev(); return false;
//                })
//            .end().find('a.next')
//                .click(function() {
//                    desc.deco_pager().next(); return false;
//                });

            $cnt.trigger('can_hide.deco_ajax');
        }

        function onresize(e) {
            var pager = desc.deco_pager();
            //var txt = $('#rooms-desc', $page);
            //var height = $('#cnt').height() * 0.9;

            //height = Math.round(height / 20) * 20;
            //txt.css('height', height);

            pager.recalc_pages().seek(pager.page_num);
        }

        function pager_recalc(e, pnum, pages) {

        }

        function pager_seek(e, pnum, pages) {
            if (pnum == pages-1) {
                $('#tnav a.next').hide();
            } else {
                $('#tnav a.next').show();
            }
            if (pnum == 0) {
                $('#tnav a.prev').hide();
            } else {
                $('#tnav a.prev').show();
            }
        }

        function position_rooms_menu() {
            var rooms_button = $('#menu > li.rooms');
            var rooms_menu = $('#room-list');

            rooms_menu
                .css('margin-left', rooms_button.position().left)
                .css('width', rooms_button.outerWidth()-14);

        }

        function show_room(room_id) {
            room_id = Number(room_id);
            curr_room_id = room_id;

            if (!(room_id in room_cache)) {
                $('body, a').addClass('loading');

                $.getJSON('/rpc/get_room/', {room_id: room_id, lang: deco.lang}, function(data) {
                    room_cache[room_id] = data.result;
                    show_photos(room_cache[room_id].photos);
                });
            } else {
                show_photos(room_cache[room_id].photos);
            }
        }

        function show_photos(photos) {
            if (photos.length > 0)
                load_into_dom(photos);
        }

        function load_into_dom(photos) {
            var root = view.children(':not(.active)');
            var list = $('<ul class="full"></ul>');

            root.empty();
            list.appendTo(root);

            $.each(photos, function(i, photo) {
                if (i == 0)
                    list.append(
                        '<li class="full roomp"><img class="full" src="'  + photo.url + '" alt=""></img>' +
                        (photo.cnt.length > 0 ? '<div class="cnt" style="' + photo.style + '">' + photo.cnt + '</div>' : '') +
                        '</li>');
                else
                    list.append('<li class="full roomp"><span data-img="' + photo.url + '"></span>' +
                        (photo.cnt.length > 0 ? '<div class="cnt" style="' + photo.style + '">' + photo.cnt + '</div>' : '') +
                        '</li>');
            });

            wait_for_first_image(root);
        }

        function wait_for_first_image(root) {
            root.find('img:eq(0)').one('load', function() {
                $('body, a').removeClass('loading');
                switch_rooms();
            });
        }

        function switch_rooms() {
            var active = view.children('.active');
            var inactive = view.children(':not(.active)');

            active.stop(true, true).fadeOut(2000, function() {
                $(this)
                    .removeClass('active')
                    .children('ul').cycle('destroy')
                    .empty();
            });
            inactive
                    .stop(true, true)
                    .fadeIn(2000, function() { intro.hide(); start_cycle(); })
                    .addClass('active');
            setTimeout(function() {
                m.change_style(room_cache[curr_room_id].style);
            }, 750);
        }

        function start_cycle() {
            var active = view.children('.active');
            var photos = active.children('ul');

            photos.deco_delayed_slides({
                img_attrs: { 'class': 'full' },
                on_all_loaded: function(elapsed_time) {
                    photos.cycle({
                        containerResize: 0,
                        slideResize: 0,
                        timeout: 5000,
                        speed: 2000,
                        startingSlide: 0,
                        delay: (5000 - elapsed_time > 0 ? -elapsed_time : -5000)
                    });
                }
            });
        }
    }

    m.page_contact = function($cnt, $page, page_info) {
        $cnt.trigger('can_hide.deco_ajax');
    }

    m.contact_show_map = function() {
        var map;
        var directionsService;
        var directionsDisplay;
        var latlng;

        function init_routes() {
            var generic_req = {
                destination: 'Generała Kazimierza Pułaskiego 11/11, Sopot',
                provideRouteAlternatives: false,
                travelMode: google.maps.TravelMode.DRIVING,
                unitSystem: google.maps.UnitSystem.METRIC
            };
            
            var airport_req = $.extend(
                {}, 
                { origin: 'Port lotniczy Gdańsk im. Lecha Wałęsy, Gdańsk' },
                generic_req
            );

            var pkp_req = $.extend(
                {},
                { origin: new google.maps.LatLng(54.442121, 18.56227) },
                generic_req
            );

            directionsService = new google.maps.DirectionsService();
            directionsDisplay = new google.maps.DirectionsRenderer();
            directionsDisplay.setMap(map);
            
            $('#airport').click(function() { request_route(airport_req); return false; });
            $('#pkp').click(function() { request_route(pkp_req); return false; });
        }

        function display_route(result, status) {
            if (status == google.maps.DirectionsStatus.OK) {
                directionsDisplay.setDirections(result);
            }
        }

        function request_route(request) {
            directionsService.route(request, display_route);
        }

        function init_map() {
            latlng = new google.maps.LatLng(54.443302, 18.566734);
            
            m.set_full_height($('#gmap'));
            var opts = {
              zoom: 16,
              center: latlng,
              mapTypeId: google.maps.MapTypeId.ROADMAP,
              panControl: false,
              zoomControlOptions: {
                style: google.maps.ZoomControlStyle.DEFAULT
              }
            };
            map = new google.maps.Map($("#gmap").get(0), opts);

            var marker = new google.maps.Marker({
                position: latlng,
                map: map,
                title:"Soleil Boutique Hotel"
            });
        }

        function load_gmaps() {
            function onload() {
                gmaps_loaded = true;
                init_map();
                init_routes();
            }
            window.gmaps_onload = onload;

            var script = document.createElement('script');
            script.type = 'text/javascript';
            script.src = 'http://maps.google.com/maps/api/js?sensor=false&callback=gmaps_onload';
            $('body').append(script);
        }

        if (gmaps_loaded) {
            init_map();
            init_routes();
        }
        else
            load_gmaps();
    }

    m.page_links = function($cnt, $page, page_info) {
        $('#links').scrollable({
            onSeek: function(e, i) {
                var group = null;

                if (i == 0) {
                    group = 'sopot';
                }
                else if (i == 1) {
                    group = 'gdansk';
                }
                else if (i == 2) {
                    group = 'gdynia';
                }

               var slides = $('#pslides', $page);

               slides.cycle('stop');
               slides.cycle('destroy');
               slides.children().stop(true).css('opacity', 0);

               slides.cycle({
                        containerResize: 0,
                        slideResize: 0,
                        timeout: slides.data('speed'),
                        speed: 2000,
                        slideExpr: '[data-group="'+group+'"]',
                        startingSlide: 0,
                        delay: 0
               });

            }
        });
        
        $cnt.trigger('can_hide.deco_ajax');
    }

    m.page_form = function($cnt, $page, page_info) {

        function submit_form() {
            if (validate_form()) {
                $.post(
                    '/rpc/',
                    {
                        'method': 'send_email',
                        'params': JSON.stringify(build_params())
                    },
                    function() { 
                        clear_form();
                        display_msg('ok');
                    }
                );
                
            } else {
                display_msg('invalid');
            }

            return false;
        }

        function build_params() {
            return {
                'name': $('#id_name').val(),
                'phone': $('#id_phone').val(),
                'sender': $('#id_sender').val(),
                'msg': $('#id_msg').val()
            }
        }

        function display_msg(msg_id) {
            var form_msg = $('form span.msg', $page);
            var form_messages = $('form, span.messages', $page);
            
            form_msg.html(form_messages.find('.' + msg_id).eq(0).text()).fadeIn();
        }

        function validate_form() {            
            function field_required(field) {
                if (field.val().length == 0) {
                    field.addClass('err');
                    count += 1;
                }
            }

            var count = 0;
            field_required($('#id_name'));
            field_required($('#id_msg'));
            
            if (count == 0)
                return true;
            else
                return false;
        }

        function clear_form() {
            var inputs = $('form input, form textarea', $page);
            inputs.val('').removeClass('err')
        }

        $('button[type="submit"]', $page).click(submit_form);
        $cnt.trigger('can_hide.deco_ajax');
    }


    m.page_weather = function($cnt, $page, page_info) {
        var info = $('#info');

        function get_weather() {
            $.getJSON('/static/weather.json?v='+(new Date()).getTime(), function(data) {
                var img = '<img src="' + data.img + '" alt="">';
                var temp = ' <span class="temp">' + data.temp + '° C</span>';
                info.append('<p>' + img + temp + '</p>');
            });
        }
        $cnt.trigger('can_hide.deco_ajax');
        get_weather();
    }

    m.page_prices = function($cnt, $page, page_info) {
        $cnt.trigger('can_hide.deco_ajax');
    }

    m.page_offer = function($cnt, $page, page_info) {
        $cnt.trigger('can_hide.deco_ajax');
    }

    m.page_promo = function($cnt, $page, page_info) {
        var promos = $('#promos');
        var promos_li = promos.children();

        $('#index a').click(function() {
            promos_li.hide();
            promos.show();

            $('#index').fadeOut(1000);
            promos_li.eq($(this).parent().index()).fadeIn(1000);

            return false;
        });

        promos.find('a.back').click(function() {
            $('#index').fadeIn();
            promos_li.filter(':visible').fadeOut(500, function() {
                promos.hide();
            });
            return false;
        });

        $cnt.trigger('can_hide.deco_ajax');
    }

    
    m.page_nletter = function($cnt, $page, page_info) {
        var msg = $('#msg');
        
        function add_email() {
            if (!validate_form())
                return false;

            msg.children().fadeOut();

            $.ajax({
                type: 'POST',
                url: '/rpc/',
                data: {
                    method: 'add_nletter',
                    params: JSON.stringify({ email: $('#id_email').val() })
                },
                success: function(data) { display_msg(data); },
                error: function(data) { display_msg(data); }
            });

            return false;
        }

        function validate_form() {
            if ($('#id_email').val().length > 0)
                return true;
            else {
                msg.children().fadeOut().filter('.invalid').fadeIn();
                return false;
            }
        }

        function display_msg(data) {


            if ('result' in data) {
                msg.children().fadeOut().filter('.ok').fadeIn();
            } else {
                msg.children().fadeOut().filter('.fail').fadeIn();
            }
        }

        $('form button').click(add_email);
        $cnt.trigger('can_hide.deco_ajax');
    }

})(deco.page);


