//////////////////////////////////////////////
// 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;
};

//////////////////////////////////////////////
// Fix White Space
//////////////////////////////////////////////
function fixWhiteSpace(arg){
	var notWhitespace = /\S/;
		if(!arg){
			var node = document;
		}else{
			var node = arg;
		} 
		for (var x = 0; x < node.childNodes.length; x++) {
			var childNode = node.childNodes[x]
			if ((childNode.nodeType == 3)&&(!notWhitespace.test(childNode.nodeValue))) {
				// that is, if it's a whitespace text node
				node.removeChild(node.childNodes[x])
				x--;
			}
			if (childNode.nodeType == 1) {
			// elements can have text child nodes of their own
			fixWhiteSpace(childNode);
			}
		}
	}

//////////////////////////////////////////////
// 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; }
//alert("You were sent\nNode was:"+node.nodeName+"\nNode Type:"+type+"\nListener:"+listener);
	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++;
	}
};

//////////////////////////////////////////////
// Get Class Name
//////////////////////////////////////////////
function getClassNames(element) {
if(!(element = $(element))) return false;
// Replace multiple spaces with one space and then
// split the classname on spaces
return element.className.replace(/\s+/,' ').split(' ');
};

//////////////////////////////////////////////
// Add a class to an element
//////////////////////////////////////////////
function addClassName(element, className) {
if(!(element = $(element))) return false;
// Append the classname to the end of the current className
// If there is no className, don't include the space
element.className += (element.className ? ' ' : '') + className;
return true;
};

//////////////////////////////////////////////
// Remove a class from an element
//////////////////////////////////////////////
function removeClassName(element, className) {
if(!(element = $(element))) return false;
var classes = getClassNames(element);
var length = classes.length;
for (var i = length-1; i >= 0; i--) {
if (classes[i] === className) { delete(classes[i]); }
}
element.className = classes.join(' ');
return (length == classes.length ? false : true);
};

//////////////////////////////////////////////
// Has class
//////////////////////////////////////////////
function hasClassName(element, className) {
if(!(element = $(element))) return false;
var classes = getClassNames(element);
for (var i = 0; i < classes.length; i++) {
// Check if the className matches and return true if it does
if (classes[i] === className) { return true; }
}
return false;
};


//////////////////////////////////////////////
// Stop Default Action
//////////////////////////////////////////////
function stopDefault(e){	
	if (window.event){
		window.event.cancelBubble = true;
		window.event.returnValue = false;
		return false;
	}
	if (e && e.stopPropagation && e.preventDefault){
		e.stopPropagation();
		e.preventDefault();
	}
};

//////////////////////////////////////////////
// Method Asignments
//////////////////////////////////////////////

window['SWJS']['$'] = $;
window['SWJS']['$$'] = $$;
window['SWJS']['hasClassName'] = hasClassName;
window['SWJS']['removeClassName'] = removeClassName;
window['SWJS']['addClassName'] = addClassName;
window['SWJS']['getClassNames'] = getClassNames;
window['SWJS']['fixWhiteSpace'] = fixWhiteSpace;
window['SWJS']['addEvent'] = addEvent;
window['SWJS']['removeEvent'] = removeEvent;
window['SWJS']['stopDefault'] = stopDefault;
window['SWJS']['toggleDisplay'] = toggleDisplay;
window['SWJS']['toggleHide'] = toggleHide;
window['SWJS']['insertAfter'] = insertAfter;
window['SWJS']['fadeColor'] = fadeColor;
window['SWJS']['getElementsByClass'] = getElementsByClassName;

})();


// Array - inArray Prototyping
Array.prototype.inArray = function (value)
// Returns true if the passed value is found in the
// array.  Returns false if it is not.
{
    var i;
    for (i=0; i < this.length; i++) {
        if (this[i] === value) {
            return true;
        }
    }
    return false;
}; 
