﻿/* =global.js
   v1.0 - 2006-07-26 - Authored by Matt Nish-Lapidus - mnish-lapidus@theniceagency.com
   v1.1 - 2010-09-14 - Thrillworks
*/

/* find the number of banners */
function numberOfBigDaddys() {
  var i = 1;  // initalize to 1
  while( document.getElementById( 'banner' + i ) ) { i++; }
  return i - 1; // subtract the inital value
}

/*randomizes banner display on the homepage */
function setBigDaddy() {
  var n = numberOfBigDaddys();  
  var r = Math.floor(Math.random()*n)+1;
  document.getElementById('banner'+r).style.display='block';
}


// clears the default text from the global keyword search field in the header
function clearKeywordSearch(e){
document.getElementById('txt_keyword').style.fontStyle="normal";
document.getElementById('txt_keyword').style.color="#000000";
if(e.value=='Search')e.value="";
if(e.value=='Rechercher')e.value="";
}

// restores the default text to the global keyword search field in the header
function restoreDefaultKeywordSearch(lang){
if(lang=='fr'){
    if(document.getElementById('txt_keyword').value.length<1){ 
    //document.getElementById('txt_keyword').style.fontStyle="italic";
    //document.getElementById('txt_keyword').style.color="#999999";
    document.getElementById('txt_keyword').value = 'Rechercher';
    }
    }
     
if(lang=='en'){
    if(document.getElementById('txt_keyword').value.length<1){ 
    //document.getElementById('txt_keyword').style.fontStyle="italic";
    //document.getElementById('txt_keyword').style.color="#999999";
    document.getElementById('txt_keyword').value = 'Search';
    }
    }
}




// for the year select on the ranking pages

function printMe () {
 window.print();
}
function yearSelect (year) {
 var content = document.getElementsByClassName("year");
 for (var i = 0; i < content.length; i++) {
  if (content[i].id == year) {
   Element.show(content[i]);
  } else {
   Element.hide(content[i]);
  }
 } 
 
 var btns = document.getElementsByClassName("js_btnYear");
 for (var i = 0; i < btns.length; i++) {
  if (btns[i].title == year) {
   Element.addClassName(btns[i], "active");
  } else {
   Element.removeClassName(btns[i], "active");
  }
 }
}
// fixes the dropdown menus for IE/Win.  Adds "over" class to compensate for lack of :hover psudoclass
function startList () {
 if (document.all && document.getElementById) {
  navRoot = document.getElementById("mainNav");
  for (i=0; i<navRoot.childNodes.length; i++) {
   node = navRoot.childNodes[i];
   if (node.nodeName=="LI") {
    node.onmouseover=function() {
     this.className+=" over";
    }
    node.onmouseout=function() {
     this.className=this.className.replace(" over", "");
    }
   }
  }
 }
}
// a method for extending class in js
Class.extend = function(subclass, superclass) {
  function D() {}
  D.prototype = superclass.prototype;
  subclass.prototype = new D();
  subclass.prototype.constructor = subclass;
  subclass.superclass = superclass;
  subclass.superproto = superclass.prototype;
}
 /**
  * Root Class
  * @author Matt Nish-Lapidus
  * 
  * Creates elements that are common to all other classes in this file
  */
Root = function () { 
  this.target = Object;
  this.block = Object;
 }
 Root.prototype.assignBtns = function (jsClass) {
  var ref = this;
  var btns = document.getElementsByClassName(jsClass, this.block);
  btns.each( function (obj) {
    // Brad changed event handler from "onmouseup" to "onclick"
    // so that he could manually fire the "click()" method for an icon.
    // (There is no such thing as a "mouseup()" method).
    //
    // Matt can't remember why it was "onmouseup" in the first place,
    // and doesn't think that this change will break anything.
    //
   obj.onclick = ref.manageAction.bindAsEventListener(ref);
  });
  return btns;
 }
/* END Root Class */
 /**
  * Expander Class
  * 
  * @author Matt Nish-Lapidus
  * 
  * @description
  *  This class controls the animated expanding/collapsing of content areas
  * 
  * @param block 
  *  the target for the action
  *
  **/
