/**** COMMON DHTML FUNCTIONS (Cross-Browser) */
 
function DHTML()
{
}
DHTML.sourceEvent = function(evt)
{
	var eventType=(typeof window.event!="undefined")? event.type : evt.type;
	return eventType
}

DHTML.sourceObject = function (evt)
{
	var sourceObject;
	(typeof window.event!="undefined")? sourceObject=event.srcElement : sourceObject=evt.target;
	return sourceObject;
}

DHTML.getDescendantByClass = function(p, classVal){
	var returnClass=new Array();
	var childNodes = p.all ? p.all : p.getElementsByTagName("*");
	for(var i = 0, len = childNodes.length; i < len; i++){
		if(childNodes[i].className == classVal){
			returnClass.push(childNodes[i]);
		}
	}
	return returnClass;
}


DHTML.addEvent = function (obj, eventName, callback)
{
	if (obj.addEventListener)
	{
		obj.addEventListener(eventName, callback, false);
	}
	else if (obj.attachEvent)
	{
		obj.attachEvent('on' + eventName, callback);
	}
	else
	{
		obj['on' + eventName] = callback;
	}
}

DHTML.removeEvent = function(obj, eventName, callback, useCapture)
{
	if (obj.removeEventListener)
	{
		obj.removeEventListener(eventName, callback, useCapture);
	}
	else if (obj.detachEvent)
	{
		obj.detachEvent('on' + eventName, callback);
	}
	else
	{
		obj['on' + eventName] = null;
	}
}

/**
 * Gets the full width/height because it's different for most browsers.
 * getViewportHeight and getViewportWidth by http://www.evolt.org/article/document_body_doctype_switching_and_more/17/30655/
 */
DHTML.getScroll = function(){
	if (document.all){
		return [document.documentElement.scrollLeft,document.documentElement.scrollTop]
	} else {
		return [window.pageXOffset,window.pageYOffset];
	}
}
DHTML.getViewportHeight = function() {
	if (window.innerHeight!=window.undefined) return window.innerHeight;
	if (document.compatMode=='CSS1Compat') return document.documentElement.clientHeight;
	if (document.body) return document.body.clientHeight; 
	return window.undefined; 
	
}
DHTML.getViewportWidth = function() {
	if (window.innerWidth!=window.undefined) return window.innerWidth; 
	if (document.compatMode=='CSS1Compat') return document.documentElement.clientWidth; 
	if (document.body) return document.body.clientWidth; 
	return window.undefined; 
}

DHTML.getWindowSize = function()
{
	var w = 0;
	var h = 0;

	//IE
	if(!window.innerWidth)
	{
		//strict mode
		if(!(document.documentElement.clientWidth == 0))
		{
			w = document.documentElement.clientWidth;
			h = document.documentElement.clientHeight;
		}
		//quirks mode
		else
		{
			w = document.body.clientWidth;
			h = document.body.clientHeight;
		}
	}
	//w3c
	else
	{
		w = window.innerWidth;
		h = window.innerHeight;
	}
	return {width:w,height:h};
}


/** Other
 */
 
DHTML.hasClass = function(obj, className){
	if (!(obj && obj.className)) {
		return false;
	}
	var classes = obj.className.split(' ');
	for (var i=0;i<classes.length;i++){
		if (classes[i]==className){
			return true;
		}
	}
	return false;
}
 
DHTML.removeClass = function(obj, className)
{
	if (!(obj && obj.className)) {
		return;
	}
	var classes = obj.className.split(' ');
	var newClasses = new Array();
	for (var i = classes.length; i > 0;) {
		if (classes[--i] != className) {
			newClasses[newClasses.length] = classes[i];
		}
	}
	obj.className = newClasses.join(' ');
};

DHTML.addClass = function(obj, className)
{
	DHTML.removeClass(obj, className); //make sure it isn't a duplicate
	obj.className += ' ' + className;
};

DHTML.escape = function(inputString)
{
	try
	{
		return encodeURIComponent(inputString);
	}
	catch(err)
	{
	}
	
	return escape(inputString);
};

DHTML.selectValue = function(selectElement){
	return [selectElement.options[selectElement.options.selectedIndex].value,selectElement.options[selectElement.options.selectedIndex].text]
}

DHTML.selectToCSV = function(selectElement)
{
	var selectedOptions = '';
	
	for (i = 0; i < selectElement.options.length; i++)
	{
		if (selectElement.options[i].selected)
		{
			if (selectedOptions.length > 0)
				selectedOptions = selectedOptions + ',' + selectElement.options[i].value;
			else
				selectedOptions = selectElement.options[i].value;
		}	
	}
	
	return selectedOptions;
};

DHTML.WindowFeatures = function()
{
	this.menubar = 'yes';
	this.toolbar = 'yes';
	this.location = 'yes';
	this.status = 'yes';
	this.resizable = 'yes';
	this.scrollbars = 'yes';
	this.modal = 'no';
};

DHTML.WindowFeatures.prototype = 
{
	apply: function(features)
	{
		for (var feature in features)
		{
			this[feature] = features[feature];
		}
	},
	
	toString: function()
	{
		var retval = '';
		
		for (var feature in this)
		{
			retval = retval + feature + '=' + this[feature] + ',';
		}
		
		return retval;
	}
};

DHTML.openWindow = function(url, name, features)
{
	if (features)
	{
		//merge features with the default
		var windowFeatures = new DHTML.WindowFeatures();	
		windowFeatures.apply(features); //apply the requested features to the defaults
		
		var featuresString = windowFeatures.toString();

		return window.open(url, name, featuresString);
	}
	else
	{
		return window.open(url, name);
	}
};

DHTML.lastChild = function(sourceNode){
	return sourceNode.childNodes[sourceNode.childNodes.length-1];
}
DHTML.removeChildren = function(sourceNode){
	while (sourceNode.firstChild){sourceNode.removeChild(sourceNode.firstChild);}
}

DHTML.passwdStrength = function (passwd){
	var intStrength=0;
	var errMsg="Password Tips\t\t";
	if (passwd.length>5){
		intStrength++;
		intStrength+=Math.round((passwd.length-5)/4);
	} else {
		errMsg+="\n\tLength";
	}
	var re=new RegExp("[a-z]");
	if (passwd.match(re)){intStrength++;} else {errMsg+="\n\tLower Case Character";}
	re=new RegExp("[A-Z]");
	if (passwd.match(re)){intStrength++;} else {errMsg+="\n\tUpper Case Character";}
	re=new RegExp("[0-9]");
	if (passwd.match(re)){intStrength++;} else {errMsg+="\n\tNumeric Value";}
	re=new RegExp("[^a-zA-Z0-9_]");
	if (passwd.match(re)){intStrength++;} else {errMsg+="\n\tSpecial Characters";}
	return {"strength":intStrength,"errMsg":errMsg};
}