<?php
    $fusionMGpath = '../../layers/MapGuide/php/';
    require_once $fusionMGpath . 'Common.php';
    if(InitializationErrorOccurred())
    {
        DisplayInitializationErrorHTML();
        exit;
    }
    require_once $fusionMGpath . 'Utilities.php';
    require_once $fusionMGpath . 'JSON.php';
    require_once 'classes/markupeditor.php';
    require_once 'classes/editcommand.php';

    $args = ($_SERVER['REQUEST_METHOD'] == "POST") ? $_POST : $_GET;

    $refreshMap = false;
    $errorMsg = null;
    $errorDetail = null;
    $allowPoint = false;
    $allowLine = false;
    $allowPoly = false;
    $markupFeatures = array();
    
    $defaultFormat = null;
    $defaultGeomType = null;
    $checkState = "";

    if (array_key_exists("REDLINEFORMAT", $args) && array_key_exists("REDLINEGEOMTYPE", $args)) {
        if (strcmp($args["REDLINEFORMAT"], "SDF") == 0) {
            $defaultFormat = $args["REDLINEFORMAT"];
            $defaultGeomType = $args["REDLINEGEOMTYPE"];
        } else if (strcmp($args["REDLINEFORMAT"], "SHP") == 0) {
            $defaultFormat = $args["REDLINEFORMAT"];
            $defaultGeomType = $args["REDLINEGEOMTYPE"];
        } else if (strcmp($args["REDLINEFORMAT"], "SQLite") == 0) {
            $defaultFormat = $args["REDLINEFORMAT"];
            $defaultGeomType = $args["REDLINEGEOMTYPE"];
        }
    }

    SetLocalizedFilesPath(GetLocalizationPath());
    if(isset($_REQUEST['LOCALE'])) {
        $locale = $_REQUEST['LOCALE'];
    } else {
        $locale = GetDefaultLocale();
    }

    try
    {
        $markupEditor = new MarkupEditor($args);
        if (array_key_exists('EDITCOMMAND', $args))
        {
            $cmd = $args['EDITCOMMAND'];
            switch ($cmd) {
            case EditCommand::AddPoint:
                $markupEditor->AddPoint();
                $refreshMap = true;
                break;
            case EditCommand::AddLine:
            case EditCommand::AddLineString:
                $markupEditor->AddLineString();
                $refreshMap = true;
                break;
            case EditCommand::AddCircle:
            case EditCommand::AddRectangle:
            case EditCommand::AddPolygon:
                $markupEditor->AddPolygon();
                $refreshMap = true;
                break;
            case EditCommand::Delete:
                $markupEditor->DeleteMarkup();
                $refreshMap = true;
                break;
            case EditCommand::Update:
                $markupEditor->UpdateMarkup();
                $refreshMap = true;
                break;

            }
        }

        $markupFeatures = $markupEditor->GetMarkupFeatures();
        $clsDef = $markupEditor->GetClassDefinition();
        $clsProps = $clsDef->GetProperties();
        if ($clsProps->IndexOf($clsDef->GetDefaultGeometryPropertyName()) >= 0)
        {
            $geomProp = $clsProps->GetItem($clsDef->GetDefaultGeometryPropertyName());
            $geomTypes = $geomProp->GetGeometryTypes();

            if ($geomTypes & MgFeatureGeometricType::Point)
                $allowPoint = true;
            if ($geomTypes & MgFeatureGeometricType::Curve)
                $allowLine = true;
            if ($geomTypes & MgFeatureGeometricType::Surface)
                $allowPoly = true;
        }

        $editLocal = GetLocalizedString('REDLINEEDIT', $locale );
        $defaultHelpLocal = GetLocalizedString('REDLINEEDITDEFAULTHELP', $locale );
        $pointHelpLocal = GetLocalizedString('REDLINEEDITPOINTHELP', $locale );
        $lineHelpLocal = GetLocalizedString('REDLINEEDITLINEHELP', $locale );
        $lineStringHelpLocal = GetLocalizedString('REDLINEEDITLINESTRINGHELP', $locale );
        $rectangleHelpLocal = GetLocalizedString('REDLINEEDITRECTANGLEHELP', $locale );
        $polygonHelpLocal = GetLocalizedString('REDLINEEDITPOLYGONHELP', $locale );
        $circleHelpLocal = GetLocalizedString('REDLINEEDITCIRCLEHELP', $locale );
        $addLocal = GetLocalizedString('REDLINEADD', $locale );
        $digitizeLocal = GetLocalizedString('REDLINEDIGITIZE', $locale );
        $pointLocal = GetLocalizedString('REDLINEOBJECTPOINT', $locale );
        $circleLocal = GetLocalizedString('REDLINEOBJECTCIRCLE', $locale );
        $lineLocal = GetLocalizedString('REDLINEOBJECTLINE', $locale );
        $lineStringLocal = GetLocalizedString('REDLINEOBJECTLINESTRING', $locale );
        $rectangleLocal = GetLocalizedString('REDLINEOBJECTRECTANGLE', $locale );
        $polygonLocal = GetLocalizedString('REDLINEOBJECTPOLYGON', $locale );
        $modifyLocal = GetLocalizedString('REDLINEMODIFY', $locale );
        $selectLocal = GetLocalizedString('REDLINESELECTOBJECT', $locale );
        $deleteLocal = GetLocalizedString('REDLINEDELETEOBJECT', $locale );
        $updateLocal = GetLocalizedString('REDLINEUPDATETEXT', $locale );
        $closeLocal = GetLocalizedString('REDLINEEDITCLOSE', $locale );
        $promptLabelLocal = GetLocalizedString('REDLINEPROMPTLABEL', $locale);
        $promptRedlineLabelsLocal = GetLocalizedString('REDLINEPROMPTFORLABELS', $locale);
        $noTextLocal = GetLocalizedString('REDLINENOTEXT', $locale);
        $multiHelpLocal = GetLocalizedString('REDLINEMULTISELECTHELP', $locale);
        
        if (array_key_exists("REDLINEPROMPT", $args) && strcmp($args["REDLINEPROMPT"], "on") == 0) {
            $checkState = " checked='checked'";
        }
    }
    catch (MgException $e)
    {
        $errorMsg = $e->GetExceptionMessage();
        $errorDetail = $e->GetDetails();
    }
    catch (Exception $e)
    {
        $errorMsg = $e->getMessage();
        $errorDetail = $e->__toString();
    }
