
/*******************************************************************************
 * general GUI settings
 ******************************************************************************/
var CSS_PATH                    = '../css/';
var ZOOM_LINKS_ID_BASE          = 'headerZoomLink_';
var ZOOM_LINKS_ID_PARAM         = new Array('SMALL', 'NORMAL', 'BIG');

/*******************************************************************************
 * bug box settings
 ******************************************************************************/
var BUG_BOX_OPEN                = false;
var BUG_BOX_FADE_TIMEOUT        = null;
var BUG_BOX_SENT_TIMEOUT        = null;
var BUG_BOX_SENT_TIME_DELAY     = 3000;
var BUG_BOX_FADE_DELAY          = 10;
var BUG_BOX_FADE_PIXELS         = 25;
var BUG_BOX_TARGET_WIDTH_MAIN   = 300;
var BUG_BOX_TARGET_WIDTH_SHADOW = 309;

/*******************************************************************************
 * analysis related stuff
 ******************************************************************************/
var ANALYSIS_CONTENT_URI        = "/analysis/getAnalysisContent?noview=1";
var ANALYSIS_HEADER_URI         = "/analysis/getAnalysisHeader?noview=1";
var ANALYSIS_HEADER_WRAPPER_ID  = "analysisHeaderWrapper";
var ANALYSIS_CONTENT_WRAPPER_ID = "analysisContentWrapper";
var ANALYSIS_PANELS_STATE_URI   = "/analysis/storePanelOpenState?noview=1";
var ANALYSIS_EXTRAS_STATE_URI   = "/analysis/handleExtras?noview=1";
var ANALYSIS_CHART_EXPORT_PATH  = "analysischart/downloadChart";
var ANALYSES_CHART_CURRENT_TYPE = 'line';
var ANALYSIS_VALUE_COUNT        = -1;
var ANALYSIS_PDF_EXPORT         = false;
var ANALYSIS_CLONE_CHART_READY  = false;
var ANALYSIS_CLONE_CHART_WIDTH  = '750';
var ANALYSIS_CLONE_CHART_HEIGHT = '300';
var ANALYSIS_SCROLLER_IDS       = {left: 'userTabsScrollLeft', right: 'userTabsScrollRight' };
var ANALYSIS_SCROLLER_SPACING   = 1;
var ANALYSIS_SCROLLER_TIMEOUT   = null;
var ANALYSIS_SCROLLER_INTERVAL  = 30;
var ANALYSIS_SCROLLER_PIXELS    = 10;
var ANALYSIS_SCROLLER_DIRECTION = false;

/*******************************************************************************
 * grid related stuff
 ******************************************************************************/
var MIN_MAX_STORAGE             = new Array();
var MIN_MAX_FOR_COLUMNS         = new Array();

/*******************************************************************************
 * help related stuff
 ******************************************************************************/
var HELP_TREE_VISIBLE           = true;
var HELP_TREE_INNER_HEIGHT      = 0;

/*******************************************************************************
 * dummy functions for globalization
 ******************************************************************************/
var clearTabScrolling           = new Function();
var performScrolling            = new Function();


/**
 * function to avoid xhtml-error for target-attribute use this function instead
 * 
 * @param (anchor)object
 * @return void
 */
function target_blank(obj)
{
    obj.target = '_blank';
}

/**
 * checks committed datestring for validity
 * 
 * @param datestring
 *            ... valid with dd.mm.yyyy
 */
function isDhxDate(datestring)
{
    return datestring.search(/^(?:(0[1-9]|[12][0-9]|3[01])[\- \/.](0[1-9]|1[012])[\- \/.](19|20)[0-9]{2})$/) == -1 ? false : true;
}

function getJSDate(dhxDateString)
{
    if(!isDhxDate(dhxDateString)) return false;
    return new Date(parseInt(dhxDateString.substr(6,4),10), parseInt(dhxDateString.substr(3,2),10)-1,  parseInt(dhxDateString.substr(0,2),10));    
}


/**
 * changing css-path to apply selected zoom level to GUI
 */