Expander = function (block) {
  this.block = block;
  Object.extend(this.block, Event.Publisher);
  
  var ref = this;
    
  var minHeight = 103;
 
  // set the target of all the actions to be the expandable div
  this.target = document.getElementsByClassName('js_expand', block);
 
  // we only need the first js_expand div, as there should only be one per expander
  this.target = this.target[0];
  Element.cleanWhitespace(this.target);
  
  // set "view all" button events
  this.btns = this.assignBtns("js_viewAll");
  for (var i = 0; i < this.btns.length; i++) {
   if (Element.hasClassName(this.btns[i],"closeBtn")) {
     this.btns[i].hide();
   }
  }
 
  // set size of container
  this.startSize = (minHeight / Element.getHeight(this.target.firstChild)) * 100;
 
  if (Element.getHeight(this.target.firstChild) < (minHeight + 30)) {
    // Element.replace(document.getElementsByClassName('links', block)[0],"<div class='dotted'><hr></div>");
  //    this.btns.each( function (obj) {
  //     Element.hide(obj);
  //    });
  // Element.setStyle(this.target, {height: 'auto'});  
} else {
   // set default collapsed size of expander boxes
   Element.setStyle(this.target, {height: minHeight+'px'});
 }
 } // extend the Expander class with the Root functions
 Class.extend(Expander, Root);
 Expander.prototype.manageAction = function () {
  if (Element.hasClassName(this.target, 'open')) {
   this.doExpandClose();
  } else {
   this.doExpandOpen();
  }
 }
 
 Expander.prototype.doExpandOpen = function () {
  Effect.BlindDown(this.target, {scaleMode: 'contents', scaleFrom: this.startSize, restoreAfterFinish: false});
  Element.addClassName(this.target, 'open');
  this.block.dispatchEvent("ExpanderOpen");
 for (var i = 0; i < this.btns.length; i++) {
   if (Element.hasClassName(this.btns[i],"closeBtn")) {
   
      this.btns[i].show();
   } else if (Element.hasClassName(this.btns[i],"viewAllBtn")) {
   
      this.btns[i].hide();
   }
 } 
 }
 
 Expander.prototype.doExpandClose = function () {
  Effect.BlindDown(this.target, {scaleMode: 'contents', scaleFrom: 100, scaleTo: this.startSize, restoreAfterFinish: false});
  Element.removeClassName(this.target, 'open');
  this.block.dispatchEvent("ExpanderClose");
 for (var i = 0; i < this.btns.length; i++) {
  if (Element.hasClassName(this.btns[i],"closeBtn")) {
   
     this.btns[i].hide();
    } else if (Element.hasClassName(this.btns[i],"viewAllBtn")) {
   
     this.btns[i].show();
    }
  }
 }/* END Expander Class */
 /**
  * Scroller Class
  *
  * @author Matt Nish-Lapidus
  * 
  * @description
  *  This class controls the animated scrolling of content areas
  * 
  * @param block
  *  the target for the action
  *
  **/
