
/*****************************************************************************
 *
 * 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
 *
 ******************************************************************************/
var srhtml;

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

function printReport(strHTML){
	
}



//  Balloon normal
function getShortDescription(jsonstr,adjsonstr, infoWin) {
    var rhtml = '';
	var rfhtml = '';
    // Nothing found with query, return only header 
	var DescriptionKeys = new Array("description","desc","descriptio","descript","descripting");
	var ImagePathKeys = new Array("pathimage","image","imgpath","img","imagepath","pathimg","imageurl");
	var TitleKeys = new Array("title","titl","caption","label","lbl","name","name_local");
	var LinkKeys = new Array("link","linkurl","url","urlpath","pathurl","linkpath","href");
	var MediaLinkKeys = new Array("medialink","medialinkurl","mediaurl","mediaurlpath","mediapathurl","medialinkpath","mediahref");
    if (jsonstr == 0) {
        rhtml += '<span class=\"noInfo\">'+ localeList['noRecords'] +'</span>';
        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 += "<br/>";
        rhtml += '<div class="ballonBoundInfoDescription">' + layObj.description+ '</div>';
        rhtml += '<div class="ballonBoundInfo"><table class="tableInfo">';
		
		var hL = layObj.header;
		if (hL[0] == '@') {
            var withShpLink = true;
        } else {
            var withShpLink = false;
        }
		var startcol = withShpLink ? 0 : 1;
		var vL = layObj.values;
		var vLlen = vL.length;
		for (var vi=0; vi<vLlen; vi++) {
			
			var rowL = vL[vi];
			var rowLlen = rowL.length;
			for (var ri=startcol; ri<rowLlen; ri++) {
				if (typeof hL[ri] != 'undefined' && TitleKeys.in_array(hL[ri].toLowerCase())) {
					var titleStr = rowL[ri].stripslashes();
					rhtml += '<tr><td  style=\"padding-bottom:8px;\" nowrap ><h3 style=\"color:black;font-family:verdana;font-size:13px\">'+titleStr+'</h3></td></tr>';
				}
				else if (typeof hL[ri] != 'undefined' && ImagePathKeys.in_array(hL[ri].toLowerCase())){
					var imagePath = rowL[ri];
					if (typeof imagePath != 'undefined')
						rhtml += '<tr><td ><img style=\"padding:2px;border:1px solid gray\" src=\"'+imagePath+'\"/></td></tr>';	
				}
				
				else if (typeof hL[ri] != 'undefined' && DescriptionKeys.in_array(hL[ri].toLowerCase())){ 
					var descriptionStr = (rowL[ri].wordWrap(60,"<br/>",0)).stripslashes();
					if (typeof descriptionStr != 'undefined' )
						rhtml += '<tr><td><p style="text-align:justify;color:#364C9F;\">' +  descriptionStr + '<br/></p></td></tr>';
				}
				else if (typeof hL[ri] != 'undefined' && LinkKeys.in_array(hL[ri].toLowerCase())) {
					var linkStr = rowL[ri];	
					if (typeof linkStr != 'undefined' )
						rhtml += '<tr><td><a href=\"'+linkStr+'\" target=\"_blank\" style=\"font-weight:bold;color:black\">more...</a></td></tr>';
				}
				else if ((typeof hL[ri] != 'undefined' && MediaLinkKeys.in_array(hL[ri].toLowerCase())) && (rowL[ri] != '' && typeof rowL[ri] != 'undefined')) {
					if (new RegExp('(http:\/\/www.youtube.com)','gi').exec(rowL[ri]))
						var mediaLinkStr = '<a href=\"'+rowL[ri]+'\" target=\"_blank\" style=\"font-weight:bold\"><img src=\"images/media/youtube-small.png\" style=\"border:none\"></a>';
					else if (new RegExp('(wikipedia.org)','gi').exec(rowL[ri]))
						var mediaLinkStr = '<a href=\"'+rowL[ri]+'\" target=\"_blank\" style=\"font-weight:bold\"><img src=\"images/media/wikipedia.png\" style=\"border:none\"></a>';
					else if (new RegExp('(http:\/\/www.panoramio.com)','gi').exec(rowL[ri]))
						var mediaLinkStr = '<a href=\"'+rowL[ri]+'\" target=\"_blank\" style=\"font-weight:bold\"><img src=\"images/media/panoramio.png\" style=\"border:none\"></a>';
					else
						var mediaLinkStr = '<a href=\"'+rowL[ri]+'\" target=\"_blank\" style=\"font-weight:bold\">'+rowL[ri]+'</a>';
					rhtml += '<tr><td align=\"right\" nowrap>'+mediaLinkStr+'</td></tr>';	
				}
				
				
			}
        
		}
		
	}
        rhtml += '</table>';
		rhtml += '</div>';
    return rhtml;
}
// End Balloon Normal



