﻿/* idTabs ~ Sean Catchpole - Version 2.2 - MIT/GPL */
(function () {
    var dep = { "jQuery": "http://code.jquery.com/jquery-latest.min.js" };
    var init = function () {

        /* Options (in any order): 
 
        start (number|string) 
        Index number of default tab. ex: $(...).idTabs(0) 
        String of id of default tab. ex: $(...).idTabs("tab1") 
        default: class "selected" or index 0 
        Passing null will force it to not select a default tab 
 
        change (boolean) 
        True - Url will change. ex: $(...).idTabs(true) 
        False - Url will not change. ex: $(...).idTabs(false) 
        default: false 
 
        click (function) 
        Function will be called when a tab is clicked. ex: $(...).idTabs(foo) 
        If the function returns true, idTabs will show/hide content (as usual). 
        If the function returns false, idTabs will not take any action. 
        The function is passed four variables: 
        The id of the element to be shown 
        an array of all id's that can be shown 
        the element containing the tabs 
        and the current settings 
 
        selected (string) 
        Class to use for selected. ex: $(...).idTabs(".current") 
        default: ".selected" 
 
        event (string) 
        Event to trigger idTabs on. ex: $(...).idTabs("!mouseover") 
        default: "!click" 
        To bind multiple event, call idTabs multiple times 
        ex: $(...).idTabs("!click").idTabs("!focus") 
 
        */
        (function ($) {

            $.fn.idTabs = function () {
                //Loop Arguments matching options 
                var s = {};
                for (var i = 0; i < arguments.length; ++i) {
                    var a = arguments[i];
                    switch (a.constructor) {
                        case Object: $.extend(s, a); break;
                        case Boolean: s.change = a; break;
                        case Number: s.start = a; break;
                        case Function: s.click = a; break;
                        case String:
                            if (a.charAt(0) == '.') s.selected = a;
                            else if (a.charAt(0) == '!') s.event = a;
                            else s.start = a;
                            break;
                    }
                }

                if (typeof s['return'] == "function") //backwards compatible 
                    s.change = s['return'];

                return this.each(function () { $.idTabs(this, s); }); //Chainable 
            }

            $.idTabs = function (tabs, options) {
                //Settings 
                var meta = ($.metadata) ? $(tabs).metadata() : {};
                var s = $.extend({}, $.idTabs.settings, meta, options);

                //Play nice 
                if (s.selected.charAt(0) == '.') s.selected = s.selected.substr(1);
                if (s.event.charAt(0) == '!') s.event = s.event.substr(1);
                if (s.start == null) s.start = -1; //no tab selected 

                //Setup Tabs 
                var showId = function () {
                    if ($(this).is('.' + s.selected))
                        return s.change; //return if already selected 
                    var id = "#" + this.href.split('#')[1];
                    var aList = []; //save tabs 
                    var idList = []; //save possible elements 
                    $("a", tabs).each(function () {
                        if (this.href.match(/#/)) {
                            aList.push(this);
                            idList.push("#" + this.href.split('#')[1]);
                        }
                    });
                    if (s.click && !s.click.apply(this, [id, idList, tabs, s])) return s.change;
                    //Clear tabs, and hide all 
                    for (i in aList) $(aList[i]).removeClass(s.selected);
                    for (i in idList) $(idList[i]).hide();
                    //Select clicked tab and show content 
                    $(this).addClass(s.selected);
                    $(id).show();
                    return s.change; //Option for changing url 
                }

                //Bind idTabs 
                var list = $("a[href*='#']", tabs).unbind(s.event, showId).bind(s.event, showId);
                list.each(function () { $("#" + this.href.split('#')[1]).hide(); });

                //Select default tab 
                var test = false;
                if ((test = list.filter('.' + s.selected)).length); //Select tab with selected class 
                else if (typeof s.start == "number" && (test = list.eq(s.start)).length); //Select num tab 
                else if (typeof s.start == "string" //Select tab linking to id 
         && (test = list.filter("[href*='#" + s.start + "']")).length);
                if (test) { test.removeClass(s.selected); test.trigger(s.event); } //Select tab 

                return s; //return current settings (be creative) 
            }

            //Defaults 
            $.idTabs.settings = {
                start: 0,
                change: false,
                click: null,
                selected: ".selected",
                event: "!click"
            };

            //Version 
            $.idTabs.version = "2.2";

            //Auto-run 
            $(function () { $(".idTabs").idTabs(); });

        })(jQuery);



    } //init 

    // Check Dependencies 
    var check = function (o, s) {
        s = s.split('.');
        while (o && s.length) o = o[s.shift()];
        return o;
    }

    // Add Script 
    var head = document.getElementsByTagName("head")[0];
    var add = function (url) {
        var s = document.createElement("script");
        s.type = "text/javascript"; s.src = url;
        head.appendChild(s);
    }

    // Save Self 
    var s = document.getElementsByTagName('script');
    var src = s[s.length - 1].src;

    // Load Dependencies 
    var ok = true;
    for (d in dep) {
        if (check(this, d)) continue;
        ok = false;
        add(dep[d]);
    } if (ok) return init();

    // Reload Self 
    add(src);

})();
