/*
Validates a  
*/
function validateEmail(email)
{
    var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
    return email.match(re)
}

/*
// @name      The Fade Anything Technique
// @namespace http://www.axentric.com/aside/fat/
// @version   1.0-RC1
// @author    Adam Michela
*/
var Fat = {
	make_hex : function (r,g,b) 
	{
		r = r.toString(16); if (r.length == 1) r = '0' + r;
		g = g.toString(16); if (g.length == 1) g = '0' + g;
		b = b.toString(16); if (b.length == 1) b = '0' + b;
		return "#" + r + g + b;
	},
	fade_all : function ()
	{
		var a = document.getElementsByTagName("*");
		for (var i = 0; i < a.length; i++) 
		{
			var o = a[i];
			var r = /fade-?(\w{3,6})?/.exec(o.className);
			if (r)
			{
				if (!r[1]) r[1] = "";
				if (o.id) Fat.fade_element(o.id,null,null,"#"+r[1]);
			}
		}
	},
	fade_element : function (id, fps, duration, from, to) 
	{
		if (!fps) fps = 30;
		if (!duration) duration = 3000;
		if (!from || from=="#") from = "#FFFF33";
		if (!to) to = this.get_bgcolor(id);

		var frames = Math.round(fps * (duration / 1000));
		var interval = duration / frames;
		var delay = interval;
		var frame = 0;

		if (from.length < 7) from += from.substr(1,3);
		if (to.length < 7) to += to.substr(1,3);

		var rf = parseInt(from.substr(1,2),16);
		var gf = parseInt(from.substr(3,2),16);
		var bf = parseInt(from.substr(5,2),16);
		var rt = parseInt(to.substr(1,2),16);
		var gt = parseInt(to.substr(3,2),16);
		var bt = parseInt(to.substr(5,2),16);

		var r,g,b,h;
		while (frame < frames)
		{
			r = Math.floor(rf * ((frames-frame)/frames) + rt * (frame/frames));
			g = Math.floor(gf * ((frames-frame)/frames) + gt * (frame/frames));
			b = Math.floor(bf * ((frames-frame)/frames) + bt * (frame/frames));
			h = this.make_hex(r,g,b);

			setTimeout("Fat.set_bgcolor('"+id+"','"+h+"')", delay);

			frame++;
			delay = interval * frame; 
		}
		setTimeout("Fat.set_bgcolor('"+id+"','"+to+"')", delay);
	},
	set_bgcolor : function (id, c)
	{
		var o = document.getElementById(id);
		o.style.backgroundColor = c;
	},
	get_bgcolor : function (id)
	{
		var o = document.getElementById(id);
		while(o)
		{
			var c;
			if (window.getComputedStyle) c = window.getComputedStyle(o,null).getPropertyValue("background-color");
			if (o.currentStyle) c = o.currentStyle.backgroundColor;
			if ((c != "" && c != "transparent") || o.tagName == "BODY") { break; }
			o = o.parentNode;
		}
		if (c == undefined || c == "" || c == "transparent") c = "#FFFFFF";
		var rgb = c.match(/rgb\s*\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)/);
		if (rgb) c = this.make_hex(parseInt(rgb[1]),parseInt(rgb[2]),parseInt(rgb[3]));
		return c;
	}
}


/*
Changes an elements display style
*/
function changeDisplay(element, display) {
    var hide = null;
    hide = $(element.split('|'));
    for (i=0; i < hide.length; i++) {
        $(hide[i]).style.display = display;
    }
}

/*
Collapses a class based on the heading
*/
function toggleCollapse(heading, obj) {
	if (obj.style.display != 'none') {
		obj.style.display = 'none';
		heading.className = 'heading collapsed';
	}
	else {
		obj.style.display = '';
		heading.className = 'heading';
	}
}

/*
Simply add a class name to the beginning of the function and the 2nd and 3rd 
arguments are optional and the magic is done for you!
*/
function getElementsByClass(searchClass,node,tag) {
	var classElements = new Array();
	if ( node == null )
		node = document;
	if ( tag == null )
		tag = '*';
	var els = node.getElementsByTagName(tag);
	var elsLen = els.length;
	var pattern = new RegExp('(^|\\s)'+searchClass+'(\\s|$)');
	for (i = 0, j = 0; i < elsLen; i++) {
		if ( pattern.test(els[i].className) ) {
			classElements[j] = els[i];
			j++;
		}
	}
	return classElements;
}

/*
Showing/hiding an element upon an event being fired. 
*/
function toggle(obj) {
	var el = document.getElementById(obj);
	if ( el.style.display != 'none' ) {
		el.style.display = 'none';
	}
	else {
		el.style.display = '';
	}
}


/*
One would have thought this too would be a DOM core method. 
But just like getElementsByClass, it isn’t.
*/
function insertAfter(parent, node, referenceNode) {
	parent.insertBefore(node, referenceNode.nextSibling);
}

