function undef (obj) { return (typeof(obj) == "undefined"); }
function $id (strId) { return document.getElementById(strId); }

/* Solution by Kangax. */
function getClass(object) {  return Object.prototype.toString.call(object).slice(8, -1); }
function addClass (obj, cssClass) { if (obj.className.indexOf(cssClass) < 0) { if (obj.className != "") { obj.className += " " + cssClass; } else { obj.className = cssClass; } } }
function removeClass (obj, cssClass) { if (obj.className.indexOf(cssClass) > -1) { obj.className = (obj.className.replace(cssClass,"")).trim(); } }
function removeClassById (strId, cssClass) { var obj = $id(strId); removeClass(obj,cssClass); }
function hasClass (obj, cssClass) { return (obj.className.indexOf(cssClass) > -1); }
function setEvent (obj, evType, fn) { 
	if(obj) {
		if (obj.addEventListener){ obj.addEventListener(evType, fn, false); return true; }
		else if (obj.attachEvent){ var r = obj.attachEvent("on"+evType, fn); return r; }
		else { return false; } 
	} else { return false; } 
}

function getElementsByClassName (obj, strClassName) { 
	var resultSet = [];
	var elements = obj.getElementsByTagName('*');
	for (var i=0, j=elements.length; i<j; i++) {
		var childElement = elements[i];
		if (childElement.nodeType == 1) {
			if (childElement.className.indexOf(strClassName) > -1) { resultSet.push(childElement); }
		}
	}
	return resultSet;
}

function domObject (objRef) { 
	this.obj = (typeof(objRef) == 'string') ? document.getElementById(objRef) : objRef; 
}
domObject.prototype.getElementsByClassName = function (strClassName) { return getElementsByClassName(this.obj, strClassName); };
domObject.prototype.addClass = function (cssClass) { addClass(this.obj, cssClass); };
domObject.prototype.removeClass = function (cssClass) { removeClass(this.obj, cssClass); };
domObject.prototype.setEvent = function (_event, _function) { setEvent(this.obj, _event, _function); };
domObject.prototype.setEventByClass = function (cssClass,_event, _function) { 
	var objs = getElementsByClassName(this.obj,cssClass);
	for (var i=0, j=objs.length; i<j; i++) { setEvent(objs[i], _event, _function); }
};
function $extend (objRef) { return new domObject(objRef); }

function newElement (ele, objid, cssClass) {
	var element = document.createElement(ele);
	if (objId != null) { element.id = objId; }
	if (cssClass != null) { addClass(element, cssClass); }
	return element;
}

function newXHRequest () {
	if (window.XMLHttpRequest) {
		return new XMLHttpRequest();
	} else if (window.ActiveXObject) {
		try {
			return new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				return new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) { return null; }
		}
	} else { return null; }
}

function randomNumber (length) {
	var number;
	for (var i=0; i<length;i++){ number += Math.floor(Math.random()*9); }
	return Number(number);
}

function setInputText (obj) { 
	if (obj.msg == null) { obj.msg = obj.value; }
	if (obj.value == "" && obj.msg != null) { obj.value = obj.msg; }
	else if (obj.value == obj.msg) { obj.value = ""; }
}

/* String Methods. */
String.prototype.trim = function () { return this.replace(/^\s+|\s+$/g, ""); };
String.prototype.ltrim = function () { return this.replace(/^\s+/, ""); };
String.prototype.rtrim = function () { return this.replace(/\s+$/, ""); };
String.prototype.onlyDigits = function () { return this.replace(/([\D\W])/gi, ""); };
String.prototype.equalsIgnoreCase = function (arg) { return (this.toLowerCase() == String(arg).toLowerCase()); };
String.prototype.equals = function (arg) { return (this.toString() == arg.toString()); };
String.prototype.startsWith = function (arg) { return (this.match("^"+arg)==arg); };
String.prototype.endsWith = function (arg) { return (this.match(arg+"$")==arg); };

/* Date Methods. */
Date.prototype.isLeapYear = function () {
    var year = this.getFullYear();
    return !(year % 4) && (year % 100) || !(year % 400) ? true : false;
};

/* MenuControl Object - should not be in dCore */
function MenuControl (className) { this.last=null; this.t=null; this.className=className; }
MenuControl.prototype.set = function(objId) { 
	if (this.last != null && this.last != objId) {
		var lastObj = $id(this.last);
		removeClass(lastObj,this.className);
	} 
	clearTimeout(this.t);
	var obj = $id(objId);
	addClass(obj,this.className);
};
MenuControl.prototype.close = function (objId) {
	this.last = objId; 
	this.t = setTimeout("removeClassById('"+objId+"','"+this.className+"')",1000); 
};

