
var mapIsLoaded = false;

var baseIcon = new GIcon();
baseIcon.shadow = 'http://www.nsidc.org/images/marker_shadow.png';
baseIcon.iconSize = new GSize(16, 28);
baseIcon.shadowSize = new GSize(40, 28);
baseIcon.iconAnchor = new GPoint(7, 27);
baseIcon.infoWindowAnchor = new GPoint(7,2);
baseIcon.infoShadowAnchor = new GPoint(17,25);
var groupicons = new Array(6);
for (var i = 1; i < 6; i++) {
    groupicons[i] = new GIcon(baseIcon);
    groupicons[i].image = 'http://www.nsidc.org/images/marker_group_'+i+'.png';
}

var count = 0;
function showSelectValue(e) {
    count++;
    var test = document.getElementById('testdiv');

    if (e.target) {
        test.innerHTML = 'OK target!' + e.target.id;
    }
    else if (e.toElement) {
        test.innerHTML = 'OK toElement! ' + e.toElement.id + ', ' + count;
    }
    else {
        test.innerHTML = 'NOT OK!';
    }
}


function attachTest() {
    var s = document.getElementById('available_stations');
    if (s.attachEvent) {
        s.attachEvent('onmouseenter', showSelectValue);
    }
    else {
        s.addEventListener('mouseover',showSelectValue,false);
    }
}


function addStation(select,id,name,group) {
    for (var x = 0; x < select.options.length; x++) {
        if (select.options[x].value == id) {
            return false;
        }
    }
    var newopt = document.createElement('option');
    newopt.text = name;
    newopt.value = id;
    newopt.className = group;
    var oldopt = select.options[0];
    try {
        select.add(newopt, oldopt);
    }
    catch (ex) {
        try {
            select.add(newopt, 0);
        }
        catch (ex) {
            select.add(newopt);
        }
    }
    return true;
}


function pressAdd() {
    var available = document.getElementById('available_stations');
    var picked    = document.getElementById('sel_picked_stations');

    for (var x = 0; x < available.options.length; x++) {
        var station = available.options[x];
        if (station.selected == true) {
            addStation(picked, station.value, station.text, station.className);
        }
    }
}


function removeStation(select,id) {
    for (var x = 0; x < select.options.length; x++) {
        if (select.options[x].value == id) {
            select.remove(x);
            return true;
        }
    }
    return false;
}


function pressRemove() {
    var picked = document.getElementById('sel_picked_stations');

    for (var x = 0; x < picked.options.length; x++) {
        if (picked.options[x].selected == true) {
            picked.remove(x);
            x--;
        }
    }
}


function clickMarker(id,name,group) {
    var picked = document.getElementById('sel_picked_stations');

    if (!addStation(picked,id,name,'group'+group))
        removeStation(picked,id);
}


function createMarker(point, id, name, group) {
    var newStation = new GMarker( point, groupicons[group] );
    var newTooltip = new Tooltip( newStation, name,  4, 'group'+group );
    var siteOption = document.getElementById('site_' + id);
    
    newStation.value = id;
    newStation.tooltip = newTooltip;
    siteOption.tooltip = newTooltip;
    
    GEvent.addListener(newStation, 'dblclick',
        function() { clickMarker(id,name,group) });
    GEvent.addListener(newStation, 'mouseover',
        function() { this.tooltip.show() });
    GEvent.addListener(newStation, 'mouseout',
        function() { this.tooltip.hide() });
    GEvent.addDomListener(siteOption, 'mouseover',
        function() { this.tooltip.show() });
    GEvent.addDomListener(siteOption, 'mouseout',
        function() { this.tooltip.hide() });

    return newStation;
}


