﻿/// <reference path="jquery-1.4.1-vsdoc.js" />


(function ($) {
    // VERTICALLY ALIGN FUNCTION
    $.fn.vAlign = function () {
        return this.each(function (i) {
            var ah = $(this).height();
            var ph = $(this).parent().height();
            var mh = Math.ceil((ph - ah) / 2);
            $(this).css('margin-top', mh);
        });
    };

    $.fn.preloadImages = function () {
        this.each(function () {
            $('<img/>')[0].src = this;
        });
    }

    $.fn.biographyTip = function () {
        return this.each(function (i) {
            $(this).siblings('div.biography').offset({ top: ($(this).offset().top + 5 + $(this).width), left: $(this).offset().left });

            $('html').click(function () {
                $('div.biography').fadeOut(125);
            });

            $('div.biography').click(function (event) {
                event.stopPropagation();
            });
        }).click(function (event) {
            $('div.biography:visible').fadeOut(125);
            event.stopPropagation();
            $(this).siblings('div.biography').fadeIn(125);
        });
    };
    
    jQuery.fn.sortElements = (function () {

        var sort = [].sort;

        return function (comparator, getSortable) {

            getSortable = getSortable || function () { return this; };

            var placements = this.map(function () {

                var sortElement = getSortable.call(this),
                parentNode = sortElement.parentNode,

                // Since the element itself will change position, we have
                // to have some way of storing its original position in
                // the DOM. The easiest way is to have a 'flag' node:
                nextSibling = parentNode.insertBefore(
                    document.createTextNode(''),
                    sortElement.nextSibling
                );

                return function () {

                    if (parentNode === this) {
                        throw new Error(
                        "You can't sort elements if any one is a descendant of another."
                    );
                    }

                    // Insert before flag:
                    parentNode.insertBefore(this, nextSibling);
                    // Remove flag:
                    parentNode.removeChild(nextSibling);

                };

            });

            return sort.call(this, comparator).each(function (i) {
                placements[i].call(getSortable.call(this));
            });

        };

    })();

})(jQuery);


