(function( $ ){
    
    var settings = {
        'url' : 'includes/news_ticker.xml',
        'duration' : 1200,
        'ticker_wait' : 6000,
        'num_per_set' : 2, 
        'max_sets' : 5,
        'wrapper_tagName' : 'div',
        'wrapper_class' : null,
        'wrapper_id' : 'tickerWrapper',
        'item_wrapper_tagName' : 'div',
        'item_wrapper_class' : 'newsFeedItem',
        'item_prepend': "",
        'item_append': " <span class='news_goto'>&nbsp;&raquo;</span>",
        'set_prepend': "",
        'set_append': "",
        'nodeName': "item",
        'error_msg' : "<span class='xml_error'>We apologize but there was an error connecting to our news feed</span>"
    };
    
    var ft_vars = {
        feedArray: [],
        linkObject: false,
        feedIndex: -1,
        numFeedSets: 1,
        feedTickerContainer: null
    }
    
    $.fn.feedTicker = function( method ) {
        if ( methods[method] ) return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
        else if ( typeof method === 'object' || ! method ) return methods.init.apply( this, arguments );
        return this;
    };
    
    //
    //  public methods
    //
    
    var methods = {
        init: function(options)
        {
            ft_vars.feedTickerContainer = $("<"+settings.wrapper_tagName+">")
            if (settings.wrapper_class) ft_vars.feedTickerContainer.addClass(settings.wrapper_class)
            if (settings.wrapper_id) ft_vars.feedTickerContainer.attr("id",settings.wrapper_id)
            this.empty()
            this.append(ft_vars.feedTickerContainer)
            ft_vars.feedTickerContainer.hide()
            parts = []
            return this;
        },
        addPart: function(n,tn,wc,limit,limitpost,post,pre){
            var obj = {}
            obj.name = n
            obj.tagName = tn
            obj.wrapperClass = wc
            obj.limit = limit
            obj.limitpost = limitpost ? limitpost : ""
            obj.pre = !!pre ? pre : ""
            obj.post = !!(post) ? post : (!(post===false) ? " " : "")
            parts.push(obj)
        },
        addLink: function(n,cls,data){
            ft_vars.linkObject = {}
            ft_vars.linkObject.name = n
            ft_vars.linkObject.link_class = !!cls ? cls : false 
            ft_vars.linkObject.data = !!data ? data : "" 
        },
        fetch: function() {
            parts = $(parts)
            internal.getxml()  
        },
        startFeed: function() {
            
            internal.nextfeed()
            ft_vars.feedTickerContainer.fadeIn(settings.duration)
            setTimeout(function(){ft_vars.feedTickerContainer.fadeOut(settings.duration,methods.startFeed)},settings.ticker_wait)
            
        }
    };
    //
    //  internal methods
    //
    var internal = {
        getxml: function(){
             $.ajax({
		url: settings.url,
		dataType: (jQuery.browser.msie) ? 'text' : 'xml',
		error: function(error){
                    err_obj = {}
                    err_obj.isError = true
                    err_obj.message = settings.error_msg
                    err_obj.error = error
                    internal.injectError(error_obj)
                },
		success: function(xmlData){
                    var data; 
                    if (typeof xmlData == 'string') { 
                            data = new ActiveXObject( 'Microsoft.XMLDOM'); 
                            data.async = false; 
                            data.loadXML( xmlData); 
                    } else { 
                            data = xmlData; 
                    }
                    internal.parsedata(data)
		} 
            }); 
        },
        parsedata: function(data) {
            str = "";
            var item_index = 0
            var set_index = 0
            var i = 0
            $(data).find(settings.nodeName).each(function(){
                if(set_index >= settings.max_sets) return false
                else {
                        str += internal.partstring($(this))
                        i++
                        item_index++        
                        if (i==settings.num_per_set) {
                            i=0;
                            set_index++;
                            ft_vars.feedArray.push(settings.set_prepend+str+settings.set_append);
                            str = "";
                            if (set_index == settings.max_sets) return false;
                            else return true;
                        } else {
                            return true    
                        }
                } 
            });
            ft_vars.numFeedSets = ft_vars.feedArray.length
            methods.startFeed()
        },
        injectError: function(error) {
            //console.log(error.message)
        },
        partstring: function(xml){
            var str = settings.item_prepend
            var href = false
            parts.each(function(){
                var pstr = ""
                if (this.tagName) {
                    pstr += "<" + this.tagName;
                    if (this.wrapperClass) pstr += " class='"+this.wrapperClass+"'>"
                    else pstr += "'>"
                }    
                pstr += this.pre + internal.limitString(xml.find(this.name).text().replace(/<.*?>/g, ''),this.limit,this.limitpost) + this.post
                if (this.tagName) {
                    pstr += "</" + this.tagName + ">"
                }
                str +=pstr
            })
            if (settings.item_wrapper_tagName) {
                pstr = "<" + settings.item_wrapper_tagName;
                if (settings.item_wrapper_class) pstr += " class='"+settings.item_wrapper_class+"'>"
                else pstr += "'>"
                pstr += settings.item_prepend + str + settings.item_append
                str = pstr + "</" + settings.item_wrapper_tagName + ">"
            }
            if (!!ft_vars.linkObject) {
                pstr = "<a href='"+xml.find(ft_vars.linkObject.name).text()+"' "
                if (ft_vars.linkObject.link_class) pstr += "class='"+ft_vars.linkObject.link_class+"' "
                str = pstr + " " +ft_vars.linkObject.data+ ">" +str+  "</a>"
            }    
            return str 
        },
        limitString: function(str,limit,post){
            if (!limit || limit > str.length) return str
            else return str.substr(0,limit) + post
        },
        nextfeed: function(){
            ft_vars.feedIndex = ft_vars.feedIndex < ft_vars.numFeedSets - 1 ? ft_vars.feedIndex + 1 : 0
            ft_vars.feedTickerContainer.empty()
            ft_vars.feedTickerContainer.append(ft_vars.feedArray[ft_vars.feedIndex])
        }
        
    };

})( jQuery );
