// b3rtEqualColumns 1.2
// Copyright 2007, H. poort
// This software may not be used without a valid license

function b3rtEqualColumns(){this.columnIds=[];this.columnObjects=[];this.useSpan=false;this.checkFrequency=4;this.callBackFunction=function(success){};this.eventHandlers={};this.equalColumnHeightsTimer=null};b3rtEqualColumns.prototype.setColumnIds=function(){if(arguments.length>1){for(var i=0;i<arguments.length;i++)this.columnIds[this.columnIds.length]=arguments[i]}};b3rtEqualColumns.prototype.setCallbackFunction=function(callbackFunction){if(typeof(callbackFunction)=='function'&&callbackFunction.length==1)this.callBackFunction=callbackFunction};b3rtEqualColumns.prototype.run=function(){if(this.columnIds.length<2){this.callBackFunction(false);return}if(!document||!document.body){var refThisOnLoad=this;this.eventHandlers['load']=function(){if(refThisOnLoad){refThisOnLoad.run();refThisOnLoad=null}};this.addEventHandler(window,'load',this.eventHandlers['load']);return}var refThisOnUnload=this;this.eventHandlers['unload']=function(){if(refThisOnUnload){refThisOnUnload.cleanUp();refThisOnUnload=null}};this.addEventHandler(window,'unload',this.eventHandlers['unload']);if(!this.checkBrowserCapabilities()){this.callBackFunction(false);return}if(!this.getColumnElements()){alert('Not all column elements could be found!');this.callBackFunction(false);return}this.equalColumnHeights()};b3rtEqualColumns.prototype.getColumnElements=function(){for(var i=0;i<this.columnIds.length;i++){var elem=document.getElementById(this.columnIds[i]);if(elem){var currentObject=this.columnObjects[this.columnObjects.length]={};currentObject.element=elem;currentObject.addedElement=null;currentObject.addedElementHeight=0;currentObject.addedPaddingBottom=0;currentObject.originalPaddingBottom=0;if(this.useSpan){var originalPaddingBottom=parseInt(this.getComputedStyle(elem,'paddingBottom'));originalPaddingBottom=(isNaN(originalPaddingBottom)?0:originalPaddingBottom);currentObject.originalPaddingBottom=originalPaddingBottom}}}if(this.columnObjects.length==this.columnObjects.length)return true;else return false};b3rtEqualColumns.prototype.equalColumnHeights=function(){var compareHeight=-1;var newHeight=0;var fixHeights=false;for(var i=0;i<this.columnObjects.length;i++){var currentObject=this.columnObjects[i];var currentHeight=currentObject.element.offsetHeight;if(compareHeight==-1)compareHeight=currentHeight;else if(currentHeight!=compareHeight)fixHeights=true;var checkRealHeight=currentHeight-currentObject.addedPaddingBottom-currentObject.addedElementHeight;if(checkRealHeight>newHeight)newHeight=checkRealHeight}if(fixHeights){for(var i=0;i<this.columnObjects.length;i++){var currentObject=this.columnObjects[i];var realHeight=currentObject.element.offsetHeight-currentObject.addedPaddingBottom-currentObject.addedElementHeight;if(this.useSpan){currentObject.addedPaddingBottom=newHeight-realHeight;currentObject.element.style.paddingBottom=currentObject.addedPaddingBottom+currentObject.originalPaddingBottom+'px'}else{if(currentObject.addedElement){currentObject.element.removeChild(currentObject.addedElement);currentObject.addedElement=null}currentObject.addedElementHeight=newHeight-realHeight;if(currentObject.addedElementHeight>0){var newElement=document.createElement('div');newElement.style.padding='0px';newElement.style.margin='0px';newElement.style.border='0px none #000';newElement.style.visibility='hidden';newElement.style.overflow='hidden';newElement.style.innerHTML='&nbsp;';newElement.style.width='0px';newElement.style.height=currentObject.addedElementHeight+'px';currentObject.addedElement=newElement;currentObject.element.appendChild(currentObject.addedElement)}}}this.callBackFunction(true)}var refThisEqualColumnHeights=this;this.equalColumnHeightsTimer=window.setTimeout(function(){if(refThisEqualColumnHeights){refThisEqualColumnHeights.equalColumnHeights();refThisEqualColumnHeights=null}},parseInt(1000/this.checkFrequency))};b3rtEqualColumns.prototype.cleanUp=function(){if(this.eventHandlers['load']){this.removeEventHandler(window,'load',this.eventHandlers['load']);this.eventHandlers['load']=null}if(this.eventHandlers['unload']){this.removeEventHandler(window,'unload',this.eventHandlers['unload']);this.eventHandlers['unload']=null}if(typeof(this.equalColumnHeightsTimer)=='number')window.clearTimeout(this.equalColumnHeightsTimer);for(var i=0;i<this.columnObjects.length;i++){if(this.columnObjects[i].addedElement){this.columnObjects[i].element.removeChild(this.columnObjects[i].addedElement);this.columnObjects[i].addedElement=null}this.columnObjects[i].element=null}};b3rtEqualColumns.prototype.addEventHandler=function(targetElement,eventName,handlerFunc){if(!targetElement||!eventName||!handlerFunc)return;if(targetElement.addEventListener)targetElement.addEventListener(eventName,handlerFunc,false);else if(targetElement.attachEvent)targetElement.attachEvent('on'+eventName,handlerFunc);else targetElement['on'+eventName]=handlerFunc};b3rtEqualColumns.prototype.removeEventHandler=function(targetElement,eventName,handlerFunc){if(!targetElement||!eventName||!handlerFunc)return;if(targetElement.removeEventListener)targetElement.removeEventListener(eventName,handlerFunc,false);else if(targetElement.detachEvent)targetElement.detachEvent('on'+eventName,handlerFunc);else targetElement['on'+eventName]=handlerFunc};b3rtEqualColumns.prototype.checkBrowserCapabilities=function(){if(typeof(document.body.offsetHeight)!='number')return false;if(typeof(document.getElementById)!='function'&&typeof(document.getElementById)!='object')return false;if(typeof(document.body.appendChild)!='function'&&typeof(document.body.appendChild)!='object')return false;return true};b3rtEqualColumns.prototype.getComputedStyle=function(element,styleItem){if((typeof(element)!='object')||(typeof(styleItem)!='string'))return'';if(typeof(element.ownerDocument)=='object'&&typeof(element.ownerDocument.defaultView)=='object'&&typeof(element.ownerDocument.defaultView.getComputedStyle)=='function'){var computedStyles=element.ownerDocument.defaultView.getComputedStyle(element,'');return computedStyles[styleItem]}else if(typeof(element.currentStyle)=='object')return element.currentStyle[styleItem];else return''};
