
var category = [];
var report_url;
var runner;
var report;

/* these contents of these variables are generated by the server */
var json_model;
var json_subbasin;
var json_province;
var json_contractor;
var json_cotr;
var json_sponsor;
var json_sponsortype;
var json_manager;

function addOptions(sel, nvp)
{
    if (!sel || !nvp) return;

    for (var i = 0; i < nvp.length; i++)
    {
        var opt = document.createElement('option');
        opt.value = nvp[i].value;
        opt.text = nvp[i].name;
        sel.options[i] = opt;
    }
}

function buttonRunClick(returnData)
{
    if (returnData && returnData.length)
    {
        var launch_url = "";
    
        if (report_url.indexOf("ReportViewer.aspx") < 0)
        {
            // this is a static document, append the selection to the report url
            launch_url = report_url + returnData[0].value;
        }
        else
        {
            // reportviewer report: remove duplicate query string parameters
            var qstring = "";
            var report_url_parts    = report_url.split('?');
            var report_url_base     = report_url_parts[0];
            var report_url_qs       = report_url_parts[1].split('&');

            // append all parameters from the url that are not in the returnData array
            for (var i = 0; i < report_url_qs.length; i++)
            {                
                var override    = 0;
                var parameter   = report_url_qs[i].split('=');
                for (var j = 0; j < returnData.length; j++)
                {
                    if (parameter[0] == returnData[j].name)
                    {
                        override = 1;
                        break;
                    }
                }
                
                // override parameter value in url if necessary
                if (override == 0)
                    qstring = qstring + "&" + report_url_qs[i];
                else
                    qstring = qstring + "&" + returnData[j].name + "=" + encodeURI(returnData[j].value);
            }
                
            // append all parameters in the returnData array that are not in the url parameters
            for (var i = 0; i < returnData.length; i++)
            {
                var found = 0;
                
                for (var j = 0; j < report_url_qs.length; j++)
                {
                    var parameter  = report_url_qs[j].split('=');
                    if (parameter[0] == returnData[i].name)
                    {
                        found = 1;
                        break;
                    }
                }

                if (found == 0)
                    qstring = qstring + "&" + returnData[i].name + "=" + encodeURI(returnData[i].value);
            }
            
            if (qstring.length > 0)
                qstring = qstring.substring(1)

            launch_url = report_url_base + '?' + qstring;
        }

        window.open(launch_url, "_blank", "location=1,status=1,scrollbars=1,width=640,height=480,resizable=1");
        
        return 1;
    }
}

function buttonCloseClick()
{
}

function findReport(id)
{
    if (!json_model) return null;
    var categories = objectToArray(json_model.categories.category);

    for (var c = 0; c < categories.length; c++)
    {
        // scan through all reports that are direct children of the category
        var reports = objectToArray(categories[c].body.report);
        for (var r = 0; r < reports.length; r++)
            if (reports[r].id == id)
                return reports[r];

        // look through all the groups within each category
        var groups = objectToArray(categories[c].body.group);
        for (var g = 0; g < groups.length; g++)
        {
            reports = objectToArray(groups[g].report);
            for (var r = 0; r < reports.length; r++)
                if (reports[r].id == id)
                    return reports[r];
        }
    }

    return null;
}

function initPage()
{
    var cat;
    var i = 0;

    while (cat = document.getElementById('repcat' + i + 'detail'))
    {
        category[i]         = new Object();
        category[i].detail  = cat;
        category[i].image   = document.getElementById('repcat' + i + 'image');
        hideCategory(i++);
    }

    if (json_text)
        json_model = json_text.parseJSON();

    if (!json_model)
        alert('The report DOM is not present in the page.');

    var expand = qstring('expand');
    
    if (expand)
    {
        var cats = expand.split(',');
        for (var i = 0; i < 3 && i < cats.length; i++)
            if (cats[i] == "1")   
                showCategory(i);
    }
    else
    {
        showCategory(1);
        showCategory(2);
    }
    
    var highlight = qstring('highlight');
    
    if (highlight)
    {
        var r = document.getElementById('r' + highlight);
        if (r) r.className = 'rephighlight';
    }
}

function hideCategory(i)
{
    if (category[i])
    {
        category[i].detail.style.display = 'none';
        category[i].image.src = "images/arrow-right.gif";
        category[i].hidden = true;
    }
}

function isValidFormData(returnData)
{
    if (returnData && returnData.length)
    {
        for (var i = 0; i < returnData.length; i++)
        {
            var parameters = objectToArray(report.parameters.parameter);

            // see if a validation expression exists for this parameter
            for (var p = 0; p < parameters.length; p++)
            {
                if (parameters[p].name == returnData[i].name && parameters[p].validation && parameters[p].validation != "")
                {
                    // yes, validate the value of this field
                    var re = new RegExp(parameters[p].validation);
                    if (!returnData[i].value.match(re))
                    {
                        if (parameters[p].hint)
                            alert(parameters[p].hint);
                        else
                            alert('Parameter ' + parameters[p].label + ' is invalid.');
                        return false;
                    }
                }
            }
        }
    }

    return true;
}

