$$('body').addClass('loading');

/* check css media type */
function is_media(media) {
    if (Browser.Engine.trident) return true; // stupid ie
    id = 'n';
    do { id = id + Math.floor(Math.random() * 10); } while ( $(id) );
    var index = Math.floor(Math.random() * 9000) + 1000;
    var text  = '@media ' + media + ' { #' + id + ' { z-index: ' + index + ' !important; } }'
    var style = new Element('style', {'text': text});
    var div   = new Element('div', { 'id': id });
    $$('head').adopt(style);
    $$('body').adopt(div);
    var result = div.getStyle('z-index') == index;
    style.dispose();
    div.dispose();
    return result;
}

function removeTag(id) {
    el = $(id);
    if (el) { el.dispose() }
}

var base64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split("");

function base64(s) {
   var r = ""; var p = ""; var c = s.length % 3;
   if (c > 0) { for (; c < 3; c++) { p += '='; s += "\0"; } }
   for (c = 0; c < s.length; c += 3) {
     var n = (s.charCodeAt(c) << 16) + (s.charCodeAt(c+1) << 8) + s.charCodeAt(c+2);
     n = [(n >>> 18) & 63, (n >>> 12) & 63, (n >>> 6) & 63, n & 63];
     r += base64chars[n[0]] + base64chars[n[1]] + base64chars[n[2]] + base64chars[n[3]];
   }
   return r.substring(0, r.length - p.length) + p;
}