var TextControl = { lastObjId:"",
	showHide:function (id) { 
		if (this.lastObjId != "") { $id(this.lastObjId).style.display = "none"; }
		if (this.lastObjId == id) { $id(id).style.display = "none"; this.lastObjId = ""; }
		else { $id(id).style.display = "block"; this.lastObjId = id; }
	}
};

var windowUtil = {
	getLiveHeight: function () {
		var result = 0;
		if (self.innerWidth) { result = self.innerHeight; }
		else if (document.documentElement && document.documentElement.clientWidth) { result = document.documentElement.clientHeight; }
		else if (document.body) { result = document.body.clientHeight; }
		return result;
	},
	getLiveWidth:  function () {
		var result = 0;
		if (self.innerWidth) { result = self.innerWidth; }
		else if (document.documentElement && document.documentElement.clientWidth) { result = document.documentElement.clientWidth; }
		else if (document.body) { result = document.body.clientWidth; }
		return result;
	},
	getFullHeight: function () {
		var result = 0;
		if (window.innerHeight && window.scrollMaxY) { result = window.innerHeight + window.scrollMaxY; } 
		else if (document.body.scrollHeight > document.body.offsetHeight){ result = document.body.scrollHeight; } 
		else { result = document.body.offsetHeight; }
		return result;
	},
	getFullWidth: function () {
		var result = 0;
		if (window.innerHeight && window.scrollMaxY) { result = window.innerWidth + window.scrollMaxX; } 
		else if (document.body.scrollHeight > document.body.offsetHeight){ result = document.body.scrollWidth; } 
		else { result = document.body.offsetWidth; }
		return result;
	}
};
var MouseUtil = { xPos:"", yPos:"", targetObj:null, xDiff:0, yDiff:0,
	getPositionEvent : function (e) {
		if (!e) var e = window.event;
		MouseUtil.getPosition(e);
	},
	getPosition : function (eObj) {
		if(eObj.pageX || eObj.pageY){ 
			this.xPos=eObj.pageX;
			this.yPos=eObj.pageY; 
		} else { 
			this.xPos=eObj.clientX + document.body.scrollLeft - document.body.clientLeft;
			this.yPos=eObj.clientY + document.body.scrollTop  - document.body.clientTop; 
		}
	},
	setDragObj : function (obj) {
		document.onmousedown = this.falsefunc;
		if (this.targetObj != obj) {
			this.targetObj = obj;
			this.xDiff =  obj.offsetLeft - this.xPos;
			this.yDiff =  obj.offsetTop - this.yPos;
		}
		document.onmousemove = MouseUtil.dragObjEvent;
		document.onmouseup = MouseUtil.releaseDrag;
	},
	dragObjEvent : function (e) {
		var targetObj;
		if (!e) var e = window.event;
		MouseUtil.getPositionEvent(e);
		if (e.target) targetObj = e.target;
		else if (e.srcElement) targetObj = e.srcElement;
		MouseUtil.dragObj(targetObj);
	},
	dragObj : function (eObj) {
		if(this.targetObj) {
			var target = this.targetObj;
			var xNew = this.xPos + this.xDiff;
			var yNew = this.yPos + this.yDiff;
			target.style.left = String(xNew) + 'px';
			target.style.top  = String(yNew) + 'px';
		}
	},
	releaseDrag : function () {
		if(MouseUtil.targetObj) { MouseUtil.targetObj=null; MouseUtil.xDiff=0; MouseUtil.yDiff=0; }
		document.onmousemove = MouseUtil.getPositionEvent;
		document.onmouseup = null;
		document.onmousedown = null;
	},
	falsefunc : function() { return false; }
};
var DateUtil = {
	isNewerDate : function (year,month,day) {
		var result = true;
		if (this.isRealDate(year,month,day)) {
			var compDate = new Date();
			compDate.setFullYear(year,month,day);
			var today = new Date();
			result = (compDate>today);
		} else { result=false; }
		return result;
	},
	isRealDate : function (year,month,day) {
		var result = true;
		var compDay = new Date();
		compDay.setFullYear(year,month);
		var lastDay = this.lastDayOfMonth(compDay);
		if (day<1 || day>lastDay) { result=false; }
		return result;
	},
	lastDayOfMonth : function (dateObj) {
		var days = 31;
		var mon = (dateObj.getMonth() +1);
		if (mon==4 || mon==6 || mon==9 || mon==11) {days = 30;}
		if (mon==2) {days = dateObj.isLeapYear() ? 29 : 28;}
		return days;
	}
};