function changeZoomLevel(zoomLevel){
    if(typeof(document.getElementById('zoomCSS')) == 'undefined')
        return;
    
    // resetting css path
    document.getElementById('zoomCSS').href = CSS_PATH+'zoom_'+zoomLevel+'.css';

    // marking active zoom link
    for(var i=0 ; i<ZOOM_LINKS_ID_PARAM.length ; i++){
        document.getElementById(ZOOM_LINKS_ID_BASE + ZOOM_LINKS_ID_PARAM[i]).className = '';
    }
    
    document.getElementById(ZOOM_LINKS_ID_BASE + zoomLevel).className = 'headerLinkActive';
    
    // fire ajax query to save level in session
    $.get('/home/zoomlevel', {
        level: zoomLevel,
        noview: '1'
    });    
}

/**
 * open/close bug box
 * 
 * @return void
 */
function toggleBugBox(){
    if(BUG_BOX_FADE_TIMEOUT)
        return;
    
    if(BUG_BOX_SENT_TIMEOUT){
        clearTimeout(BUG_BOX_SENT_TIMEOUT);
        BUG_BOX_SENT_TIMEOUT = null;
    }
    
    if(BUG_BOX_OPEN){
        BUG_BOX_OPEN = false;
        try{
            document.getElementById('bugBoxButtonClose').style.display = 'none';
            fadeBugBox();
        }catch(e){
            alert(e);
        }
    }else{
        BUG_BOX_OPEN = true;
        try{
            document.getElementById('bugBoxButtonOpen').style.display = 'none';
            document.getElementById('bugBox').style.display = 'block';
            // document.getElementById('bugBoxShadow').style.display = 'block';
            fadeBugBox();
        }catch(e){
            alert(e);
        }
    }
}

/**
 * sliding bug box
 * 
 * @return void
 */
function fadeBugBox(){    
    var bugBoxObj = document.getElementById('bugBox');
    
    var boxCurrentWidth = parseInt(bugBoxObj.style.width.toString().replace(/px/, ''));
    if(!boxCurrentWidth)
        boxCurrentWidth = 1;
    
    var complete = false;
    
    if(BUG_BOX_OPEN){
        if((BUG_BOX_TARGET_WIDTH_MAIN - boxCurrentWidth) < BUG_BOX_FADE_PIXELS){
            complete = true;
            bugBoxObj.style.width = BUG_BOX_TARGET_WIDTH_MAIN+"px";
        }else{
            complete = false;
            bugBoxObj.style.width = (boxCurrentWidth + BUG_BOX_FADE_PIXELS)+"px";
        }
    }else{
        if(boxCurrentWidth < BUG_BOX_FADE_PIXELS){
            complete = true;
            bugBoxObj.style.width = "1px";
        }else{
            complete = false;
            bugBoxObj.style.width = (boxCurrentWidth - BUG_BOX_FADE_PIXELS)+"px";
        }
    }
        
    if(!complete)
        BUG_BOX_FADE_TIMEOUT = setTimeout(function(){ fadeBugBox(); }, BUG_BOX_FADE_DELAY);
    else{
        BUG_BOX_FADE_TIMEOUT = null;
        document.getElementById('bugBoxButton'+(BUG_BOX_OPEN == true ? 'Close' : 'Open')).style.display = 'block';
        
        if(!BUG_BOX_OPEN){
            document.getElementById('bugBox').style.display = 'none';
            // document.getElementById('bugBoxShadow').style.display = 'none';
        }
    }
}

/**
 * ajax-call for sending an email with value of bugbox textarea
 * 
 * @return void
 */
function sendBugBoxMail(){
    var textArea = document.getElementById('bugBoxMessage');
    var bugBoxSubmit = document.getElementById('bugBoxSubmit');
    var closeButton = document.getElementById('bugBoxButtonClose');
    
    if(textArea.value != ''){
        textArea.disabled = 'disabled';
        bugBoxSubmit.style.display = 'none';
        closeButton.style.display = 'none';
        
        $.get('/help/sendbugmail', {
                message: textArea.value,
                noview: '1'
            },
            function(data){
                textArea.style.color = '#396e11';
                textArea.value = data;

                BUG_BOX_SENT_TIMEOUT = setTimeout(function(){
                    textArea.style.color = '#000000';
                    textArea.disabled = "";
                    textArea.value = '';
                    bugBoxSubmit.style.display = 'block';
                    toggleBugBox();
                }, BUG_BOX_SENT_TIME_DELAY);
            }
        );
    }
}