function renderFormElement(r)
{
    if (!r.parameters)
        return null;

    var table = document.createElement('table');
    table.setAttribute('class', 'formElement');

    var tbody = document.createElement('tbody');
    table.appendChild(tbody);

    if (r.parameters.header)
    {
        var row         = document.createElement('tr');
        var cell        = document.createElement('td');
        cell.colSpan    = "2";
        cell.className  = "parameterText";
        cell.innerHTML  = r.parameters.header;
        row.appendChild(cell);
        tbody.appendChild(row);
    }

    var parameters = objectToArray(r.parameters.parameter);
    var i = 0;

    for (var p = 0; p < parameters.length; p++)
    {
        var row = document.createElement('tr');

        var cell1 = document.createElement('td');
        cell1.className = "formLabel";
        cell1.innerHTML = parameters[p].label + ":";
        row.appendChild(cell1);

        var cell2 = document.createElement('td');
        cell2.className = "formInput";

        if (parameters[p].type == 'select')
        {
            var sel = document.createElement('select');
            sel.name = parameters[p].name;
            sel.id = 'rcinput' + i++;
            sel.className = "formInput";

            if (parameters[p].options)
            {
                var nvp;
                eval('nvp = ' + parameters[p].options);
                addOptions(sel, nvp);
            }
            else
            {
                var options = objectToArray(parameters[p].option);
                var index = 0;

                for (var o = 0; o < options.length; o++)
                {
                    var opt = document.createElement('option');
                    opt.value = options[o].value;
                    opt.text = options[o].text;
                    sel.options[o] = opt;

                    if (options[o].selected)
                        index = o;
                }

                sel.selectedIndex = index;
            }

            cell2.appendChild(sel);
        }
        else if (parameters[p].type == 'text')
        {
            var text = document.createElement('input');
            text.type = 'text';
            text.name = parameters[p].name;
            text.id = 'rcinput' + i++;
            text.className = "formInput";
            if (parameters[p].value)
                text.value = parameters[p].value;
            cell2.appendChild(text);
        }
        else
        {
            cell2.innerHTML = "Unknown input-type";
        }

        row.appendChild(cell2);
        tbody.appendChild(row);
    }

    if (r.parameters.footer)
    {
        var row         = document.createElement('tr');
        var cell        = document.createElement('td');
        cell.colSpan    = "2";
        cell.className   = "parameterText";
        cell.innerHTML  = r.parameters.footer;
        row.appendChild(cell);
        tbody.appendChild(row);
    }

    return table;
}

function showCategory(i)
{
    if (category[i])
    {
        category[i].detail.style.display = 'block';
        category[i].image.src = "images/arrow-down.gif";
        category[i].hidden = false;
    }
}

function showReportRunner(r, e)
{
    if (isNaN(r)) return;
    report = findReport(r);
    if (!report) return;

    report_url  = report.url;
    e           = jt_fixE(e);

    if (!runner)
    {
        runner = new jt_AppForm("white-space.gif", buttonRunClick, buttonCloseClick, "reportRunner");
        runner.setTitle("Report Center - Specify Report Parameters");
        runner.validate = isValidFormData;
    }

    runner.formElement = renderFormElement(report);
    runner.render();

    var x = e.clientX;
    var y = e.clientY;

    if (y + runner.container.clientHeight > getWindowHeight())
        y = getWindowHeight() - runner.container.clientHeight - 10;

    if (x + runner.container.clientWidth > getWindowWidth())
        x = getWindowWidth() - runner.container.clientWidth - 10;

    runner.moveTo(x, y + getScrollTop());
    runner.focus();
}

function getScrollTop()
{
    if (document.documentElement && !document.documentElement.scrollTop)
        // IE6 +4.01 but no scrolling going on
        return 0;
    else if (document.documentElement && document.documentElement.scrollTop)
        // IE6 +4.01 and user has scrolled
        return document.documentElement.scrollTop;
    else if (document.body && document.body.scrollTop)
        // IE5 or DTD 3.2
        return document.body.scrollTop;
    else
        return 0;
}

function getWindowHeight()
{
    var y = 0;

    if (self.innerHeight)   // all browsers except ie
	    y = self.innerHeight;
    else if (document.documentElement && document.documentElement.clientHeight) // ie6 strict mode
	    y = document.documentElement.clientHeight;
    else if (document.body) // other versions of ie
	    y = document.body.clientHeight;

    return y;
}

function getWindowWidth()
{
    var x = 0;

    if (self.innerHeight)
	    x = self.innerWidth;
    else if (document.documentElement && document.documentElement.clientHeight)
	    x = document.documentElement.clientWidth;
    else if (document.body)
	    x = document.body.clientWidth;

    return x;
}

function objectToArray(o)
{
    if (!o) return new Array();
    if (!o.length) return new Array(o);
    return o;
}

function qstring(name)
{
    name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
    var regex   = new RegExp("[\\?&]"+name+"=([^&#]*)");
    var results = regex.exec(window.location.href);
    
    if (results == null)
        return "";
    
    return results[1];
}

function toggleCategory(i)
{
    if (category[i])
    {
        if (category[i].hidden)
            showCategory(i);
        else
            hideCategory(i);
    }
}