?>
<html>
<head>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8">
<?php if ($errorMsg == null) { ?>
    <title><?=$editLocal?></title>
    <link rel="stylesheet" href="Redline.css" type="text/css">
    <script language="javascript" src="../../layers/MapGuide/MapGuideViewerApi.js"></script>
    <script language="javascript" src="../../common/browserdetect.js"></script>
    <script language="javascript">
        var session = '<?= $args['SESSION'] ?>';
        var mapName = '<?= $args['MAPNAME'] ?>';

        var CMD_ADD_POINT		= <?= EditCommand::AddPoint ?>;
        var CMD_ADD_LINE 		= <?= EditCommand::AddLine ?>;
        var CMD_ADD_LINESTRING 	= <?= EditCommand::AddLineString ?>;
        var CMD_ADD_RECTANGLE 	= <?= EditCommand::AddRectangle ?>;
        var CMD_ADD_POLYGON 	= <?= EditCommand::AddPolygon ?>;
        var CMD_ADD_CIRCLE      = <?= EditCommand::AddCircle ?>;
        var CMD_DELETE 			= <?= EditCommand::Delete ?>;
        var CMD_UPDATE 			= <?= EditCommand::Update ?>;

        var EDIT_DEFAULT_HELP = "<?=$defaultHelpLocal?>";
        var EDIT_POINT_HELP = "<?=$pointHelpLocal?>";
        var EDIT_LINE_HELP = "<?=$lineHelpLocal?>";
        var EDIT_LINESTRING_HELP = "<?=$lineStringHelpLocal?>";
        var EDIT_RECTANGLE_HELP = "<?=$rectangleHelpLocal?>";
        var EDIT_POLYGON_HELP = "<?=$polygonHelpLocal?>";
        var EDIT_CIRCLE_HELP = "<?=$circleHelpLocal?>";

        function SetDigitizeInfo(text)
        {
            var digitizeInfo = document.getElementById("digitizeInfo");
            digitizeInfo.innerHTML = text;
            var widget = Fusion.getWidgetsByType("Redline")[0];
            if (widget.mapMessagePrompt) {
                var map = Fusion.getMapByName(mapName).mapWidget;
                var msg = map.message;
                //It's a digitization prompt
                if (text != EDIT_DEFAULT_HELP) {
                    msg.info(text + ' <a id="abortDigitizationLink" href="javascript:void(0)">' + OpenLayers.i18n("stop") + '</a>');
                    var link = msg.container.ownerDocument.getElementById("abortDigitizationLink");
                    //Wire the anchor click
                    link.onclick = function() {
                        msg.clear();
                        PromptAndSetMarkupText();
                    };
                } else {
                    msg.info(text);
                }
            }
        }

        function SubmitCommand(cmd)
        {
            var commandInput = document.getElementById("commandInput");
            commandInput.value = cmd;

            var editForm = document.getElementById("editForm");
            editForm.submit();
        }

        function AddPoint()
        {
            SetDigitizeInfo(EDIT_POINT_HELP);
            DigitizePoint(OnPointDigitized);
        }
        
        function AddCircle()
        {
            SetDigitizeInfo(EDIT_CIRCLE_HELP);
            DigitizeCircle(OnCircleDigitized);
        }

        function AddLine()
        {
            SetDigitizeInfo(EDIT_LINE_HELP);
            DigitizeLine(OnLineStringDigitized);
        }

        function AddLineString()
        {
            SetDigitizeInfo(EDIT_LINESTRING_HELP);
            DigitizeLineString(OnLineStringDigitized);
        }

        function AddRectangle()
        {
            SetDigitizeInfo(EDIT_RECTANGLE_HELP);
            DigitizeRectangle(OnRectangleDigitized);
        }

        function AddPolygon()
        {
            SetDigitizeInfo(EDIT_POLYGON_HELP);
            DigitizePolygon(OnPolyonDigitized);
        }
        
        function PromptForRedlineLabels()
        {
            return document.getElementById("chkPromptForRedlineLabels").checked;
        }

        function PromptAndSetMarkupText()
        {
            var widget = Fusion.getWidgetsByType("Redline")[0];
            if (PromptForRedlineLabels()) {
                var textInput = document.getElementById("textInput");

                textLabel = window.prompt("<?=$promptLabelLocal?>", "");
                textInput.value = (textLabel != null) ? textLabel : "";
            }
            ClearDigitization(true);
        }

        function OnPointDigitized(point)
        {
            PromptAndSetMarkupText();

            var geometryInput = document.getElementById("geometryInput");
            geometryInput.value = point.X + "," + point.Y;

            SubmitCommand(CMD_ADD_POINT);
        }
        
        function OnCircleDigitized(circle)
        {
            PromptAndSetMarkupText();
            var geometryInput = document.getElementById("geometryInput");
            var x = circle.Center.X;
            var y = circle.Center.Y;
            var r = circle.Radius;
            
            var coords = [];
            for (var index = 0; index < 2 * simulateCircleHalfPointNumber + 1; index++) {
                coords.push(x + r * simulateCirclePoints[2 * index]);
                coords.push(y + r * simulateCirclePoints[2 * index + 1]);
            }
            geometryInput.value = (coords.length / 2) + "," + coords.join(",");
            SubmitCommand(CMD_ADD_CIRCLE);
        }

        function OnLineStringDigitized(lineString)
        {
            PromptAndSetMarkupText();

            var geomText = lineString.Count;
            for (var i = 0; i < lineString.Count; i++)
            {
                geomText += "," + lineString.Point(i).X + "," + lineString.Point(i).Y;
            }

            var geometryInput = document.getElementById("geometryInput");
            geometryInput.value = geomText;

            SubmitCommand(CMD_ADD_LINESTRING);
        }

        function OnRectangleDigitized(rectangle)
        {
            PromptAndSetMarkupText();

            var geometryInput = document.getElementById("geometryInput");
            geometryInput.value = "5,"
                + rectangle.Point1.X + "," + rectangle.Point1.Y + ","
                + rectangle.Point2.X + "," + rectangle.Point1.Y + ","
                + rectangle.Point2.X + "," + rectangle.Point2.Y + ","
                + rectangle.Point1.X + "," + rectangle.Point2.Y + ","
                + rectangle.Point1.X + "," + rectangle.Point1.Y;

            SubmitCommand(CMD_ADD_RECTANGLE);
        }

        function OnPolyonDigitized(polygon)
        {
            if(polygon.Count < 3)
            {
                // invalid polygon
                ClearDigitization(true);

                return;
            }

            PromptAndSetMarkupText();

            var geomText = polygon.Count;
            for (var i = 0; i < polygon.Count; i++)
            {
                geomText += "," + polygon.Point(i).X + "," + polygon.Point(i).Y;
            }

            var geometryInput = document.getElementById("geometryInput");
            geometryInput.value = geomText;

            SubmitCommand(CMD_ADD_POLYGON);
        }

        function TrimString(str)
        {
            return (typeof String.prototype.trim == 'undefined') ? str.replace(/^\s+|\s+$/g, '') : str.trim();
        }

        function GetSelectedMarkupIds(mkEl)
        {
            var ids = [];
            for (var i = 0; i < mkEl.options.length; i++) {
                if (mkEl.options[i].selected) {
                    ids.push(mkEl.options[i].value);
                }
            }
            return ids;
        }

        function SelectMarkup()
        {
            markupFeatures = document.getElementById("markupFeatures");
            var featIds = GetSelectedMarkupIds(markupFeatures);
            reqParams = "MAPNAME=" + encodeURIComponent(mapName);
            reqParams += "&SESSION=" + encodeURIComponent(session);
            reqParams += "&OPENMARKUP=" + encodeURIComponent('<?= $args['OPENMARKUP']; ?>');
            //reqParams += "&MARKUPFEATURE=" + markupFeatures.value;
            for (var i = 0; i < featIds.length; i++) {
                reqParams += "&MARKUPFEATURE[]=" + featIds[i];
            }

            if(msie)
                reqHandler = new ActiveXObject("Microsoft.XMLHTTP");
            else
                reqHandler = new XMLHttpRequest();

            reqHandler.open("POST", "getselectionxml.php", false);
            reqHandler.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

            reqHandler.send(reqParams);
            if(reqHandler.responseXML)
            {
                SetSelectionXML(reqHandler.responseText, true /*bDoNotZoom*/);
            }
        }

        function DeleteMarkup()
        {
            SubmitCommand(CMD_DELETE);
        }

        function UpdateMarkup()
        {
            SubmitCommand(CMD_UPDATE);
        }

        function CloseEditor()
        {
            ClearDigitization(true);
            var map = Fusion.getMapByName(mapName).mapWidget;
            map.message.clear();

            var editForm = document.getElementById("editForm");
            editForm.action = "markupmain.php";

            editForm.submit();
        }

        function OnMarkupFeatureChange()
        {
            var markupFeatures = document.getElementById("markupFeatures");
            var updateTextInput = document.getElementById("updateTextInput");
            var selectBtn = document.getElementById("selectBtn");
            var deleteBtn = document.getElementById("deleteBtn");
            var updateBtn = document.getElementById("updateBtn");

            if (markupFeatures.selectedIndex >= 0)
            {
                value = markupFeatures.options[markupFeatures.selectedIndex].text;
                if (value.indexOf('[<?= $noTextLocal ?>]') < 0) {
                    var tokens = value.split(":");
                    if (tokens.length == 2) {
                        updateTextInput.value = TrimString(tokens[1]);
                    } else {
                        updateTextInput.value = value;
                    }
                } else {
                    updateTextInput.value = '';
                }

                selectBtn.disabled = false;
                deleteBtn.disabled = false;
                updateBtn.disabled = false;
            }
            else
            {
                updateTextInput.value = '';
                selectBtn.disabled = true;
                deleteBtn.disabled = true;
                updateBtn.disabled = true;
            }
        }

        function OnLoad()
        {
            OnMarkupFeatureChange();

        <?php if ($refreshMap) { ?>
            var map = parent.Fusion.getMapByName(mapName);
            map.drawMap();
        <?php } ?>
            SetDigitizeInfo(EDIT_DEFAULT_HELP);
        }
        
        function OnUnload()
        {
            ClearDigitization(true);
            var map = Fusion.getMapByName(mapName).mapWidget;
            map.message.clear();
        }
    </script>
</head>

<body onLoad="OnLoad()" onUnload="OnUnload()" marginwidth=5 marginheight=5 leftmargin=5 topmargin=5 bottommargin=5 rightmargin=5>
<form action="editmarkup.php" method="post" enctype="application/x-www-form-urlencoded" id="editForm" target="_self">
<table class="RegText" border="0" cellspacing="0" width="100%">
    <tr>
        <td colspan="2" class="Title"><?= $editLocal ?> - <?= $markupEditor->GetMarkupName() ?><hr></td>
    </tr>

    <tr>
        <td colspan="2" class="SubTitle"><?= $addLocal ?></td>
    </tr>
    <tr>
        <td colspan="2"><?=$digitizeLocal?></td>
    </tr>
    <tr><td colspan="2" height="2px"></td></tr>
    <tr>
        <td colspan="2">
            <input class="Ctrl" id="pointBtn" type="button" onClick="AddPoint()" value="<?=$pointLocal?>" style="width:85px" <?= $allowPoint ? '' : 'disabled="disabled"' ?> />
            <input class="Ctrl" id="circleBtn" type="button" onClick="AddCircle()" value="<?=$circleLocal?>" style="width:85px" <?= $allowPoly ? '' : 'disabled="disabled"' ?> />
        </td>
    </tr>
    <tr>
        <td colspan="2">
            <input class="Ctrl" id="lineBtn" type="button" onClick="AddLine()" value="<?=$lineLocal?>" style="width:85px" <?= $allowLine ? '' : 'disabled="disabled"'  ?> />
            <input class="Ctrl" id="lineStringBtn" type="button" onClick="AddLineString()" value="<?=$lineStringLocal?>" style="width:85px" <?= $allowLine ? '' : 'disabled="disabled"'  ?> />
        </td>
    </tr>
    <tr>
        <td colspan="2">
            <input class="Ctrl" id="rectangleBtn" type="button" onClick="AddRectangle()" value="<?=$rectangleLocal?>" style="width:85px" <?= $allowPoly ? '' : 'disabled="disabled"'  ?> />
            <input class="Ctrl" id="polygonBtn" type="button" onClick="AddPolygon()" value="<?=$polygonLocal?>" style="width:85px" <?= $allowPoly ? '' : 'disabled="disabled"'  ?> />
        </td>
    </tr>
    <tr><td colspan="2" height="2px"></td></tr>
    <tr>
        <td colspan="2">
            <input type="checkbox" class="Ctrl" id="chkPromptForRedlineLabels" name="REDLINEPROMPT" <?= $checkState ?> /> <?= $promptRedlineLabelsLocal ?>
        </td>
    </tr>
    <tr><td colspan="2" height="2px"></td></tr>
    <tr>
        <td class="InfoText" colspan="2" id="digitizeInfo"></td>
    </tr>
    <tr><td colspan="2"></td></tr>
    <tr>
        <td colspan="2" class="SubTitle"><?=$modifyLocal?></td>
    </tr>
    <tr>
        <td colspan="2">
            <input class="Ctrl" name="UPDATETEXT" type="text" id="updateTextInput" maxlength="255" style="width:100%"><br></td>
        </td>
    </tr>
    <tr>
        <td class="RegText">
            <select name="MARKUPFEATURE[]" size="15" class="Ctrl" id="markupFeatures" onChange="OnMarkupFeatureChange()" multiple="multiple" style="width: 100%">
                <?php
                    $selected = 'selected';
                    foreach($markupFeatures as $markupId => $markupText) {
                ?>
                <option value="<?= $markupId ?>" <?=$selected ?> ><?= (strlen($markupText) > 0) ? "$markupId: ".htmlentities($markupText, ENT_COMPAT, 'UTF-8') : "$markupId: [$noTextLocal]" ?></option>
                <?php
                        $selected = '';
                    }
                ?>
            </select>
        </td>
    </tr>
    <tr><td colspan="2" height="2px"></td></tr>
    <tr>
        <td class="InfoText" colspan="2"><?= $multiHelpLocal ?></td>
    </tr>
    <tr><td colspan="2" height="2px"></td></tr>
    <tr>
        <td colspan="2">
            <input class="Ctrl" id="selectBtn" type="button" onClick="SelectMarkup()" value="<?=$selectLocal?>" style="width:85px">
            <input class="Ctrl" id="deleteBtn" type="button" onClick="DeleteMarkup()" value="<?=$deleteLocal?>" style="width:85px">
            <input class="Ctrl" id="updateBtn" type="button" onClick="UpdateMarkup()" value="<?=$updateLocal?>" style="width:85px">
        </td>
    </tr>
    <tr><td colspan="2" height="2px"></td></tr>

    <tr>
        <td colspan="2" align="right">
            <hr>
            <input class="Ctrl" name="" type="button" onClick="CloseEditor()" value="<?=$closeLocal?>" style="width:85px">
        </td>
    </tr>

</table>
<input name="SESSION" type="hidden" value="<?= $args['SESSION'] ?>">
<input name="MAPNAME" type="hidden" value="<?= $args['MAPNAME'] ?>">
<input name="OPENMARKUP" type="hidden" value="<?= $args['OPENMARKUP'] ?>">
<input name="EDITCOMMAND" type="hidden" value="" id="commandInput">
<input name="GEOMETRY" type="hidden" value="" id="geometryInput">
<input name="TEXT" type="hidden" value="" id="textInput">
<?php if ($defaultFormat != null && $defaultGeomType != null) { ?>
<input name="REDLINEFORMAT" type="hidden" value="<?= $defaultFormat ?>" />
<input name="REDLINEGEOMTYPE" type="hidden" value="<?= $defaultGeomType ?>" />
<?php } ?>
<input name="REDLINESTYLIZATION" type="hidden" value="<?= $args['REDLINESTYLIZATION'] ?>">
</form>
<?php } else { ?>
</head>
<body>
<table class="RegText" border="0" cellspacing="0" width="100%%">
    <tr><td class="Title">Error<hr></td></tr>
    <tr><td><?= $errorMsg ?></td></tr>
    <tr><td><?= $errorDetail ?></td></tr>
</table>

<?php } ?>

</body>

</html>