function detectMinMax(grid){
    var rowCount = grid.getRowsNum();
    var currentRowId = null;
    var currentCell = null;
    var currentCellValue = 0.0;
    
    for(var i = 0 ; i < MIN_MAX_FOR_COLUMNS.length ; i++){
        MIN_MAX_STORAGE[i] = { minCell: null, maxCell: null };
        
        for(var k = 0 ; k < rowCount ; k++){
            currentRowId = grid.getRowId(k);
            currentCell = grid.cellById(currentRowId, MIN_MAX_FOR_COLUMNS[i]).cell;
            
            currentCellValue = parseFloat(currentCell.innerHTML);
            if(isNaN(currentCellValue))
                continue;
            
            // managing min values
            if(MIN_MAX_STORAGE[i].minCell == null ||
              (parseFloat(MIN_MAX_STORAGE[i].minCell.innerHTML) > currentCellValue))
                MIN_MAX_STORAGE[i].minCell = currentCell;

            // managing max values
            if(MIN_MAX_STORAGE[i].maxCell == null ||
              (parseFloat(MIN_MAX_STORAGE[i].maxCell.innerHTML) < currentCellValue))
                MIN_MAX_STORAGE[i].maxCell = currentCell;
        }
        
        if(MIN_MAX_STORAGE[i].minCell != null){
            MIN_MAX_STORAGE[i].minCell.style.fontWeight = 'bold';
            MIN_MAX_STORAGE[i].minCell.style.color = '#099A00';
            MIN_MAX_STORAGE[i].minCell.innerHTML = "MIN&nbsp;&nbsp;&nbsp;" + MIN_MAX_STORAGE[i].minCell.innerHTML;
        }
        
        if(MIN_MAX_STORAGE[i].maxCell != null){
            MIN_MAX_STORAGE[i].maxCell.style.fontWeight = 'bold';
            MIN_MAX_STORAGE[i].maxCell.style.color = '#FF0000';
            MIN_MAX_STORAGE[i].maxCell.innerHTML = "MAX&nbsp;&nbsp;&nbsp;" + MIN_MAX_STORAGE[i].maxCell.innerHTML;
        }
    }
}

function refreshChartInfo()
{
    $.get('/analysis/getAnalysisChartInfo',
        { noview: '1' },
        function(data)
        { 
            $('#chartInfos').html(data);
        }
    );            
}
/**
 * refresh timestamps in options-pane and set new headline
 * 
 * @param BOOLEAN
 *            refreshOptionPanel
 * @return
 */
function refreshHeadlineAndTimestampsInGui(refreshOptionPanel)
{
    // refreshing analysis-title (from - to)
    $.get('/analysis/getAnalysisHeadline',
        { noview: '1' },
        function(timestamps)
        {
            // refreshing document title
            document.title = 'LebensRäume Hoyerswerda eG ▪ EVIS ▪ Verbrauchsanalyse:';
              
            if(timestamps.indexOf("###") != -1)
            {
                var ts = timestamps.split("###");
                document.title += ' ' + ts[0] + ' bis ' + ts[1];
            
                // set headline
                $('#analysisHeadline').html('               <span id="headlineFromDate">' + ts[0] + '</span>' + "\n" +
                                            '               <span class="headlineUntil">&nbsp;bis&nbsp;</span>' + "\n" +
                                            '               <span id="headlineToDate">' + ts[1] + '</span>' + "\n");
                if(refreshOptionPanel)
                {
                   // startTS in options panel
                   $('#xform_calendar_from').html(ts[0]);
                   // endTS in options panel
                   $('#xform_calendar_to').html(ts[1]);
                }                      
            }
            else
            {
                $('#analysisHeadline').html(timestamps);
                document.title += ' ' + timestamps;
            }
        });
    showHeadlineAndTimestampsInGui()
}

function hideHeadlineAndTimestampsInGui()
{
    //$('#xform_calendar_from').html("");
    //$('#xform_calendar_from').html("");
    document.title = 'LebensRäume Hoyerswerda eG ▪ EVIS ▪ Verbrauchsanalyse: ';
    $('#analysisHeadline').fadeOut();
}

function showHeadlineAndTimestampsInGui()
{
    $('#analysisHeadline').fadeIn();
}

