/*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();});