﻿/*
*
* jQuery Co3 Bannershifter plugin
* 
* Version 1.0.1
* 31. August 2009
*
* Co3 Interaktivt kompetencebureau
* www.co3.dk
*
* Developer
* Rune Øllgaard Grønkjær
* rg@co3.dk
*
* Created with jQuery v1.3.2
* Tested with jQuery v1.3.2
*
* Useage:
* Creates a simple rotation between several html elements. The elements can contain both flash, images or simple html.
* When a flash is loaded the script calls a free of choice actionscript function in the flash. The same happens when the flash is removed.
*
* Settings:
* {
*   shiftStyle: "fadewhite", //fade, fadewhite
*   fadefrontColor: "#ffffff",
*   globalShowTime: 3000,
*   bannerSelector: "",
*   shiftSpeed: 2000,
*   resizeSpeed: 500,
*   startDelay: 3000,
*   fadeStart: function () { },
*   fadeEnd: function () { }
* }
* Changelog:
* Version 0.1:
* Created: 05. August 2009
*
* Version 0.2:
* Created: 31. August 2009
* Changed: The bannershifter now shows the first banner from the beginning
*
* Version 1.0:
* Created: 02. September 2009
* Changed: Mindre rettelse til fade funktionen, som ikke fik sat det forrige banner display none når den blev fjernet.
*
* Version 1.0.1:
* Created: 06. January 2010
* Changed: Har rettet fejl der opstod når der kun var et banner
*
* Version 1.1:
* Created: 23. juli 2010
* Changed: 
* Added the fadeStart and fadeEnd events
* Added the startShift and stopShift methods, 
* wich can start and stop the slideshow.
*
*/

jQuery.fn.startBannerShift = function (settings) {
  var bannerWrap = this, co3BannerShift = null;
  //Settings
  settings = jQuery.extend({
    shiftStyle: "fadewhite", //fade, fadewhite
    fadefrontColor: "#ffffff",
    globalShowTime: 3000,
    bannerSelector: "",
    shiftSpeed: 2000,
    resizeSpeed: 500,
    startDelay: 3000,
    fadeStart: function () { },
    fadeEnd: function () { }
  }, settings);

  var allBanners = this.children(settings.bannerSelector);
  if (allBanners.length > 0) {
    if (settings.bannerSelector !== "") {
      this.children().not(settings.bannerSelector).remove();
    }
    co3BannerShift = new jQuery.Co3BannerShift(bannerWrap, allBanners, settings);
  }
  return co3BannerShift;
};

jQuery.Co3BannerShift = function (bannerWrap, banners, settings) {
  var co3BannerShift = this;
  co3BannerShift.banners = banners;
  co3BannerShift.lastW = 0;
  co3BannerShift.lastH = 0;
  co3BannerShift.settings = settings;
  co3BannerShift.maxWidth = 0;
  co3BannerShift.maxHeight = 0;
  co3BannerShift.banners = banners;

  co3BannerShift.blockShowSpeed = co3BannerShift.blockHideSpeed = settings.shiftSpeed / 2;
  co3BannerShift.resizeSpeed = settings.resizeSpeed;

  co3BannerShift.banners.css("position", "absolute").css("top", 0).css("left", 0);
  for (var i = 0; i < co3BannerShift.banners.length; i++) {
    var thisBanner = jQuery(co3BannerShift.banners[i]);
    if (i > 0) {
      thisBanner.css("display", "none");
    }
    thisBanner.attr("Co3BannerShiftNo", i);
    if (co3BannerShift.maxWidth < thisBanner.outerWidth()) {
      co3BannerShift.maxWidth = thisBanner.outerWidth();
    }
    var test = thisBanner.outerWidth();
    var test1 = co3BannerShift.maxHeight;
    if (co3BannerShift.maxHeight < thisBanner.outerHeight()) {
      co3BannerShift.maxHeight = thisBanner.outerHeight();
    }
  }
  co3BannerShift.stop = false;
  co3BannerShift.co3BannerWrap = bannerWrap;
  co3BannerShift.co3BannerWrap.css("position", "relative").css("overflow", "hidden");
  co3BannerShift.co3BannerWrapBlock = jQuery('<div class="co3BannerShiftWrapBlock"></div>');
  co3BannerShift.co3BannerWrapBlock.css("backgroundColor", co3BannerShift.settings.fadefrontColor).css("position", "absolute").css("top", 0).css("left", 0).css("display", "none").width(co3BannerShift.maxWidth).height(co3BannerShift.maxHeight);
  co3BannerShift.co3BannerWrap = co3BannerShift.banners.parent();
  co3BannerShift.co3BannerWrap.append(co3BannerShift.co3BannerWrapBlock);


  co3BannerShift.nextBanner = banners.eq(1);
  co3BannerShift.lastBanner = banners.eq(0);
  co3BannerShift.banner = co3BannerShift.lastBanner;
  if (banners.length > 1) {
    window.setTimeout(function () {
      co3BannerShift.showBanner();
    }, settings.startDelay);
  }
};

