
function $(){
	if(arguments.length == 1){
		return document.getElementById(arguments[0]);
	} else{
		var objArr = new Array();
		for(var i=0;i<arguments.length;i++) objArr[i] = document.getElementById(arguments[i]);
		return objArr;
	}
}
function $n(){
	if(arguments.length == 1){
		return document.getElementsByName(arguments[0]);
	} else{
		var objArr = new Array();
		for(var i=0;i<arguments.length;i++) objArr[i] = document.getElementsByName(arguments[i]);
		return objArr;
	}
}
// add/remove event
function $ae(obj,type,fn){
	if(obj.attachEvent){
		obj['e'+type+fn] = fn;
		obj[type+fn] = function(){obj['e'+type+fn](window.event);}
		obj.attachEvent('on'+type, obj[type+fn]);
	} else
		obj.addEventListener(type,fn,false);
}
function $re(obj,type,fn){
	if(obj.detachEvent){
		obj.detachEvent('on'+type,obj[type+fn]);
		obj[type+fn] = null;
	} else
		obj.removeEventListener(type,fn,false);
}
// get/set attribute(s)
function $ga(obj,att){
	if(!obj.tagName){
		var attArr = new Array();
		for(var i=0;i<obj.length;i++){
			if(typeof att == 'object'){
				for(var j=0;j<att.length;i++)
					attArr[attArr.length] = obj[i].getAttribute(att[j]);
			} else{
				attArr[attArr.length] =  obj[i].getAttribute(att);
			}
		}
		return attArr;
	} else{
		if(typeof att == 'object'){
			var attArr = new Array();
			for(var i=0;i<att.length;i++)
				attArr[i] = obj.getAttribute(att[i]);
			return attArr
		} else{
			return obj.getAttribute(att);
		}
	}
}
function $sa(obj,att,val){
	if(!obj.tagName){
		for(var i=0;i<obj.length;i++){
			if(typeof att == 'object'){
				for(var j=0;j<att.length;i++)
					obj[i].setAttribute(att[j],val[j]);
			} else{
				obj[i].setAttribute(att,val);
			}
		}
	} else{
		if(typeof att == 'object'){
			for(var i=0;i<att.length;i++)
				obj.setAttribute(att[i],val[i]);
		} else{
			obj.setAttribute(att,val);
		}
	}
}
// get/set value(s)
function $gv(obj){
	if(!obj.tagName){
		var objArr = new Array();
		var tag = ''
		for(var i=0;i<obj.length;i++){
			objArr[i] = $gvs(obj);
		}
		return objArr;
	} else{
		return $gvs(obj);
	}
}
function $gvs(obj){
	if(!obj.tagName){
		var tArr = new Array();
		var tag = '';
		var type = '';
		for(var i=0;i<obj.length;i++){
			tag = obj[i].tagName.toLowerCase();
			if(tag == 'input'){
				type = obj[i].type.toLowerCase();
				if(type == 'checkbox' || type == 'radio'){
					if(obj[i].checked == true)
						tArr.push(obj[i].value);
				} else
					tArr.push(obj[i].value);
			} else if(tag == 'select'){
				if(obj[i].multiple == true){
					for(var j=0;j<obj[i].options.length;j++){
						if(obj[i].options[j].selected == true)
							tArr.push(obj[i].options[j].value);
					}
				} else
					tArr.push(obj[i].value);
			} else{
				tArr.push(obj[i].value);
			}
		}
		return tArr;
	} else{
		var tag = obj.tagName.toLowerCase();
		if(tag == 'input' || tag == 'textarea'){
			return obj.value;
		} else if(tag == 'select'){
			if(obj.multiple == true){
				for(var j=0;j<obj.options.length;j++){
					if(obj.options[j].selected == true)
						tArr.push(obj.options[j].value);
				}
				return tArr;
			} else
				return obj.value;
		} else{
			return obj.innerHTML;
		}
	}
}
function $sv(obj,val){
	if(!obj.tagName){
		if(typeof val == 'object'){
			for(var i=0;i<obj.length;i++){
				$svs(obj[i],val[i]);
			}
		} else{
			for(var i=0;i<obj.length;i++){
				$svs(obj[i],val);
			}
		}
	} else{
		$svs(obj,val);
	}
}

