Commit a972231d2006fc4cffcf2fd12e99e1b06b70fb64

Authored by Edmar Moretti
1 parent 6ce78a46

$1

ferramentas/saiku/cartograma.php
... ... @@ -22,10 +22,14 @@ $opcoes = (array) json_decode($_POST["opcoes"],true);
22 22 $metadados = (array) json_decode($_POST["metadados"],true);
23 23 $nmetadados = count($metadados);
24 24 //pega o id da regiao (busca pelo posfixo geocod)
25   -$codigo_tipo_regiao = $metadados[0]["identificador"];
26   -$codigo_tipo_regiao = explode("].[",$codigo_tipo_regiao);
27   -$codigo_tipo_regiao = str_replace(array("codigo_tipo_regiao_","[","_geocod"),"",$codigo_tipo_regiao[0]);
28   -
  25 +$codigo_tipo_regiao = $metadados[0]["colName"];
  26 +$codigo_tipo_regiao = explode("#",$codigo_tipo_regiao);
  27 +$codigo_tipo_regiao = $codigo_tipo_regiao[1];
  28 +/*
  29 +echo "<pre>";
  30 +var_dump($metadados);
  31 +echo $codigo_tipo_regiao;exit;
  32 +*/
29 33 if(empty($codigo_tipo_regiao)){
30 34 echo "Nao foi possivel determinar o codigo da regiao ou localidade no sistema Metaestat";
31 35 exit;
... ... @@ -47,7 +51,7 @@ $srid = $meta[&quot;srid&quot;];
47 51 $colunastabela = $m->colunasTabela($meta["codigo_estat_conexao"],$meta["esquemadb"],$meta["tabela"],"geometry","!=");
48 52 $tipoLayer = "POLYGON";
49 53 //define a coluna geo correta
50   -if($opcoes["tipo"] == "raiosProporcionais" || $opcoes["tipo"] == "circulosProporcionais"){
  54 +if($opcoes["tipo"] == "mapaPizzas" || $opcoes["tipo"] == "mapaBarras" || $opcoes["tipo"] == "raiosProporcionais" || $opcoes["tipo"] == "circulosProporcionais"){
51 55 if($meta["colunacentroide"] != ""){
52 56 $colunageo = $meta["colunacentroide"];
53 57 $sqlColunaGeo = $meta["colunacentroide"];
... ... @@ -56,6 +60,9 @@ if($opcoes[&quot;tipo&quot;] == &quot;raiosProporcionais&quot; || $opcoes[&quot;tipo&quot;] == &quot;circulosPropor
56 60 $sqlColunaGeo = "st_centroid(".$meta["colunageo"].")";
57 61 }
58 62 $tipoLayer = "POINT";
  63 + if($opcoes["tipo"] == "mapaBarras" || $opcoes["tipo"] == "mapaPizzas"){
  64 + $tipoLayer = "CHART";
  65 + }
59 66 }
60 67 //var_dump($metadados);exit;
61 68 //constroi um sql que retorna os dados na forma de uma tabela inline
... ... @@ -115,19 +122,32 @@ $l[] = &#39; SAIKU &quot;&#39;.$opcoes[&quot;tipo&quot;].&#39;&quot;&#39;;
115 122 $l[] = ' TIP "'.$meta["colunanomeregiao"].','.implode(',',$nomesColunas).'"';
116 123 $l[] = ' METAESTAT_CODIGO_TIPO_REGIAO "'.$codigo_tipo_regiao.'"';
117 124 $l[] = ' END ';
118   -$l = implode("",$l);
  125 +
  126 +$l = implode(PHP_EOL,$l);
  127 +
119 128 if($opcoes["tipo"] == "raiosProporcionais"){
120   - $l .= implode(" ",raiosProporcionais(1,$nomesColunas[1]));
  129 + $l .= implode(PHP_EOL,raiosProporcionais(1,$nomesColunas[1]));
121 130 }
122 131 if($opcoes["tipo"] == "circulosProporcionais"){
123 132 $l .= ' OPACITY 50';
124   - $l .= implode(" ",circulosProporcionais(1,$nomesColunas[1]));
  133 + $l .= implode(PHP_EOL,circulosProporcionais(1,$nomesColunas[1]));
125 134 }
126 135 if($opcoes["tipo"] == "coresChapadas"){
127 136 $l .= ' OPACITY 50';
128   - $l .= implode(" ",coresChapadas(1,$nomesColunas[1]));
  137 + $l .= implode(PHP_EOL,coresChapadas(1,$nomesColunas[1]));
  138 +}
  139 +if($opcoes["tipo"] == "mapaBarras"){
  140 + $l .= PHP_EOL.' PROCESSING "CHART_SIZE='.$opcoes["size"].' '.$opcoes["size"].'"';
  141 + $l .= PHP_EOL.' PROCESSING "CHART_TYPE=bar"';
  142 + $l .= implode(PHP_EOL,mapaBarras($nomesColunas));
129 143 }
130   -$l .= 'END';
  144 +if($opcoes["tipo"] == "mapaPizzas"){
  145 + $l .= PHP_EOL.' PROCESSING "CHART_SIZE='.$opcoes["size"].' '.$opcoes["size"].'"';
  146 + $l .= PHP_EOL.' PROCESSING "CHART_TYPE=pie"';
  147 + $l .= implode(PHP_EOL,mapaBarras($nomesColunas));
  148 +}
  149 +$l .= PHP_EOL.'END';
  150 +
131 151 //echo $l;exit;
132 152 $layer->updateFromString($l);
133 153  
... ... @@ -146,6 +166,28 @@ if($opcoes[&quot;tipo&quot;] == &quot;coresChapadas&quot;){
146 166  
147 167 header("Location:".$opcoes["locaplic"]."/mashups/openlayers.php?temas=".$map_file."&DESLIGACACHE=sim&botoes=legenda,pan,zoombox,zoomtot,zoomin,zoomout,distancia,area,identifica&controles=navigation,layerswitcher,scaleline,mouseposition,overviewmap,keyboarddefaults&tiles=false&mapext=".$opcoes["mapext"]);
148 168  
  169 +function mapaBarras($colunas){
  170 + global $opcoes;
  171 + //$opcoes["coreshex"] = array_reverse($opcoes["coreshex"]);
  172 + //$valores = retornaDadosColuna($coluna);
  173 + //$cortes = quartis($valores,$nomeColuna);
  174 + //var_dump($opcoes["coreshex"]);exit;
  175 + $nclasses = count($colunas);
  176 + $classes = array();
  177 + for($i=1;$i<$nclasses;$i++){
  178 + $classes[] = PHP_EOL.'CLASS';
  179 + $classes[] = ' NAME "'.$colunas[$i].'"';
  180 + $classes[] = ' STYLE';
  181 + $cor = $opcoes["outlinecolor"];
  182 + $classes[] = ' OUTLINECOLOR '.$cor["red"].' '.$cor["green"].' '.$cor["blue"];
  183 + $classes[] = ' SIZE ['.$colunas[$i].']';
  184 + $classes[] = ' COLOR '.$opcoes["cores"][$i-1];
  185 + $classes[] = ' END';
  186 + $classes[] = 'END ';
  187 + }
  188 + return $classes;
  189 +}
  190 +
149 191 function coresChapadas($coluna,$nomeColuna){
150 192 global $opcoes;
151 193 $valores = retornaDadosColuna($coluna);
... ... @@ -251,4 +293,21 @@ function retornaDadosColuna($coluna){
251 293 }
252 294 return $valores;
253 295 }
  296 +function cHexToDec ($hexStr, $returnAsString = true, $seperator = ' ') {
  297 + $hexStr = preg_replace("/[^0-9A-Fa-f]/", '', $hexStr); // Gets a proper hex string
  298 + $rgbArray = array();
  299 + if (strlen($hexStr) == 6) { //If a proper hex code, convert using bitwise operation. No overhead... faster
  300 + $colorVal = hexdec($hexStr);
  301 + $rgbArray['red'] = 0xFF & ($colorVal >> 0x10);
  302 + $rgbArray['green'] = 0xFF & ($colorVal >> 0x8);
  303 + $rgbArray['blue'] = 0xFF & $colorVal;
  304 + } elseif (strlen($hexStr) == 3) { //if shorthand notation, need some string manipulations
  305 + $rgbArray['red'] = hexdec(str_repeat(substr($hexStr, 0, 1), 2));
  306 + $rgbArray['green'] = hexdec(str_repeat(substr($hexStr, 1, 1), 2));
  307 + $rgbArray['blue'] = hexdec(str_repeat(substr($hexStr, 2, 1), 2));
  308 + } else {
  309 + return false; //Invalid hex color code
  310 + }
  311 + return $returnAsString ? implode($seperator, $rgbArray) : $rgbArray; // returns the rgb string or the associative array
  312 +}
254 313 ?>
... ...
ferramentas/saiku/esquemaxml.php
... ... @@ -87,8 +87,8 @@ for ($i=0;$i &lt; $c;++$i){
87 87 }
88 88 }
89 89 if($codigo_tipo_regiao == ""){
90   - echo "Nenhum tema com limites ou localidades foi encontrado";
91   - exit;
  90 + //echo "Nenhum tema com limites ou localidades foi encontrado";
  91 + //exit;
92 92 }
93 93 $regiao = "";
94 94 $item = "";
... ... @@ -158,7 +158,7 @@ foreach($regioes as $regiao){
158 158 nameColumn='j$i{$r["colunanomeregiao"]}' uniqueMembers='false'/>
159 159 ";
160 160 $niveis2[] = "
161   - <Level name='".converte($r["nome_tipo_regiao"])." - GeoCod'
  161 + <Level name='".converte($r["nome_tipo_regiao"])." - GeoCod #{$caminho[$i]}'
162 162 column='j$i{$r['identificador']}'
163 163 nameColumn='j$i{$r["identificador"]}' uniqueMembers='false'/>
164 164 ";
... ... @@ -169,7 +169,7 @@ foreach($regioes as $regiao){
169 169 nameColumn='nome' uniqueMembers='true' />
170 170 ";
171 171 $niveis2[] = "
172   - <Level name='".converte($regiao["nome_tipo_regiao"])." - GeoCod'
  172 + <Level name='".converte($regiao["nome_tipo_regiao"])." - GeoCod #{$regiao["codigo_tipo_regiao"]}'
173 173 column='codigo'
174 174 nameColumn='codigo' uniqueMembers='true' />
175 175 ";
... ... @@ -327,6 +327,9 @@ header(&quot;Location:&quot;.$saikuUrl.&quot;/?nomeConexao=&quot;.$nomeConexao.&quot;&amp;locaplic=&quot;.$_GET[&quot;l
327 327  
328 328 function converte($texto){
329 329 $texto = str_replace("&","&amp;",htmlentities($texto));
  330 + //$texto = htmlentities($texto);
  331 + //$texto = mb_convert_encoding($texto, 'UTF-8', mb_detect_encoding($texto));
  332 + //$texto = utf8_encode($texto);
330 333 return $texto;
331 334 }
332 335 ?>
... ...
ferramentas/saiku/saiku-server/tomcat/webapps/ROOT/index.html
... ... @@ -22,6 +22,7 @@
22 22  
23 23 <!-- jQuery CSS -->
24 24 <link rel="stylesheet" href="css/jquery/jquery-ui.css" type="text/css" media="all" />
  25 +<link rel="stylesheet" href="js/jquery/jquery.colourPicker.css" type="text/css" media="all" />
25 26  
26 27 <link rel="stylesheet" href="js/fancybox/jquery.fancybox-1.3.4.css" type="text/css" media="screen" />
27 28 <link rel="stylesheet" href="js/jquery/jquery.contextMenu.css" type="text/css" media="screen" />
... ... @@ -56,6 +57,7 @@
56 57  
57 58  
58 59 <script type="text/javascript" src="js/fancybox/jquery.fancybox-1.3.4.pack.js"></script>
  60 + <script type="text/javascript" src="js/jquery/jquery.colourPicker.js"></script>
59 61  
60 62  
61 63 <!-- Backbone.js and deps -->
... ... @@ -108,10 +110,6 @@
108 110  
109 111 <!-- Saiku plugins -->
110 112  
111   -
112   - <!--
113   - <script type="text/javascript" src="js/saiku/plugins/Chart/plugin.js" defer></script>
114   - -->
115 113 <script type="text/javascript" src="js/saiku/plugins/Statistics/plugin.js" defer></script>
116 114 <script type="text/javascript" src="js/saiku/plugins/I18n/plugin.js" defer></script>
117 115 <script type="text/javascript" src="js/saiku/plugins/BIServer/plugin.js" defer></script>
... ... @@ -125,28 +123,18 @@
125 123 <script type="text/javascript" src="js/saiku/plugins/CCC_Chart/jquery.tipsy.js"></script>
126 124 <script type="text/javascript" src="js/saiku/plugins/CCC_Chart/tipsy.js"></script>
127 125 <link type="text/css" href="js/saiku/plugins/CCC_Chart/tipsy.css" rel="stylesheet" />
128   - <!-- FUTURE FILES FOR CHART EDITOR
129   - <script type="text/javascript" src="js/saiku/plugins/CCC_Chart/cccProperties.js"></script>
130   - <script type="text/javascript" src="js/saiku/plugins/CCC_Chart/cccCharts.js"></script>
131   - <script type="text/javascript" src="js/saiku/plugins/CCC_Chart/ChartEditor.js"></script>
132   - -->
133 126 <script type="text/javascript" src="js/saiku/plugins/CCC_Chart/plugin.js"></script>
134 127  
135 128 <script type="text/javascript" src="js/ace/ace.js" charset="utf-8"></script>
136 129  
137   - <!--start js SaikuChartPlus-->
138   - <script type="text/javascript" src="js/saiku/plugins/SaikuChartPlus/plugin.js" defer></script>
139   - <!--<script type="text/javascript" src="https://www.google.com/jsapi"></script>
140   -<script type="text/javascript">
141   - google.load('visualization', '1.0', {'packages':['geochart','geomap']});
142   -</script>
143   --->
144   - <!--end js SaikuChartPlus-->
  130 + <!--start js i3GeoMap-->
  131 + <script type="text/javascript" src="js/saiku/plugins/i3GeoMap/plugin.js" ></script>
  132 + <!--end js i3GeoMap-->
145 133  
146 134 <!-- i3GEO obtem o parametro passado pela url e que contem o codigo da conexao que deve ser utilizada -->
147 135 <script>
148   -nomeConexao = window.location.search.replace("?","");
149   -</script>
  136 + nomeConexao = parametroUrl("nomeConexao");
  137 + </script>
150 138 <!-- Templates -->
151 139 <script type="text/x-jquery-tmpl" id="template-toolbar">
152 140 <ul>
... ...
ferramentas/saiku/saiku-server/tomcat/webapps/ROOT/js/saiku/plugins/CCC_Chart/plugin.js 0 → 100755
... ... @@ -0,0 +1,705 @@
  1 +/*
  2 + * Copyright 2012 OSBI Ltd
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +
  17 +/**
  18 + * Renders a chart for each workspace
  19 + */
  20 +var Chart = Backbone.View.extend({
  21 +
  22 + events: {
  23 + 'click .keep' : 'keepVisible'
  24 + },
  25 +
  26 + cccOptions: {
  27 + type: "BarChart",
  28 + stacked: true
  29 + },
  30 +
  31 + data: null,
  32 + hasProcessed: null,
  33 +
  34 + getChartProperties: function(chartName) {
  35 + var self = this;
  36 + var ret = [];
  37 + _.each(ChartProperties, function(property) {
  38 + if (property.ChartObject == chartName) {
  39 + ret.push(property);
  40 + }
  41 +
  42 + });
  43 + return ret;
  44 +
  45 + },
  46 +
  47 + initialize: function(args) {
  48 +
  49 + this.workspace = args.workspace;
  50 +
  51 + // Create a unique ID for use as the CSS selector
  52 + this.id = _.uniqueId("chart_");
  53 + $(this.el).attr({ id: this.id });
  54 + //$('<div id="nav_' + this.id + '">' + "<input type='submit' class='keep' value='keep only selected' />" + '</div>').appendTo($(this.el));
  55 + $('<div class="canvas_wrapper" style="display:none;"><div id="canvas_' + this.id + '"></div></div>').appendTo($(this.el));
  56 +
  57 + this.cccOptions.canvas = 'canvas_' + this.id;
  58 + this.cccOptions = this.getQuickOptions(this.cccOptions);
  59 +
  60 + this.data = null;
  61 +
  62 + // Bind table rendering to query result event
  63 + _.bindAll(this, "receive_data", "process_data", "show", "getData", "render_view", "render_chart", "render_chart_delayed", "getQuickOptions","exportChart","block_ui");
  64 + var self = this;
  65 + this.workspace.bind('query:run', function() {
  66 + if (! $(self.workspace.querytoolbar.el).find('.render_chart').hasClass('on')) {
  67 + return false;
  68 + }
  69 + self.data = {};
  70 + self.data.resultset = [];
  71 + self.data.metadata = [];
  72 + $(self.el).find('.canvas_wrapper').hide();
  73 + return false;
  74 + });
  75 +
  76 + this.workspace.bind('query:fetch', this.block_ui);
  77 +
  78 + this.workspace.bind('query:result', this.receive_data);
  79 +
  80 + var pseudoForm = "<div id='nav" + this.id + "' style='display:none' class='nav'><form id='svgChartPseudoForm' target='_blank' method='POST'>" +
  81 + "<input type='hidden' name='type' class='type'/>" +
  82 + "<input type='hidden' name='svg' class='svg'/>" +
  83 + "</form></div>";
  84 + if (isIE) {
  85 + pseudoForm = "<div></div>";
  86 + }
  87 + this.nav =$(pseudoForm);
  88 +
  89 + $(this.el).append(this.nav);
  90 +
  91 + /*
  92 + // Create navigation
  93 + var exportoptions = "<div><a class='hide' href='#charteditor' id='acharteditor' /><!--<a class='editor' href='#chart_editor'>Advanced Properties</a>-->Export to: " +
  94 + "<a class='export' href='#png' class='i18n'>PNG</a>, " +
  95 + "<a class='export' href='#pdf' class='i18n'>PDF</a>, " +
  96 + //"<a class='export' href='#tiff' class='i18n'>TIFF</a>, " +
  97 + "<a class='export' href='#svg' class='i18n'>SVG</a>, " +
  98 + "<a class='export' href='#jpg' class='i18n'>JPG</a>" +
  99 + "<form id='svgChartPseudoForm' target='_blank' method='POST'>" +
  100 + "<input type='hidden' name='type' class='type'/>" +
  101 + "<input type='hidden' name='svg' class='svg'/>" +
  102 + "</form>";
  103 +
  104 + var chartnav = exportoptions + "</div>";
  105 + if (typeof isIE !== "undefined") {
  106 + chartnav = "<div></div>";
  107 + }
  108 + // Create navigation
  109 + this.nav = $(chartnav).css({
  110 + 'padding-bottom': '10px'
  111 + });
  112 + this.nav.find('a.type').css({
  113 + color: '#666',
  114 + 'margin-right': '5px',
  115 + 'text-decoration': 'none',
  116 + 'border': '1px solid #ccc',
  117 + padding: '5px'
  118 + });
  119 +
  120 + this.nav.find('a.export').click(this.exportChart);
  121 +
  122 +
  123 + this.nav.find('a').css({
  124 + color: '#666',
  125 + 'margin-right': '5px',
  126 + 'text-decoration': 'none',
  127 + 'border': '1px solid #ccc',
  128 + padding: '5px'
  129 + });
  130 + */
  131 + /* XXX - enable again later
  132 + $(this.nav).append('<div style="display:none;"> <div id="charteditor" class="chart_editor"></div></div>');
  133 +
  134 + this.editor = new ChartEditor({ workspace : this.workspace,
  135 + ChartProperties : ChartProperties,
  136 + ChartTypes: ChartTypes,
  137 + data : this.getData,
  138 + getChartProperties : this.getChartProperties});
  139 +
  140 + $(this.nav).find('.chart_editor').append($(this.editor.el));
  141 + */
  142 +
  143 + },
  144 +
  145 +
  146 + block_ui: function() {
  147 + if (! $(this.workspace.querytoolbar.el).find('.render_chart').hasClass('on')) {
  148 + return;
  149 + }
  150 + //Saiku.ui.block("Updating chart data....");
  151 + },
  152 +
  153 + exportChart: function(type) {
  154 + var svgContent = new XMLSerializer().serializeToString($('svg')[0]);
  155 + var rep = '<svg xmlns="http://www.w3.org/2000/svg" ';
  156 + if (svgContent.substr(0,rep.length) != rep) {
  157 + svgContent = svgContent.replace('<svg ', rep);
  158 + }
  159 +
  160 + var form = $('#svgChartPseudoForm');
  161 + form.find('.type').val(type);
  162 + form.find('.svg').val(svgContent);
  163 + form.attr('action', Settings.REST_URL + this.workspace.query.url() + escape("/../../export/saiku/chart"));
  164 + form.submit();
  165 + return false;
  166 + },
  167 +
  168 + render_view: function() {
  169 + // Append chart to workspace
  170 + $(this.workspace.el).find('.workspace_results')
  171 + .prepend($(this.el).hide());
  172 + },
  173 +
  174 + getData: function() {
  175 + return this.data;
  176 + },
  177 +
  178 + show: function(event, ui) {
  179 + /*
  180 + if ('MODE' in Settings && Settings.MODE == 'table') {
  181 + $(this.nav).hide();
  182 + } else {
  183 + $(this.nav).show();
  184 + }
  185 +
  186 + $('a#acharteditor').fancybox(
  187 + {
  188 + 'autoDimensions' : false,
  189 + 'autoScale' : false,
  190 + 'height' : ($("body").height() - 140),
  191 + 'width' : ($("body").width() - 100),
  192 + 'transitionIn' : 'none',
  193 + 'transitionOut' : 'none',
  194 + 'type' : 'inline'
  195 + }
  196 + );
  197 + */
  198 + if (this.cccOptions.width <= 0) {
  199 + this.cccOptions.width = $(this.workspace.el).find('.workspace_results').width() - 40;
  200 + }
  201 + if (this.cccOptions.height <= 0) {
  202 + this.cccOptions.height = $(this.workspace.el).find('.workspace_results').height() - 40;
  203 + }
  204 +
  205 + $(this.el).show();
  206 +
  207 + var hasRun = this.workspace.query.result.hasRun();
  208 + if (hasRun) {
  209 + this.process_data({ data: this.workspace.query.result.lastresult() });
  210 + }
  211 +
  212 + },
  213 +
  214 + chart_editor: function() {
  215 + $('a#acharteditor').click();
  216 + return true;
  217 + },
  218 +
  219 + export_button: function(event) {
  220 + var self = this;
  221 + $target = $(event.target).hasClass('button') ? $(event.target) : $(event.target).parent();
  222 +
  223 + var self = this;
  224 + $body = $(document);
  225 + //$body.off('.contextMenu .contextMenuAutoHide');
  226 + //$('.context-menu-list').remove();
  227 + $.contextMenu('destroy', '.export_button');
  228 + $.contextMenu({
  229 + selector: '.export_button',
  230 + trigger: 'left',
  231 + ignoreRightClick: true,
  232 + callback: function(key, options) {
  233 + self.workspace.chart.exportChart(key);
  234 + },
  235 + items: {
  236 + "png": {name: "PNG"},
  237 + "jpg": {name: "JPEG"},
  238 + "pdf": {name: "PDF"},
  239 + "svg": {name: "SVG"}
  240 + }
  241 + });
  242 + $target.contextMenu();
  243 + },
  244 +
  245 + button: function(event) {
  246 + $target = $(event.target).hasClass('button') ? $(event.target) : $(event.target).parent();
  247 + if ($target.hasClass('chartoption')) {
  248 + $target.parent().siblings().find('.chartoption.on').removeClass('on');
  249 + $target.addClass('on');
  250 + if ($(this.workspace.querytoolbar.el).find('.render_chart').hasClass('on')) {
  251 + $(this.el).find('.canvas_wrapper').hide();
  252 + }
  253 +
  254 +
  255 + }
  256 + return false;
  257 + },
  258 +
  259 + stackedBar: function() {
  260 + this.workspace.query.setProperty('saiku.ui.render.type', 'stackedBar');
  261 + var options = {
  262 + stacked: true,
  263 + type: "BarChart"
  264 + };
  265 + this.cccOptions = this.getQuickOptions(options);
  266 + this.render_chart();
  267 + },
  268 +
  269 + bar: function() {
  270 + this.workspace.query.setProperty('saiku.ui.render.type', 'bar');
  271 + var options = {
  272 + type: "BarChart"
  273 + };
  274 + this.cccOptions = this.getQuickOptions(options);
  275 + this.render_chart();
  276 + /*
  277 + this.cccOptions.multiChartIndexes = [1];
  278 + this.cccOptions.dataMeasuresInColumns = true;
  279 + this.cccOptions.orientation = 'vertical';
  280 + this.cccOptions.smallTitlePosition = 'left';
  281 + //this.cccOptions.multiChartColumnsMax = 5;
  282 + this.cccOptions.smallWidth = 300;
  283 + this.cccOptions.smallHeight = 100;
  284 + */
  285 + },
  286 +
  287 + multiplebar: function() {
  288 + this.workspace.query.setProperty('saiku.ui.render.type', 'multiplebar');
  289 + var options = {
  290 + type: "BarChart",
  291 + multiChartIndexes: [1],
  292 + dataMeasuresInColumns: true,
  293 + orientation: "vertical",
  294 + smallTitlePosition: "top",
  295 + multiChartMax: 30,
  296 + multiChartColumnsMax: Math.floor( this.cccOptions.width / 200),
  297 + smallWidth: 200,
  298 + smallHeight: 150
  299 +
  300 + };
  301 + this.cccOptions = this.getQuickOptions(options);
  302 + this.render_chart();
  303 + },
  304 +
  305 + line: function() {
  306 + this.workspace.query.setProperty('saiku.ui.render.type', 'line');
  307 + var options = {
  308 + type: "LineChart"
  309 + };
  310 +
  311 + this.cccOptions = this.getQuickOptions(options);
  312 + this.render_chart();
  313 + },
  314 +
  315 + pie: function() {
  316 + this.workspace.query.setProperty('saiku.ui.render.type', 'pie');
  317 + var options = {
  318 + type: "PieChart",
  319 + multiChartIndexes: [0] // ideally this would be chosen by the user (count, which)
  320 + };
  321 + this.cccOptions = this.getQuickOptions(options);
  322 + this.render_chart();
  323 + },
  324 +
  325 + heatgrid: function() {
  326 + this.workspace.query.setProperty('saiku.ui.render.type', 'heatgrid');
  327 + var options = {
  328 + type: "HeatGridChart"
  329 + };
  330 + this.cccOptions = this.getQuickOptions(options);
  331 + this.render_chart();
  332 + },
  333 +
  334 + stackedBar100: function() {
  335 + this.workspace.query.setProperty('saiku.ui.render.type', 'stackedBar100');
  336 + var options = {
  337 + type: "NormalizedBarChart"
  338 + };
  339 + this.cccOptions = this.getQuickOptions(options);
  340 + this.render_chart();
  341 + },
  342 +
  343 + area: function() {
  344 + this.workspace.query.setProperty('saiku.ui.render.type', 'area');
  345 + var options = {
  346 + type: "StackedAreaChart"
  347 + };
  348 + this.cccOptions = this.getQuickOptions(options);
  349 + this.render_chart();
  350 + },
  351 + dot: function() {
  352 + this.workspace.query.setProperty('saiku.ui.render.type', 'dot');
  353 + var options = {
  354 + type: "DotChart"
  355 + };
  356 + this.cccOptions = this.getQuickOptions(options);
  357 + this.render_chart();
  358 + },
  359 + waterfall: function() {
  360 + this.workspace.query.setProperty('saiku.ui.render.type', 'waterfall');
  361 + var options = {
  362 + type: "WaterfallChart"
  363 + };
  364 + this.cccOptions = this.getQuickOptions(options);
  365 + this.render_chart();
  366 + },
  367 +
  368 + keepVisible: function(event) {
  369 +
  370 +
  371 + var chart = this.chart.root;
  372 + var data = chart.data;
  373 +
  374 + data
  375 + .datums(null, {selected: false})
  376 + .each(function(datum) {
  377 + datum.setVisible(false);
  378 + });
  379 +
  380 + data.clearSelected();
  381 +
  382 + chart.render(true, true, false);
  383 +
  384 +
  385 + },
  386 +
  387 + // Default static style-sheet
  388 + cccOptionsDefault: {
  389 + Base: {
  390 + animate: false,
  391 + selectable: true,
  392 + valuesVisible: false,
  393 + legend: true,
  394 + legendPosition: "top",
  395 + legendAlign: "right",
  396 + legendSizeMax: "30%",
  397 + axisSizeMax: "40%",
  398 + plotFrameVisible : false,
  399 + orthoAxisMinorTicks : false,
  400 + colors: ["#1f77b4", "#aec7e8", "#ff7f0e", "#ffbb78", "#2ca02c", "#98df8a", "#d62728", "#ff9896", "#9467bd", "#c5b0d5", "#8c564b", "#c49c94", "#e377c2", "#f7b6d2", "#7f7f7f", "#c7c7c7", "#bcbd22", "#dbdb8d", "#17becf", "#9edae5" ]
  401 +/*
  402 +"#B12623",
  403 +"#ff8585",
  404 +"#009bff",
  405 +"#1f77b4",
  406 +"#ff5900",
  407 +"#ffbb9e",
  408 +"#750000",
  409 +"#cecece",
  410 +"#aec7e8", "#ff7f0e", "#ffbb78", "#2ca02c", "#98df8a", "#d62728", "#ff9896", "#9467bd", "#c5b0d5", "#8c564b", "#c49c94", "#e377c2", "#f7b6d2", "#7f7f7f", "#c7c7c7", "#bcbd22", "#dbdb8d", "#17becf", "#9edae5" ]
  411 + */
  412 + },
  413 +
  414 + HeatGridChart: {
  415 + orientation: "horizontal",
  416 + useShapes: true,
  417 + shape: "circle",
  418 + nullShape: "cross",
  419 + colorNormByCategory: false,
  420 + sizeRole: "value",
  421 + legend: false,
  422 + hoverable: true,
  423 + axisComposite: true,
  424 + colors: ["red", "yellow", "lightgreen", "darkgreen"],
  425 + xAxisSize: 130,
  426 + yAxisSize: 130
  427 + },
  428 +
  429 + WaterfallChart: {
  430 + orientation: "horizontal"
  431 + },
  432 +
  433 + PieChart: {
  434 + multiChartColumnsMax: 3,
  435 + multiChartMax: 30,
  436 + smallTitleFont: "bold 14px sans-serif",
  437 + valuesVisible: true,
  438 + valuesMask: "{value.percent}",
  439 + explodedSliceRadius: "10%",
  440 + extensionPoints: {
  441 + slice_innerRadiusEx: '40%',
  442 + slice_offsetRadius: function(scene) {
  443 + return scene.isSelected() ? '10%' : 0;
  444 + }
  445 + },
  446 + clickable: true
  447 + //valuesLabelStyle: 'inside'
  448 + },
  449 +
  450 + LineChart: {
  451 + extensionPoints: {
  452 + area_interpolate: "monotone", // cardinal
  453 + line_interpolate: "monotone"
  454 + }
  455 + },
  456 +
  457 + StackedAreaChart: {
  458 + extensionPoints: {
  459 + area_interpolate: "monotone",
  460 + line_interpolate: "monotone"
  461 + }
  462 + }
  463 + },
  464 +
  465 + getQuickOptions: function(baseOptions) {
  466 + var chartType = (baseOptions && baseOptions.type) || "BarChart";
  467 + var workspaceResults = $(this.workspace.el).find(".workspace_results");
  468 + var options = _.extend({
  469 + type: chartType,
  470 + canvas: 'canvas_' + this.id,
  471 + width: workspaceResults.width() - 40,
  472 + height: workspaceResults.height() - 40
  473 + },
  474 + this.cccOptionsDefault.Base,
  475 + this.cccOptionsDefault[chartType], // may be undefined
  476 + baseOptions);
  477 +
  478 + if(this.data != null && this.data.resultset.length > 5) {
  479 + if(options.type === "HeatGridChart") {
  480 + options.xAxisSize = 150;
  481 + } else if(options.orientation !== "horizontal") {
  482 + options.extensionPoints = _.extend(Object.create(options.extensionPoints || {}),
  483 + {
  484 + xAxisLabel_textAngle: -Math.PI/2,
  485 + xAxisLabel_textAlign: "right",
  486 + xAxisLabel_textBaseline: "middle"
  487 + });
  488 + }
  489 + }
  490 +
  491 + return options;
  492 + },
  493 +
  494 + render_chart: function() {
  495 + _.delay(this.render_chart_delayed, 0, this);
  496 + return false;
  497 + },
  498 +
  499 + render_chart_delayed: function() {
  500 + if (!$(this.workspace.querytoolbar.el).find('.render_chart').hasClass('on') || !this.hasProcessed) {
  501 + return;
  502 + }
  503 + $(this.workspace.toolbar.el).find('.i3GeoMap').removeClass('on');
  504 +/* DEBUGGING
  505 +this.med = new Date().getTime();
  506 +$(this.el).prepend(" | chart render (" + (this.med - this.call_time) + ")" );
  507 +this.call_time = undefined;
  508 +*/
  509 + var workspaceResults = $(this.workspace.el).find(".workspace_results");
  510 + var isSmall = (this.data != null && this.data.height < 80 && this.data.width < 80);
  511 + var isMedium = (this.data != null && this.data.height < 300 && this.data.width < 300);
  512 + var isBig = (!isSmall && !isMedium);
  513 + var animate = false;
  514 + var hoverable = isSmall;
  515 +
  516 + var runtimeChartDefinition = _.clone(this.cccOptions);
  517 + if (isBig) {
  518 + if (runtimeChartDefinition.hasOwnProperty('extensionPoints') && runtimeChartDefinition.extensionPoints.hasOwnProperty('line_interpolate'))
  519 + delete runtimeChartDefinition.extensionPoints.line_interpolate;
  520 + if (runtimeChartDefinition.hasOwnProperty('extensionPoints') && runtimeChartDefinition.extensionPoints.hasOwnProperty('area_interpolate'))
  521 + delete runtimeChartDefinition.extensionPoints.area_interpolate;
  522 + }
  523 + runtimeChartDefinition = _.extend(runtimeChartDefinition, {
  524 + width: workspaceResults.width() - 40,
  525 + height: workspaceResults.height() - 40,
  526 + hoverable: hoverable,
  527 + animate: animate
  528 + });
  529 +
  530 + /* XXX - enable later
  531 + var start = new Date().getTime();
  532 + this.editor.chartDefinition = _.clone(this.cccOptions);
  533 + this.editor.set_chart("pvc." + this.cccOptions.type);
  534 + this.editor.render_chart_properties("pvc." + this.cccOptions.type, this.editor.chartDefinition);
  535 + */
  536 +
  537 + this.chart = new pvc[runtimeChartDefinition.type](runtimeChartDefinition);
  538 +/* DEBUGGING
  539 +this.med3 = new Date().getTime();
  540 +$(this.el).prepend(" pvc (" + (this.med3 - this.med) + ")" );
  541 +*/
  542 +
  543 + this.chart.setData(this.data, {
  544 + crosstabMode: true,
  545 + seriesInRows: false
  546 + });
  547 +
  548 + try {
  549 + if (animate) {
  550 + $(this.el).find('.canvas_wrapper').show();
  551 + }
  552 + this.chart.render();
  553 +/* DEBUGGING
  554 + var med2 = new Date().getTime();
  555 + $(this.el).prepend(" done (" + (med2 - this.med) + ")" );
  556 +*/
  557 + } catch (e) {
  558 + $(this.el).text("Could not render chart");
  559 + }
  560 + this.workspace.processing.hide();
  561 + this.workspace.adjust();
  562 + if (animate) {
  563 + return false;
  564 + }
  565 + // $('#nav_' + this.id).show();
  566 + if (isIE || isBig) {
  567 + $(this.el).find('.canvas_wrapper').show();
  568 + } else {
  569 + $(this.el).find('.canvas_wrapper').fadeIn(400);
  570 + }
  571 + return false;
  572 + },
  573 +
  574 + receive_data: function(args) {
  575 + if (! $(this.workspace.querytoolbar.el).find('.render_chart').hasClass('on')) {
  576 + return;
  577 + }
  578 + return _.delay(this.process_data, 0, args);
  579 +
  580 + },
  581 +
  582 + process_data: function(args) {
  583 + this.data = {};
  584 + this.data.resultset = [];
  585 + this.data.metadata = [];
  586 + this.data.height = 0;
  587 + this.data.width = 0;
  588 +
  589 + if (typeof args == "undefined" || typeof args.data == "undefined" ||
  590 + ($(this.workspace.el).is(':visible') && !$(this.el).is(':visible'))) {
  591 + return;
  592 + }
  593 +
  594 + if (args.data != null && args.data.error != null) {
  595 + return this.workspace.error(args);
  596 + }
  597 + // Check to see if there is data
  598 + if (args.data == null || (args.data.cellset && args.data.cellset.length === 0)) {
  599 + return this.workspace.no_results(args);
  600 + }
  601 +
  602 + var cellset = args.data.cellset;
  603 + if (cellset && cellset.length > 0) {
  604 +/* DEBUGGING
  605 +var start = new Date().getTime();
  606 +this.call_time = start;
  607 +$(this.el).prepend(" | chart process");
  608 +*/
  609 + var lowest_level = 0;
  610 + var data_start = 0;
  611 + for (var row = 0; data_start == 0 && row < cellset.length; row++) {
  612 + this.data.metadata = [];
  613 + for (var field = 0; field < cellset[row].length; field++) {
  614 + var firstHeader = [];
  615 +
  616 + while (cellset[row][field].type == "COLUMN_HEADER" && cellset[row][field].value == "null") {
  617 + row++;
  618 + }
  619 + if (cellset[row][field].type == "ROW_HEADER_HEADER") {
  620 +
  621 + while(cellset[row][field].type == "ROW_HEADER_HEADER") {
  622 + firstHeader.push(cellset[row][field].value);
  623 + field++;
  624 + }
  625 +
  626 + this.data.metadata.push({
  627 + colIndex: 0,
  628 + colType: "String",
  629 + colName: firstHeader.join('/')
  630 + });
  631 + lowest_level = field - 1;
  632 + }
  633 + if (cellset[row][field].type == "COLUMN_HEADER" && cellset[row][field].value != "null") {
  634 + var lowest_col_header = 0;
  635 + var colheader = [];
  636 + while(lowest_col_header <= row) {
  637 + colheader.push(cellset[lowest_col_header][field].value);
  638 + lowest_col_header++;
  639 + }
  640 + this.data.metadata.push({
  641 + colIndex: field - lowest_level + 1,
  642 + colType: "Numeric",
  643 + colName: colheader.join('/')
  644 + });
  645 +
  646 + data_start = row+1;
  647 + }
  648 + }
  649 + }
  650 + var labelsSet = {};
  651 + for (var row = data_start; row < cellset.length; row++) {
  652 + if (cellset[row][0].value !== "") {
  653 + var record = [];
  654 + this.data.width = cellset[row].length - lowest_level + 1;
  655 + var label = "";
  656 + for (var labelCol = lowest_level; labelCol >= 0; labelCol--) {
  657 + var lastKnownUpperLevelRow = row;
  658 + while(cellset[lastKnownUpperLevelRow] && cellset[lastKnownUpperLevelRow][labelCol].value === 'null') {
  659 + --lastKnownUpperLevelRow;
  660 + }
  661 + if(cellset[lastKnownUpperLevelRow]) {
  662 + if (label == "") {
  663 + label = cellset[lastKnownUpperLevelRow][labelCol].value;
  664 + } else {
  665 + label = cellset[lastKnownUpperLevelRow][labelCol].value + " / " + label;
  666 + }
  667 + }
  668 + }
  669 + if(label in labelsSet) {
  670 + labelsSet[label] = labelsSet[label]+1;
  671 + label = label + ' [' + (labelsSet[label] + 1) + ']';
  672 + } else {
  673 + labelsSet[label] = 0;
  674 + }
  675 + record.push(label);
  676 +
  677 + for (var col = lowest_level + 1; col < cellset[row].length; col++) {
  678 + var cell = cellset[row][col];
  679 + var value = cell.value || 0;
  680 + // check if the resultset contains the raw value, if not try to parse the given value
  681 + var raw = cell.properties.raw;
  682 + if (raw && raw !== "null") {
  683 + value = parseFloat(raw);
  684 + } else if (typeof(cell.value) !== "number" && parseFloat(cell.value.replace(/[^a-zA-Z 0-9.]+/g,''))) {
  685 + value = parseFloat(cell.value.replace(/[^a-zA-Z 0-9.]+/g,''));
  686 + }
  687 + record.push(value);
  688 + }
  689 + this.data.resultset.push(record);
  690 + }
  691 + }
  692 + //makeSureUniqueLabels(this.data.resultset);
  693 + this.hasProcessed = true;
  694 + this.data.height = this.data.resultset.length;
  695 + this.cccOptions = this.getQuickOptions(this.cccOptions);
  696 + this.render_chart();
  697 + } else {
  698 + $(this.el).find('.canvas_wrapper').text("No results").show();
  699 + this.workspace.processing.hide();
  700 + this.workspace.adjust();
  701 + }
  702 + }
  703 +});
  704 +
  705 +
... ...
ferramentas/saiku/saiku-server/tomcat/webapps/ROOT/js/saiku/plugins/i3GeoMap/README.md 0 → 100755
... ... @@ -0,0 +1,12 @@
  1 +Saiku Chart Plus
  2 +
  3 +Welcome to Saiku Chart Plus Project.
  4 +
  5 +What is Saiku Chart Plus?
  6 +
  7 +It is an open source project that helps Pentaho BI users to create other types of charts and maps based on Saiku Project, Highcharts and Google Maps.
  8 +
  9 +To learn more visit our page http://it4biz.github.com/SaikuChartPlus/
  10 +
  11 +Direct link to download Saiku Chart Plus:
  12 +http://sourceforge.net/projects/saikuchartplus/files/SaikuChartPlus2.4/saikuchartsplus-plugin-2.4-RC1.zip/download
... ...
ferramentas/saiku/saiku-server/tomcat/webapps/ROOT/js/saiku/plugins/i3GeoMap/chart.png 0 → 100755

3.31 KB

ferramentas/saiku/saiku-server/tomcat/webapps/ROOT/js/saiku/plugins/i3GeoMap/map.png 0 → 100755

1.13 KB

ferramentas/saiku/saiku-server/tomcat/webapps/ROOT/js/saiku/plugins/i3GeoMap/mapa.png 0 → 100644

1.23 KB

ferramentas/saiku/saiku-server/tomcat/webapps/ROOT/js/saiku/plugins/i3GeoMap/plugin.js 0 → 100644
... ... @@ -0,0 +1,713 @@
  1 +/*
  2 + * Esse plugin e parte do software livre i3Geo
  3 + *
  4 + * Baseado em ChartPlus IT4biz IT Solutions Ltda
  5 + *
  6 + * Licensed under the Apache License, Version 2.0 (the "License");
  7 + * you may not use this file except in compliance with the License.
  8 + * You may obtain a copy of the License at
  9 + *
  10 + * http://www.apache.org/licenses/LICENSE-2.0
  11 + *
  12 + * Unless required by applicable law or agreed to in writing, software
  13 + * distributed under the License is distributed on an "AS IS" BASIS,
  14 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15 + * See the License for the specific language governing permissions and
  16 + * limitations under the License.
  17 + * changed by edmar.moretti@gmail.com
  18 + */
  19 +
  20 +var i3GeoMap = Backbone.View.extend({
  21 + opcoes: {cores:"",size:0,tipo:"",indicecoluna:"",cores:"",coluna:"",locaplic:"",outlinecolor:""},
  22 + coreshex: ["#1f77b4", "#aec7e8", "#ff7f0e", "#ffbb78", "#2ca02c", "#98df8a", "#d62728", "#ff9896", "#9467bd", "#c5b0d5", "#8c564b", "#c49c94", "#e377c2", "#f7b6d2", "#7f7f7f", "#c7c7c7", "#bcbd22", "#dbdb8d", "#17becf", "#9edae5" ],
  23 + initialize: function(args) {
  24 + this.workspace = args.workspace;
  25 +
  26 + // Create a unique ID for use as the CSS selector
  27 + this.id = _.uniqueId("i3GeoMap_");
  28 + $(this.el).attr({ id: this.id });
  29 +
  30 + // Bind map rendering to query result event
  31 + _.bindAll(this, "render", "receive_data", "process_data", "show",
  32 + "setOptions");
  33 +
  34 + this.workspace.bind('query:result', this.receive_data);
  35 +
  36 + // Add chart button
  37 + this.add_button();
  38 + this.workspace.toolbar.i3GeoMap = this.show;
  39 +
  40 + // Listen to adjust event and rerender chart
  41 + //this.workspace.bind('workspace:adjust', this.render);
  42 + // Create navigation
  43 + this.nav = $("" +
  44 + "<div style='overflow: hidden;padding: 10px 5px;' >"+
  45 + "<div class='fields_list' style='height:34px;'>"+
  46 + "<div class='fields_list_header limit'><span class='i18n_translated'>Mapa</span></div>"+
  47 + "<div class='fields_list_body filter' style='margin:4px 5px 5px 5px'>"+
  48 + //"<ul class='connectable ui-sortable' style=''>"+
  49 + "<input type=button name=mapaBarras value='Barras' />"+
  50 + "<input type=button name=mapaPizzas value='Pizzas' />"+
  51 + "&nbsp;<input type=button name=raiosProporcionais value='Raios proporcionais' />"+
  52 + "&nbsp;<input type=button name=circulosProporcionais value='C&iacute;rculos proporcionais' />"+
  53 + "&nbsp;<input type=button name=coresChapadas value='Cores' />"+
  54 + "&nbsp;<input type=button name=atualizarMapa value='Atualiza' />"+
  55 + "&nbsp;<input type=button name=fecharMapa value='Fechar' />"+
  56 + //"</ul>"+
  57 + "</div>"+
  58 + "</div>"+
  59 + "</div>"+
  60 + "<div id='message'></div>"+
  61 + "<form id='formi3GeoMap' method='post' target='iframei3GeoMap' action='"+parametroUrl("locaplic")+"/ferramentas/saiku/cartograma.php' >"+
  62 + "<input type=hidden name=opcoes id=formi3GeoMapOpcoes value='' />"+
  63 + "<input type=hidden name=g_sid id=formi3GeoMapg_sid value='"+parametroUrl("g_sid")+"' />"+
  64 + "<input type=hidden name=dados id=formi3GeoMapdados value='' />"+
  65 + "<input type=hidden name=metadados id=formi3GeoMapmetadados value='' />"+
  66 + "</form>" +
  67 + "<iframe id='iframei3GeoMap' name='iframei3GeoMap' style='width:100%;height:200px;display:block' />"
  68 + );
  69 + this.nav.find('input').click(this.setOptions);
  70 +
  71 + // Append chart to workspace
  72 + $(this.workspace.el).find('.workspace_results')
  73 + .prepend($(this.el).hide())
  74 + .prepend(this.nav.hide());
  75 + },
  76 + add_button: function() {
  77 + var $chart_button =
  78 + $('<a href="#i3GeoMap" class="i3GeoMap button disabled_toolbar i18n" title="Mapa com i3Geo"></a>')
  79 + .css({ 'background-image': "url('js/saiku/plugins/i3GeoMap/mapa.png')",
  80 + 'background-repeat':'no-repeat',
  81 + 'background-position':'20% 50%'
  82 + });
  83 +
  84 + var $chart_li = $('<li class="seperator"></li>').append($chart_button);
  85 + $(this.workspace.toolbar.el).find("ul").append($chart_li);
  86 + },
  87 + fecha: function(){
  88 + $(this.workspace.toolbar.el).find('.i3GeoMap').removeClass('on');
  89 + $(this.el).hide();
  90 + $(this.nav).hide();
  91 + this.workspace.processing.hide();
  92 + this.workspace.adjust();
  93 + $(this.workspace.el).find('.workspace_results table').show();
  94 + this.workspace.table.render({ data: this.workspace.query.result.lastresult() });
  95 + },
  96 + atualizarMapa: function(){
  97 + document.getElementById('formi3GeoMap').submit();
  98 + },
  99 + show: function(event, ui) {
  100 + //$(this.workspace.el).find('.workspace_results table').toggle();
  101 + $(this.el).toggle();
  102 + $(this.nav).toggle();
  103 + $(event.target).toggleClass('on');
  104 + $("#message").html("");
  105 + this.nav.find('input').show();
  106 + if ($(event.target).hasClass('on')) {
  107 + this.process_data({ data: this.workspace.query.result.lastresult() });
  108 + //this.render();
  109 + }
  110 + },
  111 +
  112 + setOptions: function(event) {
  113 + var type = $(event.target).attr('name');
  114 + this.opcoes.coluna = "";
  115 + this.opcoes.indicecoluna = "";
  116 + this.opcoes.cores = "";
  117 + this.opcoes.outlinecolor = "";
  118 + this[type](this);
  119 + return false;
  120 + },
  121 + fecharMapa: function(){
  122 + var i = document.getElementById("iframei3GeoMap");
  123 + if(i){
  124 + i.src = "";
  125 + i.style.display = "none";
  126 + i.style.height = "0px";
  127 + }
  128 + },
  129 + mapaPizzas: function(s){
  130 + this.opcoes.size = 50;
  131 + this.opcoes.cores = coresHex2Rgb(this.coreshex);
  132 + $.fancybox("Cor do contorno: "+this.cores("corContorno")+
  133 + "Tamanho das pizzas (em pixels):<br><input type=text value='"+this.opcoes.size+"' size=6 id='mapaPizzasSize' />" +
  134 + "<br><input type=button value='OK' id='mapaPizzasOk' />" +
  135 + "&nbsp; <input type=button value='Cancela' id='mapaPizzasCancela' />"
  136 + ,
  137 + {
  138 + 'autoDimensions' : false,
  139 + 'autoScale' : false,
  140 + 'height' : 250,
  141 + 'width' : 350,
  142 + 'transitionIn' : 'none',
  143 + 'transitionOut' : 'none',
  144 + 'showCloseButton' : false,
  145 + 'modal' : false
  146 + }
  147 + );
  148 + document.getElementById("mapaPizzasOk").onclick = function(){
  149 + s.opcoes.tipo = "mapaPizzas";
  150 + s.opcoes.size = document.getElementById("mapaPizzasSize").value;
  151 + s.opcoes.indicecoluna = [];
  152 + var cori = $('input[name="corContorno"]').val();
  153 + s.opcoes.outlinecolor = hex2rgb(cori);
  154 + s.render();
  155 + $.fancybox.close();
  156 + };
  157 + document.getElementById("mapaPizzasCancela").onclick = function(){
  158 + $.fancybox.close();
  159 + s.fecharMapa();
  160 + };
  161 + jQuery('select[name="corContorno"]').colourPicker({
  162 + ico: 'js/jquery/jquery.colourPicker.gif',
  163 + title: false
  164 + });
  165 + },
  166 +
  167 + mapaBarras: function(s){
  168 + this.opcoes.size = 50;
  169 + this.opcoes.cores = coresHex2Rgb(this.coreshex);
  170 + $.fancybox("Cor do contorno: "+this.cores("corContorno")+
  171 + "Tamanho das barras (em pixels):<br><input type=text value='"+this.opcoes.size+"' size=6 id='mapaBarrasSize' />" +
  172 + "<br><input type=button value='OK' id='mapaBarrasOk' />" +
  173 + "&nbsp; <input type=button value='Cancela' id='mapaBarrasCancela' />"
  174 + ,
  175 + {
  176 + 'autoDimensions' : false,
  177 + 'autoScale' : false,
  178 + 'height' : 250,
  179 + 'width' : 350,
  180 + 'transitionIn' : 'none',
  181 + 'transitionOut' : 'none',
  182 + 'showCloseButton' : false,
  183 + 'modal' : false
  184 + }
  185 + );
  186 + document.getElementById("mapaBarrasOk").onclick = function(){
  187 + s.opcoes.tipo = "mapaBarras";
  188 + s.opcoes.size = document.getElementById("mapaBarrasSize").value;
  189 + s.opcoes.indicecoluna = [];
  190 + var cori = $('input[name="corContorno"]').val();
  191 + s.opcoes.outlinecolor = hex2rgb(cori);
  192 + s.render();
  193 + $.fancybox.close();
  194 + };
  195 + document.getElementById("mapaBarrasCancela").onclick = function(){
  196 + $.fancybox.close();
  197 + s.fecharMapa();
  198 + };
  199 + jQuery('select[name="corContorno"]').colourPicker({
  200 + ico: 'js/jquery/jquery.colourPicker.gif',
  201 + title: false
  202 + });
  203 + },
  204 + coresChapadas: function(s){
  205 + this.opcoes.size = 0;
  206 + $.fancybox("Cor inicial: "+this.cores("corInicial")+
  207 + "Cor final: "+this.cores("corFinal")+
  208 + "Coluna com os valores:<br>"+
  209 + "<select id='coresChapadasColuna' style='border:1px solid #BBBBBB;'>"+this.opcoesColunas()+"</select>" +
  210 + "<br><input type=button value='OK' id='coresChapadasOk' />" +
  211 + "&nbsp; <input type=button value='Cancela' id='coresChapadasCancela' />"
  212 + ,
  213 + {
  214 + 'autoDimensions' : false,
  215 + 'autoScale' : false,
  216 + 'height' : 250,
  217 + 'width' : 350,
  218 + 'transitionIn' : 'none',
  219 + 'transitionOut' : 'none',
  220 + 'showCloseButton' : false,
  221 + 'modal' : false
  222 + }
  223 + );
  224 + document.getElementById("coresChapadasOk").onclick = function(){
  225 + s.opcoes.tipo = "coresChapadas";
  226 + s.opcoes.size = 0;
  227 + s.opcoes.indicecoluna = [parseInt(document.getElementById("coresChapadasColuna").value,10)];
  228 + var cori = $('input[name="corInicial"]').val();
  229 + var corf = $('input[name="corFinal"]').val();
  230 + s.opcoes.cores = [hex2rgb(cori),hex2rgb(corf)];
  231 + s.render();
  232 + $.fancybox.close();
  233 + };
  234 + document.getElementById("coresChapadasCancela").onclick = function(){
  235 + $.fancybox.close();
  236 + s.fecharMapa();
  237 + };
  238 + jQuery('select[name="corInicial"]').colourPicker({
  239 + ico: 'js/jquery/jquery.colourPicker.gif',
  240 + title: false
  241 + });
  242 + $('input[name="corInicial"]')[0].value = "ffffc7";
  243 +
  244 + jQuery('select[name="corFinal"]').colourPicker({
  245 + ico: 'js/jquery/jquery.colourPicker.gif',
  246 + title: false
  247 + });
  248 + $('input[name="corFinal"]')[0].value = "643403";
  249 + },
  250 + raiosProporcionais: function(s){
  251 + this.opcoes.size = 10;
  252 + $.fancybox("Escolha uma cor: "+this.cores()+
  253 + "Tamanho inicial do c&iacute;rculo (em pixels):<br><input type=text value='"+this.opcoes.size+"' size=6 id='raiosProporcionaisSize' />" +
  254 + "<br>Coluna com os valores:<br>"+
  255 + "<select id='raiosProporcionaisColuna' style='border:1px solid #BBBBBB;'>"+this.opcoesColunas()+"</select>" +
  256 + "<br><input type=button value='OK' id='raiosProporcionaisOk' />" +
  257 + "&nbsp; <input type=button value='Cancela' id='raiosProporcionaisCancela' />"
  258 + ,
  259 + {
  260 + 'autoDimensions' : false,
  261 + 'autoScale' : false,
  262 + 'height' : 250,
  263 + 'width' : 350,
  264 + 'transitionIn' : 'none',
  265 + 'transitionOut' : 'none',
  266 + 'showCloseButton' : false,
  267 + 'modal' : false
  268 + }
  269 + );
  270 + document.getElementById("raiosProporcionaisOk").onclick = function(){
  271 + s.opcoes.tipo = "raiosProporcionais";
  272 + s.opcoes.size = document.getElementById("raiosProporcionaisSize").value;
  273 + s.opcoes.indicecoluna = [parseInt(document.getElementById("raiosProporcionaisColuna").value,10)];
  274 + var cor = $('input[name="colour"]').val();
  275 + s.opcoes.cores = [hex2rgb(cor)];
  276 + s.render();
  277 + $.fancybox.close();
  278 + };
  279 + document.getElementById("raiosProporcionaisCancela").onclick = function(){
  280 + $.fancybox.close();
  281 + s.fecharMapa();
  282 + };
  283 + jQuery('select[name="colour"]').colourPicker({
  284 + ico: 'js/jquery/jquery.colourPicker.gif',
  285 + title: false
  286 + });
  287 + },
  288 + circulosProporcionais: function(s){
  289 + this.opcoes.size = 10;
  290 + $.fancybox("Escolha uma cor: "+this.cores()+
  291 + "Tamanho inicial do c&iacute;rculo (em pixels):<br><input type=text value='"+this.opcoes.size+"' size=6 id='circulosProporcionaisSize' />" +
  292 + "<br>Coluna com os valores:<br>"+
  293 + "<select id='circulosProporcionaisColuna' style='border:1px solid #BBBBBB;'>"+this.opcoesColunas()+"</select>" +
  294 + "<br><input type=button value='OK' id='circulosProporcionaisOk' />" +
  295 + "&nbsp; <input type=button value='Cancela' id='circulosProporcionaisCancela' />"
  296 + ,
  297 + {
  298 + 'autoDimensions' : false,
  299 + 'autoScale' : false,
  300 + 'height' : 250,
  301 + 'width' : 350,
  302 + 'transitionIn' : 'none',
  303 + 'transitionOut' : 'none',
  304 + 'showCloseButton' : false,
  305 + 'modal' : false
  306 + }
  307 + );
  308 + document.getElementById("circulosProporcionaisOk").onclick = function(){
  309 + s.opcoes.tipo = "circulosProporcionais";
  310 + s.opcoes.size = document.getElementById("circulosProporcionaisSize").value;
  311 + s.opcoes.indicecoluna = [parseInt(document.getElementById("circulosProporcionaisColuna").value,10)];
  312 + var cor = $('input[name="colour"]').val();
  313 + s.opcoes.cores = [hex2rgb(cor)];
  314 + s.render();
  315 + $.fancybox.close();
  316 + };
  317 + document.getElementById("circulosProporcionaisCancela").onclick = function(){
  318 + $.fancybox.close();
  319 + s.fecharMapa();
  320 + };
  321 + jQuery('select[name="colour"]').colourPicker({
  322 + ico: 'js/jquery/jquery.colourPicker.gif',
  323 + title: false
  324 + });
  325 + },
  326 +
  327 + opcoesColunas: function(){
  328 + var m = this.data.metadata,
  329 + n = m.length,
  330 + i = 0,
  331 + ins = [];
  332 + for(i=1;i<n;i++){
  333 + ins.push("<option value='"+m[i].colIndex+"' >"+m[i].colName+"</option>");
  334 + }
  335 + return ins.join("");
  336 + },
  337 + cores: function(nome){
  338 + if(!nome){
  339 + nome = "colour";
  340 + }
  341 + var cor = "<div id='jquery-colour-picker-example' >" +
  342 + "<p><select name='"+nome+"'>"+
  343 + "<option value='ffffff' selected='selected'>#ffffff</option>"+
  344 + "<option value='ffccc9'>#ffccc9</option>"+
  345 + "<option value='ffce93'>#ffce93</option>"+
  346 + "<option value='fffc9e'>#fffc9e</option>"+
  347 + "<option value='ffffc7'>#ffffc7</option>"+
  348 + "<option value='9aff99'>#9aff99</option>"+
  349 + "<option value='96fffb'>#96fffb</option>"+
  350 + "<option value='cdffff'>#cdffff</option>"+
  351 + "<option value='cbcefb'>#cbcefb</option>"+
  352 + "<option value='cfcfcf'>#cfcfcf</option>"+
  353 + "<option value='fd6864'>#fd6864</option>"+
  354 + "<option value='fe996b'>#fe996b</option>"+
  355 + "<option value='fffe65'>#fffe65</option>"+
  356 + "<option value='fcff2f'>#fcff2f</option>"+
  357 + "<option value='67fd9a'>#67fd9a</option>"+
  358 + "<option value='38fff8'>#38fff8</option>"+
  359 + "<option value='68fdff'>#68fdff</option>"+
  360 + "<option value='9698ed'>#9698ed</option>"+
  361 + "<option value='c0c0c0'>#c0c0c0</option>"+
  362 + "<option value='fe0000'>#fe0000</option>"+
  363 + "<option value='f8a102'>#f8a102</option>"+
  364 + "<option value='ffcc67'>#ffcc67</option>"+
  365 + "<option value='f8ff00'>#f8ff00</option>"+
  366 + "<option value='34ff34'>#34ff34</option>"+
  367 + "<option value='68cbd0'>#68cbd0</option>"+
  368 + "<option value='34cdf9'>#34cdf9</option>"+
  369 + "<option value='6665cd'>#6665cd</option>"+
  370 + "<option value='9b9b9b'>#9b9b9b</option>"+
  371 + "<option value='cb0000'>#cb0000</option>"+
  372 + "<option value='f56b00'>#f56b00</option>"+
  373 + "<option value='ffcb2f'>#ffcb2f</option>"+
  374 + "<option value='ffc702'>#ffc702</option>"+
  375 + "<option value='32cb00'>#32cb00</option>"+
  376 + "<option value='00d2cb'>#00d2cb</option>"+
  377 + "<option value='3166ff'>#3166ff</option>"+
  378 + "<option value='6434fc'>#6434fc</option>"+
  379 + "<option value='656565'>#656565</option>"+
  380 + "<option value='9a0000'>#9a0000</option>"+
  381 + "<option value='ce6301'>#ce6301</option>"+
  382 + "<option value='cd9934'>#cd9934</option>"+
  383 + "<option value='999903'>#999903</option>"+
  384 + "<option value='009901'>#009901</option>"+
  385 + "<option value='329a9d'>#329a9d</option>"+
  386 + "<option value='3531ff'>#3531ff</option>"+
  387 + "<option value='6200c9'>#6200c9</option>"+
  388 + "<option value='343434'>#343434</option>"+
  389 + "<option value='680100'>#680100</option>"+
  390 + "<option value='963400'>#963400</option>"+
  391 + "<option value='986536'>#986536</option>"+
  392 + "<option value='646809'>#646809</option>"+
  393 + "<option value='036400'>#036400</option>"+
  394 + "<option value='34696d'>#34696d</option>"+
  395 + "<option value='00009b'>#00009b</option>"+
  396 + "<option value='303498'>#303498</option>"+
  397 + "<option value='000000'>#000000</option>"+
  398 + "<option value='330001'>#330001</option>"+
  399 + "<option value='643403'>#643403</option>"+
  400 + "<option value='663234'>#663234</option>"+
  401 + "<option value='343300'>#343300</option>"+
  402 + "<option value='013300'>#013300</option>"+
  403 + "<option value='003532'>#003532</option>"+
  404 + "<option value='010066'>#010066</option>"+
  405 + "<option value='340096'>#340096</option></select></p></div>";
  406 + return cor;
  407 + },
  408 + render: function() {
  409 + if (! $(this.workspace.toolbar.el).find('.i3GeoMap').hasClass('on')) {
  410 + this.fecha();
  411 + this.fecharMapa();
  412 + return;
  413 + }
  414 + var series=[];
  415 + //nome das colunas
  416 + var column=[];
  417 + var columnGeoCod = "";
  418 + var indiceColumnGeoCod = "";
  419 + var metadata = [];
  420 + var indicecoluna = "";
  421 + for(var i=0; i < this.data.metadata.length; i++){
  422 + if(this.opcoes.indicecoluna == this.data.metadata[i].colIndex){
  423 + indicecoluna = i;
  424 + }
  425 + column[i] = this.data.metadata[i].colName;
  426 + //se o usuario escolheu uma coluna, as demais sao marcadas com o nome vazio
  427 + if(this.opcoes.indicecoluna != ""){
  428 + //if(this.opcoes.indicecoluna.indexOf(this.data.metadata[i].colIndex) != -1)
  429 + if(this.opcoes.indicecoluna.indexOf(this.data.metadata[i].colIndex) != -1 || column[i].search("GeoCod") > 0){
  430 + metadata.push(this.data.metadata[i]);
  431 + }
  432 + }
  433 + else{
  434 + metadata.push(this.data.metadata[i]);
  435 + }
  436 + //pega a coluna GeoCod
  437 + if(column[i].search("GeoCod") > 0){
  438 + //verifica se tem mais de um GeoCod
  439 + if(columnGeoCod != ""){
  440 + alert("Existem mais de uma coluna GeoCod!");
  441 + this.fecha();
  442 + $.fancybox.close();
  443 + return;
  444 + }
  445 + columnGeoCod = column[i];
  446 + indiceColumnGeoCod = i;
  447 + }
  448 + }
  449 + if(columnGeoCod === ""){
  450 + alert("Coluna GeoCod nao existe!");
  451 + this.fecha();
  452 + $.fancybox.close();
  453 + //this.nav.find('input').hide();
  454 + return;
  455 + }
  456 + series[0]=column;
  457 + var dados = [];
  458 + if(indicecoluna != ""){
  459 + if (this.data.resultset.length > 0 ) {
  460 + $.each(this.data.resultset, function(key, value) {
  461 + dados.push([value[indiceColumnGeoCod],value[indicecoluna]]);
  462 + });
  463 + }
  464 + }
  465 + else{
  466 + if (this.data.resultset.length > 0 ) {
  467 + $.each(this.data.resultset, function(key, value) {
  468 + var aux=value[0]+'';
  469 + aux = aux.split(" \/ ");
  470 + aux = aux[indiceColumnGeoCod];
  471 + value[0]=aux;
  472 + dados.push(value);
  473 + });
  474 + }
  475 + }
  476 + //preenche os dados do formulario
  477 + this.opcoes.locaplic = parametroUrl("locaplic");
  478 + this.opcoes.mapext = parametroUrl("mapext");
  479 + document.getElementById("formi3GeoMapOpcoes").value = JSON.stringify(this.opcoes);
  480 + document.getElementById("formi3GeoMapdados").value = JSON.stringify(dados);
  481 + document.getElementById("formi3GeoMapmetadados").value = JSON.stringify(metadata);
  482 + document.getElementById("iframei3GeoMap").style.height = parseInt($(this.workspace.el).find('.workspace_results')[0].style.height) - 50 +"px";
  483 + document.getElementById("formi3GeoMap").submit();
  484 + document.getElementById("iframei3GeoMap").style.display = "block";
  485 + },
  486 + receive_data: function(args) {
  487 + if ($(this.workspace.toolbar.el).find('.i3GeoMap').hasClass('on')) {
  488 + this.fecha();
  489 + this.fecharMapa();
  490 + return false;
  491 + }
  492 + return _.delay(this.process_data, 0, args);
  493 + },
  494 + process_data: function(args) {
  495 + this.data = {};
  496 + this.data.resultset = [];
  497 + this.data.metadata = [];
  498 + this.data.height = 0;
  499 + this.data.width = 0;
  500 + if (! $(this.workspace.toolbar.el).find('.i3GeoMap').hasClass('on')) {
  501 + this.fecha();
  502 + this.fecharMapa();
  503 + return;
  504 + }
  505 + var cellset = args.data.cellset;
  506 + var nome = "";
  507 + var colunaGeocod = "";
  508 + var colunaGeocodIndice = "";
  509 + if (cellset && cellset.length > 0) {
  510 + var lowest_level = 0;
  511 + var data_start = 0;
  512 + for (var row = 0; data_start == 0 && row < cellset.length; row++) {
  513 + this.data.metadata = [];
  514 + for (var field = 0; field < cellset[row].length; field++) {
  515 + var firstHeader = [];
  516 +
  517 + while (cellset[row][field].type == "COLUMN_HEADER" && cellset[row][field].value == "null") {
  518 + row++;
  519 + }
  520 + nome = "";
  521 + //colunaGeocod = "";
  522 + //colunaGeocodIndice = "";
  523 + if (cellset[row][field].type == "ROW_HEADER_HEADER") {
  524 + while(cellset[row][field].type == "ROW_HEADER_HEADER") {
  525 + nome = cellset[row][field].value;
  526 + firstHeader.push(nome);
  527 + if(nome.search("GeoCod") > 0){
  528 + colunaGeocod = nome;
  529 + colunaGeocodIndice = field;
  530 + }
  531 + field++;
  532 + }
  533 + tipo = "linha";
  534 + identificador = cellset[row][field-1].properties.level;
  535 + if(firstHeader.join('/').search("GeoCod") > 0){
  536 + this.data.metadata.push({
  537 + colIndex: 0,
  538 + colType: "String",
  539 + colName: colunaGeocod,
  540 + tipo: tipo,
  541 + identificador: identificador
  542 + });
  543 + lowest_level = field - 1;
  544 + }
  545 +
  546 + }
  547 + if (cellset[row][field].type == "COLUMN_HEADER" && cellset[row][field].value != "null") {
  548 + var lowest_col_header = 0;
  549 + var colheader = [];
  550 + while(lowest_col_header <= row) {
  551 + colheader.push(cellset[lowest_col_header][field].value);
  552 + lowest_col_header++;
  553 + }
  554 +
  555 + tipo = "coluna";
  556 + identificador = cellset[row][lowest_col_header].properties.uniquename;
  557 +
  558 + this.data.metadata.push({
  559 + colIndex: field - lowest_level + 1,
  560 + colType: "Numeric",
  561 + colName: colheader.join('/'),
  562 + tipo: tipo,
  563 + identificador: identificador
  564 + });
  565 + data_start = row+1;
  566 + }
  567 + }
  568 + }
  569 +
  570 + for (var row = data_start; row < cellset.length; row++) {
  571 + if (cellset[row][0].value !== "") {
  572 + var record = [];
  573 + this.data.width = cellset[row].length - lowest_level + 1;
  574 + var label = "";
  575 + if(cellset[row][colunaGeocodIndice]){
  576 + label = cellset[row][colunaGeocodIndice].value;
  577 + }
  578 + /*
  579 + if(label in labelsSet) {
  580 + labelsSet[label] = labelsSet[label]+1;
  581 + label = label + ' [' + (labelsSet[label] + 1) + ']';
  582 + } else {
  583 + labelsSet[label] = 0;
  584 + }
  585 + */
  586 + record.push(label);
  587 +
  588 + for (var col = lowest_level + 1; col < cellset[row].length; col++) {
  589 + var cell = cellset[row][col];
  590 + var value = cell.value || 0;
  591 + // check if the resultset contains the raw value, if not try to parse the given value
  592 + var raw = cell.properties.raw;
  593 + if (raw && raw !== "null") {
  594 + value = parseFloat(raw);
  595 + } else if (typeof(cell.value) !== "number" && parseFloat(cell.value.replace(/[^a-zA-Z 0-9.]+/g,''))) {
  596 + value = parseFloat(cell.value.replace(/[^a-zA-Z 0-9.]+/g,''));
  597 + }
  598 + record.push(value);
  599 + }
  600 + this.data.resultset.push(record);
  601 + }
  602 + }
  603 + //makeSureUniqueLabels(this.data.resultset);
  604 + this.hasProcessed = true;
  605 + this.data.height = this.data.resultset.length;
  606 + //this.cccOptions = this.getQuickOptions(this.cccOptions);
  607 + //this.render();
  608 + } else {
  609 + $(this.el).find('.canvas_wrapper').text("No results").show();
  610 + this.workspace.processing.hide();
  611 + this.workspace.adjust();
  612 + }
  613 + }
  614 +});
  615 +function hex2rgb(hex,tipo) {
  616 + if(!tipo){
  617 + tipo = "array";
  618 + }
  619 + if (hex[0]=="#") hex=hex.substr(1);
  620 + if (hex.length==3) {
  621 + var temp=hex; hex='';
  622 + temp = /^([a-f0-9])([a-f0-9])([a-f0-9])$/i.exec(temp).slice(1);
  623 + for (var i=0;i<3;i++) hex+=temp[i]+temp[i];
  624 + }
  625 + var triplets = /^([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})$/i.exec(hex).slice(1);
  626 + if(tipo == "array"){
  627 + return {
  628 + red: parseInt(triplets[0],16),
  629 + green: parseInt(triplets[1],16),
  630 + blue: parseInt(triplets[2],16)
  631 + };
  632 + }
  633 + else{
  634 + return parseInt(triplets[0],16)+ " " + parseInt(triplets[1],16) + " " + parseInt(triplets[2],16);
  635 + }
  636 +}
  637 +function coresHex2Rgb(lista){
  638 + var n = lista.length,
  639 + i =0,
  640 + f = [];
  641 + for(i=0;i<n;i++){
  642 + f.push(hex2rgb(lista[i]," "));
  643 + }
  644 + return f;
  645 +}
  646 +function loadCSS(file){
  647 + var headID = document.getElementsByTagName("head")[0];
  648 + var cssNode = document.createElement('link');
  649 + cssNode.type = 'text/css';
  650 + cssNode.rel = 'stylesheet';
  651 + cssNode.href = file;
  652 + cssNode.media = 'screen';
  653 + headID.appendChild(cssNode);
  654 +}
  655 +
  656 +function loadJS(file){
  657 + var headID = document.getElementsByTagName("head")[0];
  658 + var newScript = document.createElement('script');
  659 + newScript.type = 'text/javascript';
  660 + newScript.src = file;
  661 + headID.appendChild(newScript);
  662 +}
  663 +
  664 +function messageUser(msg){
  665 + $("#message").html(msg).show('slow');
  666 + setTimeout(function(){ jQuery("#message").hide('slow'); }, 2000);
  667 +}
  668 +
  669 +function parametroUrl(parametro){
  670 + var params = window.location.search.replace("?","").split("&"),
  671 + n = params.length,
  672 + valor = "",
  673 + i,param;
  674 + for(i=0;i<n;i++){
  675 + param = params[i].split("=");
  676 + if(param[0] == parametro){
  677 + valor = param[1];
  678 + }
  679 + }
  680 + return valor;
  681 +}
  682 +/**
  683 + * Start Plugin
  684 + */
  685 +Saiku.events.bind('session:new', function(session) {
  686 + function new_workspace(args) {
  687 + // Add stats element
  688 + if (typeof args.workspace.i3GeoMap == "undefined") {
  689 + args.workspace.i3GeoMap = new i3GeoMap({ workspace: args.workspace });
  690 + }
  691 + }
  692 +
  693 + function clear_workspace(args) {
  694 + if (typeof args.workspace.i3GeoMap != "undefined") {
  695 + $(args.workspace.i3GeoMap.nav).hide();
  696 + $(args.workspace.i3GeoMap.el).parents().find('.workspace_results table').show();
  697 + $(args.workspace.i3GeoMap.el).hide();
  698 + }
  699 + }
  700 +
  701 +
  702 + // Attach stats to existing tabs
  703 + for(var i = 0; i < Saiku.tabs._tabs.length; i++) {
  704 + var tab = Saiku.tabs._tabs[i];
  705 + new_workspace({
  706 + workspace: tab.content
  707 + });
  708 + };
  709 +
  710 + // Attach stats to future tabs
  711 + Saiku.session.bind("workspace:new", new_workspace);
  712 + Saiku.session.bind("workspace:clear", clear_workspace);
  713 +});
... ...
ferramentas/saiku/saiku-server/tomcat/webapps/ROOT/js/saiku/views/QueryToolbar.js 0 → 100755
... ... @@ -0,0 +1,228 @@
  1 +/*
  2 + * Copyright 2012 OSBI Ltd
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +
  17 +/**
  18 + * The query toolbar, and associated actions
  19 + */
  20 +var QueryToolbar = Backbone.View.extend({
  21 +
  22 +
  23 +
  24 + events: {
  25 + 'click .options a.button': 'call',
  26 + 'click .renderer a.button' : 'switch_render_button'
  27 + },
  28 +
  29 + chart: {},
  30 +
  31 + render_mode: "table",
  32 + spark_mode: null,
  33 +
  34 +
  35 + initialize: function(args) {
  36 + // Keep track of parent workspace
  37 + this.workspace = args.workspace;
  38 +
  39 + // Maintain `this` in callbacks
  40 + _.bindAll(this, "call","activate_buttons", "spark_bar", "spark_line", "render_row_viz", "run_row_viz", "switch_render_button");
  41 +
  42 + this.render_mode = "table";
  43 + this.spark_mode = null;
  44 +
  45 + // Activate buttons when a new query is created or run
  46 + this.workspace.bind('query:new', this.activate_buttons);
  47 + this.workspace.bind('query:result', this.activate_buttons);
  48 + this.workspace.bind('table:rendered', this.run_row_viz);
  49 +
  50 + },
  51 +
  52 + activate_buttons: function(args) {
  53 + if (typeof args != "undefined" && args != null ) {
  54 + $(this.el).find('a').removeClass('disabled_toolbar');
  55 + if (!args.data) {
  56 + $(this.el).find('a.export_button, a.stats').addClass('disabled_toolbar');
  57 + }
  58 + if (isIE) {
  59 + $(this.el).find('a.export_button').addClass('disabled_toolbar');
  60 + }
  61 + }
  62 +
  63 + },
  64 +
  65 + template: function() {
  66 + var template = $("#template-query-toolbar").html() || "";
  67 + return _.template(template)();
  68 + },
  69 +
  70 + render: function() {
  71 + $(this.el).html(this.template());
  72 +
  73 + $(this.el).find('render_table').addClass('on');
  74 + $(this.el).find('ul.table').show();
  75 +
  76 + return this;
  77 + },
  78 +
  79 + switch_render_button: function(event) {
  80 + $target = $(event.target);
  81 + event.preventDefault();
  82 + if ($(event.target).hasClass('disabled_toolbar')) {
  83 + return false;
  84 + }
  85 + //i3geomap
  86 + $(this.workspace.toolbar.el).find('.i3GeoMap').removeClass('on');
  87 + $target.parent().siblings().find('.on').removeClass('on');
  88 + if ($target.hasClass('render_chart')) {
  89 + this.switch_render('chart');
  90 + this.workspace.query.setProperty('saiku.ui.render.mode', 'chart');
  91 + var c = $(this.el).find('ul.chart li a.on:first').size() > 0 ?
  92 + $(this.el).find('ul.chart li a.on:first').attr('href').replace('#', '')
  93 + : null;
  94 + if (c != null) {
  95 + this.workspace.query.setProperty('saiku.ui.render.type', c);
  96 + }
  97 + } else {
  98 + this.switch_render('table');
  99 + this.workspace.query.setProperty('saiku.ui.render.mode', 'table');
  100 + this.workspace.query.setProperty('saiku.ui.render.type', this.spark_mode);
  101 +
  102 + }
  103 +
  104 +
  105 + },
  106 + switch_render: function(render_type) {
  107 + render_type = (typeof render_type != "undefined" ? render_type.toLowerCase() : "table");
  108 + $(this.el).find('ul.renderer a.on').removeClass('on');
  109 + $(this.el).find('ul.renderer a.render_' + render_type).addClass('on');
  110 + if ("chart" == render_type) {
  111 + $(this.el).find('ul.chart').show();
  112 + $(this.el).find('ul.table').hide();
  113 + this.render_mode = "chart";
  114 + $(this.workspace.el).find('.workspace_results').children().hide();
  115 + $(this.workspace.chart.el).children().hide();
  116 + this.workspace.chart.show();
  117 + } else {
  118 + $(this.el).find('ul.chart').hide();
  119 + $(this.el).find('ul.table').show();
  120 + $(this.el).find('ul.table .stats').removeClass('on');
  121 + $(this.workspace.el).find('.workspace_results').children().hide();
  122 + $(this.workspace.el).find('.workspace_results table').show();
  123 + $(this.workspace.chart.el).hide().children().hide();
  124 + this.render_mode = "table";
  125 + var hasRun = this.workspace.query.result.hasRun();
  126 + if (hasRun) {
  127 + this.workspace.table.render({ data: this.workspace.query.result.lastresult() });
  128 + }
  129 +
  130 + }
  131 + return false;
  132 + },
  133 +
  134 + call: function(event) {
  135 + event.preventDefault();
  136 + $target = $(event.target).hasClass('button') ? $(event.target) : $(event.target).parent();
  137 + if (! $target.hasClass('disabled_toolbar')) {
  138 + // Determine callback
  139 + var callback = $target.attr('href').replace('#', '');
  140 +
  141 + // Attempt to call callback
  142 + if (this.render_mode == "table" && this[callback]) {
  143 + this[callback](event);
  144 + } else if (this.render_mode == "chart" && this.workspace.chart[callback]) {
  145 + this.workspace.chart.button(event);
  146 + this.workspace.chart[callback](event);
  147 + }
  148 + }
  149 + return false;
  150 + },
  151 +
  152 + spark_bar: function() {
  153 + $(this.el).find('ul.table .spark_bar').toggleClass('on');
  154 + $(this.el).find('ul.table .spark_line').removeClass('on');
  155 +
  156 + $(this.workspace.table.el).find('td.spark').remove();
  157 + if ($(this.el).find('ul.table .spark_bar').hasClass('on')) {
  158 + this.spark_mode = "spark_bar";
  159 + this.workspace.query.setProperty('saiku.ui.render.type', 'spark_bar');
  160 + _.delay(this.render_row_viz, 10, "spark_bar");
  161 + } else {
  162 + this.spark_mode = null;
  163 + }
  164 + },
  165 +
  166 + spark_line: function() {
  167 + $(this.el).find('ul.table .spark_line').toggleClass('on');
  168 + $(this.el).find('ul.table .spark_bar').removeClass('on');
  169 +
  170 + $(this.workspace.table.el).find('td.spark').remove();
  171 + if ($(this.el).find('ul.table .spark_line').hasClass('on')) {
  172 + this.spark_mode = "spark_line";
  173 + this.workspace.query.setProperty('saiku.ui.render.type', 'spark_line');
  174 + _.delay(this.render_row_viz, 10, "spark_line");
  175 + } else {
  176 + this.spark_mode = null;
  177 + }
  178 + },
  179 +
  180 + run_row_viz: function(args) {
  181 + if (this.render_mode == "table" && this.spark_mode != null) {
  182 + this.render_row_viz(this.spark_mode);
  183 + }
  184 +
  185 + },
  186 +
  187 + render_row_viz: function(type) {
  188 + $(this.workspace.table.el).find('tr').each(function(index, element) {
  189 + var rowData = [];
  190 + $(element).find('td.data div').each(function(i,data) {
  191 + var val = $(data).attr('alt');
  192 + val = (typeof val != "undefined" && val != "" && val != null && val != "undefined") ? parseFloat(val) : 0;
  193 + rowData.push(val);
  194 + });
  195 +
  196 + $("<td class='data spark'>&nbsp;<div id='chart" + index + "'></div></td>").appendTo($(element));
  197 +
  198 + var width = rowData.length * 9;
  199 +
  200 + if (rowData.length > 0) {
  201 + var vis = new pv.Panel()
  202 + .canvas('chart' + index)
  203 + .height(12)
  204 + .width(width)
  205 + .margin(0);
  206 +
  207 + if (type == "spark_bar") {
  208 + vis.add(pv.Bar)
  209 + .data(rowData)
  210 + .left(pv.Scale.linear(0, rowData.length).range(0, width).by(pv.index))
  211 + .height(pv.Scale.linear(0,_.max(rowData)).range(0, 12))
  212 + .width(6)
  213 + .bottom(0);
  214 + } else if (type == "spark_line") {
  215 + width = width / 2;
  216 + vis.width(width);
  217 + vis.add(pv.Line)
  218 + .data(rowData)
  219 + .left(pv.Scale.linear(0, rowData.length - 1).range(0, width).by(pv.index))
  220 + .bottom(pv.Scale.linear(rowData).range(0, 12))
  221 + .strokeStyle("#000")
  222 + .lineWidth(1);
  223 + }
  224 + vis.render();
  225 + }
  226 + });
  227 + }
  228 +});
... ...
mashups/openlayers.js
1   -$i = function(id)
2   -{return document.getElementById(id);};
3 1 //seta as vari&aacute;veis navn e navm
4 2 navn = false;
5 3 navm = false;
  4 +$i = function(id)
  5 +{return document.getElementById(id);};
6 6 app = navigator.appName.substring(0,1);
7 7 if (app==='N'){navn=true;}else{navm=true;}
8 8  
... ... @@ -47,7 +47,7 @@ i3GEO.editorOL = {
47 47 "Base cartogr&aacute;fica",
48 48 "http://mapas.mma.gov.br/cgi-bin/mapserv?map=/opt/www/html/webservices/baseraster.map&",
49 49 {layers:'baseraster',SRS:'EPSG:4618',FORMAT:'image/png'},
50   - {singleTile:true}
  50 + {singleTile:false}
51 51 ),
52 52 ol_wms: new OpenLayers.Layer.WMS.Untiled(
53 53 "OpenLayers WMS",
... ... @@ -180,7 +180,7 @@ i3GEO.editorOL = {
180 180 try{
181 181 eval("i3GEO.editorOL."+fundo[i]+".transitionEffect = 'resize';");
182 182 eval("i3GEO.editorOL."+fundo[i]+".setVisibility(false);");
183   - eval("i3GEO.editorOL."+fundo[i]+".singleTile = single;");
  183 + eval("i3GEO.editorOL."+fundo[i]+".singleTile = false;");
184 184 eval("alayers.push(i3GEO.editorOL."+fundo[i]+");");
185 185 }
186 186 catch(e){
... ... @@ -559,9 +559,11 @@ i3GEO.editorOL = {
559 559 ins = "",i;
560 560 for(i=0;i<nlayers;i++){
561 561 try{
562   - var url = layers[i].getFullRequestString({"request":"getlegendgraphic"});
563   - url = url.replace("LAYERS","LAYER");
564   - ins += "<img src='"+url+"' /><br>";
  562 + if(layers[i].isBaseLayer === false){
  563 + var url = layers[i].getFullRequestString({"request":"getlegendgraphic"});
  564 + url = url.replace("LAYERS","LAYER");
  565 + ins += layers[i].name+"<br><img src='"+url+"' /><br>";
  566 + }
565 567 }
566 568 catch(e){}
567 569 }
... ...
mashups/openlayers.php
... ... @@ -222,7 +222,12 @@ if($temas != &quot;&quot;){
222 222 if($l->status == MS_DEFAULT){
223 223 $visivel = "true";
224 224 }
225   - $objOpenLayers[] = 'new OpenLayers.Layer.WMS( "'.$tituloLayer.'", "../ogc.php?tema='.$tema.'&DESLIGACACHE='.$DESLIGACACHE.'&",{layers:"'.$nomeLayer.'",transparent: "true", format: "image/png"},{singleTile:true,visibility:'.$visivel.',isBaseLayer:'.$ebase.'})';
  225 + if($tituloLayer != ""){
  226 + $objOpenLayers[] = 'new OpenLayers.Layer.WMS( "'.$tituloLayer.'", "../ogc.php?tema='.$tema.'&DESLIGACACHE='.$DESLIGACACHE.'&",{layers:"'.$nomeLayer.'",transparent: "true", format: "image/png"},{singleTile:true,visibility:'.$visivel.',isBaseLayer:'.$ebase.'})';
  227 + }
  228 + else{
  229 + $objOpenLayers[] = 'new OpenLayers.Layer.WMS( "'.$tituloLayer.'", "../ogc.php?tema='.$tema.'&DESLIGACACHE='.$DESLIGACACHE.'&",{layers:"'.$nomeLayer.'",transparent: "true", format: "image/png"},{displayInLayerSwitcher:false,singleTile:true,visibility:'.$visivel.',isBaseLayer:'.$ebase.'})';
  230 + }
226 231 }
227 232 }
228 233 //var_dump($objOpenLayers);exit;
... ...
mashups/openlayers_compacto.js
... ... @@ -3062,7 +3062,7 @@ ol_mma: new OpenLayers.Layer.WMS(
3062 3062 "Base cartogr&aacute;fica",
3063 3063 "http://mapas.mma.gov.br/cgi-bin/mapserv?map=/opt/www/html/webservices/baseraster.map&",
3064 3064 {layers:'baseraster',SRS:'EPSG:4618',FORMAT:'image/png'},
3065   -{singleTile:true}
  3065 +{singleTile:false}
3066 3066 ),
3067 3067 ol_wms: new OpenLayers.Layer.WMS.Untiled(
3068 3068 "OpenLayers WMS",
... ... @@ -3195,7 +3195,7 @@ if(fundo[i] != &quot;&quot;){
3195 3195 try{
3196 3196 eval("i3GEO.editorOL."+fundo[i]+".transitionEffect = 'resize';");
3197 3197 eval("i3GEO.editorOL."+fundo[i]+".setVisibility(false);");
3198   -eval("i3GEO.editorOL."+fundo[i]+".singleTile = single;");
  3198 +eval("i3GEO.editorOL."+fundo[i]+".singleTile = false;");
3199 3199 eval("alayers.push(i3GEO.editorOL."+fundo[i]+");");
3200 3200 }
3201 3201 catch(e){
... ... @@ -3571,9 +3571,11 @@ nlayers = layers.length,
3571 3571 ins = "",i;
3572 3572 for(i=0;i<nlayers;i++){
3573 3573 try{
  3574 +if(layers[i].isBaseLayer === false){
3574 3575 var url = layers[i].getFullRequestString({"request":"getlegendgraphic"});
3575 3576 url = url.replace("LAYERS","LAYER");
3576   -ins += "<img src='"+url+"' /><br>";
  3577 +ins += layers[i].name+"<br><img src='"+url+"' /><br>";
  3578 +}
3577 3579 }
3578 3580 catch(e){}
3579 3581 }
... ...
mashups/openlayers_compacto.js.php
... ... @@ -3062,7 +3062,7 @@ ol_mma: new OpenLayers.Layer.WMS(
3062 3062 "Base cartogr&aacute;fica",
3063 3063 "http://mapas.mma.gov.br/cgi-bin/mapserv?map=/opt/www/html/webservices/baseraster.map&",
3064 3064 {layers:'baseraster',SRS:'EPSG:4618',FORMAT:'image/png'},
3065   -{singleTile:true}
  3065 +{singleTile:false}
3066 3066 ),
3067 3067 ol_wms: new OpenLayers.Layer.WMS.Untiled(
3068 3068 "OpenLayers WMS",
... ... @@ -3195,7 +3195,7 @@ if(fundo[i] != &quot;&quot;){
3195 3195 try{
3196 3196 eval("i3GEO.editorOL."+fundo[i]+".transitionEffect = 'resize';");
3197 3197 eval("i3GEO.editorOL."+fundo[i]+".setVisibility(false);");
3198   -eval("i3GEO.editorOL."+fundo[i]+".singleTile = single;");
  3198 +eval("i3GEO.editorOL."+fundo[i]+".singleTile = false;");
3199 3199 eval("alayers.push(i3GEO.editorOL."+fundo[i]+");");
3200 3200 }
3201 3201 catch(e){
... ... @@ -3571,9 +3571,11 @@ nlayers = layers.length,
3571 3571 ins = "",i;
3572 3572 for(i=0;i<nlayers;i++){
3573 3573 try{
  3574 +if(layers[i].isBaseLayer === false){
3574 3575 var url = layers[i].getFullRequestString({"request":"getlegendgraphic"});
3575 3576 url = url.replace("LAYERS","LAYER");
3576   -ins += "<img src='"+url+"' /><br>";
  3577 +ins += layers[i].name+"<br><img src='"+url+"' /><br>";
  3578 +}
3577 3579 }
3578 3580 catch(e){}
3579 3581 }
... ...