/*
// msCarousel - jquery.msCarousel.js
// author: Marghoob Suleman
// Date: 5th April, 2010
// Revision: 24
// Version: 1.6 {date: 7th July, 2010}
// web: www.marghoobsuleman.com
//*/
; (function($) {
    var msMyCarousel = function(element, opt) {
        var $this = this;
        var settings = $.extend({
            scrollSpeed: 1000,
            autoSlide: 0,
            defaultid: 0,
            widthMOZ: 515,
            heightMOZ: 258,
            widthIE8: 515,
            heightIE8: 258,
            widthIE7: 515,
            heightIE7: 258,
            blockWidth: 'auto',
            vertical: false,
            boxClass: '.set',
            messageClass: '.message',
            showMessage: false,
            messageOpacity: 0.8,
            loop: true,
            callback: ''
        }, opt);

        var _browser = '';

        if (jQuery.browser.msie == true) {
            if (jQuery.browser.version == '7.0') {
                _browser = 'IE7';
            } else if (jQuery.browser.version == '8.0') {
                _browser = 'IE8';
            }
        } else {
            _browser = 'MOZILLA';
        }

        var suffixed = { id: 'msc' };
        var carouselProp = new Object();
        var elementid = $(element).attr("id");
        var childid = elementid + "_mscchild";
        var unquieClass = elementid + "_mscss";
        var intervalid = 0;
        carouselProp.moveToZero = 0;

        function highlightNo(arg) {
            var caller = arg;
            var number = caller.getCurrentID();

            if (number == 0) {
                $(".carouselPrevious").css('visibility', 'hidden');
                $(".carouselNext").css('visibility', 'visible');
            } else if (number == (jQuery(jQuery('#' + elementid).next().find("ul > li:not('.carouselPrevious, .carouselNext')")).length - 1)) {
                $(".carouselPrevious").css('visibility', 'visible');
                $(".carouselNext").css('visibility', 'hidden');
            } else {
                $(".carouselPrevious, .carouselNext").css('visibility', 'visible');
            }

            jQuery(jQuery('#' + elementid).next().find('ul > li')).removeClass("active");
            jQuery(jQuery('#' + elementid).next().find('ul > li:eq(' + (number + 1) + ')')).addClass("active");
        }

        var init = function() {
            makeLayout();
        };
        var makeLayout = function() {
            addScrollerDiv();
        };
        var addScrollerDiv = function() {
            //alert("elementid"+elementid)
            $("#" + elementid).addClass("mscarousel");
            if (settings.vertical === false) {
                if (settings.boxClass != '.set') $("#" + elementid + " >" + settings.boxClass).addClass("set");
            };
            $("#" + elementid + " >" + settings.boxClass).addClass(unquieClass);
            var sDiv = '<div class="child" id="' + childid + '"></div>';
            $("#" + elementid).append(sDiv);

            switch (_browser) {
                case 'IE7':
                    $("#" + elementid).css({ width: settings.widthIE7 + 'px', height: settings.heightIE7 + 'px', overflow: 'hidden', position: 'relative' });
                    $("#" + sDiv).css({ width: settings.widthIE7 + 'px', height: settings.heightIE7 + 'px', overflow: 'hidden' });
                    if (settings.showMessage === true) {
                        $("#" + elementid + "  " + settings.messageClass).css({ display: 'none', width: settings.widthIE7 + 'px', opacity: settings.messageOpacity });
                    };
                    break;
                case 'IE8':
                    $("#" + elementid).css({ width: settings.widthIE8 + 'px', height: settings.heightIE8 + 'px', overflow: 'hidden', position: 'relative' });
                    $("#" + sDiv).css({ width: settings.widthIE8 + 'px', height: settings.heightIE8 + 'px', overflow: 'hidden' });
                    if (settings.showMessage === true) {
                        $("#" + elementid + "  " + settings.messageClass).css({ display: 'none', width: settings.widthIE8 + 'px', opacity: settings.messageOpacity });
                    };
                    break;
                case 'MOZILLA':
                    $("#" + elementid).css({ width: settings.widthMOZ + 'px', height: settings.heightMOZ + 'px', overflow: 'hidden', position: 'relative' });
                    $("#" + sDiv).css({ width: settings.widthMOZ + 'px', height: settings.heightMOZ + 'px', overflow: 'hidden' });
                    if (settings.showMessage === true) {
                        $("#" + elementid + "  " + settings.messageClass).css({ display: 'none', width: settings.widthMOZ + 'px', opacity: settings.messageOpacity });
                    };
                    break;
            }

            //insert intro scroller div
            $("#" + elementid + "  >." + unquieClass).appendTo($("#" + childid));
            $("#" + childid).append("<strong class='clear last'></strong>");
            var allElements = $("#" + childid + " >." + unquieClass);
            //update carouselProp
            carouselProp.allElements = allElements;
            //next previous

            var prop = calculateWidthHeight();
            //if horizontal
            if (settings.vertical === false) {
                $("#" + childid).css({ width: prop.width + 'px' });
            } else {
                //if vertical
                $("#" + childid).css({ height: prop.height + 'px' });
            };
            setClasses();
            if (settings.autoSlide > 0) {
                startInterval();
                carouselProp.isPlaying = true;
            };
            if (settings.defaultid > 0) {
                settings.defaultid = settings.defaultid - 1;
                next();
            } else if (settings.defaultid == 0) {
                settings.defaultid = -1;
                next();
            };
        };
        var setClasses = function() {
            //will do something later on this method
            var allElements = $("#" + childid + "  >." + unquieClass);
            if (settings.vertical === false) {
                if (settings.boxclass != '.set') $("#" + childid + "  " + settings.boxclass).addClass("set");
            };
            //set identifier class
            for (var iCount = 0; iCount < allElements.length; iCount++) {
                switch (_browser) {
                    case 'IE7':
                        $(allElements[iCount]).css('width', settings.widthIE7);
                        $(allElements[iCount]).css('height', settings.heightIE7);
                        break;
                    case 'IE8':
                        $(allElements[iCount]).css('width', settings.widthIE8);
                        $(allElements[iCount]).css('height', settings.heightIE8);
                        break;
                    case 'MOZILLA':
                        $(allElements[iCount]).css('width', settings.widthMOZ);
                        $(allElements[iCount]).css('height', settings.heightMOZ);
                        break;
                }
                $(allElements[iCount]).addClass(elementid + suffixed.id + "_" + iCount);
            };
            allElements = $("#" + childid + "  >." + unquieClass);
            carouselProp.allElements = allElements;
        };
        var next = function(isNext) {
            if (isNext === undefined) {
                if (settings.defaultid < carouselProp.allElements.length) {
                    settings.defaultid++;
                };
                if ((settings.defaultid == carouselProp.allElements.length || carouselProp.moveToZero >= 2) && settings.loop == true) {
                    settings.defaultid = 0;
                    carouselProp.moveToZero = 0;
                } else if (settings.loop == false && (settings.defaultid == carouselProp.allElements.length)) {
                    settings.defaultid--;
                };
            };
            if (isNext == 'fromGoto') {
                //i'll do something later
            };
            if (settings.defaultid < carouselProp.allElements.length) {
                if (carouselProp.currentItem !== undefined) {
                    carouselProp.previousItem = carouselProp.currentItem;
                };
                carouselProp.currentItem = childid + " > ." + elementid + suffixed.id + "_" + settings.defaultid;
                var pos = $("#" + carouselProp.currentItem).position();
                var tempw = $("#" + elementid).position().left + $("#" + carouselProp.currentItem).width();
                carouselProp.moveH = "-" + (pos.left) + "px";
                var pb = 0;
                var mb = 0;
                if ($("#" + carouselProp.currentItem).css("padding-bottom") != 'auto') {
                    pb = parseInt($("#" + carouselProp.currentItem).css("padding-bottom"));
                };
                if ($("#" + carouselProp.currentItem).css("margin-bottom") != 'auto') {
                    mb = parseInt($("#" + carouselProp.currentItem).css("margin-bottom"));
                };
                var vSpacer = pb + mb;
                carouselProp.moveV = "-" + (pos.top + vSpacer) + "px";
                carouselProp.currentID = settings.defaultid;
                scrollContent();
                if (settings.defaultid == carouselProp.allElements.length) {
                    settings.defaultid = 0;
                };
            };
        };
        var previous = function() {
            if (settings.defaultid > 0) {
                carouselProp.moveToZero = 0;
                settings.defaultid--;
                next("fromGoto");
            };
        };
        var afterScroll = function(evt) {
            //scroll message
            if ($("#" + carouselProp.currentItem + " " + settings.messageClass).length > 0 && settings.showMessage == true) {
                $("#" + carouselProp.currentItem + " " + settings.messageClass).fadeIn("slow", function() {
                    $(this).css({ opacity: settings.messageOpacity })
                });
            };
            //call back
            //alert("after scroll settings.callback "+settings.callback);
            if (settings.callback != '') {
                eval(settings.callback)($this);
            } else {
                highlightNo($this);
            };
            var lft = $("#" + childid).css("left");
            if (lft != undefined) {
                var lastItem = $(carouselProp.allElements[carouselProp.allElements.length - 1]).position();
                switch (_browser) {
                    case 'IE7':
                        if ((lastItem.left - Math.abs(lft.substr(0, lft.length - 2))) < settings.widthIE7) {
                            carouselProp.moveToZero++;
                            if (carouselProp.moveToZero >= 2 || settings.defaultid == carouselProp.allElements.length - 1) {
                                carouselProp.moveToZero = 0;
                            };
                        };
                        break;
                    case 'IE8':
                        if ((lastItem.left - Math.abs(lft.substr(0, lft.length - 2))) < settings.widthIE8) {
                            carouselProp.moveToZero++;
                            if (carouselProp.moveToZero >= 2 || settings.defaultid == carouselProp.allElements.length - 1) {
                                carouselProp.moveToZero = 0;
                            };
                        };
                        break;
                    case 'MOZILLA':
                        if ((lastItem.left - Math.abs(lft.substr(0, lft.length - 2))) < settings.widthMOZ) {
                            carouselProp.moveToZero++;
                            if (carouselProp.moveToZero >= 2 || settings.defaultid == carouselProp.allElements.length - 1) {
                                carouselProp.moveToZero = 0;
                            };
                        };
                        break;
                }
            }
        };
        var scrollContent = function() {
            if (carouselProp.previousItem != undefined && settings.showMessage == true) {
                $("#" + carouselProp.previousItem + " " + settings.messageClass).fadeOut("slow");
            };
            if (settings.vertical === false) {
                //scroll horizontal
                $("#" + childid).animate({ "left": carouselProp.moveH }, settings.scrollSpeed, function(evt) {
                    afterScroll(evt);
                });
            } else {
                //scroll vertical
                $("#" + childid).animate({ "top": carouselProp.moveV }, settings.scrollSpeed, function(evt) {
                    afterScroll(evt);
                });
            };
        };
        var calculateWidthHeight = function() {
            var prop = new Object();
            prop.width = 0;
            prop.height = 0;
            var allElements = $("#" + childid + " >" + settings.boxClass);
            if (settings.vertical === false) {
                //what is this?
                //I can calcuate by count :P
                //but i dont want to have fix width for each slide
                //alert("childid " +childid +" : " +settings.blockWidth)
                if (settings.blockWidth == 'auto') {
                    for (var iCount = 0; iCount < allElements.length; iCount++) {
                        //console.debug("childid " +childid + " : " +$(allElements[iCount]).width() + " : "+$(allElements[iCount]).css("width"))
                        prop.width += $(allElements[iCount]).width();
                        prop.height += $(allElements[iCount]).height(); //incase of vertical
                        //$(allElements[iCount]).addClass(elementid+suffixed.id+"_"+iCount);
                    };
                    //add spacer
                    //prop.width += ($(allElements[allElements.length-1]).width()*2);
                    //prop.width += 20;
                } else {
                    prop.width = settings.blockWidth * allElements.length;
                    prop.height = settings.height * allElements.length;
                };
                //alert("1 elementid "+elementid+ " width " +prop.width)
                prop.width += ($("#" + elementid).width() * 2);
            } else {
                switch (_browser) {
                    case 'IE7':
                        prop.width = settings.widthIE7;
                        prop.height = settings.heightIE7 * allElements.length;
                        break;
                    case 'IE8':
                        prop.width = settings.widthIE8;
                        prop.height = settings.heightIE8 * allElements.length;
                        break;
                    case 'MOZILLA':
                        prop.width = settings.widthMOZ;
                        prop.height = settings.heightMOZ * allElements.length;
                        break;
                }
            };
            return prop;
        };
        var startInterval = function() {
            clearInterval(intervalid);
            intervalid = setInterval(function() {
                next();
            }, settings.autoSlide);
            //alert(elementid);
            $("#" + elementid).bind("mouseover", function(arg) {
                $("#" + elementid).unbind("mouseout");
                endInterval();
                carouselProp.isPlaying = false;
            });
            carouselProp.isPlaying = true;

        };
        var endInterval = function() {
            clearInterval(intervalid);
            $("#" + elementid).unbind("mouseover");
            $("#" + elementid).bind("mouseout", function(arg) {
                startInterval();
            });
            carouselProp.isPlaying = false;
        };
        this.forceScroll = function(pos) {
            if (settings.vertical === false) {
                //scroll horizontal
                $("#" + childid).animate({ "left": pos }, settings.scrollSpeed, function(evt) {
                    afterScroll(evt);
                });
            } else {
                //scroll vertical
                $("#" + childid).animate({ "top": pos }, settings.scrollSpeed, function(evt) {
                    afterScroll(evt);
                });
            };
        };
        this.play = function() {
            if (settings.autoSlide > 0) {
                startInterval();
            };
        };
        this.pause = function() {
            if (settings.autoSlide > 0) {
                endInterval();
            };
        };
        this.next = function() {
            if (settings.defaultid == 0) {
                carouselProp.moveToZero = 0;
            }
            if (settings.autoSlide > 0) { endInterval() };
            next();
        };
        this.goto = function(no, force) {
            //console.debug(elementid +" no "+no + " carouselProp.moveToZero "+carouselProp.moveToZero)
            //|| no==carouselProp.allElements.length-1
            if (no == 0) {
                carouselProp.moveToZero = 0;
            }
            if (no > carouselProp.allElements.length - 1) {

            } else {
                settings.defaultid = no;
                next("fromGoto");
            };
        };
        this.previous = function() {
            if (settings.defaultid == 0) {
                carouselProp.moveToZero = 0;
            };
            if (settings.autoSlide > 0) { endInterval() };
            previous();
        };
        this.getCurrentID = function() {
            return settings.defaultid;
        };
        this.item = function(i) {
            if (i == undefined) {
                return carouselProp.allElements;
            } else {
                return carouselProp.allElements[i];
            };
        };
        //init
        init();
    };
    //now make object
    $.fn.msCarousel = function(opt) {
        return this.each(function() {
            var element = $(this);
            var myplugin = new msMyCarousel(element, opt);
            element.data("msCarousel", myplugin);
        });
    }
})(jQuery);
