/*
 * DHIDSS Copyright 2006 DHI Water & Environment
 * Providing functionality for use in pages produced in the Dashboard Manager
 */

// This method is used to affect the property of other objects. It takes the affected 
// argument which is the destination and the value the propertys should be set to. 
var dbos = new Array();
function affectObjectProperty(affected, value)
{
    //alert('AFFECTED:' + affected + '    VALUE:' + value);

    if (document.location.search.indexOf("GUID=") != -1) {
        return;
    }

    if (affected == "") {
        alert('In order to to affect the property of another Dashboard Object you need to specify a valid ID of another dashboard object. The Dashboard Object with the id "' + objectID + '" is not valid');
        return;
    }
    
    // Make sure that e don't split the parts in eg. x|x()|x(|ff|ff|d)|x that we don't want to split
    var objects = splitString(affected); 
    var identifiers = new Array();

    // Traverse all parts and set the properties
    for (var i=0;i<objects.length;i++) {
        if (objects[i].indexOf("[Cookie(") != -1)
        {
            var name = affected.split('(')[1].split(')')[0];	    
            var days = 50 * 365;
		    if (name.indexOf('|') != -1)
		    {
                days = Number(name.split('|')[1]);
		    }

		    var date = new Date();
		    date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));

            document.cookie = name + "=" + value + "; expires=" + date.toGMTString() + "; path=/";
    	    continue;
        }

        var identifier = replace(objects[i], '\\\\', '\\').split('\\')[2];
        if (typeof(identifier) == 'undefined') {
            alert('Unable to find one of the affected objects');
            continue;
        }

        var objectID = 'Object' + identifier;
        identifiers[i] = identifier;

        var propertyName = objects[i].split('\\')[3].split('(')[0];
        if (propertyName == '')
            alert('No property defined. Parts are: ' + objects[i].split('\\'));
        
        var first = objects[i].indexOf('(');
        var last = objects[i].lastIndexOf(')');
        if (first != -1 && last != -1)
        {
            var preValue = objects[i].substring(first + 1, last);
            valueNew = replace(preValue, '[Value]', value);
        }
        else
            valueNew = value;

        var frame = null;
        try
        {
            if (window.document.getElementById(objectID) != null)
                frame = window.document.getElementById(objectID);
            else if (window.parent.document.getElementById(objectID) != null)
                frame = window.parent.document.getElementById(objectID);
            else if (window.parent.parent.opener != null && window.parent.parent.opener.parent != null && window.parent.parent.opener.parent.document.getElementById(objectID) != null)
                frame = window.parent.parent.opener.parent.document.getElementById(objectID);
            else if (window.parent.parent != null && window.parent.parent.parent != null && window.parent.parent.parent.document != null && window.parent.parent.parent.document.getElementById(objectID) != null)
                frame = window.parent.parent.parent.document.getElementById(objectID);
        }
        catch(err)
        {}

        if (frame != null)
        {
            var newProperty = replaceProperty(frame.src, propertyName, valueNew);
            frame.setAttribute('src', newProperty);
            frame.src = newProperty;
        }
        else
        {
            if (dbos[identifier] != null)
                dbos[identifier] = replaceProperty(dbos[identifier], propertyName, valueNew);
            else
                dbos[identifier] = replaceProperty("", propertyName, valueNew);
        }
    }

    // In the postback all arguments for all update panels for must be sent back
    var argument = "";
    for (var i=0;i<identifiers.length;i++) {
        if (dbos[identifiers[i]] != null) {
            argument += "DBOID_" + identifiers[i] + dbos[identifiers[i]];
        }
    }

    if (argument != "") {
        __doPostBack("DBOID_" + identifiers[0], argument);
    }
}

