﻿//version date 2008.02.06

//SHORTCUTS
$ = function(objectID){
	return document.getElementById(objectID)
}
$val = function(objectID){
	return $(objectID).value
}
toggleVisibility = function(objectID) {
	var obj = $(objectID);
	if (obj.style.display != 'none') {
		obj.style.display = 'none';
	}
	else {
		obj.style.display = '';
	}
}

//STRING
trim = function(text){
	return text.replace(/^\s*(\S*(\s+\S+)*)\s*$/, "$1");
}
String.prototype.trim = function(){
	return trim(this)
}


//EVENTS
addEvent = function(obj, eventType, fn){
    if(obj.addEventListener){
        obj.addEventListener(eventType, fn, false)
    }
    else if(obj.attachEvent){
        obj["e" + eventType + fn] = fn
        obj[eventType + fn] = function(){
            obj["e"+ eventType + fn](window.event)
        }
        obj.attachEvent("on" + eventType, obj[eventType + fn])
    }
}
removeEvent = function(obj, eventType, fn){
    if(obj.removeEventListener){
        obj.removeEventListener(eventType, fn, false)
    }
    else if(obj.detachEvent){
        obj.detachEvent("on"+ eventType ,obj[eventType + fn])
        obj[eventType + fn] = null
        obj["e" + eventType + fn] = null
    }
}
preventDefault = function(e){
    if(e.preventDefault){
        e.preventDefault()
    }
    else{
        e.returnValue = false
    }
    if(e.stopPropagation){
        e.stopPropagation()
    }
    else{
        e.cancelBubble = true
    }
}


//NUMERIC
isNumber = function(str) {
    //return false for nulls
    if(str == null){
        return false
    }
    
    //cast input to string
    str = '' + str
    
	if(str.trim() == ''){
		return false
	}
	else{
		return parseFloat(str.trim()) == (str.trim())
	}
}
castNumber = function(str){
	var i = 0 + new Number(str)
	return i
}

isDate = function(strDate){
	//test strDate as whole
	strDate = strDate.trim()
	if(strDate == 'undefined' || strDate == ''){
		return false
	}			
	if(strDate.indexOf('/') == -1){
		return false
	}	

	//split strDate
	var Div1 = strDate.indexOf('/')
	var Div2 = strDate.indexOf('/', Div1 + 1)
	var strMonth = new Number(strDate.substring(0, Div1)) - 1
	var strDay = new Number(strDate.substring(Div1 + 1, Div2))
	var strYear = new Number(strDate.substring(Div2 + 1))

	//fix year, if needed
	if(strYear < 1000){
		if(strYear < 100){
			if(strYear < 20){
				strYear += 2000
			}
			else{
				strYear += 1900
			}
		}
		else{
			//year is 3 digits long
			return false
		}
	}
	if(strYear > 2100 || strYear < 1900){
		return false
	}
	
	//use strings to create date
	try{
		xDate = new Date(strYear, strMonth, strDay)		
	}
	catch(ex){
		return false
	}
	
	//compare new date parts, with strings
	if(strDay != castNumber(xDate.getDate()) || strMonth != castNumber(xDate.getMonth()) || strYear != castNumber(xDate.getFullYear())){
		return false
	}

	//if all tests passed, return true
	return true
}
Date.prototype.toDateTimeString = function(){
	var strMeridiem = 'AM'
	var iMonth = this.getMonth() + 1
	var iHour = this.getHours()
	if(iHour > 12){
		iHour -= 12
		strMeridiem = 'PM'
	}
	var iMinutes = this.getMinutes()
	if(iMinutes < 10){
		iMinutes = '0' + iMinutes
	}
	var iSeconds = this.getSeconds()
	if(iSeconds < 10){
		iSeconds = '0' + iSeconds
	}
	var strDate = iMonth + '/' + this.getDay() + '/' + this.getFullYear() + ' ' + iHour + ':' + iMinutes + ':' + iSeconds + ' ' + strMeridiem
	return strDate
}
Date.prototype.toShortDateString = function(){
	var dateYear = this.getFullYear()
	var dateMonth = this.getMonth() + 1
	var dateDay = this.getDate()
	var str = dateMonth + '/' + dateDay + '/' + dateYear
	return str
}



//QUERYSTRING
document.queryStringValues = new Array()
document.queryString = function(key){
	var i
	var itemValue
	var itemKey
	var itemPair
	
	if(document.queryStringValues.length == 0){
		//load querystring
		var strSearch = location.search.substring(1, location.search.length)
		var qsItems = strSearch.split('&')
		
		//set length
		document.queryStringValues.length = qsItems.length
		
		for(i = 0; i < qsItems.length; i++){
			itemPair = qsItems[i].split('=')
			itemKey = itemPair[0]
			if(itemPair.length == 2){
				itemValue = itemPair[1]
				document.queryStringValues[itemKey] = itemValue
			}
			else{
				document.queryStringValues[itemKey] = null					
			}
		}
	}

	itemValue = document.queryStringValues[key]


	return itemValue	
}


//positioning
positioning = new Object()
positioning.getX = function(obj){
    return positioning.get(obj, true)      
}
positioning.getY = function(obj){
    return positioning.get(obj, false)          
}
positioning.get = function(obj, getX){
    var position = 0
    var parent

    //preliminary values
    if(getX){
        position = obj.offsetLeft
    }
    else{
        position = obj.offsetTop
    }
    
    //adjust for parent containers' positions
    parent = obj.offsetParent	
    while (parent != null){
        if(getX){
            position += parent.offsetLeft
        }else
        {
            position += parent.offsetTop
        }
        parent = parent.offsetParent;
    }

    return position        
}
positioning.getEdgeClearingModifier = function(obj, sender, edge){
    var modifier = 0
    var position = 0
    if (edge == 'right'){
        position = document.body.scrollLeft + document.body.clientWidth - 15
        obj.contentmeasure = obj.offsetWidth
        if(position - obj.x < obj.contentmeasure){
            modifier = obj.contentmeasure - sender.offsetWidth
        }
    }
    else{
        position = document.body.scrollTop + document.body.clientHeight - 15
        obj.contentmeasure = obj.offsetHeight
        if(position - obj.y < obj.contentmeasure){
            modifier = obj.contentmeasure + sender.offsetHeight
        }
    }
    return modifier
}

positioning.setRelativePosition = function(obj, relativeObj, x, y){
    //sets position of "obj" relative to relativeObj
    obj.style.left = (positioning.getX(relativeObj) + x) + 'px'
    obj.style.top = (positioning.getY(relativeObj) + y) + 'px'
}
positioning.setPosition = function(obj, x, y){
    obj.style.left = x + 'px'
    obj.style.top = y + 'px'   
}