function loadAnalysisContent(tabId, init)
{
    ANALYSIS_CHART_READY = false;
    
    $('#'+ANALYSIS_CONTENT_WRAPPER_ID).load(ANALYSIS_CONTENT_URI+(init == 1 ? "&messages=keep" : "") + "&tabid=" + tabId[0],
    function(){
        var _now = new Date();
        var ucfirstChartType = ANALYSES_CHART_CURRENT_TYPE.charAt(0).toUpperCase();
        ucfirstChartType = ucfirstChartType + ANALYSES_CHART_CURRENT_TYPE.substr(1);

        
        var analysisChart = new SWFObject(
            "/charts/am"+ANALYSES_CHART_CURRENT_TYPE+"/am"+ANALYSES_CHART_CURRENT_TYPE+".swf",
            "amcolumnObject",
            "100%",
            "100%",
            "8","#FFFFFF"
        );
        analysisChart.addVariable("chart_id", "am"+ANALYSES_CHART_CURRENT_TYPE+"Object");
        analysisChart.addVariable("path", "am"+ANALYSES_CHART_CURRENT_TYPE+"/");
        analysisChart.addVariable("data_file", encodeURIComponent("/analysischart/getChartCSV?noview=1"));
        analysisChart.addVariable("settings_file",
            encodeURIComponent(
                "/charts/am"+ANALYSES_CHART_CURRENT_TYPE+"_settings.xml, /analysischart/get"+ucfirstChartType+"ChartSetupXML?noview=1&ts="+_now.getTime()
            )
        );
    
        analysisChart.addVariable("loading_settings", "Lade Einstellungen für den Graphen");
        analysisChart.addVariable("loading_data", "Lade Daten"); 
        
        analysisChart.addParam("wmode", "opaque");
        analysisChart.write("chartWrapper");
    });
}

function setAnalysisPanelsOpenState(panelId, openState)
{
    $.ajax({
        url: ANALYSIS_PANELS_STATE_URI,
        data: { panel: panelId, open: (openState == true ? 1 : 0) }
    });
}

/*******************************************************************************
 * functions for options-pane
 ******************************************************************************/

/**
 * @param calArray -
 *            Array of Calendar-Objects
 * @param notThisCal
 *            -this CalendarObject shouldn't be hidden
 * @return void
 */
function closeCalendars(calArray, notThisCal)
{
    for(var i=0;i<calArray.length;i++)
    {
        if(calArray[i].uid != notThisCal.uid)
            calArray[i].hide();        
    }    
}

/**
 * returns value for checked medium-radio-button
 * 
 * @return boolean
 */
function getCheckedMedia()
{
    var tmp_ele = document.getElementsByName("medium");
    for(var i=0;i<tmp_ele.length;i++)
    {
        if(tmp_ele[i].checked)
        {
            return tmp_ele[i].value;            
        }
    }
    return false;
}

/**
 * returns checked medium-radio-button as html-object
 * 
 * @return HTMLObject
 */
function getCheckedMediaElement()
{
    var tmp_ele = document.getElementsByName("medium");
    for(var i=0;i<tmp_ele.length;i++)
    {
        if(tmp_ele[i].checked)
        {
            return tmp_ele[i];
        }
    }    
}

/**
 * returns arbitary medium-radio-button as html-object
 * 
 * @param valid
 *            media-type (e.g. '400')
 * @return HTMLObject
 */
function getElementForMedia(media)
{
    var tmp_ele = document.getElementsByName("medium");
    
    for(var i=0;i<tmp_ele.length;i++)
    {
        if(tmp_ele[i].value == media)
        {
            return tmp_ele[i];
        }
    }
    return false;
}

/**
 * get label-element named with $name
 * 
 * @param name
 * @return HTMLObject
 */
function getLabelForInput(name)
{
    var tmp_ele = document.getElementsByTagName("label");
    
    for(var i=0;i<tmp_ele.length;i++)
    {
        if(tmp_ele[i].getAttribute("for")   == name)
        {
            return tmp_ele[i];
        }
    }    
    return false;    
}

/**
 * disabled radio-buttons wont be checked ... next enabled instead of
 * 
 * @param name
 *            of radio-buttons
 * @return void
 */
function forceRadioCheck(name)
{
    var tmp_ele = document.getElementsByName(name);
    
    for(var i=0;i<tmp_ele.length;i++)
    {
        if(!tmp_ele[i].disabled)
        {            
            tmp_ele[i].checked = true;
            return;
        }
    }    
}

