var timeRegExp = /^ *([0-9]{1,2}):([0-9]{2}) *$/;
var TIME_REGEX_HOUR_POS = 1;
var TIME_REGEX_MIN_POS = 2;
var MILLISECONDS_PER_MIN = 60000;
var MINS_PER_HOUR = 60;
var HOURS_PER_DAY = 24;
var MAX_AMPM_HOURS = 12;
var AM_VALUE = 0;
var PM_VALUE = 1;


//---------------------------------------------------
function setCookie(name,theValue)
//---------------------------------------------------
{
   document.cookie = name + " = " + theValue + ';expires=Mon, 31-Dec-09 12:00:00 GMT' ;

}
//---------------------------------------------------
function getCookie(name)
//---------------------------------------------------
{
   var cookiefound=false;
   var start = 0;
   var end = 0;
   var cookieString = document.cookie;
   var i = 0;

   //Scan for cookie name
   while(i <= cookieString.length)
   {
      start=i;
      end = start + name.length;
      if (cookieString.substring(start,end) == name)
      {
         cookiefound = true;
         break;
      }
      i++;
   }
   
   //IS name found?
   if (cookiefound)
   {
      start = end+1;
      end=document.cookie.indexOf(";",start);
      if (end < start)
      {
             
         end=document.cookie.length;
      }
      return document.cookie.substring(start,end);
   }
   return "";

}

function Point(x, y) {
	this.x = x;
	this.y = y;
}

function textRangeContainsPoint(range, point) {
    return ((point.x >= range.boundingLeft) && (point.x < (range.boundingLeft + range.boundingWidth)));
//        && (point.y >= range.boundingTop) && (point.y < (range.boundingTop + range.boundingHeight)));
}

function setElementStyle(elem, style, value) {
    if (elem != null) {
        if (elem.style != null) {
            elem.style[style] = value;
        }
    }
}

function getElementStyle(elem, style) {
	var value = null;
	if (elem != null) {
		if (elem.currentStyle != null) {
			value = elem.currentStyle[style];
		}
	}
	return value;
}

function formatTwoDigitNum(value) {
    var result = "";
    if (value < 10) {
        result += "0";
    }
    result += value;
    return result;
}

function getElementXPos(targetElem) {
    var elem = targetElem;
    var xPos = 0;
    while (elem != null) {
        if (elem.offsetLeft != null) {
            xPos += parseInt(elem.offsetLeft);
        }
        elem = elem.offsetParent;
    }
    return xPos;
}

function getElementYPos(targetElem) {
    var elem = targetElem;
    var yPos = 0;
    while (elem != null) {
        if (elem.offsetTop != null) {
            yPos += parseInt(elem.offsetTop);
        }
        elem = elem.offsetParent;
    }
    return yPos;
}

function isAbsolute(targetElem) {
	var absolute = false;
	var positionType = getElementStyle(targetElem, "position");
	if (positionType != null) {
		if ("absolute" == positionType) {
			absolute = true;
		}
	}
	return absolute;
}

function getAbsoluteAncestor(targetElem) {
    var ancestor = targetElem;
    if (targetElem != null) {
    	while (!isAbsolute(ancestor)) {
    		var parent = ancestor.offsetParent;
    		if (null == parent) {
    			break;
    		}
	        ancestor = parent;
	    }
    }
    return ancestor;
}

function getElementWidth(targetElem) {
    var width = 0;
    if (targetElem) {
        if (targetElem.offsetWidth) {
            width = parseInt(targetElem.offsetWidth);
        }
    }
    return width;
}

function getElementHeight(targetElem) {
    var height = 0;
    if (targetElem) {
        if (targetElem.offsetHeight) {
            height = parseInt(targetElem.offsetHeight);
        }
    }
    return height;
}

function elementContainsPoint(targetElem, x, y) {
    var xPos = getElementXPos(targetElem);
    var yPos = getElementYPos(targetElem);
    var width = getElementWidth(targetElem);
    var height = getElementHeight(targetElem);
    return ((x >= xPos) && (x <= (xPos + width))
        && (y >= yPos) && (y <= (yPos + height)));
}

function parseDate(dateText) {
    var date = null;
    var dateParts = dateRegExp.exec(dateText);
    if (dateParts != null) {
        var year = new Number(dateParts[DATE_REGEX_YEAR_POS]);
        var month = new Number(dateParts[DATE_REGEX_MONTH_POS]);
        month--;
        var day = new Number(dateParts[DATE_REGEX_DAY_POS]);
        date = new Date(year, month, day);
        if ((date.getFullYear() != year) ||
            (date.getMonth() != month) ||
            (date.getDate() != day)) {
                date = null;
        }
    }
    return date;
}