Scroller = function (block) {
  this.block = block;
  this.scrollCount = 0;
  
  Object.extend(this, Event.Listener);
  
var minHeight = 103;
  var ref = this;
  // set the target of all the actions to be the expandable div
  this.target = document.getElementsByClassName('js_scroll', block);
  
  // we only need the first js_expand div, as there should only be one per expander
  this.target = this.target[0];
  Element.cleanWhitespace(this.target);
  
  this.scrollMe = this.target.firstChild;
  // set "view all" button events
  this.btns_scrollUp = this.assignBtns("js_scrollUp");
  this.btns_scrollDown = this.assignBtns("js_scrollDown");
  
  this.btns_scrollUp.each( function (obj) {
   Element.hide(obj);
  });
 
  if (Element.getHeight(this.target.firstChild) < (minHeight + 30)) {
  if (document.getElementsByClassName('links', block)[0] != undefined) Element.replace(document.getElementsByClassName('links', block)[0],"<div class='dotted'><hr></div>");
   this.btns_scrollDown.each( function (obj) {
    Element.hide(obj);
   });
Element.setStyle(this.target, {height: 'auto'});
  } else {
   Element.setStyle(this.target, {height: minHeight+'px'});
 }  
  /* listen for events from the expander.
   * these will only occur if the block element is also an Expander class object,
   * if it is not, this will never happen. */
  this.listenForEvent(this.block, "ExpanderOpen", false, "resetScroll");
  this.listenForEvent(this.block, "ExpanderOpen", false, "hideBtns");
  
  this.listenForEvent(this.block, "ExpanderClose", false, "resetScroll");
  this.listenForEvent(this.block, "ExpanderClose", false, "showBtns");
  
 }
 
 Class.extend(Scroller, Root);
 
 Scroller.prototype.manageAction = function (e) {
  var target = Event.element(e);
  // check if the event is coming from the right node, either the image or the link
  if (!Element.hasClassName(target, 'js_scrollDown') && !Element.hasClassName(target, 'js_scrollUp')) {
   target = target.parentNode;
  }
    
  if (Element.hasClassName(target, 'js_scrollDown')) {
   this.doScroll('down');
  } else {
   this.doScroll('up');
  }
 }
 
 Scroller.prototype.doScroll = function (dir) {
  var targets = document.getElementsByClassName("js_scrollTo", this.target);
   
  if (dir == 'down' && (this.scrollCount < (targets.length-1))) {
   var tY = -(Element.getHeight(targets[this.scrollCount]));
   this.doMove(tY);
   this.scrollCount++;
   this.btns_scrollUp.each( function (obj) {
    Element.show(obj);
   });
   if (this.scrollCount == (targets.length-1)) {
    this.btns_scrollDown.each( function (obj) {
     Element.hide(obj);
    });
   }
  } else if (dir == "up" && this.scrollCount > 0) {
   this.scrollCount--;
   var tY = (Element.getHeight(targets[this.scrollCount]));
   this.doMove(tY);
   this.btns_scrollDown.each( function (obj) {
    Element.show(obj);
   });
   if (this.scrollCount == 0) {
    this.btns_scrollUp.each( function (obj) {
     Element.hide(obj);
    });
   }
  }
 }
 
 Scroller.prototype.doMove = function (tY) {
  new Effect.Move(this.scrollMe, {x: 0, y: tY, mode: 'relative', duration: 0.5});
 }
 
 Scroller.prototype.resetScroll = function () {
  this.scrollCount = 0;
  new Effect.Move(this.scrollMe, {x: 0, y: 0, mode: 'absolute', duration: 1});
 }
 
 Scroller.prototype.hideBtns = function () {
  this.btns_scrollUp.each( function (obj) {
   Element.hide(obj);
  });
  this.btns_scrollDown.each( function (obj) {
   Element.hide(obj);
  });
 }
 
 Scroller.prototype.showBtns = function () {
  this.btns_scrollDown.each( function (obj) {
   Element.show(obj);
  });
 }
/* END Scroller Class */
/* AddList Class */
AddList = function (block) {
  this.block = block;
 
  var selects = document.getElementsByClassName('js_listSelect', block);
    
  this.left = selects[0];
  this.right = selects[1];
  
  var leftBtn = this.assignBtns("js_listLeftBtn");
  var rightBtn = this.assignBtns("js_listRightBtn");
  
 }
 
 Class.extend(AddList, Root);
 
 AddList.prototype.manageAction = function (e) {
  var target = Event.element(e);
  if (Element.hasClassName(target, 'js_listRightBtn')) {
   this.moveSelectedOptions(this.left,this.right);
  } else {
   this.moveSelectedOptions(this.right,this.left);
  }
 }
 
 AddList.prototype.moveSelectedOptions = function (from,to) {
  // function adapted from Matt Kruse (www.mattkruse.com)
  // Move them over
  for (var i = 0; i < from.options.length; i++) {
   var option = from.options[i];
   if (option.selected) {
     var index = to.options.length;
    to.options[index] = new Option(option.text, option.value, false, false);
   }
  }
  // Delete them from original
  for (var i = (from.options.length-1); i >= 0; i--) {
   var option = from.options[i];
   if (option.selected) {
    from.options[i] = null;
   }
  }
  from.selectedIndex = -1;
  to.selectedIndex = -1;
 }
 AddList.prototype.selectRight = function () {
 for (var i = 0; i < this.right.options.length; i++) {
  this.right.options[i].selected = true;
    }
 }
