var BC = BC || {};

BC.DropDown = (function(){
	
	var View = {
		enhance: function enhance(){
			this.addClass(list, 'enhanced');
		},
		/**
		 * Adds a class to a DOM element, if the attribute doesn't exist,
		 * then make one, if the class exists don't add it again
		 * @param {HTMLElement} el
		 * @param {String} newClass
		 */
		addClass: function addClass(el, newClass){
			if(el == null || el == undefined) throw "Element parameter missing for addClass method";
			if(newClass == null || newClass == undefined || newClass == '') throw "newClass parameter missing for addClass method";
			var regEx = new RegExp(newClass);
			el.className = (regEx.test(el.className)) ? el.className : el.className + ' ' + newClass;
		},
		/**
		 * Removes a class from a DOM element
		 * @param {HTMLElement} el
		 * @param {String} newClass
		 */
		removeClass: function removeClass(el, elementClass){
			if(el == null || el == undefined) throw "Element parameter missing for removeClass method";
			if(elementClass == null || elementClass == undefined || elementClass == '') throw "elementClass parameter missing for removeClass method";
			el.className = el.className.replace(/elementClass/, '');
		},
		/**
		 * Toggle a class on a DOM element
		 * @param {HTMLElement} el
		 * @param {String} toggleClass
		 */
		toggleClass: function toggleClass(el, toggleClass){
			if(el == null || el == undefined) throw "Element parameter missing for toggleClass method";
			if(toggleClass == null || toggleClass == undefined || toggleClass == '') throw "toggleClass parameter missing for toggleClass method";
			var regEx = new RegExp(toggleClass);
			el.className = (regEx.test(el.className)) ? el.className.replace(regEx, '') : el.className + ' ' + toggleClass;
		},
		/**
		 * Gets an element by classname
		 * @param {String} className
		 * @return {HTMLElement}
		 */
		getElementByclassName: function(className){
			var result = [], regEx = new RegExp('(^| )' + className + '( |$)'), elements = document.getElementsByTagName('*');
			for(var i = 0; i < elements.length; i++){
				if(regEx.test(elements[i].className)){
					result.push(elements[i]);
				}
			}
			return result;
		},
		init: function init(){
			this.enhance();
		}
	},
	Events = {
		bind: function bind(){
			this.bindHandles();
		},
		/**
		 * Attaches an event to a DOM element
		 * @param {HTMLElement} element
		 * @param {Function} event
		 */
		attachEvent: function attachEvent(element, event, callback){
			if(document.attachEvent){
				// Need to fix this, IE doesn't appear to support "this" properly within an event listener
				element.attachEvent('on' + event, callback);
			} else if(document.addEventListener){
				element.addEventListener(event, callback, false);
			}
		},
		bindHandles: function bindHandles(){
			var handles = View.getElementByclassName('handle');
			for(var i = 0; i < handles.length; i++){
				this.attachEvent(handles[i], 'click', function(e){
					var source = (e.srcElement) ? e.srcElement : this;
					View.toggleClass(source.parentNode, 'active');
				});
			}
		},
		init: function init(){
			this.bind();
		}
	},
	list;
	
	return {
		init: function init(id){
			if(id == null || id == undefined) throw "ID not supplied for dropdown";
			list = document.getElementById(id);
			if(list == null || list == undefined) throw "Element with id '" + id + "' does not exist within the DOM";

			View.init();
			Events.init();
		}
	}
	
})();
 


// Open link in a popup window
function openCalculator(url){
 window.name = "mfOpener";
	winHandle = window.open(url, "window", "width=700,height=705,screenX=15,screenY=20,top=15,left=30,scrollbars=yes,resizable=no");
  winHandle.focus();
 return false;
}

