/**
 * Coin Slider - Unique jQuery Image Slider
 * @version: 1.0 - (2010/04/04)
 * @requires jQuery v1.2.2 or later 
 * @author Ivan Lazarevic
 * Examples and documentation at: http://workshop.rs/projects/coin-slider/
 
 * Licensed under MIT licence:
 *   http://www.opensource.org/licenses/mit-license.php
**/

(function ($) {
    var params = new Array; var order = new Array; var images = new Array; var links = new Array; var linksTarget = new Array; var titles = new Array; var interval = new Array; var imagePos = new Array; var appInterval = new Array; var squarePos = new Array; var reverse = new Array; $.fn.coinslider = $.fn.CoinSlider = function (options) {
        init = function (el) {
            order[el.id] = new Array(); images[el.id] = new Array(); links[el.id] = new Array(); linksTarget[el.id] = new Array(); titles[el.id] = new Array(); imagePos[el.id] = 0; squarePos[el.id] = 0; reverse[el.id] = 1; params[el.id] = $.extend({}, $.fn.coinslider.defaults, options); $.each($('#' + el.id + ' img'), function (i, item) { images[el.id][i] = $(item).attr('src'); links[el.id][i] = $(item).parent().is('a') ? $(item).parent().attr('href') : ''; linksTarget[el.id][i] = $(item).parent().is('a') ? $(item).parent().attr('target') : ''; titles[el.id][i] = $(item).next().is('div') ? $(item).next().html() : ''; $(item).hide(); $(item).next().hide(); }); $(el).css({ 'background-image': 'url(' + images[el.id][0] + ')', 'width': params[el.id].width, 'height': params[el.id].height, 'position': 'relative', 'background-position': 'top left', 'background-repeat': 'no-repeat' }).wrap("<div class='coin-slider' id='coin-slider-" + el.id + "' />"); $('#' + el.id).append("<div class='cs-title' id='cs-title-" + el.id + "' style='position: absolute; bottom:0; left: 0; z-index: 1000;'></div>"); $.setFields(el); if (params[el.id].navigation)
                $.setNavigation(el); $.transition(el, 0); $.transitionCall(el);
        }
        $.setFields = function (el) {
            tWidth = sWidth = parseInt(params[el.id].width / params[el.id].spw); tHeight = sHeight = parseInt(params[el.id].height / params[el.id].sph); counter = sLeft = sTop = 0; tgapx = gapx = params[el.id].width - params[el.id].spw * sWidth; tgapy = gapy = params[el.id].height - params[el.id].sph * sHeight; for (i = 1; i <= params[el.id].sph; i++) {
                gapx = tgapx; if (gapy > 0) { gapy--; sHeight = tHeight + 1; } else { sHeight = tHeight; }
                for (j = 1; j <= params[el.id].spw; j++) {
                    if (gapx > 0) { gapx--; sWidth = tWidth + 1; } else { sWidth = tWidth; }
                    order[el.id][counter] = i + '' + j; counter++; if (params[el.id].links)
                        $('#' + el.id).append("<a href='" + links[el.id][0] + "' class='cs-" + el.id + "' id='cs-" + el.id + i + j + "' style='width:" + sWidth + "px; height:" + sHeight + "px; float: left; position: absolute;'></a>"); else
                        $('#' + el.id).append("<div class='cs-" + el.id + "' id='cs-" + el.id + i + j + "' style='width:" + sWidth + "px; height:" + sHeight + "px; float: left; position: absolute;'></div>"); $("#cs-" + el.id + i + j).css({ 'background-position': -sLeft + 'px ' + (-sTop + 'px'), 'left': sLeft, 'top': sTop }); sLeft += sWidth;
                }
                sTop += sHeight; sLeft = 0;
            }
            $('.cs-' + el.id).mouseover(function () { $('#cs-navigation-' + el.id).show(); }); $('.cs-' + el.id).mouseout(function () { $('#cs-navigation-' + el.id).hide(); }); $('#cs-title-' + el.id).mouseover(function () { $('#cs-navigation-' + el.id).show(); }); $('#cs-title-' + el.id).mouseout(function () { $('#cs-navigation-' + el.id).hide(); }); if (params[el.id].hoverPause) { $('.cs-' + el.id).mouseover(function () { params[el.id].pause = true; }); $('.cs-' + el.id).mouseout(function () { params[el.id].pause = false; }); $('#cs-title-' + el.id).mouseover(function () { params[el.id].pause = true; }); $('#cs-title-' + el.id).mouseout(function () { params[el.id].pause = false; }); }
        }; $.transitionCall = function (el) { clearInterval(interval[el.id]); delay = params[el.id].delay + params[el.id].spw * params[el.id].sph * params[el.id].sDelay; interval[el.id] = setInterval(function () { $.transition(el) }, delay); }
        $.transition = function (el, direction) {
            if (params[el.id].pause == true) return; $.effect(el); squarePos[el.id] = 0; appInterval[el.id] = setInterval(function () { $.appereance(el, order[el.id][squarePos[el.id]]) }, params[el.id].sDelay); $(el).css({ 'background-image': 'url(' + images[el.id][imagePos[el.id]] + ')' }); if (typeof (direction) == "undefined")
                imagePos[el.id]++; else
                if (direction == 'prev')
                    imagePos[el.id]--; else
                    imagePos[el.id] = direction; if (imagePos[el.id] == images[el.id].length) { imagePos[el.id] = 0; }
            if (imagePos[el.id] == -1) { imagePos[el.id] = images[el.id].length - 1; }
            $('.cs-button-' + el.id).removeClass('cs-active'); $('#cs-button-' + el.id + "-" + (imagePos[el.id] + 1)).addClass('cs-active'); if (titles[el.id][imagePos[el.id]]) { $('#cs-title-' + el.id).css({ 'opacity': 0 }).animate({ 'opacity': params[el.id].opacity }, params[el.id].titleSpeed); $('#cs-title-' + el.id).html(titles[el.id][imagePos[el.id]]); } else { $('#cs-title-' + el.id).css('opacity', 0); }
        }; $.appereance = function (el, sid) {
            $('.cs-' + el.id).attr('href', links[el.id][imagePos[el.id]]).attr('target', linksTarget[el.id][imagePos[el.id]]); if (squarePos[el.id] == params[el.id].spw * params[el.id].sph) { clearInterval(appInterval[el.id]); return; }
            $('#cs-' + el.id + sid).css({ opacity: 0, 'background-image': 'url(' + images[el.id][imagePos[el.id]] + ')' }); $('#cs-' + el.id + sid).animate({ opacity: 1 }, 300); squarePos[el.id]++;
        }; $.setNavigation = function (el) {
            $(el).append("<div id='cs-navigation-" + el.id + "'></div>"); $('#cs-navigation-' + el.id).hide(); $('#cs-navigation-' + el.id).append("<a href='#' id='cs-prev-" + el.id + "' class='cs-prev'>prev</a>"); $('#cs-navigation-' + el.id).append("<a href='#' id='cs-next-" + el.id + "' class='cs-next'>next</a>"); $('#cs-prev-' + el.id).css({ 'position': 'absolute', 'top': params[el.id].height / 2 - 15, 'left': 0, 'z-index': 1001, 'line-height': '30px', 'opacity': params[el.id].opacity }).click(function (e) { e.preventDefault(); $.transition(el, 'prev'); $.transitionCall(el); }).mouseover(function () { $('#cs-navigation-' + el.id).show() }); $('#cs-next-' + el.id).css({ 'position': 'absolute', 'top': params[el.id].height / 2 - 15, 'right': 0, 'z-index': 1001, 'line-height': '30px', 'opacity': params[el.id].opacity }).click(function (e) { e.preventDefault(); $.transition(el); $.transitionCall(el); }).mouseover(function () { $('#cs-navigation-' + el.id).show() }); $("<div id='cs-buttons-" + el.id + "' class='cs-buttons'></div>").appendTo($('#coin-slider-' + el.id)); $('#coin-slider-' + el.id).css({ 'width': params[el.id].width }); for (k = 1; k < images[el.id].length + 1; k++) { $('#cs-buttons-' + el.id).append("<a href='#' class='cs-button-" + el.id + "' id='cs-button-" + el.id + "-" + k + "'>" + k + "</a>"); }
            $.each($('.cs-button-' + el.id), function (i, item) { $(item).click(function (e) { $('.cs-button-' + el.id).removeClass('cs-active'); $(this).addClass('cs-active'); e.preventDefault(); $.transition(el, i); $.transitionCall(el); }) }); $('#cs-navigation-' + el.id + ' a').mouseout(function () { $('#cs-navigation-' + el.id).hide(); params[el.id].pause = false; }); $("#cs-buttons-" + el.id).css({ 'left': '50%', 'margin-left': -images[el.id].length * 15 / 2 - 5, 'position': 'relative' });
        }
        $.effect = function (el) {
            effA = ['random', 'swirl', 'rain', 'straight']; if (params[el.id].effect == '')
                eff = effA[Math.floor(Math.random() * (effA.length))]; else
                eff = params[el.id].effect; order[el.id] = new Array(); if (eff == 'random') {
                counter = 0; for (i = 1; i <= params[el.id].sph; i++) { for (j = 1; j <= params[el.id].spw; j++) { order[el.id][counter] = i + '' + j; counter++; } }
                $.random(order[el.id]);
            }
            if (eff == 'rain') { $.rain(el); }
            if (eff == 'swirl')
                $.swirl(el); if (eff == 'straight')
                $.straight(el); reverse[el.id] *= -1; if (reverse[el.id] > 0) { order[el.id].reverse(); }
        }
        $.random = function (arr) { var i = arr.length; if (i == 0) return false; while (--i) { var j = Math.floor(Math.random() * (i + 1)); var tempi = arr[i]; var tempj = arr[j]; arr[i] = tempj; arr[j] = tempi; } }
        $.swirl = function (el) {
            var n = params[el.id].sph; var m = params[el.id].spw; var x = 1; var y = 1; var going = 0; var num = 0; var c = 0; var dowhile = true; while (dowhile) {
                num = (going == 0 || going == 2) ? m : n; for (i = 1; i <= num; i++) { order[el.id][c] = x + '' + y; c++; if (i != num) { switch (going) { case 0: y++; break; case 1: x++; break; case 2: y--; break; case 3: x--; break; } } }
                going = (going + 1) % 4; switch (going) { case 0: m--; y++; break; case 1: n--; x++; break; case 2: m--; y--; break; case 3: n--; x--; break; }
                check = $.max(n, m) - $.min(n, m); if (m <= check && n <= check)
                    dowhile = false;
            }
        }
        $.rain = function (el) {
            var n = params[el.id].sph; var m = params[el.id].spw; var c = 0; var to = to2 = from = 1; var dowhile = true; while (dowhile) {
                for (i = from; i <= to; i++) { order[el.id][c] = i + '' + parseInt(to2 - i + 1); c++; }
                to2++; if (to < n && to2 < m && n < m) { to++; }
                if (to < n && n >= m) { to++; }
                if (to2 > m) { from++; }
                if (from > to) dowhile = false;
            }
        }
        $.straight = function (el) { counter = 0; for (i = 1; i <= params[el.id].sph; i++) { for (j = 1; j <= params[el.id].spw; j++) { order[el.id][counter] = i + '' + j; counter++; } } }
        $.min = function (n, m) { if (n > m) return m; else return n; }
        $.max = function (n, m) { if (n < m) return m; else return n; }
        this.each(function () { init(this); });
    }; $.fn.coinslider.defaults = { width: 565, height: 290, spw: 7, sph: 5, delay: 3000, sDelay: 30, opacity: 0.7, titleSpeed: 500, effect: '', navigation: true, links: true, hoverPause: true };
})(jQuery);