function parseSearchResult(jsonstr,adjsonstr,depjsonstr,infoWin){
	var rhtml = '';
	var rfhtml = '';
	if (jsonstr == 0 && depjsonstr == 0){
		rhtml += '<span class=\"noInfo\"><font style="color:red;font-weight:bold">Search Result :</font> No result match</span>';
        return rhtml;
	}
	var countfound = 0;
	rhtml += '<br/><br/>';
	
	//######## Map Info ##############
	if (jsonstr != 0){
		var groups = jsonstr[0];
		var jlen = groups.length;
		for (var i=0;i<jlen;i++){
			var layObj = groups[i];
			
			var hL = layObj.header;
			if (hL[0] == '@') var withShpLink = true;
	        else var withShpLink = false;
	        var startcol = withShpLink ? 0 : 1;
			
			var vL = layObj.values;
			var vLlen = vL.length;
			countfound += vLlen;
			for (var vi=0; vi<vLlen; vi++) {
				var rowL = vL[vi];
	            var rowLlen = rowL.length;
				rhtml += '<div style="padding:8px;background-color:#EDF2FF;margin-bottom:4px;border:1px solid #B3C6FD;">';
				rhtml += '<div style="font-family:verdana;color:black;">';
				for (var ri=startcol; ri<rowLlen; ri++) {
					if (hL[ri] != '@' || hL[ri] != 'ID'){
						if (withShpLink && ri < 1)
							var shplinkL = rowL[ri].shplink;
						if (hL[ri] == 'NAMA_MUKIM') rhtml += '<font style="color:#1563B0;font-weight:bold">'+rowL[ri]+'</font>';
						/*
						if (ri == 1) rhtml += '<font style="color:#1563B0;">'+rowL[ri]+'</font>';
						else
							rhtml += ',<font style="color:#1563B0;">'+rowL[ri]+'</font>';
						*/	
					}
				}
				rhtml += '</div>';
				rhtml += '<div><table><tr><td style="background-color:white;padding:4px;margin-bottom:1px;border:1px solid #ABC6F9"><img src="images/GISGotoMap.gif" style="border:none"><td></td><td style="background-color:white;padding:4px;margin-bottom:1px;border:1px solid #ABC6F9">';
				rhtml += '<a href="javascript:' + (infoWin == 'frame' ? '' : 'opener.') + 'zoom2extent(\'' + shplinkL[0] + '\', \'' + shplinkL[1] + '\', \'' + shplinkL[2] + '\')">Goto City</a>';
				rhtml += '</td></tr></table></div>';
				rhtml += '<div><font style="color:blue;font-family:verdana">Description:</font>'+layObj.description+'</div>';
				rhtml += '</div>';
			}
			
			
		}
	}
	
	//######## Database Info ###############
	var depGroups = depjsonstr;
	if (depGroups.length > 0){
		var valLength = depGroups.length;
		for(var i=0;i<valLength;i++){
			var item = depGroups[i];
			var header = item.header;
			var desc = item.desc;
			var val = item.values;
			countfound += val.length;
			if (val.length > 0){
				for(var j=0;j<val.length;j++){
					var row = val[j];
					rhtml += '<div style="padding:8px;background-color:#EDF2FF;margin-bottom:4px;border:1px solid #B3C6FD">';
					rhtml += '<div style="font-family:verdana;color:black;">';
					var str = "";
					for(var k=0;k<row.length;k++){
						if (row[k].type == "text"){
							if (k == 0) str += '<font style="color:#580101;font-weight:bold">'+header[k]+'</font>.<font style="color:#1563B0;font-weight:bold">'+row[k].values+'</font>';
							else
								str += ', <font style="color:#580101;font-weight:bold">'+header[k]+'</font>.<font style="color:#1563B0;font-weight:bold">'+row[k].values+'</font>';
						}	
					}
					
					rhtml += str;
					rhtml += '</div>';
					var str = '<div><table><tr>';
					for(var k=0;k<row.length;k++){
						if (row[k].type == "link"){
							str += '<td style="background-color:white;padding:4px;margin-bottom:1px;border:1px solid #ABC6F9"><img src="images/GISGotoMap.gif" style="border:none"><td></td><td style="background-color:white;padding:4px;margin-bottom:1px;border:1px solid #ABC6F9">';
							//str += '<font style="color:#580101;">'+header[k]+'</font>:<font style="color:#1563B0;font-weight:normal"><a href="javascript://" onclick="alert(\''+desc+','+row[k].values[1]+','+row[k].values[2]+'\')">'+row[k].values[0]+'</a></font>';
							var param = 'department='+desc.toLowerCase()+'&part='+(header[k]).toLowerCase()+'&field=dmap'+'&keyw='+row[k].values[1];
							str += '<font style="color:#580101;">'+header[k]+'</font>:<font style="color:#1563B0;font-weight:normal"><a href="javascript://" onclick="loadMapFromSearch(\''+param+'\');">'+row[k].values[0]+'</a></font></td>';

						}	
					}
					str += '</tr></table></div>';
					rhtml += str;
					rhtml += '<div><font style="color:blue;font-family:verdana">Description:</font>'+desc+'</div>';
					rhtml += '</div>';
				}
			}
		}
	}
	
	rhtml = '<span class=\"noInfo\"><font style="color:black;font-weight:bold">Search Result :</font> '+countfound+' record found</span>'+rhtml;
	return rhtml;
}