function loadGoogleMap( stations ) {

    if ( GBrowserIsCompatible() ) {
        var map = new GMap2( document.getElementById( 'mapdiv' ) );

        var southPad = 90;
        var westPad = 180;
        var northPad = -90;
        var eastPad = -180;

        map.setCenter( new GLatLng( 0, 0), 0 );
        map.setMapType( G_HYBRID_MAP );
        map.disableDoubleClickZoom();
        map.enableScrollWheelZoom();
        map.addControl( new GSmallMapControl() );

        for (var i = 0; i < stations.length; i++) {
            var lat = stations[i][0];
            var lon = stations[i][1];
            var stationid = stations[i][2];
            var stationname = stations[i][3];
            var stationgroup = stations[i][4];

            if (lat > 85) lat = 85;
            if (lat < -85) lat = -85;
            if (lon > 179) lon = 179;
            if (lon < -179) lon = -179;

            var nPad, sPad, ePad, wPad;

            var point = new GLatLng( lat, lon );
            var newStation = createMarker(point, stationid, stationname, stationgroup);
            map.addOverlay( newStation );
            map.addOverlay( newStation.tooltip );

            var offset = 10;
            nPad = lat + offset;
            sPad = lat - offset;
            ePad = lon + offset;
            wPad = lon - offset;
            
            if (nPad > northPad) northPad = nPad;
            if (sPad < southPad) southPad = sPad;
            if (ePad > eastPad) eastPad = ePad;
            if (wPad < westPad) westPad = wPad;
        }

        if (northPad > 85) northPad = 85;
        if (southPad < -85) southPad = -85;
        if (eastPad > 179) eastPad = 179;
        if (westPad < -179) westPad = -179;

        var swPad = new GLatLng( southPad, westPad );
        var nePad = new GLatLng( northPad, eastPad );
        var bounds = new GLatLngBounds( swPad, nePad );
        map.setZoom( map.getBoundsZoomLevel( bounds ) );
        map.setCenter( bounds.getCenter() );

        bound = map.getBounds();
        if (bounds.getNorthEast().lat() > 85) {
            var cSpan = bounds.toSpan();
            var latoffset = cSpan.lat()/2;
            var center = map.getCenter();
            var lat = center.lat();

            lat = 85 - latoffset + 10;
            map.setCenter(new GLatLng(lat,center.lng()));
        }

        mapIsLoaded = true;
    }
    else {
        document.getElementById( 'map' ).style.height = '';
        document.getElementById( 'map' ).style.width = '';
    }
}



function toggleAllProducts(toggleBox) {
    var doCheck = toggleBox.checked;

    var products = document.getElementsByName('productcheck');
    for (var i = 0; i < products.length; i++) {
        products[i].checked = doCheck;
        var toggleAll = document.getElementById(products[i].value+'_toggleall');
        toggleAll.checked = doCheck;
        toggleProduct(products[i]);
        toggleAllParams(toggleAll);
    }
}


function toggleProduct(prodBox) {
    var newdisplay;
    var product = prodBox.value;

    if (prodBox.checked) 
        newdisplay = 'block';
    else
        newdisplay = 'none';

    var prodparams = document.getElementById(product+'params');
    
    prodparams.style.display = newdisplay;
    checkToggleAllProducts();
}


function toggleAllParams(toggleBox) {
    var product = toggleBox.value;
    var doCheck = toggleBox.checked;
    
    var params = document.getElementsByName('selectparam');
    for (var i = 0; i < params.length; i++) {
        if (params[i].value.indexOf(product) == 0) {
            params[i].checked = doCheck;
        }
    }

    checkToggleAllProducts();
}

function checkToggleAllProducts() {
    var doCheck = true;

    var box = document.getElementsByTagName('input');
    for (var i = 0; i < box.length; i++) {
        if (box[i].id) {
            if (box[i].id.indexOf('_toggleall') >= 0) {
                if (!box[i].checked) {
                    doCheck = false;
                    break;
                }
            }
        }
    }

    if (doCheck) {
        var box = document.getElementsByName('productcheck');
        for (var i = 0; i < box.length; i++) {
            if (!box[i].checked) {
                doCheck = false;
                break;
            }
        }
    }

    document.getElementById('toggleEverything').checked = doCheck;
}


function checkToggleAllParams(product, doCheck) {
    if (doCheck == true) {
        var params = document.getElementsByName('selectparam');
        for (var i = 0; i < params.length; i++) {
            if (params[i].value.indexOf(product) == 0) {
                if (!params[i].checked) {
                    doCheck = false;
                    break;
                }
            }
        }
    }
    document.getElementById(product + '_toggleall').checked = doCheck;
    checkToggleAllProducts();
}


function changeParam(paramBox) {
    var product = paramBox.value.split(':')[0];
    var paramCheck = paramBox.checked;
    var doCheck;

    checkToggleAllParams(product, paramCheck);
}


function initProducts() {
    var products = document.getElementsByName('productcheck');
    for (var i = 0; i < products.length; i++) {
        toggleProduct(products[i]);
        checkToggleAllParams(products[i].value, products[i].checked);
    }
}


Date.oneday = 86400000;

Date.prototype.dayOfYear = function() {
    var onejan = new Date(this.getUTCFullYear(), 0, 1);
    return Math.ceil( (this-onejan) / Date.oneday ) + 1;
}