/**
 * disable radio-buttons if selected rom doesnt support medium and set new value
 * 
 * @return void
 */
function refreshMediaRadios()
{
    var pattern = /#(\w+)\|[A-Za-z0-9?]*/gi;
    var result  = "";
    var tmp_ele = document.getElementsByName("medium");
    
    // set all to disabled
    for(var i=0;i<tmp_ele.length;i++)
    {
        tmp_ele[i].disabled = true;        
        getLabelForInput(tmp_ele[i].id).className += " as_inactive";
    }
    
    // enable those we want to
    while(result = pattern.exec($('#roomselect').val()))
    {
        tmp_ele = getElementForMedia(result[1]);
        tmp_ele.disabled = false;
        getLabelForInput(getElementForMedia(result[1]).id).className = "";
    }
    
    // checked element is disabled?
    if(getElementForMedia(CHECKED_RADIO).disabled)
    {
        forceRadioCheck("medium");
    }
    else
    {
        getElementForMedia(CHECKED_RADIO).checked = true;
    }
    
    // get checked and set hidden field with value
    for(var i=0;i<document.getElementsByName("medium").length;i++)
    {
        if(document.getElementsByName("medium")[i].checked)
        {
            setValueForChangedMediaRadio(document.getElementsByName("medium")[i].value);
            break;
        }
    }
    
    controlHouseAvg();
}

/**
 * sets new value to hidden field
 * 
 * @param media
 * @return void
 */
function setValueForChangedMediaRadio(media)
{    
    var pattern = "#"+media+"\\|([A-Za-z0-9?]*)#";
    var regex   = new RegExp(pattern);    
    var result  = regex.exec($('#roomselect').val());
    
    document.getElementsByName("device")[0].value = result[1];    
}

/**
 * automatically checks, if houseavg should be checkable or not
 * 
 * @return void
 */
function controlHouseAvg()
{
    var tmp_ele = document.getElementById('houseavg');
    var flag = (document.getElementsByName("device")[0].value == 'all');
    
    if(tmp_input = document.getElementById('xform_calendar_compare_from'))
    {
        if(tmp_input.value.length > 0)
        {
            flag = false;
        }
    }
    
    getLabelForInput('houseavg').className = flag ? "" : "as_inactive";
    tmp_ele.checked = flag ? (HOUSE_AVG == 1 ? true : false) : flag; 
    tmp_ele.disabled = !flag;        
}

/**
 * toggles extras-button and send state via ajax to server
 * 
 * @param id
 *            of button (for changing state)
 * @return void
 */
function changeExtrasOpened(buttonId)
{
    var opened   = 0;
    
    if(($("#extra_diagramm").hasClass("as_none")))
    {
        opened = 1;
        
        $('#extra_calculation').fadeIn('fast');
        $('#extra_diagramm').fadeIn('fast');
        
        $("#extra_diagramm").removeClass("as_none");
        $("#extra_calculation").removeClass("as_none");

        $("#"+buttonId).css("background-image","url(../img/button_minus.png)");
    }
    else
    {
        opened = 0;
        
        $('#extra_calculation').fadeOut('fast');
        $('#extra_diagramm').fadeOut('fast');
        
        $("#extra_diagramm").addClass("as_none");
        $("#extra_calculation").addClass("as_none");

        $("#"+buttonId).css("background-image","url(../img/button_plus.png)");
    }
    
    // $('#extra_calculation').fadeTo('fast',
    // opened);$('#extra_diagramm').fadeOut('fast', opened);
    
    $.ajax({
        url: ANALYSIS_EXTRAS_STATE_URI,
        data: { visible: opened }
    });    
}

/**
 * creates an unvisible chart-clone with fixed width and height for
 * export functions
 * 
 * @param chartType
 * @return
 */
