(function( $ ){
    
    var settings = {
        left_zero: 0,
        buffer: 0,
        duration: 1250,
        distance: 160,
        easing: 'linear',
        page: 'body',
        engaged_class: 'engaged',
        r_btn_inject: "<img class='rscroll go' src='/global/images/tm_homepage/rscroll.png' />",
        l_btn_inject: "<img class='lscroll go' src='/global/images/tm_homepage/lscroll.png' />",
        r_btn_end_inject: "<img class='rscroll end' src='/global/images/tm_homepage/rscroll-grey.png' />",
        l_btn_end_inject: "<img class='lscroll end' src='/global/images/tm_homepage/lscroll-grey.png' />"
    };
    
    var st_vars = {
        tracks: [],
        track_widths: [],
        box_widths: [],
        min_lefts: [],
        left_buttons: [],
        right_buttons: [],
        max_left: 0,
        stopped: true
    }
    
    $.fn.slideTrack = 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)
        {
            st_vars.tracks = this;
            return this;
        },
        setButtons: function(left,right){
            st_vars.left_buttons = $(left)
            st_vars.right_buttons = $(right)
        },
        setSlider: function(boxselector,selector)
        {
            internal.setBoxes(boxselector)
            internal.setContainers(selector)
            st_vars.max_left = settings.buffer-settings.left_zero
            return this;
        }
    };
    
    
    //
    //  internal methods
    //
    
    var internal = {
        setBoxes: function(boxselector)
        {
            $(boxselector).each (function(i){
                st_vars.box_widths[i]  = parseInt($(this).css("width"))
            })

            return this;
        },
        setContainers: function(selector)
        {
            $.each(st_vars.tracks,function(i){
                //  update to outerWidth if  >jq1.3
                st_vars.track_widths[i] = 0
                $(this).children(selector).each (function(){
                    var chld = $(this)
                    st_vars.track_widths[i] += parseInt(chld.css("width"))      
                    st_vars.track_widths[i] += parseInt(chld.css("padding-left"))      
                    st_vars.track_widths[i] += parseInt(chld.css("padding-right"))      
                    st_vars.track_widths[i] += parseInt(chld.css("margin-left"))      
                    st_vars.track_widths[i] += parseInt(chld.css("margin-right"))
                })
                $(st_vars.tracks[i]).css({"left":settings.left_zero})
                st_vars.min_lefts[i] = st_vars.box_widths[i] - st_vars.track_widths[i] - 2 * settings.buffer
                if (st_vars.min_lefts[i]<0) internal.engage(i)
            })
            return this;
        },
        engage: function(i) {
            $(st_vars.left_buttons).each(function(i){
                st_vars.left_buttons[i] = $(this)
            })
            $(st_vars.right_buttons).each(function(i){
                st_vars.right_buttons[i] = $(this)
            })
            $(settings.page).mouseup(function(){ st_vars.stopped = true; })
            st_vars.left_buttons[i].addClass(settings.engaged_class)
            if (settings.l_btn_inject) st_vars.left_buttons[i].append($(settings.l_btn_inject))
            st_vars.right_buttons[i].addClass(settings.engaged_class)
            if (settings.r_btn_inject) st_vars.right_buttons[i].append($(settings.r_btn_inject))
            if (settings.l_btn_end_inject) st_vars.left_buttons[i].append($(settings.l_btn_end_inject))
            if (settings.r_btn_end_inject) st_vars.right_buttons[i].append($(settings.r_btn_end_inject))
            
            
            st_vars.left_buttons[i].mousedown(function(){
                st_vars.stopped = false
                internal.move(i,1)
            })
            st_vars.right_buttons[i].mousedown(function(){
                st_vars.stopped = false
                internal.move(i,-1)
            })
        },
        move: function(i,sgn){
            var lft = parseInt($(st_vars.tracks[i]).css("left"))+parseInt(sgn * settings.distance)
            if (st_vars.max_left <= lft) {
                lft = st_vars.max_left
                st_vars.stopped = true
                st_vars.left_buttons[i].addClass("greyout")
            } else if (st_vars.min_lefts[i] >= lft) {
                    lft = st_vars.min_lefts[i]
                    st_vars.stopped = true
                    st_vars.right_buttons[i].addClass("greyout")
            } else {
                st_vars.left_buttons[i].removeClass("greyout")
                st_vars.right_buttons[i].removeClass("greyout")
            }
            $(st_vars.tracks[i]).animate({"left":lft},settings.rate,settings.easing, function(){
                if (!st_vars.stopped) internal.move(i,sgn)
            })
        },
        
        activeDiv: function (i,d,f,args) {
            if (!!i){
                if (d) {
                    if ((typeof(i))=="object") d.attr(i)
                } else {
                    if ((typeof(i))=="string") d = $("<div>").attr("id",i)
                    else if ((typeof(i))=="object") d = $("<div>").attr(i)
                }
            }
            if (!!f) $(d).click(function(){f(args)})
            return d
        }
    };

})( jQuery );