/*

*/
Array.prototype.inArray = function (value) {
	var i;
	for (i=0; i < this.length; i++) {
		if (this[i] === value) {
			return true;
		}
	}
	return false;
};

/*
------- cookie functions -------
*/
function getCookie( name ) {
	var start = document.cookie.indexOf( name + "=" );
	var len = start + name.length + 1;
	if ( ( !start ) && ( name != document.cookie.substring( 0, name.length ) ) ) {
		return null;
	}
	if ( start == -1 ) return null;
	var end = document.cookie.indexOf( ';', len );
	if ( end == -1 ) end = document.cookie.length;
	return unescape( document.cookie.substring( len, end ) );
}

function setCookie( name, value, expires, path, domain, secure ) {
	var today = new Date();
	today.setTime( today.getTime() );
	if ( expires ) {
		expires = expires * 1000 * 60 * 60 * 24;
	}
	var expires_date = new Date( today.getTime() + (expires) );
	document.cookie = name+'='+escape( value ) +
		( ( expires ) ? ';expires='+expires_date.toGMTString() : '' ) + //expires.toGMTString()
		( ( path ) ? ';path=' + path : '' ) +
		( ( domain ) ? ';domain=' + domain : '' ) +
		( ( secure ) ? ';secure' : '' );
}

function deleteCookie( name, path, domain ) {
	if ( getCookie( name ) ) document.cookie = name + '=' +
			( ( path ) ? ';path=' + path : '') +
			( ( domain ) ? ';domain=' + domain : '' ) +
			';expires=Thu, 01-Jan-1970 00:00:01 GMT';
}


/*
Simply add a class name to the beginning of the funciton and the 2nd and 3rd
arguments are optional and the magic is done for you!
*/
function getElementsByClass(searchClass,node,tag) {
	var classElements = new Array();
	if ( node == null )
		node = document;
	if ( tag == null )
		tag = '*';
	var els = node.getElementsByTagName(tag);
	var elsLen = els.length;
	var pattern = new RegExp('(^|\\s)'+searchClass+'(\\s|$)');
	for (i = 0, j = 0; i < elsLen; i++) {
		if ( pattern.test(els[i].className) ) {
			classElements[j] = els[i];
			j++;
		}
	}
	return classElements;
}

/*
Showing/hiding an element upon an event being fired.
*/
function toggle(obj) {
	var el = document.getElementById(obj);
	if ( el.style.display != 'none' ) {
		el.style.display = 'none';
	}
	else {
		el.style.display = '';
	}
}


/*
One would have thought this too would be a DOM core method.
But just like getElementsByClass, it isn’t.
*/
function insertAfter(parent, node, referenceNode) {
	parent.insertBefore(node, referenceNode.nextSibling);
}

/*

*/
Array.prototype.inArray = function (value) {
	var i;
	for (i=0; i < this.length; i++) {
		if (this[i] === value) {
			return true;
		}
	}
	return false;
};

/*
------- cookie functions -------
*/
function getCookie( name ) {
	var start = document.cookie.indexOf( name + "=" );
	var len = start + name.length + 1;
	if ( ( !start ) && ( name != document.cookie.substring( 0, name.length ) ) ) {
		return null;
	}
	if ( start == -1 ) return null;
	var end = document.cookie.indexOf( ';', len );
	if ( end == -1 ) end = document.cookie.length;
	return unescape( document.cookie.substring( len, end ) );
}

function setCookie( name, value, expires, path, domain, secure ) {
	var today = new Date();
	today.setTime( today.getTime() );
	if ( expires ) {
		expires = expires * 1000 * 60 * 60 * 24;
	}
	var expires_date = new Date( today.getTime() + (expires) );
	document.cookie = name+'='+escape( value ) +
		( ( expires ) ? ';expires='+expires_date.toGMTString() : '' ) + //expires.toGMTString()
		( ( path ) ? ';path=' + path : '' ) +
		( ( domain ) ? ';domain=' + domain : '' ) +
		( ( secure ) ? ';secure' : '' );
}

function deleteCookie( name, path, domain ) {
	if ( getCookie( name ) ) document.cookie = name + '=' +
			( ( path ) ? ';path=' + path : '') +
			( ( domain ) ? ';domain=' + domain : '' ) +
			';expires=Thu, 01-Jan-1970 00:00:01 GMT';
}

/* Rounded Corners */
function roundedCorners(div, innerDiv, colour, innerDivPadding) {
    var newDiv = document.createElement("div");
    newDiv.className=colour+"-cornersfg";
    newDiv.id=innerDiv;
    newDiv.innerHTML=$(div).innerHTML;
    newDiv.style.padding=innerDivPadding;
    $(div).innerHTML="";
    $(div).appendChild(roundedTop(colour));
    $(div).appendChild(newDiv);
    $(div).appendChild(roundedBottom(colour));
}