function cloneChart(chartType)
{
    var chartObj = document.getElementById(chartType+"Object").cloneNode(true);
    
    chartObj.id = chartType+"ObjectClone";
    
    chartObj.width  = ANALYSIS_CLONE_CHART_WIDTH;
    chartObj.height = ANALYSIS_CLONE_CHART_HEIGHT;
    
    if(!chartObj.getAttribute('flashvars'))
    {
        // IE
        document.getElementById('cloneChartWrapper').appendChild(chartObj);
        document.getElementById(chartType+"ObjectClone").getElementsByTagName("param")[4].value = document.getElementById(chartType+"ObjectClone").getElementsByTagName("param")[4].value.replace(/chart_id=[a-zA-Z0-9]+/, 'chart_id=' + chartObj.id);
    }
    else
    {
        // other browsers
        chartObj.setAttribute('flashvars', chartObj.getAttribute('flashvars').replace(/chart_id=[a-zA-Z0-9]+/, 'chart_id=' + chartObj.id));
        document.getElementById('cloneChartWrapper').appendChild(chartObj);
    }
    
    if($.browser.safari)
    {
        chartObj.exportImage = document.getElementById(chartType+"Object").exportImage;
        amChartInited(chartObj.id);
    }
}

/**
 * function called by amCharts after chart is fully loaded and initialized
 */
function amChartInited(chart_id)
{
    var currentChart = getFlashMovieObject(chart_id);

    if(chart_id.search(/clone/i) == -1)
    {
        // default chart
        setAnalysisPanelsOpenState("chartCell", true);
        //alert(document.getElementById(chart_id).setSettings);
        
        if(chart_id.search(/column/i) != -1)
        {
            adjustXFrequencyForColumnChart(chart_id);
        }
    }
    else
    {
        ANALYSIS_CLONE_CHART_READY = true;
        
        if(chart_id.search(/column/i) != -1)
        {
            if(ANALYSIS_VALUE_COUNT == -1)
                adjustXFrequencyForColumnChart(chart_id);
            else
                refreshColumnChartSettings(chart_id, ANALYSIS_VALUE_COUNT);
        }
        
        // pdf export
        if(ANALYSIS_PDF_EXPORT)
        {
            ANALYSIS_PDF_EXPORT = false;
            var startExportIn = 1000;
            
            if(($.browser.safari || $.browser.chrome || $.browser.opera) && chart_id.search(/column/i) != -1)
                startExportIn = 3000;
            
            setTimeout(function(){ runPdfExport(chart_id); }, startExportIn);
        }
        
        // image export
        if(false)
        {
            currentChart.exportImage(ANALYSIS_CHART_EXPORT_PATH);
        }
    }
}

function amReturnImageData(chart_id, data)
{
    ANALYSIS_CLONE_CHART_READY = false;

    $('#loadingDataWrapper').css("display", "none");
    
    setTimeout(function(){
        document.getElementById('cloneChartWrapper').innerHTML = '';
    }, 1000);
}

/**
 * adjusting x-axis value frequency after loading data
 */
function adjustXFrequencyForColumnChart(chart_id)
{
    $.get('/analysis/getValueCount',
        { noview: '1' },
        function(count){
            if(!count || count == '-1')
                return;
            
            count = Math.ceil(parseInt(count) / 8);
            ANALYSIS_VALUE_COUNT = count;
            
            refreshColumnChartSettings(chart_id, ANALYSIS_VALUE_COUNT);
        }
    );
}

function refreshColumnChartSettings(chart_id, value_count)
{
    var currentChart = getFlashMovieObject(chart_id);
    
    try {
        currentChart.setSettings("<settings><values><category><frequency>" + value_count + "</frequency></category></values></settings>");
    } 
    catch(e) {
        // debug here on localhost
    }
}

/**
 * - hiding MessageBoxes in a supreme, super-smooth and excellent animation
 * 
 * @return
 */
function hideMessages()
{
    $("#mainMessageWrapper").fadeTo(400, 0.1, function()
        {
            $("#mainMessageWrapper").slideUp(400, function()
            {
                $("#mainMessageWrapper").remove();
            });
        }
    );
}

/**
 * sets the compareTo-value - checks, if analysisOptions have valid dates -
 * calls controlHouseAvg() for checking/uncheking houseavg-checkbox - calculate
 * new compareTo if dates are valid otherwise set compareTo to ""
 * 
 * @return void
 */