function parseJSON(jsonstr,adjsonstr, infoWin) {
    //alert(infoWin);
	var ImagePathKeys = new Array("pathimage","image","imgpath","img","imagepath","pathimg","imageurl");
    var rhtml = '';
	var rfhtml = '';
    // Nothing found with query, return only header 
    if (jsonstr == 0) {
        rhtml += '<span class=\"noInfo\">'+ localeList['noRecords'] +'</span>';
        return rhtml;
    }
	
	rfhtml += '<form name="frmInfoReport" method="post" target="_blank"  action="printReport.phtml">';
	rfhtml += '<div class="InfoPanelPrint"><img src="images/GISPrint.gif" align="absbottom"/>&nbsp;<input name="btnprint" type="submit" value="Print Document" class="MIPRButtonLink" ></div><br/>';
    // Features found, parse JSON string
    var groups = jsonstr[0];    
    
    var jlen = groups.length;
    
	rhtml +='<div class="boundInfoDescriptionScreen">';
	for (var i=0; i<jlen; i++) {
		var layObj = groups[i];
		if (i == jlen-1)
			rhtml += '<span id="headerProfileInfo'+i+'" class="boundInfoDescriptionSelected"  onclick="changeInfoTab('+i+','+(jlen-1)+',\'divProfileInfo\',\'headerProfileInfo\',\'boundInfoDescriptionSelected\',\'boundInfoDescription\')">' + layObj.description + '</span>';
		else
			rhtml += '<span id="headerProfileInfo'+i+'" class="boundInfoDescription"  onclick="changeInfoTab('+i+','+(jlen-1)+',\'divProfileInfo\',\'headerProfileInfo\',\'boundInfoDescriptionSelected\',\'boundInfoDescription\')">' + layObj.description + '</span>';
	}
	rhtml += '</div>';
    
    for (var i=0; i<jlen; i++) {
        var layObj = groups[i];
       
		rhtml += '<span class="boundInfoDescriptionPrint"  onclick="">'+layObj.description+'</span>';
        
		if (i == jlen-1)
			rhtml += '<div id="divProfileInfo'+i+'"  class="boundInfo" style="display:block;visibility:visible" ><table class="tableInfo" width="100%">';
		else
			rhtml += '<div id="divProfileInfo'+i+'"  class="boundInfo" style="display:none;visibility:hidden" ><table class="tableInfo" width="100%">';
        //  Header line 
      
		var hL = layObj.header;
		if (hL[0] == '@') {
            var withShpLink = true;
        } else {
            var withShpLink = false;
        }
        
        //var hLlen = hL.length;
        //rhtml += '<tr>';
        var startcol = withShpLink ? 0 : 1;
		
		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><td colspan=\"2\"><h2 class="SubInfoDescription">Map Information</h2></tr>';
            
            for (var ri=startcol; ri<rowLlen; ri++) {
                // Write out shape link for zoom
				var classStr = ((ri % 2) == 0)?'class="cellExplained-Dark"':'class="cellExplained"';
				rhtml += '<tr>';
				if (hL[ri] != '@' && hL[ri] != 'ID')
					rhtml += '<td class="cellInfo" nowrap=\"true\" width=\"20%\">' + hL[ri] + '</td>';
                
				if (withShpLink && ri < 1)
                    var shplinkL = rowL[ri].shplink;
                else {
                    // Check for Hyperlinks
					if (hL[ri] == 'ID') var thisID = rowL[ri];
					else{
	                    if (isObject(rowL[ri])) {
	                        var hypLinkL = rowL[ri].hyperlink;
	                        rhtml += '<td width=\"80%\" ><a href="javascript:openHyperlink(\'' + hypLinkL[0] + '\', \'' + hypLinkL[1] + '\', \'' + hypLinkL[2].replace(/"|'/, '\\\'') + '\')">' + hypLinkL[3] + '</a></td>';
	                    } else {
							if (typeof hL[ri] != 'undefined' && ImagePathKeys.in_array(hL[ri].toLowerCase())){
								var imagePath = rowL[ri];
								if (typeof imagePath != 'undefined')
									rhtml += '<td ><img style=\"padding:2px;border:1px solid gray\" src=\"'+imagePath+'\" /></td>';	
							}
							else
								rhtml += '<td '+classStr+' >&nbsp;' + rowL[ri] + '&nbsp;</td>';
	                    }
					}
                }
				
				//rhtml += '<tr><td colspan="2">tes</td></tr>';
            }
			
            rhtml += '<tr><td>&nbsp;</td><td class="cellSpecial"><a href="javascript:' + (infoWin == 'frame' ? '' : 'opener.') + 'zoom2extent(\'' + shplinkL[0] + '\', \'' + shplinkL[1] + '\', \'' + shplinkL[2] + '\')">';
            rhtml += 'Go To This Location and Zoom</a></td></tr>';
			
            rhtml += '<tr><td colspan="2"><a href=""></a></td></tr>';
        }
		

        rhtml += '</table>';

		var adgroups = adjsonstr;
		
		if (adgroups.length != 0){
			rhtml += '<table class="tableInfo" width="100%">';
			rhtml += '<tr><td colspan=\"2\"><h2 class="SubInfoDescription">Additional Information</h2></tr>';
			var adlen = adgroups.length;
			for(var j = 0;j < adlen;j++){
				var Obj = adgroups[j];
				//alert(Obj.ID+"="+thisID+","+Obj.name+"="+shplinkL[0]);
				//if (Obj.ID == thisID && (Obj.name == layObj.name)){
				//if (Obj.name == layObj.name){
				if (Obj.name == shplinkL[0]){
					var adheader = Obj.header;
					var adheaderType = Obj.headerType;
					var adheaderGroup = Obj.headerGroup;
					var advalues = Obj.values;
					var ArrList = new Array();
					var ArrTab = new Array();
					var ArrSort = new Array();
					for (var k=0;k < adheaderGroup.length;k++){
						if (adheaderGroup[k] == 'None'){
							var Obj = {"index":k,"group":adheaderGroup[k],"header":adheader[k],"type":adheaderType[k],"values":advalues[k]};
							ArrList.push(Obj);
						}
						else {
							if (ArrTab.length == 0){
								var arrVal = new Array(advalues[k]);
								var arrHeader = new Array(adheader[k]);
								var arrHeaderType = new Array(adheaderType[k]);
								var ObjGroup = {"index":k,"group":adheaderGroup[k],"headers":arrHeader,"types":arrHeaderType,"values":arrVal};
								ArrTab.push(ObjGroup);
							}
							
							else{
								var flagexists = false;
								for (var l=0;l< ArrTab.length;l++){
									if (ArrTab[l].group == adheaderGroup[k]){
										flagexists = true;
										ArrTab[l].values.push(advalues[k]);
										ArrTab[l].headers.push(adheader[k]);
										ArrTab[l].types.push(adheaderType[k]);
										break;
									}
								}
								
								if (!flagexists){
									var arrVal = new Array(advalues[k]);
									var arrHeader = new Array(adheader[k]);
									var arrHeaderType = new Array(adheaderType[k]);
									var ObjGroup = {"index":k,"group":adheaderGroup[k],"headers":arrHeader,"types":arrHeaderType,"values":arrVal};
									ArrTab.push(ObjGroup);
								}
								
							}
							
						}
					}
					for (var k=0;k < adheaderGroup.length;k++){
						var keyExists = false;
						for(var l=0;l< ArrList.length;l++){
							if (ArrList[l].index == k){
								ArrSort.push(ArrList[l]);
								keyExists = true;break;
							}
						}
						if (!keyExists){
							for(l=0;l<ArrTab.length;l++){
								if (ArrTab[l].index == k ){
									ArrSort.push(ArrTab[l]);
									break;
								}
							}
						}
					}
					
					// Render Per Type Information ###########################
					for(var k=0;k < ArrSort.length;k++){
						var classStr = ((k % 2) == 0)?'class="cellExplained-Dark"':'class="cellExplained"';
						rhtml += '<tr>';
						if (ArrSort[k].group != 'None')
							rhtml += '<td colspan="2"><br/></td></tr> \
									  <tr><td class="cellInfo" nowrap=\"true\" colspan="2" style="text-align:center">'+ArrSort[k].group+'</td></tr><tr><td '+classStr+' colspan="2">';
						else{
							switch(ArrSort[k].type){
								case "images": str = '<tr><td class="cellInfo" colspan="2" style="padding:5px;text-align:center" nowrap=\"true\" width=\"100\" >';break;
								default:str = '<tr><td class="cellInfo" nowrap=\"true\" width=\"20%\" >'+ArrSort[k].header+'</td><td '+classStr+' width=\"80%\">&nbsp;';break;
							}
							rhtml += str;
						}	
						//######## OPEN
						if(ArrSort[k].group == 'None'){
							switch(ArrSort[k].type){
								case "text": rhtml +=removeNullValue(ArrSort[k].values);break;
								case "images": rhtml += handlePrintOutListImages(ArrSort[k].values);break;
								case "list": rhtml += handlePrintOutList(ArrSort[k].values);break;
								case "explain": rhtml += handlePrintOutExplain(ArrSort[k].values);break;
								case "table": rhtml += printOutContentTable(ArrSort[k].values,"left");break;
								case "ntable": rhtml += printOutContentNormalTable(ArrSort[k].values,"left");break;
								default:break;
							}
						}
						else{
							//alert(ArrSort[k].values +'- '+ArrSort[k].headers);
							rhtml += handlePrintOutGroup(ArrSort[k].group,ArrSort[k].values,ArrSort[k].headers,ArrSort[k].types);
						}						
						//######## CLOSE
						rhtml += '&nbsp;</td></tr>';
					}
					// end #########################################
					
					
				}	
			}
			
			rhtml += '</table>';
		}

		rhtml += '</div>';
    }
	//alert(rhtml);
	srhtml = rhtml;
	rfhtml += rhtml;
	rfhtml += '<input id="rhtml" name="rhtml" type="hidden" value="'+escape(rhtml)+'">';	
	rfhtml += '</form>';
    return rfhtml;
}


