/*
    
    name: history
    file: jquery.history.js
    author: gregory tomlinson
    copyright: (c) 2010 gregory tomlinson | gregory.tomlinson@gmail.com
    Dual licensed under the MIT and GPL licenses.
    ////////////////////////////////////
    ////////////////////////////////////
    dependencies: jQuery 1.4, jquery.timeFormat.js, jquery.cookie.js, jquery.escapeHTML.js
    ////////////////////////////////////
    ////////////////////////////////////            
    
    TODO
            // attach an event to the document unload
            // send an event to save user preferences
            
            http://bitly.net/static/images/info_sm.png

*/

(function($){
    
    $.fn.history = function( search_term, page, options ) {
                        
        var el=this, o = $.extend(true, {}, defaults, options ), hashData={}, requestedSocialSearch=false;
        
        // if I don't have data, fetch off the server
        if(el.length <= 0) return this;
        o.params.search_terms = search_term || "";
        o.params.page = page || 1;
        if(o.data === null) {
            connector(o.url, o.params, success, error);
        }
        
        $(document.body).bind('refreshHistory', function() {
            connector(o.url, o.params, success, error);
        });
        
        return this;
        
        function success(jo) {
            
            if(!jo || !jo.data || !jo.data.results) {
                console.log('ERROR: History system not available!');
                el.html("<div class='history_errorMessage'>"+ o.api_error_text + "</div>");
                return;
            }
            
            //error handle responses
            console.log(search_term)
            if(search_term === "" && jo.data.results.length <=0 && jo.data.page === 1 ) {
                // you don't have history
                handleNoHistoryItems();
            } else if (search_term === "" && jo.data.results.length <=0 && jo.data.page !== 1) {
                var hashes = createHashList( jo.data.results );
                handlePastHistoryEnd();
                el.trigger('hashList', { 'hashes': hashes.all, 
                                            'userHashes' : hashes.user, 
                                            'perpage' : jo.data.perpage,
                                            'total' : jo.data.result_count,
                                            'page' : jo.data.page,
                                            'results' : jo.data.results } );                
            } else if( jo.data.results.length <= 0 ) {
                // this query isn't working
                handleNoQueryResults();
            } else {
                
                var resultsHTML = rendersResults( jo.data.results ), 
                    hashes = createHashList( jo.data.results );
                
                // remember for later in upper variable scope
                hashData = hashes;
                
                el.html( renderMultilineToggleControls() + renderColumnHeaders() + resultsHTML  );

                el.bind('deleteHistoryItem', deleteHistoryItem);
                
                el.find('.resultsItemContainer:last').addClass('lastResultsItemContainer')
                                            
                // send the total clicks to someone else b/c it's async and I cannot just return it anywhere
                el.trigger('hashList', { 'hashes': hashes.all, 
                                            'userHashes' : hashes.user, 
                                            'perpage' : jo.data.perpage,
                                            'total' : jo.data.result_count,
                                            'page' : jo.data.page,
                                            'results' : jo.data.results } );                

                el.find('.showMoreInfo').click( function(e) {
                    e.preventDefault();
                    $(this).parents('ul').removeClass().addClass('twoRowSelected');
                    el.find('.row2').slideDown('normal');

                    if(!requestedSocialSearch) el.trigger('socialSearch', hashData);                    
                    requestedSocialSearch=true;
                    // this needs to set a cookie I guess and see stuff
                });
                el.find('.hideMoreInfo').click( function(e) {
                    e.preventDefault();
                    $(this).parents('ul').removeClass().addClass('oneRowSelected');                    
                    el.find('.row2').slideUp('normal');
                }); 

                if(o.rows === "two_row") {
                    el.find('.showMoreInfo').trigger('click');
                    el.trigger('displayTwoRows', {'userHashes' : hashes.user } );   
                    requestedSocialSearch=true;                
                }
                
            }
            

        }
        
        function error(e) {
            var errorText = o.api_error_text;
            el.html("<div class='history_errorMessage errorMessage'>"+errorText+"</div>");
        }
        
        function handleNoQueryResults() {
            el.html("<div class='history_errorMessage'>"+ o.term_not_empty_no_results + "</div>");
        }
        
        function handleNoHistoryItems() {
            el.html("<div class='history_errorMessage'>"+ o.zeroHistoryLinks + "</div>");
        }
        function handlePastHistoryEnd() {
            el.html("<div class='history_errorMessage'>Sorry, no more history results to display. Click <a href='" + o.baseURL + "'>here</a> to go back</div>");
        }
        
        function createHashList( hashes ) {
            var finalHashes = [], i=0, 
                userHashesOnly=[], fullUrl=[];
            
            for(; i<hashes.length; i++) {
                userHashesOnly.push( hashes[i]._id );
                finalHashes.push( hashes[i]._id );
                finalHashes.push( hashes[i].global_hash );
                fullUrl.push( hashes[i].url );
            }
            
            // TODO: ask jay if these are dupes
            // need to make this unique, don't do it yet
            return { all : finalHashes, user : userHashesOnly, longUrls : fullUrl };
        }
        
        function renderMultilineToggleControls() {
            var html = "", css="";
            
            if( !o.showToggle ) { css = 'style="display:none;"'; }
                        
            html += '<div class="detailsControlBox" '+css+'>';
                html += '<ul class="oneRowSelected">';
                    html += '<li><a class="hideMoreInfo" type="one_row" href="#">One Row</a></li><li><a class="showMoreInfo" type="two_row" href="#">Two Rows</a></li>'
                html += '</ul>';
            html += '</div>'
            
            return html;            
        }
        
        function renderColumnHeaders() {
            var html = "";
            // insert the grey header column markers
            html += '<div class="resultsBarContainer">'
                html += '<b class="resultsBar1"> Clicks </b>'
                html += '<b class="resultsBar2"> Links </b>'                    
                html += '<b class="resultsBar3"> Info Plus </b>'
                html += '<b class="resultsBar4"> Date </b>'    
                html += '<b class="resultsBar5"> Options </b>'                                    
            html += '</div>'
            
            return html;            
            
        }
        
        function rendersResults( data ) {
            var finalHTML = "";
            for(var i=0; i<data.length; i++) {
                //data[i].title
                finalHTML += returnHTMLStructure( data[i] );
                //finalHTML += renderResult( data[i], html );
            }
            
            return finalHTML;
        }
                
        function trimTitle( str ) {
            str = (str.length > 62 ) ? str.substr(0, 59) + "..." : str;
            
            return str;
        }
        function trimLongUrlDisplay( str ) {
            str = (str.length > 115 ) ? str.substr(0, 112) + "..." : str;
            
            return str;
        }        
        
        function trimKeywords( str ) {
            if(!str) return null;
            str = (str.length > 11 ) ? str.substr(0,9) + ".." : str;
            
            return str;
        }
              
        
        function deleteHistoryItem(e) {
            console.log('hear event in history.js')
            $e = $(e.target), $parent = $e.parents('.resultsItemContainer');
            $parent.slideUp('normal', function() {
                $parent.remove();
            });
        }
                    
        function returnHTMLStructure( item ) {
            var displayTitle = $.escapeHTML( item.title ) ||  $.escapeHTML( item.url ), 
                long_url =  $.escapeHTML( item.url );
                display_long_url = trimLongUrlDisplay( long_url  );
                kword = item.keyword || item._id,
                info_page = '/' + kword + '+';
                host = item.domain || o.host_name,                
                info_page_display = 'Real-time stats for ' +host+'/' + kword + '+';
                hashURL = 'http://' + (item.domain || o.host_name) + '/' + kword,
                truncated_title = trimTitle(displayTitle),
                user_hash = item._id,
                global_hash = item.global_hash,
                user_kword_hash = trimKeywords( item.keyword ) || "Info Page",
                ts = $.timeFormat( item.ts);
                
                html = '<div class="resultsItemContainer">';
                    // rev2, add multi link management controls
                    //html += '<div class="resultsColumn1 resultsColumn"><input type="checkbox" name="" value="" /></div>';
                    html += '<div class="resultsColumn2 resultsColumn">';
                        html += '<div class="statsList">';
                            html += '<div class="userStats"><h4><a title="Get Real-time Metrics for this link" type="'+user_hash+'" href="'+info_page+'">0</a></h4></div>';

                            html += '<div class="row2" style="display:none;">'
                                html += '<div class="statsSeparator">out of</div>';
                                html += '<div class="globalStats"><a type="'+global_hash+'" href="/'+global_hash+'+">0</a></div>';
                            html += '</div>'
                        html += '</div>';
                        html +='<div class="hr"><hr /></div>'
                    html += '</div> ';
                    
                    // html += '<div class="resultsColumn3 resultsColumn">';
                    //     html += '<div class="sparkLine sparkLine_$user_hash"></div>'
                    // html += '</div>';
                    
                    html += '<div class="resultsColumn4 resultsColumn">'; 
                        html += '<div class="linkTitleContainer">';
                            html += '';
                            html += '<h4 class="linkTitle">';
                                html += '<img class="historyFavicon" src="/favicon/'+ global_hash +'.png" width="16" height="16" alt="favicon" border="0" />'
                                html += '<a title="'+long_url+'" href="'+hashURL+'">'+truncated_title+'</a>'
                            html += '</h4>'
                        html +='</div>';

                        html += '<div class="moreInfo row2">';
                            html += '<div class="long_url_display_more"><a href="'+long_url+'" title="'+long_url+'">'+ display_long_url +'</a></div>'
                            html += '<div class="backtypeSocialSearchBox" type="'+user_hash+'">'
                                html += '';
                            html += '</div>'

                        html += '</div>';
                    html += '</div>';
                    
                    html += '<div class="resultsColumn5 resultsColumn">'
                        html += '<a href="'+info_page+'" title="'+info_page_display+'">'+user_kword_hash+'+</a>'
                    html += '</div>'
                    
                    html += '<div class="resultsColumn6 resultsColumn">';
                        html += '<div class="dateAndTimeBox">'+ts+'</div>'
                    html += '</div>';
                    html += '<div class="resultsColumn7 resultsColumn">';
                        html += '<div class="optionsDropDownContainer" type="'+user_hash+'" alt="'+hashURL+'"></div>';
                    html += '</div>';      
                html += '<div class="hr"><hr /></div>';
            html += '</div> <!-- end .resultsItemContainer -->';
            
            return html;
        }
        
    }
    
    var defaults = {
        url : '/data/search',
        params : {
            search_terms : '',
            page : 1,
            perpage : 10
        },
        hash_order : [], // to handle response from history results being sorted by recency...
        host_name : 'bit.ly',
        baseURL : '/a/search',
        data : null,
        showToggle : true,
        term_not_empty_no_results : "Sorry, we aren't able to find any results for that query.",
        api_error_text : "We're sorry, the history system is currently unavailable.  Your links are still functional and your data is safe",
        zeroHistoryLinks : 'It looks like you haven\'t shortened any links yet!  Put a long link in the shorten box above, and it will show up here.',
        months : ["Jan", "Feb", "March", "April", "May", "June", "July", "Aug", "Sept", "Oct", "Nov", "Dec"]
    }
    
    function connector(url, params, callback, error) {
        params._xsrf = $.cookie.get("_xsrf");
        var str = $.param( params );
        $.ajax({
            dataType: 'json',                    
            'url' : url, 
            type : 'POST',
            data : str,
            success : callback,
            'error' : error
        });
    }
    
})(jQuery);