(function ($) {

    var loadPolyFills = function () {
        yepnope([
			{	// Form validation
			    test: Modernizr.input.required && Modernizr.input.pattern,
			    nope: ['/templates/fornebu/resource/javascript/jquery.h5validate.js'],
			    callback: function (id, testResult) {
			        if (!testResult) {
			            // Be careful with what you do here. Quite some specific fixes to make this work.
			            // This includes manual validation on load. (This has to come before the placeholder script)

			            var formSelector = 'fieldset';
			            var form = $(formSelector);

			            form.h5Validate({
			                debug: false,
			                errorClass: 'invalid',
			                validClass: 'valid'
			            });

			            // Get default values of h5Validate
			            var defaults = form.h5Validate.defaults,
						 	kbSelectors = defaults.kbSelectors.split(', ')
			            mSelectors = defaults.mSelectors.split(', '),
							selectors = kbSelectors.concat(mSelectors)
						;

			            // Manual validation on load
			            var $kbSelectors = $(formSelector + ' ' + kbSelectors.join(', ' + formSelector + ' ')),
							$mSelectors = $(formSelector + ' ' + mSelectors.join(', ' + formSelector + ' ')),
							$selectors = $kbSelectors.add($mSelectors)
						;

			            $kbSelectors.trigger('focusout.h5Validate');
			            $mSelectors.trigger('click.h5Validate');
			        }
			    }
			},
			{	// Input placeholder
			    test: Modernizr.input.placeholder,
			    nope: ['/templates/fornebu/resource/javascript/jquery.placeholder.min.js'],
			    callback: function (id, testResult) {
			        if (!testResult) {
			            $('input, textarea').placeholder();
			        }
			    }
			},
			{
			    // IE6 Fixes
			    test: $.browser.msie && $.browser.version.substr(0, 1) < 7,
			    yep: ['/templates/fornebu/resource/javascript/DD_belatedPNG_0.0.8a-min.js'],
			    callback: function (id, testResult) {
			        if (testResult) {
			            $('input').each(function () {
			                $(this).addClass('input-type-' + $(this).attr('type'));
			            });

			            DD_belatedPNG.fix(
							'#primary-nav .header-wrapper ul,' +
							'.quick.housing-area-entrances nav a,' +
							'.quick.housing-area-entrances nav a span,' +
							'.housing-area-entrances .rolfsbukta h2, #housing-area-menu.rolfsbukta h2, .housing-area-label.rolfsbukta, .quick.housing-area-entrances .rolfsbukta,' +
							'#header #logo' +
						'');
			            // $('*').each(function() {
			            // 	if($(this).css('background-image').match('.png') != null) {
			            // 		DD_belatedPNG.fixPng($(this).get(0));
			            // 	}
			            // });
			        }
			    }
			}
		]);
    };


    $.fn.selectBoxReplacement = function () {
        return $(this).each(function () {

            var $select = $(this);
            var replacement = $('<ul class="select-replacement"></ul>').addClass($(this).attr('class'));
            var selectedItem = $('<li class="selected"><span class="selected-text"></span></li>').appendTo(replacement);
            var selectedText = selectedItem.find('.selected-text');
            var options = $('<div class="options"><ul></ul></div>').appendTo(selectedItem);

            $select.find('option').each(function () {
                var option = $(this);
                var li = $('<li><span>' + option.text() + '</span></li>');
                options.find('ul').append(li);
            });

            var liOptions = options.find('li');

            var toBack = function () {
                replacement.css('z-index', 0);
            }

            var toFront = function () {
                replacement.css('z-index', 10);
            }

            liOptions.click(function (e) {
                liOptions.removeClass('active');
                $(this).addClass('active');
                var index = options.find('li').index($(this));
                $select[0].selectedIndex = index;
                selectedText.text($(this).text());
                $select.trigger('change');
            });


            replacement.click(function () {
                options.toggle();
                if (options.is(':visible')) {
                    toFront();
                } else {
                    toBack();
                }

                if (options.offset().top + options.height() > $(window).scrollTop() + $(window).height()) {
                    options.css('top', (options.height() + 12) * -1);
                } else {
                    options.css('top', replacement.outerHeight() + 2);
                }
            });

            $(document).click(function (e) {
                e.stopPropagation();
                var t = e.target;

                if ($(t).closest('.select-replacement').get(0) != replacement.get(0)) {
                    toBack();
                    options.hide();
                }
            });

            selectedText.text(liOptions.eq($select[0].selectedIndex).addClass('active').text());

            options.hide();
            $select.hide();
            replacement.insertAfter($select);
        });
    }


    var initFrontpageHousingEntrances = function () {
        var container = $('.quick.housing-area-entrances');
        var positioner = container.find('.positioner');
        var areas = positioner.find('a');
        var navElements = container.find('nav a');
        var next = container.find('nav .next');
        var prev = container.find('nav .prev');

        var currentLeft = 20;
        var moveStep = 313;

        positioner.width(positioner.find('a').length * 320);

        var move = function (to) {
            currentLeft = to;
            positioner.stop().animate({
                left: currentLeft
            }, 150);
        }

        var updateDisabledClasses = function () {
            navElements.each(function () {
                if ($(this).hasClass('prev')) {
                    if (currentLeft < 20) {
                        $(this).removeClass('disabled');
                    } else {
                        $(this).addClass('disabled');
                    }
                } else {
                    if (currentLeft > ((areas.length - 4) * moveStep) * -1) {
                        $(this).removeClass('disabled');
                    } else {
                        $(this).addClass('disabled');
                    }
                }
            });
        }

        // Prev
        prev.click(function (e) {
            e.preventDefault();
            if (currentLeft < 20) {
                move(currentLeft + moveStep);
            }
            updateDisabledClasses();
        });

        // Next
        next.click(function (e) {
            e.preventDefault();
            if (currentLeft > ((areas.length - 4) * moveStep) * -1) {
                move(currentLeft - moveStep);
            }
            updateDisabledClasses();
        });

        updateDisabledClasses();
    };


    $.fn.hoverAnimation = function (onCSS, offCSS, onTime, offTime) {
        return $(this).each(function () {
            $(this).css(offCSS);
            $(this).hover(function () {
                $(this).stop().animate(onCSS, onTime);
            }, function () {
                $(this).stop().animate(offCSS, offTime || onTime);
            });
        });
    };


    $.fn.imageSlideshow = function () {
        return $(this).each(function () {
            var currentImage = 0;

            var slideshow = $(this);
            var figures = slideshow.find('figure');
            var isSingle = figures.length == 1;

            var wrapper = $('<div class="wrapper"></div>');
            var nav = $('<nav></nav>');
            var openButton = $('<a href="" class="view-bigger">Større bilde</a>').hide();
            var credits = $('<p class="photo-credits"></p>"');

            var modal = $('<div class="modal-image-viewer"></div>').hide();
            var modalWrapper = $('<div class="wrapper"></div>')
            var closeButton = $('<a class="close" href="">X</a>');

            var firstImage = figures.eq(0).find('img');

            modal.append(modalWrapper.append(closeButton)).appendTo($('body'));
            nav.append(openButton);
            slideshow.append(nav);
            slideshow.append(wrapper);
            slideshow.append(credits);

            var updateCaption = function () {
                var figure = figures.eq(currentImage);
                var newText = figure.find('figcaption').text();

                if (credits.text() != newText) {
                    credits.fadeOut(200, function () {
                        credits.text(newText).fadeIn(200);
                    });
                }
            }

            if (isSingle) {
                wrapper.append(figures);
                figures.width(wrapper.innerWidth());
            } else {
                var positioner = $('<div class="positioner"></div>');
                var prevButton = $('<a href="" class="prev">Forrige</a>');
                var nextButton = $('<a href="" class="next">Neste</a>');

                wrapper.append(positioner);
                positioner.append(figures);
                nav.append(prevButton).append(nextButton);

                var justifyToFirstImage = function () {
                    positioner.width(figures.length * wrapper.width());
                    wrapper.height(firstImage.height());
                    figures.width(wrapper.innerWidth());

                }

                if (firstImage.height() > 0) {
                    justifyToFirstImage();
                    slideshow.show();
                } else {
                    firstImage.load(function () {
                        justifyToFirstImage();
                        slideshow.show();
                    });
                }

                var change = function (i) {
                    currentImage = i;
                    var figure = figures.eq(currentImage);

                    updateCaption();

                    if (figure.find('a').length == 0) {
                        openButton.fadeOut(100);
                    } else {
                        openButton.fadeIn(100);
                    }

                    var newCSS = { left: figure.find('img').position().left * -1 }
                    if (Modernizr.csstransitions) {
                        positioner.css(newCSS);
                    } else {
                        positioner.stop().animate(newCSS, 300);
                    }

                    if (currentImage == 0) {
                        if (Modernizr.csstransitions) {
                            prevButton.addClass('disabled');
                        } else if (!$.browser.msie) {
                            prevButton.fadeTo(100, .4);
                        }
                    } else {
                        if (Modernizr.csstransitions) {
                            prevButton.removeClass('disabled');
                        } else if (!$.browser.msie) {
                            prevButton.fadeTo(100, 1);
                        }
                    }

                    if (currentImage == figures.length - 1) {
                        if (Modernizr.csstransitions) {
                            nextButton.addClass('disabled');
                        } else if (!$.browser.msie) {
                            nextButton.fadeTo(100, .4);
                        }
                    } else {
                        if (Modernizr.csstransitions) {
                            nextButton.removeClass('disabled');
                        } else if (!$.browser.msie) {
                            nextButton.fadeTo(100, 1);
                        }
                    }
                };

                // var interval = setInterval(function() {
                // 	change(currentImage + 1 > figures.length-1 ? 0 : currentImage + 1);
                // }, 3000);

                var prev = function () {
                    // clearInterval(interval);
                    change(currentImage > 0 ? currentImage - 1 : 0);
                };

                var next = function () {
                    // clearInterval(interval);
                    change(currentImage < figures.length - 1 ? currentImage + 1 : figures.length - 1);
                };


            }

            slideshow.hover(function () {
                if (figures.eq(currentImage).find('a').length > 0) {
                    openButton.fadeIn(100);
                }
            }, function () {
                openButton.fadeOut(100);
            });

            var openBig = function (e) {
                e.preventDefault();

                var supported = true;
                var link = figures.eq(currentImage).find('a');
                //var filext = link.attr('href').match('\.(\\w+)$', '\i')[1];

                var removeContent = function () {
                    modal.find('img, object, embed').remove();
                }

                var showContent = function (content) {
                    closeButton.fadeIn(150)
                    content.fadeIn(150);
                }

                removeContent();

                if (link.hasClass('pdf')) {
                    $('<div id="pdfViewer"></div>').appendTo(modalWrapper);
                    modalWrapper.css({
                        width: settings.pdfViewer.width,
                        height: settings.pdfViewer.height,
                        marginLeft: settings.pdfViewer.width / 2 * -1,
                        marginTop: settings.pdfViewer.height / 2 * -1
                    });
                    swfobject.embedSWF(settings.pdfViewer.url, 'pdfViewer', settings.pdfViewer.width, settings.pdfViewer.height, "9.0.0", "flash/expressInstall.swf", settings.pdfViewer.flashvars, { allowFullscreen: true });
                    showContent($('pdfViewer'));
                } else {
                    // Image content
                    var newImage = $('<img src="' + link.attr('href') + '" alt="" />').hide();
                    modalWrapper.append(newImage);

                    newImage.load(function () {
                        modalWrapper.css({
                            width: $(this).outerWidth(),
                            height: $(this).outerHeight(),
                            marginLeft: $(this).outerWidth() / 2 * -1,
                            marginTop: $(this).outerHeight() / 2 * -1
                        });

                        showContent($(this));
                    });
                }

                modal.show();
            };

            var closeBig = function () {
                modal.hide();
            };

            figures.find('a').click(openBig);
            openButton.click(openBig);
            closeButton.click(function (e) { e.preventDefault(); closeBig() });
            modal.click(closeBig);
            modalWrapper.click(function (e) {
                e.stopPropagation();
            })

            if (!isSingle) {
                prevButton.click(function (e) { e.preventDefault(); prev(); });
                nextButton.click(function (e) { e.preventDefault(); next(); });
            }

            updateCaption();
        });
    }

    var initMap = function () {
        var map = $('#map');
        var isFlashRunning = settings.mapOptions.isOpen;
        var toggleMap = $('#header .toggle-map');
        var fallback = map.find('#fallback-map');

        var sendStatus = function (value) {
            $.ajax({
                url: settings.mapOptions.toggleService,
                dataType: 'json',
                data: { value: value }
            });
        };

        var runFlash = function () {
            if (!isFlashRunning) {
                runFlashMap();
            }
            isFlashRunning = true;
        }

        var mapHover = function () {
            fallback.stop().animate({ opacity: 1 });
        }

        var mapLeave = function () {
            fallback.stop().animate({ opacity: .4 });
        }

        var mapClick = function () {
            open();
        };

        var close = function () {
            sendStatus('closed');
            fallback.css('opacity', 1);

            if ($('body').hasClass('ie6') || $('body').hasClass('ie7')) {
                map.height(100)
                $('#primary-nav').css('zoom', '0').css('zoom', '1');
                $('#search').css('zoom', '0').css('zoom', '1');
            } else {
                animateHeight('100px', function () {
                    $('#flash-map').css('opacity', 0);
                });
            }

            $('#flash-map').css('opacity', 0);

            map.add('#header .toggle-map').bind('mouseenter.map', mapHover);
            map.bind('mouseleave.map', mapLeave);
            map.bind('click.map', mapClick);

            toggleMap.removeClass('open').addClass('closed');
            map.removeClass('open').addClass('closed');
        };

        var open = function () {
            sendStatus('open');
            runFlash();

            if ($('body').hasClass('ie6') || $('body').hasClass('ie7')) {
                map.height(385)
                $('#primary-nav').css('zoom', '0').css('zoom', '1');
                $('#search').css('zoom', '0').css('zoom', '1');
            } else {
                animateHeight('385px');
            }

            map.unbind('mouseenter.map');
            map.unbind('mouseleave.map');
            map.unbind('click.map');

            $('#flash-map').css('opacity', 1);

            toggleMap.removeClass('closed').addClass('open');
            map.removeClass('closed').addClass('open');
        };

        var animateHeight = function (val, callback) {
            map.animate({ height: val }, null, callback);
        };

        toggleMap.mouseenter(function () {
            fallback.stop().animate({ opacity: 1 });
        });

        toggleMap.mouseleave(function () {
            fallback.stop().animate({ opacity: .4 });
        });

        // Click handler for opening / closing
        toggleMap.click(function (e) {
            e.preventDefault();
            if (map.hasClass('open')) {
                close();
            } else {
                open();
            }
        });

        if (map.hasClass('open')) {
            runFlash();
            toggleMap.addClass('open');
        } else {
            toggleMap.addClass('closed');
            map.bind('mouseenter.map', mapHover);
            map.bind('mouseleave.map', mapLeave);
            map.bind('click.map', mapClick);
        }

    }


    var isImage = function (extension) {
        if (['jpeg', 'jpg', 'gif', 'png'].indexOf(extension) > -1) {
            return true;
        }
        return false;
    }


    $.fn.initTabs = function () {
        return $(this).each(function () {
            var tabs = $(this).find('.tab');
            var menu = $('<ul></ul>').addClass('tab-menu');

            var change = function (i) {
                menu.find('li').eq(i).addClass('selected').siblings().removeClass('selected');
                tabs.eq(i).show().siblings().not(menu).hide();
            }

            tabs.each(function () {
                var newLink = $('<a href=""></a>').text($(this).find('pre').hide().text());
                newLink.click(function (e) {
                    e.preventDefault();
                    var i = $(this).parent().index();
                    change(i);
                });
                var newLi = $('<li></li>').append(newLink);
                menu.append(newLi);
            });

            $(this).prepend(menu);
            change(0);
        });
    }


    $(function () {
        // Init map
        initMap();

        $('body').removeClass('no-js').addClass('js');

        if ($.browser.msie) {
            $('body').addClass('ie').addClass('ie' + $.browser.version.substr(0, 1));
            $('#breadcrumbs li:last-child').addClass('last-child');
        }

        // Boligsøk sidebar toggle more
        $('.filters .toggle-more').click(function (e) {
            e.preventDefault();
            $('.filters fieldset.more').toggleClass('open');
            $(this).toggleClass('open');

            // if($('.filters fieldset.more').hasClass('open')) {
            // 	$('.filters fieldset.more').css('overflow', 'visible');
            // } else {
            // 	$('.filters fieldset.more').css('overflow', 'hidden');
            // }
        });

        // Init image slidehsows
        $('.images').imageSlideshow();

        // Init frontpage housing-entrances
        initFrontpageHousingEntrances();

        // Load external polyfills (fallbacks)
        loadPolyFills();

        // Replce select boxes
        $('select').selectBoxReplacement();

        // No css transitions fallback
        if (!Modernizr.csstransitions) {
            $('.quick.housing-area-entrances .positioner a').hoverAnimation({ marginTop: -8 }, { marginTop: 0 }, 140);
            $('.images nav .prev').hoverAnimation({ left: '-29px' }, { left: '-24px' }, 100);
            $('.images nav .next').hoverAnimation({ right: '-29px' }, { right: '-24px' }, 100);
        }

        // Share open new window
        $('.share a').click(function (e) {
            e.preventDefault();
            window.open($(this).attr('href'), 'Del', 'height=400, width=600');
        });

        // Justify height of article entrances
        $('.article-entrances').each(function () {
            var highestHeight = 0;
            var entrances = $(this).find('.entrance');
            entrances.find('img').load(function () {
                var entrance = $(this).closest('.entrance');
                if (entrance.height() > highestHeight) {
                    highestHeight = entrance.height();
                    entrances.height(highestHeight);
                }
            });
        });

        $('#housing-area-menu h2').hoverAnimation({ marginTop: -4 }, { marginTop: 0 }, 100);

        // No click on disabled housings in housing-lists
        $('.housing-list .disabled a').click(function (e) {
            e.preventDefault();
        });

        $('a').each(function () {
            var url = $(this).attr('href');
            var absoluteTest = new RegExp('^https?://');
            if (absoluteTest.test(url)) {
                var domainTest = new RegExp(settings.domain);
                if (!domainTest.test(url)) {
                    $(this).click(function (e) {
                        e.preventDefault();
                        window.open(url);
                    });
                }
            }
        });

        $('.tabs').initTabs();
    });
})(jQuery);