showTooltip = function(e) {
    var tooltipText = e.target.getAttribute('tooltip');
    if ($("#dss-client-tooltip-div").size() > 0 && $("#dss-client-tooltip-div").html() == tooltipText) {
        return;
    }
    var tooltip = $("<div id='dss-client-tooltip-div'>" + tooltipText + "</div>");
    tooltip.addClass('')
                    .addClass('ui-widget ui-widget-content')
                    .css('font-size', '10px')
	                .css('position', 'absolute')
	                .css('z-index', '99999')
	                .css('padding', '3px')
		            .appendTo($("body"));
    var mainWidth = $("[id*='PanelMain']").width();
    var mainHeight = $("[id*='PanelMain']").height();
    var tooltipWidth = tooltip.width();
    var tooltipHeight = tooltip.height();
    var tooltipTop = e.pageY + tooltipHeight > mainHeight ? e.pageY - tooltipHeight : e.pageY;
    var tooltipLeft = e.pageX + tooltipWidth > mainWidth ? e.pageX - tooltipWidth : e.pageX;
    tooltip.css('top', (tooltipTop + 5) + "px")
		            .css('left', (tooltipLeft + 5) + "px");
    tooltip.fadeIn();
}

hideTooltip = function(e) {
    var tooltip = $("#dss-client-tooltip-div");
    tooltip.fadeOut();
    tooltip.remove();
}


function assignToolTip() {
    $('[tooltip]').each(function() {
        $(this).hover(showTooltip, hideTooltip)
    });
}

var pleaseWaitTimer = new Object();
function clearPleaseWait(imageId) {
    $("#" + imageId).css("position", "static");
    eval("clearTimeout(pleaseWaitTimer." + imageId + ")");
    eval("pleaseWaitTimer['" + imageId + "'] = null;");  
}

var imagesPleaseWait = new Array();
imagesPleaseWait[0] = 'Images/PleaseWait 01.png';
imagesPleaseWait[1] = 'Images/PleaseWait 02.png';
imagesPleaseWait[2] = 'Images/PleaseWait 03.png';
imagesPleaseWait[3] = 'Images/PleaseWait 04.png';
imagesPleaseWait[4] = 'Images/PleaseWait 05.png';
imagesPleaseWait[5] = 'Images/PleaseWait 06.png';
imagesPleaseWait[6] = 'Images/PleaseWait 07.png';
imagesPleaseWait[7] = 'Images/PleaseWait 08.png';

function showPleaseWait(imageId, width, height, offsetX, offsetY) {
    if (width != null && height != null) {
        if (offsetX == null || offsetY == null) {
            offsetX = 0;
            offsetY = 0;
        }

        $("#" + imageId).css("position", "absolute");
        $("#" + imageId).css("top", ((height - 15) / 2) + Number(offsetY) + "px");
        $("#" + imageId).css("left", ((width - 15) / 2) + Number(offsetX) + "px");
    }
    
    var imgSource = $("#" + imageId)[0].src;
    var dotIndex = imgSource.indexOf(".png");
    if (dotIndex > 1) {
        var preffix = imgSource.substring(0, dotIndex - 1);
        var nextImageNumber = parseInt(imgSource.substring(dotIndex - 1, dotIndex)) + 1;
        if (nextImageNumber > imagesPleaseWait.length) {
            nextImageNumber = 1;
        }
        var suffix = imgSource.substring(dotIndex);
        var newImageSource = preffix + nextImageNumber.toString() + suffix;
        if (nextImageNumber.toString() != "NaN") {
            $("#" + imageId)[0].src = newImageSource;
        }
    }
    else {
        $("#" + imageId)[0].src = imagesPleaseWait[0];
    }

    var rotateCommand = "pleaseWaitTimer['" + imageId + "'] = setTimeout(\"showPleaseWait('" + imageId + "')\", 100);";
    eval(rotateCommand);  
}

function ShowDialog(dialogWidth, dialogHeight, leftImage, text, rightImage) {
    var leftImageHtml = "";
    var rightImageHtml = "";
    if (leftImage != null)
        leftImageHtml = "<img id='dss-client-dialog-left-image' src='" + leftImage + "' /> ";
    if (rightImage != null)
        rightImageHtml = "<img id='dss-client-dialog-right-image' src='" + rightImage + "' /> ";
    var dialogHtml = "<div id='dss-client-dialog'><center>" + leftImageHtml + text + rightImageHtml + "</center></div>";
    $("body").append(dialogHtml);
    $("#dss-client-dialog").dialog({
        bgiframe: true,
        autoOpen: true,
        height: dialogHeight,
        width: dialogWidth,
        modal: true
    });
}

