var LoginBox = {
    bindToggler: function() {
        $('#sign-in').click(function(){
            $('#login-options').toggle();
            $('#sign-in').toggleClass('active');
            return false;
        });
    },
    init: function() {
        LoginBox.bindToggler();
    }
}

var SearchBox = {
    placeholder: '34G, Freya, Dcup, etc...',
    inactiveClass: 'inactive',
    emptyString: '',

    deactivate: function(){
        SearchBox.$searchbox.addClass(SearchBox.inactiveClass);
    },
    activate: function(){
        SearchBox.$searchbox.removeClass(SearchBox.inactiveClass);
    },
    setDefault: function(){
        SearchBox.$searchbox.val(SearchBox.placeholder);
    },
    clear: function(){
        SearchBox.$searchbox.val(SearchBox.emptyString);
    },
    isEmpty: function(){
        return SearchBox.$searchbox.val() === SearchBox.emptyString;
    },
    isDefault: function(){
        return SearchBox.$searchbox.val() === SearchBox.placeholder;
    },

    bindSubmit: function(){
        this.$button.click(function(){
            // Avoid searching for default string
            if (SearchBox.isDefault()) {
                SearchBox.clear();
            }
        });
    },
    bindFocus: function(){
        this.$searchbox.focus(function(){
            SearchBox.activate();
            if (SearchBox.isDefault()) {
                SearchBox.clear();
            }
        });
    },
    bindBlur: function(){
        this.$searchbox.blur(SearchBox.setPlaceholder);
    },
    setPlaceholder: function(){
        if (SearchBox.isEmpty()||SearchBox.isDefault()) {
            SearchBox.deactivate();
            SearchBox.setDefault();
        }
    },
    initVars: function(){
        this.$form = $('#search-form');
        this.$searchbox = this.$form.find('input.search_box');
        this.$button = this.$form.find('input.button');
    },
    init: function(){
        this.initVars();
        this.bindSubmit();
        this.bindFocus();
        this.bindBlur();
        this.setPlaceholder();
    }
}

var CM = 0, IN = 1;
var RATIO = 2.54;

var UnitsSwitcher = {
    bindChangeUnits: function(){
        /*
        Binds select.change-units to change the units to the data-dest 
        table's td values
        */

        $('select.change-units').change(function(){
            var $select = $(this);
            var $dest = $($select.data('dest'));
            var labels = $select.data('labels');

            var units = parseInt($select.val());
            var myRatio = RATIO;

            if (units === CM) {
                myRatio = 1.0/RATIO;
            }

            UnitsSwitcher.updateUnits($dest, myRatio);
            if (labels) {
                UnitsSwitcher.updateLabels(labels,
                   $select.find('option:selected').text());
            }
            UnitsSwitcher.updateBackendUnits(units);
        });
    },
    updateUnits: function($dest, ratio) {
        $dest.find('tbody td.units').each(function(){
            $td = $(this);
            val = parseFloat($td.html());
            if (!!val) {
                $td.html((val/ratio).toFixed(1));
            }
        });
    },
    updateLabels: function(labels, value) {
        if (labels !== '-') {
            $(labels).html(value);
        }
    },
    updateBackendUnits: function(units){
        $.post(PREF_UNITS_ENDPOINT, {units: units});
    },
    init: function(){
        this.bindChangeUnits();
    }
}

var DoComparisons = {
    bindStartCompare: function(){
        $('.grid_3 .compare').click(function(){
            var href = this.href;
            var $that = $(this);
            if (!href) {
                return;
            }
            $.get(href, function(data){
                if (data.length > 30) {
                    $.modal(data);
                } else {
                    $that.html(data);
                    $that.removeClass('ready').unbind('click').removeAttr('href');
                }
            });
            return false;
        });
        /*
        $('.compare.ready').click(function(){
            $(this).load(this.href).removeClass('ready').unbind('click');
            return false;
        });
        $('.compare.pending').click(function(){
            var xhr = $.get(this.href);
            xhr.success(function(data){
                $.modal(data);
            });
            return false;
        });*/
    },
    init: function(){
        this.bindStartCompare();
    }
}

var Tabs = {
    showTab: function($tab){
        Tabs.hideTabs();
        $tab.show();
        var rel = $tab.attr('id');
        $section.children('table').find('a[rel=#'+rel+']').addClass('active');
    },
    hideTabs: function(){
        $section.children('div').hide();
        $section.children('table').find('a').removeClass('active');
    },
    bindTabs: function($section){
        var tabName = function(url) {
            return '#' + url.split('#')[1];
        }

        var activateTab = function(){
            var $tab_to_activate = $(tabName(this.href));
            Tabs.showTab($tab_to_activate);
            return false;
        }
        $section.children('table').find('a').click(activateTab); 
        $section.children('div').find('p.nav a').click(activateTab);
        Tabs.hideTabs();
        Tabs.showTab($section.children('div:first'));
    },
    init: function(){
        hash = window.location.hash;
        $('section.tabs').each(function(){
            $section = $(this);
            Tabs.bindTabs($section);
            if (hash){
                $activeTab = $section.find(hash);
                if ($activeTab.length) {
                    Tabs.showTab($activeTab);
                }
            }
        });
    }
}