/* END AddList Class */
/* ExpandList Class */
ExpandList = function (block) {
  this.block = block;
  
  this.elementExpand = (document.getElementsByClassName('js_expandListContent', block))[0];
  this.btns = this.assignBtns("js_viewAllBtn");
  for (var i = 0; i < this.btns.length; i++) {
 if (Element.hasClassName(this.btns[i],"closeBtn")) {
   this.btns[i].hide();
 }
  }
  
  //Element.setStyle(this.elementExpand, {display: "none"});
 }
 
 Class.extend(ExpandList, Root);
 
 ExpandList.prototype.manageAction = function (e) {
  var target = Event.element(e).parentNode;
  if (target.hasClassName('js_viewAllBtn')) target = target.parentNode;
  if (Element.hasClassName(this.elementExpand, 'open')) {
   this.doExpandClose();
  } else {
   this.doExpandOpen();
  }
 }
 
 ExpandList.prototype.doExpandOpen = function () {
  Element.setStyle(this.elementExpand, {display: "block"});
  Element.addClassName(this.elementExpand, 'open');
  for (var i = 0; i < this.btns.length; i++) {
 if (Element.hasClassName(this.btns[i],"closeBtn")) {
      this.btns[i].show();
    } else if (Element.hasClassName(this.btns[i],"viewAllBtn")) {
      this.btns[i].hide();
    }
  }
 }
 
 ExpandList.prototype.doExpandClose = function () {
  Element.setStyle(this.elementExpand, {display: "none"});
  Element.removeClassName(this.elementExpand, 'open');
  this.btns.each(function (obj) {
   if (Element.hasClassName(obj,"closeBtn")) {
    obj.hide();
   } else if (Element.hasClassName(obj,"viewAllBtn")) {
    obj.show();
   }
  });
 }
/* END ExpandList Class */
/* Calendar Class */
Calendar = function (block) {
  Event.observe(block, 'mouseup', this.doOpenCal);
 }
 Calendar.prototype.doOpenCal = function (e) {
  var target = Event.element(e);
  document.cal.select(target,target.id,'MM/dd/yyyy');
 }
/* END Calendar Class */
var init = function () { 
//alert("init()");
 
 // register expandable blocks
 var expanders = document.getElementsByClassName("js_Expander");
 expanders.each(function (obj) {
  obj = new Expander(obj);
 });
  
 // register scrollable blocks
 var scrollers = document.getElementsByClassName("js_Scroller");
 scrollers.each(function (obj) {
  obj = new Scroller(obj);
 });
  
 // register addLists
 var addLists = document.getElementsByClassName("js_AddList");
 addLists.each(function (obj) {
  obj = new AddList(obj);
 });
 
 // register expandLists
 var expandLists = document.getElementsByClassName("js_ExpandList");
 for (var i = 0; i < expandLists.length; i++) {
 expandLists[i] = new ExpandList(expandLists[i]);
 }
 // register calendar
 var calendars = document.getElementsByClassName("js_calendar");
 calendars.each(function (obj) {
  obj = new Calendar(obj);
 });
 document.cal = new CalendarPopup("calendar");
 // run dropdown js for ie
 startList();
 
 // show all js dependant buttons
 var btns = document.getElementsByClassName("btn");
 btns.each(function (obj) {
  Element.setStyle(obj, {visibility: 'visible'});
 });
 var selectNav = document.getElementsByClassName("js_selectNav");
 selectNav.each(function (obj) {
  obj.onchange = function () {
   document.location = this.value;
  }
 });
 var forms = document.getElementsByTagName("FORM");
 for (var i = 0; i < forms.length; i++) {
 forms[i].onsubmit = function () {
   var lists = document.getElementsByClassName("js_AddList");
   lists.each(function (obj) {
    var selects = document.getElementsByClassName('js_listSelect', obj);
  for (var i = 0; i < selects[1].options.length; i++) {
   selects[1].options[i].selected = true;
     }
   });
 }
 }
 var d = new Date();
 //yearSelect(d.getFullYear());
}
/* Clears all of the inputs in the supplied form */
function flushForm(form) {
    var inputs=form.getElementsByTagName('input');
    for (var i in inputs) {inputs[i].value='';}
    var textareas=form.getElementsByTagName('textarea');
    for (var i in textareas) {textareas[i].innerHTML='';}
    var selectBoxes=form.getElementsByTagName('select');
    for (var i in selectBoxes) {selectBoxes[i].selectedIndex=null;}
}
Event.observe(window, "load", init);