function compareCheck()
{
    controlHouseAvg();
    
    var tmp_from = document.getElementById('xform_calendar_from');
    var tmp_to = document.getElementById('xform_calendar_to'); 
    var tmp_cfrom = document.getElementById('xform_calendar_compare_from');
    var tmp_cto = document.getElementById('xform_calendar_compare_to');
     
    if((tmp_cfrom.value == "") || !(isDhxDate(tmp_from.value) && isDhxDate(tmp_to.value) && isDhxDate(tmp_cfrom.value))) 
    {
        tmp_cto.innerHTML = "";
        return;    
    }
    
    var interval = getJSDate(tmp_to.value).getTime() - getJSDate(tmp_from.value).getTime();    
    var tmpdate = new Date(getJSDate(tmp_cfrom.value).getTime()+interval);
    
    tmp_cto.innerHTML   =  ((tmpdate.getDate().toString().length == 1) ? "0" : "")+tmpdate.getDate().toString() + "." +
                           (((tmpdate.getMonth()+1).toString().length == 1) ? "0" : "") +
                           (tmpdate.getMonth()+1).toString() +
                           "." + tmpdate.getFullYear().toString();
}

/**
 * toggles visibility of help tree container
 * 
 * @return void
 */
function helpToggleTreeVisibility()
{
    if(HELP_TREE_VISIBLE)
    {
        HELP_TREE_INNER_HEIGHT = $("#helpTreeInner").height();
        
        $("#helpTreeInner").animate({"opacity" : 0.0, "width" : "1px", "height" : "1px"}, "fast");
        $("#helpToggleTreeVisibility").text("Hilfe-Verzeichnis einblenden");
        
        HELP_TREE_VISIBLE = false;
    }
    else
    {
        $("#helpTreeInner").animate({"opacity" : 1.0, "width" : "250px", "height" : HELP_TREE_INNER_HEIGHT+"px"}, "fast");
        $("#helpToggleTreeVisibility").text("Hilfe-Verzeichnis ausblenden");
        
        HELP_TREE_VISIBLE = true;
    }
}

function exportPdf()
{
    var amWhat = $('#chartWrapper').children().attr('id').replace(/Object/,'');
    $('#loadingDataWrapper').css("display", "block");
    
    if(!ANALYSIS_CLONE_CHART_READY)
    {
        ANALYSIS_PDF_EXPORT = true;
        cloneChart(amWhat);
    }
    else
    {
        runPdfExport(amWhat+'ObjectClone');
    } 
}

function runPdfExport(clone_chart_id)
{
    var currentChart = getFlashMovieObject(clone_chart_id);
    currentChart.exportImage("analysis/getPDF");    
}

function _amError(id, message)
{
    alert(id+": "+message);
}

function checkUserTabsScrolling(initCall)
{
    var scrollerAppearance = userTabsScrollersShouldAppear();
    
    if(scrollerAppearance != false)
    {
        if(scrollerAppearance == 'left' || scrollerAppearance == true)
            $("#" + ANALYSIS_SCROLLER_IDS.left).css("visibility", "visible");
        else
            $("#" + ANALYSIS_SCROLLER_IDS.left).css("visibility", "hidden");
        
        if(scrollerAppearance == 'right' || scrollerAppearance == true)
            $("#" + ANALYSIS_SCROLLER_IDS.right).css("visibility", "visible");
        else
            $("#" + ANALYSIS_SCROLLER_IDS.right).css("visibility", "hidden");
    }
    else
    {
        resetUserTabPositions();
        $("#" + ANALYSIS_SCROLLER_IDS.left).css("visibility", "hidden");
        $("#" + ANALYSIS_SCROLLER_IDS.right).css("visibility", "hidden");
    }
    
    if(initCall)
    {
        initUserTabsScrolling($("#" + ANALYSIS_SCROLLER_IDS.left), "right");
        initUserTabsScrolling($("#" + ANALYSIS_SCROLLER_IDS.right), "left");
        
        $(window).resize(function() {
            checkUserTabsScrolling(false);
        });
    }
}

function userTabsScrollersShouldAppear()
{
    var wrapperWidth = $("#userTabsWrapper").width();    
    var userTabElements = $("#userTabsWrapper .dhx_tab_element");
    
    var userTabsWidth = ANALYSIS_SCROLLER_SPACING * userTabElements.length;
    
    for(var i = 0 ; i < userTabElements.length ; i++)
    {
        userTabsWidth += $(userTabElements[i]).width();
    }
    
    // any scroller should appear, now decide which one or both
    if(userTabsWidth > wrapperWidth)
    {
        return checkUserTabsScrollerAppearance();
    }
    
    return false;
}