function CloseDialog() {
    $("#dss-client-dialog").remove();
}

var _datetimePicker = {};
function assignDatetimePicker(component, datetimeFormat, triggeringButtonImage, popupPostion, yearRange, minDate, maxDate, timePickerFormat, dayNamesMin, dayNames, dayNamesShort, monthNames, monthNamesShort, todayCaption, okCaption ) {
    if (component == null) {
        return;
    }
    if (triggeringButtonImage === null || triggeringButtonImage === "")
        triggeringButtonImage = "Images/Calendar.png";

    component.datepicker({
        dateFormat: datetimeFormat,
        showOn: "button",
        buttonImage: triggeringButtonImage,
        buttonImageOnly: true,
        showButtonPanel: true,
        changeMonth: true,
        changeYear: true,
        dayNamesMin: dayNamesMin,
        dayNames: dayNames,
        dayNamesShort: dayNamesShort,
        monthNames: monthNames,
        monthNamesShort: monthNamesShort,
        closeText: okCaption,
        currentText: todayCaption,
        yearRange: yearRange,
        minDate: minDate,
        maxDate: maxDate,
        showAnim: "fadeIn",
        showButtonPanel: false,
        beforeShow: function(input, inst) {
            closeTimePicker();
            var field = jQuery(input);
            _datetimePicker.field = field;
            var fieldLeft = field.offset().left;
            var fieldTop = field.offset().top;
            var fieldWidth = field.width();
            var fieldHeight = field.height();
            var fieldValue = field.val();
            _datetimePicker.dateText = fieldValue.substr(0, fieldValue.indexOf(" "));
            _datetimePicker.oldText = fieldValue;
            setTimeout(function() {
                var datePickerDiv = jQuery('#ui-datepicker-div');
                datePickerDiv.css({ 'font-size': 'small' });
                switch (popupPostion) {
                    case 'top':
                        datePickerDiv.css({ 'top': '', 'bottom': (jQuery(document).height() - fieldTop - 5) + 'px', 'left': fieldLeft + 'px' });
                        break;
                    case 'bottom':
                        datePickerDiv.css({ 'top': (fieldTop + fieldHeight + 5) + 'px', 'bottom': '', 'left': fieldLeft + 'px' });
                        break;
                    default:
                        break;
                };
                if (timePickerFormat !== "None") {
                    var timePortions = timePickerFormat.split(':').length;
                    var timePortionLength = timePortions * 2 + timePortions - 1;
                    var timeValue = fieldValue.length > timePortionLength ? fieldValue.substring(fieldValue.length - timePortionLength, fieldValue.length) : null;
                    showTimePicker(datePickerDiv.offset().top, (datePickerDiv.offset().left + datePickerDiv.width() + 10), timeValue, timePickerFormat, okCaption);
                }
            }, 100);
        },
        onSelect: function(dateText, inst) {
            if (timePickerFormat === "None") {
                _datetimePicker.field.trigger("change");
            }
            else {
                jQuery.datepicker._datepickerShowing = false;
                _datetimePicker.field.datepicker("setDate", dateText);
                _datetimePicker.field.val(_datetimePicker.oldText);
            }
            _datetimePicker.dateText = dateText;
        },
        onClose: closeTimePicker
    });
    jQuery('#ui-datepicker-div').hide();
    jQuery(".ui-datepicker-trigger").css("vertical-align", "bottom").css("margin-left", "3px");
}

function datetimePickerSelected() {
    var timeText = getTimeText();    
    var datetimeText = _datetimePicker.dateText + " " + timeText;
    _datetimePicker.field.val(datetimeText);
    jQuery.datepicker._datepickerShowing = true;
    _datetimePicker.field.datepicker("hide");
    if (_datetimePicker.oldText !== datetimeText)
        _datetimePicker.field.trigger("change");
    
}

