
/*****************************************************************************
 *
 * Purpose: parse JSON strings to HTML (query result outputs)
 * Author:  Armin Burger
 *
 *****************************************************************************
 *
 * Copyright (c) 2003-2006 Armin Burger
 *
 * This file is part of p.mapper.
 *
 * p.mapper is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version. See the COPYING file.
 *
 * p.mapper is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with p.mapper; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 ******************************************************************************/

try {
    var queryResultLayout = opener.queryResultLayout;
} catch(e) {
    var queryResultLayout = 'table';
}



function parseJSON(jsonstr, infoWin) {
    //alert(infoWin);
    var rhtml = '';

    // Nothing found with query, return only header 
    if (jsonstr == 0) {
        rhtml += '<table class="restable" cellspacing="0" cellpadding="0">';
        rhtml += '<td>' + localeList['noRecords'] + '</td>'; 
        rhtml += '<td><a href="javascript:this.close();"><img align="right" src="images/close.gif" border=0 ></a></td>';
        rhtml += '</tr></table>';
    
        return rhtml;
    }


    // Features found, parse JSON string
    var groups = jsonstr[0];    
    
    var jlen = groups.length;
    
    
    for (var i=0; i<jlen; i++) {
        var layObj = groups[i];
        
        rhtml += '<div class="LAYERHEADER">' + layObj.description + '</div>';
        rhtml += '<table class="sortable" border="0" cellspacing="0" cellpadding="0">';
        
        //*** Header line ***/
        var hL = layObj.header;
        if (hL[0] == '@') {
            var withShpLink = true;
        } else {
            var withShpLink = false;
            //var withShpLink = true;
        }
        
        var hLlen = hL.length;
        rhtml += '<tr>';
        var startcol = withShpLink ? 0 : 1;
        for (var hi=startcol; hi<hLlen; hi++) {
            rhtml += '<th>' + hL[hi] + '</th>';
        }
        rhtml += '</tr>';
        
        
        //*** Values of the layer ***/
        var vL = layObj.values;
        var vLlen = vL.length;
        
        for (var vi=0; vi<vLlen; vi++) {
            
            //--- Rows ---//
            var rowL = vL[vi];
            var rowLlen = rowL.length;
            
            rhtml += '<tr>';
            for (var ri=startcol; ri<rowLlen; ri++) {
                // Write out shape link for zoom
                if (withShpLink && ri < 1) {
                    var shplinkL = rowL[ri].shplink;
                    rhtml += '<td class=\"zoomlink\"><a href="javascript:' + (infoWin == 'frame' ? '' : 'opener.') + 'zoom2extent(\'' + shplinkL[0] + '\', \'' + shplinkL[1] + '\', \'' + shplinkL[2] + '\')">';
                    rhtml += '<img src="images/zoomto.gif" alt="zoomto"></a></td>';
                } else {
                    // Check for Hyperlinks
                    if (isObject(rowL[ri])) {
                        var hypLinkL = rowL[ri].hyperlink;
                        rhtml += '<td><a href="javascript:openHyperlink(\'' + hypLinkL[0] + '\', \'' + hypLinkL[1] + '\', \'' + hypLinkL[2].replace(/"|'/, '\\\'') + '\')">' + hypLinkL[3] + '</a></td>';
                    } else {
                        rhtml += '<td>' + rowL[ri] + '</td>';
                    }
                }
            }
            rhtml += '</tr>';
        }
        

        rhtml += '</table>';
    }
    
    
    /*** Zoom parameters ***/
    var zp = jsonstr[1];
    var infoWin = zp.infoWin;
    var allextent = zp.allextent;
    var autozoom = zp.autozoom;
    var zoomall = zp.zoomall;
    var ref2opener = (infoWin == 'frame' ? '' : 'opener.');
    
    if (zoomall) {
        //alert('ja');
        var zStr = '<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" width=\"100%\"><tr><td class=\"zoomlink\">';
        zStr += "<a href=\"javascript:";
        zStr += ref2opener + 'zoom2extent(0,0,\'' + allextent + '\')';
        zStr += '\"><img src=\"images/zoomtoall.gif\"alt=\"za\"></a></td><td class=\"TDAL\">' + localeList['zoomSelected'] + '</td></tr></table>';
        
        rhtml += zStr;
    }
    
    // Add image for onload event
    var azStr = '<img src=\"images/blank.gif\" onload=\"';  
    if (autozoom) {
        //var azStr = '<script type=\"text/javascript\">';
        
        if (autozoom == 'auto') {
            azStr += ref2opener + 'zoom2extent(0,0,\'' + allextent + '\');';
        } else if (autozoom == 'highlight') {
            azStr += ref2opener + 'updateMap(' + ref2opener + 'PM_XAJAX_LOCATION + \'x_load.php?' + SID +  '&mode=map&zoom_type=zoompoint\', \'\')';
        }
        //alert(azStr);
        //azStr += '</script>';
        
    } else {
        azStr += ref2opener + '$(\'#zoombox\').hidev();';
    }
    
    azStr += '\" />';
    rhtml += azStr;
    
    
    //rhtml += '<p><a href="javascript:opener.startExportQueryResults(\'xls\')">Export to XLS</a>';
    
    //alert( rhtml);
    
    return rhtml;
}




function parseJSON_dtree(jsonstr, infoWin) {
    //alert(infoWin);
    var rhtml = '';

    // Nothing found with query, return only header 
    if (jsonstr == 0) {
        rhtml += '<table class="restable" cellspacing="0" cellpadding="0">';
        rhtml += '<td>' + localeList['noRecords'] + '</td>'; 
        rhtml += '<td><a href="javascript:this.close();"><img align="right" src="images/close.gif" border=0 ></a></td>';
        rhtml += '</tr></table>';
    
        return rhtml;
    }
    

    // Features found, parse JSON string   
    d = new dTree('d');
    d.add(0,-1,'Result');
		    
    var groups = jsonstr[0];      
    var jlen = groups.length;
    var id = 1;
    var gid = 0;
    
    for (var i=0; i<jlen; i++) {
        var layObj = groups[i];
        
        d.add(id, 0, layObj.description, '');
        var gid = id;
        id++;
           
        //*** Header line ***/
        var hL = layObj.header;
        if (hL[0] == '@') {
            var withShpLink = true;
        } else {
            var withShpLink = false;
            //d.add(id, 0, layObj.description, '');
        }
        
        var hLlen = hL.length;
        var startcol = withShpLink ? 0 : 1;
        var n4node = withShpLink ? 1 : 0;

        //*** Values of the layer ***/
        var vL = layObj.values;
        var vLlen = vL.length;
        
        for (var vi=0; vi<vLlen; vi++) {
            
            //--- Rows ---//
            var rowL = vL[vi];
            var rowLlen = rowL.length;
            
            /*if (withShpLink) {
                var shplinkL = rowL[0].shplink;
                var zoomlink = 'javascript:' + (infoWin == 'frame' ? '' : 'opener.') + 'zoom2extent(\'' + shplinkL[0] + '\', \'' + shplinkL[1] + '\', \'' + shplinkL[2] + '\')';
                d.add(id, 0, layObj.description, zoomlink);
            }*/
            
            if (isObject(rowL[n4node])) {
                var nodeAnnot = rowL[n4node].hyperlink[3];
            } else {
                var nodeAnnot = rowL[n4node];
            }
            d.add(id, gid, nodeAnnot, '');
            var rid = id;
            id++;
            
            for (var ri=startcol; ri<rowLlen; ri++) {
                // Write out shape link for zoom
                if (withShpLink && ri < 1) {
                    var shplinkL = rowL[ri].shplink;
                    var zoomlink = 'javascript:' + (infoWin == 'frame' ? '' : 'opener.') + 'zoom2extent(\'' + shplinkL[0] + '\', \'' + shplinkL[1] + '\', \'' + shplinkL[2] + '\')';
                    d.add(id, rid, '<img src="images/zoomtiny.gif" alt="" /> Zoom', zoomlink);
                    id++;
                } else {
                    // Check for Hyperlinks
                    if (isObject(rowL[ri])) {
                        var hypLinkL = rowL[ri].hyperlink;
                        var hlink = 'javascript:openHyperlink(\'' + hypLinkL[0] + '\', \'' + hypLinkL[1] + '\', \'' + hypLinkL[2] + '\')' ;
                        //var resrow = '<div class="qrow"><div class="qcell">' + hL[ri] + '</div>' + '<div class="qcell">' + hypLinkL[3] + '</div></div>';
                        var resrow =  '<span class="qcname">' + hL[ri] + '</span>: &nbsp;' +  hypLinkL[3];
                    } else {
                        var hlink = '';
                        //var resrow = '<div class="qrow"><div class="qcell">' + hL[ri] + '</div>' + '<div class="qcell">' + rowL[ri] + '</div></div>';;
                        var resrow =  '<span class="qcname">' + hL[ri] + '</span>: &nbsp;' + rowL[ri];
                        id++;
                    }
                    
                    d.add(id, rid, resrow, hlink);
                    id++;
                }
            }
        }
    }
    
    
    /*** Zoom parameters ***/
    var zp = jsonstr[1];
    var infoWin = zp.infoWin;
    var allextent = zp.allextent;
    var autozoom = zp.autozoom;
    var zoomall = zp.zoomall;
    var ref2opener = (infoWin == 'frame' ? '' : 'opener.');
    
    if (zoomall) {
        //alert('ja');
        var zStr = '<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" width=\"100%\"><tr><td class=\"zoomlink\">';
        zStr += "<a href=\"javascript:";
        zStr += ref2opener + 'zoom2extent(0,0,\'' + allextent + '\')';
        zStr += '\"><img src=\"images/zoomtoall.gif\"alt=\"za\"></a></td><td class=\"TDAL\">' + localeList['zoomSelected'] + '</td></tr></table>';
        
        rhtml += zStr;
    }
    
    
    var autozoom = zp.autozoom;
    // Add image for onload event
    var azStr = '<img src=\"images/blank.gif\" onload=\"';  
    if (autozoom) {
        //var azStr = '<script type=\"text/javascript\">';
        
        if (autozoom == 'auto') {
            azStr += ref2opener + 'zoom2extent(0,0,\'' + allextent + '\');';
        } else if (autozoom == 'highlight') {
            azStr += ref2opener + 'updateMap(' + ref2opener + 'PM_XAJAX_LOCATION + \'x_load.php?' + SID +  '&mode=map&zoom_type=zoompoint\', \'\')';
        }
        //alert(azStr);
        //azStr += '</script>';
        
    } else {
        azStr += ref2opener + '$(\'#zoombox\').hidev();';
    }
    
    azStr += '\" />';
    rhtml += azStr;
    
    var resList = new Array();
    resList[0] = d;
    resList[1] = rhtml;
    
    var res = d + '<br />' + rhtml;
    
    return res; //List;
}


/**
 * parse IQuery (auto-identify) result
 */
function parseJSON_IQuery(jsonstr) {

    // Nothing found with query 
    if (jsonstr == 0) {
        return false;
    }

    // Features found, parse JSON string
    var groups = jsonstr[0];    
    
    // Only take the first layer from group
    var layObj = groups[0];
    
    var startcol = 1; 
    
    //*** Header line ***/
    var hL = layObj.header;    
    var hLlen = hL.length;
    
    //*** Values of the layer ***/
    var vL = layObj.values;  
        
    //--- Rows ---//
    var rowL = vL[0];  // <====== Only take the first from result
     
    // Loop through records and create HTML
    var rhtml = '';
    rhtml += '<table class="iquery" border="0" cellspacing="0" cellpadding="0">';
    rhtml += '<tr><th colspan="2" class="header">' + layObj.description + '</td></tr>';
    
    for (var hi=startcol; hi<hLlen; hi++) {
        rhtml += '<tr>';
        rhtml += '<th>' + hL[hi] + '</th>';
        
        // Check for Hyperlinks
        if (isObject(rowL[hi])) {
            var hypLinkL = rowL[hi].hyperlink;
            rhtml += '<td>' + hypLinkL[3] + '</td>';
        } else {
            rhtml += '<td>' + rowL[hi] + '</td>';
        }
        
        rhtml += '</tr>';
    }
    rhtml += '</table>';
    
    return rhtml;
}



/**
 * Parse JSON result string with parseJSON()
 * and insert resulting HTML into queryresult DIV
 */
function writeQResult() {
    if (queryResultLayout == 'table') {
        var resstr = parseJSON(resultJSON, opener.infoWin);
        $('#queryresult').html(resstr);
        sortables_init();
    } else {
        var restree = parseJSON_dtree(resultJSON, opener.infoWin);
        $('#dtreequeryresult').html(restree);
    }
}




function isObject(a) {
    return (a && typeof a == 'object') || typeof a == 'function';
} 


