//Registrar Feed Implimentations
(function($, win, doc, undefine){
    'use strict';
    var log = console.log | function(){};
    var loadError = function(){
        log('Registrar Feed could not be loaded.');
        $.fn.extend({
            trumba: function(){
                log('Registrar Feed could not be loaded.');
                return this;
            }
        });
    };
    if(!$){
        log('jQuery is required');
        loadError();
        return false;
    }
    if(!win.jsontemplate){log('jsontemplate is required.'); loadError(); return false;}
    if(!win.Date.CultureInfo){log('Date.js is required.'); loadError(); return false;}
    
    /* Template and Defaults */
    var _trumbaTemplate = [
        '{.section data}<div class="events-row">',
                '<div class="row">',
                    '<div class="col-xs-12">',
                        '{.section trumba}{.section items}{.repeated section @}<div class="event">',
                          '<a href="{guid|trumbaUrl}">',
                            '<div class="row">',
                                '<div class="col-xs-4 col-sm-3 col-md-4 col-lg-3">',
                                    '{.checkTrumbaDateDiffernce? trumba.localstart trumba.localend}',
                                    '<div class="date-block">',
                                        '<div class="day">{trumba.localstart|customDateTimeFormat(\'ddd\')}</div>',
                                        '<div class="date">{trumba.localstart|customDateTimeFormat(\'MMM\')} {trumba.localstart|customDateTimeFormat(\'d\')}</div>',
                                    '</div>',
                                    '{.or}',
                                    '<div class="date-block">',
                                        '<div class="day">{trumba.localstart|customDateTimeFormat(\'MMM\')}</div>',
                                        '<div class="date"> {trumba.localstart|customDateTimeFormat(\'d\')}-{trumba.localend|customDateTimeFormat(\'d\')}</div>',
                                    '</div>',
                                    '{.end}',
                                    
                                '</div>',
                                '<div class="col-xs-8 col-sm-9 col-md-8 col-lg-9 trumba-desc">',
                                    '<div class="event-desc">{title}</div>',
                                '</div>',
                            '</div>', 
                         '</a>',
                        '</div>{.end}{.end}',
                        '{.or}<div class="no-events"></div></div>{.end}',
                    '</div>',
                '</div>',
        '</div>{.end}'    
    ];
    
    var _feedTemplate = [
        '<div class="news-feed">',
            '<h3>Laney in the <strong>News</strong></h3>',
            '{.section data}{.section feed}{.section entries}<ul>',
                '{.repeated section @}<li class="article">',
                    '<div class="media">',
                        '<div class="article-media media-left">',
                            '<a href="{link}">',
                                '<img src="{thumbnail}"/>',
                            '</a>',
                        '</div>',
                        '<div class="article-content media-body">',
                            '<a href="{link}">',
                                '<h4>{title}</h4>',
                            '</a>',
                        '</div>',
                    '</div>',
                '<div class="clearfix" </div></li>{.end}',
            '</ul>{.or}<div class="no-events"></div>{.end}{.end}{.end}',
            '<a class="moreLink" href="http://news.emory.edu/tags/school_or_unit/graduate_school/index.html" role="button">More Laney News <span class="fa fa-chevron-right"></span></a>',
        '</div>'
    ];
    
    var trumbaFormaters = function(formatter_name){
        if(formatter_name === 'customDateTime'){
            return function(value, context){
                return Date.parse(value).toString(context.get('settings.dateFormat'));
            }
        } 
        else if (formatter_name.indexOf("customDateTimeFormat") === 0){
            return function(value, context){
                return Date.parse(value).toString(formatter_name.split("('")[1].replace(/'\)/, ""));
            }
        }
        else if (formatter_name.indexOf('replaceString') === 0){
            return function(value, context){
                var stringSet = formatter_name.split("('")[1].replace(/'\)/, "").replace("!!", "|").split(',,');
                var Replacee = stringSet[0];
                var Replacer = stringSet[1];
                return value.toString().replace(Replacee, Replacer);
            }
            
        }
        else if (formatter_name === 'trumbaUrl'){
            return function(value, context){
                var eventId = value.split('/').pop();
                return context.get('settings.localCalendar') + '?trumbaEmbed=eventid%3D' + eventId + '%26view%3Devent%26-childview%3D';
            }
        }
    };
    
    
    var trumbaPredicates = function(arg){
        var util = (function(){
            var rQuotes = /"|'/g;

            // Sourced from https://code.jquery.com/
            var isNumeric = function ( obj ) {
                return !Array.isArray( obj ) && obj - parseFloat( obj ) >= 0;
            };
            
            var getLookupArg = function ( ctx, arg ) {
                var get = ctx.get( arg ),
                    lookup = ctx._LookUpStack( arg ),
                    lookupIsNumeric = isNumeric( lookup ),
                    getIsNumeric = isNumeric( get );
            
                if ( (lookup !== undefined && lookup !== "") || lookupIsNumeric ) {
                    arg = lookup;
            
                } else if ( (get !== undefined && get !== "") || getIsNumeric ) {
                    arg = get;
                }
            
                return arg;
            };
            
            var getProcessedArgs = function ( args, ctx ) {
                var arg1 = args[ 0 ],
                    arg2 = args[ 1 ];
            
                // One of the args is a string literal
                if ( rQuotes.test( arg1 ) ) {
                    arg1 = String( arg1.replace( rQuotes, "" ) );
                    arg2 = ( ctx._LookUpStack( arg2 ) || ctx.get( arg2 ) );
            
                } else if ( rQuotes.test( arg2 ) ) {
                    arg2 = String( arg2.replace( rQuotes, "" ) );
                    arg1 = ( ctx._LookUpStack( arg1 ) || ctx.get( arg1 ) );
            
                // Just make sure we don't mess up numeric values
                } else {
                    if ( !isNumeric( arg1 ) ) {
                        arg1 = getLookupArg( ctx, arg1 );
                    }
            
                    if ( !isNumeric( arg2 ) ) {
                        arg2 = getLookupArg( ctx, arg2 );
                    }
                }
            
                return [arg1, arg2];
            };
            
            var getArgsProcessed = function ( args, ctx ) {
                var arg1 = args[ 0 ],
                    arg2 = args[ 1 ];
            
                // Special Case
                // {.equal? typeName "collection"}
                // {.equal? title "collection"}
                // {...and so on...}
                // Cannot use `collection` string with the lookup stack.
                // It will return the {collection object} rather than a lookup value.
                if ( String( arg2.replace( rQuotes, "" ) ) === "collection" ) {
                    arg1 = getLookupArg( ctx, arg1 );
            
                // Use Cases
                // {.equal? foo.bar "baz"}
                // {.equal? foo "bar"}
                // {.equal? @index 5}
                // {.equal? "foo" foo.bar}
                // {... and so on...}
                } else {
                    args = getProcessedArgs( args, ctx );
                    arg1 = args[ 0 ];
                    arg2 = args[ 1 ];
                }
            
                return args;
            };
            
            return {
                rQuotes: rQuotes,
                isNumeric: isNumeric,
                getLookupArg: getLookupArg,
                getArgsProcessed: getArgsProcessed
            }
            
        })(); 
         var defaultPredicates = [
        "singular",
        "plural",
        "singular?",
        "plural?",
        "Debug?"
        ],
        predicates = {
            
            "equal?":  function ( data, ctx, args ) {
                args = util.getArgsProcessed( args, ctx );
            
                return ( args[ 0 ] == args[ 1 ] );
            },
            "checkTrumbaDateDiffernce?" : function (data, ctx, args) {
                console.log(data);
                console.log(ctx);
                console.log(args);
                args = util.getArgsProcessed( args, ctx );
                console.log(args);
                
                var same = true;
                if(args[ 0 ].split('T')[0] != args[ 1 ].split('T')[0]) {
                    console.log(parseInt(args[ 1 ].split('T')[0].split('-')[1]));
                    if(parseInt(args[ 1 ].split('T')[0].split('-')[2]) - parseInt(args[ 0 ].split('T')[0].split('-')[2]) == 1)  {
                        console.log("HERE");
                        if((args[ 0 ].split('T')[1] == '00:00:00') && (args[ 1 ].split('T')[1] == '00:00:00')) {
                            same = true;
                        } else {
                            same = false;
                        }
                    } else {
                        same = false;
                    }
                }
                
                
                
                return same;
            }
            
        };
          
        var index = arg.indexOf(arg.split('?')[1] ? arg.split('?')[1][0] : ' '),
        predicate = null,
        args = null;

    if ( index === -1 ) {
        predicate = arg;
        args = [];

    } else {
        predicate = arg.substr( 0, index );

        //get delimiter for equal if not a space
        var delimiter = arg.split('?')[1] ? arg.split('?')[1][0] : ' ';
        var reg1 = new RegExp('^\\s+|\\s+$|' + delimiter, "g");
        var reg2 = new RegExp('\\s|' + delimiter, "g");

        // Clean predicate out of args now
        arg = arg.replace( predicate, "" ).replace( /^\s+|\s+$/g, "" );

        // Filter and normalize the arguments list
        args = arg.split( (/\"/.test( arg ) ? /\"(.*?)\"/g : /\s/g) )
            .map(function ( el ) {
                return el.replace(reg1, "" );
            })
            .filter(function ( el ) {
                var tmp = el.replace(reg2, "" );

                return ( tmp !== "" );
            });
    }

    // Only run if predicate is NOT a JSONT default internal
    if ( defaultPredicates.indexOf( predicate ) === -1 ) {
        // Wrapper function for passing along to correct predicate
        return function ( data, context ) {
            var func = predicates[ predicate ],
                ret = false;

            // Capture {.if} conditions
            if ( !/\?$/.test( predicate ) ) {
                ret = context.get( arg );

            } else if ( typeof func === "function" ) {
                // Normalize `args` as an Array excluding `predicate`
                ret = func( data, context, args );
            }

            return ret;
        };
    }
        
    }
    
    var extraFormaters = function(formatter_name){
        if (formatter_name.indexOf("customDateTimeFormatATOMDate") === 0){
            return function(value, context){
                console.log(value);
                return Date.parse(value.substring(0, value.lastIndexOf("-"))).toString(formatter_name.split("('")[1].replace(/'\)/, ""));
            }
        } 
        else if (formatter_name.indexOf("customDateTimeFormat") === 0){
            return function(value, context){
                return Date.parse(value).toString(formatter_name.split("('")[1].replace(/'\)/, ""));
            }
        }
        else if(formatter_name === 'customDateTime'){
            return function(value, context){
                return Date.parse(value).toString(context.get('settings.dateFormat'));
            }
        } 
        else if (formatter_name.indexOf('replaceString') === 0){
            return function(value, context){
                var stringSet = formatter_name.split("('")[1].replace(/'\)/, "").replace("!!", "|").split(',,');
                var Replacee = stringSet[0];
                var Replacer = stringSet[1];
                return value.toString().replace(Replacee, Replacer);
            }
            
        }
        else if (formatter_name === 'trumbaUrl'){
            return function(value, context){
                var eventId = value.split('/').pop();
                return context.get('settings.localCalendar') + '?trumbaEmbed=eventid%3D' + eventId + '%26view%3Devent%26-childview%3D';
            }
        }
        else if (formatter_name === 'extractFirstImg'){
            return function(value, context){
                var localRegEx = /<img(.*?)src="(.*?)"(.*?)>/;
                if(localRegEx.exec(value) && localRegEx.exec(value)[0])
                    return localRegEx.exec(value)[0];
                else {
                    return '';
                }
            }
        }
    };
    
    var _contextTemplate = jsontemplate.Template(_trumbaTemplate.join(''), {more_formatters: trumbaFormaters, more_predicates: trumbaPredicates});
    var _feedTemplate = jsontemplate.Template(_feedTemplate.join(''), {more_formatters: extraFormaters});
    
    $.fn.extend({
        trumba: function(options) {
                return this.each(function(index) {
                    
                    var $obj = $(this);
                    
                    var settings = $.extend({}, $.fn.trumba.defaults , options);
                    
                    $obj.addClass('events-loading');
                    
                    $.ajax({
                        dataType: "jsonp",
                        url: settings.url, 
                        data: {
                            calendar : settings.calendar, 
                            num : settings.num, 
                            refreshInterval : settings.refresh, 
                            currentTime : (function(){return new Date().getTime();})()
                        }
                    }).done(function(data){
                        var dataObject = {
                            settings : settings,
                            data : data
                        };
                        $obj.html(_contextTemplate.expand(dataObject));
                        if($.isFunction(settings.callback)){
                            settings.callback(data, $obj);
                        }
                    }).always(function(){
                        $obj.removeClass('events-loading').addClass('events-loaded');
                    });
                
            });
        },
        
        feed: function(options) {
                return this.each(function(index) {
                    var $obj = $(this);
                    var settings = $.extend({}, $.fn.feed.defaults , options);
                    $obj.addClass('events-loading');
                    $.ajax({
                        dataType: "jsonp",
                        url: settings.url, 
                        data: {
                            feed : settings.feed, 
                            num : settings.num, 
                            refreshInterval : settings.refresh, 
                            currentTime : (function(){return new Date().getTime();})()
                        }
                    }).done(function(data){
                        var dataObject = {
                            settings : settings,
                            data : data
                        };
                        //console.log(dataObject);
                        /* NEED TO FINISH */
                        $obj.html(_feedTemplate.expand(dataObject));
                        
                        if($.isFunction(settings.callback)){
                            settings.callback(data, $obj);
                        }
                    }).always(function(){
                        $obj.removeClass('events-loading').addClass('events-loaded');
                    });
            });
        }
    });
    
    $.fn.trumba.defaults = {
        "url" : "//www.gs.emory.edu/_includes/cfm/proxy.cfm",
        "calendar" : "emoryregistrarcalendar",
        "num" : 5,
        "refresh" : 120,
        "localCalendar" : "http://www.trumba.com/calendars/emoryregistrarcalendar",
        "callback" : function(){
            $("body").trigger('trumba.load');
            if (window.addtocalendar)if(typeof window.addtocalendar.start == "function")return;
            if (window.ifaddtocalendar == undefined) { window.ifaddtocalendar = 1;
                var d = document, s = d.createElement('script'), g = 'getElementsByTagName';
                s.type = 'text/javascript';s.charset = 'UTF-8';s.async = true;
                s.src = ('https:' == window.location.protocol ? 'https' : 'http')+'://addtocalendar.com/atc/1.5/atc.min.js';
                var h = d[g]('body')[0];h.appendChild(s); 
            }
        }
    };
    
    $.fn.feed.defaults = {
        "url" : "//www.gs.emory.edu/_includes/cfm/proxy.cfm",
        "feed" : "http://news.emory.edu/tags/school_or_unit/graduate_school/index_atom.xml",
        "num" : 4,
        "refresh" : 1,
        "callback" : function(){}
    };
    
})(jQuery, window, document);