/**
 *  @package        rsd
 *  @copyright      Copyright (c) 2007 Christopher Sanford
 *  @license        http://www.opensource.org/licenses/mit-license.php
 */
// rsd namespaces
var rsd = {};
rsd.controller = null;
rsd.action = null;
rsd.request = false;
rsd.curves = {};
rsd.offsets = {};
rsd.togglers = {};
rsd.stretchers = {};
rsd.sections = {};
rsd.preloads = [];

// stubs
rsd.onLoad = function() { return true; };
rsd.loadSlides = function() { return true; };

rsd.loadImages = function() {
    $$('#' + rsd.controller + ' img').each(function(o, i)
    {
        rsd.preloadImage(o);
    });
};

rsd.preloadImage = function(o)
{
    if (o instanceof Array)
    {
        o.each(function(s)
        {
            rsd.preloadImage(s);
        });
    }
        
    else if (typeof o == 'string')
    {
        var img = new Image();
        img.src = o;
        rsd.preloads.push(o);
    }

    else if (typeof o == 'object')
    {
        if (o.complete || rsd.preloads.indexOf(o.src) != -1) return;
        
        var parent, preload  = null;

        o = $(o);
        rsd.preloadImage(o.src);

        parent = o.parentNode;
        o.preload = preload = $(document.createElement('img'));
        preload.src = '/images/global/misc/status/blank.gif';
        preload.addClass('preload ' + o.className);
        preload.setStyle('width', o.getStyle('width'));
        preload.setStyle('height', o.getStyle('height'));
        parent.insertBefore(preload, o);

        try
        {
            o.setStyle('display', 'none');
            o.addEvent('load', function()
            {
                this.setStyle('display', '');
                this.preload.setStyle('display', 'none');
            });
        }
        catch (e)
        {
            return;
        }
    }
};

// ajax callback
rsd.onComplete = function(id)
{
    // track callbacks
    if (rsd.controller && rsd.action)
        urchinTracker(rsd.controller + '/' + rsd.action);

    rsd.request = false;
    rsd.loadSlides();
    rsd.loadImages();
};

// dynamic curve callback
rsd.addCurve = function(o, c)
{
    var s = document.createElement('span');
    s.appendChild(document.createTextNode('\u00a0'));
    s.className = c;
    o.appendChild(s);
    return true;
};

// style switcher callback
rsd.styleSwitcher = function()
{
    document.body.id = (document.body.id.match(/dark/i)) ? 'light' : 'dark';
    Cookie.set('style', document.body.id, {duration: 365});
    return false;
};

// this is where the magic happens
rsd.onLoad = function()
{
    rsd.onComplete();

    // applying switcher event
    $('switcher').onclick = function()
    {
        return rsd.styleSwitcher(this);
    };

    // main navigation togglers
    rsd.togglers = $$('a.toggler');

    // curve classes
    rsd.curves = {
        top: ['tlc', 'trc'],
        bottom: ['blc', 'brc'],
        reflection: ['tlc', 'trc']
    };

    // add top curves
    while (rsd.curves.top.length)
    {
        rsd.addCurve(rsd.togglers[0].parentNode, rsd.curves.top.shift());
    }

    // add bottom curves
    while (rsd.curves.bottom.length)
    {
        rsd.addCurve(rsd.togglers[rsd.togglers.length-1].parentNode, rsd.curves.bottom.shift());
    }

    // add reflection curves
    while (rsd.curves.reflection.length)
    {
        rsd.addCurve($('reflection'), rsd.curves.reflection.shift());
    }

    // copyright toggler does nothing
    rsd.togglers.pop().onclick = function() { return false; };

    rsd.togglers.each(function(o, i)
    {
        o.link = o.href;
        o.href = '#';
        o.onclick = function() {
            var section = rsd.sections[rsd.stretchers[i].id];
            if (!section.inner.innerHTML.length)
            {
                setTimeout(function()
                {
                    section.subnav[0].toggle();
                }, 500);
            }
            rsd.request = false
            return false;
        }
    });

    // accordian animation
    rsd.accordian = new Fx.Accordion(
        rsd.togglers,
        rsd.stretchers,
        {
            opacity: true,
            start: true,
            alwaysHide: true,
            fps: 90,
            duratrion: 1000,
            transition: Fx.Transitions.expoOut        }
    );

        rsd.togglers.each(function(o, i)
    {
        if (o.link.match(/contact/i)) {
            setTimeout(function()
            {
                rsd.accordian.showThisHideOpen(i);
            }, 200);
        }
    });
    
    // each definition (dd)
    rsd.stretchers.each(function(o, i)
    {
        var section = rsd.sections[o.id];

        section.subnav.each(function(o)
        {
            o.section = section;
            
            // disallow toggling of section already visible
            o.onclick = function()
            {
                if (this.hasClass('active'))
                {
                    try
                    {
                        var slides = rsd.sections[rsd.controller][rsd.action];

                        if (!this.toggle.next || !this.toggle.next.effect)
                        {
                            this.toggle.next = slides.next[0];
                            this.toggle.jumpnav = slides.jumpnav || null;
                        }

                        this.toggle.next.effect.start(0);

                        if (this.toggle.jumpnav) {
                            this.toggle.jumpnav.each(function(o) {
                                o.removeClass('hover');  
                            });
                        }

                        slides.active = null;

                    }
                    catch (e) {}

                    return false;
                }

                return this.toggle(true);

            };
            
            // toggle callback for section
            o.toggle = function(e)
            {
                if (rsd.request) return false;

                var subnav = o.section.subnav;
                var inner = o.section.inner;
                var outer = o.section.outer;

                // unselect / select appropriate section
                subnav.each(function(link)
                {
                    if (link === o) {
                        link.addClass('active')
                    } else {
                        link.removeClass('active');
                    }
                }.bind(o));

                rsd.request = true;

                // sigh...
                if (document.all) {

                    inner.setStyle('visibility', 'hidden');

                    // do not re-request
                    if (o.request) {
                        o.request.onComplete();
                        return false;
                    }

                    // ajax object
                    o.request = new Ajax(
                        o.href + 'ajax',
                        {
                            method: 'get',
                            update: inner.id,
                            evalScripts: true,
                            onComplete: function()
                            {
                                // restore position
                                inner.setStyle('marginLeft', (rsd.offsets[o.id] || 0) + 'px');
                                setTimeout(function()
                                {
                                    // update
                                    rsd.onComplete();
                                    inner.setStyle('visibility', 'visible');
                                }, 200);
                            }
                        }
                    ).request();

                    return false;
                }
                
                // start fading on section toggle
                new Fx.Style(
                    inner,
                    'opacity',
                    {
                        fps: 120,
                        duration: 300,
                        onComplete: function()
                        {
                            setTimeout(function()
                            {
                                // do not re-request
                                if (o.request) {
                                    o.request.onComplete();
                                    return false;
                                }
                                
                                // ajax object
                                o.request =  new Ajax(
                                    o.href + 'ajax',
                                    {
                                        method: 'get',
                                        update: inner.id,
                                        evalScripts: true,
                                        onComplete: function()
                                        {
                                            // restore position
                                            inner.setStyle('marginLeft', (rsd.offsets[o.id] || 0) + 'px');
                                            setTimeout(function()
                                            {
                                                rsd.onComplete();
                                                new Fx.Style(
                                                    inner.id,
                                                    'opacity',
                                                    {
                                                        fps: 120,
                                                        duration: 300                                                    }
                                                ).start(0,1);
                                            }, 100);
                                        }
                                    }
                                ).request();
                            }, 100);
                        }
                    }
                ).start(1,0);

                return false;
            };
        });
    });
};