function $svs(obj,val){
	
	if(!obj.tagName){
		var tag = '';
		var type = '';
		if(typeof val == 'object'){
			for(var i=0;i<obj.length;i++){
				tag = obj[i].tagName.toLowerCase();
				if(tag == 'input'){
					type = obj[i].type.toLowerCase();
				} else{
					type = '';
				}
				if(type == 'checkbox' || type == 'radio'){
					if($u.a.find(val,obj[i].value) != -1){
						obj[i].checked = true;
					} else{
						obj[i].checked = false;
					}
				} else if(tag == 'select'){
					if(obj[i].multiple == true){
						for(var j=0;j<obj[i].options.length;j++){
							if($u.a.find(val,obj[i].options[j].value) != -1){
								obj[i].options[j].selected = true;
							} else
								obj[i].options[j].selected = false;
						}
					} else{
						obj[i].value = val;
					}
				} else{
					obj[i].value = val;
				}
			}
		} else{
			for(var i=0;i<obj.length;i++){
				tag = obj[i].tagName.toLowerCase();
				if(tag == 'input'){
					type = obj[i].type.toLowerCase();
				} else{
					type = '';
				}
				if(type == 'checkbox' || type == 'radio'){
					if(obj[i].value == val){
						obj[i].checked = true;
					} else{
						obj[i].checked = false;
					}
				} else if(tag == 'select'){
					if(obj[i].multiple == true){
						for(var j=0;j<obj[i].options.length;j++){
							if(obj[i].options[j].value == val){
								obj[i].options[j].selected = true;
							} else
								obj[i].options[j].selected = false;
						}
					} else{
						obj[i].value = val;
					}
				} else{
					obj[i].value = val;
				}
			}
		}
	} else{
		var tag = obj.tagName.toLowerCase();
		if(tag == 'input'){
			var type = obj.type.toLowerCase();
			if(type == 'checkbox' || type == 'radio'){
				obj.checked = $u.s.toBool(''+val);
			} else{
				obj.value = val;
			}
		} else if(tag == 'select'){
			if(typeof val == 'object'){
				if(obj.multiple == true){
					for(var i=0;i<obj.options.length;i++){
						if($u.a.find(val,obj.options[i].value) != -1){
							obj.options[i].selected = true;
						} else
							obj.options[i].selected = false;
					}
				} else{
					obj.value = val;
				}
			} else{
				if(obj.multiple == true){
					for(var i=0;i<obj.options.length;i++){
						if(obj.options[i].value == val){
							obj.options[i].selected = true;
						} else
							obj.options[i].selected = false;
					}
				} else{
					obj.value = val;
				}
			}
		} else if(tag == 'textarea'){
			obj.value = val;
		} else{
			obj.innerHTML = val;
		}
	}
}

// get/set value(s) by id
function $gvById(obj){
	if(typeof obj == 'object'){
		var objArr = new Array();
		for(var i=0;i<obj.length;i++)
			objArr[i] = $gv($(obj[i]));
		return objArr;
	} else{
		return $gv($(obj));
	}
}
function $svById(obj,val){
	if(typeof obj == 'object'){
		for(var i=0;i<obj.length;i++)
			$sv($(obj[i]),val[i]);
	} else{
		$sv($(obj),val);
	}
}
// get/set style(s)
function $gs(obj){
	if(!obj.tagName){
		var styleArr = new Array();
		for(var i=0;i<obj.length;i++)
			styleArr[styleArr.length] =  obj[i].style.cssText;
		return styleArr;
	} else{
		return obj.style.cssText;
	}
}
function $ss(obj,styleObj){
	if(!obj.tagName){
		for(var i=0;i<obj.length;i++){
			tObj = obj[i];
			for(var prop in styleObj) tObj.style[prop] = styleObj[prop];
		}
	} else{
		for(var prop in styleObj) obj.style[prop] = styleObj[prop];
	}
}
// set className / add class name / remove class name
function $scn(obj,val){
	if(!obj.tagName)for(var i=0;i<obj.length;i++) obj[i].className = val;
	else obj.className = val;
}
function $acn(obj,val){
	if(!obj.tagName)for(var i=0;i<obj.length;i++) obj[i].className = obj[i].className+' '+val;
	else obj.className = obj.className+' '+val;
}
function $rcn(obj,val){
	if(!obj.tagName)for(var i=0;i<obj.length;i++) obj[i].className = $u.s.tran(' '+obj[i].className,' '+val,'');
	else obj.className = $u.s.tran(' '+obj.className,' '+val,'')
}

// create DOM node(s)
function $cdn(obj){
	var n;
	if(typeof obj == 'string'){
		n = document.createTextNode(obj);
	} else{
		n = document.createElement(obj.tagName);
		delete obj.tagName;
		if(obj.children){
			if(obj.children.constructor == Array){
				for(var i=0;i<obj.children.length;i++) n.appendChild($cdn(obj.children[i]));
			} else{
				 n.appendChild($cdn(obj.children));
			}
			delete obj.children;
		}
		for(var attr in obj){
			if(attr != 'style') n[attr] = obj[attr];
			else $ss(n,obj[attr]);
		}
	}
	return n
}