function handlePrintOutList(listObj){
	if (listObj){
		try {
			var list = listObj.list;
			var listType = listObj.listType; 
			var rhtml = '<div>';
			switch(listType){
				case "ListLineComma":rhtml +='<ul style="margin:0px;padding-left:1px;">';break;
				case "ListNormal":rhtml +='<ul>';break;
				default:rhtml +='<ul>';break;
			}
			for (var l=0;l<list.length;l++){
				switch(listType){
					case "ListLineComma": {
						rhtml +='<li style="display:inline">'+list[l];
						if (l < list.length - 1)
							rhtml +=', ';
						rhtml += '</li>';
					}break;
					case "ListNormal":rhtml +='<li>'+list[l]+'</li>';break;
					default:rhtml +='<li>'+list[l]+'</li>';break;
				}
			}
			rhtml += '</ul></div>';	
			return rhtml;
		}
		catch(e){
			return "";	
		}
	}
	else
		return "";
}


function handlePrintOutListImages(listObj){
	
	if (listObj.images != null){
		var imagelist = listObj.images;
		var rhtml = '<div align="center" style="text-align:center">';
		if (imagelist.length > 0){
			for (var l=0;l<imagelist.length;l++){
				//rhtml +='<td class="cellExplained" ><img src="'+imagelist[l]+'"/></td>';
				rhtml +='<table width="100%">'; 
				var rowImage = imagelist[l];
				if (rowImage.length > 0){
					rhtml += '<tr>';
					for (var j=0;j<rowImage.length;j++){
						if (typeof rowImage[j] != "undefined" || rowImage[j].pathurl != "")
							rhtml += '<td class="cellExplained" ><img src="'+rowImage[j].pathurl+'"  width="'+rowImage[j].width+'" height="'+rowImage[j].height+'" alt="Empty"/></td>';
						else
							rhtml += '<td class="cellExplained" ><img src="images/blank.gif"  width="100" height="100" /></td>';
					}
					rhtml += '</tr>';
				}
				rhtml += '</table>';
			}
		}
		rhtml += '</div>';	
		return rhtml;
	}
	else
		return "";
}

