
///////////////////////// MEMLIB /////////////////////////
// Common JavaScript tasks
//////////////////////////////////////////////////////////



////////// QUERY, PATH, AND COOKIE //////////

var Path		= null;					// Will be string after '#' in URL
var P 			= new Array();			// Array of Path split by /
var QS			= new Object;			// Associative object of query string
var C			= new Object;			// Associative object of cookies




// Convert file.html#/abc/def into an object
function getPath () {
	if (document.location.hash) {
		Path 	= document.location.hash.substring(1).replace(RegExp('[<>"\']','g'), '');
		P		= Path.split('/');
	}
}

// Convert query string into an object
function getQS (str) {
	if ((!str) && (document.location.search))
		str = document.location.search.substring(1).replace(/\+/g, ' ');
		
	var qs=new Array();
	if (str) {
		var pairs = QueryString.split('&');
		for (var i = 0; i < pairs.length; i++) {
			var pair 		= pairs[i].split('=');
			var name 		= decodeURIComponent(pair[0]);
			var key			= decodeURIComponent(pair[1]);
			QS[name]		= key;
		}
	}
	return qs;
}

// Convert object to query string
function setQS (obj) {
	var pairs=new Array();
	for (var k in obj) {
		pairs.push(encodeURIComponent(k)+'='+encodeURIComponent(obj[k]));
	}
	return pairs.join('&');
}


// Convert Cookie into an object
function getCookie () {
 	if (document.cookie) {
		var pairs = document.cookie.split('; ');
		for (var i = 0; i < pairs.length; i++) {
			var pair 		= pairs[i].split('=');
			var name 		= decodeURIComponent(pair[0]);
			var key			= decodeURIComponent(pair[1]);
			C[name]			= key;
		}
	}
}

// Set a cookie
function setCookie (key, value, expiredays) {
	// calculate expiration
	var expires = '';
	if (expiredays) {
		var exdate=new Date();
		exdate.setDate(exdate.getDate()+expiredays);
		var expires = '; expires=' + exdate.toGMTString();
	}
	
	// set cookie
	document.cookie = key + '=' + encodeURIComponent(value) + expires + '; path=/';
	
	getCookie();
}

getPath(); 
QS=getQS();
getCookie(); 



////////// XML/XHTML PARSING //////////

// Return arr of tag's XML children
function getchildren (tag, xml) {	
	if (xml.getElementsByTagName(tag)[0])	return xml.getElementsByTagName(tag);
	else 									return false;
}

// Return a tag's child XML
function getchild (tag, xml) {
	if (xml.getElementsByTagName(tag)[0])	return xml.getElementsByTagName(tag)[0];
	else 									return false;

}

// Return one tag's value
function getvalue (tag, xml) {
	if (xml.getElementsByTagName(tag)[0] &&
	xml.getElementsByTagName(tag)[0].childNodes[0])
			return xml.getElementsByTagName(tag)[0].childNodes[0].nodeValue;
	else 	return false;
}

// Get child's value
function myvalue (xml) {
	if (xml.hasChildNodes())					return xml.childNodes[0].nodeValue;
	else 									return false;
}

// Return XML as Object
function xml2object (xml) {
 	if (xml.childNodes) {
		var nodes 	= xml.childNodes;
		var Obj		= new Object;
		for (var i=0; i< nodes.length; i++) {
		 	if (nodes[i].hasChildNodes()) 			Obj[nodes[i].nodeName] = nodes[i].childNodes[0].nodeValue;
		 	else if (nodes[i].nodeName!='#text') 	Obj[nodes[i].nodeName] = '';
		}
		return Obj;
	}
	else return false;
}

// Create a new XML xmlect and append it to a parent xmlect
function newchild (parentObj, childTag, className, content) {
	var childObj = document.createElement(childTag);
	if (className)	childObj.className = className;
	if (parentObj)	parentObj.appendChild(childObj);
	if (content)	childObj.innerHTML = content;
	return childObj;
}

// Return array of <item>'s in XML
function getitems (tagName, xml) {
	var newxml = getchild(tagName, xml);
 	if (newxml.childNodes) {
		for (var i=0; i < newxml.childNodes.length; i++) {
		 	if (newxml.childNodes[i].nodeName!='item') { newxml.removeChild(newxml.childNodes[i]); i--; }
		}
		return newxml.childNodes;
	}
	else return false;
}



////////////// HTML //////////////////

// <DIV>
function div (parentObj, className, content) {
	return newchild(parentObj, 'div', className, content);
}

// <DIV> in a <DIV>
function div2 (parentObj, className) {
	return div(div(parentObj, className, className));
}

// <SPAN>
function span (parentObj, className, content) {
	return newchild(parentObj, 'span', className, content);
}

// <H1>
function h1 (parentObj, content) {
	return newchild(parentObj, 'h1', '', content);
}

// <H2>
function h2 (parentObj, content) {
	return newchild(parentObj, 'h2', '', content);
}

// <H3>
function h3 (parentObj, content) {
	return newchild(parentObj, 'h3', '', content);
}

