﻿"SMART.Utilities".namespace(".");

SMART.Utilities = function() {

    var closeDropDown = function(content) {
        var id = $j(content).attr('id');
        $j('.showText', content).removeClass('hidden');
        $j('.hideText', content).addClass('hidden');
        $j(content).parent().addClass('collapse-off');
        $j('#' + id + '-content').addClass('hidden');
        resetHeightOnRoundedCornersAfterCollapse();
    }

    var openDropDown = function(content) {
        var id = $j(content).attr('id');
        $j('.showText', content).addClass('hidden');
        $j('.hideText', content).removeClass('hidden');
        $j(content).parent().removeClass('collapse-off');
        $j('#' + id + '-content').removeClass('hidden');
        resetHeightOnRoundedCornersAfterCollapse();
    }

    var resetHeightOnRoundedCornersAfterCollapse = function() {
        // NLC hackery wackness
        $j('.content').each(function() {
            if ($j('.rc_collapseBar', this).length > 0) {
                var height = $j(this).height();

                if (height != 0) {
                    $j(this).contents().find('.rc_top:eq(0)').height(height);
                }
            }
        });
    }

    var resetHeightOnRoundedCorner = function(element) {
        element.css("height", "");
        var theHeight = $j(element).height();
        if (theHeight != 0) {
            element.contents().find('.rc_top:eq(0)').height(theHeight);
            element.height(theHeight);
        }

    }

    var pub;

    pub = {

        GetQueryStringValue: function(key, defaultValue) {

            if (defaultValue == null) defaultValue = "";
            key = key.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
            var regex = new RegExp("[\\?&]" + key + "=([^&#]*)");
            var queryString = regex.exec((window.location.href).toLowerCase());

            if (queryString == null)
                return defaultValue;
            else
                return queryString[1];
        },

        ShowHideByQueryString: function(queryKey, delimiter) {

            var collapsableBars = $j(".rc_collapseBar");
            var delimitedKeys = pub.GetQueryStringValue(queryKey, "");

            // exit if don't have any keys, "" is default value
            if (delimitedKeys === "")
                return;

            var keysArray = (delimitedKeys === "") ? new Array() : delimitedKeys.split(delimiter);

            // loop through and collapse everything
            collapsableBars.each(function() {
                SMART.Utilities.CloseCollapsableContent(this);
            });

            // loop through all keys, 
            for (var i = 0; keysArray.length > i; i++) {

                var parsedValueFromAuthor;
                parsedValueFromAuthor = parseInt(keysArray[i]);

                // if it is not-NotANumber, sorry its JS
                if (!isNaN(parsedValueFromAuthor)) {
                    // open the folder
                    pub.OpenCollapsableContent(
                        collapsableBars[parsedValueFromAuthor - 1]
                        );
                };
            }
        },

        OpenCollapsableContent: function(content) {
            openDropDown(content);
        },
        CloseCollapsableContent: function(content) {
            closeDropDown(content);
        },
        ResetHeightOnRoundedCornersAfterCollapse: function() {
            resetHeightOnRoundedCornersAfterCollapse();
        },
        ResetHeightOnRoundedCorner: function(element) {
            resetHeightOnRoundedCorner(element);
        },
        AdjustPromoBinHeight: function() {
            // todo method, if necessary.  See bug 530
        }
    }

    return pub;
} ();

"SMART.Utilities.Forms.DefaultFieldText".namespace(".");

SMART.Utilities.Forms.DefaultFieldText = function() {

    var instructionalInput;
    var instructionalDefaultText;
    var enteredText;
    var clearText = "";

    var pub;

    pub = {
        init: function(selector, defaultText) {
            instructionalInput = $j(selector);
            instructionalDefaultText = defaultText;

            if (instructionalInput === undefined)
                throw ("A valid selector was not used.")

            // if the input is empty enter this text
            if (instructionalInput.val() === "")
                instructionalInput.val(instructionalDefaultText);

            // clear field when clicked
            instructionalInput.focus(function() {
                if (instructionalInput.val() === instructionalDefaultText)
                    instructionalInput.val(clearText);
            });

            instructionalInput.blur(function() {
                if (instructionalInput.val() === clearText)
                    instructionalInput.val(instructionalDefaultText);
            });
        }
    }

    return pub;

};

