/*From Blocks kit 1.3 by rapidweaver.org, works with mootools 1.2*/
var Page = new Class({
initialize: function(){
document.idUpTo = 0;
this.findMenu();//done
this.findSubmenu();//done
this.findInfobox();//done
},
findSubmenu: function(){
var submenuList = $$('.rb_submenu');
this.submenus = [];
for (i=0; i < submenuList.length; i++)
{
this.submenus[i] = new submenu(submenuList[i]);
}
},
findInfobox: function(){
var infoboxList = $$('.db_infoboxWrapper');
this.infoboxs = [];
for (i=0; i < infoboxList.length; i++)
{
this.infoboxs[i] = new infoboxControl(infoboxList[i]);
}
},
findMenu: function(){
var menuList = $$('.navcontainer');
this.menus = [];
for (i=0; i < menuList.length; i++)
{
this.menus[i] = new menu(menuList[i]);
}
}
});
var siteBlock = new Class({
initialize: function(wrapper){
this.wrapper = wrapper;
},
//helper functions.
/*looks inside wrapper for value like this,
extracts it, or returns the default if not found*/
extractValue: function(lookFor, theDefault){
var value = theDefault;
var found=this.wrapper.getElement(lookFor);
if(found){
var v = found.getProperty('value');
//make sure property exists, and block text has been replaced.
if((v!="") && (v.search(' 0) {
span = span[0];
//use get rather than getproperty as the former does not work with IE
var style = 'font-size: ' + span.getStyle('font-size') + ';';
style += 'font-family: ' + span.getStyle('font-family') + ';';
style += 'color: ' + span.getStyle('color') + ';';
style += 'font-weight: ' + span.getStyle('font-weight') + ';';
return style;
}
},
/*gets id and if there is no id, it creates one*/
getId: function(object) {
var id = object.getProperty('id');
if(id == null) {
id = 'blockkit_' + document.idUpTo;
object.setProperty('id', id);
document.idUpTo = document.idUpTo + 1;
}
return id;
}
});
var submenu = new Class({
Extends: siteBlock,
initialize: function(wrapper){
this.parent(wrapper);
this.extract();
this.addColour();
this.wrapCurrent();
this.setupArrow();
},
extract: function(){
this.linkHoverColour = this.extractValue('.linkColourHover', "red");
this.padding = this.extractValue('.padding', 0);
this.padding = parseFloat(this.padding);
var current = this.wrapper.getElements('a[id=current]');
this.currentLi = current[0].getParent();//use in setupArrow
this.currentUl = this.currentLi.getParent();
this.wrapperPos = this.wrapper.getCoordinates();
this.style = this.getSpanStyle();
},
addColour: function(){
var p = this.wrapper.getParent().getParent().getParent();
var superId = this.getId(p);
var cssToAdd = "#" + superId + " .rb_submenu a{" + this.style + "}";
addCss(cssToAdd);
},
wrapCurrent: function(){
//need to check on deeper submenu
//wrap grandparents to current
var grandParents = this.wrapper.getElements('a.currentAncestor');
for (j=0; j < grandParents.length; j++)
{
var grandParentsLi = grandParents[j].getParent();
grandParentsLi.addClass("grandParent");
}
this.currentUl.addClass("currentParent");
},
setupArrow: function(){
var arrow = this.wrapper.getFirst('.arrowOnTheMove');
this.startPos = this.findPos(this.currentLi);
arrow.setStyle('top', this.startPos);
this.arrowfxs = new Fx.Morph(arrow, {duration: 600, wait: false, transition: Fx.Transitions.Sine.easeOut});
var subLi = this.currentUl.getElements('li');
for (j=0; j < subLi.length; j++)
{
this.rollOver(subLi[j]);
}
},
findPos: function(li){
var liPos = li.getCoordinates();
return liPos.top - this.wrapperPos.top - 10 + liPos.height/2+this.padding;
},
rollOver: function(object) {
var a = this.findLinkInLi(object);
var varLinkHoverColour = this.linkHoverColour;
var s = this.style;
var varArrowfxs = this.arrowfxs;
var varStartPos = this.startPos;
var thisPos = this.findPos(object);
a.set('style', s);
object.addEvent('mouseenter', function(){
a.setStyle('color', varLinkHoverColour);
varArrowfxs.start({'top': thisPos});
});
object.addEvent('mouseleave', function(){
a.set('style', s);
varArrowfxs.start({'top': varStartPos});
});
}
});
var infoboxControl = new Class ({
initialize: function(wrapper) {
var instance = new infobox(wrapper);
wrapper.addEvent('mouseenter', function(){instance.rollOver();});
wrapper.addEvent('mouseleave', function(){instance.rollOut()});
wrapper.addEvent('click', function(){instance.click()});
}
});
var infobox = new Class({
Extends: siteBlock,
initialize: function(wrapper){
this.parent(wrapper);
this.extract();
this.addColour();
},
extract: function(){
this.parent = this.wrapper.getParent();
this.heading = this.wrapper.getFirst('.rbheading');
this.link = this.heading.getElements('span');
this.content = this.wrapper.getFirst('.db_infoboxContent');//getElement('.db_infoboxContent');
this.linkStyle = this.getSpanStyle();
this.linkHoverColour = this.extractValue('.linkColourHover', 'black');
this.needClick = this.extractValue('.needClick', '0');
this.effect = new Fx.Morph(this.content, {duration: 400, wait: false, transition: Fx.Transitions.Sine.easeOut});
this.marginTop = 20;
this.padding = 0;
if(this.parent.getProperty('class') == 'db_css'){this.marginTop = 0;this.padding = 10;}
},
addColour: function(){
this.content.setStyle('display', 'block');
this.contentSize = this.content.scrollHeight;
this.content.setStyle('display', 'none');
this.content.setStyle('height', 0);
this.openAction(0, 0, 0);
},
rollOver: function(){
this.link.setStyle('color', this.linkHoverColour);
this.heading.setStyle('color', this.linkHoverColour);
if(this.needClick == "0") { this.open();}
},
rollOut: function(){
this.link.set('style', this.linkStyle);
this.heading.setStyle('color', '');
if(this.needClick == "0") { this.close();}
},
click: function(){
if(this.needClick == "1") {
if(this.isOpen) {this.close();
} else {this.open();}
}
},
open: function(){
this.heading.addClass('hover');
this.content.setStyle('display', 'block');
this.openAction(this.contentSize, this.marginTop, this.padding);
this.isOpen = true;
},
close: function() {
this.heading.removeClass('hover');
this.openAction(0, 0, 0);
this.isOpen = false;
},
openAction: function(contentSize, marginTop, padding){
this.effect.start({
'height': contentSize,
'margin-top': marginTop,
'padding-top':padding,
'padding-bottom':padding
});
}
});
var menu = new Class({
Extends: siteBlock,
initialize: function(wrapper){
this.parent(wrapper);
this.getType();
this.extract();
this.addColour();
this.stacksOverflowFix();
this.addRollover();
this.addDropdown();
},
getType: function() {
this.parent = this.wrapper.getParent();
this.grandParent = this.parent.getParent();
var superClass = this.parent.getProperty('class');
if(superClass != "nav_css") { this.isRound = true;
} else { this.isRound = false;}
},
extract: function(){
this.linkHoverColour = this.extractValue('.linkColourHover', 'red');
this.effectType = this.extractValue('.effect', '1');
this.effectSpeed = this.extractValue('.effectSpeed', '500');
this.effectSpeed = parseFloat(this.effectSpeed);
this.showSub = this.extractValue('.showSubMenu', '1');
this.showSplit = this.extractValue('.spliton', '1');
this.splitColour = this.extractValue('.splitBorder', "black");
if(!this.isRound) {
this.linkBackground = this.extractValue('.linkColourBackground', "white");
this.linkBackgroundHover = this.extractValue('.linkColourBackgroundHover', "white");
this.linkColourBorder = this.extractValue('.linkColourBorder', "black");
this.linkColourBorderHover = this.extractValue('.linkColourBorderHover', "red");
this.popOutColour = this.extractValue('.popOutColour', "white");
}
this.superId = this.getId(this.grandParent);
this.style = this.getSpanStyle();
},
addColour: function(){
//do not add style together as if they return null, it will stuff up.
//var cssToAdd = "#" + this.superId + " .navcontainer a{color: " + this.linkColour + "; font-family:" + this.font + "; visibility: visible;}";
var cssToAdd = "#" + this.superId + " .navcontainer a{visibility: visible;}";
cssToAdd += "#" + this.superId + " .navcontainer a{" + this.style + "}";
if(this.isRound) {
if(this.showSplit == '1') {
cssToAdd += "#" + this.superId + " .navcontainer a{border-right: 1px solid " + this.splitColour + ";}";
}
} else {
cssToAdd += "#" + this.superId + " .nav_css .navcontainer a{background-color: " + this.linkBackground + "; border-bottom-color: " + this.linkColourBorder + ";}";
cssToAdd += "#" + this.superId + " .nav_css .navcontainer a:hover{background-color: " + this.linkBackgroundHover + "; border-bottom-color: " + this.linkColourBorderHover + ";}";
cssToAdd += "#" + this.superId + " .nav_css .navcontainer ul ul{background-color: " + this.popOutColour + "}";
cssToAdd += "#" + this.superId + " .nav_css .navcontainer ul ul a{background-color: " + this.popOutColour + "}";
}
addCss(cssToAdd);
},
//if its stack, gets first parent .stacks_out and adds overflow: visible; to it.
//+ IE fix
stacksOverflowFix: function() {
var p = this.grandParent.getParents('.stacks_out');
if(p.length > 0) {
p[0].setStyle('overflow', 'visible');
if((navigator.userAgent.toLowerCase().indexOf('msie 6') != -1) || (navigator.userAgent.toLowerCase().indexOf('msie 7') != -1)) {
p[0].setStyle('z-index', '3000');//for IE
}
if(!this.isRound) {p[0].setStyle('height', '50px');}//bit sneaky.
}
},
addRollover: function(){
var li = this.wrapper.getElements('li');
for (j=0; j < li.length; j++)
{
this.rolloverEffect(li[j]);
}
},
rolloverEffect: function(object){
var a = this.findLinkInLi(object);
var hoverColour = this.linkHoverColour;
var s = this.style;
object.addEvent('mouseenter', function(){
a.setStyle('color', hoverColour);
});
object.addEvent('mouseleave', function(){
//use set rather than setProperty as IE does not like the former
a.set('style', s);
});
},
addDropdown: function() {
if(this.showSub == '1') {
var mainUl = this.wrapper.getElements('ul');
mainUl = mainUl[0];
var menuHeading = mainUl.getChildren('li');
for (j=0; j < menuHeading.length; j++)
{
var menu = menuHeading[j].getElements('ul');
if(menu.length > 0){
this.dropdownSetup(menuHeading[j], menu[0], j);
}
}
}
},
dropdownSetup: function(menuHeading, menu, j) {
var extra = 0;
var factor = 1;
if(this.isRound){extra = 40; factor=1.2;}
if(typeof(GLOBAL_extra) != 'undefined'){extra = GLOBAL_extra;}
if(typeof(GLOBAL_factor) != 'undefined'){factor = GLOBAL_factor;}
menu.setStyle('display', 'block');
var menuSize = menu.scrollHeight*factor + extra;
menu.setStyle('height', 0);
//This wraps the submenu li items in a div so that it can slide down with the menu.
var subItems = menu.getChildren('li');
var idOfWrap = 'mySecondElement' + j + this.superId;
var mySecondElement = new Element('div', {id: idOfWrap, 'class': 'menuWrap'});
mySecondElement.inject(menu, 'top');
mySecondElement.adopt(subItems);
cssToAdd = "#" + this.superId + " .navcontainer #" + idOfWrap + " {height: " + (menuSize) +"px;}";
addCss(cssToAdd);
this.dropdownEffect(menuHeading, menu, menuSize);
},
dropdownEffect: function(menuHeading, menu, menuSize){
var menufxs = this.switchEffect(menu, this.effectType, this.effectSpeed);
menuHeading.addEvent('mouseenter', function(){
menufxs.start({
'height': menuSize
});
});
menuHeading.addEvent('mouseleave', function(){
menufxs.start({
'height': 0
});
});
},
switchEffect: function(object, effect, effectSpeed) {
switch(effect){
case '1': var menufxs = new Fx.Morph(object, {duration: effectSpeed, wait: false, transition: Fx.Transitions.linear}); break;
case '2': var menufxs = new Fx.Morph(object, {duration: effectSpeed, wait: false, transition: Fx.Transitions.Quad.easeOut}); break;
case '3': var menufxs = new Fx.Morph(object, {duration: effectSpeed, wait: false, transition: Fx.Transitions.Cubic.easeOut}); break;
case '4': var menufxs = new Fx.Morph(object, {duration: effectSpeed, wait: false, transition: Fx.Transitions.Quart.easeOut}); break;
case '5': var menufxs = new Fx.Morph(object, {duration: effectSpeed, wait: false, transition: Fx.Transitions.Quint.easeOut}); break;
case '6': var menufxs = new Fx.Morph(object, {duration: effectSpeed, wait: false, transition: Fx.Transitions.Sine.easeOut}); break;
case '7': var menufxs = new Fx.Morph(object, {duration: effectSpeed, wait: false, transition: Fx.Transitions.Expo.easeOut}); break;
case '8': var menufxs = new Fx.Morph(object, {duration: effectSpeed, wait: false, transition: Fx.Transitions.Elastic.easeOut}); break;
case '9': var menufxs = new Fx.Morph(object, {duration: effectSpeed, wait: false, transition: Fx.Transitions.Back.easeOut}); break;
case '10': var menufxs = new Fx.Morph(object, {duration: effectSpeed, wait: false, transition: Fx.Transitions.Bounce.easeOut}); break;
default: var menufxs = new Fx.Morph(object, {duration: effectSpeed, wait: false, transition: Fx.Transitions.linear});
}
return menufxs;
}
});
window.addEvent('domready', function(){ var newInstance = new Page();});