/**
 * Create an anonymous function to avoid library conflicts
 */
(function($) {
    /**
     * Add our plugin to the jQuery.fn object
     */
    $.fn.cac_scroller = function(options) {
        /**
         * Define some default settings
         */
        /* Default styles - should be in style sheet
        #pims {width: 200px;height: 150px;margin: 0 0 0px 0;padding: 0;float: left;text-align: center;border: thin solid #ccc;}
        #pims .pimsBack, .pims .pimsNext {width: 20px;height: 150px;visibility: hidden;}
        #pims .pimsBack {float: left;}
        #pims .pimsNext {float: right;}
        #pims .cacWindow {width: 160px;height: 140px;overflow: hidden;margin:0;padding:0;}
        #pims .cacContainer {width: 160px;margin:0;padding:0;height:150px;margin:0;padding: 0;}
        #pims .cacContainer li {width: 160px;list-style-type: none;display: inline-block;height:150px;float:left;padding:0;margin: 0;border-bottom: none;}

        */
        var defaults = {
            'background': 'none',
            'width': '600',
            'height': '200',
            'btn_back': '.cac_back',
            'btn_next': '.cac_next',
            'ajax_file' : '0',
            'data' : '0',
            'type' :'GET',
            'paging': '0',
            'paging_container':'.paging',
            'rows': '1',
            'columns' : '1',
            'total_elements' : '0'
        };
        /**
         * Merge the runtime options with the default settings
         */
        var options = $.extend({}, defaults, options);
        /**
         * Iterate through the collection of elements and
         * return the object to preserve method chaining
         */
        return this.each(function(i) {
            /**
             * Wrap the current element in an instance of jQuery
             */
            var $this = $(this);
            /**
             * Do our kick-ass thing
             */
            $this.css("background-color", options.background);

            var lis = new Array();
            var cols = options.columns;
            var rows = options.rows;
            var num_elements = $this.find('.cacContainer li').length;
            var total_elements = 0;
            var num_per_page = cols * rows;
            var pages = 0;
            var total_pages = 0;
            //var total_max_move;
            var page_num = 1;
            var str = '';
            //var max_move = 0;
            var move_to = 0;

            var window_height;
            var window_width;
            var total_window_width;
            var total_window_height;

            // container and child
            var cac_window = $this.find('.cacWindow');
            var container = $this.find('.cacContainer');
            var li_child = $this.find('.cacContainer li:first');

            var orig_li_width = parseInt($('.cacContainer li:first', $this).css('width'));
            var orig_li_height = parseInt($('.cacContainer li:first', $this).css('height'));

            var db_offset = 1;

            // buttons
            if(options.btn_back != '.cac_back') {
                var btn_back = $(options.btn_back);
            } else {
                var btn_back = $this.find(options.btn_back);
            }
            if(options.btn_next != '.cac_next') {
                var btn_next = $(options.btn_next);
            } else {
                var btn_next = $this.find(options.btn_next);
            }
            // show/hide buttons
            $(btn_back).parent().css('visibility','hidden');
            $(btn_next).parent().css('visibility','visible');

            // calculate pages
            if( num_elements % num_per_page != 0) {
                pages = parseInt(num_elements/num_per_page) + 1;
            } else {
                 pages = parseInt(num_elements/num_per_page);
            }
            build_stuff();

            // anim controls
            $(btn_next).parent().click(function(event) {
                event.preventDefault();
                move_next();
            });
            // anim controls
            $(btn_back).parent().click(function(event) {
                event.preventDefault();
                move_back();
            });
            function mover(move_to, direction)
            {
                if(direction == 'up') {
                    if(options.rows == '1') {
                        if( num_elements % num_per_page != 0) {
                            // check to see if last but one page
                            if(page_num == (total_pages -1)) {
                                var current_pos = parseInt($(container).css('margin-left'));
                                move_to = current_pos + ($('.cacContainer li ul:last', $this).parent().width()* -1)
                            }
                         }
                    }
                }
                //console.log('move_to ' + move_to)
                $(container).animate(
                { marginLeft: move_to },
                400,
                function() {
                    do_paging(direction);
                 });
            }
            function move_next()
            {
                if((num_per_page * page_num) < num_elements) {
                    move_to = ((window_width * (page_num + 1)) - window_width) * -1 ;
                    mover(move_to, 'up');
                }
                if((num_per_page * page_num) == num_elements) {
                    if(options.ajax_file != '0') {
                        do_ajax();
                     }
                }
            }
            function move_back()
            {
                if(page_num > 1) {
                    move_to = ((window_width * (page_num - 1)) - window_width) * -1 ;
                    mover(move_to, 'down');
                }
            }
            function do_paging(direction)
            {
                // set paging to hide if not wanted
                if(options.paging == '0') {
                    $this.find('.paging').css('display','none');
                }
                switch(direction) {
                    case 'up':
                        page_num = page_num + 1;
                        break;
                    case 'down':
                        page_num = page_num - 1;
                        break;
                    default:
                        page_num = 1;
                        break;
                }
                // add paging
                $this.find('.paging .page_num').html(page_num);
                // set buttons
                if(page_num == 1) {
                    $(btn_back).parent().css('visibility','hidden');
                } else {
                    $(btn_back).parent().css('visibility','visible');
                }
                // set buttons
                if(page_num == total_pages) {
                    $(btn_next).parent().css('visibility','hidden');
                } else {
                    $(btn_next).parent().css('visibility','visible');
                }
                    
            }
            function do_ajax()
            {
                db_offset = db_offset + 1;
                var data = options.data+'&page='+db_offset;
                if(options.ajax_file != '0') {
                    $.ajax({
                    url: options.ajax_file,
                    type: options.type,
                    data: data,
                    cache: false,
                    success: function (html) {
                        if (html) {
                            get_lis_temp(html);
                            build_li_string();
                            add_lis_to_container();
                            calculate_pages_and_container();
                            move_next();
                        } else {
                        }
                     }
                   });
                }
            }
            function build_stuff()
            {
               get_lis();              
               empty_container();
               build_li_string();
               add_lis_to_container();
               calculate_pages_and_container();
               // see if we need a next button
               if(page_num == total_pages) {
                    $(btn_next).parent().css('visibility','hidden');
                }
            }
            function get_lis()
            {
                lis = [];
                // build lis
                $this.find('.cacContainer li').each(function(i) {
                   lis.push($(this).html());
                });
            }
            function get_lis_temp(html)
            {
                // create temp container and put in temp container
                lis = [];
                $this.append('<div id="cac_temp"></div>');
                $this.find('#cac_temp').append(html);
                // build lis
                $this.find('.cac_temp li').each(function(i) {
                   lis.push($(this).html());
                });
                // remove temp container
                $this.find('#cac_temp').remove();
            }
            function add_lis_to_container()
            {
                // add new stuff to cacContainer
                $(container).append(str);
            }
            function empty_container()
            {
                // empty cac container
                $(container).empty();
            }
            function calculate_pages_and_container()
            {
                window_height = ($this.find('.inner li').outerHeight(true) * parseInt(options.rows));
                $(cac_window).css('height', window_height+'px');
                $this.css('height', window_height+'px');

                window_width = ($this.find('.inner li').outerWidth(true) * parseInt(options.columns));
                $(cac_window).css('width', window_width+'px');

                // set width of this to accomoadate for the buttons
                // first check to see if we have buttons
                if($(btn_next).parent().width() > 0) {
                    total_window_width = window_width + $(btn_back).parent().width() + $(btn_next).parent().width();
                } else {
                    total_window_width = window_width;
                }
                $this.css('width', total_window_width+'px');

                // set height of this to accomoadate for the paging
                // first check to see if we have paging
                if($this.find($('.paging')).height() > 0) {
                    total_window_height = window_height + $this.find($('.paging')).height();
                } else {
                    total_window_height = window_height;
                }
                $this.css('height', total_window_height+'px');

                num_elements = $this.find('.cacContainer .inner li').length;
                // calculate pages
                if( num_elements % num_per_page != 0) {
                    pages = parseInt(num_elements/num_per_page) + 1;
                } else {
                     pages = parseInt(num_elements/num_per_page);
                }
                // total pages
                if(options.ajax_file != '0') {
                    total_pages = parseInt($this.find('.total_pages').html());
                } else {
                    total_pages = pages;
                    if(options.paging != '0') {
                        $this.find('.total_pages').html(total_pages);
                    }
                }
                // set width of container
                $(container).css('width', (pages * window_width)+'px');

                // set width of container li
                $('.cacContainer li', $this).css('width', window_width+'px');

                // set width of container li ul
                $('.cacContainer li ul', $this).css('width', window_width+'px');

                // set width of inner li
                $this.find('.inner li').css('width', orig_li_width);

                // heights

                // set height of container
                $(container).css('height', window_height+'px');

                // set height of container li
                $('.cacContainer li', $this).css('height', window_height+'px');

                // set height of container li ul
                $('.cacContainer li ul', $this).css('height', window_height+'px');

                // set height of inner li
                $this.find('.inner li').css('height', orig_li_height);

                // check to see if we need to make last ul smaller
                if(options.rows == '1') {
                    if( num_elements % num_per_page != 0) {
                        var last_width = (num_elements - ((pages-1) * num_per_page)) * parseInt($this.find('.inner li').outerWidth(true));
                        var last_con_width = (parseInt($(container).css('width')) - window_width) + last_width;

                        // set width of container
                        $(container).css('width', last_con_width+'px');

                        // set width of container li
                        $('.cacContainer li ul:last', $this).parent().css('width', last_width+'px');

                        // set width of container li ul
                        $('.cacContainer li ul:last', $this).css('width', last_width+'px');
                    }
                }
            }
            function build_li_string()
            {
                var pages = 0;
                var i = 0;
                var j = 0;
                var k = 0;
                str = '';
                // calculate pages
                if( lis.length % num_per_page != 0) {
                    pages = parseInt(lis.length/num_per_page) + 1;
                } else {
                    pages = parseInt(lis.length/num_per_page);
                }
                // build string
                for(i = 0; i < pages; i++) {
                    str = str + '<li><ul class="inner">';
                    for(j = 0; j < num_per_page; j++) {
                        if(k < lis.length) {
                            str = str + '<li style="width:'+orig_li_width+';height:'+orig_li_height+'">'+lis[k]+'</li>';
                        }
                        k++;
                    }
                    str = str + '</ul></li>';
                    j = 0;
                }
            }
        });
    };

})(jQuery);