function handlePrintOutExplain(explain){
	if (explain){
		var rhtml = '<div><table>';
		for (var l=0;l<explain.length;l++){
			rhtml += '<tr><td class="cellTableRowDescription">'+explain[l][0]+'</td><td class="cellExplained">'+explain[l][1]+'</td></tr>';
		}
		rhtml += '</table></div>'
		
		return rhtml;
	}
}

function handlePrintOutGroup(group,list,headers,types){
	//alert(list.length);
	if (list){
		var rhtml = '<div id="MIPRTabArea">\
					 <div id="MIPRTab">\
					 <div id="MIPRTabHeader"> \
					 <ul>';
		
		for (var l=0;l<list.length;l++){
			if (l == 0)
				rhtml += '<li><a href="javascript://" onclick="changeTab(\''+(parseInt(l)+1)+'\',\''+list.length+'\',\
						 \'tab'+group+'\',\'item'+group+'\',\'current\');">\
					     <span class="current" id="item'+group+(parseInt(l)+1)+'">'+headers[l]+'</span></a></li>';	
			else
				rhtml += '<li><a href="javascript://" onclick="changeTab(\''+(parseInt(l)+1)+'\',\''+list.length+'\',\
						 \'tab'+group+'\',\'item'+group+'\',\'current\');">\
					     <span id="item'+group+(parseInt(l)+1)+'">'+headers[l]+'</span></a></li>';	
		}
		
		rhtml +='</ul></div>';	
		
				
		for(var l=0;l<list.length;l++){
			if (l == 0)
				rhtml += '<div id=\'tab'+group+(parseInt(l)+1)+'\' class=\'MIPRTabContent\'>';
			else
				rhtml += '<div id=\'tab'+group+(parseInt(l)+1)+'\' class=\'MIPRTabContent\' style=\'display:none;visibility:hidden\'>';			


			if ( list[l] != null)
				rhtml += '<div><h3 class="SubInfoDescription">'+list[l].title+'</h3></div>';
			
			var str = "";
			//var calmodel = list[l].typecal;
			if (types[l] != null){
				switch(types[l]){
					case "calender": str += printOutContentCalender(list[l]);break;
					case "table": str += printOutContentTable(list[l],"center");break;
					case "explain": str += handlePrintOutExplain(list[l]);break;
					case "none": str +="none";break;
					default:break;
				}
			}
			
			rhtml += str;
			rhtml += '</div>';
		}
		
		rhtml += '</div></div>';
		return rhtml;				
	}
	else
		return "";
}

function printOutContentTable(tableObj,align){
	var str = '<div align="'+align+'"><table>';
	var header = tableObj.headerTable;
	str += '<tr>';
	
	for(var head=0;head < header.length;head++){
		str += '<th class="cellCalenderHeader">'+header[head]+'</th>';
	}
	str += '</tr>';
	var visitor = tableObj.visitor;
	for(var l=0;l< visitor.length;l++){
		str += '<tr><td class="cellTableRowDescription">'+visitor[l][0]+'</td>';
		str += '<td class="cellExplained">'+visitor[l][1]+'</td></tr>';
	}
	str += '</table>';
	//if (tableObj.pathimg != '')
		//str += '<table><tr><td><img src=\"'+tableObj.pathimg+'\" alt=\"image\"></td></tr></table>';
	str += '</div>'	
	return str;
}

function printOutContentNormalTable(tableObj,align){
	var str = '<div align="'+align+'"><table>';
	var header = tableObj.headerTable;
	var disableHeaderRow = tableObj.disableHeaderRow;
	str += '<tr>';
	
	for(var head=0;head < header.length;head++){
		str += '<th class="cellCalenderHeader">'+header[head]+'</th>';
	}
	str += '</tr>';
	var visitor = tableObj.visitor;
	for(var l=0;l< visitor.length;l++){
		var row = visitor[l];
		str += '<tr>';
		for (m=0;m<row.length;m++){
			if (m == 0 && disableHeaderRow == "no")
				str += '<td class="cellTableRowDescription">'+visitor[l][m]+'</td>';
			else{
				//var value = visitor[l][m];
				//if (value == null || value == "null" || typeof value == "undefined") value = ""; 
				str += '<td class="cellExplained">'+removeNullValue(visitor[l][m])+'</td>';
			}	
		}
		str += '</tr>';
	}
	str += '</table>';
	//if (tableObj.pathimg != '')
		//str += '<table><tr><td><img src=\"'+tableObj.pathimg+'\"></td></tr></table>';
	str += '</div>'	
	return str;
}