function showTimePicker(top, left, timeValue, timePickerFormat, okCaption) {
    var datePickerDiv = jQuery('#ui-datepicker-div');
    var timepickerDiv = jQuery("<div id='dss-client-timepicker' style='z-index:99999; font-size:small; position:absolute; width:12em'></div>");
    jQuery("body").append(timepickerDiv);
    timepickerDiv.attr("class", "ui-datepicker ui-widget-content");
    timepickerDiv.css("top", top + "px");
    timepickerDiv.css("left", left + "px");
    timepickerDiv.hide();
    timepickerDiv.mouseover(function() {
        jQuery.datepicker._datepickerShowing = false;
    });
    timepickerDiv.mouseleave(function() {
        jQuery.datepicker._datepickerShowing = true;
    });
    datePickerDiv.mouseleave(function() {
        jQuery.datepicker._datepickerShowing = true;
    });
    
    datePickerDiv.resize(function() {
        timepickerDiv.css("top", datePickerDiv.offset().top + "px");
        timepickerDiv.css("left", (datePickerDiv.offset().left + datePickerDiv.width() + 10) + "px");
    });
    
    var timeValues = [];
    if (timeValue) {
        timeValues = timeValue.split(':');
    }
    
    var showHour = timePickerFormat.indexOf("HH") > -1;
    var showMinute = timePickerFormat.indexOf("mm") > -1;
    var showSecond = timePickerFormat.indexOf("ss") > -1;

    var hourHtml = { header: "", digits: "" };
    var minuteHtml = { header: "", digits: "" };
    var secondHtml = { header: "", digits: "" };

    if (showHour)
        hourHtml = getTimePortion('hour', [2, 9], timeValues.length > 0 ? timeValues[0] : "00", !showMinute && !showSecond);
    if (showMinute)
        minuteHtml = getTimePortion('minute', [5, 9], timeValues.length > 1 ? timeValues[1] : "00", !showSecond);
    if (showSecond)
        secondHtml = getTimePortion('second', [5, 9], timeValues.length > 2 ? timeValues[2] : "00", true);

    var html = "<table><tr>";
    html += hourHtml.header + minuteHtml.header + secondHtml.header + "</tr>";
    html += "<tr>" + hourHtml.digits + minuteHtml.digits + secondHtml.digits + "</tr>";
    html += "</table>";
    var okButton = jQuery("<div style='float:right; font-size:x-small; margin-bottom: 5px'>" + okCaption + "</div>").button();
    okButton.click(datetimePickerSelected);
    timepickerDiv.html(html);    
    timepickerDiv.append(okButton);
    timepickerDiv.show();
}

function getTimePortion(prefix, maxArray, defaultValue, isLast) {
    var timePortionStyle = "text-align:center; font-weight:bold; padding-top:0.45em; padding-bottom:0.45em;";
    var headerHtml = "<td><span timePrefix='" + prefix + "' style='" + timePortionStyle + "' class='ui-widget-content'>" + defaultValue + "</span></td>";
    var digitsHtml = "<td>" + getTimeDigitComponent(maxArray, prefix, defaultValue) + "</td>";
    if (!isLast) {
        headerHtml += "<td><span style='text-align:center; padding: 0px'>:</span></td>";
        digitsHtml += "<td></td>";
    }
    return { header: headerHtml, digits: digitsHtml };
}

function timeDigitSelected(prefix, col, component) {
    jQuery("[" + prefix + "Col='" + col + "']").removeClass("ui-state-active").removeClass("ui-state-hover");
    jQuery(component).attr("selected", "selected").addClass("ui-state-active");
    var timePortion = jQuery("[timePrefix='" + prefix + "']");
    var oldValue = timePortion.html();
    var newValue = "";
    for (var i = 0; i < oldValue.length; i++) {
        if (i === col) {
            newValue += jQuery(component).html();
        }
        else {
            newValue += oldValue.charAt(i);
        }
    }
    
    if (prefix === "hour") {
        var hourInt = parseInt(newValue);
        if (hourInt > 23)
            newValue = '23';
    }
    
    timePortion.html(newValue);
}

function timeDigitMouseOver(component) {
    jQuery(component).not("[selected]").addClass("ui-state-hover").css("cursor", "pointer");
}

function timeDigitMouseOut(component) {
    jQuery(component).not("[selected]").removeClass("ui-state-hover").css("cursor", "default");
}