jQuery.Co3BannerShift.prototype.stopShift = function () {
  var co3BannerShift = this;
  co3BannerShift.stop = true;
  //  jQuery(".co3BannerShiftWrapBlock").remove();
  //  co3BannerShift.banners.css({display: "block", opacity: 1});
};

jQuery.Co3BannerShift.prototype.startShift = function () {
  var co3BannerShift = this;
  co3BannerShift.stop = false;
  co3BannerShift.showBanner();

  //  jQuery(".co3BannerShiftWrapBlock").remove();
  //  co3BannerShift.banners.css({display: "block", opacity: 1});
};

jQuery.Co3BannerShift.prototype.showBanner = function (showFirstFromStart) {
  var co3BannerShift = this;
  if (co3BannerShift.stop) {
    return;
  }

  co3BannerShift.settings.fadeStart(co3BannerShift.banner);
  co3BannerShift.callFlash(false);

  switch (co3BannerShift.settings.shiftStyle) {
    case "fade":
      co3BannerShift.fade();
      break;
    case "fadewhite":
      co3BannerShift.fadeWhite();
      break;
    default:
      co3BannerShift.fadeWhite();
      break;
  }

};

jQuery.Co3BannerShift.prototype.fadeWhite = function () {

  var co3BannerShift = this;
  co3BannerShift.banner = co3BannerShift.nextBanner;

  var w = co3BannerShift.banner.outerWidth();
  var h = co3BannerShift.banner.outerHeight();


  co3BannerShift.co3BannerWrapBlock.animate({ opacity: 1 }, co3BannerShift.blockShowSpeed, function () {
    co3BannerShift.co3BannerWrapBlock.css("display", "block");
    if (co3BannerShift.lastBanner) {

      co3BannerShift.lastBanner.css("display", "none");
    }
    co3BannerShift.banner.css("display", "block");
    if (w !== co3BannerShift.lastW || h !== co3BannerShift.lastH) {
      co3BannerShift.co3BannerWrap.animate({ width: w, height: h }, co3BannerShift.resizeSpeed, function () {
        co3BannerShift.co3BannerWrapBlock.animate({ opacity: 0 }, co3BannerShift.blockHideSpeed,
        function () {
          co3BannerShift.co3BannerWrapBlock.css("display", "none");
          co3BannerShift.readyNextBanner(w, h, co3BannerShift.banner);
        });
      });
    } else {
      co3BannerShift.co3BannerWrapBlock.animate({ opacity: 0 }, co3BannerShift.blockHideSpeed,
        function () {
          co3BannerShift.co3BannerWrapBlock.css("display", "none");
          co3BannerShift.readyNextBanner(w, h, co3BannerShift.banner);
        });
    }

  });
};

jQuery.Co3BannerShift.prototype.fade = function () {

  var co3BannerShift = this;
  var lastBanner = co3BannerShift.banner;
  co3BannerShift.banner = co3BannerShift.nextBanner;

  var w = co3BannerShift.banner.outerWidth();
  var h = co3BannerShift.banner.outerHeight();


  if (w !== co3BannerShift.lastW || h !== co3BannerShift.lastH) {
    co3BannerShift.co3BannerWrap.animate({ width: w, height: h }, co3BannerShift.resizeSpeed, function () {
      if (lastBanner) {
        lastBanner.animate({ opacity: 0 }, co3BannerShift.blockHideSpeed);
      }
      co3BannerShift.banner.css("opacity", 0).css("display", "block");
      co3BannerShift.banner.animate({ opacity: 1 }, co3BannerShift.blockHideSpeed, function () {
        try {
          co3BannerShift.banner[0].style.removeAttribute("filter");
        } catch (ex) { }
        if (lastBanner) {
          lastBanner.css("display", "none");
        }
        co3BannerShift.readyNextBanner(w, h, co3BannerShift.banner);
        co3BannerShift.settings.fadeEnd(co3BannerShift.banner);
      });
    });
  } else {
    co3BannerShift.co3BannerWrap.animate({ width: w, height: h }, co3BannerShift.resizeSpeed, function () {
      if (lastBanner) {
        lastBanner.animate({ opacity: 0 }, co3BannerShift.blockHideSpeed);
      }
      co3BannerShift.banner.css("opacity", 0).css("display", "block");
      co3BannerShift.banner.animate({ opacity: 1 }, co3BannerShift.blockHideSpeed, function () {
        try {
          co3BannerShift.banner[0].style.removeAttribute("filter");

        } catch (ex) { }
        if (lastBanner) {
          lastBanner.css("display", "none");
        }
        co3BannerShift.readyNextBanner(w, h, co3BannerShift.banner);
        co3BannerShift.settings.fadeEnd(co3BannerShift.banner);
      });
    });
  }

};