function printOutContentCalender(calenderObj){
	var calmodel = calenderObj.typecal;
	var str ="";
	switch(calmodel){
		case "calmonth":{
			str += '<div align="center"><table>';
			str += '<tr><th class="cellCalenderHeader">sunday</th><th class="cellCalenderHeader">monday</th><th class="cellCalenderHeader">tuesday</th> \
					  <th class="cellCalenderHeader">wednesday</th><th class="cellCalenderHeader">thursday</th><th class="cellCalenderHeader">friday</th><th class="cellCalenderHeader">saturday</th></tr>';
			str += '<tr>';

			var offset =  parseInt(calenderObj.calender.offset);
			for (var m=1;m <= offset;m++){
				str +='<td class="cellCalender">&nbsp;</td>';		
			}

			var daysInMonth = parseInt(calenderObj.calender.daysInMonth);
			var rows = parseInt(calenderObj.calender.rows);
			
			for (var day=1;day <= daysInMonth;day++){
				if (((day + offset - 1) % 7) == 0 && day != 1){
					str +='</tr>\n\t<tr>';
					rows++;
				}
				
				str +='<td class="cellCalender">';
				str += '<table width="100%">';
				str += '<tr><td align="left" style="color:#CDCDCD">'+day+'</td></tr>';
				var visitor = calenderObj.visitor;
				var str2 = '<tr><td class="cellVisitor">0</td></tr>' 
				for(var m =0; m < visitor.length;m++){
					if (parseInt(visitor[m][0]) == day){
						str2 = '<tr><td class="cellVisitor" width="100%" style="display:block">'+visitor[m][1]+'</td></tr>';
						break;
					}	
				}
				str += str2;
				str += '</table>';
				str +='</td>';
			}

			while((day + offset) <= rows * 7){
				str += '<td class="cellCalender">&nbsp;</td>';
				day++;
			}					
			
			str += '</tr>';
			str += '</table>';
			if (calenderObj.pathimg != '')
				str += '<table><tr><td><img src=\"'+calenderObj.pathimg+'\"></td></tr></table>';
			str += '</div>'
				
		}break;
		case "calweek":{
			str += '<div align="center"><table>';
			var week = calenderObj.calender.week;
			var endWeek = parseInt(week[1]) - parseInt(week[0]);
			str += '<tr>';
			for (var l=1;l <= endWeek;l++){
				str += '<th class="cellCalenderHeader"> week '+l+'/'+(parseInt(week[0])+l)+'</th>';
			}
			str += '</tr><tr>';
			var visitor = calenderObj.visitor;
			for (var m=1;m <= endWeek;m++){
				var str2 = '<td class="cellVisitor">0</td>';
				for(var n=0;n< visitor.length;n++){
					if (parseInt(visitor[n][0]) == (parseInt(week[0]) + m)){
						var str2 = '<td class="cellVisitor">'+visitor[n][1]+'</td>';
						break;
					}
				}
				str += str2;		
			}								
			str += '</tr></table>';
			if (calenderObj.pathimg != '')
				str += '<table><tr><td><img src=\"'+calenderObj.pathimg+'\"></td></tr></table>';
			str += '</div>'			
			//alert(str);	
		}break;
		case "calyear":{
			str += '<div align="center"><table>';
			str += '<tr><th class="cellCalenderHeader">jan</th><th class="cellCalenderHeader">feb</th><th class="cellCalenderHeader">mar</th> \
					  <th class="cellCalenderHeader">apr</th><th class="cellCalenderHeader">may</th><th class="cellCalenderHeader">jun</th> \
					  <th class="cellCalenderHeader">jul</th><th class="cellCalenderHeader">aug</th><th class="cellCalenderHeader">sep</th> \
					  <th class="cellCalenderHeader">oct</th><th class="cellCalenderHeader">nov</th><th class="cellCalenderHeader">dec</th></tr>';
			str += '<tr>';
			var visitor = calenderObj.visitor;
			for (var n=1;n <= 12;n++){
				var str2 = '<td class="cellVisitor">0</td>';
					
				for (var p=0;p < visitor.length;p++){
					if (parseInt(visitor[p][0]) == n){
						str2 = '<td class="cellVisitor">'+visitor[p][1]+'</td>';
						break;
					}
				}
				
				str += str2;
			}
			str += '</tr>';
			str += '</table>';
			if (calenderObj.pathimg != '')
				str += '<table><tr><td><img src=\"'+calenderObj.pathimg+'\"></td></tr></table>';
			str += '</div>';
		}break;
		case "calgroupyear":{
			str += '<div align="center"><table>';
			str += '<tr>';
			
			var year = calenderObj.year;
			var val = parseInt(year[1]) - parseInt(year[0]);
			for(var p=0;p<=val;p++){
				str +='<th class="cellCalenderHeader">'+(parseInt(year[0])+p)+'</th>';
			}
			str += '</tr><tr>'
			
			var visitor = calenderObj.visitor;
			for (var p=0;p <=val;p++){
				var str2 = '<td class="cellVisitor">0</td>';
				
				for (var q=0;q < visitor.length;q++){
					if (parseInt(parseInt(visitor[q][0])) == (parseInt(year[0])+p)){
						str2 = '<td class="cellVisitor">'+visitor[q][1]+'</td>';
						break;
					}
				}
				
				str += str2;
			}
			
			str += '</tr>';
			str += '</table>';
			if (calenderObj.pathimg != '')
				str += '<table><tr><td><img src=\"'+calenderObj.pathimg+'\"></td></tr></table>';
			str += '</div>';			
		}break;

		default:break;
	}
	return str;
}