function getDateFormat(fieldtype) {
    var ftbuttons = document.getElementsByName(fieldtype+'formattype');
    for (var i = 0; i < ftbuttons.length; i++) {
        if (ftbuttons[i].checked) return ftbuttons[i].value;
    }

    return null;
}


function convertField(datefield,fieldtype) {
    var date = datefield.value;
    var datesplit = date.split('-');
    var dd,mm,yy;
    var fulldate = /^\d{4,4}\-\d{1,3}(?:\-\d{1,2})?$/;
    var seasonal = /^\d{1,3}(?:\-\d{1,2})?$/;
    var curFormat = getDateFormat(fieldtype);
    var tempDate;
    var convert = '';

    if (fulldate.test(date)) {
        yy = datesplit[0];
        if (datesplit.length == 2) {
            if (curFormat == 'dayofyear') return;
            dd = datesplit[1];
        }
        else {
            if (curFormat == 'calendar') return;
        
            mm = datesplit[1];
            dd = datesplit[2];
        }
    }
    else if (seasonal.test(date)) {
        yy = 2001;
        if (datesplit.length == 1) {
            if (curFormat == 'dayofyear') return;
            dd = datesplit[0];
        }
        else {
            if (curFormat == 'calendar') return;
    
            mm = datesplit[0];
            dd = datesplit[1];
        }
    }
    else {
        if (date != '') {
            //alert('Error converting date!');
            datefield.focus();
        }
        return;
    }

    if (curFormat == 'dayofyear') {
        tempDate = new Date(yy, mm-1, dd);

        dd = tempDate.dayOfYear();
        if (fieldtype == 'overall')
            convert = yy + '-';
        if (dd < 10) 
            convert += '00';
        else if (dd < 100)
            convert += '0';
        convert = convert + dd;
    }
    else if (curFormat == 'calendar') {
        var onejan = new Date(yy,0,1);
        tempDate = new Date( onejan - ( -(dd-1) * Date.oneday ));
        mm = tempDate.getMonth() + 1;
        dd = tempDate.getDate();
        if (fieldtype == 'overall')
            convert = yy + '-';
        if (mm < 10)
            convert += '0';
        convert += mm.toString() + '-';
        if (dd < 10)
            convert += '0';
        convert += dd.toString();
    }

    datefield.value = convert;
        
}


function changeDateFormat(fieldtype) {
    convertField(document.getElementById(fieldtype+'start'),fieldtype);
    convertField(document.getElementById(fieldtype+'end'),fieldtype);
}


function toggleArrow(imgid, divid, force) {
    var img = document.getElementById(imgid);
    var div = document.getElementById(divid);

    if (force == null) {
        force = (div.className == 'hidden');
    }

    if (force) {
        img.src = '/images/mist/triangle_open.png';
        div.className = 'visible';

        if (divid == 'search_body' && !mapIsLoaded) 
            loadGoogleMap( stationlist );
    }
    else {
        img.src = '/images/mist/triangle_closed.png';
        div.className = 'hidden';
    }
}



function searchsubmit() {
    var selpick = document.getElementById('sel_picked_stations');
    var hidpick = document.getElementById('picked_stations');

    hidpick.value = '';

    for (var i = 0; i < selpick.options.length; i++) {
        if (hidpick.value != '') hidpick.value += ',';
        hidpick.value += selpick.options[i].value;
    }

    return true;
}


function doSearch() {
    toggleArrow('search_arrow', 'search_body', false);
    document.getElementById('statusdiv').className = 'visible';
    if (document.getElementById('error_list')) {
        document.getElementById('error_list').className = 'hidden';
    }
    if (document.getElementById('results_body')) {
        toggleArrow('results_arrow', 'results_body', false);
    }
    if (document.getElementById('graphs_body')) {
        toggleArrow('graphs_arrow', 'graphs_body', false);
    }
}

function clearSearch() {
    if (!confirm('Clear all search parameters?  This will not remove previous results.'))
        return;


    var select;

    select = document.getElementById('sel_picked_stations');
    while (select.options.length > 0) {
        select.remove(0);
    }
    
    document.getElementById('toggleEverything').checked = false;
    toggleAllProducts(document.getElementById('toggleEverything'));

    document.getElementById('overallstart').value = '';
    document.getElementById('overallend').value = '';
    document.getElementById('seasonstart').value = '';
    document.getElementById('seasonend').value = '';

    var radio = document.getElementsByName('overallformattype');
    for (var x = 0; x < radio.length; x++) {
        if (radio[x].value == 'calendar')
            radio[x].checked = true;
    }

    var radio = document.getElementsByName('seasonformattype');
    for (var x = 0; x < radio.length; x++) {
        if (radio[x].value == 'calendar')
            radio[x].checked = true;
    }

    document.getElementById('searchname').value = '';
}