function roundedCornersBottom(div, innerDiv, colour, innerDivPadding) {
    var newDiv = document.createElement("div");
    newDiv.className=colour+"-cornersfg";
    newDiv.id=innerDiv;
    newDiv.innerHTML=$(div).innerHTML;
    newDiv.style.padding=innerDivPadding;
    $(div).innerHTML="";
    $(div).appendChild(newDiv);
    $(div).appendChild(roundedBottom(colour));
}

function roundedTop(colour) {
    var bTop = document.createElement("b");
    bTop.className = colour+"-corners";
    bTop.style.display="block";
    var b1 = document.createElement("b");
    b1.className = colour+"-corners1";
    b1.style.marginLeft="3px";b1.style.marginRight="3px";b1.style.paddingLeft="1px";b1.style.paddingRight="1px";
    b1.appendChild(document.createElement("b"));
    var b2 = document.createElement("b");
    b2.className = colour+"-corners2";
    b2.style.marginLeft="1px";b2.style.marginRight="1px";b2.style.PaddingRight="1px";b2.style.PaddingLeft="1px";
    b2.appendChild(document.createElement("b"));
    var b3 = document.createElement("b");
    b3.className = colour+"-corners3";
    b3.style.marginLeft="1px";b3.style.marginRight="1px";
    var b4 = document.createElement("b");
    b4.className = colour+"-corners4";
    var b5 = document.createElement("b");
    b5.className = colour+"-corners5";
    bTop.appendChild(b1);
    bTop.appendChild(b2);
    bTop.appendChild(b3);
    bTop.appendChild(b4);
    bTop.appendChild(b5);
    
    return bTop;
}

function roundedBottom(colour) {
    var bBottom = document.createElement("b");
    bBottom.className = colour+"-corners";
    bBottom.style.display="block";
    var b1 = document.createElement("b");
    b1.className = colour+"-corners1";
    b1.style.marginLeft="3px";b1.style.marginRight="3px";b1.style.paddingLeft="1px";b1.style.paddingRight="1px";
    b1.appendChild(document.createElement("b"));
    var b2 = document.createElement("b");
    b2.className = colour+"-corners2";
    b2.style.marginLeft="1px";b2.style.marginRight="1px";b2.style.PaddingRight="1px";b2.style.PaddingLeft="1px";
    b2.appendChild(document.createElement("b"));
    var b3 = document.createElement("b");
    b3.className = colour+"-corners3";
    b3.style.marginLeft="1px";b3.style.marginRight="1px";
    var b4 = document.createElement("b");
    b4.className = colour+"-corners4";
    var b5 = document.createElement("b");
    b5.className = colour+"-corners5";
    bBottom.appendChild(b5);
    bBottom.appendChild(b4);
    bBottom.appendChild(b3);
    bBottom.appendChild(b2);
    bBottom.appendChild(b1);

    return bBottom;
}

function roundByClass(className, innerDiv, colour, innerDivPadding) {
    var elements=getElementsByClass(className);
    for (i=0; i<elements.length;i++) {
        var newDiv = document.createElement("div");
        newDiv.className=colour+"-cornersfg";
        newDiv.id=innerDiv + i;
        newDiv.innerHTML=elements[i].innerHTML;
        newDiv.style.padding=innerDivPadding;
        newDiv.style.height=elements[i].style.height;
        elements[i].innerHTML="";
        elements[i].appendChild(roundedTop(colour));
        elements[i].appendChild(newDiv);
        elements[i].appendChild(roundedBottom(colour));
    }
}

/* Return the client browser - implementation grabbed from the YUI */
function browser() {
	var ua = navigator.userAgent.toLowerCase();
	if (ua.indexOf('opera')!=-1) { // Opera (check first in case of spoof)
		return 'opera';
	} else if (ua.indexOf('msie 7')!=-1) { // IE7
		return 'ie7';
	} else if (ua.indexOf('msie') !=-1) { // IE
		return 'ie6';
	} else if (ua.indexOf('safari')!=-1) { // Safari (check before Gecko because it includes "like Gecko")
		return 'safari';
	} else if (ua.indexOf('gecko') != -1) { // Gecko
		return 'gecko';
	} else {
		return false;
	}
}

/* Matches the height of all divs (as an array) passed in the items parameters */
function matchHeight(items, isClassName){
	var divs,maxHeight,divHeight,d;
	// get all <div> elements in the document
	if (isClassName) {
        divs=getElementsByClass(items);
    }
    else {
	   divs=items;
    }
	// initialize maximum height value
	maxHeight=0;
	// iterate over all <div> elements in the document
	for(var i=0;i<divs.length;i++){
		d=divs[i];
        if (d != undefined) {
            // determine height for <div> element
            if(d.offsetHeight){
                divHeight=d.offsetHeight;
            }
            else if(d.style.pixelHeight){
                divHeight=d.style.pixelHeight;
            }
            // calculate maximum height
            maxHeight=Math.max(maxHeight,divHeight);
		}
	}
	// assign maximum height value to all of container <div> elements
	for(var i=0;i<items.length;i++){
        d=divs[i];
        if (d != undefined) {
            d.style.height=maxHeight + "px";
        }
	}
}