var ModalPanels = {
    prepareModalForms: function(){
        var $modalContainer = $('simplemodal-container');
        $('.modal input[type=submit]').live('click', function(){
            var form = this.form;
            var $form = $(form);
            if ($form.hasClass('no-modal')) {
                return true;
            }

            var that = this;
            $[form.method](form.action, $form.serialize(), function(data){
                $data = $(data);
                $this_modal = $(that).parents('.modal');
                $this_modal.html($data.html());
                // Execute the retrieved SQL as $() messes with <script/>
                // http://goo.gl/4Clt
                $data.filter('script').each(function(){
                    $.globalEval(this.text||this.textContent||this.innerHTML);
                });

                if ($data.find('#delay-close').length) {
                    $this_modal.fadeOut();
                    var delay_close = $data.find('#delay-close').val();
                    setTimeout(function(){
                        $.modal.close();
                    }, parseInt(delay_close)*1000);
                }

                if ($data.find('#reload').length) {
                    $this_modal.fadeOut();
                    window.location.reload();
                }

                if ($data.find('#reload-to').length) {
                    $this_modal.fadeOut();
                    window.location = $('#reload-to').val();
                }
            });
            return false;
        });
    },
    openModal: function(dest, local) {
        if (local) {
            var hash = dest.split('#')[1];
            $('#' + hash).modal();
        } else {
            $.get(dest, function(data){
                apply_lightbox($(data).find('a.lightbox'));
                var res = $.modal(data, {
                    onShow: function(dlg) {
                        $(dlg.container).css('height', 'auto');
                    }
                });
                apply_lightbox($(res.d.container).find('a.lightbox'));
            });
        }
    },
    bindModalLinks: function(){
        $('a.open-modal').click(function(){
            ModalPanels.openModal(this.href);
            return false;
        });
        $('a.local-modal').click(function(){
            ModalPanels.openModal(this.href, true);
            return false;
        });
    },
    bindCloseModal: function(){
        $('.modal a.close-modal').live('click', function(){
            $.modal.close();
            return false;
        });
    },
    init: function(){
        this.bindModalLinks();
        this.bindCloseModal();
        this.prepareModalForms();
    }
}


var RemoveUTM = {
    // https://gist.github.com/626834
    init: function(){
        if (/utm_/.test(location.search) && window.history.replaceState){  
          // thx @cowboy for the revised hash param magic.
          var oldUrl = location.href;
          var newUrl = oldUrl.replace(/\?([^#]*)/, function(_, search) {
            search = search.split('&').map(function(v) {
              return !/^utm_/.test(v) && v;
            }).filter(Boolean).join('&'); // omg filter(Boolean) so dope.
            return search ? '?' + search : '';
          });

          if ( newUrl != oldUrl ) {
            window.history.replaceState({},'', newUrl); 
          }
          
        }
    }
};

var EnhanceJS = {
    init: function(){
        // Js fallback
        $('.hide-no-js').removeClass('hide-no-js');
        $('.show-no-js').hide();
    }
};

$(document).ready(function(){

    // Blinking messages
    $('#messages').fadeOut('slow', function(){
        var $this = $(this);
        $this.fadeIn('slow', function(){
            setTimeout(function(){
                $this.slideUp('slow');
            }, 4000);
        });
    });

    // Extend feedback tab
    $('#feedback-link a').click(function(){
        $(this.parentNode).children('form').animate({
            width: 'toggle'
        }, 200);
        return false;
    });

    // Lightbox
    apply_lightbox($('#content .lightbox'));

    // collapse titles
    $('.collapse').click(function(){
        target = this.href.split('#')[1];
        $('#' + target).slideToggle('fast');
        $(this).toggleClass('expanded');
        return false;
    });

    $('.add-comment a').click(function(){
        $(this.parentNode).siblings('form.comment-form').slideToggle('fast');
        return false;
    });

    LoginBox.init();
    SearchBox.init();
    DoComparisons.init();
    UnitsSwitcher.init();
    ModalPanels.init();
    Tabs.init();
    RemoveUTM.init();
    EnhanceJS.init();
});

function apply_lightbox(node){
    node.lightBox({
        fixedNavigation:true,
        imageLoading: STATIC_URL + 'images/lightbox-ico-loading.gif',
        imageBtnClose: STATIC_URL + 'images/lightbox-btn-close.gif',
        imageBtnPrev: STATIC_URL + 'images/lightbox-btn-prev.gif',
        imageBtnNext: STATIC_URL + 'images/lightbox-btn-next.gif',
        imageBlank: STATIC_URL + 'images/lightbox-blank.gif'
    });
    return node;
}