SMART.Utilities.Forms.DefaultFormFocus = function() {

    var defaultButton;
    var formWrapper;

    var pub;

    pub = {
        init: function(formWrapperSelector, buttonSelector) {

            var defaultButton = $j(buttonSelector);
            var formWrapper = $j(formWrapperSelector);

            // error out if these aren't set
            if (defaultButton === undefined)
                throw "Invalid selector for button";
            if (formWrapper === undefined)
                throw "Invalid selector for form wrapper";

            formWrapper.keypress(function(event) {
                if (event.keyCode == 13 && !$j(event.target).is('textarea')) {
                    event.preventDefault();
                    defaultButton.click();
                }
            });
        }
    }

    return pub;

};

SMART.Utilities.DropDowns = function() {
    var pub;

    //Closes the drop down
    var Close = function(context) {
        context.addClass('hidden');

        ChangeArrow(context, false);
    }

    //Opens the drop down
    var Open = function(context) {
        context.removeClass('hidden');
        ChangeArrow(context, true);
    }

    //Checks whether or not the drop down is 
    var CheckState = function(context) {
        return context.hasClass('hidden');
    }

    //Changes the arrow from right to down
    var ChangeArrow = function(context, isDown) {
        var addClass, remClass;
        if (!isDown) {
            addClass = 'RightArrow';
            remClass = 'DownArrow';
        }
        else {
            addClass = 'DownArrow';
            remClass = 'RightArrow';
        }

        //Find the element that has this class, and change the image class
        context.parent().find('.rc_whiteBtn').removeClass(remClass).addClass(addClass);
    }

    pub = {
        init: function(mainSelector, hoverClass) {

            var sel = $j(mainSelector);
            var mainSel = sel.parent();

            //Close ALL drop downs on body click
            $j(document.body).click(function(e) {
                //cycle through all elements
                mainSel.each(function(i) {

                    if (!CheckState($j(this).next()))
                        Close($j(this).next());
                });
            });

            //Determine whether to open or close drop down
            sel.click(function() {
                var next = ($j(this).parent()).next();

                if (!CheckState(next))
                    Close(next);
                else {
                    Close((sel.parent()).next()); //close all drop downs that are open
                    Open(next);
                }
                return false;
            });

            //Hover state for button
            sel.hover(function() {
                $j(this).find('.rc_whiteBtn').addClass(hoverClass);
            },
            function() {
                $j(this).find('.rc_whiteBtn').removeClass(hoverClass);
            });
            return false;
        }
    }
    return pub;
} ();




SMART.Utilities.Quicklinks = function() {

    // PRIVATE

    var container;
    var quicklinks;
    var arrow;

    var arrowCollapsedClass = "quicklinks-collapsed-arrow";
    var arrowExpandedClass = "quicklinks-expanded-arrow";


    var validate = function(attributes) {
        if (attributes.quicklinksSelector === undefined)
            throw ("quicklinksSelector was not defined");

        if (attributes.containerSelector === undefined)
            throw ("containerSelector was not defined");
    }

    var isOpen = function() {
        return arrow.hasClass(arrowExpandedClass);
    }

    var checKState = function() { }

    var close = function() {
        arrow.removeClass(arrowExpandedClass).addClass(arrowCollapsedClass);
        quicklinks.hide();

    }

    var open = function() {
        arrow.removeClass(arrowCollapsedClass).addClass(arrowExpandedClass);
        quicklinks.show();
    }



    // PUBLIC 

    pub = {
        Init: function(attributes) {

            validate(attributes);

            quicklinks = $j(attributes.quicklinksSelector);
            container = $j(attributes.containerSelector);
            container.css({ cursor: 'pointer' });

            arrow = container.find('.quicklinks-arrow');

            close();

            container.click(function() {
                arrow = $j(this).find('.quicklinks-arrow');
                quicklinks = $j(this).find(attributes.quicklinksSelector);
                isOpen() ? close() : open();
                return false;
            });

            $j("body").click(function() {
                close();
            });

            SMART.Killswitch.RegisterForKill("hideQuicklinks", function() { close(); });
        }
    };

    return pub;

};

//