function getTimeDigitComponent(maxArray, prefix, time) {
    var html = "<table>";
    var digit = 0;
    while (digit <= 9) {
        html += "<tr>";      
        for (var col = 0; col < maxArray.length; col++) {
            var css = "ui-state-default";
            var event = "";
            if (digit <= maxArray[col]) {
                event += " onmouseover='timeDigitMouseOver(this);'"
                + " onmouseout='timeDigitMouseOut(this);'"
                + " onclick='timeDigitSelected(" + '"' + prefix + '", ' + col + ", this);' ";
            }
            else {
                css += " ui-state-disabled";
            }
            if (time.charAt(col) === digit.toString()) {                
                css += " ui-state-active";
            }
            html += "<td>" + "<span " + prefix + "Col='" + col + "' class='" + css + "'" + event + ">" 
                + digit + "</span>" + "</td>";
        }
        digit++;
        html += "</tr>";
    }
    html += "</table>";
    return html;    
}

function padZero( val, len ) {
	var str = String(Math.abs(val));
	while ( str.length < len )
	str = '0'+str;
	if ( val < 0 )
	str = '-'+str;
	return str;
}

function getTimeText() {
    var value = "";
    var seperator = "";
    jQuery("[timePrefix]").each(function() {
        value += seperator + jQuery(this).html();
        seperator = ":";
    });   
    return value;
}

function closeTimePicker() {
    jQuery("#dss-client-timepicker").remove();
}

function accumulateValues(add, value, currentValue)
{
    // Removed for the time being value = escape(value);

    var separator = '|';
    if (currentValue == '')
        separator = '';
    
    if (add)
        currentValue = currentValue + separator + value;
    else
    {
        if (currentValue.substring(0, value.length + 1) == value + '|')
            currentValue = currentValue.replace(value + '|', '');
        else if (currentValue.indexOf('|' + value + '|') != -1)
            currentValue = currentValue.replace('|' + value + '|', '|');
        else if (currentValue.substring(currentValue.length - value.length - 1) == '|' + value)
            currentValue = currentValue.replace('|' + value, '');
        else if (currentValue == value)
            currentValue = '';
    }

    return currentValue;
}

function splitString(input) {
    var canSplitter = 0;
    var strings = new Array;
    var string = "";
    for (var i = 0; i < input.length; i++) {
        var thisChar = input.charAt(i);

        if (thisChar == "|" && canSplitter == 0) {
            strings.push(string);
            string = "";
        }
        else {
            if (thisChar == "(" || thisChar == "[")
                canSplitter += 1;
            else if (thisChar == ")" || thisChar == "]")
                canSplitter -= 1;
            string += thisChar;
        }
    }
    strings.push(string);

    return strings;
}

function replaceProperty(url, propertyName, newValue)
{
    if (url.href != null)
        url = url.href;

    var newUrl = "";
    var found = false;
    var neverFound = true;
    var separator = "";                                
    var lastAdded = "";
    var pairs = url.split("&");
	for (var i=0;i<pairs.length;i++) 
	{
        newUrl += separator;

        var property = pairs[i].split("=");
        if (property[0] == propertyName || property[0] == "Property" + propertyName )
        {
            newUrl += property[0] + "=" + newValue;
            neverFound = false;

            separator = "&";                                
            lastAdded = property[0];    
        }
        else
        {
            // If it's a property of the name URL we are changing in we don't want to remove whatever PP's it brought along
            if (!(lastAdded == "URL" && property[0].indexOf('[PP') != -1))
            {
                newUrl += pairs[i];

                separator = "&";                                
                lastAdded = property[0];    
            }
        }
	}

	if (neverFound)
	    newUrl = url + "&" + propertyName + "=" + newValue;

    return newUrl;
}

function replace(string,text,by) 
{
    var strLength = string.length, txtLength = text.length;
    if ((strLength == 0) || (txtLength == 0)) return string;

    var i = string.indexOf(text);
    if ((!i) && (text != string.substring(0,txtLength))) 
        return string;
    if (i == -1) 
        return string;

    var newstr = string.substring(0,i) + by;

    if (i+txtLength < strLength)
        newstr += replace(string.substring(i+txtLength,strLength),text,by);

    return newstr;
}

