/** * * @project CWC2 * @revision $Id: cwc_roi.js,v 1.27 2005/05/16 11:32:53 bartvde Exp $ * @purpose The ROI Manager - a group of functions for managing * regions of interest and the tools that define them. * @author DM Solutions Group (spencer@dmsolutions.ca) * @copyright * Copyright (c) 2002, DM Solutions Group Inc. * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ var CWCIsNav4 = (document.layers) ? 1:0; var CWCIsIE = (document.all) ? 1:0; var CWCIsNav6 = (document.getElementById && !document.all) ? 1:0; if (CWCIsNav4 || CWCIsNav6) { document.captureEvents(Event.MOUSEMOVE); document.captureEvents(Event.MOUSEDOWN); document.captureEvents(Event.MOUSEUP); document.captureEvents(Event.RESIZE); document.captureEvents(Event.KEYPRESS); } var ROI_MODE_FIRST = 1; var ROI_MODE_NORMAL = ROI_MODE_FIRST; var ROI_MODE_ADD = ROI_MODE_NORMAL + 1; var ROI_MODE_SUBTRACT = ROI_MODE_ADD + 1; var ROI_MODE_LAST = ROI_MODE_SUBTRACT; /* * ROI Events */ var ROI_CHANGED = 0; var goCWCROIManager = new CWCROIManager(); /* * The ROI Manager */ function CWCROIManager() { this.aROI = new Array(); this.nActiveROITool = 0; this.oForm = null; this.mode = ROI_MODE_NORMAL; this.szRendererURL = ""; this.geoMinX = null; this.geoMinY = null; this.geoMaxX = null; this.geoMaxY = null; this.pixMinX = null; this.pixMinY = null; this.pixMaxX = null; this.pixMaxY = null; this.szEdgeColor = "#00FF00"; this.nEdgeWidth = 2; this.szFillColor = this.szEdgeColor; this.nFillOpacity = 0.5; this.bFill = true; this.onchange = new Array(); this.events = new Array(); this.events[ROI_CHANGED] = new Array(); this.SetFormObject = CWCROIManager_SetFormObject; this.Add = CWCROIManager_Add; this.Insert = CWCROIManager_Insert; this.Redraw = CWCROIManager_Redraw; this.GetLast = CWCROIManager_GetLast; this.RemoveLast = CWCROIManager_RemoveLast; this.RemoveAll = CWCROIManager_RemoveAll; this.SetROITool = CWCROIManager_SetROITool; this.GetROITool = CWCROIManager_GetROITool; this.SetGeoExtents = CWCROIManager_SetGeoExtents; this.SetPixelExtents = CWCROIManager_SetPixelExtents; this.SetMode = CWCROIManager_SetMode; this.SetRendererURL = CWCROIManager_SetRendererURL; this.GetRendererURL = CWCROIManager_GetRendererURL; this.GetROI = CWCROIManager_GetROI; this.Geo2Pix = CWCROIManager_Geo2Pix; this.Pix2Geo = CWCROIManager_Pix2Geo; this.UpdateLayerVisibility = CWCROIManager_UpdateLayerVisibility; this.RegisterEvent = CWCROIManager_RegisterEvent; this.DeregisterEvent = CWCROIManager_RegisterEvent; this.TriggerEvent = CWCROIManager_TriggerEvent; } function CWCROIManager_UpdateLayerVisibility() { if (this.aROI.length > 0) { //window.status = "show layer"; CWCDHTML_ShowLayer( gROIRenderer ); } else CWCDHTML_HideLayer( gROIRenderer ); } function CWCROIManager_GetROI() { return aROI; } function CWCROIManager_SetRendererURL( szURL ) { this.szRendererURL = szURL; } function CWCROIManager_GetRendererURL() { var szURL = this.szRendererURL + "&blah=" + Math.random(); szURL = szURL + "&width=" + (this.pixMaxX - this.pixMinX); szURL = szURL + "&height=" + (this.pixMaxY - this.pixMinY); return szURL; } function CWCROIManager_SetMode( nMode ) { if (nMode >= ROI_MODE_FIRST && nMode <= ROI_MODE_LAST) { this.mode = nMode; } if (this.oForm.ROI_MODE) { this.oForm.ROI_MODE.value = this.mode; } } function CWCROIManager_SetGeoExtents( fMinX, fMinY, fMaxX, fMaxY ) { this.geoMinX = parseFloat( fMinX ); this.geoMinY = parseFloat( fMinY ); this.geoMaxX = parseFloat( fMaxX ); this.geoMaxY = parseFloat( fMaxY ); } function CWCROIManager_SetPixelExtents( nMinX, nMinY, nMaxX, nMaxY ) { this.pixMinX = parseInt( nMinX ); this.pixMinY = parseInt( nMinY ); this.pixMaxX = parseInt( nMaxX ); this.pixMaxY = parseInt( nMaxY ); } function CWCROIManager_SetFormObject( oObj ) { this.oForm = oObj; } function CWCROIManager_RegisterEvent( event, szCode ) { lastEvent = (this.events[event]).length; this.events[ event ][ lastEvent ] = szCode; return true; } function CWCROIManager_DeregisterEvent( event, szCode ) { bFound = false events = this.events[event]; for( i=0; i 0) return this.aROI[this.aROI.length - 1]; else return null; } function CWCROIManager_RemoveLast() { var newROI = new Array(); var i; if (this.aROI.length > 0) { for (i=0; i < this.aROI.length - 1; i++) { newROI[i] = this.aROI[i]; } this.aROI[this.aROI.length - 1].Hide(); this.aROI[this.aROI.length - 1] = null; this.aROI = newROI; this.TriggerEvent( ROI_CHANGED ); } if (this.oForm.ROI_MODE) { var szURL = this.GetRendererURL(); if (szURL != null) { szURL = szURL + "&mode=-1"; var oImage = CWCDHTML_GetImage( "ROIRenderer" ); oImage.src = szURL; } } this.UpdateLayerVisibility(); } function CWCROIManager_RemoveAll() { var i; if (this.aROI.length > 0) { for (i=0; i < this.aROI.length; i++) { if (this.aROI[i] != null) this.aROI[i].Hide(); this.aROI[i] = null; } this.TriggerEvent( ROI_CHANGED ); } this.aROI = new Array(); if (this.oForm.ROI_MODE) { var szURL = this.GetRendererURL(); if (szURL != null) { szURL = szURL + "&mode=-2"; var oImage = CWCDHTML_GetImage( "ROIRenderer" ); oImage.src = szURL; } } this.UpdateLayerVisibility(); } function CWCROIManager_SetROITool( nTool ) { this.nActiveTool = nTool; if (this.oForm != null) { if (this.oForm.NAV_CMD != null) this.oForm.NAV_CMD.value = "ROI_TOOL"; if (this.oForm.NAV_SUBMIT != null) this.oForm.NAV_SUBMIT.value = "0"; } } function CWCROIManager_GetROITool( ) { return this.nActiveTool } /**************************************************************************** * Converts from Geographic coordinates to Pixel coordinates. Returns an * array of 2 elements containing the resulting x and y positions. * * @param x : Value should be between inside the map extents * @param y : Value should be between inside the map extents *****************************************************************************/ function CWCROIManager_Geo2Pix( x, y ) { if (x >= this.geoMinX && x <= this.geoMaxX && y >= this.geoMinY && y <= this.geoMaxY) { var width = this.pixMaxX - this.pixMinX; var height = this.pixMaxY - this.pixMinY; var dfDeltaMaxGeoX = this.geoMaxX - this.geoMinX; var dfDeltaMaxGeoY = this.geoMaxY - this.geoMinY; var dfPixX = (width * (x - this.geoMinX))/ dfDeltaMaxGeoX; var dfPixY = height - ((height * (y - this.geoMinY))/ dfDeltaMaxGeoY); aReturn = new Array(2); aReturn[0] = dfPixX; aReturn[1] = dfPixY; return aReturn; } else return false; } /**************************************************************************** * Converts from Pixel to Geographic coordinates. Returns an * array of 2 elements containing the resulting x and y positions. * * @param x : Value should be between 0 and the map width * @param y : Value should be between 0 and the map height *****************************************************************************/ function CWCROIManager_Pix2Geo(x, y) { var width = this.pixMaxX - this.pixMinX; var height = this.pixMaxY - this.pixMinY; if (x >= 0 && x <= width && y >= 0 && y <= height) { var x_pct = (x / width); var y_pct = (y / height); var dfGeoX = this.geoMinX + ( ( this.geoMaxX - this.geoMinX) * x_pct); var dfGeoY = this.geoMaxY - ( (this.geoMaxY - this.geoMinY) * y_pct); var aReturn = new Array(2); aReturn[0] = dfGeoX; aReturn[1] = dfGeoY; return aReturn; } else { return false; } } /* * a Feature-based ROI */ function CWCFeatureROI( ) { this.type = "feature"; this.manager = null; this.mode = ROI_MODE_NORMAL; this.edgeColor = "#00FF00"; this.edgeWidth = 2; this.fillColor = this.edgeColor; this.fillOpacity = 0.5; this.fillLayer = null; this.bFill = true; this.visible = false; this.szLayer = ""; this.x = -1; this.y = -1; this.geoX = null; this.geoY = null; this.Draw = CWCFeatureROI_Draw; this.Set = CWCFeatureROI_Set; this.Show = CWCFeatureROI_Show; this.Hide = CWCFeatureROI_Hide; this.GetRendererURL = CWCFeatureROI_GetRendererURL; this.GetROI = CWCFeatureROI_GetROI; this.Serialize = CWCFeatureROI_Serialize; this.CalculateGeoExtents = CWCFeatureROI_CalculateGeoExtents; } function CWCFeatureROI_GetROI() { return false; } function CWCFeatureROI_Draw() { return false; } function CWCFeatureROI_Set( x, y, szLayer ) { this.x = x; this.y = y; this.szLayer = szLayer return false; } function CWCFeatureROI_Show() { return false; } function CWCFeatureROI_Hide() { return false; } function CWCFeatureROI_GetRendererURL() { var szSerialized = this.Serialize(); if (!szSerialized) { return false; } var szURL = this.manager.GetRendererURL(); szURL = szURL + "&" + szSerialized; return szURL; } function CWCFeatureROI_Serialize() { if (!this.CalculateGeoExtents()) { return false; } if (this.szLayer == "") { return false; } var szURL = "type=" + this.type; szURL = szURL + "&mode=" + this.mode; szURL = szURL + "&coords=" + this.geoX + "," + this.geoY; szURL = szURL + "&edgecolor=" + escape(this.edgeColor); szURL = szURL + "&edgewidth=" + this.edgeWidth; szURL = szURL + "&fillcolor=" + escape(this.fillColor); if (CWCIsIE) { szURL = szURL + "&fillopacity=-1"; } else { szURL = szURL + "&fillopacity=" + this.fillOpacity; } szURL = szURL + "&selectedLayer=" + this.szLayer return szURL; } function CWCFeatureROI_CalculateGeoExtents() { if (this.manager != null) { var aGeo = this.manager.Pix2Geo( this.x, this.y ); this.geoX = aGeo[0]; this.geoY = aGeo[1]; return true; } return false; } /* * a Rectangular ROI */ function CWCRectangleROI( ) { this.type = "rectangle"; this.manager = null; this.mode = ROI_MODE_NORMAL; this.left = -2; this.top = -2; this.right = -2; this.bottom = -2; this.geoMinX = null; this.geoMinY = null; this.geoMaxX = null; this.geoMaxY = null; this.topLayer = null; this.leftLayer = null; this.rightLayer = null; this.bottomLayer = null; this.edgeColor = "#00FF00"; this.edgeWidth = 2; this.fillColor = this.edgeColor; this.fillOpacity = 0.5; this.fillLayer = null; this.bFill = true; this.visible = false; this.Draw = CWCRectangleROI_Draw; this.Set = CWCRectangleROI_Set; this.Show = CWCRectangleROI_Show; this.Hide = CWCRectangleROI_Hide; this.GetRendererURL = CWCRectangleROI_GetRendererURL; this.GetROI = CWCRectangleROI_GetROI; this.Serialize = CWCRectangleROI_Serialize; this.CalculateGeoExtents = CWCRectangleROI_CalculateGeoExtents; } function CWCRectangleROI_CalculateGeoExtents() { if (this.manager != null) { var aTL = this.manager.Pix2Geo( this.left, this.top ); var aBR = this.manager.Pix2Geo( this.right, this.bottom ); if (aTL != false && aBR != false) { this.geoMinX = Math.min(aTL[0], aBR[0]); this.geoMaxX = Math.max(aTL[0], aBR[0]); this.geoMinY = Math.min(aTL[1], aBR[1]); this.geoMaxY = Math.max(aTL[1], aBR[1]); //alert( this.geoMinX + "," + this.geoMinY + ":" + this.geoMaxX + "," + this.geoMaxY ); return true; } else { this.geoMinX = null; this.geoMinY = null; this.geoMaxX = null; this.geoMaxY = null; return false; } } else { return false; } } function CWCRectangleROI_GetROI() { } function CWCRectangleROI_Draw() { if (!this.visible) return; if( this.topLayer == null || this.leftLayer == null || this.rightLayer == null || this.bottomLayer == null) { this.visible = false; return; } CWCDHTML_ClipLayer(this.topLayer, this.left, this.top, this.right, this.top+this.edgeWidth); CWCDHTML_ClipLayer(this.leftLayer, this.left, this.top, this.left + this.edgeWidth, this.bottom); CWCDHTML_ClipLayer(this.rightLayer, this.right - this.edgeWidth, this.top, this.right, this.bottom); CWCDHTML_ClipLayer(this.bottomLayer, this.left, this.bottom - this.edgeWidth, this.right, this.bottom); if (this.bFill) { if (this.fillLayer != null) { CWCDHTML_ClipLayer(this.fillLayer, this.left+this.edgeWidth, this.top+this.edgeWidth, this.right-this.edgeWidth, this.bottom - this.edgeWidth); } else { this.bFill = false; } } } function CWCRectangleROI_Set( left, top, right, bottom ) { this.left = left; this.top = top; this.right = right; this.bottom = bottom; if (this.visible) { this.Draw(); } } function CWCRectangleROI_Show() { if( this.topLayer == null || this.leftLayer == null || this.rightLayer == null || this.bottomLayer == null) { this.visible = false; return; } this.visible = true; CWCDHTML_ShowLayer(this.topLayer); CWCDHTML_ShowLayer(this.leftLayer); CWCDHTML_ShowLayer(this.rightLayer); CWCDHTML_ShowLayer(this.bottomLayer); CWCDHTML_SetLayerBackgroundColor( this.topLayer, this.edgeColor ); CWCDHTML_SetLayerBackgroundColor( this.leftLayer, this.edgeColor ); CWCDHTML_SetLayerBackgroundColor( this.rightLayer, this.edgeColor ); CWCDHTML_SetLayerBackgroundColor( this.bottomLayer, this.edgeColor ); if(this.bFill) { CWCDHTML_ShowLayer(this.fillLayer) CWCDHTML_SetLayerBackgroundColor( this.fillLayer, this.fillColor ); CWCDHTML_SetLayerOpacity( this.fillLayer, this.fillOpacity ); } this.Draw(); } function CWCRectangleROI_Hide() { if( this.topLayer == null || this.leftLayer == null || this.rightLayer == null || this.bottomLayer == null) { this.visible = false; return; } this.visible = false; CWCDHTML_HideLayer(this.topLayer); CWCDHTML_HideLayer(this.leftLayer); CWCDHTML_HideLayer(this.rightLayer); CWCDHTML_HideLayer(this.bottomLayer); if(this.bFill) { CWCDHTML_HideLayer(this.fillLayer) } } function CWCRectangleROI_GetRendererURL() { var szSerialized = this.Serialize(); if (!szSerialized) { return false; } var szURL = this.manager.GetRendererURL(); szURL = szURL + "&" + szSerialized; return szURL; } function CWCRectangleROI_Serialize() { if (!this.CalculateGeoExtents()) return false; var szURL = "type=" + this.type; szURL = szURL + "&mode=" + this.mode; szURL = szURL + "&coords=" + this.geoMinX + "," + this.geoMinY + "," + this.geoMaxX + "," + this.geoMaxY; szURL = szURL + "&edgecolor=" + escape(this.edgeColor); szURL = szURL + "&edgewidth=" + this.edgeWidth; szURL = szURL + "&fillcolor=" + escape(this.fillColor); if (CWCIsIE) { szURL = szURL + "&fillopacity=-1"; } else { szURL = szURL + "&fillopacity=" + this.fillOpacity; } return szURL; } /****************************************************************************** * a Circle ROI *****************************************************************************/ function CWCCircleROI( nPoints ) { this.type = "circle"; this.manager = null; this.mode = ROI_MODE_NORMAL; // set the node image widths this.centerNodeImageWidth = 7; this.nodeImageWidth = 6; // set the operating limits for this tool this.left = -2; this.top = -2; this.right = -2; this.bottom = -2; // define the center and radius properties this.centerX = -2; // in pixels from corner of map this.centerY = -2; // in pixels from corner of map this.radius = 0; // default the number of layers to create this.numPoints = nPoints; // loop and build layer objects for ( var i=1; i<=this.numPoints; i++ ) { eval('this.Layer' + i + ' = null;'); } this.edgeColor = "#00FF00"; this.edgeWidth = 2; this.fillColor = this.edgeColor; this.fillOpacity = 0.5; this.fillLayer = null; this.bFill = true; this.visible = false; this.Draw = CWCCircleROI_Draw; this.Show = CWCCircleROI_Show; this.Hide = CWCCircleROI_Hide; this.GetRendererURL = CWCCircleROI_GetRendererURL; this.GetROI = CWCCircleROI_GetROI; this.Serialize = CWCCircleROI_Serialize; //this.CalculateGeoExtents = CWCCircleROI_CalculateGeoExtents; } /* function CWCCircleROI_CalculateGeoExtents() { if (this.manager != null) { var aTL = this.manager.Pix2Geo( this.left, this.top ); var aBR = this.manager.Pix2Geo( this.right, this.bottom ); if (aTL != false && aBR != false) { this.geoMinX = Math.min(aTL[0], aBR[0]); this.geoMaxX = Math.max(aTL[0], aBR[0]); this.geoMinY = Math.min(aTL[1], aBR[1]); this.geoMaxY = Math.max(aTL[1], aBR[1]); //alert( this.geoMinX + "," + this.geoMinY + ":" + this.geoMaxX + "," + this.geoMaxY ); return true; } else { this.geoMinX = null; this.geoMinY = null; this.geoMaxX = null; this.geoMaxY = null; return false; } } else { return false; } } */ function CWCCircleROI_GetROI() { } function CWCCircleROI_Draw() { // init vars var dX = 0; var dY = 0; if (!this.visible) return; // calculate the distance to the mouse and angle interval (rad) with (Math) { var dist = sqrt( pow( gROIToolmouseX - gROICircleToolx1, 2 ) + pow( gROIToolmouseY - gROICircleTooly1, 2 ) ); var angleInterval = 2 * PI / this.numPoints; } // set the center and radius this.centerX = gROICircleToolx1 - this.left; this.centerY = gROICircleTooly1 - this.top; this.radius = dist; // position nodes CWCDHTML_SetLayerPos( this.centerLayer, gROICircleToolx1-(this.centerNodeImageWidth/2), gROICircleTooly1-(this.centerNodeImageWidth/2) ); // loop and position each of the point layers around the circle for ( var i=0; i this.right - this.nodeImageWidth || gROICircleTooly1 + dY < this.top || gROICircleTooly1 + dY > this.bottom - this.nodeImageWidth ) { // hide eval('CWCDHTML_HideLayer(this.Layer' + (i+1) + ');'); } else { // show eval('CWCDHTML_ShowLayer(this.Layer' + (i+1) + ');'); } } } function CWCCircleROI_Show() { // set flag this.visible = true; CWCDHTML_ShowLayer(this.centerLayer); // loop and show layer objects for ( var i=1; i<=this.numPoints; i++ ) { eval( 'CWCDHTML_ShowLayer(this.Layer' + i + ');' ); } this.Draw(); } function CWCCircleROI_Hide() { // set flag this.visible = false; // loop and hide layer objects for ( var i=1; i<=this.numPoints; i++ ) { eval( 'CWCDHTML_HideLayer(this.Layer' + i + ');' ); } CWCDHTML_HideLayer(this.centerLayer); } function CWCCircleROI_GetRendererURL() { var szSerialized = this.Serialize(); if (!szSerialized) return false; var szURL = this.manager.GetRendererURL(); szURL = szURL + "&" + szSerialized; return szURL; } function CWCCircleROI_Serialize() { // init vars var aCenter; var aRadius; var szURL; // convert to ground units if (this.manager != null) { aCenter = this.manager.Pix2Geo( this.centerX, this.centerY ); aRadius = this.manager.Pix2Geo( parseInt(this.centerX) + parseInt(this.radius), this.centerY ); } szURL = "type=" + this.type; szURL = szURL + "&mode=" + this.mode; szURL = szURL + "&coords=" + aCenter[0] + ',' + aCenter[1] + ',' + aRadius[0] + ',' + aRadius[1]; szURL = szURL + "&edgecolor=" + escape(this.edgeColor); szURL = szURL + "&edgewidth=" + this.edgeWidth; szURL = szURL + "&fillcolor=" + escape(this.fillColor); if (CWCIsIE) { szURL = szURL + "&fillopacity=-1"; } else { szURL = szURL + "&fillopacity=" + this.fillOpacity; } return szURL; } /****************************************************************************** * a Polygon ROI *****************************************************************************/ function CWCPolygonROI() { this.type = "polygon"; this.manager = null; this.mode = ROI_MODE_NORMAL; this.edgeColor = "#00FF00"; this.edgeWidth = 2; // set the operating limits for this tool this.left = -2; this.top = -2; this.right = -2; this.bottom = -2; this.fillColor = this.edgeColor; this.fillOpacity = 0.5; this.fillLayer = null; this.bFill = true; this.aNodeCoords = new Array(); this.visible = false; this.Draw = CWCPolygonROI_Draw; this.Show = CWCPolygonROI_Show; this.Hide = CWCPolygonROI_Hide; this.GetRendererURL = CWCPolygonROI_GetRendererURL; this.GetROI = CWCPolygonROI_GetROI; this.GetRendererURL = CWCPolygonROI_GetRendererURL; this.Serialize = CWCPolygonROI_Serialize; } function CWCPolygonROI_Draw(){return null;} function CWCPolygonROI_Show(){return null;} function CWCPolygonROI_Hide(){return null;} function CWCPolygonROI_GetRendererURL(){return null;} function CWCPolygonROI_GetROI(){return null;} function CWCPolygonROI_GetRendererURL() { var szSerialized = this.Serialize(); if (!szSerialized) return false; var szURL = this.manager.GetRendererURL(); szURL = szURL + "&" + szSerialized; return szURL; } function CWCPolygonROI_Serialize() { // init vars var szCoords = ""; var szURL; var aTmp; // loop and build string of coordinates for ( var i=0; i < this.aNodeCoords.length; i++ ) { // convert to ground units aTmp = this.manager.Pix2Geo( (this.aNodeCoords[i][0]- this.left), ( this.aNodeCoords[i][1] - this.top ) ); // store szCoords += aTmp[0] + ',' + aTmp[1]; //szCoords += (this.aNodeCoords[i][0] + ',' + ( this.aNodeCoords[i][1] - this.top); // add separator if necessary if ( i < this.aNodeCoords.length - 1 ) szCoords += ','; } szURL = "type=" + this.type; szURL = szURL + "&mode=" + this.mode; szURL = szURL + "&coords=" + szCoords; szURL = szURL + "&edgecolor=" + escape(this.edgeColor); szURL = szURL + "&edgewidth=" + this.edgeWidth; szURL = szURL + "&fillcolor=" + escape(this.fillColor); if (CWCIsIE) { szURL = szURL + "&fillopacity=-1"; } else { szURL = szURL + "&fillopacity=" + this.fillOpacity; } return szURL; }