// size object relative
function $sor(chObj,obj,type){
	type = type.toLowerCase();
	var w = obj.offsetWidth;
	var h = obj.offsetHeight;
	if(type != 'hw' && type != 'h'){
		var wOff = arguments[3] ? arguments[3] : 0;
		var hOff = arguments[4] ? arguments[4] : 0;
	} else{
		var wOff = arguments[4] ? arguments[4] : 0;
		var hOff = arguments[3] ? arguments[3] : 0;
	}
	if(wOff < 1 && wOff > 0) wOff = Math.round(w*Math.abs(wOff-1));
	if(hOff < 1 && hOff > 0) hOff = Math.round(h*Math.abs(hOff-1));
	
	if(type == 'w') chObj.style.width = (w-wOff)+'px';
	else if(type == 'h') chObj.style.height = (h-hOff)+'px';
	else if(type == 'wh' || type == 'hw'){
		chObj.style.width = (w-wOff)+'px';
		chObj.style.height = (h-hOff)+'px';
	}
	
}
// get position
function $gpl(obj){
	var lPos = obj.offsetLeft;
	var pEle = obj.offsetParent;
	while (pEle != null){
		lPos += pEle.offsetLeft;
		pEle = pEle.offsetParent;
	}
	return lPos;
}
function $gpt(obj){
	var tPos = obj.offsetTop;
	var pEle = obj.offsetParent;
	while (pEle != null){
		tPos += pEle.offsetTop;
		pEle = pEle.offsetParent;
	}
	return tPos;
}
// position object
function $po(chObj,obj,type,mOff,sOff){
	var pTop = $gpt(obj);
	var pLeft = $gpl(obj);
	var pWidth = obj.offsetWidth;
	var pHeight = obj.offsetHeight;
	var cWidth = chObj.offsetWidth;
	var cHeight = chObj.offsetHeight;
	switch(type){
		case(1):
			chObj.style.left = (pLeft-cWidth-mOff)+'px';
			chObj.style.top = (pTop-cHeight-sOff)+'px';
		break
		case(2):
			chObj.style.left = (pLeft+sOff)+'px';
			chObj.style.top = (pTop-cHeight-mOff)+'px';
		break
		case(3):
			chObj.style.left = (pLeft+(pWidth-cWidth)-sOff)+'px';
			chObj.style.top = (pTop-cHeight-mOff)+'px';
		break
		case(4):
			chObj.style.left = (pLeft+pWidth+mOff)+'px';
			chObj.style.top = (pTop-cHeight-sOff)+'px';
		break
		case(5):
			chObj.style.left = (pLeft-cWidth-mOff)+'px';
			chObj.style.top = (pTop+sOff)+'px';
		break
		case(6):
			chObj.style.left = (pLeft+sOff)+'px';
			chObj.style.top = (pTop+mOff)+'px';
		break
		case(7):
			chObj.style.left = (pLeft+pWidth-cWidth-sOff)+'px';
			chObj.style.top = (pTop+mOff)+'px';
		break
		case(8):
			chObj.style.left = (pLeft+pWidth+mOff)+'px';
			chObj.style.top = (pTop+sOff)+'px';
		break
		case(9):
			chObj.style.left = (pLeft-cWidth-mOff)+'px';
			chObj.style.top = (pTop-(cHeight-pHeight)-sOff)+'px';
		break
		case(10):
			chObj.style.left = (pLeft+sOff)+'px';
			chObj.style.top = (pTop-(cHeight-pHeight)-mOff)+'px';
		break
		case(11):
			chObj.style.left = (pLeft+pWidth-cWidth-sOff)+'px';
			chObj.style.top = (pTop-(cHeight-pHeight)-mOff)+'px';
		break
		case(12):
			chObj.style.left = (pLeft+pWidth+mOff)+'px';
			chObj.style.top = (pTop-(cHeight-pHeight)-sOff)+'px';
		break
		case(13):
			chObj.style.left = (pLeft-cWidth-mOff)+'px';
			chObj.style.top = (pTop+pHeight+sOff)+'px';
		break
		case(14):
			chObj.style.left = (pLeft+sOff)+'px';
			chObj.style.top = (pTop+pHeight+mOff)+'px';
		break
		case(15):
			chObj.style.left = (pLeft+(pWidth-cWidth)-sOff)+'px';
			chObj.style.top = (pTop+pHeight+mOff)+'px';
		break
		case(16):
			chObj.style.left = (pLeft+pWidth+mOff)+'px';
			chObj.style.top = (pTop+pHeight+sOff)+'px';
		break
		case(17):
			chObj.style.left = (pLeft+Math.round(pWidth/2)-Math.round(cWidth/2)+sOff)+'px';
			chObj.style.top = (pTop-cHeight-mOff)+'px';
		break
		case(18):
			chObj.style.left = (pLeft-cWidth-mOff)+'px';
			chObj.style.top = (pTop+Math.round(pHeight/2)-Math.round(cHeight/2)+sOff)+'px';
		break
		case(19):
			chObj.style.left = (pLeft+Math.round(pWidth/2)-Math.round(cWidth/2)+sOff)+'px';
			chObj.style.top = (pTop+Math.round(pHeight/2)-Math.round(cHeight/2)+mOff)+'px';
		break
		case(20):
			chObj.style.left = (pLeft+pWidth+mOff)+'px';
			chObj.style.top = (pTop+Math.round(pHeight/2)-Math.round(cHeight/2)+sOff)+'px';
		break
		case(21):
			chObj.style.left = (pLeft+Math.round(pWidth/2)-Math.round(cWidth/2)+sOff)+'px';
			chObj.style.top = (pTop+pHeight+mOff)+'px';
		break
	}
}