function resultsSubmit() {

    var resultSel = document.getElementsByName('downloader');
    for (var x = 0; x < resultSel.length; x++) {
        if (resultSel[x].value == 'CREATE NEW GRAPH' && resultSel[x].checked) {
            var graphSel = document.getElementById('graphtype');
            var graphType = graphSel[graphSel.selectedIndex].value;

            if (graphType == '') {
                alert('You must select a Graph Type!');
                return false;
            }

            graphSel = document.getElementById('datatype');
            var dataType = graphSel[graphSel.selectedIndex].value;

            if (dataType == '') {
                alert('You must select a Data Value Type!');
                return false;
            }

            if (graphType == 'scatterplot') {
                var xCount = 0;
                var yCount = 0;
                var graphParam = document.getElementsByName('xparam');
                for (var x = 0; x < graphParam.length; x++) {
                    if (graphParam[x].checked) {
                        xCount++;
                        break;
                    }
                }
                graphParam = document.getElementsByName('yparam');
                for (var y = 0; y < graphParam.length; y++) {
                    if (graphParam[y].checked) {
                        yCount++;
                        break;
                    }
                }

                if (xCount == 0) {
                    alert('You must select a parameter for the X axis!');
                    return false;
                }
                if (yCount == 0) {
                    alert('You must select a parameter for the Y axis!');
                    return false;
                }
            }   
            else {
                var pCount = 0;
                var graphParam = document.getElementsByName('graphparam');
                for (var x = 0; x < graphParam.length; x++) {
                    if (graphParam[x].checked) {
                        pCount++;
                    }
                }

                if (pCount == 0) {
                    alert('You must select a parameter!');
                    return false;
                }
            }

            break;
        }
    }
    
    if (document.getElementById('error_list')) {
        document.getElementById('error_list').className = 'hidden';
    }
    return true;
}


function graphSubmit() {

    return true;
}


function curResultAction() {
    var actions = document.getElementsByName('downloader');

    for (var x = 0; x < actions.length; x++) {
        if (actions[x].checked) {
            return actions[x].value;
        }
    }

    return '';
}


function changeResultAction() {
    var action = curResultAction();

    if (action == 'CREATE NEW GRAPH') {
        document.getElementById('create_graph').className = 'visible';
        loadGraphParams();
    }
    else {
        document.getElementById('create_graph').className = 'hidden';
    }
}


function checkDelete() {
    return confirm('Delete selected records?  This cannot be undone!');
}

function checkReset() {
    return confirm('Clear all search results, search parameters, and graphs\n\n'
                   + 'This action cannot be undone!');
}

function checkSubmit() {
    var action = curResultAction();

    if (action == '') {
        alert('You must select an action to perform!');
        return false;
    }
    else if (action == 'DELETE SELECTED RESULTS') {
        return checkDelete();
    }
    else if (action == 'RESET SESSION') {
        return checkReset();
    }
    else {
        return true;
    }
}


function checkResultBox() {
    if (curResultAction() == 'CREATE NEW GRAPH') {
        loadGraphParams();
    }
}


function changeGraphType() {
    var gtSel = document.getElementById('graphtype');
    var graphtype = gtSel[gtSel.selectedIndex].value;

    if (graphtype.indexOf('timeseries') >= 0) {
        document.getElementById('errorbardiv').className = 'visible';
    }
    else {
        document.getElementById('errorbartype').selectedIndex = 0;
        document.getElementById('errorbardiv').className = 'hidden';
    }

    if (graphtype.indexOf('folded') >= 0) {
        document.getElementById('foldinfodiv').className = 'visible';
    }
    else {
        document.getElementById('foldinfodiv').className = 'hidden';
    }

    loadGraphParams();
}

function changeErrorBar() {
    var dtSel = document.getElementById('datatype');
    var datatype = dtSel[dtSel.selectedIndex].value;

    var ebSel = document.getElementById('errorbartype');
    var errorbar = ebSel[ebSel.selectedIndex].value;

    if (errorbar == 'stddev' && datatype != 'mean') {
        alert('Standard Deviation is only valid for Statistical Mean data value type.');
        ebSel.selectedIndex = 0;
    }
}