function parseDateTime(dateTimeText) {
    var date = null;
    var dateTimeParts = dateTimeRegExp.exec(dateTimeText);
    if (dateTimeParts != null) {
        var year = new Number(dateTimeParts[DATETIME_REGEX_YEAR_POS]);
        var month = new Number(dateTimeParts[DATETIME_REGEX_MONTH_POS]);
        month--;
        var day = new Number(dateTimeParts[DATETIME_REGEX_DAY_POS]);
        var hour = new Number(dateTimeParts[DATETIME_REGEX_HOUR_POS]);
        if (typeof(DATETIME_REGEX_AMPM_POS) != "undefined") {
            var ampm = dateTimeParts[DATETIME_REGEX_AMPM_POS];
            if ((AM_LABEL == ampm) && (12 == hour)) {
                hour = 0;
            } else if ((PM_LABEL == ampm) && (hour != 12)) {
                hour += 12;
            }
        }
        var minute = new Number(dateTimeParts[DATETIME_REGEX_MINUTE_POS]);
        date = new Date(year, month, day, hour, minute);
        if ((date.getFullYear() != year) ||
            (date.getMonth() != month) ||
            (date.getDate() != day) ||
            (date.getHours() != hour) ||
            (date.getMinutes() != minute)) {
                date = null;
        }
    }
    return date;
}

function parseTime(timeText, ampm) {
    var timeOffset = null;
    var dateTimeParts = timeRegExp.exec(timeText);
    if (dateTimeParts != null) {
        var hour = parseInt(dateTimeParts[TIME_REGEX_HOUR_POS], 10);
        var min = parseInt(dateTimeParts[TIME_REGEX_MIN_POS], 10);
        if (min < MINS_PER_HOUR) {
            var validHour = false;
            if (ampm != null) {
                if ((hour > 0) && (hour <= MAX_AMPM_HOURS)) {
                    validHour = true;
                    if ((AM_VALUE == ampm) && (MAX_AMPM_HOURS == hour)) {
                        hour -= MAX_AMPM_HOURS;
                    } else if ((PM_VALUE == ampm) && (hour != MAX_AMPM_HOURS)) {
                        hour += MAX_AMPM_HOURS;
                    }
                }
            } else {
                validHour = (hour < HOURS_PER_DAY);
            }
            if (validHour) {
                timeOffset = (MILLISECONDS_PER_MIN * (min + (MINS_PER_HOUR * hour)));
            }
        }
    }
    return timeOffset;
}

function getEventMousePoint(ev) {
	var point = new Point(0, 0);
    if ((ev.pageX != null) || (ev.pageY != null)) {
        point = new Point(ev.pageX, ev.pageY);
    } else if ((ev.clientX != null) || (ev.clientY != null)) {
    	point = new Point(ev.clientX + document.body.scrollLeft,
        	ev.clientY + document.body.scrollTop);
    }
    return point;
}

function getEventElement(ev) {
	if (null == ev) {
		ev = window.event;
	}
	var element = null;
	if (ev.srcElement != null) {
		element = ev.srcElement;
	} else if (ev.target != null) {
		element = ev.target;
	}
	return element;
}

function roundedFloat(val) {
	var floatVal = parseFloat("" + val);
	floatVal += 0.0005;
	var strVal = "" + floatVal;
	var haveDecimal = false;
	var decimalDigits = 0;
	var rounded = "";
	for (var i = 0; i < strVal.length; i++) {
		var c = strVal.charAt(i);
		if ('.' == c) {
			haveDecimal = true;
		} else if (haveDecimal) {
			decimalDigits++;
		}
		rounded += c;
		if (3 == decimalDigits) {
			break;
		}
	}
	while (rounded.length > 0) {
		var c = rounded.charAt(rounded.length - 1);
		if (('0' == c) || ('.' == c)) {
			rounded = rounded.substr(0, rounded.length - 1);
		}
		if ((c != '0') || ('.' == c)) {
			break;
		}
	}
	if (0 == rounded.length) {
		rounded = "0";
	}
	return rounded;
}

function power(base, exp) {
	var val = 1;
	for (var i = 0; i < exp; i++) {
		val *= base;
	}
	return val;
}