// Class object
var Class = {
	create: function() {
		return function() {
			if(this.initialize)
				this.initialize.apply(this, arguments);
		}
	}
}

// immediate if
function $if(expr,tVal,fVal){
	return expr ? tVal : fVal;
}

// utility functions (s: string, n: number, d: date, a: array, o: object, b: boolean)
var $u = {
	comma: ',',
	decimal: '.',
	currency: '$',
	days: ['sunday','monday','tuesday','wednesday','thursday','friday','saturday'],
	daysShort: ['sun','mon','tue','wed','thur','fri','sat'],
	months: ['january','february','march','april','may','june','july','august','september','october','november','december'],
	monthsShort: ['jan','feb','mar','apr','may','jun','jul','aug','sep','oct','nov','dec'],
	compare: function(obj1,obj2){
		if(obj1 == obj2)
			return true;
		var val1 = $u.o.toJSON(obj1);
		var val2 = $u.o.toJSON(obj2);
		if(val1 == val2)
			return true;
		return false;
	},
	s: {
		toNum: function(str) {
			// String to Number
			var regEx = RegExp('[^\-0-9'+$u.decimal+']');
			str = str.split(regEx).join('');
			if(str.indexOf('-') != -1){
				var negNum = (str.indexOf('-') == 0) ? true : false;
				var regEx = RegExp('[^0-9'+$u.decimal+']');
				str = $if(negNum,'-','')+str.split(regEx).join('');
			}
			return Number(str);
		},
		toBool: function(str) {
			// String to Boolean
			str = $u.s.aTrim(str).toLowerCase();
			if(str == 'true' || str == 'yes' || str == '1' || str == '.t.'){
				return true;
			} else
				return false;
		},
		lTrim: function(str,tc){
			// Left Trim
			if(!tc || tc == '') tc = ' ';
			while(tc.indexOf(str.charAt(0)) != -1)
				str = str.substring(1,str.length);
			return str;
		},
		rTrim: function(str,tc){
			// Right Trim
			if(!tc || tc == '') tc = ' ';
			while(tc.indexOf(str.charAt(str.length-1)) != -1)
				str = str.substring(0,str.length-1);
			return str;
		},
		aTrim: function(str,tc){
			// All Trim
			if(!tc || tc == '') tc = ' ';
			str = this.lTrim(str,tc);
			str = this.rTrim(str,tc);
			return str;
		},
		tran: function(str,sStr,rStr){
			// Transform
			if(typeof sStr == 'object'){
				for(var i=0;i<sStr.length;i++){
					var arr = str.split(sStr[i]);
					str = arr.join(rStr[i]);
				}
			} else{
				var arr = str.split(sStr);
				str = arr.join(rStr);
			}
			return str;
		},
		word: function(str,num,sep){
			// Word
			if(sep == '') sep = ' ';
			var arr = str.split(sep);
			if(num>-1){
				return arr[num-1];
			} else
				return arr[arr.length+num];
		},
		ellipse: function(str,len){
			var elpStr = (arguments[3]) ? arguments[3] : '...';
			var align = (arguments[2]) ? arguments[2].substring(0,1).toLowerCase() : 'l';
			if(align == 'r'){
				str = str.substring(0,len-elpStr.length)+elpStr;
			} else if(align == 'c'){
				var lLen = Math.round((len-elpStr.length)/2);
				var rLen = str.length-(len-elpStr.length-lLen);
				str = str.substring(0,lLen)+elpStr+str.substring(rLen,str.length);
			} else{
				str = elpStr+str.substring(str.length-(len-elpStr.length),str.length);
			}
			return str;
		},
		pad: function(str,padLen,padStr){
			var align = arguments[3] ? arguments[3].toLowerCase() : 'l';
			if(padLen == -1){
				return str;
			} else if(str.length > padLen){
				return str.substr(0,padLen);
			} else{
				padStr = $u.s.replicate(padStr,padLen)
				if(align == 'l'){
					return padStr.substring(0,padLen-str.length)+str;
				} else if(align == 'r'){
					return str+padStr.substring(0,padLen-str.length);
				} else if(align == 'c'){
					padLen = padLen-str.length;
					var lLen = Math.round(padLen/2);
					var rLen = padLen-lLen;
					return padStr.substring(0,lLen)+str+padStr.substring(0,rLen);
				}
			}
		},
		replicate: function(str,repNum){
			var repArr = new Array();
			for(var i=0;i<repNum;i++) repArr.push(str);
			return repArr.join('');
		},
		changeCase: function(str,type){
			type = type.toLowerCase();
			switch(type){
				case('u'):
					return str.toUpperCase();
				break
				case('l'):
					return str.toLowerCase();
				break
				case('fu'):
					return str.substr(0,1).toUpperCase()+str.substr(1);
				break
				case('furl'):
					return str.substr(0,1).toUpperCase()+str.substr(1).toLowerCase();
				break
				case('wfu'):
					var wordsArr = str.split(' ');
					for(var i=0;i<wordsArr.length;i++) wordsArr[i] = $u.s.changeCase(wordsArr[i],'fu');
					return wordsArr.join(' ');
				break
				case('wfurl'):
					str = str.toLowerCase();
					var wordsArr = str.split(' ');
					for(var i=0;i<wordsArr.length;i++) wordsArr[i] = $u.s.changeCase(wordsArr[i],'fu');
					return wordsArr.join(' ');
				break
			}
		}
	},
	n: {
		toStr: function(valNum,decNum){
			var format = arguments[2] ? arguments[2].toUpperCase() : '';
			if(format.indexOf('B') != -1 && valNum == 0) return '';
			var comma = (format.indexOf(',') != -1) ? true : false;
			var prefixNeg = (format.indexOf('-') != -1) ? true : false;
			var parenNeg = (format.indexOf('(') != -1) ? true : false;
			var negStr = valNum < 0 ? '-' : '';
			
			var prefix = arguments[3] ? arguments[3] : '';
			var suffix = arguments[4] ? arguments[4] : '';
			
			valNum = $u.n.round(Math.abs(valNum),decNum);
			var str = String(valNum);
			var intStr = $u.s.word(str,1,'.');
			var decStr = $u.s.word(str,2,'.');
			if(!decStr) decStr = '0';
			if(decStr.length != decNum) decStr = $u.s.pad(decStr,decNum,'0','r');
			
			if(comma && intStr.length > 3){
				var intArr = new Array();
				var placeInc = Math.round((intStr.length/3)+.49);
				intStr = $u.s.pad(intStr,placeInc*3,'0','l')
				intArr.push($u.s.lTrim(intStr.substr(0,3),'0'));
				for(var i=1;i<placeInc;i++){
					intArr.push(intStr.substr(i*3,3));
				}
				intStr = intArr.join($u.comma);
			}
			
			if(prefixNeg && negStr != '') prefix = negStr+prefix;
			else if(parenNeg && negStr != ''){
				prefix = '('+prefix;
				suffix = suffix+')';
			} else intStr = negStr+intStr;
			
			return prefix+intStr+$u.decimal+decStr+suffix;
		},
		toPlaceStr: function(num){
			num = Math.round(num);
			var numStr = String(num);
			var numEnd = parseInt(numStr.slice(-2));
			if(numEnd > 3 && numEnd < 21)
				return numStr+'th';
			var numEnd = parseInt(numStr.slice(-1));
			if(numEnd == 1)
				return numStr+'st';
			else if(numEnd == 2)
				return numStr+'nd';
			else if(numEnd == 3)
				return numStr+'rd';
			else
				return numStr+'th';
		},
		round: function(valNum,decNum){
			if(!isNaN(valNum) && !isNaN(decNum)){
				var tempDecNum = Math.pow(10,decNum);
				return (Math.round(valNum*tempDecNum)/tempDecNum);
			}
		}
	},
	a: {
		find: function(){
			var arr = arguments[0];
			var val = arguments[1];
			var searchAll	= typeof arguments[2] != 'undefined' ? arguments[2] : false;
			var exactMatch	= typeof arguments[3] != 'undefined' ? arguments[3] : true;
			var indxArr = Array();
			if(exactMatch == true){
				for(var i=0;i<arr.length;i++){
					if(arr[i] == val){
						indxArr.push(i);
						if(searchAll != true) break;
					}
				}
			} else{
				for(var i=0;i<arr.length;i++){
					if(String(arr[i]).indexOf(String(val)) != -1){
						indxArr.push(i);
						if(searchAll != true) break;
					}
				}
			}
			if(indxArr.length == 0)
				indxArr.push(-1);
			
			if(searchAll == true){
				return indxArr;
			} else{
				return indxArr[0];
			}
		},
		compare: function(a,b){
			var type	= arguments[2] ? arguments[2] : '<';
			if(typeof a != 'object')
				a = new Array(a);
			if(typeof b != 'object')
				b = new Array(b);
			var indx = new Array();
			var tArr = new Array();
			if(type == '>'){
				for(var i=0;i<a.length;i++){
					indx = $u.a.find(b,a[i]);
					if(indx == -1)
						tArr[tArr.length] = a[i];
				}
			} else if(type == '='){
				for(var i=0;i<b.length;i++){
					indx = $u.a.find(a,b[i]);
					if(indx != -1)
						Arr[tArr.length] = b[i];
				}
			} else{
				for(var i=0;i<b.length;i++){
					indx = $u.a.find(a,b[i]);
					if(indx == -1)
						tArr[tArr.length] = b[i];
				}
			}
			return tArr
		},
		dedup: function(arr){
			var tArr = new Array();
			for(var i=0;i<arr.length;i++){
				if($u.a.find(tArr,arr[i]) == -1)
					tArr[tArr.length] = arr[i];
			}
			return tArr;
		},
		copy: function(arr){
			return new Array(arr);
		}
	},
	o: {
		assign: function(objD,obj){
			var lAssign = typeof arguments[2] != 'undefined' ? arguments[2] : false
			if(lAssign){
				for(var prop in obj){
					if(typeof obj[prop] == 'object'){
						if(!objD[prop]){
							objD[prop] = new Object(obj[prop]);
						} else
							$u.o.assign(objD[prop],obj[prop],lAssign);
					} else{
						if(!objD[prop])
							objD[prop] = obj[prop];
					}
				}
			} else{
				for(var prop in obj){
					if(typeof obj[prop] == 'object'){
						if(!objD[prop]){
							objD[prop] = new Object(obj[prop]);
						} else
							$u.o.assign(objD[prop],obj[prop],lAssign);
					} else
						objD[prop] = obj[prop];
				}
			}
		},
		toJSON: function(obj){
			var type = typeof(obj);
			if(type == 'object'){
				var propArr = new Array();
				if(obj.length){
					for(var i=0;i<obj.length;i++) propArr.push($u.o.toJSON(obj[i]));
					return '['+propArr.join(', ')+']'
				} else{
					for(var prop in obj) propArr.push(prop+': '+$u.o.toJSON(obj[prop]));
					return '{'+propArr.join(', ')+'}'
				}
			} else if(type == 'number') return String(obj);
			else if(type == 'boolean') return obj ? 'true' : 'false';
			else if(type == 'date') return 'Date(\''+obj+'\')';
			else return '\''+$u.s.tran($u.s.tran(obj,'\'','\\\''),'\n','\\n')+'\'';
		}
	},
	d: {
		toStr: function(dObj,frm){
			if(frm.indexOf('[mm]') != -1)
				frm = frm.replace('[mm]',$u.s.pad(''+(dObj.getMonth()+1),2,'0'));
			else if(frm.indexOf('[m]') != -1)
				frm = frm.replace('[m]',''+(dObj.getMonth()+1));
			else if(frm.indexOf('[month]') != -1)
				frm = frm.replace('[month]',$u.months[dObj.getMonth()]);
			else if(frm.indexOf('[Month]') != -1)
				frm = frm.replace('[Month]',$u.s.changeCase($u.months[dObj.getMonth()],'fu'));
			else if(frm.indexOf('[MONTH]') != -1)
				frm = frm.replace('[MONTH]',$u.months[dObj.getMonth()].toUpperCase());
			else if(frm.indexOf('[mon]') != -1)
				frm = frm.replace('[mon]',$u.monthsShort[dObj.getMonth()]);
			else if(frm.indexOf('[Mon]') != -1)
				frm = frm.replace('[Mon]',$u.s.changeCase($u.monthsShort[dObj.getMonth()],'fu'));
			else if(frm.indexOf('[MON]') != -1)
				frm = frm.replace('[MON]',$u.monthsShort[dObj.getMonth()].toUpperCase());
			
			if(frm.indexOf('[dd]') != -1)
				frm = frm.replace('[dd]',$u.s.pad(''+(dObj.getDate()),2,'0'));
			else if(frm.indexOf('[d]') != -1)
				frm = frm.replace('[d]',''+(dObj.getDate()));
			else if(frm.indexOf('[ddx]') != -1)
				frm = frm.replace('[ddx]',$u.s.pad($u.n.toPlaceStr(dObj.getDate()),2,'0'));
			else if(frm.indexOf('[dx]') != -1)
				frm = frm.replace('[dx]',$u.n.toPlaceStr(dObj.getDate()));
			else if(frm.indexOf('[DDX]') != -1)
				frm = frm.replace('[DDX]',$u.s.pad($u.n.toPlaceStr(dObj.getDate()),2,'0').toUpperCase());
			else if(frm.indexOf('[DX]') != -1)
				frm = frm.replace('[DX]',$u.n.toPlaceStr(dObj.getDate()).toUpperCase());
			
			if(frm.indexOf('[yy]') != -1)
				frm = frm.replace('[yy]',(''+dObj.getFullYear()).substr(2));
			else if(frm.indexOf('[yyyy]') != -1)
				frm = frm.replace('[yyyy]',''+dObj.getFullYear());
			
			if(frm.indexOf('[wday]') != -1)
				frm = frm.replace('[wday]',$u.days[dObj.getDay()]);
			else if(frm.indexOf('[Wday]') != -1)
				frm = frm.replace('[Wday]',$u.s.changeCase($u.days[dObj.getDay()],'fu'));
			else if(frm.indexOf('[WDAY]') != -1)
				frm = frm.replace('[WDAY]',$u.days[dObj.getDay()].toUpperCase());
			else if(frm.indexOf('[wd]') != -1)
				frm = frm.replace('[wd]',$u.daysShort[dObj.getDay()]);
			else if(frm.indexOf('[Wd]') != -1)
				frm = frm.replace('[Wd]',$u.s.changeCase($u.daysShort[dObj.getDay()],'fu'));
			else if(frm.indexOf('[WD]') != -1)
				frm = frm.replace('[WD]',$u.daysShort[dObj.getDay()].toUpperCase());
			
			var hr = dObj.getHours();
			var mer = hr > 11 ? 'pm' : 'am';
			if(hr == 0) hr = 24;
			if(frm.indexOf('[t:h]') != -1){
				if(hr > 12) hr = hr-12;
				frm = frm.replace('[t:h]',''+hr);
			} else if(frm.indexOf('[t:hh]') != -1){
				if(hr > 12) hr = hr-12;
				frm = frm.replace('[t:hh]',$u.s.pad(''+hr,2,'0'));
			} else if(frm.indexOf('[t:mh]') != -1)
				frm = frm.replace('[t:mh]',''+hr);
			else if(frm.indexOf('[t:mhh]') != -1)
				frm = frm.replace('[t:mhh]',$u.s.pad(''+hr,2,'0'));
			
			if(frm.indexOf('[t:m]') != -1)
				frm = frm.replace('[t:m]',''+(dObj.getMinutes()+1));
			else if(frm.indexOf('[t:mm]') != -1)
				frm = frm.replace('[t:mm]',$u.s.pad(''+(dObj.getMinutes()+1),2,'0'));
			if(frm.indexOf('[t:s]') != -1)
				frm = frm.replace('[t:s]',''+(dObj.getSeconds()+1));
			else if(frm.indexOf('[t:ss]') != -1)
				frm = frm.replace('[t:ss]',$u.s.pad(''+(dObj.getSeconds()+1),2,'0'));
			
			if(frm.indexOf('[t:am]') != -1)
				frm = frm.replace('[t:am]',mer);
			if(frm.indexOf('[t:a]') != -1)
				frm = frm.replace('[t:a]',mer.substr(0,1));
			else if(frm.indexOf('[t:AM]') != -1)
				frm = frm.replace('[t:AM]',mer.toUpperCase());
			else if(frm.indexOf('[t:A]') != -1)
				frm = frm.replace('[t:A]',mer.substr(0,1).toUpperCase());
			
			return frm;
		}
	},
	b: {
		toStr: function(valBool,rTrue,rFalse){
			return valBool ? rTrue : rFalse;
		}
	}
}