function changeGraphParam() {
    var paramstr = '';
    var paramlist = new Array();
    var params;

    params = document.getElementsByName('graphparam');
    for (var x = 0; x < params.length; x++) {
        if (params[x].checked) {
            paramlist.push(params[x].value);
        }
    }
    
    params = document.getElementsByName('xparam');
    for (var x = 0; x < params.length; x++) {
        if (params[x].checked) {
            paramlist.push(params[x].value);
        }
    }

    params = document.getElementsByName('yparam');
    for (var x = 0; x < params.length; x++) {
        if (params[x].checked) {
            paramlist.push(params[x].value);
        }
    }
    
    document.getElementById('hiddenGraphParams').value = paramlist.join(',');
}

function checkGraphDelete() {
    return confirm('Delete selected graphs?  This cannot be undone!');
}

function checkGraphDeleteAll() {
    return confirm('Clear all graphs?  This action cannot be undone!');
}


function curGraphAction() {
    var actions = document.getElementsByName('graphaction');

    for (var x = 0; x < actions.length; x++) {
        if (actions[x].checked) {
            return actions[x].value;
        }
    }

    return '';
}

function checkGraphSubmit() {
    var action = curGraphAction();

    if (action == '') {
        alert('You must select an action to perform!');
        return false;
    }
    else if (action == 'DELETE SELECTED GRAPHS') {
        return checkGraphDelete();
    }
    else if (action == 'DELETE ALL GRAPHS') {
        return checkGraphDeleteAll();
    }
    else {
        return true;
    }
}

var graphajax;
function loadGraphParams() {
    var graphtypeSel = document.getElementById('graphtype');
    var plottype = graphtypeSel[graphtypeSel.selectedIndex].value;
    var params = "plottype=" + plottype;
    var results = document.getElementsByName('resultcheck');
    var numresults = 0;
    for (var x = 0; x < results.length; x++) {
        if (results[x].checked) {
            numresults++;
            params += '&results=' + results[x].value;
        }
    }
    params += '&graphparams=' + document.getElementById('hiddenGraphParams').value;
    var parambox = document.getElementById('create_graph_parameters');

    if (numresults == 0) {
        parambox.innerHTML = 'Please select one or more results above to view parameters.';
        return;    
    }
    if (plottype == '') {
        parambox.innerHTML = 'Please select a plot type to view parameter list.';
        return;
    }
    
    if (window.XMLHttpRequest) {
        graphajax = new XMLHttpRequest();
    }
    else {
        graphajax = new ActiveXObject("Microsoft.XMLHTTP");
    }

    if (graphajax) {
        var url = "mist_search_graph_params.pl";

        graphajax.open('POST', url, true);
        graphajax.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
        graphajax.setRequestHeader('Content-length', params.length);
        graphajax.setRequestHeader('Connection', 'close');

        graphajax.onreadystatechange = function() {
            var parambox = document.getElementById('create_graph_parameters');
            if (graphajax.readyState == 4) {
                if (graphajax.status == 200) {
                    parambox.innerHTML = graphajax.responseText;
                }
                else {
                    parambox.innerHTML = 'ERROR WITH LOAD!';
                }
            }
            else {
                parambox.innerHTML = 'LOADING PARAMETERS';
            }
        }
        graphajax.send(params);
    }
}


var ajax;
function openTip(tipId) {
    if (window.XMLHttpRequest) {
        ajax = new XMLHttpRequest();
    }
    else {
        ajax = new ActiveXObject("Microsoft.XMLHTTP");
    }

    if (ajax) {
        var url = "mist_help.pl?Select Station(s)";//+tipId;
        
        ajax.open('POST', url, false);
        ajax.send(null);

        document.getElementById('intraRangeTip').innerHTML = ajax.responseText;
        TagToTip('intraRangeTip');
        
//        Tip(ajax.responseText);
    }
}


function closeTip() {
    UnTip();
}


function toggleResultParam(img, divId) {
    var div = document.getElementById(divId);

    if (div.className.indexOf('hidden') >= 0) {
        img.src = '/images/mist/btn_minus.jpg';
        div.className = div.className.replace(/hidden/, 'visible');
    }
    else {
        img.src = '/images/mist/btn_plus.jpg';
        div.className = div.className.replace(/visible/, 'hidden');
    }
}



function pageload() {
    initProducts();

    if (document.getElementById('search_body').className.indexOf('hidden') < 0)
        loadGoogleMap( stationlist );
}