function ieFixByTagName(tagName)
{
    document.getElementById(tagName).outerHTML = document.getElementById(tagName).outerHTML;
}

function idInList(list, id)
{
    var item = list.split(';');
    for (var i=0;i<item.length;i++) 
        if (item[i].replace('$', '_')==id) 
            return true; 
    return false;
}

var preventHoverEvent = false;
var hoverWindow = null;
var showHoverURLTimerID = 0;
function hover(event, show, url, width, height, eventPool, delay)
{
    if (preventHoverEvent) return;

    var left = event.screenX + 5;
    var top = event.screenY + 5;

    // Ensure that the popup does not appear outside the screen
    if (top + height > screen.height - 60)
        top = screen.height - height - 60;
    if (left + width > screen.width)
        left = screen.width - width;    
        
    var fromID = event.fromElement == null ? '' : event.fromElement.id;
    var toID = event.toElement == null ? '' : event.toElement.id;
    var fromIDInList = idInList(eventPool, fromID);
    var toIDInList = idInList(eventPool, toID);

    if (show && hoverWindow == null && toIDInList && !fromIDInList)
    {
        if (delay == 0)
            hoverWindow = window.open (url, 'mywindow', 'location=0,status=0,scrollbars=0,titlebar=0,dependent=1,width=' + width + ',height=' + height + ',left=' + left + ',top=' + top);
        else
            showHoverURLTimerID = setTimeout("showHoverURL('" + url + "', " + width + ", " + height + ", " + left + ", " + top + ")", delay);              
    }
    else if (!toIDInList)
    {
        clearTimeout(showHoverURLTimerID);
        if (hoverWindow != null)
            hoverWindow.close();
        hoverWindow = null;
    }
}

function showHoverURL(url, width, height, left, top)
{
    hoverWindow = window.open (url, 'mywindow', 'location=0,status=0,scrollbars=0,titlebar=0,dependent=1,width=' + width + ',height=' + height + ',left=' + left + ',top=' + top);
}

// Google Maps functionality
function drawCircle(map, bounds, center, radius)
{
    var circlePoints = Array();

    with (Math) 
    {
        var d = radius/6378.8;	
        var lat1 = (PI/180)* center.lat(); // radians
        var lng1 = (PI/180)* center.lng(); // radians

        for (var a = 0 ; a < 361 ; a++ ) 
        {
	        var tc = (PI/180)*a;
	        var y = asin(sin(lat1)*cos(d)+cos(lat1)*sin(d)*cos(tc));
	        var dlng = atan2(sin(tc)*sin(d)*cos(lat1),cos(d)-sin(lat1)*sin(y));
	        var x = ((lng1-dlng+PI) % (2*PI)) - PI ; // MOD function
	        var point = new GLatLng(parseFloat(y*(180/PI)),parseFloat(x*(180/PI)));
	        circlePoints.push(point);

	        if (bounds != null)
	            bounds.extend(point);
        }

        circle = new GPolygon(circlePoints, '#000000', 2, 1, false);	
        map.addOverlay(circle); 
    }
}           

// ---- functions in relation to conversion of displayed datetime (from JQuery UI Calendar) to OADate ----

function StringTrim(stringValue) {
	return stringValue.replace(/^\s*/, "").replace(/\s*$/, "");
}

function ConvertFromOADate(datetimeOA, datePickerFormat, timePickerFormat) {
    var dateOA = parseInt(datetimeOA);
    var timeOA = datetimeOA - dateOA;
    var hour = parseInt(timeOA * 24);
    var minute = parseInt((timeOA - hour / 24) * 1440);
    var second = parseInt((timeOA - hour / 24 - minute / 1440) * 86400);
    var refDateMS = new Date(Date.UTC(1899, 11, 30));
    var startConstructorDate = new Date(Date.UTC(1970, 0, 1));
    var oneDayMS = 1000 * 60 * 60 * 24
    var date = new Date(dateOA * oneDayMS - (startConstructorDate - refDateMS));
    var datetimeString = $.datepicker.formatDate(datePickerFormat, date);
    if (timePickerFormat !== "None" && timePickerFormat !== "") {
        datetimeString += " " + padZero(hour, 2) + ":" + padZero(minute, 2);
        if (timePickerFormat === "HH:mm:ss") {
            datetimeString += ":" + padZero(second, 2);
        }
    }
    return datetimeString;
}