// <BR> 
function br (parentObj) {
	return newchild(parentObj, 'br');
}
// <SPAN>&middot;</span>
function dot (parentObj) {
	return span (parentObj, 'spacer');
}

// <A>
function href (parentObj, name, url, className) {
	if (!url) 			url = 'javascript:void(0)'; 
	var childObj 		= document.createElement('a');
	childObj.href 		= url;
	childObj.innerHTML 	= name;
	if (className) 		childObj.className = className;
	
	parentObj.appendChild(childObj);
	return childObj;
}

// <IMG>
function img (parentObj, src, className) {
	var childObj	= document.createElement('img');
	if (src)		childObj.src = src;
	if (className)	childObj.className = className;
	if (parentObj)	parentObj.appendChild(childObj);
	return			childObj;
}

// add innerHTML
function inh (parentObj, content) {
	parentObj.innerHTML+=content;
}


// Add a CSS class to an object
function addclass (obj, className) {
	obj				= gid(obj);
	var classes		= obj.className.split(' ');
	var found		= false;
	
	for (var i=0; i<classes.length; i++) {
	 	if (classes[i]==className) found=true;
	}
	
	if (!found) {
		classes.push(className);
		obj.className	= classes.join(' ');
	}
}

// Drop a CSS class from an object
function dropclass (obj, className) {
	obj				= gid(obj);
	var classes		= obj.className.split(' ');
	var newClasses	= new Array();
	
	for (var i=0; i<classes.length; i++) {
		if (classes[i] != className) newClasses.push(classes[i]);
	}		

	obj.className	= newClasses.join(' ');
}

// Place message in message div
var msgTO;
function msg (type, body, clearflag) {
	clearTimeout(msgTO);
	clear(MSG);
	div(MSG, type, body).onclick=function(){clear(MSG);};
	if (clearflag) msgTO = setTimeout("clear(MSG)", 10000);
}

// Hide something
function vanish (id) {
	var element = gid(id);
	element.style.display='none';
}

// pop up link
function phref (parentObj, name, url, className) {
	return href (parentObj, name, "javascript:pop('"+url+"');void(0)", className);
}


// Return an onject from its HTML id
function gid (i) { 
	if (typeof(i) == 'string') {
		if (document.getElementById(i)) return document.getElementById(i);
	}
	else if (typeof(i) == 'object') return i;
	else return false;
}

// Redirect browser
function go (url) {
	window.location.href=url;
}

