//////////////////////////////////////////////
// SiteWizard JavaScript (SWJS)
//////////////////////////////////////////////
(function(){
if(!window.SWJS){window['SWJS']={}}

//////////////////////////////////////////////
// Get Element By ID 
//////////////////////////////////////////////
function $() {
	var elements = new Array();
	// Find all the elements supplied as arguments
	for (var i = 0; i < arguments.length; i++) {
	var element = arguments[i];
	// If the argument is a string assume it's an id
	if (typeof element == 'string') {
	element = document.getElementById(element);
	}
	// If only one argument was supplied, return the
	// element immediately
	if (arguments.length == 1) {
	return element;
	}
	// Otherwise add it to the array
	elements.push(element);
	}
	// Return the array
	return elements;
};

//////////////////////////////////////////////
// Get Element By Class Name 
//////////////////////////////////////////////
function getElementsByClassName(className, tag, elm){
	var testClass = new RegExp("(^|\\\\s)" + className + "(\\\\s|$)");
	var tag = tag || "*";
	var elm = elm || document;
	var elements = (tag == "*" && elm.all)? elm.all : elm.getElementsByTagName(tag);
	var returnElements = [];
	var current;
	var length = elements.length;
	for(var i=0; i<length; i++){
		current = elements[i];
		if(testClass.test(current.className)){
			returnElements.push(current);
		}
	}
	return returnElements;
};

//////////////////////////////////////////////
// Get Element By Tag Name 
//////////////////////////////////////////////
function $$(tag,elem){
	return ((elem||document).getElementsByTagName(tag));
};

//////////////////////////////////////////////
// Add Event
//////////////////////////////////////////////
function addEvent(node,type,listener){
	if(!(node = $(node))) { return false; }
	if (node.addEventListener) {
		// W3C method
		node.addEventListener( type, listener, false );
		return true;
		} else if(node.attachEvent) {
		// MSIE method
		node['e'+type+listener] = listener;
		node[type+listener] = function(){
			node['e'+type+listener](window.event);
		}
		node.attachEvent( 'on'+type, node[type+listener] );
		return true;
		}
// Didn't have either so return false
return false;
};	


//////////////////////////////////////////////
// Remove Event
//////////////////////////////////////////////
function removeEvent(node, type, listener ) {
	if(!(node = $(node))) { return false; }
		if (node.removeEventListener) {
		node.removeEventListener( type, listener, false );
		return true;
		} else if (node.detachEvent) {
			// MSIE method
			node.detachEvent( 'on'+type, node[type+listener] );
			node[type+listener] = null;
			return true;
		}
			return false;
};

//////////////////////////////////////////////
// Toggle Display
//////////////////////////////////////////////
function toggleDisplay(node,value) {
	if(!(node = $(node))) { return false; }
	if(node.style.display != 'none'){
		node.style.display = 'none';	
	}else{
		node.style.display = value || 'block';
	}
	return true;
};

//////////////////////////////////////////////
// Toggle Hide
//////////////////////////////////////////////
function toggleHide(node,value) {
	if(!(node = $(node))) { return false; }
	if(node.style.visibility != 'hidden'){
		node.style.visibility = 'hidden';	
	}else{
		node.style.visibility = value || 'visible';
	}
	return true;
};

//////////////////////////////////////////////
// InsertAfter
//////////////////////////////////////////////
function insertAfter(node,referenceNode) {
	if(!(node = $(node))) { return false; }
	if(!(referenceNode = $(referenceNode))) { return false; }
	referenceNode.parentNode.insertBefore(node,referenceNode.nextSibling);
};

//////////////////////////////////////////////
// Fade Colour
//////////////////////////////////////////////

function fadeColor( from, to, callback,duration, framesPerSecond) {
// A function wrapper around setTimeout that calculates the
// time to wait based on the frame number
function doTimeout(color,frame) {
setTimeout(function(){
	try {
		callback(color);
		} catch(e) {
			
		}
},(duration*1000/framesPerSecond)*frame);
}


// The duration of the transition in seconds
var duration = duration || 1;
// The number of animated frames in the given duration
var framesPerSecond = framesPerSecond || duration*15;
var r,g,b;
var frame = 1;
// Set the initial start color at frame 0
doTimeout('rgb(' + from.r + ',' + from.g + ',' + from.b + ')',0);
// Calculate the change between the RGB values for each interval
	while (frame < framesPerSecond+1) {
		r = Math.ceil(from.r * ((framesPerSecond-frame)/framesPerSecond) + to.r * (frame/framesPerSecond));
		g = Math.ceil(from.g * ((framesPerSecond-frame)/framesPerSecond) + to.g * (frame/framesPerSecond));
		b = Math.ceil(from.b * ((framesPerSecond-frame)/framesPerSecond) + to.b * (frame/framesPerSecond));
	// Call the timeout function for this frame
	doTimeout('rgb(' + r + ',' + g + ',' + b + ')',frame);
	frame++;
	}
};


//////////////////////////////////////////////
// Method Asignments
//////////////////////////////////////////////

window['SWJS']['$'] = $;
window['SWJS']['$$'] = $$;
window['SWJS']['addEvent'] = addEvent;
window['SWJS']['removeEvent'] = removeEvent;
window['SWJS']['toggleDisplay'] = toggleDisplay;
window['SWJS']['toggleHide'] = toggleHide;
window['SWJS']['insertAfter'] = insertAfter;
window['SWJS']['fadeColor'] = fadeColor;
window['SWJS']['getElementsByClass'] = getElementsByClassName;

})();