function removeNullValue(value){
	if (value == null || value == "null" || typeof value == "undefined") value = "";
	return value;
}

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

    // Nothing found with query, return only header 
    if (jsonstr == 0) {
        rhtml += '<span class=\"noInfo\">'+ localeList['noRecords'] +'</span>';
        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 += '<span class="boundInfoDescription">' + layObj.description + '</span>';
        rhtml += '<div class="boundInfo"><table class="tableInfo" width="100%">';
        
        //  Header line 
      
		var hL = layObj.header;
		if (hL[0] == '@') {
            var withShpLink = true;
        } else {
            var withShpLink = false;
        }
        
        //var hLlen = hL.length;
        //rhtml += '<tr>';
        var startcol = withShpLink ? 0 : 1;
		
		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><td colspan=\"2\"><h2 class="SubInfoDescription">Common Information</h2></tr>';
            
            for (var ri=startcol; ri<rowLlen; ri++) {
                // Write out shape link for zoom
				var classStr = ((ri % 2) == 0)?'class="cellExplained-Dark"':'class="cellExplained"';
				rhtml += '<tr>';
				if (hL[ri] != '@' && hL[ri] != 'ID')
					rhtml += '<td class="cellInfo" nowrap=\"true\" width=\"100\">' + hL[ri] + '</td>';
                
				if (withShpLink && ri < 1)
                    var shplinkL = rowL[ri].shplink;
                else {
                    // Check for Hyperlinks
					if (hL[ri] == 'ID') var thisID = rowL[ri];
					else{
	                    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 '+classStr+' >' + rowL[ri] + '</td>';
	                    }
					}
                }
				
				//rhtml += '<tr><td colspan="2">tes</td></tr>';
            }
			
            rhtml += '<tr><td>&nbsp;</td><td class="cellSpecial"><a href="javascript:' + (infoWin == 'frame' ? '' : 'opener.') + 'zoom2extent(\'' + shplinkL[0] + '\', \'' + shplinkL[1] + '\', \'' + shplinkL[2] + '\')">';
            rhtml += 'Go To This Location and Zoom</a></td></tr>';
			
            rhtml += '<tr><td colspan="2"><a href=""></a></td></tr>';
        }
		

        rhtml += '</table>';
		

		var adgroups = adjsonstr;
		
		if (adgroups.length != 0){
			rhtml += '<table class="tableInfo" width="100%">';
			rhtml += '<tr><td colspan=\"2\"><h2 class="SubInfoDescription">Additional Information</h2></tr>';
			var adlen = adgroups.length;
			for(var j = 0;j < adlen;j++){
				var Obj = adgroups[j];
				if (Obj.ID == thisID && (Obj.name == layObj.name)){
					adheader = Obj.header;
					adheaderType = Obj.headerType;
					adheaderGroup = Obj.headerGroup;
					advalues = Obj.values;
					for (var k = 0; k < adheader.length;k++){
						var classStr = ((k % 2) == 0)?'class="cellExplained-Dark"':'class="cellExplained"';
						rhtml += '<tr>';
						if (adheaderType[k] == 'calender' || adheaderType[k] == 'table'){
							if (adheaderGroup[k] != 'none')
								rhtml += '<tr><td colspan="2"><br/></td></tr><tr><td class="cellInfo" nowrap=\"true\" colspan="2" style="text-align:center">'+adheaderGroup[k]+'</td></tr></tr>';
						}
						else
							rhtml += '<td class="cellInfo" nowrap=\"true\" width=\"100\" >'+adheader[k]+'</td>';	
						
						// CASE OF PROCESSING DATA 
						if (adheaderType[k] == 'text')
							rhtml += '<td '+classStr+' >'+advalues[k];
						
						else if (adheaderType[k] == 'list'){
							rhtml += '<td '+classStr+' ><div><ul>';
							var list = advalues[k];
							for (var l=0;l<list.length;l++){
								rhtml +='<li>'+list[l]+'</li>';
							}
							rhtml += '</ul></div>';
						}
						
						else if (adheaderType[k] == 'table'){
							rhtml += '<tr><td '+classStr+' colspan="2" style="text-align:center">';
							var tableObj = advalues[k];
							rhtml += '<div><h3 class="SubInfoDescription">'+tableObj.title+'</h3></div>';
							rhtml += '<div align="center"><table>';
							var header = tableObj.headerTable;
							rhtml += '<tr>';
							
							for(var head=0;head < header.length;head++){
								rhtml += '<th class="cellCalenderHeader">'+header[head]+'</th>';
							}
							rhtml += '</tr>';
							var visitor = tableObj.visitor;
							for(var l=0;l< visitor.length;l++){
								rhtml += '<tr><td class="cellTableRowDescription">'+visitor[l][0]+'</td>';
								rhtml += '<td class="cellExplained">'+visitor[l][1]+' visitor </td></tr>';
							}
							rhtml += '</table></div>';
						}
						
						else if (adheaderType[k] == 'calender'){
							
							rhtml += '<td '+classStr+' colspan="2" style="text-align:center">';
							var calenderObj = advalues[k];
							var calenderModel = calenderObj.typecal;
							rhtml += '<div><h3 class="SubInfoDescription">'+calenderObj.title+'</h3></div>';
							
							if (calenderModel == 'calmonth'){
								rhtml += '<div align="center"><table>';
								rhtml += '<tr><th class="cellCalenderHeader">sunday</th><th class="cellCalenderHeader">monday</th><th class="cellCalenderHeader">tuesday</th> \
										  <th class="cellCalenderHeader">wednesday</th><th class="cellCalenderHeader">thursday</th><th class="cellCalenderHeader">friday</th><th class="cellCalenderHeader">saturday</th></tr>';
								rhtml += '<tr>';
								var offset =  parseInt(calenderObj.calender.offset);
								for (var l=1;l <= offset;l++){
									rhtml +='<td class="cellCalender">&nbsp;</td>';		
								}
								
								var daysInMonth = parseInt(calenderObj.calender.daysInMonth);
								var rows = parseInt(calenderObj.calender.rows);
								
								for (var day=1;day <= daysInMonth;day++){
									if (((day + offset - 1) % 7) == 0 && day != 1){
										rhtml +='</tr>\n\t<tr>';
										rows++;
									}
									
									rhtml +='<td class="cellCalender">';
									rhtml += '<table width="100%">';
									rhtml += '<tr><td>'+day+'</td></tr>';
									var visitor = calenderObj.visitor;
									var str = '<tr><td class="cellVisitor" width="100%">0</td></tr>' 
									for(var m =0; m < visitor.length;m++){
										if (parseInt(visitor[m][0]) == day){
											str = '<tr><td class="cellVisitor" width="100%">'+visitor[m][1]+'</td></tr>';
											break;
										}	
									}
									rhtml += str;
									rhtml += '</table>';
									rhtml +='</td>';
								}
								
								while((day + offset) <= rows * 7){
									rhtml += '<td class="cellCalender">&nbsp;</td>';
									day++;
								}
								rhtml += '</tr>';
								rhtml += '</table></div>';
							}
							
							else if (calenderModel =='calyear'){
								rhtml += '<div align="center"><table width="80%">';
								rhtml += '<tr><th class="cellCalenderHeader">jan</th><th class="cellCalenderHeader">feb</th><th class="cellCalenderHeader">mar</th> \
										  <th class="cellCalenderHeader">apr</th><th class="cellCalenderHeader">may</th><th class="cellCalenderHeader">jun</th> \
										  <th class="cellCalenderHeader">jul</th><th class="cellCalenderHeader">aug</th><th class="cellCalenderHeader">sep</th> \
										  <th class="cellCalenderHeader">oct</th><th class="cellCalenderHeader">nov</th><th class="cellCalenderHeader">dec</th></tr>';
								rhtml += '<tr>';
								var visitor = calenderObj.visitor;
								for (var n=1;n <= 12;n++){
									var str = '<td class="cellVisitor">0</td>';
										
									for (var p=0;p < visitor.length;p++){
										if (parseInt(visitor[p][0]) == n){
											str = '<td class="cellVisitor">'+visitor[p][1]+'</td>';
											break;
										}
									}
									
									rhtml += str;
								}
								rhtml += '</tr>';
								rhtml += '</table></div>';								
							}
							
							else if (calenderModel =='calweek'){
								rhtml += '<div align="center"><table width="80%">';
								var week = calenderObj.calender.week;
								var endWeek = parseInt(week[1]) - parseInt(week[0]);
								rhtml += '<tr>';
								for (var l=1;l <= endWeek;l++){
									rhtml += '<th class="cellCalenderHeader"> week '+l+'/'+(parseInt(week[0])+l)+'</th>';
								}
								rhtml += '</tr><tr>';
								var visitor = calenderObj.visitor;
								for (var m=1;m <= endWeek;m++){
									var str = '<td class="cellVisitor">0</td>';
									for(var n=0;n< visitor.length;n++){
										if (parseInt(visitor[n][0]) == (parseInt(week[0]) + m)){
											var str = '<td class="cellVisitor">'+visitor[n][1]+'</td>';
											break;
										}
									}
									rhtml += str;		
								}								
								rhtml += '</tr></table></div>';								
							}							
	
						}
						else
							rhtml += '<td '+classStr+' >&nbsp;';
							/*
							rhtml += '<div id="MIPRTabArea"><div id="MIPRTab"><div id="MIPRTabHeader"> \
										<ul> \
											<li><a href=""><span class="current">Tab 1</span></a></li> \
											<li><a href=""><span>Tab 2</span></a></li> \
											<li><a href=""><span>Tab 3</span></a></li> \
											<li><a href=""><span>Tab 4</span></a></li> \
										</ul> \
										</div> \
										<div id="MIPRTabContent"> \
										</div> \
										</div> \
										</div>';
							*/			
						// --		
						rhtml +='</td></tr>';
					}
				}	
			}
			
			rhtml += '</table>';
		}

		rhtml += '</div>';
    }
    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;
            //var withShpLink = true;
        }
        
        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 (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;
                    //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;
                        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;
}



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;
}




function parseJSON_IQuery_0(jsonstr) {
    
    var rhtml = '';

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


    // 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="iquery" border="0" cellspacing="0" cellpadding="0">';
        
        //*** Header line ***/
        var hL = layObj.header;
        if (hL[0] == '@') {
            var withShpLink = true;
        } else {
            var withShpLink = false;
        }
        
        var hLlen = hL.length;
        rhtml += '<tr>';
        var startcol = 1; //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

                // Check for Hyperlinks
                if (isObject(rowL[ri])) {
                    var hypLinkL = rowL[ri].hyperlink;
                    rhtml += '<td>' + hypLinkL[3] + '</td>';
                } else {
                    rhtml += '<td>' + rowL[ri] + '</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 showDtreeInfo() {
    var d = parseJSON_dtree(resultJSON, opener.infoWin);
    //alert(d);
    $('#queryresult').html(d);
    
}



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