var SWFObjectWrapper = function(id, path, text, width, height) {

    
    var so = new SWFObject(path, text, width, height, "9", "#FFFFFF");
    so.addParam("wmode", "transparent");
    so.addParam("quality", "high");
    //so.addParam("loop", "false");
    so.write(id);

/* 
    CODE FOR SWFObject 2.1 
    
    var params = { wmode: "transparent", quality: "high" };
    var attributes = {};
    var flashvars = {};
    swfobject.embedSWF(path, id, width, height, "8.0.0", "", flashvars, params, attributes);
*/

}

function OpenWindow(url) {
    window.open(url,'_blank');
}

SMART.Killswitch = function() {
    // private
    var registeredKillMethods = []

    //public
    var pub = {

        Nuke: function() {

            for (var i = 0; registeredKillMethods.length > i; i++) {
                registeredKillMethods[i]();
            }
        },

        RegisterForKill: function(key, method) {
            if (registeredKillMethods[key] !== undefined)
                throw ("We already have a callback with the key " + key + " added.");

            registeredKillMethods.push(method);
        }
    };
    return pub;
} ();

function getInternetExplorerVersion()
// Returns the version of Internet Explorer or a -1
// (indicating the use of another browser).
{
    var rv = -1; // Return value assumes failure.
    if (navigator.appName == 'Microsoft Internet Explorer') {
        var ua = navigator.userAgent;
        var re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
        if (re.exec(ua) != null)
            rv = parseFloat(RegExp.$1);
    }
    return rv;
}

SMART.Utilities.findWidth = function(stringLabel, n) {
    // Fix for IE versions < 8.  Adds dynamic, hidden span to DOM so the correct width can be extracted.
    var IEVersion = getInternetExplorerVersion();
    if (IEVersion > 0 && IEVersion < 8 && stringLabel) {

        var newspan = $j('<span style="font-family:arial;font-size:12px;display:none;">' + stringLabel + '</span>');
        $j('body').append(newspan);

        //Span width + button style padding, margin, width             
        return newspan.width() + n;
    }
    return "auto";
}

SMART.Utilities.findWidthBlueButton = function(stringContainer, n) {
    // Fix for IE versions < 8.  Finds the width of a container if less than IE 8 otherwise returns auto.
    var IEVersion = getInternetExplorerVersion();
    if (IEVersion > 0 && IEVersion < 8 && stringContainer) {        

        //Span width + button style padding, margin, width
        return $j('#' + stringContainer).width() + n;
    }
    return "auto";
} 

/*********************** SOURCE JAVASCRIPT **********************/

var AllDropDowns = [];

"SMART.Utilities.SOURCE".namespace(".");

//<author>Curtis Fraser</author>
SMART.Utilities.SOURCE.DropDowns = function () {

    //Flip the arrow depending on which class is there already
    var ChangeArrow = function (button, activeClass) {
        $j(button).prev().toggleClass(activeClass);
    };

    var IsOpen = function (context) {
        return context.is(':visible');
    };

    var Open = function (context, activeClass) {
        context.slideDown('fast');
        ChangeArrow(context, activeClass);
    };

    var Close = function (context, activeClass) {
        context.slideUp('fast');
        ChangeArrow(context, activeClass);
    };

    var privateActiveClass;
    var mainSelector;
    var pub;

    pub = {
        init: function (button, activeClass, aTag) {

            mainSelector = $j(button);
            privateActiveClass = activeClass;

            //remove href attribue
            mainSelector.find(aTag).attr('href', 'javascript:void(0);');

            //close drop down on body click
            $j(document.body).click(function () {
                mainSelector.each(function () {
                    if (IsOpen($j(this).next()))
                        Close($j(this).next(), activeClass);
                });
            });

            //determine whether to close or open drop down            
            mainSelector.click(function () {
                var next = $j(this).next();
                if (!IsOpen(next))
                    Open(next, activeClass);
                else
                    Close(next, activeClass);
                return false;
            });

            AllDropDowns.push(this);
        },

        //This is so that when you click on the main nav, it can close the drop down
        CloseDropDown: function () {
            if (IsOpen($j(mainSelector).next())) //Make sure it's open though..
                Close($j(mainSelector).next(), privateActiveClass);
        }

    };

    return pub;
};

