function fullscreenify($main_elt, $bottom_elt, f_resize_hook, bottom_scale_coefficient) { //abstracted
    $(document.body).css("overflow", "hidden");
    $("html").css("overflow", "hidden");
    $("#footer").remove();

    if(!bottom_scale_coefficient) {
        bottom_scale_coefficient = 1;
    }

    var resize_handler = function() {
        var headerheight = $("#header").outerHeight();
        if (!headerheight) headerheight = 0;

        var newht = $(window).height() - headerheight - ($bottom_elt? ($bottom_elt.outerHeight ? $bottom_elt.outerHeight()*bottom_scale_coefficient : $bottom_elt) : 40) - 20;

        $main_elt.css("height", newht);
        
        //alert("setting main elt height to: " + newht + "\nwindow height: " + $(window).height());

        if(f_resize_hook) {
            f_resize_hook();
        }
    };
    
    $(window).unbind("resize");
    $(window).bind("resize",resize_handler);

    setTimeout(resize_handler, 100);
}


function fave_remove(e) {
    var me = this;    
    $.ajax({ "url": this.href, 
             "success": function(data) {
                if(data.indexOf("ajax_hint:login_required") >= 0) {
                    document.location = me.href;
                } else {
                    $(me).parents(".fav_control").removeClass("is_fav").addClass("not_fav");
                }
            },
            "error": function() {
                document.location = me.href;
            }
        });
    return false;
}

function fave_add(e) {
    var me = this;
    $.ajax({ "url": this.href, 
             "success": function(data) { 
            
                if(data.indexOf("ajax_hint:login_required") >= 0) {
                    document.location = me.href;
                } else {
                    $(me).parents(".fav_control").removeClass("not_fav").addClass("is_fav");
                }
            },
            "error": function() {
                document.location = me.href;
            }
        });
    return false;
}

function enable_ajax_item_reordering() {
    $("td.ordering a.move_item").click(function() {
            var this_tr = $(this).parents("tr");
            var previous_tr = this_tr.prev("tr");
            var next_tr = this_tr.next("tr");

            var num_pages = null;
            var cur_page = null;
            try {
                num_pages = parseInt($("#data_num_pages").text());
                cur_page  = parseInt($("#data_cur_page").text());
            } catch(e) { };

            var moved_ok = false;
            var post_load_page = null; // page to skip to after move complete, to be set if needed

            if(this.className.indexOf("up") >= 0) {
                // move me up
                if(previous_tr.length) {
                    previous_tr.before(this_tr);
                    moved_ok = true;
                } else {
                    if(cur_page && cur_page > 1) {
                        //move to end of previous page
                        moved_ok = true;
                        post_load_page = cur_page - 1 + "#lastitem";
                    } else {
                        alert("Sorry, this item is already first.");
                    }
                }

            } else {
                // move me down
                if(next_tr.length) {
                    next_tr.after(this_tr);
                    moved_ok = true;
                } else {
                    if(cur_page && num_pages && cur_page < num_pages) {
                        // move to beginning of next page
                        moved_ok = true;
                        post_load_page = cur_page + 1 + "#firstitem";
                    } else {
                        alert("Sorry, this item is already last.");
                    }
                }
            }

            if(moved_ok) {
                if(post_load_page) {
                    $.get(this.href, null, function() { document.location = "?page="+post_load_page });
                } else {
                    $.get(this.href);
                }
            }

            return false;
        });
}

var img_viewer_dialog_open = null; // function to be set later

function img_viewer_dialog_prepare() {
    // call this ONCE on doc load.  late-bind img_viewer_dialog_open again as needed.

    var img_viewer_dialog = $("#img_viewer_dialog");
    
    if(!img_viewer_dialog.length) return;

    if(!img_viewer_dialog.dialog) return;

    img_viewer_dialog.show().dialog({
            "autoOpen": false,
                "modal": true,
                "resizable": false,
                "draggable": false,
                "closeOnEscape": true,
                "title": "Image Viewer",
                "overlay": {
                    "background-color": "#444",
                    "opacity": "0.75",
                    "-moz-opacity": "0.75"
                },
                "width": .98 * $(window).width(),
                "height": .98 * $(window).height() });

    img_viewer_dialog_open = function(event) {
        img_viewer_dialog.dialog("open");
        var newurl = this.href+"";
        if(newurl.indexOf("?") < 0) {
            newurl += "?popmode=1";
        } else {
            newurl += "&popmode=1";
        }
        
        img_viewer_dialog.find("iframe.browse_iframe").attr("src", newurl);
        
        // log history event so back button works
        var prev_scrolltop = $(document).scrollTop();

        window.restore_scrolltop = function() {
            $(document).scrollTop(prev_scrolltop);
        };

        $.history.load("image_viewer");

        return false;
    };
        

    $(".item_img").click(img_viewer_dialog_open);
}

function fix_navbar_proportions_hack() {
    var leftdiv = $(".columns div.left:first");
    var innerdiv = $(".columns div.main:first .inner");

    if(leftdiv.height && leftdiv.height() > innerdiv.height()) {
        innerdiv.css("padding-bottom", (leftdiv.height() - innerdiv.height())+"px");
    }
}

function history_callback(hash) {
    if(hash != "image_viewer") {
        if($("#img_viewer_dialog").dialog) {
            $("#img_viewer_dialog").dialog("close");

            if(window.restore_scrolltop) {
                setTimeout(window.restore_scrolltop, 100);
            }
        }
    }
}


$.fn.hoverClass = function(c) {
    return this.each(function(){
        $(this).hover( 
            function() { $(this).addClass(c);  },
            function() { $(this).removeClass(c); }
        );
    });
};    
function activate_nav_menus() {
    $("#header_nav li").hover(function(){ $("ul", this).hide().fadeIn("fast"); }, 
                              function() { });
   
    if(document.all) {
        $("#header_nav li").hoverClass("sfHover");
    }
}



/* http://github.com/brandonaaron/jquery-overlabel/ */
(function($){
 
$.fn.overlabel = function() {
  this.each(function() {
    var $label = $(this), $input = $('#' + $label.attr('for'));
 
    $label
      .addClass('overlabel')
      .bind('click', function(event) {
        $input.focus();
      });
 
    $input
      .bind('focus blur', function(event) {
        $label.css('display', (event.type == 'blur' && !$input.val() ? '' : 'none'));
      }).trigger('blur');
  });
};
 
})(jQuery);


$(document).ready(function() {
        $(".fav_control .fav_true a, .fav_control a.fav_true").click(fave_remove);
        $(".fav_control .fav_false a, .fav_control a.fav_false").click(fave_add);

        $("form.search label").overlabel();

        fix_navbar_proportions_hack();

        img_viewer_dialog_prepare();

        $.history.init(history_callback);

        activate_nav_menus();
    });