function ConvertToOADate(datetimeValue, datePickerFormat, timePickerFormat) {
    if (timePickerFormat === "None")
        timePickerFormat = "";
    var value = StringTrim(datetimeValue);
    var endOfDateIndex = datetimeValue.length - timePickerFormat.length;

    var date = $.datepicker.parseDate(datePickerFormat, value.substring(0, endOfDateIndex));
    var dateMS = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));
    var refDateMS = new Date(Date.UTC(1899, 11, 30));
    var oneDayMS = 1000 * 60 * 60 * 24
    var OADate_DateValue = Math.abs(dateMS - refDateMS) / oneDayMS;

    var timeOnly = value.substring(endOfDateIndex);
    var timeOnly = StringTrim(timeOnly);
    var OADate_TimeValue = GetOADateValueFromTime(timeOnly, timePickerFormat);

    return (OADate_DateValue + OADate_TimeValue);
}

function GetOADateValueFromTime(timeValue, timePickerFormat) {
	var OATime = 0.0;
	var hourValue = 0.0;
	var minValue = 0.0;
	var secValue = 0.0;
	if (timePickerFormat !== "" && timePickerFormat !== "None" && timeValue != null) {
		if (timePickerFormat == 'HH:mm') {
			hourValue = parseFloat(timeValue.substring(0, 2));
			minValue = parseFloat(timeValue.substring(3, 5));
		}
		else if (timePickerFormat == 'HH:mm:ss') {
			hourValue = parseFloat(timeValue.substring(0, 2));
			minValue = parseFloat(timeValue.substring(3, 5));
			secValue = parseFloat(timeValue.substring(6, 8));
		}

		hourValue = hourValue / 24.0;
		minValue = minValue / 1440.0;
		secValue = secValue / 86400.0;
		OATime = hourValue + minValue + secValue;
	}

	return OATime;
}

jQuery.cookie = function (name, value, options) {
	if (typeof value != 'undefined') { // name and value given, set cookie
		options = options || {};
		if (value === null) {
			value = '';
			options.expires = -1;
		}
		var expires = '';
		if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
			var date;
			if (typeof options.expires == 'number') {
				date = new Date();
				date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
			} else {
				date = options.expires;
			}
			expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
		}
		// CAUTION: Needed to parenthesize options.path and options.domain
		// in the following expressions, otherwise they evaluate to undefined
		// in the packed version for some reason...
		var path = options.path ? '; path=' + (options.path) : '';
		var domain = options.domain ? '; domain=' + (options.domain) : '';
		var secure = options.secure ? '; secure' : '';
		document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
	} else { // only name given, get cookie
		var cookieValue = null;
		if (document.cookie && document.cookie != '') {
			var cookies = document.cookie.split(';');
			for (var i = 0; i < cookies.length; i++) {
				var cookie = jQuery.trim(cookies[i]);
				// Does this cookie string begin with the name we want?
				if (cookie.substring(0, name.length + 1) == (name + '=')) {
					cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
					break;
				}
			}
		}
		return cookieValue;
	}
};

function _getDboContextSelector(dboId) {
    var dboIDDiv = jQuery("#DBOID_" + dboId);
    return function(selector, context) {
        var ownContext = context || (dboIDDiv.size() > 0 ? dboIDDiv : document);
        return jQuery(selector, ownContext);
    };
};

function _getDboVars(dbo) {
    dbo.jS("#dbo-vars span").each(function() {
        jThis = jQuery(this);
        var type = jThis.attr("type");
        var value = null;
        switch (type) {
            case "double":
                value = parseFloat(jThis.html());
                break;
            case "int":
                value = parseFloat(jThis.html());
                break;
            default:
                value = jThis.html();
        }
        dbo[jThis.attr("id")] = value;
    });
} 

function _getMouseButton(event) {
    if ((!jQuery.browser.msie && event.button == 0) || (jQuery.browser.msie && event.button == 1)) {
       return("left");
    }
    else if (event.button == 2) {
       return("right");
    }
}
