/*
fd.travel.custom.js - for SMH and The Age
Modified: 2008-03-27 (Stephen Mok)
*/

if(window['FD']) {

  /* START Accordion Dependancies */
  Fx.Elements=new Class({Extends:Fx.CSS,initialize:function(B,A){this.elements=this.pass=$$(B);arguments.callee.parent(A)},compute:function(G,H,I){var C={};for(var D in G){var A=G[D],E=H[D],F=C[D]={};for(var B in A){F[B]=arguments.callee.parent(A[B],E[B],I)}}return C},set:function(B){for(var C in B){var A=B[C];for(var D in A){this.render(this.elements[C],D,A[D])}}return this},start:function(C){if(!this.check(C)){return this
  }var H={},I={};for(var D in C){var F=C[D],A=H[D]={},G=I[D]={};for(var B in F){var E=this.prepare(this.elements[D],B,F[B]);A[B]=E.from;G[B]=E.to}}return arguments.callee.parent(H,I)}});var Accordion=new Class({Extends:Fx.Elements,options:{display:0,show:false,height:true,width:false,opacity:true,fixedHeight:false,fixedWidth:false,wait:false,alwaysHide:false},initialize:function(){var C=Array.link(arguments,{"container":Element.type,"options":Object.type,"togglers":$defined,"elements":$defined});
  arguments.callee.parent(C.elements,C.options);this.togglers=$$(C.togglers);this.container=$(C.container);this.previous=-1;if(this.options.alwaysHide){this.options.wait=true}if($chk(this.options.show)){this.options.display=false;this.previous=this.options.show}if(this.options.start){this.options.display=false;this.options.show=false}this.effects={};if(this.options.opacity){this.effects.opacity="fullOpacity"
  }if(this.options.width){this.effects.width=this.options.fixedWidth?"fullWidth":"offsetWidth"}if(this.options.height){this.effects.height=this.options.fixedHeight?"fullHeight":"scrollHeight"}for(var B=0,A=this.togglers.length;B<A;B++){this.addSection(this.togglers[B],this.elements[B])}this.elements.each(function(E,D){if(this.options.show===D){this.fireEvent("onActive",[this.togglers[D],E])}else{for(var F in this.effects){E.setStyle(F,0)
  }}},this);if($chk(this.options.display)){this.display(this.options.display)}},addSection:function(E,C,G){E=$(E);C=$(C);var F=this.togglers.contains(E);var B=this.togglers.length;this.togglers.include(E);this.elements.include(C);if(B&&(!F||G)){G=$pick(G,B-1);E.inject(this.togglers[G],"before");C.inject(E,"after")}else{if(this.container&&!F){E.inject(this.container);C.inject(this.container)}}var A=this.togglers.indexOf(E);
  E.addEvent("click",this.display.bind(this,A));if(this.options.height){C.setStyles({"padding-top":0,"border-top":"none","padding-bottom":0,"border-bottom":"none"})}if(this.options.width){C.setStyles({"padding-left":0,"border-left":"none","padding-right":0,"border-right":"none"})}C.fullOpacity=1;if(this.options.fixedWidth){C.fullWidth=this.options.fixedWidth}if(this.options.fixedHeight){C.fullHeight=this.options.fixedHeight
  }C.setStyle("overflow","hidden");if(!F){for(var D in this.effects){C.setStyle(D,0)}}return this},display:function(A){A=($type(A)=="element")?this.elements.indexOf(A):A;if((this.timer&&this.options.wait)||(A===this.previous&&!this.options.alwaysHide)){return this}this.previous=A;var B={};this.elements.each(function(E,D){B[D]={};var C=(D!=A)||(this.options.alwaysHide&&(E.offsetHeight>0));this.fireEvent(C?"onBackground":"onActive",[this.togglers[D],E]);
  for(var F in this.effects){B[D][F]=C?0:E[this.effects[F]]}},this);return this.start(B)}})
  /* END Accordion Dependancies */

  FD.Travel = new Class({
    randomAdsUsed: [],
    randomAdsMax: 0,
    page: 1,
    initialize: function() {
      this._initAccordionAds();
      this._initRandomAds();
    },
    
    /* Accordion Ads */

	_initAccordionAds: function() {
		var accordionDiv = $('travelAccordion');
		var togglers = -1;
		var showIndex = 0;
		var accordion = new Accordion('h3.toggle', 'div.element', {
			opacity: false,
			onActive: function(toggler, element) {
				toggler.addClass('open');
				var iframe = element.getElement("iframe");
				if(iframe) {
					iframe.setStyle("visibility", "visible");
				}
			},
			onBackground: function(toggler, element) {
				toggler.removeClass('open');
				var iframe = element.getElement("iframe");
				if(iframe) {
					iframe.setStyle("visibility", "hidden");
				}
			},	
			show: -1,
			alwaysHide: true
		}, accordionDiv);
		togglers = accordionDiv.getElements('h3.toggle');
		if(togglers) {
			showIndex = Math.floor(Math.random() * togglers.length);
			accordion.display(showIndex);
		}
	},

    /* RANDOM ADs */
    
    _initRandomAds: function() {
      var travelAdHolder = $('travelAdHolder');
      if(travelAdHolder) {
        if(window['maxTravelAds'] && maxTravelAds > 0) {
          this.randomAdsMax = maxTravelAds;
        }
        if(window['baseTravelAd']) {
          this.baseTravelAd = baseTravelAd;
        }
        
        this._initTravelAdPositions();
        
        // Get the ad holder divs within the holder.
        var divs = travelAdHolder.getElements("div");
        
        // Determine page details
        this.travelPages = Math.ceil(this.randomAdsMax / divs.length);
        
        // Look for a current page specified
        var loc = window.location.href;
        if(loc.indexOf("#page") > -1) {
          var page = loc.substr(loc.indexOf("#page") + 5).toInt();
          if(page <= this.travelPages) {
            this.page = page;
            this._setPageDisplayNo(this.page);
          }
        }
        
        this._initTravelAdHolder();
        
        // Get the buttons
        this._initTravelAdNav();
      }
    },
    
    _getTravelDivs: function() {
      return $('travelAdHolder').getElements("div.travelAd");
    },
    
    _initTravelAdNav: function() {
      $('travelAdTools').getElements("a").addEvent("click", this._changeTravelAdPage.create({
        bind: this,
        event: true
      }));
    },
    
    _changeTravelAdPage: function(e) {
      if(e && e.target) {
        new Event(e).stop();
        var target = $(e.target);
        if(target.nodeName.toLowerCase() != "a") {
          target = target.getParent();
        }
        var page;
        if(target.hasClass("next") && this.page < this.travelPages) {
          page = this.page + 1;
        } else if(target.hasClass("prev") && this.page > 0) {
          page = this.page - 1;
        } else if(!isNaN(target.innerHTML)) {
          page = target.innerHTML.toInt();
        }
        if(page) {
          this.page = page;
          this._setPageNo(page);
          this._initTravelAdHolder();
        }
      }
    },
    
    _setPageDisplayNo: function(num) {
      var pageNumbers = $('travelAdTools').getElements("a");
      pageNumbers.removeClass("current");
      if(pageNumbers[this.page - 1]) {
        pageNumbers[this.page - 1].addClass("current");
      }
    },
    
    _setPageNo: function(num) {
      var loc = window.location.href;
      if(loc.indexOf("#page") > -1) {
        loc = loc.replace(/#page[0-9]+/i, "#page"+this.page);
      } else {
        loc += "#page"+this.page;
      }
      window.location.href = loc;
      this._setPageDisplayNo(num);
    },
    
    _initTravelAdPositions: function() {
      // Create a random number for each ad between 1 and the max number of ads
      var adArray = [];
      var x = 1;
      while(x < this.randomAdsMax + 1) {
        adArray.push(x);
        x++;
      }

      for (var x = adArray.length -1; x >= 0; --x) {
        var y = Math.floor(Math.random() * (x + 1));
        if (x == y) continue;
        var temp = adArray[x];
        adArray[x] = adArray[y];
        adArray[y] = temp;
      }
      this.adSpots = adArray;
    },
    
    _initTravelAdHolder: function() {
      var divs = this._getTravelDivs();
      var pageStart = divs.length * (this.page - 1);
      // Insert a random ad within each of them
      var x = 0, thisAd;
      while(thisAd = divs[x]) {
        var thisDiv = $("travelAd"+(x.toInt() + 1));
        var thisLoc = this.adSpots[pageStart + x];
        if(thisDiv) {
          thisDiv.empty();
          if(thisLoc) {
            thisDiv.setStyle("display", "block");
            var src = this.baseTravelAd.src.replace(/AAMSZ=3X[0-9]+/ig, "AAMSZ=3X"+thisLoc);
            this._createTravelAd($merge(this.baseTravelAd, {
              id: thisDiv,
              iframeId: "travelAdiFrame_"+x,
              src: src
            }));
          } else {
            thisDiv.setStyle("display", "none");
          }
        }
        x++;
      }
    }, 
    
    _createTravelAd: function(adObj) {
      if(adObj) {
        FD._spawnAd(adObj);
      }
    },
    
    _getNewTravelLoc: function() {
      return Math.round(Math.random() * (this.randomAdsMax - 1) + 1);
    }
  });

  var travelObj;
  function initTravel() {
    travelObj = new FD.Travel();
  }
  
  window.addEvent("initTravel", initTravel);
  FD.register("Travel");
}