// Escape HTML
function escapeHTML (str) {                                       
    return(                                                                 
        str.replace(/&/g,'&amp;').                                         
            replace(/>/g,'&gt;').                                           
            replace(/</g,'&lt;').                                           
            replace(/"/g,'&quot;')                                         
    );                                                                     
};

// Dynamically load a CSS file
function loadCSS (file) {
 
 	var links 	= document.getElementsByTagName("link");
	var found 	= false;
	for (var i=0; i<links.length; i++) {
		if (links[i].href.indexOf(file)>=0) found=true;
	} 
 
	if (!found) {
		var newfile		= document.createElement('link');
		newfile.rel		= "stylesheet";
		newfile.type	= "text/css";
		newfile.href	= CSSURL + file;
		document.getElementsByTagName("head")[0].appendChild(newfile);
	}
}

// Dynamically load a JS file
function loadJS (file) {
 
 	var links 	= document.getElementsByTagName("script");
	var found 	= false;
	for (var i=0; i<links.length; i++) {
		if (links[i].src.indexOf(file)>=0) found=true;
	} 
 
	if (!found) {
		var newfile		= document.createElement('script');
		newfile.type	= "text/javascript";
		newfile.src		= JSSURL + file;
		document.getElementsByTagName("head")[0].appendChild(newfile);
	}
}

// New Doc title
function newTitle (str) {
	document.title = Title + TitleSpacer + str;
}

// New Doc description
function newDesc (str) {
	gid('metaDesc').setAttribute('content', str);
}

// Clear inner HTML from obj
function clear (obj) {
	if (!obj) obj=MAIN;
	obj.innerHTML		= '';
}

// Parse body for line breaks and links
function parseBody (str) {
	if (!str)	return '';
	else return str.toString()
			.replace(/\r?\n/g, '<br/>')
			.replace(/(http:\/\/[^\s\"\'\<]+)/g, '<a href="$1" target="_blank"><b>$1</b></a>')
			.replace(/([^\/])(www.[^\s\"\'\<]+)/g, '$1<a href="http://$2" target="_blank"><b>$2</b></a>')
			.replace(/\#([A-Za-z0-9]+\.[A-Za-z0-9\.]+[A-Za-z]+)/g, ' <a href="/#$1">#$1</a>')
			.replace(/\.">/g, '">')
			.replace(/\.<\/a>/g, '</a>.')
		;
}

// Parse body for line breaks and links
function parseDesc (str) {
	if (!str)	return '';
	else return str.toString()
			.replace(/\#([A-Za-z0-9]+\.[A-Za-z0-9\.]+[A-Za-z]+)/g, ' <a href="/#$1">#$1</a>')
			.replace(/\.">/g, '">')
			.replace(/\.<\/a>/g, '</a>.')
		;
}



////////////// DATE & NUMBER FUNCTIONS //////////////////

function timeAgo (then) {
	var date 	= new Date;
	var now		= Math.round(date.getTime()/1000);
	var seconds	= now-parseInt(then);
	
	if 		(seconds<90) 		return '1 min ago';
	else if	(seconds<3600)		return Math.round(seconds/60) + ' min ago';
	else if	(seconds<5400)		return '1 hr ago';
	else if	(seconds<86400)		return Math.round(seconds/3600) + ' hrs ago';
	else if	(seconds<172800)	return 'Yesterday';
	else {
		date.setTime(then*1000);
		return Months[date.getMonth()+1] + ' ' + date.getDate() + ', ' + date.getFullYear();
	}
}


function timeFull (then) {
	var date 	= new Date;
	var now		= Math.round(date.getTime()/1000);
	var seconds	= now-parseInt(then);
	
	if 		(seconds<90) 		return '1 minute ago';
	else if	(seconds<3600)		return Math.round(seconds/60) + ' minutes ago';
	else if	(seconds<5400)		return '1 hour ago';
	else if	(seconds<86400)		return Math.round(seconds/3600) + ' hours ago';
	else if	(seconds<172800)	return 'Yesterday';
	else {
		date.setTime(then*1000);
		return Months[date.getMonth()+1] + ' ' + date.getDate() + ', ' + date.getFullYear();
	}
}





var Months	= new Object();
Months[1]	= 'Jan';
Months[2]	= 'Feb';
Months[3]	= 'Mar';
Months[4]	= 'Apr';
Months[5]	= 'May';
Months[6]	= 'Jun';
Months[7]	= 'Jul';
Months[8]	= 'Aug';
Months[9]	= 'Sep';
Months[10]	= 'Oct';
Months[11]	= 'Nov';
Months[12]	= 'Dec';



function writeDate (date) {
	var y=date.substring(0,4);
	var m=date.substring(4,6);
	var d=date.substring(6,8);
	
	if (m.substring(0,1)==0) m=m.substring(1,2);
	
	return d + ' ' + Months[m] + ' ' + y;
}





// Add zeros before a number
function zerofill (n, len) {
	if (!len) 	len		= 2;
	var 		n 		= String(n);
	var 		nn 		= '';	

	if (n.length<len) {
		for (var i=len-n.length; i>0; i--) nn += '0';
	}

	return nn+n;
}

function zeropad (n, len) {
	if (!len) 	len		= 2;
	var 		n 		= String(n);
	var 		nn 		= '';	

	if (n.length<len) {
		for (var i=len-n.length; i>0; i--) nn += '0';
	}

	return n+nn;
}



// Add thousand commas
function money (nStr, cents) {
	nStr += '';
	
	// sign
	var sign='';
	if (nStr.indexOf('-')===0) {
		sign='-';
		nStr=nStr.substring(1,nStr.length);
	}
	
	// decimal
	x 	= nStr.split('.');
	x1 	= x[0];
	x2	= '';
	if (cents) x2 = x.length > 1 ? '.' + zeropad(x[1].substring(0,2),2) : '.00';
	
	// commas
	var rgx = /(\d+)(\d{3})/;
	while (rgx.test(x1)) {
		x1 = x1.replace(rgx, '$1' + ',' + '$2');
	}
	
	// return
	return sign + '$' + x1 + x2;
}



// Format phone number
function phone (ph) {
	if (!ph) return '';
	
	var n = ph.toString();
	if 		(parseInt(n)>999999999)	return '('+n.substring(0,3)+') '+n.substring(3,6)+'-'+n.substring(6,10);
	else if (parseInt(n)>999999)	return n.substring(0,3)+'-'+n.substring(3,4);
	else							return '';
}



// Profile pic
function pic (uid, size, random) {
	if (!uid)	uid		= S.uid;
	if (!size)	size 	= 3;
	var rand = random ? '?random='+Math.random() : '';
	return PicURL+'/'+uid.toString().substr(uid.toString().length-2,2)+'/'+uid+'.'+size+'.jpg'+rand;
}


// Profile pic
function bizpic (bizid, size, random) {
	if (!bizid)	bizid	= '0';
	if (!size)	size 	= 3;
	var rand = random ? '?random='+Math.random() : '';
	return PicURL+'/'+bizid.toString().substr(bizid.toString().length-2,2)+'/'+bizid+'.biz'+size+'.jpg'+rand;
}





function dump (J) {
	var html='';
	var k2='';
	
	if (J===null) html+=': NULL';
	
	else if (typeof(J)=='object') {
		html+='<ul>';
		for (var k in J) {
			k2 = (parseInt(k)==k) ? 'item' : k;
			html+='<li>'+k2+dump(J[k])+'</li>';
		}
		html+='</ul>';
	}
	
	else html+=': '+J;

	return html;
}

