var Jedi = {};

(function() {
             
Utils = {
    /** options - {promptText: "text", promptClass: "class name"}*/
    Prompt: function ($input, options) {
        defaults = {
            promptText: $input.attr('prompt_text'),
            promptClass: 'prompt'
        }
        options = $.extend({}, defaults, options)
        function onFocus (e) {
            if ($input.hasClass(options.promptClass)) {
                $input.removeClass(options.promptClass)
                $input.val('')
            }
        }
        function onBlur (e) {
            if ($.trim($input.val()) === '') {
                $input.addClass(options.promptClass).val(options.promptText)
            }
        }
        $input.focus(onFocus).blur(onBlur).closest('form').submit(onFocus) // clean prompt before form submit
        $(window).unload(onFocus); // remove prompt
        onBlur() // init
    }
    
    ,_imgLinkHover: function(parentClass) {
        $(parentClass + ' img').hover(
            function(e) {$(this).closest(parentClass).find('h2 a').addClass('hover')},
            function(e) {$(this).closest(parentClass).find('h2 a').removeClass('hover')}
        )            
    }
    ,imgLinkHover: function() { Utils._imgLinkHover('.story'); }
    ,pitchImgLinkHover: function() { Utils._imgLinkHover('.pitch_body'); }
    
    ,initLeftNavigation: function() {
        $('#left_navigation li').hover(
            function(e) { $(this).addClass('hover').prev(':not(.active)').addClass('hover_top_sibling') }, //hover_top_sibling
            function(e) { $(this).removeClass('hover').prev(':not(.active)').removeClass('hover_top_sibling') }
        )        
    }
    
    ,_initVoteButton: function() {
        $('button.vote').click(function() {
            var pitchId = $(this).attr('id').split('_')[1];
            var voteForm = $('#vote_form');
            voteForm.find('input[name="id"]').val( pitchId );
            voteForm.submit();
        })
    }

    ,initVoteButton: function() {
        $('button.vote').click(function() {
            var exprId = $(this).attr('id').substring(1);
            var voteForm = $('#vote_form');
            voteForm.find('input[name="id"]').val( exprId );
            voteForm.submit();
        })
    }

    ,initReply: function() {
        $('a.reply').click(function(e) {
            e.preventDefault()
            var eId = $(this).closest('.comment').attr('id').substring(1)
            var $form_comment = $('#form_comment')
	    var form_el = $form_comment.find('form');
	    var form_hash = $('<a />').attr({'href': form_el.attr('action')})[0].hash;

            $form_comment.find('#id_parent').val( eId )
            $(this).closest('.reply_links').after( $form_comment )
            $form_comment.show()
            $form_comment.find('#id_text').focus()
	    
	    if (form_hash) {
		form_el.attr('action',
			     form_el.attr('action').replace(form_hash, '#e' + eId));
	    }
        })
    }
    
    ,initFormComment: function() {
        var form_comment = $('#form_comment')
	var form_el = form_comment.find('form');
	var form_hash = $('<a />').attr({'href': form_el.attr('action')})[0].hash;

        form_comment.find('.cancel').click(function(e) {
            e.preventDefault()
            form_comment.find('#id_text').val('')
            form_comment.hide()
        })

	var parent_id = form_comment.find('#id_parent').val();
	if (parent_id != '') {
	    $('#e' + parent_id).append(form_comment);

	    if (form_hash) {
		form_el.attr('action',
			     form_el.attr('action').replace(form_hash, '#e' + parent_id));
	    }
	}
    }
        
    ,confine: function(val, min, max) {
        if (val < min) { return min }
        if (val > max) { return max }
        return val
    }
    
    ,initFavorite: function() {
        $('.btn_favourite').click(function(e) {
            e.preventDefault();
            var button = $(this)
            var truth_id = button.attr('id').substring(1);
            if (button.is('.active')) { // already favorite
                $.post('/p/favorite/remove/' + truth_id, function() {
                    button.removeClass('active')
                    button.attr('title', 'Add to Favorites')
                })                
            }
            else {
                $.post('/p/favorite/add/' + truth_id, function() {
                    button.addClass('active')
                    button.attr('title', 'Remove from Favorites')
                })
            }
        })
    }
    
    ,indexOf: function(a, o) {
        for(var i = 0; i < a.length; i++) {
            if (a[i] === o) {
                return i
            }
        }
        return -1
    }

};

Jedi.Base = (function() {
    return {
        init: function() {
            $(document).ready(function() {
                Utils.Prompt($('#search_form input[name="q"]'))
            })        
        }
    }    
}()); // Base    

Jedi.Truth = (function() {
return {
    init: function() {
        $(document).ready(function() {
            // Utils.Prompt($('#comment_form textarea[name="text"]'), {promptText: 'Sign in to leave a comment'})
            Utils.imgLinkHover()
        })
    }
}    
}()); // Truth

Jedi.Truths = (function() {
return {
    init: function() {
        $(document).ready(function() {
            Utils.imgLinkHover()
        })
    }
}
}()); // Truths

Jedi.About = (function() {
return {
    init: function() {
        $(document).ready( Utils.initLeftNavigation )
    }
}
}()); // About

Jedi.Profile = (function() {
return {
    init: function() {
        $(document).ready( Utils.initLeftNavigation )
    }
}
}()); // Profile

Jedi.NewsroomBase = (function() {
return {
    init: function() { Utils.pitchImgLinkHover(); }
}
}()); // NewsroomBase

Jedi.Voting = (function() {
return {
    init: function() { Utils.initVoteButton() }
}
}()); // Voting

Jedi.Pitch = (function() {
return {
    init: function() { Utils.initVoteButton() }
}
}()); // Pitch

Jedi.PitchNew = (function() {
return {
    init: function() { 
        $(document).ready(function() {
            $('input[name="type"]').click(function() {
                var cartoon_checked = $('input[name="type"][value="CARTOON"]').is(':checked')
                var label = cartoon_checked ? 'Sketch:' : 'Image (optional):'
                $('label[for="id_sketch"]').html( label )
            })
            $('#id_title').focus()
        })
    }
}
}()); // PitchNew

Jedi.Project = (function() { 

    var initColumn = function(column) {
        var collapseHeight = column.height(),
            // expandHeight = collapseHeight + column.find('.article .body').outerHeight(true);
            expandHeight = column.find('.article .headline').outerHeight(true) + column.find('.article .body').outerHeight(true);
        column.find('.headline').click(function() {
            if (column.hasClass('expanded')) {
                column.animate({'height': collapseHeight}, 'fast').removeClass('expanded')
            }
            else {
                column.animate({'height': expandHeight}, 'fast').addClass('expanded')
            }
        })
    }
    
    var initEquipment = function() {
        var backgroundUrls = ['url(/static/gfx/eqipment_icon_collapsed.png)', 'url(/static/gfx/eqipment_icon_expanded.png)']
        $('.equipment_box').click(function(e) { 
            $(this).hide();
            $('.equipment').css('background-image', backgroundUrls[0]);
        })
        $('.equipment').click(function(e) { 
            e.preventDefault()
            var box = $('.equipment_box');
            box.toggle();
            $('.equipment').css('background-image', backgroundUrls[box.is(':hidden') ? 0 : 1]);
        })
    }
    
    
    var initComments = function() { 
        $('a.btn_comment').click(function(e) {
            e.preventDefault()
            var $form_comment = $('#form_comment')
            $form_comment.find('#id_parent').val( "" )
            $(this).closest('.button_container').after( $form_comment )
            $form_comment.show()
            $form_comment.find('#id_text').focus()
        })
    }
            
    return {
        init: function(is_authenticated) {
            $(document).ready(function() {
                if (is_authenticated) {
                    initComments()
                    Utils.initReply()
                    Utils.initFormComment()
                    Utils.initFavorite()
                }
                initEquipment()
                Utils.initVoteButton()
                $('.external_description').each(function() {
                    initColumn($(this))
                })
                $('#pld .introduction').toggle(
                    function(e) { 
                        e.preventDefault()
                        $('#pld').removeClass('more').addClass('less')
                        $('#project_long_description').slideDown('fast') 
                    },
                    function(e) { 
                        e.preventDefault()
                        $('#pld').removeClass('less').addClass('more')
                        $('#project_long_description').slideUp('fast') 
                    }
                )
		$('.story_container').map_animate();
            })
        }
    }    
}()); // Project

Jedi.ProjectCartoons = (function() {
return {
    init: function() {
        $(document).ready(function() {
            Jedi.ProjectCartoons.initScroll()
        })
    }
    
    ,initScroll: function() {
        function updateScrollLinks () {
            function updateScrollLink (link, disable) {
                if (disable) { link.addClass('disabled') }
                else { link.removeClass() }
            }
            updateScrollLink(previous, cur_index == 0)
            updateScrollLink(next, cur_index == truth_ids.length - 1)
        }
        
        function updateCartoonDetails () {
            $('.cartoon_details').hide()
            $('#t' + truth_ids[cur_index]).show()
        }
        
        /** direction: +1 - right, -1 - left */
        function runScroll (target, direction) {
            var speed = 120
            var scrollIntervalId = setInterval(function() {
                var offset = viewport.scrollLeft()
                var nextOffset = offset + speed * direction
                if (direction > 0 ? nextOffset > target : nextOffset < target) { // we're going to overflow
                    viewport.scrollLeft( target )
                    clearInterval( scrollIntervalId )
                    updateCartoonDetails()
                    location.replace('#' + truth_ids[cur_index])
                }
                else {
                    viewport.scrollLeft( nextOffset )
                }
            }, 15)
        }
        
        /** direction: +1 - right, -1 - left */
        function makeScrollClick(direction) {
            return function(e) {
                e.preventDefault()
                old_index = cur_index
                cur_index = Utils.confine(cur_index + direction, 0, truth_ids.length - 1);
                if (cur_index != old_index) {
                    updateScrollLinks()
                    runScroll(viewport.scrollLeft() + 934 * direction, direction)
                }
            }
        }

        var truth_ids = $('.cartoon_details ').map(function() {return $(this).attr('id').substring(1) }).get(),
            cur_tid = location.hash.substring(1),
            cur_index = cur_tid ? Utils.indexOf(truth_ids, cur_tid) : 0,
            viewport = $('#cartoon_viewport'),
            previous = $('#previous'),
            next = $('#next');
        $('#cartoon_view').width( 934 * truth_ids.length ); // see css
        
        viewport.scrollLeft( 934 * cur_index )
        
        updateScrollLinks()
        updateCartoonDetails()
        
        previous.click(makeScrollClick(-1))
        next.click(makeScrollClick(1))        
    }
}
}()); // ProjectCartoons

Jedi.Discussions = (function() {
return {
    init: function(is_authenticated) { 
        $(document).ready(function() {
            if (is_authenticated) {
                Utils.initReply()
                Utils.initFormComment()
            }
            Utils.initVoteButton()
        })
    }
}
}()); // Discussions

Jedi.Favorites = (function() {
return {
    init: function() {
        Utils.initFavorite()
    }
}    
}());

Jedi.DemandCartoons = (function() {
return {
    init: function() {
        $(document).ready(function() {
            var cartoons = $('.cartoon_showcase img')
            var n = cartoons.length
            $('.cartoon_showcase img:not(:last)').hide() // hide all but last
            var cur = n - 1
            setInterval(function() {
                var next = cur == 0 ? n - 1 : cur - 1
                $(cartoons.get(cur)).fadeOut('slow')
                $(cartoons.get(next)).fadeIn('slow')
                cur = next
            }, 4000)
        })
    }
}    
}());

}())

