var TCS = function(){

    var addMyTcsHandler = function(that, opt){

        var $this = $(that),
            action =  opt.addMyTcsUrl,
            id = that.value,
            inputs = $('.shows')
                .find('input:checkbox')
                .filter('[value=' + that.value + ']');

        if(!that.checked) {
            action = opt.deleteMyTcsUrl;
            id = $this.attr('data-mytcsid');
        }

        $.getJSON(action+id, function(data){
            var item = $this;

            if(!item.checked) {
                item.attr('data-mytcsid', data.myArticleId);
                inputs.attr('data-mytcsid', data.myArticleId);
            }
        });

        inputs
            .unbind('change.addMyTcs')
            .attr('checked', that.checked)
            .bind('change.addMyTcs', function(){ addMyTcsHandler(that, opt); });
    };

    return {
        Init : function(options){
            $('#search').find('#q').bind('focusin focusout', function(e){
                var $this = $(this),
                    val = $this.val(),
                    ori = $this.attr('data-default');

                if(e.type === 'focusin'){
                    if(val === ori) $this.val('');
                } else{
                    if(val === '') $this.val(ori);
                }
            });
            this.InitRoundedCorner();
        },
        InitRoundedCorner: function(){

            if($.browser.msie) {
                var getById = document.getElementById;
                
                $('#archive-tab').find('> li > a').corner('top 5px cc:#2d282b');
                $('#archive-tab').find('ul > li > a').corner('3px cc:#ffffff');
                $('.shows-container').find('.header').find('h3 a').corner('top 5px')
                $('.shows-container').find('.shows').find('.header').find('.action-box').corner('5px')
                $('.shows-container').find('.shows').corner('bottom 5px');
                $('#shows').corner('bottom 5px');
                $('#network-nav').find('a').corner('5px');
                $('#shows-nav').find('a').corner('5px cc:#230303');
                $('#TCS.tcs-today').find('.viewing-date').find('p').corner('5px')

                $('#expand-all').corner('3px').siblings('.print-all').corner('3px cc:#ffffff');
                $('#TCS.myTcs, #TCS.home').find('#content').corner('bottom 5px cc:#560f11').corner('top 5px cc:#240304')
                $('#TCS.announcement, #TCS.userGuide, #TCS.topTen, #TCS.suggestion, #TCS.error')
                    .find('.content-wrap')
                        .corner('bottom 5px cc:#560f11')
                        .find('.panel')
                            .corner('5px')
                            .end()
                        .end()
                    .find('#quicklinks a')
                        .corner('top 5px cc:#621226')
                        .end()
                    .find('#guide, #preferences')
                        .corner('5px');
                $('#TCS.search').find('.content-wrap').corner('5px cc:#560f11');

                $('#TCS.search')
                    .find('#searchArchive,#filter,#searchResults')
                        .corner('5px')
                        .find('h3')
                            .corner('top 5px')
                            .end()
                        .end()
                    .find('#criteria')
                        .corner('5px')
                        .find('.query label')
                            .corner('tl 5px')
                            .end()
                        .find('.dateScope label')
                            .corner('tr 5px')
                            .end()
                        .end()

            }
        },
        InitAddMyTcs: function(el, opt){
            var addMyTcs = addMyTcsHandler;

            el.find(':checkbox')
               .bind('change.addMyTcs', function(){
                   addMyTcs(this, opt);
               });
        },
        InitVideoPlayer: function(el){
            el.find('.videoplayer').bind('click', function(e){
				e.preventDefault();

				var that = this,
					vidplayer = $(that);
				
				if (vidplayer.is('.uploadedVid')) {
					var vidCtnr = $('#embed'),
						playerHolder = $('<a />', {id: 'player', href: that.href}),
						vidContainer = $('<div />',{ width: '480px', height: '360px'}).append(playerHolder);
					
					vidCtnr.find('div.wrap').append(vidContainer);
					vidCtnr.overlay({
						expose: '#000000',

						// we want to use the programming API
						api: true,

						onClose: function(content) {
							vidCtnr.find("div.wrap").html("");
						}

						// load it immediately after the construction
					}).load();

            	player = flowplayer("player", FPLAYERPATH, { 
						key: FPLAYERLICENSE, 
						clip: { autoPlay: false, autoBuffering: true }});
				}


				if (!vidplayer.is('.uploadedVid')) {
				   $.getJSON(that.href, function (data) {
						   $("#embed div.wrap").html(data.embed);
						   // select the overlay element - and "make it an overlay"
						   $("#embed").overlay({
							   expose: '#000000',

							   // we want to use the programming API
							   api: true,

							   onClose: function(content) {
								   $("#embed div.wrap").html("");
							   }

							   // load it immediately after the construction
						   }).load();
					   });
				}
				
            });


        },
        HomeInit : function(options){

            this.Init();
            
            var addMyTcs = addMyTcsHandler;
            var container = $('.shows-container'),
                shows = container.find('.shows'),
                opt = $.extend({
                    addMyTcsUrl : '/tcstodaysTcs/deleteMyArticle/',
                    deleteMyTcsUrl : '/tcstodaysTcs/addMyArticle/'
                }, options);

            $('#archive-tab').find('>li').first().find('>a, >ul').addClass('active');
            
            container.children().MyTcs(opt);

            this.InitVideoPlayer(shows);
            
            var noWeekendsOrHolidays = function(date) {
                
                var noWeekend = jQuery.datepicker.noWeekends(date);
                return noWeekend;
            }

            $('#datepicker').datepicker({
                changeMonth: true,
                changeYear: true,
                dateFormat: 'yy-mm-dd',
                defaultDate: options.selectedDate,
                maxDate: options.today,
                minDate: new Date(2010, 1, 8),
                beforeShowDay: noWeekendsOrHolidays,
                onSelect: function(dateText, inst){
                    window.location = options.todayTcsUrl + '?date=' + dateText;
                }
            }).bind('click',function(e){return false;});
            
            $('#datepickTrigger').bind('click focusin mouseenter', function(e){
                $('#datepicker').fadeIn(300);
                $('#close').fadeIn(300);
                return false;
            });
            
            $('body').bind('click', function(){
                $('#datepicker').fadeOut(300);
                $('#close').fadeOut(300);
            });
            $(window).keypress(function(e){
                if(e.keyCode == 27) {
                    $('#datepicker').fadeOut(300);
                    $('#close').fadeOut(300);
                }
            });
            $('#datepicker').hide();
            $('#close').hide();
        },
        AllStoriesInit : function(options){

            this.Init();

            var addMyTcs = addMyTcsHandler;

            var container = $('.shows-container'),
                shows = container.find('.shows'),
                opt = $.extend({
                    addMyTcsUrl : '/tcstodaysTcs/deleteMyArticle/',
                    deleteMyTcsUrl : '/tcstodaysTcs/addMyArticle/',
                    upPopularUrl: '/tcstodaysTcs/increasePopularity/'
                }, options);

            container.Ticky()
            shows
                .Expandibly(
                    '.expand, h3 a', '.content',
                    { 'expandAllTrigger' : '#expand-all', 'collapseAllTrigger' : '#collapse-all', upPopularUrl: opt.upPopularUrl }
                )
                .find('.action-box :checkbox')
                    .bind("change.addMyTcs", function(){
                        addMyTcs(this, opt);
                    });
            
            $('#expand-all').bind('click', function(e){
                $('#collapse-all').show(); $(this).hide(); return false;
            });
            $('#collapse-all').bind('click', function(){
                $('#expand-all').show(); $(this).hide(); return false;
            }).trigger('click');
            
            shows.find('>li')
                    .find('.thumb-container')
                        .find('a')
                            .overlay({"target": "#gallery", "expose": "#000000"})
                            .gallery({"speed":800});
            
            $('#gallery').appendTo('body');
        },
        StoryInit : function(options){

            this.Init();

            var addMyTcs = addMyTcsHandler,
                doc = document;

            var that = this, images,
                myTcs = doc.getElementById('my-tcs'),
                showForm = doc.getElementById('shows')
                opt = $.extend({
                        addMyTcsUrl : '/tcstodaysTcs/deleteMyArticle/',
                        deleteMyTcsUrl : '/tcstodaysTcs/addMyArticle/'
                }, options);

            images = $('#story-container')
                .find('.thumb-container')
                    .find('a');

            if(images!== undefined && images.length > 0) {
                images.overlay({"target": "#gallery", "expose": "#000000"})
                        .gallery({"speed":800})
            }
            $('#gallery').appendTo('body');

            $(myTcs).bind('click.addMyTcs', function(){

                var that = this,
                    isMyTcsCls = "isMyTcs",
                    action =  opt.addMyTcsUrl,
                    myTcs = doc.getElementById('myTcsId'),
                    id = doc.getElementById('articleId').value;

                if(parseInt(myTcs.value)) {
                    action = opt.deleteMyTcsUrl;
                    id = myTcs.value;
                    isMyTcsCls = '';
                }

                $.getJSON(action+id, function(data){
                    myTcs.value = data.myArticleId;
                    $(that).attr('class', isMyTcsCls);
                });

                return false;
            });
        },
        topTenInit : function(options){
            this.Init();
            
            var container = $('#content'),
                shows = container.find('.panel'),
                len = shows.length, i=len, height=0;
                opt = $.extend({
                    addMyTcsUrl : '/tcstodaysTcs/deleteMyArticle/',
                    deleteMyTcsUrl : '/tcstodaysTcs/addMyArticle/'
                }, options);

            this.InitAddMyTcs(shows, opt);
            this.InitVideoPlayer(shows);

            for(;i;){
                var h = $(shows[--i]).height();
                if(h > height) height = h; 
            }
            shows.css('height', height);
        },
        SuggestionInit: function(){

            this.Init();
            
            var formEls = $("#callLetter, #email, #suggestion");

            $("#suggestionForm").submit(function(e) {

                var els = formEls,
                    emailRegex = /\w+([.-_]\w+)*@\w+([.-_]\w+)*\.\w{2,4}/,
                    emptyEl = $.grep(els, function(n,i){
                        var $this = $(n),
                            val = $.trim($this.val()),
                            ori = $this.data('default'),
                            isEmpty = false;

                        isEmpty = val == '';
                        if(!isEmpty) isEmpty = val == ori;
                        return isEmpty;
                    }),
                    emailValid = false,
                    emailEl = $('#email')

                if(emailEl.val() !== '' || emailEl.val() !== emailEl.data('default')){
                    emailValid = emailRegex.test(emailEl.val())
                }

                if(emptyEl.length > 0 ){
                    var errMsg;

                    if(emptyEl.length === els.length)
                        errMsg = "You haven't written anything! \nPlease include your call letters, email address, and suggestion. \nThank you!";
                    else {
                        errMsg = "Please include ";
                        
                        var len = emptyEl.length, i=0;
                        for(;i<len;i++){
                            if(len === 2 && i === len-1){
                                errMsg += ' and ';
                            }else if(len > 2){
                                errMsg += ', ';
                                if(i === len-1){
                                    errMsg += 'and ';
                                }
                            }
                            errMsg += $(emptyEl[i]).attr('data-title');
                        }

                        errMsg += ". \nThank you!";
                    }

                    alert(errMsg)
                    return false;
                }

                if(!emailValid){
                    alert("Invalid email address. \nPlease double check if you miss out something. \nThank you!")
                    emailEl.focus();
                    return false;
                }
                
                return true;
            });

            formEls
                .each(function(){
                    var $this = $(this);
                    $this.data('default', $this.attr('data-default')); 
                })
                .bind('focusin focusout', function(e) {
                    var $this = $(this),
                        val = $this.val(),
                        ori = $this.data('default');

                    if(e.type === 'focusin'){
                        if( val === ori) $this.val('');
                    } else {
                        if( val == '') $this.val(ori);
                    }
            });
        },
        SearchInit: function(options){
            var noWeekendsOrHolidays = function(date) {
                
                var noWeekend = jQuery.datepicker.noWeekends(date);
                return noWeekend;
            }
            
            this.Init()
			try{
				$("table#tcsSearchResultsTbl").tablesorter();
            }
			catch (e)
			{}
			
            $('#datepicker').datepicker({
                changeMonth: true,
                changeYear: true,
                firstDay: 0,
                dateFormat: 'yy-mm-dd',
                defaultDate: options.selectedDate,
                maxDate: options.today,
                minDate: new Date(2010, 1, 8),
                beforeShowDay: noWeekendsOrHolidays,
                onSelect: function(dateText, inst){
                    window.location = options.searchUrl + '?date=' + dateText;
                }
            }).bind('click', function(e){ return false; });
            
            $('#searchArchive').find('.searchByDate').bind('click', function(e){
                $('#datepicker').fadeIn(300);
                $('#close').fadeIn(300);
                return false;
            });
            $('#close').bind('click', function(e){
                $('#datepicker').fadeOut(300);
                $('#close').fadeOut(300);
                return false;
            })
            $('body').bind('click', function(e){
                $('#datepicker').fadeOut(300);
                $('#close').fadeOut(300);
            }).keypress(function(e){
                if(e.keyCode == 27) {
                    $('#datepicker').fadeOut(300);
                    $('#close').fadeOut(300);
                }
            });
            $('#datepicker').hide();
            $('#close').hide();
        }
    };
}