jQuery.Co3BannerShift.prototype.readyNextBanner = function (w, h, banner) {
  var co3BannerShift = this;
  if (co3BannerShift.banners.length > 1) {
    co3BannerShift.lastW = w;
    co3BannerShift.lastH = h;
    for (var i = 0; i < co3BannerShift.banners.length; i++) {
      if (jQuery(co3BannerShift.banners[i]).attr("Co3BannerShiftNo") === co3BannerShift.nextBanner.attr("Co3BannerShiftNo")) {
        if (i + 1 === co3BannerShift.banners.length) {
          co3BannerShift.nextBanner = jQuery(co3BannerShift.banners[0]);
        } else {
          co3BannerShift.nextBanner = jQuery(co3BannerShift.banners[i + 1]);
        }
        var showTime = parseInt(banner.attr("showTime"));
        showTime = showTime > 0 ? showTime : co3BannerShift.settings.globalShowTime;
        window.setTimeout(function () {
          co3BannerShift.showBanner();
        }, showTime);
        break;
      }
    }

  }
  co3BannerShift.lastBanner = banner;
  co3BannerShift.callFlash(true);
};

jQuery.Co3BannerShift.prototype.callFlash = function (isStart) {
  var co3BannerShift = this;
  if (co3BannerShift.lastBanner) {
    var fn = co3BannerShift.lastBanner.attr(isStart ? "startFn" : "endFn");
    if (fn && fn !== "") {
      var possibleFlash = co3BannerShift.lastBanner.find("object");
      var timeout = BrowserDetect.browser.toLowerCase() === "safari" && isStart ? 300 : 0; //CRAP SAFARI!!!
      window.setTimeout(function () {
        try {
          eval('possibleFlash[0].' + fn);
        } catch (e) {
          //alert("e.message: " + e.message + " - possibleFlash[0].fn: " + fn + " - possibleFlash: " + possibleFlash.length);
        }
      }, timeout);
    }
  }
};

/* Browser detection Code START */
//Hentet fra http://www.quirksmode.org/js/detect.html
var BrowserDetect = {
  init: function () {
    this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
    this.version = this.searchVersion(navigator.userAgent) || this.searchVersion(navigator.appVersion) || "an unknown version";
    this.OS = this.searchString(this.dataOS) || "an unknown OS";
  },
  searchString: function (data) {
    for (var i = 0; i < data.length; i++) {
      var dataString = data[i].string;
      var dataProp = data[i].prop;
      this.versionSearchString = data[i].versionSearch || data[i].identity;
      if (dataString) {
        if (dataString.indexOf(data[i].subString) != -1) {
          return data[i].identity;
        }
      }
      else if (dataProp) {
        return data[i].identity;
      }
    }
  },
  searchVersion: function (dataString) {
    var index = dataString.indexOf(this.versionSearchString);
    if (index == -1) {
      return;
    }
    return parseFloat(dataString.substring(index + this.versionSearchString.length + 1));
  },
  dataBrowser: [
		{ string: navigator.userAgent,
		  subString: "OmniWeb",
		  versionSearch: "OmniWeb/",
		  identity: "OmniWeb"
		},
		{
		  string: navigator.vendor,
		  subString: "Apple",
		  identity: "Safari"
		},
		{
		  prop: window.opera,
		  identity: "Opera"
		},
		{
		  string: navigator.vendor,
		  subString: "iCab",
		  identity: "iCab"
		},
		{
		  string: navigator.vendor,
		  subString: "KDE",
		  identity: "Konqueror"
		},
		{
		  string: navigator.userAgent,
		  subString: "Firefox",
		  identity: "Firefox"
		},
		{
		  string: navigator.vendor,
		  subString: "Camino",
		  identity: "Camino"
		},
		{		// for newer Netscapes (6+)
		  string: navigator.userAgent,
		  subString: "Netscape",
		  identity: "Netscape"
		},
		{
		  string: navigator.userAgent,
		  subString: "MSIE",
		  identity: "Explorer",
		  versionSearch: "MSIE"
		},
		{
		  string: navigator.userAgent,
		  subString: "Gecko",
		  identity: "Mozilla",
		  versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
		  string: navigator.userAgent,
		  subString: "Mozilla",
		  identity: "Netscape",
		  versionSearch: "Mozilla"
		}
	],
  dataOS: [
		{
		  string: navigator.platform,
		  subString: "Win",
		  identity: "Windows"
		},
		{
		  string: navigator.platform,
		  subString: "Mac",
		  identity: "Mac"
		},
		{
		  string: navigator.platform,
		  subString: "Linux",
		  identity: "Linux"
		}
	]

};
BrowserDetect.init();

/* Browser detection Code END */
