var Tru = {};
if (window.location.href.indexOf('.local') > 0) {
    Tru.adminDomain = 'http://truadmin.local';
}
else {
    Tru.adminDomain = 'http://www.hbotrubevadmin.com';
}
Tru.Blocks = {
    Locations: {
        url:Tru.adminDomain+'/locations.json',
        hasData:false,
        rendering:false,
        rendered:false,
        json:null,
        containerId:'#content div.col.locations',
        fragmentId:'location-fragment',
        renderHtml:function() {
            this.rendering = true;

            var container = Tru.Page.getContainer(this.containerId);
            var fragment = Tru.Page.getFragment(this.fragmentId);
            
            var linkContainer = $('#continents');
            var continentLinks = [];
            
            var currentCategory = '';
            var currentGroup = '';
            
            var continents = [];
            var continentGroups = {};
            var groupLocations = {};
            
            var categoryDiv, groupDiv;
            
            $.each(this.json, function() {
                var location = this.Location;
                var item = fragment.clone();
                
                if (location.location_category_id !== currentCategory) {
                    categoryDiv = $(document.createElement('div'));
                    categoryDiv.attr('id', 'continent-' + location.location_category_id);
                    categoryDiv.addClass('continent');
                    currentCategory = location.location_category_id;
                    var catTitle = $(document.createElement('h2'));
                    catTitle.html(location.continent_name);
                    categoryDiv.append(catTitle);
                    continents.push({id:location.location_category_id, el:categoryDiv});
                    var catLink = $(document.createElement('a'));
                    catLink.attr('href', '#'+'continent-' + location.location_category_id);
                    catLink.html(location.continent_name);
                    catLink.mouseover(function() {
                        var link = $(this);
                        linkContainer.find('a').removeClass('selected');
                        link.addClass('selected');
                        container.find('.continent').removeClass('selected');
                        container.find(link.attr('href')).addClass('selected');
                        return false;
                    });
                    linkContainer.append(catLink);
                    linkContainer.append('<br />');
                }

                if (location.group_name !== currentGroup) {
                    groupDiv = $(document.createElement('div'));
                    groupDiv.addClass('group');
                    var groupTitle = $(document.createElement('strong'));
                    groupTitle.html(location.group_name);
                    groupDiv.append(groupTitle);
                    currentGroup = location.group_name;
                    
                    if (typeof continentGroups[currentCategory] === 'undefined') {
                        continentGroups[currentCategory] = [];
                    }
                    continentGroups[currentCategory].push({id:currentGroup, el:groupDiv});
                }
                
                item.find('address span').html(location.title);
                item.find('address').append(location.location.replace('\n', '<br />'));
                item.find('a').attr('href', 'http://maps.google.com/maps?q=' + escape(location.location));
                
                if (typeof groupLocations[currentGroup] === 'undefined') {
                    groupLocations[currentGroup] = [];
                }
                
                groupLocations[currentGroup].push(item);
            });
            $.each(continents, function() {
                var continent = this;
                if (typeof continentGroups[continent.id] !== 'undefined') {
                    $.each(continentGroups[continent.id], function() {
                        var group = this;
                        if (typeof groupLocations[group.id] !== 'undefined') {
                            $.each(groupLocations[group.id], function() {
                                var location = this;
                                group.el.append(location);
                            });
                        }
                        
                        continent.el.append(group.el);
                    });
                }
                container.append(continent.el);
            });
            
            var activeLink = linkContainer.find('a:first-child').addClass('selected');
            container.find(activeLink.attr('href')).addClass('selected');
            
            container.removeClass('loading');
            
            this.rendering = false;
            this.rendered = true;
        }
    },
    Posters: {
        url:Tru.adminDomain+'/images.json',
        hasData:false,
        rendering:false,
        rendered:false,
        json:null,
        containerId:'posters',
        fragmentId:'image-fragment',
        renderHtml:function() {
            this.rendering = true;

            var container = Tru.Page.getContainer(this.containerId);
            var fragment = Tru.Page.getFragment(this.fragmentId);
            
            container.addClass('loading');
            
            $.each(this.json, function() {
                var image = this.Image;
                var item = fragment.clone();
                item.find('a').attr('href', image.pdf_path);
                item.find('img').attr('src', image.path);
                
                container.append(item);
            });
            
            container.removeClass('loading');
            
            this.rendering = false;
            this.rendered = true;
        }
    },
    Media: {
        url:Tru.adminDomain+'/media.json',
        hasData:false,
        rendering:false,
        rendered:false,
        json:null,
        containerId:'#content div.col.videos',
        fragmentId:'media-fragment',
        renderHtml:function() {
            this.rendering = true;

            var container = Tru.Page.getContainer(this.containerId);
            var fragment = Tru.Page.getFragment(this.fragmentId);
            
            container.addClass('loading');
            
            var embedOptions = {
                wmode: 'transparent',
                allowFullScreen:'true'
            };
            
            $.each(this.json, function() {
                var media = this.Media;
                var item = fragment.clone();
            
                item.attr('id', 'video'+media.id);
                container.append(item);
                swfobject.embedSWF(media.embed, 'video'+media.id, '241', '135', '9.0.0',false,false,embedOptions);
            });
            
            container.removeClass('loading');
            
            this.rendering = false;
            this.rendered = true;
        }
    },
    Events: {
        url:Tru.adminDomain+'/events.json',
        hasData:false,
        rendering:false,
        rendered:false,
        json:null,
        containerId:'#content div.col.events',
        fragmentId:'event-fragment',
        renderHtml:function() {
            this.rendering = true;

            var container = Tru.Page.getContainer(this.containerId);
            var fragment = Tru.Page.getFragment(this.fragmentId);
            
            container.addClass('loading');
            
            $.each(this.json, function() {
                var ev = this.Event;

                var item = fragment.clone();

                item.find('h3').html(ev.title);
                item.find('span.location').html(ev.location.replace('\n', '<br />'));
                var dt = Date.parse(ev.event_at);
                item.find('span.date').html(dt.toString('htt - MMMM, dS yyyy'));

                container.append(item);
            });
            
            container.removeClass('loading');
            
            this.rendering = false;
            this.rendered = true;
        }
    },
    News: { 
        url:Tru.adminDomain+'/news.json', // this needs to have a way to be changed so we can get a specific page.
        hasData:false,
        rendering:false,
        rendered:false,
        json:null,
        containerId:'#content div.col.posts',
        fragmentId:'post-fragment',
        currentPage:1,
        itemsPerPage:null,
        totalPages:null,
        getPage:function(increment) {
            var that = this;
            var newPage = this.currentPage + increment;
            
            if (newPage <= 1) {
                newPage = 1;
            }
            else if (this.totalPages && newPage >= this.totalPages) {
                newPage = this.totalPages;
            }
            if (newPage != this.currentPage) {
                this.currentPage = newPage;
                $.getJSON(that.url+'&page='+this.currentPage + '&callback=?'+Tru.Page.previewVar(), function(data) {
                    that.json = data;
                    that.renderHtml(true);
                });
            }
        },
        renderHtml:function(clear) {
            clear = (typeof clear !== 'undefined') ? clear : false;
            
            this.rendering = true;

            var container = Tru.Page.getContainer(this.containerId);
            var fragment = Tru.Page.getFragment(this.fragmentId);
            
            container.addClass('loading');
            var pageLinks = $('#page-links');
            
            if (clear) {
                container.find('.post').remove();
            }
            
            $.each(this.json.news, function() {
                var post = this.News;
                var item = fragment.clone();
                item.find('h2').html(post.title);
                var dt = Date.parse(post.posted_at);
                item.find('span.postInfo span.date').html(dt.toString('MMMM dS'));
                
                var p = item.find('p');
                
                var postBody = post.body;
                var postSummary = post.summary;
                
                p.find('span.body').html(postBody.replace('\n', '<br /><br />'));
                
                if (post.summary === null || post.summary === '') {
                    p.addClass('full');
                    p.find('span.summary').remove();
                    item.find('a.more').remove();
                }
                else if ((post.summary !== null && post.summary !== '') && (post.body === null || post.body === '')) {
                    p.find('span.body').html(postSummary.replace('\n', '<br /><br />'));
                    p.addClass('full');
                    p.find('span.summary').remove();
                    item.find('a.more').remove();
                }
                else {
                    p.find('span.summary').html(postSummary.replace('\n', '<br /><br />'));
                    item.find('a.more').click(function() {
                        var link = $(this);
                        var p = link.prev('p');
                        
                        if (p.hasClass('full')) {
                            p.removeClass('full');
                        }
                        else {
                            p.addClass('full');
                        }
                        
                        if (typeof trackPageView === 'function') {
                            // function to track that the read more was clicked in omniture.
                            var newsTitle = link.parent().find('h2').text();
                            trackPageView('News: ' + newsTitle);
                        }

                        // I'm just not going to care if you really want to hide that content again.
                        link.remove();
                        
                        return false;
                    });
                }
                
                item.insertBefore(pageLinks);
            });
            
            if (this.json && this.json.news && !this.itemsPerPage) {
                this.itemsPerPage = this.json.news.length;
            }
            if (this.json && this.json.count && !this.totalPages) {
                this.totalPages = Math.ceil(this.json.count / ((this.itemsPerPage === 0) ? 1 : this.itemsPerPage));
            }
            
            if (this.totalPages > 1) {
                pageLinks.addClass('active');
                
                if (this.currentPage == 1) {
                    pageLinks.find('#prev-page').addClass('disabled');
                }
                else {
                    pageLinks.find('#prev-page').removeClass('disabled');
                }
                
                if (this.totalPages && this.currentPage === this.totalPages) {
                    pageLinks.find('#next-page').addClass('disabled');
                }
                else {
                    pageLinks.find('#next-page').removeClass('disabled');
                }
            }
            
            container.removeClass('loading');
            
            this.rendering = false;
            this.rendered = true;
        }
    },
    Products : {
        url:Tru.adminDomain+'/store.json',
        hasData:false,
        rendering:false,
        rendered:false,
        json:null,
        containerId:'content',
        fragmentId:'product-fragment',
        itemsPerPage:8,
        itemsPerRow:4,
        getData:function(url) {
            var b = this;
            $.jsonp({
                url:url,
                success:function(data) {
                    b.json = data;
                    b.hasData = true;
                    if (Tru.Page.domLoaded) {
                        b.renderHtml();
                    }
                },
                error:function(data) {
                    if (typeof b.renderOnError !== 'undefined') {
                        b.renderOnError();
                    }
                }
            });
        },
        renderHtml:function() {
            this.rendering = true;
            
            var container = Tru.Page.getContainer(this.containerId);
            var fragment = Tru.Page.getFragment(this.fragmentId);
            
            container.addClass('loading');
            
            var items = [];
            
            var itemsPerPage = this.itemsPerPage;
            if (this.hasData && this.json) {
                $.each(this.json, function() {
                    var product = this;
                    var item = fragment.clone();
                    item.attr('id', 'product-'+product.id);
                    item.find('img').attr('src', unescape(product.image));
                    item.find('h2').html(product.name);
                    item.find('span').html(product.price);
                    item.find('a.productImage').attr('href', product.url);
                    item.find('a.addToCart').attr('href', product.url);
                    item.find('a').attr('target', '_blank');

                    items.push(item);

                    if (items.length >= itemsPerPage) {
                        return false;
                    }
                });

                var rowCount = Math.ceil(items.length / this.itemsPerRow);
                for (var i=0;i<rowCount;i++) {
                    var start = i * this.itemsPerRow;
                    var end = (start + this.itemsPerRow);
                    var rowItems = $.grep(items, function(item, index) {
                        return (index >= start && index < end ) ;
                    });

                    var newRow = $(document.createElement('div'));
                    newRow.addClass('row');
                    $.each(rowItems, function() {
                        newRow.append($(this));
                    });

                    container.append(newRow);
                }
            }
            else {
                container.addClass('alternate');
            }
            
            container.removeClass('loading');
            
            this.rendering = false;
            this.rendered = true;
        },
        renderOnError:function() {
            Tru.Page.getContainer(this.containerId).addClass('alternate');
        }
    }
};
Tru.Page = {
    init:function() {
        var openWindow = function(url) {
            window.open(url, 'popup', 'height=500,width=520,scrollbars=yes');
        };
        
        $('#footer ul li a').click(function() {
            var link = $(this);
            openWindow(link.attr('href'));
            return false;
        });
    },
    blocks:[],
    domLoaded:false,
    registerBlock:function(block) {
        this.blocks.push(block);
    },
    previewVar:function() {
        var state = $.query.get('state');
        if (state) {
            return '&state=' + state;
        }
        else {
            return '';
        }
    },
    getData:function() {
        $.each(this.blocks, function(i) {
            var b = this;
            var callback = ((b.url.indexOf('?') > 0) ? '&' : '?') + 'callback=?';
            if (typeof b.getData === 'function') {
                b.getData(b.url+callback+Tru.Page.previewVar());
            }
            else {
                $.getJSON(b.url+callback+Tru.Page.previewVar(), function(data) {
                    b.json = data;
                    b.hasData = true;
                    if (Tru.Page.domLoaded) {
                        b.renderHtml();
                    }
                });
            }
        });
    },
    hasData:function() {
        var done = true;
        $.each(this.blocks, function() {
            var b = this;
            if (!b.hasData) {
                done = false;
            }
        });
        return done;
    },
    generateHtml:function() {
        if (Tru.Page.domLoaded) {
            $.each(this.blocks, function() {
                var b = this;
                if (b.hasData && (!b.rendering || !b.rendered)) {
                    b.renderHtml();
                }
            });
        }
    },
    getContainer:function(id) {
        return $('#'+id);
    },
    getFragment:function(id) {
        return $('#'+id).clone().removeAttr('id').removeClass('block-fragment');
    }
};