function checkUserTabsScrollerAppearance(){
    var userTabElements = $("#userTabsWrapper .dhx_tab_element");
    
    var firstTabPosLeft = $(userTabElements[userTabElements.length - 1]).position().left;
    var lastTabPosRight = parseInt($(userTabElements[0]).css("right").replace("px", ""));
    
    var returnArray = new Array();
    
    if(lastTabPosRight >= 0)
        returnArray.push("left");

    if(firstTabPosLeft >= 0)
        returnArray.push("right");
    
    if(returnArray.length == 0)
        return true;
    else
        return returnArray[0];
}

function initUserTabsScrolling(initObj, direction)
{
    var userTabElements = $("#userTabsWrapper .dhx_tab_element");
    
    // attaching event for mouseup -> killing scrolling timeout
    initObj.bind("mouseup", clearTabScrolling = function(){
        clearTimeout(ANALYSIS_SCROLLER_TIMEOUT);
        ANALYSIS_SCROLLER_TIMEOUT = null;
        ANALYSIS_SCROLLER_DIRECTION = false;
    });
    
    // attaching event for mousedown -> performs scrolling
    initObj.bind("mousedown", {dir: direction, toView: null}, performScrolling = function(event){

        ANALYSIS_SCROLLER_DIRECTION = event.data.dir;
        toView = event.data.toView;
        
        for(var i=0 ; i<userTabElements.length ; i++)
        {
            var rightPos = parseInt($(userTabElements[i]).css("right").replace("px", ""));
            var newRightPos = rightPos + (ANALYSIS_SCROLLER_DIRECTION == 'left' ? ANALYSIS_SCROLLER_PIXELS : -ANALYSIS_SCROLLER_PIXELS);
            
            $(userTabElements[i]).css("right", newRightPos+"px");
        }
        
        // checking button appearance and scrolling permission at borders
        checkUserTabsScrolling(false);
        
        if((checkUserTabsScrollerAppearance() == ANALYSIS_SCROLLER_DIRECTION) ||
           (
             toView != null && 
             (
               (ANALYSIS_SCROLLER_DIRECTION == 'right' && 
                 (parseInt(toView.css("right").replace("px", "")) <= 
                   ($("#userTabsWrapper").width() - (toView.width()))
                 )
               ) ||
               (ANALYSIS_SCROLLER_DIRECTION == 'left' &&
                 (parseInt(toView.css("right").replace("px", "")) >= 0)
               )
             )
           )
          )
        {
            clearTabScrolling();
            return;
        }
        
        ANALYSIS_SCROLLER_TIMEOUT = setTimeout(function(){ performScrolling(event) }, ANALYSIS_SCROLLER_INTERVAL);
    });
}

function resetUserTabPositions()
{
    var userTabElements = $("#userTabsWrapper .dhx_tab_element");
    
    for(var i = 0 ; i < userTabElements.length ; i++)
    {
        var rightPos = ($(userTabElements[i]).width() + ANALYSIS_SCROLLER_SPACING) * i;
        $(userTabElements[i]).css("right", rightPos+"px");
    }
}

function checkIfTabIsHidden(tabId){
    var activeUserTab = $("div[tab_id=" + tabId + "]");
    
    if(!activeUserTab)
        return;
    
    var tabRightPos = parseInt(activeUserTab.css("right").replace("px", ""));
    var tabWidth = activeUserTab.width() + ANALYSIS_SCROLLER_SPACING;
    var tabWrapperWidth = $("#userTabsWrapper").width();

    if(tabRightPos < 0)
    {
        // selected tab that lies under right scroller, so scroll left
        performScrolling({data: {dir: 'left', toView: activeUserTab}});
    }
    else if((tabRightPos + tabWidth) > tabWrapperWidth)
    {
        // selected tab that lies under left scroller, so scroll right
        performScrolling({data: {dir: 'right', toView: activeUserTab}});
    }
}

function getFlashMovieObject(movieName)
{
    if (window.document[movieName]) 
    {
        return window.document[movieName];
    }
    
    if (navigator.appName.indexOf("Microsoft Internet")==-1)
    {
        if (document.embeds && document.embeds[movieName])
            return document.embeds[movieName]; 
    }
    else // if (navigator.appName.indexOf("Microsoft Internet")!=-1)
    {
        return document.getElementById(movieName);
    }
}