window.addEvent('domready', function() {

    if (typeof sections == 'object') {
        sections = $H(sections)
        sections.each(function(value, key) { sections.set(key, $H(value)); });
    }

    if (typeof sectors == 'object') {
        sectors = $H(sectors);
        sectors.each(function(value, key) { sectors.set(key, $H(value)); });
    }

    // large screen devices only...

    if (!is_media('projection') && !is_media('screen')) return;

    // setup navigation

    if ($$('#navigation-main').length) {
        var items = $('navigation-main').getChildren();
        var active = $$('#navigation-main .active ul')[0];

        function clear(reset) {
            $$('#navigation-main ul').each(function(menu, i) {
                menu.setStyle('display', 'none');
            });
            if (reset && active) {
                active.setStyle('display', 'block');
            }
        }

        items.each(function(item, i) {
            var tab  = item.getChildren()[0];
            var menu = item.getChildren()[1];

            tab.addEvent('mouseenter', function(event) {
                clear();
                if (menu) menu.setStyle('display', 'block');
            });
        });

        $$('#navigation-main').addEvent('mouseleave', function(event) {
            clear(true);
        });

        clear(true);
    }

    // setup search

    if ($$('#extras-search').length) {
        $('extras-search').addEvent('submit', function(event){
            event.stop();

            var keyword = $('extras-search-search').get('value');

            keyword = keyword.replace('&', '_26_').replace('/', '_FL_');

            keyword = encodeURIComponent(keyword);

            window.location = '/archive/keyword/' + keyword
        });
    }

    if ($$('#content-search-form').length) {

        var toggle = new Element('a', {
            'text': ($$('#content-search-form .advanced').getStyle('display') == 'none' ? 'Show' : 'Hide') + ' Advanced Search',
            'href': '#',
            'events': {
                'click': function(event) {
                    var div = $$('#content-search-form .advanced');
                    div.setStyle('display', (div.getStyle('display') == 'none' ? '' : 'none'));

                    this.set('text', (div.getStyle('display') == 'none' ? 'Show' : 'Hide') + ' Advanced Search');

                    event.stop();
                }
            }
        });

        $$('#content-search-form .basic li').adopt(toggle);

        var autocomplete = null;

        $('content-search').adopt(new Element('div', {
            'id': 'content-search-form-autocomplete',
            'events': {
                'click': function(event) {
                    var event = Event(event);
                    autocomplete.set('value', event.target.get('text'));
                }
            }
        }));

        $$('body').addEvent('click', function(event) {
            $('content-search-form-autocomplete').setStyle('display', 'none');
        });

        var request = new Request.HTML({
            url: '/internal/search/',
            update: 'content-search-form-autocomplete'
        });

        var do_autocomplete = function(element, value) {
            autocomplete = element;

            var el = $('content-search-form-autocomplete');

            el.empty();

            if (value.length <= 3) {
                el.setStyle('display', 'none');
                return;
            }

            request.send({ data: {
                keyword: element.get('value'),
                type: 'companies'
            }});

            var root = $('root').getCoordinates();

            var pos = element.getCoordinates();

            el.setStyles({
                'display': 'block',
                'top': pos.top + pos.height - root.top + 2,
                'left': pos.left - root.left,
                'width': pos.width - 2
            });
        }

        var sector = new Observer('content-search-form-sector', function(element, value) {
            var channel = $('content-search-form-channel');
            if (channel) {
                channel.dispose();
            }
            if (sectors.has(value) && sectors.get(value).getLength() > 1) {
                channel = new Element('select', {'id': 'content-search-form-channel'})
                sectors.get(value).each(function (value, title) {
                    channel.adopt(new Element('option', {'value': value, 'text': title}));
                })
                channel.injectAfter($('content-search-form-sector'));
            }
        });

        var observer;

        var section = new Observer('content-search-form-section', function(element, value) {
            var context = $('content-search-form-context');
            if (context) {
                context.dispose();
            }
            if (!value) return;

            if (sections.has(value)) {
                context = new Element('select', {'id': 'content-search-form-context'})
                sections.get(value).each(function (value, title) {
                    context.adopt(new Element('option', {'value': value, 'text': title}));
                });
            }
            else {
                context = new Element('input', {'id': 'content-search-form-context', 'type': 'text'});
            }

            context.injectAfter($('content-search-form-section'));

            observer = new Observer('content-search-form-context', function(element, value) {
                $('content-search-form-add-tag').set('disabled', !(value.trim()));

                if (element.nodeName.toLowerCase() == 'input') do_autocomplete(element, value);
            });

            $('content-search-form-add-tag').set('disabled', true);
        });

        $('content-search-form-add-tag').set('disabled', true);

        $('content-search-form-add-tag').addEvent('click', function(event) {

            var context = $('content-search-form-context');

            var title = value = context.get('value');

            if (context.nodeName.toLowerCase() == 'select') {
                context.getChildren().each(function (node) {
                    if (node.get('value') == value) {
                        title = node.get('text');
                    }
                })
            }
            else {
                value = value.toLowerCase().replace(/[^a-z0-9-]+/g, '-');
            }

            if ($('content-search-form-tag-' + value)) return;

            var el = new Element('li', {'id': 'content-search-form-tag-' + value});

            el.adopt(new Element('span', {'text': title}));

            el.adopt(new Element('a', {
                'text': ' [ remove ]',
                'href': '#',
                'events': {
                    'click': function (event) {
                        var event = new Event(event);
                        removeTag('content-search-form-tag-' + value);
                        event.stop();
                    }
                }
            }));

            $('content-search-form-tags').adopt(el)
        });

        $('content-search-form-date-last-range').addEvent('focus', function (event) {
            $('content-search-form-date-range').set('checked', false)
            $('content-search-form-date-last').set('checked', true)
        });

        $('content-search-form-date-range').getParent().getElements('select').addEvent('focus', function () {
            $('content-search-form-date-range').set('checked', true)
            $('content-search-form-date-last').set('checked', false)

        });

        $$('#content-search-form').addEvent('submit', function (event) {

            var event = new Event(event);

            event.stop();

            // nasty code ahoy! should really recode legacy search code to use forms properly...

            var keyword = $('content-search-form-keywords').get('value');

            keyword = keyword.replace('&', '_26_').replace('/', '_FL_');

            keyword = encodeURIComponent(keyword);

            if ($$('#content-search-form .advanced').getStyle('display') == 'none') {
                window.location = '/archive/keyword/' + keyword
                return
            }

            var $code = String.fromCharCode;

            var hash = '';

            // type bits (we only want articles)
            hash += $code(2);

            var cat;

            $$('#content-search-form-sector, #content-search-form-channel').each(function(el) {
                if (el.get('value')) {
                    cat = el.get('value');
                }
            });

            cat = (cat || 5000) - 5000;

            hash += $code(cat)


            if ($('content-search-form-date-last').get('checked')) {
                hash += $code($('content-search-form-date-last-range').get('value'));
            }
            else {
                hash += $code(0);

                hash += $code($('content-search-form-date-range-from-day').get('value'));
                hash += $code($('content-search-form-date-range-from-month').get('value'));
                hash += $code($('content-search-form-date-range-from-year').get('value') - 1980);

                if ($('content-search-form-date-range-to-day').get('value')) {
                    hash += $code($('content-search-form-date-range-to-day').get('value'));
                    hash += $code($('content-search-form-date-range-to-month').get('value'));
                    hash += $code($('content-search-form-date-range-to-year').get('value') - 1980);
                }
                else {
                    hash += $code(0) +  $code(0) +  $code(0);
                }
            }

            var tags = $$('#content-search-form-tags li');
            if (tags.length) {
                hash += $code(tags.length);
                tags.each(function (tag) {
                    var id = tag.get('id').replace(/^content-search-form-tag-/, '');
                    if (!id.test(/^\d+$/)) { id = 0 }

                    hash += $code(id >> 8);
                    hash += $code(id % 255);

                    if (id == 0) {
                        var str = encodeURIComponent(tag.getElement('span').get('text'));
                        hash += $code(str.length);
                        hash += str;
                    }
                });
            }

            if (keyword) keyword += '/'

            window.location = '/archive/' + base64(hash) + '/' + keyword
        });

    }

    // setup featured articles

    if ($$('#content-main-featured').length) {
        var features;

        features = new Panels("#content-main-featured .feature", {
            velocity: 5000,
            offsetX: 60
        });

        $$("#content-main-featured").setStyle('height', 192);

        features.startRotation(true);
    }

    // setup tabbed component holder

    if ( $$('#content-secondary-tabs').length) {
        var pages = $$('#content-secondary-tabs .component'), count = pages.length;

        if (count > 1) {
            var container = $('content-secondary-tabs');

            container.addClass('content-secondary-tabs');

            container.setStyle('overflow', 'hidden');

            var tabs  = $$('#content-secondary-tabs .component h2');
            var w = (container.getCoordinates().width - (count - 1) * 4) / count;

            function reset() {
                styles = {
                    'height': '2.2em',
                    'line-height': '2.2em',
                    'cursor': 'pointer'
                }

                pages.each(function(page, index) {
                    page.setStyle('display', 'none');
                });

                tabs.each(function(page, index) {
                    page.setStyles(styles);
                });
            }

            pages.each(function(page, index) {
                var children = page.getChildren();
                var tab = tabs[index];
                container.adopt(tab);

                tab.setStyles({
                    'width': w,
                    'height': '2.2em',
                    'position': 'absolute',
                    'top': 0,
                    'left': index * (w + 4)
                });

                tab.addClass('tab');
                tab.addClass(page.id + '-tab');

                var styles = { 'height': '2.5em', 'line-height': '2.5em' };

                tab.addEvent('click', function (event) {
                    reset();
                    this.setStyles(styles);
                    page.setStyle('display', 'block');
                });
            });

            tabs[0].fireEvent('click');
        }
    }

    if ($$('body.article .options').length) {
        $$('body.article .options .print .icon').appendText('Print');
        $$('body.article .options .share .icon').appendText('Share');
        $$('body.article .options .comment .icon').appendText('Comment');
        $$('body.article .options .email .icon').appendText('Email');

    }

    var temp = window.location.search.split('?')[1];

    if (temp && temp.split('&').contains('printpreview')) {
        window.print();
        window.close();
    }

    $$('body.article .options .print a').addEvent('click', function (event) {
        var event = Event(event);var event = Event(event);
        window.open(window.location.href + (window.location.search ? '&' : '?') + 'printpreview');
        event.stop();
    });

    // setup share dropdown

    if ($$('body.article .options .share').length) {

        var share = $$('body.article .options .share .text')[0];
        var icon  = $$('body.article .options .share .icon')[0];
        var links = $$('body.article .options .share .links')[0];

        var sharetimer;

        links.setStyles({
            'position': 'absolute',
            'display': 'none',
            'border-width':  1,
            'border-style': 'solid'
        });

        $$('body').addEvent('click', function() {
            links.setStyles({
                'display': 'none'
            });

            $clear(sharetimer);
        });

        function hide_share() {
            $clear(sharetimer);
            sharetimer = (function() {
                links.setStyles({
                    'display': 'none'
                });
            }).delay(5000);
        }

        links.addEvent('mouseover', function (event) {
            var event = new Event(event);

            sharetimer = $clear(sharetimer);

            event.stop();
        });


        links.addEvent('mouseout', function (event) {
            var event = new Event(event);

            hide_share();

            event.stop();
        });

        share.addEvent('click', function (event) {
            var event = new Event(event);

            var owner = share.getParent().getCoordinates();
            var content = $('content-main').getCoordinates();

            links.setStyles({
                'display': 'block',
                'bottom': owner.bottom - content.bottom + owner.height,
                'right': 'auto',
                'left': owner.left - content.left + 22,
                'top': 'auto'
            });

            hide_share();

            event.stop();
        });

        icon.addEvent('click', function (event) {
            var event = new Event(event);

            links.setStyles({
                'display': 'block',
                'top': 18,
                'right': 12,
                'left': 'auto',
                'bottom': 'auto'
            });

            hide_share();

            event.stop();
        });
    }

    if ($$('#content-main-register-form #email_topstories').length) {
        $$('#content-main-register-form #email_topstories').addEvent('click', function (event) {
            event.stop();
        });
    }

    // setup search knob

    if ($$('#content-results .header').length) {

        var header = $$('#content-results .header');

        var lbl = new Element('div', {
            'class': 'label'
        });

        lbl.appendText('Result Details:');

        var slider = new Element('div', {
            'class': 'slider'
        });

        var knob = new Element('div', {
            'class': 'knob'
        });

        header.adopt(lbl);

        slider.adopt(knob);

        header.adopt(slider);

        if (typeof Cookie.get('search_knob') !== 'string') {
            Cookie.set('search_knob', 20, {duration: 2});
        }

        var search_slider = new Slider(slider, knob, {
            steps: 40,
            offset: 6,
            onChange: function(step){
                if (step <= 10) {
                    search_slider.set(0);
                    $$('#content-results ol p').setStyle('display', 'none');
                    Cookie.set('search_knob', step, {duration: 2});
                }
                else if (step <= 30) {
                    search_slider.set(20);
                    $$('#content-results ol p[class!="metadata"]').setStyle('display', 'none');
                    $$('#content-results ol p.metadata').setStyle('display', 'block');
                    Cookie.set('search_knob', step, {duration: 2});
                }
                else{
                    search_slider.set(40);
                    $$('#content-results ol p').setStyle('display', 'block');
                    Cookie.set('search_knob', step, {duration: 2});
                }
            },
            onTick: function(position){
                step = search_slider.toStep(position);
                if (step <= 10) step = 0;
                else if (step <= 30) step = 20;
                else step = 40;

                search_slider.knob.setStyle('left', search_slider.toPosition(step));
            }
        });
        search_slider.set(Cookie.get('search_knob'));
    }

    // setup fancy image links

    $$('a').each(function (item, index) {
        if (item.href) {
            var href = item.href, ext = href.substr(href.lastIndexOf('.') + 1, href.length);

            if (["jpg", "jpeg", "gif", "png"].contains(ext)) {
                item.addEvent('click', function (event) {
                    var event = new Event(event);

                    var bg, container, img;

                    bg = new Element('div');
                    bg.addClass('imagebg');
                    bg.setStyle('opacity', 0.5);

                    container = new Element('div');
                    container.addClass('imagecontainer');

                    $$('body').adopt(bg);
                    $$('body').adopt(container);


                    closebutton = new Element('img', {
                        'styles': {
                            'position': 'absolute',
                            'bottom': '-9px',
                            'right': '-9px'
                        },
                        'src': '/media/images/design/graphic-close.gif'
                    });
                    container.adopt(closebutton);

                    img = new Element('img', {
                        'src': href,
                        'events': {
                            'load': function (event) {
                                container.setStyle('width', img.width);
                                container.setStyle('height', img.height);
                                container.setStyle('margin-left', -(img.width / 2) - container.getStyle('padding-left').toInt());
                                container.setStyle('margin-top', -(img.height / 2) - container.getStyle('padding-top').toInt());
                            }
                        }
                    });

                    container.setStyle('width', img.width);
                    container.setStyle('height', img.height);
                    container.setStyle('margin-left', -img.width / 2);
                    container.setStyle('margin-top', -img.height / 2);
                    container.adopt(img);

                    hideCallback = function (event) {
                        var event = new Event(event);

                        img.remove();
                        bg.remove();
                        container.remove();

                        event.stop();
                    }

                    bg.addEvent('click', hideCallback);
                    container.addEvent('click', hideCallback);

                    event.stop();
                });
            }



            if (item.getAttribute('rel') && item.getAttribute('rel').test(/\bexternal\b/)) {
                item.addEvent('click', function (event) {
                    var event = Event(event);
                    window.open(href);
                    event.stop();
                });
            }
        }

        $$('body').removeClass('loading');
    });
});

window.addEvent('load', function() {
    if ($$('.advertisement').length) {
        $$('.advertisement').each(function (item) {
            if (item.getElement('img') && item.getElement('img').getCoordinates().width < 10) {
                if (! item.getElement('embed') && ! item.getElement('object')) {
                    item.setStyle('display', 'none');
                }
            }
        });
    }
});