// $t = timed events / animation


// $e = event helper object

/*

$e.add(ele,type,fn[,scope,override,group]) ele can equal and object, a string, and array of objects, and array of strings.
$e.remove(ele,type,fn) ele can equal and object, a string, and array of objects, and array of strings.

$e.removeGroup(name) remove a group of events.

*/
if(!$e){
	var $e = {
		loaded: false,
		e: [],
		de: [],
		ue: [],
		add: function(evntEle,evntType,evntFunc){
			// get scope if any
			var evntScope = arguments[3] ? arguments[3] : null;
			var scopeOverride = (typeof arguments[4] != 'undefined' && arguments[4] != null) ? arguments[4] : false;
			var groupName = arguments[5] ? arguments[5] : '';
			
			// check to see if evntEle is an array, and add events if so
			if($e._isEleCollection(evntEle)){
				var returnBool = true;
				for(var i=0;i<evntEle.length;i++){
					returnBool = ((this.add(evntEle[i],evntType,evntFunc,evntScope,scopeOverride,groupName)) && returnBool)
				}
				return returnBool;
			}
			
			// if page is loaded attach event else defer
			if(this.loaded){
				// setup
				var ele = typeof evntEle == 'string' ? $(evntEle) : evntEle;
				var cScope = (scopeOverride) ? evntScope : ele;
				var wfn = function(e){
					return evntFunc.call(cScope,$e.getEvent(e),evntScope);
				};
				
				// check to see if it is an unload event.
				if(evntType == 'unload'){
					this.ue[this.ue.length] = [ele,evntType,evntFunc,wfn,evntScope,scopeOverride,groupName];
					return true;
				}
				
				// save the event data to a local copy.
				var indx = $e.e.length;
				$e.e[indx] = [ele,evntType,evntFunc,wfn,evntScope,scopeOverride,groupName];
				
				// attach the event.
				//$ae(ele,evntType,wfn);
				if(ele.addEventListener){
					ele.addEventListener(evntType,wfn,false);
				} else if(ele.attachEvent){
					ele.attachEvent('on'+evntType,wfn);
				}
				
			} else{
				$e.de[$e.de.length] = [evntEle,evntType,evntFunc,evntScope,scopeOverride,groupName];
			}
			return true;
		},
		remove: function(ele,evntType,evntFunc){
			// optional fourth param of index.
			if(typeof ele == 'string'){
				ele = $(ele)
			} else if($e._isEleCollection(ele)){
				var returnBool = true;
				for(var i=0;i<evntEle.length;i++){
					returnBool = (this.remove(ele[i],evntType,evntFunc) && returnBool)
				}
				return returnBool;
			}
			
			var eObj = null;
			var eIndx = arguments[3] ? arguments[3] : $e._wf(ele,evntType,evntFunc);
			if(eIndx == -1){
				for(var i=0;i<$e.ue.length;i++){
					if($e.ue[i][0] == eEle && $e.ue[i][1] == eType && $e.ue[i][2] == eFn){
						delete $e.ue[i][2]
						delete $e.ue[i]
						return true;
					}
				}
				return false;
			}
			eObj = $e.e[eIndx];
			
			// remove the event
			if(ele.removeEventListener){
				ele.removeEventListener(evntType,eObj[3],false);
			} else if(ele.detachEvent){
				ele.detachEvent('on'+evntType,eObj[3]);
			}
			
			// remove the stored version
			//[evntEle,evntType,evntFunc,wfn,evntScope,scopeOverride,groupName]
			delete $e.e[eIndx][3];
			delete $e.e[eIndx][2];
			delete $e.e[eIndx];
			return true;
		},
		removeGroup: function(gName){
			for(var i=0;i<this.e.length;i++){
				var eObj = this.e[i];
				if(eObj){
					if(eObj[6] == gName) this.remove(eObj[0],eObj[1],eObj[2],i);
				}
			}
			for(var i=0;i<this.ue.length;i++){
				if($e.ue[i][6] == gName){
					delete $e.ue[i][0];
					delete $e.ue[i][3];
					delete $e.ue[i][2];
					delete $e.ue[i];
				}
			}
		},
		getEvent: function(e){
			var evnt = e || window.event;
			return evnt
		},
		getCharCode: function(e){
			return e.charCode || (e.type == "keypress") ? e.keyCode : 0;
		},
		stopEvent: function(e){
			$e.stopPropagation(e);
			$e.preventDefault(e);
		},
		stopPropagation: function(e){
			if(e.stopPropagation) e.stopPropagation();
			else e.cancelBubble = true;
		},
		preventDefault: function(e){
			if(e.preventDefault) e.preventDefault();
			else e.returnValue = false;
		},
		_wf: function(eEle,eType,eFn){
			for(var i=0;i<$e.e.length;i++){
				if($e.e[i][0] == eEle && $e.e[i][1] == eType && $e.e[i][2] == eFn) return i;
			}
			return -1
		},
		_isEleCollection: function(e){
			return (e && e.length && typeof e != 'string' && !e.tagName && !e.alert && typeof e[0] != 'undefined');
		},
		_pageLoad: function(){
			if(document && document.body){
				$e.loaded = true;
				for(var i=0;i<$e.de.length;i++) $e.add.call($e,$e.de[i][0],$e.de[i][1],$e.de[i][2],$e.de[i][3],$e.de[i][4],$e.de[i][5]);
			} else{
				setTimeout($e._pageLoad,50);
			}
		},
		_pageUnload: function(e){
			for(var i=0;i<$e.ue.length;i++){
				if($e.ue[i]){
					$e.ue[i][3](e);
					delete $e.ue[i][0];
					delete $e.ue[i][3];
					delete $e.ue[i][2];
					delete $e.ue[i];
				}
			}
			for(var i=0;i<$e.e.length;i++){
				if($e.e[i]){
					if($e.e[i][0]) $e.remove($e.e[i][0],$e.e[i][1],$e.e[i][2],i);
				}
			}
		}
	}
	
	// handle setup of event object.
	if(document && document.body) $e._pageLoad();
	else setTimeout($e._pageLoad,50);
	$ae(window,'unload',$e._pageUnload);
}