text:
<html>
<head>
  <script src="../OLLoader.js"></script>
  <script type="text/javascript">
    function test_Handler_Polygon_constructor(t) {
        t.plan(3);
        var control = new OpenLayers.Control();
        control.id = Math.random();
        var callbacks = {foo: "bar"};
        var options = {bar: "foo"};

        var oldInit = OpenLayers.Handler.prototype.initialize;

        OpenLayers.Handler.prototype.initialize = function(con, call, opt) {
            t.eq(con.id, control.id,
                 "constructor calls parent with the correct control");
            t.eq(call, callbacks,
                 "constructor calls parent with the correct callbacks");
            t.eq(opt, options,
                 "constructor calls parent with the correct options");
        }
        var handler = new OpenLayers.Handler.Polygon(control, callbacks, options);

        OpenLayers.Handler.prototype.initialize = oldInit;
    }

    function test_Handler_Polygon_activation(t) {
        t.plan(5);
        var log = [];
        var map = new OpenLayers.Map("map", {
            resolutions: [1]
        });
        var layer = new OpenLayers.Layer.Vector("foo", {
            maxExtent: new OpenLayers.Bounds(-10, -10, 10, 10),
            isBaseLayer: true
        });
        map.addLayer(layer);
        var control = new OpenLayers.Control();
        var handler = new OpenLayers.Handler.Polygon(control, {});
        control.handler = handler;
        map.addControl(control);
        map.setCenter(new OpenLayers.LonLat(0, 0), 0);
        handler.active = true;

        var activated = handler.activate();
        t.ok(!activated,
             "activate returns false if the handler was already active");
        handler.active = false;
        activated = handler.activate();
        t.ok(activated,
             "activate returns true if the handler was not already active");
        t.ok(handler.layer instanceof OpenLayers.Layer.Vector,
             "activate creates a vector layer");
        t.ok(handler.layer.map == map,
             "activate adds the vector layer to the map");
        activated = handler.deactivate();
        t.ok(activated,
             "deactivate returns true if the handler was active already");

        map.destroy();
    }

    // See: http://trac.osgeo.org/openlayers/ticket/3179
    function test_activate_before_map_is_centered(t) {
        t.plan(1);
        var map = new OpenLayers.Map('map', {
            resolutions: [1]
        });
        var layer = new OpenLayers.Layer.Vector("foo", {
            maxExtent: new OpenLayers.Bounds(-10, -10, 10, 10),
            isBaseLayer: true
        });
        map.addLayer(layer);
        var control = new OpenLayers.Control();
        var handler = new OpenLayers.Handler.Polygon(control, {});
        control.handler = handler;
        map.addControl(control);

        var error;
        try {
            handler.activate();
            error = false;
        } catch(err) {
            error = true;
        }
        t.ok(!error, "no error on activate");
    }

    function test_bounds_stopDown_true(t) {
        t.plan(2);
        var map = new OpenLayers.Map('map');
        map.addLayer(new OpenLayers.Layer.WMS("", "", {}));
        map.zoomToMaxExtent();
        var control = new OpenLayers.Control();
        map.addControl(control);
        var handler = new OpenLayers.Handler.Polygon(control, {},
                {stopDown: true, stopUp: true});
        var activated = handler.activate();
        // click on (150, 75)
        var evt = {xy: new OpenLayers.Pixel(150, 75), which: 1};
        handler.mousemove(evt);
        handler.mousedown(evt);
        handler.mouseup(evt);
        // click on (175, 100)
        evt = {xy: new OpenLayers.Pixel(175, 100), which: 1};
        handler.mousemove(evt);
        handler.mousedown(evt);
        handler.mouseup(evt);
        t.ok(handler.line.geometry.getBounds().equals(new OpenLayers.Bounds(0,-35.15625,35.15625,0)), "Correct bounds");
        // mousedown on (175, 100)
        evt = {xy: new OpenLayers.Pixel(175, 100), which: 1};
        handler.mousedown(evt);
        // mousemove to (125, 100)
        evt = {xy: new OpenLayers.Pixel(125, 100), which: 1};
        handler.mousemove(evt);
        // test that the bounds have changed
        t.ok(!handler.polygon.geometry.getBounds().equals(new OpenLayers.Bounds(0,-35.15625,35.15625,0)),
             "Correct bounds after dragging without letting go. (Came out as "+handler.line.geometry.getBounds().toBBOX() + ".)");
        map.destroy();
    }

    function test_callbacks(t) {
        t.plan(39);
        var map = new OpenLayers.Map("map", {
            resolutions: [1]
        });
        var layer = new OpenLayers.Layer.Vector("foo", {
            maxExtent: new OpenLayers.Bounds(-10, -10, 10, 10),
            isBaseLayer: true
        });
        map.addLayer(layer);
        var control = new OpenLayers.Control({
        });
        var logs = [], log;
        var handler = new OpenLayers.Handler.Polygon(control, {
            create: function() {
                logs.push({type: "create", args: arguments});
            },
            point: function() {
                logs.push({type: "point", args: arguments});
            },
            modify: function() {
                logs.push({type: "modify", args: arguments});
            },
            done: function() {
                logs.push({type: "done", args: arguments});
            },
            cancel: function() {
                logs.push({type: "cancel", args: arguments});
            }
        },
        {
            pixelTolerance: 0
        });
        control.handler = handler;
        map.addControl(control);
        map.setCenter(new OpenLayers.LonLat(0, 0), 0);

        // create polygon
        handler.activate();

        handler.mousemove(
            {type: "mousemove", xy: new OpenLayers.Pixel(0, 0)});
        t.eq(logs.length, 2, "[mousemove] called back");
        log = logs.shift();
        t.eq(log.type, "create", "[activate] create called");
        t.geom_eq(log.args[0], new OpenLayers.Geometry.Point(-150, 75),
                  "[mousemove] correct point");
        t.ok(log.args[1] == handler.polygon,
             "[mousemove] correct feature");
        log = logs.shift();
        t.eq(log.type, "modify", "[mousemove] modify called");
        t.geom_eq(log.args[0], new OpenLayers.Geometry.Point(-150, 75),
                  "[mousemove] correct point");
        t.ok(log.args[1] === handler.polygon,
             "[mousemove] correct feature");
        // mouse down
        handler.mousedown(
            {type: "mousedown", xy: new OpenLayers.Pixel(0, 0)});
        t.eq(logs.length, 1, "[mousedown] called back");
        log = logs.shift();
        t.eq(log.type, "modify", "[mousedown] modify called");
        t.geom_eq(log.args[0], new OpenLayers.Geometry.Point(-150, 75),
                  "[mousedown] correct point");
        t.ok(log.args[1] === handler.polygon,
             "[mousedown] correct feature");
        // mouse up
        handler.mouseup(
            {type: "mouseup", xy: new OpenLayers.Pixel(0, 0)});
        t.eq(logs.length, 2, "[mouseup] called back twice");
        log = logs.shift();
        t.eq(log.type, "point", "[mouseup] point called");
        t.geom_eq(log.args[0], new OpenLayers.Geometry.Point(-150, 75),
                  "[mouseup] correct point");
        var geom = new OpenLayers.Geometry.Polygon([
            new OpenLayers.Geometry.LinearRing([
                new OpenLayers.Geometry.Point(-150, 75)
            ])
        ]);
        geom.components[0].addComponent(
            new OpenLayers.Geometry.Point(-150, 75),
            geom.components[0].components.length
        );
        t.geom_eq(log.args[1], geom, "[mouseup] correct polygon");
        log = logs.shift();
        t.eq(log.type, "modify", "[mouseup] modify called");
        t.geom_eq(log.args[0], new OpenLayers.Geometry.Point(-150, 75),
                  "[mouseup] correct point");
        t.ok(log.args[1] == handler.polygon,
             "[mouseup] correct feature");
        // mouse move
        handler.mousemove(
            {type: "mousemove", xy: new OpenLayers.Pixel(10, 10)});
        t.eq(logs.length, 1, "[mousemove] called back");
        log = logs.shift();
        t.eq(log.type, "modify", "[mousemove] modify called");
        t.geom_eq(log.args[0], new OpenLayers.Geometry.Point(-140, 65),
                  "[mousemove] correct point");
        t.ok(log.args[1] === handler.polygon,
             "[mousemove] correct feature");
        // mouse down
        handler.mousedown(
            {type: "mousedown", xy: new OpenLayers.Pixel(10, 10)});
        t.eq(logs.length, 1, "[mousedown] called back");
        log = logs.shift();
        t.eq(log.type, "modify", "[mousedown] modify called");
        t.geom_eq(log.args[0], new OpenLayers.Geometry.Point(-140, 65),
                  "[mousedown] correct point");
        t.ok(log.args[1] === handler.polygon,
             "[mousedown] correct feature");
        // mouse up
        handler.mouseup(
            {type: "mouseup", xy: new OpenLayers.Pixel(10, 10)});
        log = logs.shift();
        log = logs.shift();
        // move to 0, 10 and double click
        // mouse move
        handler.mousemove(
            {type: "mousemove", xy: new OpenLayers.Pixel(0, 10)});
        t.eq(logs.length, 1, "[mousemove] called back");
        log = logs.shift();
        t.eq(log.type, "modify", "[mousemove] modify called");
        t.geom_eq(log.args[0], new OpenLayers.Geometry.Point(-150, 65),
                  "[mousemove] correct point");
        t.ok(log.args[1] === handler.polygon,
             "[mousemove] correct feature");
        // mouse down
        handler.mousedown(
            {type: "mousedown", xy: new OpenLayers.Pixel(0, 10)});
        t.eq(logs.length, 1, "[mousedown] not called back");
        log = logs.shift();
        // mouse up
        handler.mouseup(
            {type: "mouseup", xy: new OpenLayers.Pixel(0, 10)});
        t.eq(logs.length, 2, "[mouseup] called back");
        log = logs.shift();
        log = logs.shift();
        // mouse down
        handler.mousedown(
            {type: "mousedown", xy: new OpenLayers.Pixel(0, 10)});
        t.eq(logs.length, 0, "[mousedown] not called back");
        // mouse up
        handler.mouseup(
            {type: "mouseup", xy: new OpenLayers.Pixel(0, 10)});
        t.eq(logs.length, 0, "[mouseup] not called back");
        // dblclick
        handler.dblclick(
            {type: "dblclick", xy: new OpenLayers.Pixel(0, 10)});
        t.eq(logs.length, 1, "[dblclick] called back");
        log = logs.shift();
        t.eq(log.type, "done", "[dblclick] done called");
        t.geom_eq(
            log.args[0],
            new OpenLayers.Geometry.Polygon([
                new OpenLayers.Geometry.LinearRing([
                    new OpenLayers.Geometry.Point(-150, 75),
                    new OpenLayers.Geometry.Point(-140, 65),
                    new OpenLayers.Geometry.Point(-150, 65),
                    new OpenLayers.Geometry.Point(-150, 75)
                ])
            ]),
            "[dblclick] correct polygon"
        );
        // cancel
        handler.cancel();
        t.eq(logs.length, 1, "[cancel] called back");
        log = logs.shift();
        t.eq(log.type, "cancel", "[cancel] canced called");

        map.destroy();
    }

    function test_toggle_freehand(t) {
        t.plan(2);
        var map = new OpenLayers.Map("map", {
            resolutions: [1]
        });
        var layer = new OpenLayers.Layer.Vector("foo", {
            maxExtent: new OpenLayers.Bounds(-10, -10, 10, 10),
            isBaseLayer: true
        });
        map.addLayer(layer);
        var control = new OpenLayers.Control({});
        var handler = new OpenLayers.Handler.Polygon(control, {
            done: function(g) {
                log++;
            }
        }, {persist: true});
        control.handler = handler;
        map.addControl(control);
        map.setCenter(new OpenLayers.LonLat(0, 0), 0);

        handler.activate();

        log = 0;
        handler.mousemove(
            {type: "mousemove", xy: new OpenLayers.Pixel(0, 0)});
        handler.mousedown(
            {type: "mousedown", xy: new OpenLayers.Pixel(0, 0), shiftKey: true});
        handler.mousemove(
            {type: "mousemove", xy: new OpenLayers.Pixel(1, 1), shiftKey: true});
        handler.mousemove(
            {type: "mousemove", xy: new OpenLayers.Pixel(2, 2), shiftKey: true});
        handler.mouseup(
            {type: "mouseup", xy: new OpenLayers.Pixel(0, 0), shiftKey: true});
        t.eq(log, 1, "feature drawn when shift pressed on mousedown");

        log = 0;
        handler.mousemove(
            {type: "mousemove", xy: new OpenLayers.Pixel(0, 0)});
        handler.mousedown(
            {type: "mousedown", xy: new OpenLayers.Pixel(0, 0), shiftKey: false});
        handler.mousemove(
            {type: "mousemove", xy: new OpenLayers.Pixel(1, 1), shiftKey: true});
        handler.mousemove(
            {type: "mousemove", xy: new OpenLayers.Pixel(2, 2), shiftKey: true});
        handler.mouseup(
            {type: "mouseup", xy: new OpenLayers.Pixel(0, 0), shiftKey: true});
        t.eq(log, 0, "feature not drawn when shift not pressed on mousedown");
    }

    function test_persist(t) {
        t.plan(4);
        var map = new OpenLayers.Map("map", {
            resolutions: [1]
        });
        var layer = new OpenLayers.Layer.Vector("foo", {
            maxExtent: new OpenLayers.Bounds(-10, -10, 10, 10),
            isBaseLayer: true
        });
        map.addLayer(layer);
        var control = new OpenLayers.Control({});
        var handler = new OpenLayers.Handler.Polygon(control, {});
        control.handler = handler;
        map.addControl(control);
        map.setCenter(new OpenLayers.LonLat(0, 0), 0);

        handler.activate();

        handler.persist = false;
        handler.mousemove(
            {type: "mousemove", xy: new OpenLayers.Pixel(0, 0)});
        var feature1 = handler.polygon;
        handler.mousedown(
            {type: "mousedown", xy: new OpenLayers.Pixel(0, 0)});
        handler.mouseup(
            {type: "mouseup", xy: new OpenLayers.Pixel(0, 0)});
        handler.mousemove(
            {type: "mousemove", xy: new OpenLayers.Pixel(1, 1)});
        handler.mousedown(
            {type: "mousedown", xy: new OpenLayers.Pixel(1, 1)});
        handler.mouseup(
            {type: "mouseup", xy: new OpenLayers.Pixel(1, 1)});
        handler.mousemove(
            {type: "mousemove", xy: new OpenLayers.Pixel(2, 2)});
        handler.dblclick(
            {type: "dblclick", xy: new OpenLayers.Pixel(2, 2)});
        t.ok(feature1.layer == null, "a) feature1 destroyed");

        handler.persist = true;
        handler.mousemove(
            {type: "mousemove", xy: new OpenLayers.Pixel(0, 0)});
        var feature2 = handler.polygon;
        handler.mousedown(
            {type: "mousedown", xy: new OpenLayers.Pixel(0, 0)});
        handler.mouseup(
            {type: "mouseup", xy: new OpenLayers.Pixel(0, 0)});
        handler.mousemove(
            {type: "mousemove", xy: new OpenLayers.Pixel(1, 1)});
        handler.mousedown(
            {type: "mousedown", xy: new OpenLayers.Pixel(1, 1)});
        handler.mouseup(
            {type: "mouseup", xy: new OpenLayers.Pixel(1, 1)});
        handler.mousemove(
            {type: "mousemove", xy: new OpenLayers.Pixel(2, 2)});
        handler.dblclick(
            {type: "dblclick", xy: new OpenLayers.Pixel(2, 2)});
        t.ok(feature2.layer != null, "b) feature2 not destroyed");

        handler.mousemove(
            {type: "mousemove", xy: new OpenLayers.Pixel(0, 0)});
        var feature3 = handler.polygon;
        handler.mousedown(
            {type: "mousedown", xy: new OpenLayers.Pixel(0, 0)});
        handler.mouseup(
            {type: "mouseup", xy: new OpenLayers.Pixel(0, 0)});
        handler.mousemove(
            {type: "mousemove", xy: new OpenLayers.Pixel(1, 1)});
        handler.mousedown(
            {type: "mousedown", xy: new OpenLayers.Pixel(1, 1)});
        handler.mouseup(
            {type: "mouseup", xy: new OpenLayers.Pixel(1, 1)});
        handler.mousemove(
            {type: "mousemove", xy: new OpenLayers.Pixel(2, 2)});
        handler.dblclick(
            {type: "dblclick", xy: new OpenLayers.Pixel(2, 2)});
        t.ok(feature3.layer != null, "c) feature3 not destroyed");
        t.ok(feature2.layer == null, "c) feature2 destroyed");

        map.destroy();
    }

    function test_persist_freehand(t) {
        t.plan(6);
        var map = new OpenLayers.Map("map", {
            resolutions: [1]
        });
        var layer = new OpenLayers.Layer.Vector("foo", {
            maxExtent: new OpenLayers.Bounds(-10, -10, 10, 10),
            isBaseLayer: true
        });
        map.addLayer(layer);
        var control = new OpenLayers.Control({});
        var handler = new OpenLayers.Handler.Polygon(control, {});
        control.handler = handler;
        map.addControl(control);
        map.setCenter(new OpenLayers.LonLat(0, 0), 0);

        handler.activate();

        handler.persist = false;
        handler.mousemove(
            {type: "mousemove", xy: new OpenLayers.Pixel(0, 0)});
        var feature1 = handler.polygon;
        handler.mousedown(
            {type: "mousedown", xy: new OpenLayers.Pixel(0, 0), shiftKey: true});
        handler.mousemove(
            {type: "mousemove", xy: new OpenLayers.Pixel(1, 1), shiftKey: true});
        handler.mousemove(
            {type: "mousemove", xy: new OpenLayers.Pixel(2, 2), shiftKey: true});
        handler.mouseup(
            {type: "mouseup", xy: new OpenLayers.Pixel(2, 2), shiftKey: true});
        t.ok(feature1.layer == null, "a) feature1 destroyed");

        handler.persist = true;
        handler.mousemove(
            {type: "mousemove", xy: new OpenLayers.Pixel(0, 0)});
        var feature2 = handler.polygon;
        handler.mousedown(
            {type: "mousedown", xy: new OpenLayers.Pixel(0, 0), shiftKey: true});
        handler.mousemove(
            {type: "mousemove", xy: new OpenLayers.Pixel(1, 1), shiftKey: true});
        handler.mousemove(
            {type: "mousemove", xy: new OpenLayers.Pixel(2, 2), shiftKey: true});
        handler.mouseup(
            {type: "mouseup", xy: new OpenLayers.Pixel(2, 2), shiftKey: true});
        t.ok(feature2.layer != null, "b) feature2 not destroyed");

        handler.mousemove(
            {type: "mousemove", xy: new OpenLayers.Pixel(0, 0)});
        var feature3 = handler.polygon;
        handler.mousedown(
            {type: "mousedown", xy: new OpenLayers.Pixel(0, 0), shiftKey: true});
        handler.mousemove(
            {type: "mousemove", xy: new OpenLayers.Pixel(1, 1), shiftKey: true});
        handler.mousemove(
            {type: "mousemove", xy: new OpenLayers.Pixel(2, 2), shiftKey: true});
        handler.mouseup(
            {type: "mouseup", xy: new OpenLayers.Pixel(2, 2), shiftKey: true});
        t.ok(feature3.layer != null, "c) feature3 not destroyed");
        t.ok(feature2.layer == null, "c) feature2 destroyed");

        handler.mousemove(
            {type: "mousemove", xy: new OpenLayers.Pixel(0, 0)});
        feature4 = handler.polygon;
        handler.mousedown(
            {type: "mousedown", xy: new OpenLayers.Pixel(0, 0), shiftKey: false});
        handler.mousemove(
            {type: "mousemove", xy: new OpenLayers.Pixel(1, 1), shiftKey: true});
        handler.mousemove(
            {type: "mousemove", xy: new OpenLayers.Pixel(2, 2), shiftKey: true});
        handler.mouseup(
            {type: "mouseup", xy: new OpenLayers.Pixel(0, 0), shiftKey: true});
        t.ok(feature4.layer != null, "d) feature4 not destroyed");
        t.ok(feature3.layer == null, "c) feature3 destroyed");

        map.destroy();
    }

    function test_rings(t) {
        t.plan(12);

        var log = [];
        var map = new OpenLayers.Map({
            div: "map",
            resolutions: [1],
            maxExtent: new OpenLayers.Bounds(-10, -10, 10, 10),
            layers: [
                new OpenLayers.Layer.Vector(null, {
                    isBaseLayer: true,
                    eventListeners: {
                        featureadded: function(event) {
                            log.push(event);
                        },
                        sketchmodified: function(event) {
                            log.push(event);
                        },
                        sketchcomplete: function(event) {
                            log.push(event);
                        }
                    }
                })
            ],
            center: new OpenLayers.LonLat(0, 0),
            zoom: 0
        });

        // create control for drawing polygons with holes
        var draw = new OpenLayers.Control.DrawFeature(
            map.layers[0],
            OpenLayers.Handler.Polygon,
            {handlerOptions: {
                holeModifier: "altKey",
                pixelTolerance: 0
            }}
        );
        map.addControl(draw);
        draw.activate();

        var event;
        function trigger(type, event) {
            map.events.triggerEvent(type, OpenLayers.Util.extend({}, event));
        }

        // a) draw a polygon
        log = [];
        // start at -9, 9
        event = {xy: new OpenLayers.Pixel(-9, 9)};
        trigger("mousemove", event);
        trigger("mousedown", event);
        trigger("mouseup", event);
        // draw to -1, 9
        event = {xy: new OpenLayers.Pixel(-1, 9)};
        trigger("mousemove", event);
        trigger("mousedown", event);
        trigger("mouseup", event);
        // draw to -1, 1
        event = {xy: new OpenLayers.Pixel(-1, 1)};
        trigger("mousemove", event);
        trigger("mousedown", event);
        trigger("mouseup", event);
        // draw to -9, 1
        event = {xy: new OpenLayers.Pixel(-9, 1)};
        trigger("mousemove", event);
        trigger("mousedown", event);
        trigger("mouseup", event);
        // finish
        event = {xy: new OpenLayers.Pixel(-9, 1)};
        trigger("mousedown", event);
        trigger("mouseup", event);
        trigger("dblclick", event);

        // make assertions
        t.eq(log.length, 14, "a) correct number of events");
        t.eq(log[log.length-1].type, "featureadded", "a) featureadded event last");
        t.eq(log[log.length-1].feature.geometry.getArea(), 64, "a) correct polygon area");

        // b) draw a hole
        log = [];
        // start at -6, 6
        event = {xy: new OpenLayers.Pixel(-6, 6), altKey: true};
        trigger("mousemove", event);
        trigger("mousedown", event);
        trigger("mouseup", event);
        // draw to -3, 6
        event = {xy: new OpenLayers.Pixel(-3, 6), altKey: true};
        trigger("mousemove", event);
        trigger("mousedown", event);
        trigger("mouseup", event);
        // draw to -3, 3
        event = {xy: new OpenLayers.Pixel(-3, 3), altKey: true};
        trigger("mousemove", event);
        trigger("mousedown", event);
        trigger("mouseup", event);
        // draw to -6, 3
        event = {xy: new OpenLayers.Pixel(-6, 3), altKey: true};
        trigger("mousemove", event);
        trigger("mousedown", event);
        trigger("mouseup", event);
        // finish
        event = {xy: new OpenLayers.Pixel(-6, 3), altKey: true};
        trigger("mousedown", event);
        trigger("mouseup", event);
        trigger("dblclick", event);

        // make assertions
        t.eq(log.length, 13, "b) correct number of events");
        t.eq(log[log.length-1].type, "sketchcomplete", "b) sketchcomplete event last");
        t.eq(log[log.length-1].feature.geometry.getArea(), 55, "b) correct polygon area");

        // c) draw a polygon that overlaps the first
        log = [];
        // start at -2, 2
        event = {xy: new OpenLayers.Pixel(-2, 2)};
        trigger("mousemove", event);
        trigger("mousedown", event);
        trigger("mouseup", event);
        // draw to 2, 2
        event = {xy: new OpenLayers.Pixel(2, 2)};
        trigger("mousemove", event);
        trigger("mousedown", event);
        trigger("mouseup", event);
        // draw to 2, -2
        event = {xy: new OpenLayers.Pixel(2, -2)};
        trigger("mousemove", event);
        trigger("mousedown", event);
        trigger("mouseup", event);
        // draw to -2, -2
        event = {xy: new OpenLayers.Pixel(-2, -2)};
        trigger("mousemove", event);
        trigger("mousedown", event);
        trigger("mouseup", event);
        // finish
        event = {xy: new OpenLayers.Pixel(-2, -2)};
        trigger("mousedown", event);
        trigger("mouseup", event);
        trigger("dblclick", event);

        // make assertions
        t.eq(log.length, 14, "c) correct number of events");
        t.eq(log[log.length-1].type, "featureadded", "c) featureadded event last");
        t.eq(log[log.length-1].feature.geometry.getArea(), 16, "c) correct polygon area");

        // d) draw a hole that tries to go outside the exterior ring
        log = [];
        // start at -1, 1
        event = {xy: new OpenLayers.Pixel(-1, 1), altKey: true};
        trigger("mousemove", event);
        trigger("mousedown", event);
        trigger("mouseup", event);
        // draw to 1, 1
        event = {xy: new OpenLayers.Pixel(1, 1), altKey: true};
        trigger("mousemove", event);
        trigger("mousedown", event);
        trigger("mouseup", event);
        // try to draw to -8, 8 (ouside active polygon)
        event = {xy: new OpenLayers.Pixel(-8, 8), altKey: true};
        trigger("mousemove", event);
        trigger("mousedown", event);
        trigger("mouseup", event);
        // draw to 1, -1
        event = {xy: new OpenLayers.Pixel(1, -1), altKey: true};
        trigger("mousemove", event);
        trigger("mousedown", event);
        trigger("mouseup", event);
        // draw to -1, -1
        event = {xy: new OpenLayers.Pixel(-1, -1), altKey: true};
        trigger("mousemove", event);
        trigger("mousedown", event);
        trigger("mouseup", event);
        // finish
        event = {xy: new OpenLayers.Pixel(-1, 1), altKey: true};
        trigger("mousedown", event);
        trigger("mouseup", event);
        trigger("dblclick", event);

        // make assertions
        t.eq(log.length, 18, "d) correct number of events");
        t.eq(log[log.length-1].type, "sketchcomplete", "d) sketchcomplete event last");
        t.eq(log[log.length-1].feature.geometry.getArea(), 12, "d) correct polygon area");

        map.destroy();
    }

    function test_Handler_Polygon_destroy(t) {
        t.plan(8);
        var map = new OpenLayers.Map('map');
        map.addLayer(new OpenLayers.Layer.WMS("", "", {}));
        map.zoomToMaxExtent();
        var control = new OpenLayers.Control();
        map.addControl(control);
        var handler = new OpenLayers.Handler.Polygon(control, {foo: 'bar'});

        handler.activate();
        var evt = {xy: new OpenLayers.Pixel(150, 75), which: 1};
        handler.mousedown(evt);

        t.ok(handler.layer,
             "handler has a layer prior to destroy");
        t.ok(handler.point,
             "handler has a point prior to destroy");
        t.ok(handler.line,
             "handler has a line prior to destroy");
        t.ok(handler.polygon,
             "handler has a polygon prior to destroy");
        handler.destroy();
        t.eq(handler.layer, null,
             "handler.layer is null after destroy");
        t.eq(handler.point, null,
             "handler.point is null after destroy");
        t.eq(handler.line, null,
             "handler.line is null after destroy");
        t.eq(handler.polygon, null,
             "handler.polygon is null after destroy");
        map.destroy();
    }

    function test_insertXY(t) {
        t.plan(3);
        var map = new OpenLayers.Map("map", {
            resolutions: [1]
        });
        var layer = new OpenLayers.Layer.Vector("foo", {
            maxExtent: new OpenLayers.Bounds(-10, -10, 10, 10),
            isBaseLayer: true
        });
        map.addLayer(layer);
        var control = new OpenLayers.Control.DrawFeature(
            layer, OpenLayers.Handler.Polygon
        );
        map.addControl(control);
        map.setCenter(new OpenLayers.LonLat(0, 0), 0);

        control.activate();
        var handler = control.handler;

        function userClick(x, y) {
            var px = new OpenLayers.Pixel(x, y);
            handler.mousemove({type: "mousemove", xy: px});
            handler.mousedown({type: "mousedown", xy: px});
            handler.mouseup({type: "mouseup", xy: px});
        }

        // add points at px(0, 0) and px(10, 10)
        userClick(0, 0);
        userClick(10, 10);
        t.eq(handler.line.geometry.components.length, 4, "ring has four points after two clicks");

        // programmatically add a point
        handler.insertXY(5, 6);
        t.eq(handler.line.geometry.components.length, 5, "ring has five points after insertXY");
        t.geom_eq(
            handler.line.geometry.components[2],
            new OpenLayers.Geometry.Point(5, 6),
            "third point comes from insertXY"
        );

        map.destroy();

    }

    //
    // Sequence tests
    //
    // Sequence tests basically involve executing a sequence of events
    // and testing the resulting geometry.
    //
    // Below are tests for various drawing sequences. Tests can be
    // added here each a non-working sequence is found.
    //

    // stopDown:true, stopUp:true
    // a) click on (0, 0)
    // b) mousedown on (0.5, 0.5)
    // c) mouseup on (1, 1)
    // d) click on (0, 10)
    // e) dblclick on (10, 10)
    function test_sequence1(t) {
        t.plan(1);
        var map = new OpenLayers.Map("map", {
            resolutions: [1]
        });
        var layer = new OpenLayers.Layer.Vector("foo", {
            maxExtent: new OpenLayers.Bounds(-10, -10, 10, 10),
            isBaseLayer: true
        });
        map.addLayer(layer);
        var control = new OpenLayers.Control({});
        var handler = new OpenLayers.Handler.Polygon(control,
            {done: function(g) { log.geometry = g; }},
            {stopDown: true, stopUp: true,
            pixelTolerance: 0}
        );
        control.handler = handler;
        map.addControl(control);
        map.setCenter(new OpenLayers.LonLat(0, 0), 0);

        handler.activate();
        log = {};

        // a) click on (0, 0)
        handler.mousemove(
            {type: "mousemove", xy: new OpenLayers.Pixel(0, 0)});
        handler.mousedown(
            {type: "mousedown", xy: new OpenLayers.Pixel(0, 0)});
        handler.mouseup(
            {type: "mouseup", xy: new OpenLayers.Pixel(0, 0)});
        // b) mousedown on (0.5, 0.5)
        handler.mousemove(
            {type: "mousemove", xy: new OpenLayers.Pixel(0.5, 0.5)});
        handler.mousedown(
            {type: "mousedown", xy: new OpenLayers.Pixel(0.5, 0.5)});
        // c) mouseup on (1, 1)
        handler.mousemove(
            {type: "mousemove", xy: new OpenLayers.Pixel(1, 1)});
        handler.mouseup(
            {type: "mouseup", xy: new OpenLayers.Pixel(1, 1)});
        // d) click on (0, 10)
        handler.mousemove(
            {type: "mousemove", xy: new OpenLayers.Pixel(0, 10)});
        handler.mousedown(
            {type: "mousedown", xy: new OpenLayers.Pixel(0, 10)});
        handler.mouseup(
            {type: "mouseup", xy: new OpenLayers.Pixel(0, 10)});
        // e) dblclick on (10, 10)
        handler.mousemove(
            {type: "mousemove", xy: new OpenLayers.Pixel(10, 10)});
        handler.mousedown(
            {type: "mousedown", xy: new OpenLayers.Pixel(10, 10)});
        handler.mouseup(
            {type: "mouseup", xy: new OpenLayers.Pixel(10, 10)});
        handler.dblclick(
            {type: "dblclick", xy: new OpenLayers.Pixel(10, 10)});
        t.geom_eq(log.geometry,
            new OpenLayers.Geometry.Polygon([
                new OpenLayers.Geometry.LinearRing([
                    new OpenLayers.Geometry.Point(-150, 75), // (0, 0)
                    new OpenLayers.Geometry.Point(-150, 65), // (0, 10)
                    new OpenLayers.Geometry.Point(-140, 65)  // (10, 10)
                ])
            ]), "geometry is correct");
    }

    // stopDown:false, stopUp:false
    // a) click on (0, 0)
    // b) mousedown on (0.5, 0.5)
    // c) mouseup on (1, 1)
    // d) click on (0, 10)
    // e) dblclick on (10, 10)
    function test_sequence2(t) {
        t.plan(1);
        var map = new OpenLayers.Map("map", {
            resolutions: [1]
        });
        var layer = new OpenLayers.Layer.Vector("foo", {
            maxExtent: new OpenLayers.Bounds(-10, -10, 10, 10),
            isBaseLayer: true
        });
        map.addLayer(layer);
        var control = new OpenLayers.Control({});
        var handler = new OpenLayers.Handler.Polygon(control,
            {done: function(g) { log.geometry = g; }},
            {stopDown: false, stopUp: false,
            pixelTolerance: 0}
        );
        control.handler = handler;
        map.addControl(control);
        map.setCenter(new OpenLayers.LonLat(0, 0), 0);

        handler.activate();
        log = {};

        // a) click on (0, 0)
        handler.mousemove(
            {type: "mousemove", xy: new OpenLayers.Pixel(0, 0)});
        handler.mousedown(
            {type: "mousedown", xy: new OpenLayers.Pixel(0, 0)});
        handler.mouseup(
            {type: "mouseup", xy: new OpenLayers.Pixel(0, 0)});
        // b) mousedown on (0.5, 0.5)
        handler.mousemove(
            {type: "mousemove", xy: new OpenLayers.Pixel(0.5, 0.5)});
        handler.mousedown(
            {type: "mousedown", xy: new OpenLayers.Pixel(0.5, 0.5)});
        // c) mouseup on (1, 1)
        handler.mousemove(
            {type: "mousemove", xy: new OpenLayers.Pixel(1, 1)});
        handler.mouseup(
            {type: "mouseup", xy: new OpenLayers.Pixel(1, 1)});
        // d) click on (0, 10)
        handler.mousemove(
            {type: "mousemove", xy: new OpenLayers.Pixel(0, 10)});
        handler.mousedown(
            {type: "mousedown", xy: new OpenLayers.Pixel(0, 10)});
        handler.mouseup(
            {type: "mouseup", xy: new OpenLayers.Pixel(0, 10)});
        // e) dblclick on (10, 10)
        handler.mousemove(
            {type: "mousemove", xy: new OpenLayers.Pixel(10, 10)});
        handler.mousedown(
            {type: "mousedown", xy: new OpenLayers.Pixel(10, 10)});
        handler.mouseup(
            {type: "mouseup", xy: new OpenLayers.Pixel(10, 10)});
        handler.dblclick(
            {type: "dblclick", xy: new OpenLayers.Pixel(10, 10)});
        t.geom_eq(log.geometry,
            new OpenLayers.Geometry.Polygon([
                new OpenLayers.Geometry.LinearRing([
                    new OpenLayers.Geometry.Point(-150, 75), // (0, 0)
                    new OpenLayers.Geometry.Point(-150, 65), // (0, 10)
                    new OpenLayers.Geometry.Point(-140, 65)  // (10, 10)
                ])
            ]), "geometry is correct");
    }

    // a) tap
    // b) tap
    // c) doubletap
    function test_touch_sequence1(t) {
        t.plan(26);

        // set up

        var log;
        var map = new OpenLayers.Map("map", {
            resolutions: [1]
        });
        var layer = new OpenLayers.Layer.Vector("foo", {
            maxExtent: new OpenLayers.Bounds(-10, -10, 10, 10),
            isBaseLayer: true
        });
        map.addLayer(layer);
        var control = new OpenLayers.Control({});
        var handler = new OpenLayers.Handler.Polygon(control, {
            done: function(g, f) {
                log = {type: 'done', geometry: g, feature: f};
            },
            modify: function(g, f) {
                log = {type: 'modify', geometry: g, feature: f};
            }
        }, {
            doubleTouchTolerance: 2
        });
        control.handler = handler;
        map.addControl(control);
        map.setCenter(new OpenLayers.LonLat(0, 0), 0);
        handler.activate();

        // test

        var ret;

        // tap on (0, 0)
        log = null;
        ret = handler.touchstart({xy: new OpenLayers.Pixel(1, 0)});
        t.ok(ret, '[touchstart] event propagates');
        t.eq(log, null, '[touchstart] feature not finalized or modified');
        ret = handler.touchmove({xy: new OpenLayers.Pixel(0, 0)});
        t.ok(ret, '[touchmove] event propagates');
        t.eq(log, null, '[touchmove] feature not finalized or modified');
        ret = handler.touchend({});
        t.ok(ret, '[touchend] event propagates');
        t.eq(log.type, 'modify', '[touchend] feature modified');
        t.geom_eq(log.geometry, new OpenLayers.Geometry.Point(-150, 75),
                  "[touchend] correct point");

        // tap on (0, 10)
        log = null;
        ret = handler.touchstart({xy: new OpenLayers.Pixel(1, 10)});
        t.ok(ret, '[touchstart] event propagates');
        t.eq(log, null, '[touchstart] feature not finalized or modified');
        ret = handler.touchmove({xy: new OpenLayers.Pixel(0, 10)});
        t.ok(ret, '[touchmove] event propagates');
        t.eq(log, null, '[touchmove] feature not finalized or modified');
        ret = handler.touchend({});
        t.ok(ret, '[touchend] event propagates');
        t.eq(log.type, 'modify', '[touchend] feature modified');
        t.geom_eq(log.geometry, new OpenLayers.Geometry.Point(-150, 65),
                  "[touchend] correct point");

        // doubletap on (10, 10)
        log = null;
        ret = handler.touchstart({xy: new OpenLayers.Pixel(9, 10)});
        t.ok(ret, '[touchstart] event propagates');
        t.eq(log, null, '[touchstart] feature not finalized or modified');
        ret = handler.touchmove({xy: new OpenLayers.Pixel(10, 10)});
        t.ok(ret, '[touchmove] event propagates');
        t.eq(log, null, '[touchmove] feature not finalized or modified');
        ret = handler.touchend({});
        t.ok(ret, '[touchend] event propagates');
        t.eq(log.type, 'modify', '[touchend] feature modified');
        t.geom_eq(log.geometry, new OpenLayers.Geometry.Point(-140, 65),
                  "[touchend] correct point");
        log = null;
        ret = handler.touchstart({xy: new OpenLayers.Pixel(11, 10)});
        t.ok(!ret, '[touchstart] event does not propagate');
        t.eq(log.type, 'done', '[touchend] feature finalized');
        t.geom_eq(log.geometry,
            new OpenLayers.Geometry.Polygon([
                new OpenLayers.Geometry.LinearRing([
                    new OpenLayers.Geometry.Point(-150, 75), // (0, 0)
                    new OpenLayers.Geometry.Point(-150, 65), // (0, 10)
                    new OpenLayers.Geometry.Point(-140, 65)  // (10, 10)
                ])
            ]), "[touchstart] geometry is correct");
        log = null;
        ret = handler.touchend({});
        t.ok(ret, '[touchend] event propagates');
        t.eq(log, null, '[touchend] feature not finalized or modified');

        // tear down

        map.destroy();
    }

    // a) tap
    // b) tap-move
    // c) tap
    // d) doubletap
    function test_touch_sequence2(t) {
        t.plan(32);

        // set up

        var log;
        var map = new OpenLayers.Map("map", {
            resolutions: [1]
        });
        var layer = new OpenLayers.Layer.Vector("foo", {
            maxExtent: new OpenLayers.Bounds(-10, -10, 10, 10),
            isBaseLayer: true
        });
        map.addLayer(layer);
        var control = new OpenLayers.Control({});
        var handler = new OpenLayers.Handler.Polygon(control, {
            done: function(g, f) {
                log = {type: 'done', geometry: g, feature: f};
            },
            modify: function(g, f) {
                log = {type: 'modify', geometry: g, feature: f};
            }
        }, {
            doubleTouchTolerance: 2
        });
        control.handler = handler;
        map.addControl(control);
        map.setCenter(new OpenLayers.LonLat(0, 0), 0);
        handler.activate();

        // test

        var ret;

        // tap on (0, 0)
        log = null;
        ret = handler.touchstart({xy: new OpenLayers.Pixel(1, 0)});
        t.ok(ret, '[touchstart] event propagates');
        t.eq(log, null, '[touchstart] feature not finalized or modified');
        ret = handler.touchmove({xy: new OpenLayers.Pixel(0, 0)});
        t.ok(ret, '[touchmove] event propagates');
        t.eq(log, null, '[touchmove] feature not finalized or modified');
        ret = handler.touchend({});
        t.ok(ret, '[touchend] event propagates');
        t.eq(log.type, 'modify', '[touchend] feature modified');
        t.geom_eq(log.geometry, new OpenLayers.Geometry.Point(-150, 75),
                  "[touchend] correct point");

        // tap-move
        log = null;
        ret = handler.touchstart({xy: new OpenLayers.Pixel(1, 10)});
        t.ok(ret, '[touchstart] event propagates');
        t.eq(log, null, '[touchstart] feature not finalized or modified');
        ret = handler.touchmove({xy: new OpenLayers.Pixel(20, 20)});
        t.ok(ret, '[touchmove] event propagates');
        t.eq(log, null, '[touchmove] feature not finalized or modified');
        ret = handler.touchend({});
        t.ok(ret, '[touchend] event propagates');
        t.eq(log, null, '[touchend] feature not finalized or modified');

        // tap on (0, 10)
        log = null;
        ret = handler.touchstart({xy: new OpenLayers.Pixel(1, 10)});
        t.ok(ret, '[touchstart] event propagates');
        t.eq(log, null, '[touchstart] feature not finalized or modified');
        ret = handler.touchmove({xy: new OpenLayers.Pixel(0, 10)});
        t.ok(ret, '[touchmove] event propagates');
        t.eq(log, null, '[touchmove] feature not finalized or modified');
        ret = handler.touchend({});
        t.ok(ret, '[touchend] event propagates');
        t.eq(log.type, 'modify', '[touchend] feature modified');
        t.geom_eq(log.geometry, new OpenLayers.Geometry.Point(-150, 65),
                  "[touchend] correct point");

        // doubletap on (10, 10)
        log = null;
        ret = handler.touchstart({xy: new OpenLayers.Pixel(9, 10)});
        t.ok(ret, '[touchstart] event propagates');
        t.eq(log, null, '[touchstart] feature not finalized or modified');
        ret = handler.touchmove({xy: new OpenLayers.Pixel(10, 10)});
        t.ok(ret, '[touchmove] event propagates');
        t.eq(log, null, '[touchmove] feature not finalized or modified');
        ret = handler.touchend({});
        t.ok(ret, '[touchend] event propagates');
        t.eq(log.type, 'modify', '[touchend] feature modified');
        t.geom_eq(log.geometry, new OpenLayers.Geometry.Point(-140, 65),
                  "[touchend] correct point");
        log = null;
        ret = handler.touchstart({xy: new OpenLayers.Pixel(11, 10)});
        t.ok(!ret, '[touchstart] event does not propagate');
        t.eq(log.type, 'done', '[touchend] feature finalized');
        t.geom_eq(log.geometry,
            new OpenLayers.Geometry.Polygon([
                new OpenLayers.Geometry.LinearRing([
                    new OpenLayers.Geometry.Point(-150, 75), // (0, 0)
                    new OpenLayers.Geometry.Point(-150, 65), // (0, 10)
                    new OpenLayers.Geometry.Point(-140, 65)  // (10, 10)
                ])
            ]), "[touchstart] geometry is correct");
        log = null;
        ret = handler.touchend({});
        t.ok(ret, '[touchend] event propagates');
        t.eq(log, null, '[touchend] feature not finalized or modified');

        // tear down

        map.destroy();
    }

  </script>
</head>
<body>
    <div id="map" style="width: 300px; height: 150px;"/>
</body>
</html>

redpajama_set_name: RedPajamaGithub


Greening Sacred Spaces is holding an informative workshop about "How to Go Green and Save Money". Those who attend will learn how to save money on energy in their faith building. The SaveOnEnergy savings incentive program will be presented (50% off for energy audits and retrofit actions in your building: lighting, insulation, cooling and temperature controls).
We will have small group discussions on waste management and recycling, community garden, energy and water conservation.
In addition, we will also provide information about HAP (Home Assistance Program) that provides free energy audits for low income qualified residents.


Today you can meet the costumed characters in the roles of bodyguards, court officials, maids of honour and servants who will welcome you into 16th century life. Families can have fun in the palace vaults where children can try out activities such as dressing in period costume and playing medieval instruments. Don't miss a guided tour with knowledgeable staff who will bring the castle's infamous characters and history to life in great detail.
Other highlights include the Great Hall, Chapel Royal, Castle Exhibition, Regimental Museum, Great Kitchens, Tapestry Studio and the nearby Argyll's Lodging, a 17th century town house.
There is a restaurant, the Unicorn Café, which offers a range of hot and cold drinks and food. Marvel at the spectacular views from the roof top terrace while you enjoy a freshly-prepared Scottish meal.
There are three gift shops which stock a wide selection of gifts and souvenirs.
With beautiful gardens to unwind in, costumed performers who bring history to life and welcoming staff, the award-winning Stirling Castle is a must-see for all the family.


Cleveland State offers admission to current high school students through the College Credits Plus program. We offer admission at the undergraduate (bachelor and post -baccalaureate), graduate (master and doctorate), and law degree level. Additionally, we offer admission for both undergraduate and graduate certificate and licensure programs. Students may also attend as guests (non-degree, transient, cross-registration, or through our Project 60 program) or enroll as a dual admission/partnership program student with three of the area community colleges (Lakeland, Lorain, and Tri-C).


text:
Tag Archives: Flathead Basin Commission
New advocacy group to watchdog aquatic invasive species efforts
July 17, 2018 Environmental Issues, Newsaquatic invasive species, Flathead Basin Commission, invasive mussels, Montana DNRC, Watershed Protection Advocatesnfpa
Late last year, Montana DNRC managed to kill funding for the Flathead Basin Commission. The FBC had been getting a little too pushy, especially in regards to Aquatic Invasive Species (AIS) prevention efforts. Well, it appears those annoying folks popped right back up as an independent organization named Watershed Protection Advocates . . .
A new player has emerged in the fight for the protection of the region's waters, and next month the Watershed Protection Advocates of Northwest Montana will begin filling out its own "report card" on other agencies in the region.
The new advocacy group was formed by a number of former Flathead Basin Commission board members after the Flathead Basin Protection Fund pulled its financial support of the commission.
Watershed Protection Advocates is chaired by former Flathead Basin Commission chairperson Jan Metzmaker, and former Flathead Basin Commission Executive Director Caryn Miske is the sole contractor for the new advocacy group. Miske was terminated form her position on the commission in February following a series of allegations of misconduct made by Department of Natural Resources and Conservation officials.
Pilot program to combat mussels in the Flathead in trouble
December 19, 2017 Environmental Issues, NewsFlathead Basin Commission, Flathead Lake, invasive musselsnfpa
One has to wonder if there's a connection between the administrative uproar over a pilot program to combat invasive mussels in Flathead Lake and the defunding for supposed budgetary reasons of the organization tasked to oversee the program.
Anyway, here's a good summary of the situation as it stands right now . . .
A legislatively mandated program aimed at enhancing protection from invasive mussels entering the Flathead Basin is beset with challenges as the group charged with implementing the plan has had its budget dissolved, while two state agencies say its key provisions cannot legally be implemented.
As part of House Bill 622, a bill introduced by four Flathead lawmakers, the Legislature gave the Flathead Basin Commission authority to establish and manage the Upper Columbia aquatic invasive species (AIS) pilot program. The program would add more certification stations in the Flathead Basin, track vessels that require decontamination, and add the use of automated inspection and detection devices.
The pilot program would have been paid for by requiring boat owners launching boats in the basin to purchase a sticker, which was expected to raise between $1 million and $1.5 million and pay for additional inspection stations.
Larry Wilson: Loss of funding to Flathead Basin Commission disappointing
December 14, 2017 Commentary, Environmental IssuesFlathead Basin Commission, Larry Wilsonnfpa
Larry Wilson takes the Montana DNRC to task for eliminating the Flathead Basin Commission's funding . . .
I am very disappointed that Montana has cut funding to the Flathead Basin Commission. That commission has generated more funds and done more good than most state agencies, so we should probably not be surprised that it is easy to dismantle.
My memory may not be completely accurate, but as I recall, the Basin Commission was the brainchild of a state legislator named Jean Turnage, who later became a Supreme Court Justice. The purpose of the FBC was to monitor and protect water quality in the Flathead Basin. Included were the Park Superintendant, Forest Service Supervisor, private companies and citizens appointed to by the governor and agencies like the Confederated Tribes and others I do not recall.
There was hardly any budget. When I was appointed as a citizen member, the commission was supervised by a member of the governor's staff who had many other duties and was not easy to contact.
Thompson Smith: An urgent call to save a guardian of the Flathead
October 28, 2017 Commentary, Environmental Issuesaquatic invasive species, Flathead Basin Commission, Flathead Lake, invasive musselsnfpa
Thompson Smith, former chair and a three-term governor appointed citizen member of the Flathead Basin Commission, has an excellent op-ed posted to the Flathead Beacon this week concerning the potential de-funding of the Flathead Basin Commission . . .
Montana's crown jewel is in imminent danger from a plan to marginalize the Flathead Basin Commission (FBC) and force out its excellent Executive Director Caryn Miske.
John Tubbs, director of the Department of Natural Resources and Conservation (DNRC), recently proposed zeroing out the entire staff budget of the FBC. The official reason is that the budget impasse between Democrats and Republicans is now forcing agencies to cut 10 percent. That doesn't pass the smell test. Within the DNRC, only the FBC is being targeted for a cut exceeding 70 percent – even though it constitutes just two-tenths of one percent of the department's total budget. In fact, the proposed cut would actually result in Montana losing funding, because every year the FBC's Miske has raised well over a half-million dollars in grant funds to bolster protection of the Flathead from the menace of aquatic invasive species (AIS).
If approved by the governor, this cut would destroy Montana's best and most accomplished watershed organization in the AIS fight. It would also come down at a critical moment, with non-native mussels now confirmed in Tiber Reservoir, less than a three-hour drive from Marias Pass. Continue reading Thompson Smith: An urgent call to save a guardian of the Flathead →
Pilot program to protect Flathead Basin from mussels threatened
October 11, 2017 Environmental Issues, NewsFlathead Basin Commission, invasive mussels, Montana DNRCnfpa
Zebra Mussel Shells Cover a Lake Michigan Limestone Beach in Door County Wisconsin – PJ Bruno
This is an informative article about the issues surrounding invasive mussels in the Flathead Basin. Many of these problems are administrative, but the biggest one is not: DNRC Director John Tubbs wants to grab the money allocated to the Flathead Basin Commission and use it elsewhere . . .
A legislatively mandated pilot program designed to enhance protection from invasive mussels in the Flathead Basin is facing challenges on two fronts.
As part of HB 622, the Legislature gave the Flathead Basin Commission authority to establish and manage the Upper Columbia pilot program. The program would add more certification stations, track vessels that require decontamination, and add the use of automated inspection and detection devices.
The commission also could petition the state's Fish and Wildlife Commission to adopt rules for the Flathead Basin that would require inspection of all vessels before they launch; prohibit or restrict some vessels, including waterborne airplanes and aquatic weed harvesters; and close waters where invasive mussels have been detected until a containment strategy was implemented.
Flathead Basin Commission's future in limbo
October 3, 2017 Environmental Issues, NewsFlathead Basin Commission, Flathead Lakenfpa
Flathead Lake Bio Station
Here's a long but important article on the past, present and future of the Flathead Basin Commission . . .
Long before Montana's state government created the Flathead Basin Commission to safeguard its waters, sprawling coal deposits lay hidden in the wilds of British Columbia, untapped and untouched. They ran in seams beneath a skinny track of wilderness just north of Glacier National Park, at a site overlooking the Canadian Flathead River, which spills south, crosses the international boundary and becomes the North Fork Flathead River.
Against all odds, that coal remains hidden today — still entombed in the strata, thanks in large part to the region's foremost water-quality watchdog group. But even as the transboundary Flathead enjoys permanent protections from future mining or drilling, the fate of the legislatively established Flathead Basin Commission hangs in limbo due to looming budget cuts that threaten to render the group inoperable.
On the heels of slumping state revenue and skyrocketing firefighting costs, Gov. Steve Bullock is directing most state agency directors to trim 10 percent from their budgets. To achieve that goal, Department of Natural Resources and Conservation Director John Tubbs has recommended cutting the Flathead Basin Commission's entire budget for fiscal year 2018, which totaled $148,932, as well as its budget for fiscal year 2019.
The fate of the Flathead
March 1, 2017 Environmental Issues, Newsaquatic invasive species, Flathead Basin Commission, quagga mussels, zebra musselsnfpa
Thompson Smith, chair of the Flathead Basin Commission, has an excellent op-ed in the Flathead Beacon discussing the importance of aggressive efforts to block further spread of invasive mussels throughout Montana's waters . . .
In early November, state officials announced the first documented presence of zebra and quagga mussels in Montana, after positive tests at sites in the Missouri River system.
For the Flathead Basin, these devastating invasive species are now at our doorstep: just a few hours away for people hauling boats from Tiber Reservoir.
In coming days, our ability to protect Montana's remaining non-infested waters will be determined by the Aquatic Invasive Species (AIS) legislation and rule-making now being finalized in Helena. What is emerging appears to be a far more robust AIS program, and it should be passed. But the devil is in the details. Experts point to a number of deficiencies that must be addressed.
First, it is important to understand that if invasive mussels do become established here, they would ravage both the aquatic environment and the economy. Tiny, razor-sharp shells would coat and clog every hard surface — rocks, boats, pipes, docks, dams. They could ultimately cause the collapse of native fisheries, a vital cultural resource and linchpin of the recreation industry. They would wreak havoc with irrigation systems, power facilities, and municipal water supply and treatment.
Once established, invasive mussels are virtually impossible to remove. The whole game is prevention.
Continue reading The fate of the Flathead →
Stalemate, some success, retirement
January 11, 2009 Environmental Issues, NewsBC, British Columbia, Canadian Flathead, Cline Mining, coal mining, coalbed methane, Flathead Basin Commission, North Fork Flathead River, Rich Moynfpa
From the Sunday, January 11, 2009 online edition of the Missoulian . . .
The coal was here, hidden by a thin skin of wilderness, long before Rich Moy arrived; and it was still here, against all odds, when he left.
That, he considers, is at least some sort of success, although much more work will be required to keep it there, buried beneath what's wild.
"In many ways, it's been a stalemate for 30 years," Moy said. "We haven't lost much ground, but we haven't gained any, either. The Canadian Flathead and the wilderness north of Glacier National Park have been and will be a flashpoint of international controversy."
When Moy arrived on this backcountry battlefield, nearly three decades ago, the then-new controversy centered on a proposed Canadian coal mine to be built just a few miles north of Glacier Park.
When he finally retired last month, on the last day of 2008, the now-old controversy centered on yet another coal mine proposed in the headwaters, and a second coal mine in the river bottom, and a gold mine, and a phosphate mine, and an ongoing search for coalbed methane.
"In all these decades," he said, "the British Columbia government has never wavered in its desire to industrialize the Flathead."
Read the entire article . . .

redpajama_set_name: RedPajamaCommonCrawl


text:
Alcatel Onetouch Pop 3 (Unlocked, Used)
Alcatel has a well-deserved reputation for quality and affordability, and this is very evident in the One Touch Pop 3 (5.5). With a huge 5.5″ 720p display and a quad-core processor, performance is excellent.
The One Touch Pop 3 achieved a Mr Aberthon ranking of 9.3/10 and is fully covered by our no-quibble 14 Day Returns Policy
Universally unlocked to AT&T, T-Mobile and Select Prepaid GSM Supported Carriers (Please call your network provider for further assistance to confirm its compatibility.)
8GB internal memory
Holds an SD card up to 256 GB
Screen size 5.5″
Cat S60 (Unlocked, Like New)
The Cat S60 is a truly rugged phone from the kings of all things rugged. As well as everything you'd expect from a modern smartphone, the Cat S60 has a thermal camera built in which really sets it apart from the crowd. The S60 is fully covered by our unbeatable 14 Day Returns Policy for extra peace of mind.
32GB Internal Memory
IP68-certified and MIL-STD-810G compliant – Rugged device
Octa-Core processor
Samsung Galaxy J7 (Unlocked, Brand New)
Samsung's Galaxy range of smartphones and tablets sets out to cater for all budgets, without compromising quality. The flagship S range takes the lead, of course, but following very closely behind is the more cost-conscious J range. The J7 heads up this particular product line, bringing mid-range smartphones firmly onto the heels of its flagship brethren. The Samsung Galaxy J7 achieved a Mr Aberthon ranking of 9.5. It is also covered by our amazing 14 Day Returns Policy for truly stress-free buying.
As with all Mr Aberthon devices, the Galaxy J7 comes fully unlocked from any network, making it available for use in over 160 countries worldwide.
Model Number: SM-J700T1
Front camera: 16MP, Rear camera: 5MP
Samsung Galaxy Grand 2 (Unlocked, Like New)
The Samsung Galaxy Grand 2 is a smartphone from the world's biggest electronics manufacturer. Powerful and stylish, with an 8MP camera and storage up to 64GB, the Grand 2 is designed to meet all your needs and expectations.
Like all Mr Aberthon smartphones, the Galaxy Grand 2 is brand new, fully unlocked and is covered by our fantastic 14 Day, No Hassle, Returns Policy
This phone is universal unlocked and has no carrier branding.
Unlocked to AT&T, T-Mobile and Select Prepaid GSM Supported Carriers (Please call your network provider for further assistance to confirm its compatibility.)
Samsung Galaxy Grand Prime – Dual SIM (T-Mobile Locked, Used)
With a name like "Grand Prime", you would be forgiven for expecting this particular Samsung offering to be pretty huge but, well, it isn't. The Grand Prime part of the name is there to describe the spectacular 5" HD screen that sits perfectly on the front face.
This device is unlocked to all GSM networks and is brand new. It is covered by our Mr Aberthon 14 day return policy, no questions asked.
Wide Selfie mode
Screen size 5″ HD
LG Nexus 5 (Unlocked, Brand New)
Mr Aberthon is proud to present the LG Nexus 5, completely universally unlocked with no carrier branding and is brand new. This device is the 32GB model.
This phone is completely covered by the Mr Aberthon warranty. We offer a 14 days return, no questions asked. Click here to find out more of our most frequently asked questions.
US Model Number – D820.
Unfortunately, Google Project Fi is not compatible with this device. It is compatible with the Nexus 5X as well as the Nexus 6.
Universally unlocked to Sprint, Verizon, AT&T, T-Mobile, and Select Prepaid GSM Supported Carriers (Please call your network provider for further assistance to confirm its compatibility.)
Wireless charging technology
Processor of 2.26 GHz Quad-Core Processor, Qualcomm® Snapdragon™ 800 MSM8974 Chipset
Brand New (3)
Like New (1)
Slightly Used (1)
Any Android Operating SystemAndroid 4.2.2 (Jelly Bean)Android 4.4.2 (KitKat)Android 5.0 (Lollipop)Android 5.1 (Lollipop)Android 6.0 (Marshmallow)Android 6.0.1 (Marshmallow)
Any Front Camera Resolution1.9 MP2 MP5 MP


text:
Zhang Qian , född 195 f.Kr. i Hanzhong, död 113 f.Kr., var en kinesisk resenär och diplomat under Handynastin.

Han utsändes 138 f.Kr. av kejsar Han Wudi för att sluta förbund med folket yuezhi mot xiongnu, tillfångatogs av dessa, rymde och fortsatte resan västerut och gjorde en stor rundtur i Främre Orienten. Över Ilidalen kom han till Tawan (Ferghana), till Kang-kü (Sogdiana, nuvarande Samarkand), till Oxus och ända ned till Baktrien.

Han återkom (efter ny fångenskap på hemvägen) till Kina 126 eller 125 f.Kr. och avlade skriftlig rapport om allt vad han sett och under resan hört omtalas om Västerns länder; han hade till och med uppgifter om partherriket och om Indien.

Hans rapport, som finns bevarad, är ett historiskt ytterst viktigt dokument. Det väckte i Kina ett oerhört intresse för Västerlandet och ledde till stora härnadståg i Centralasien och till livliga handelsförbindelser med Främre Orienten, varigenom en betydande kulturpåverkan på Kina, både andligt och materiellt, kom till stånd. Zhang utförde 115 f.Kr. en andra stor expedition till Ilidalen, vilken förberedde ett kinesiskt erövringståg dit.

Referenser

Noter

Källor
Chang Kien, Svensk uppslagsbok, 1955.

Födda 195 f.Kr.
Avlidna 113 f.Kr.
Personer från Shaanxi
Kinesiska diplomater
Kinesiska upptäcktsresande
Män
WP:Projekt Kina

redpajama_set_name: RedPajamaWikipedia


This name is in version 1.1 of The Plant List, record tro-17805030, and has not been changed.
The record derives from Tropicos which reports it as an accepted name (record 17805030) with original publication details: Lingnan Sci. J. 7: 305-306 305 1929 .
Full publication details for this name can be found in IPNI: urn:lsid:ipni.org:names:467012-1.


text:
Ядран — название Адриатического моря в сербском языке, встречающееся в русскоязычной литературе.
 Ядран (корабль) — корабль военно-морского флота Черногории.


text:
Northern Youth Want Maina's Bail Conditions Reviewed
The Northern Youth Coalition for Justice has called on the international community and human rights groups to prevail on Justice Okon Abang to review the stringent bail conditions handed out to ex pensions chief, Abdulrasheed Maina.
The group made the call in a statement signed by its Secretary, Abubakar Usman Yola, made available to newsmen on Tuesday December 10, 2019.
"It is apparently clear that the said presiding judge in the case between the Economic and Financial Crimes Commission, EFCC, Justice Okon Abang, has deliberately decided a way of keeping Abdulrashid Maina in continued detention.
"The bail conditions he offered are not just harsh but also mischievous as they are impossible to fulfill," the group said.
They further explained in the statement titled, "Jail terms given as bail terms to keep Maina in detention" that many lawyers including Senior Advocates of Nigeria, (SANs) had observed that such bail conditions have never been given to anyone before in the history of the judiciary.
"It is calculated and concocted in such a way that it is virtually impossible to fulfill such conditions by the defendant in the case before him.
"The bail was granted based on the following terms:
"The Defendant is admitted to bail in the sum of one billion naira, two sureties like sum.
"The sureties must be Nigerians and two serving Senators of the Federal Republic of Nigeria that do not have criminal cases pending in any Court.
"The two sureties may be from any of the six geo-political zones.
"The sureties must have properties in Maitama or Asokoro, FCT with Certificate of Occupancy.
"The Chief Registrar of this Court shall in writing ascertain the validity or otherwise of the Certificate of Occupancy issued by the relevant Ministry of the Federal Capital Territory.
"The Defendant shall deposit his US and Nigeria Passports and all other travel documents with the Chief Registrar of this Court.
"The Sureties shall undertake to appear in Court with the 1st Defendant, at all adjourned dates, pending conclusion of trial.
"Where at least one of the Sureties is not in Court with the Defendant, the Court shall be at liberty to revoke the bail of the 1st Defendant unless good and sufficient reasons are given for their absence.
"The Sureties shall each file affidavit of means with two passport photographs attached, stating their capability and capacity of paying the penal sum to the Federal Government or the Court, in the event of being called upon to do so.
"The Prosecution through the Investigating Police Officer, shall in writing ascertain the residence of the Defendant to be in Abuja, FCT," the statement outlined.
It said, "These monstrous terms are as deceptive as they are vendetta and divisive way of infringing on the fundamental rights to freedom of the defendant.
"Maina is a Nigerian whom the Attorney General and Minister of Justice of Nigeria recently stated under oath at the National Assembly that he (Abdulraaheed Maina) recovered the Sum of N1.3Trillion to the present Administration and he is yet to be paid his 5% (65bn) whistle blowers fees. If one puts this against the paltry allegation of N2.1bn, one would wonder who is honestly owing who?
"The bail conditions are not meant to be fulfilled but to serve as an excuse for his continued detention citing his inability to meet the terms as reason for his detention.This only depicts a deliberate plot of exploiting the court procedure to keep a defendant behind bars."
They therefore, appealed to the Chief Justice of the Federation and the Chief Judge of the Federal High Court, to caution Justice Okon Abang and ensure that he doesn't continue playing any "Agency's script" but follows the Constitution to the latter.
"We request that the judge be directed to follow rule of law and accord Maina an urgent review of the bail terms as the offences the defendant is accused of committing are bailable.
"Finally we urge International and Nigerian based Human Rights groups to stand up to this gross violation of the liberty of such a patriotic citizen whose health has been of a great concern to his family and well-wishers," it concluded.
Posted in Judiciary, Top Stories
'You've gone beyong your boundary' – Aisha Buhari warns Garbage ShehuCJN seeks constitution amendment to accommodate provisions of Sharia


For Vereniging van Vlaamse Steden en Gemeenten (VVSG) Forum ETHIBEL studied the options to invest the balances resulting from the treasury management of local administrations (municipalities and OCMWs) according to the SRI principles.
POD DO, the Programmatory Federal Government Department for Sustainable Development gave Forum ETHIBEL an evaluation assignment with regard to two existing SRI legislations with regard to the transparency duty in the context of supplementary pensions and collective investment institutions.
For Belsif, the Belgian Forum for Sustainable and Socially Responsible Investing, Forum ETHIBEL prepared a perception and needs investigation, and a learning investigation with regard to obstacles of positioning sustainable and socially responsible investment products on the Belgian market.
Forum ETHIBEL was the founder of the ARISTA standard, a SRI quality standard of ARISE, the Association for Responsible Investment Services (the former AI CSRR). This standard is developed in cooperation with different European partners and is therefore not identical to the Forum ETHIBEL specifications.
The King Baudouin Foundation selected Forum ETHIBEL for the implementation of the investigation "Les Consommateurs ont la parole – Consumenten aan het woord (Consumers take the floor)". The setup of the investigation was to get an idea about the motives of ethical investors and their satisfaction about the available products.
Forum ETHIBEL is sometimes involved in so-called 'social audits' of some national and international companies (for example, The Body Shop plc and Opnieuw & Co). A social audit is a process whereby a specific dialogue is initiated between a company and the stakeholders. This dialogue tests to what extent a company is accomplishing its mission and meeting the expectations of its 'shareholders'.
Forum ETHIBEL has cooperated in the creation of self-evaluation tools to measure the performance of SMEs in terms of corporate social responsibility: Albatros, CSR Review, Socratest.
For the Social Economy Cell of the Progammatory Federal Government Department (POD) Social Integration, Forum ETHIBEL conducted an information campaign with regard to the Belgian Social Label. A detailed "Manual to apply for a Belgian Social Label" was also prepared at that time.
For ParticipatieMaatschappij Vlaanderen (PMV) Forum ETHIBEL investigated the SRI content of the treasury portfolio. A Sustainable Entrepreneurship valuation system was also set up for ARKimedes.
For the King Baudouin Foundation a feasibility study with regard to a "Fair Water Label" was implemented.
Forum ETHIBEL is also sporadically addressed with regard to judging assignments.
This is the case, for example, with the 'Leeuw van de Export' (The Lion of Export), which is awarded annually by Flanders Investment & Trade. The Flemish Agency for International Entrepreneurship wants to promote companies with a leading performance in terms of export. Aspects with regard to sustainable and ethical international entrepreneurship (DEIO) are taken into account.
We made a significant contribution to Solidaritest®, the annual contest which measures and rewards the quality of social and humanitarian efforts of companies. We cooperated in setting up quality standards and are still part of the jury every year to assess candidates.
The Award for Best Belgian Sustainability Report rewards companies and other entities which, besides their financial-economic information, also report in a transparent manner about their social welfare aspects and their impact on the environment. This award is organised by the Institute of Auditors, Business & Society Belgium and KAURI. Forum ETHIBEL contributes to the initiative as a member of the jury.
Forum ETHIBEL contributed its know-how to the Vlerick Angels Acknowledgement Award (from 2006 to 2008) as a member of the jury. The award was an initiative of Vlerick Angels, a group of students from the Vlerick Masters, which select a small-scale school project every year for which to collect funds.


The Archdiocese of Chicago has announced that Cardinal Francis George's cancer is active again. The Chicago Tribune's Jon Hilkevitch looks at a spike in noise complaints aimed at O'Hare. We look ahead to the NCAA basketball tournament.


text:
Safer strap™ Station Wear Dress Bio Belt Black 1 1/4 Width
Size 30 31 32 33 34 35 36 37 38 39 40 41 42 44 46 48 50 51 52 53 54 55 56 57 58 59 60
Color of Belt Keeper Reflective Black
30 / Reflective - $40.00 USD 30 / Black - $40.00 USD 31 / Reflective - $40.00 USD 31 / Black - $40.00 USD 32 / Reflective - $40.00 USD 32 / Black - $40.00 USD 33 / Reflective - $40.00 USD 33 / Black - $40.00 USD 34 / Reflective - $40.00 USD 34 / Black - $40.00 USD 35 / Reflective - $40.00 USD 35 / Black - $40.00 USD 36 / Reflective - $40.00 USD 36 / Black - $40.00 USD 37 / Reflective - $40.00 USD 37 / Black - $40.00 USD 38 / Reflective - $40.00 USD 38 / Black - $40.00 USD 39 / Reflective - $40.00 USD 39 / Black - $40.00 USD 40 / Reflective - $40.00 USD 40 / Black - $40.00 USD 41 / Reflective - $40.00 USD 41 / Black - $40.00 USD 42 / Reflective - $40.00 USD 42 / Black - $40.00 USD 44 / Reflective - $40.00 USD 44 / Black - $40.00 USD 46 / Reflective - $40.00 USD 46 / Black - $40.00 USD 48 / Reflective - $40.00 USD 48 / Black - $40.00 USD 50 / Reflective - $40.00 USD 50 / Black - $40.00 USD 51 / Reflective - $40.00 USD 51 / Black - $40.00 USD 52 / Reflective - $40.00 USD 52 / Black - $40.00 USD 53 / Reflective - $40.00 USD 53 / Black - $40.00 USD 54 / Reflective - $40.00 USD 54 / Black - $40.00 USD 55 / Reflective - $40.00 USD 55 / Black - $40.00 USD 56 / Reflective - $40.00 USD 56 / Black - $40.00 USD 57 / Reflective - $40.00 USD 57 / Black - $40.00 USD 58 / Reflective - $40.00 USD 58 / Black - $40.00 USD 59 / Reflective - $40.00 USD 59 / Black - $40.00 USD 60 / Reflective - $40.00 USD 60 / Black - $40.00 USD
The fully encapsulated convenience of the Safer Strap Bio Belt stops absorption at the source with its high-strength flat webbing and full TPU coated all-sealed surface. The Bio Belt allows the first responder to wear with confidence and know that after every exposure the station belt they rely on shift after shift can be truly decontaminated and immediately returned back to active service.
For confidence you can count and a superior sanitary solution, armor yourself with the Safer Strap Bio Belt today.
Temperature, the amount of contact time, cuts, tears, or physical wear that damage the Strap and accessories or exposure to certain chemicals can all influence the straps ability to be resistant to hazards.


B-Line is the fully-functional and complementary browser for inline videos. It is a fine application that allows its users to display inline videos on their iOS devices. There are a huge number of followers of B-Line application that includes a variety of gorgeous features. It includes all the features of a balancing browser that helps users make all of their desired stuff with pretty much ease and convenience. Some of its additional features includes the providence of Universal search bar support, private PIN protected browsing, magnifying non-zoomable content support, and an entirely ads-free approach as well. You can easily manage all of your desired stuff without any tension of privacy concerns so that it possesses all of your workflows by maintaining an extreme level of privacy. Its new version has improved many features like scrolling in the bookmarks so that you can easily manage a huge number of bookmarks. Expect this, PIN verification is now saved when the app is started operating and rotating the device now causes the address bar to vanish for its full view browsing. So just download B Line app, and enjoy all of its amazing features on your iOS devices for free.


text:
Sounds and Silence
Posted on January 5, 2019 November 17, 2019 by insideyogablog
There is a brief calm at the beginning of a new year when all the noise has subsided and we prepare for what is to come. We may think back and forth – from what has passed and to what will be.
This blog first took shape in January 2017 when a new family member gave voice to the world on the 17th of the month.
43 years ago , on 17th January 1966, Simon and Garfunkel released their album, The Sound of Silence. The title song first featured on their first album Wednesday Morning, 3am, released in October 1964, but it's commercial failure led to the duo splitting – Paul Simon returned England and Art Garfunkel to his studies at Columbia University. By the spring of 1965 the song was receiving airtime and Tom Hudson, producer at Columbia Studios, added electric instruments to the acoustic track and released it in September 1965. The Sound of Silence hit no. 1 in January 1966. Simon and Garfunkel hastily reunited and recorded a second album –The Sound of Silence – an attempt to capitalize upon the success of the title song. The song was a top-ten hit in multiple countries worldwide. in 2012, the song along with the rest of the album was added to the National Recording Registry in the Library of Congress for being "culturally, historically, or aesthetically important".
There are many commentators on Paul Simon's song but the words of Dr Don Saliers have struck me. In 2013, Paul Simon spoke at Emory University as part of the Richard Ellman Lecture in Modern Literature and Dr Sallers recorded his thoughts on Simon's most famous song:
"…At a time when there was a lot of noise….and coming chaos ..that notion of silence as a friend and the ambiguity of silence, made the lyrics resonate with us…
He refers to the song being taken up by an America mourning the death of John Kennedy and to the assassinations that were to come. Dr Saliers adds _ "Silence can be a refuge and silence can be a phenomenally difficult reality….
silent raindrops
wells of silence
So silence is refuge, silence is a friend……
…….Reference to people talking a lot but not listening
…..Silence of the interior life….
Saliers is a Professor of Theology and Worship, Emeritus at Emory University, a private research establishment in Atlanta. Paul Simon's series of talks were entitled: The Insomniac's Lullaby: Awake and Aware of the Time".
Sound of Silence. Interior life. Listening. Awake and Aware. These are words commonly found in mindfulness manuals. Jon Kabat Zinn uses them in The Breathscape Practice for Cultivating Mindfulness. In Mindfulness: a practical guide to Finding Pace in a Frantic World by Williams and Penman, a Sounds and Thoughts meditation reveals how similar are sound and thought – sound and silence:
"We are immersed in a soundscape of enormous depth and variety. Just take a moment to listen……. Even when you are in quiet room, you can still pick up muffled sounds. It might be your breath….Even silence contains sounds…
………..This constantly fluxing soundscape is just like
your thought stream…." pp 141-143
Williams and Penman write that sound and thought both appear as if from nowhere; both can seem random and we have no control over their arising. Both are enormously potent and carry immense momentum…
This connection and train of thought has been highlighted recently by my first taste of Sound Therapy. Sound therapists believe that we are all made up of different energy frequencies. They use sound frequencies to "..rebalance the body's energy.."
Sound therapy was formally introduced to the UK in 2000 with the establishment of the British Association of Sound Therapy . The BAST website outlines the approach:
The BAST method of sound therapy combines carefully considered therapeutic sound techniques which have been shown to affect physiology, neurology and psychology with a form of reflective enquiry (a kind of questioning). This approach has been shown to be very effective at improving health and wellbeing.
Sound therapy is a complementary therapy used alongside orthodox medicine. As such, it wise to ask questions of the therapist if you have any queries or doubts.
Before each session, the practitioner will ask the client about their medical history and any current health problems. Treatment is adapted accordingly. Therapists use relaxing or stimulating sounds – ie. gongs, drums, bells, bowls, tuning forks and the human voice.
Sound has been used as a healing or calming tool for thousands of years. Himalayan singing bowls (standing bells that "sing") have been used throughout Asia for thousands of years in prayer and meditation, and are now used to promote relaxation and wellbeing. Music therapy is a creative arts therapy in which a music therapist uses music and all of its facets—physical, emotional, mental, social, aesthetic, and spiritual—to help clients improve their physical and mental health. Sound has been used for thousands of years in a healing sense – overtone chanting from Central Asia, for example – yet now it is featuring more prominently in neuroscience journals and webpages etc.
Joshua Leeds, the author of The Power of Sound is an expert in the field of psychoacoustics, the study of the effects of sound on the human nervous system. He writes about the power of sound:
…creating a frequency and vibration for someone that's conducive for him or her to heal. Sound healing is trending up. It's like where yoga was 15 years ago. People are realizing that sound is a viable medium to address distress, enhance learning….
I am investigating the idea of a Yoga and Sound Therapy Workshop which brings together 3 practitioners – a Sound Therapist (Wendy) , a Reiki Master and a qualified Counsellor (Heather) and myself as a yoga teacher. The workshop would be for a group of just 6 people who could experience and evaluate the sound therapy. A second blog would report on the findings.
If you are interested, we will send details of Wendy's approach and the session itself. For dates, check the website.
Please follow the links. Forward any comments or queries.
Have a very Happy 2019. I look forward to seeing some of you next week.
Previous Post Hamstrings – stretch or retrain?
Next Post An experiment in Sound


Lund's Organic Farm has been a certified organic farm in its current location since 1988. They grow a variety of vegetables, including carrots, lettuce, spinach and potatoes. This central Alberta farm focuses on cold weather crops and varieties that grow best in Alberta's shorter summers.
Their current farm is located nearby Innisfail. It was previously used as pasture so has never been sprayed with chemicals, and a three-year rotation (two years of grain, one year of vegetables) ensures the soil remains healthy and fertile.
Lund's Organic Farm is owned and operated by Gert and Betty Lund, who have been farming organically since 1988.


text:
Neoadjuvant alectinib in locally advanced lung adenocarcinoma with anaplastic lymphoma kinase rearrangement: case series and literature review : Anti-Cancer Drugs
- Volume - Issue
Thought you might appreciate this item(s) I saw in Anti-Cancer Drugs.
Neoadjuvant alectinib in locally advanced lung adenocarcinoma with anaplastic lymphoma kinase rearrangement: case series and literature review
Wang, Zhaofenga; Wu, Ranpub; Li, Chulingc; Cheng, Kaid; Di, Yichengc; Lv, Tangfenga; Liu, Hongbinga,*; Song, Yonga,*
aDepartment of Respiratory and Critical Care Medicine, Affiliated Jinling Hospital, Medical School of Nanjing University
bDepartment of Respiratory and Critical Care Medicine, Jinling Hospital, School of Medicine, Southeast University
cDepartment of Respiratory Medicine, Affiliated Jinling Hospital of Nanjing Medical University
dDepartment of pathology, Affiliated Jinling Hospital, Medical School of Nanjing University, Nanjing, China
Received 7 December 2022 Revised form accepted 8 December 2022.
*Dr. Hongbing Liu and Dr. Yong Song contributed equally to the writing of this article.
Correspondence to Zhaofeng Wang, East Zhongshan Road 305, 210000 Nanjing, China, E-mail: [email protected]
Anti-Cancer Drugs ():10.1097/CAD.0000000000001507, January 24, 2023. | DOI: 10.1097/CAD.0000000000001507
In view of the success of targeted therapy in the field of advanced lung cancer, it is gradually pushed further to neoadjuvant therapy. Alectinib has been recommended for advanced anaplastic lymphoma kinase (ALK) + non-small cell lung cancer (NSCLC) in first-line therapy. Here, we report two cases of neoadjuvant alectinib in locally advanced lung adenocarcinoma with ALK rearrangement. Case 1 was a 64-year-old man with no history of smoking who was diagnosed with the clinical stage as IIIB, with ALK fusion-positive. Chest-enhanced computed tomography (CT) revealed marked regression and achieved partial response (PR) incorporated with grade 3 interstitial pneumonia after 44 days of alectinib neoadjuvant therapy. Interstitial pneumonia improved after methylprednisolone therapy, then thoracoscopic lobe resection with lymph node dissection was performed with blood loss. The pathological assessment was a pathologic complete response(pCR). Case 2 was a 66-year-old man who had a routine physical examination and then diagnosed with a clinical-stage IIIB by CT-guided percutaneous cutting needle biopsy (PCNB). Chemotherapy with 1 cycle of pemetrexed combined with nedaplatin was performed in the interval waiting for next-generation sequencing (NGS) results. NGS testing revealed an EML4-ALK fusion mutation. After 109 days of alectinib treatment, radiographic evaluation was classified as PR and then he underwent thoracoscopic upper lobectomy smoothly with pathological assessment as a major pathological response (MPR). To date, neoadjuvant alectinib has only been reported in a few cases in locally advanced lung adenocarcinoma with ALK-rearranged. Neoadjuvant alectinib may be feasible in locally advanced disease for complete resection. The duration and safety of neoadjuvant therapy with alectinib still need further study.
Anti-Cancer Drugs : January 24, 2023
ALK rearrangement , case report , locally advanced lung adenocarcinoma , neoadjuvant alectinib
ALK rearrangement\r, case report\r, locally advanced lung adenocarcinoma\r, neoadjuvant alectinib
Articles in PubMed by Zhaofeng Wang
Articles in Google Scholar by Zhaofeng Wang
Other articles in this journal by Zhaofeng Wang


text:
Librarians (KOR)
Springboard blog
Opening up research
We need to do more to celebrate and support women in engineering
Research Publishing
By: Helen Burbank, Thu Jun 21 2018
Author: Helen Burbank
Marketing Manager, SRG Marketing
Earlier in June, Springer Nature launched a campaign to celebrate women's achievements in engineering which highlighted nine of our authors and editors who shared their thoughts on why they chose to become engineers and the advice they would offer to young women entering the field.
As some have questioned why we need to celebrate women in engineering, it made me think about the reasons behind not only this campaign, but the worldwide movement that created International Women in Engineering Day (officially in its 2nd year under UNESCO patronage), the dozens of professional societies for women engineers, and, at its core, whether or not this is (still?) an issue.
There are a couple of aspects to consider: are women studying engineering? Are women working as engineers? Are women staying engineers? Historically speaking, women have been granted degrees in engineering since 1876 (Elizabeth Bragg, from the University of California, Berkley being the first). The trend didn't really catch on until well after WWII, itself a turning point with many women entering the engineering fields without formal training to take up roles left empty by men at war. In the 1970s, universities around the world began to accept women on a wider scale, for example, Jill Tietjen, series editor for the Springer book series "Women in Engineering and Science". Her comprehensive history of women in engineering serves as the premier book in the series here.
The number of women both pursuing an education in and working in the STEM fields is growing and the gender gap is decreasing.
In her book, Women in STEM Disciplines (Springer, 2017), Claudine Schmuck presents the global picture for the above questions, tackling some "accepted" truths, and effectively looking at the wider trends of women in STEM fields. Her detailed analysis paints a positive picture: the number of women both pursuing an education in and working in the STEM fields is growing and the gender gap is decreasing. The 10 years to 2013 saw an increase of 80% in number of women graduating in a STEM subject, and women as an overall percentage of all STEM graduates (including medicine) is now approaching 50%1. There are significant variations globally in the growth rates with the percentage of women STEM graduates increasing from 12 % to 25% in Middle East & North Africa, South-West Asia and Sub-Saharan Africa and from 14% to 29% in Central and Eastern Europe but virtually no growth in Latin America, North America and Western Europe. But unfortunately seeing the full effect of these achievements is being hampered by a number of factors.
Even in the US, only 24.7% of computer science professionals and 15.1% of engineering professionals are women, although women constitute close to half of the total workforce.
Social norms and cultural barriers including discriminatory family codes, restricted resources, legal and institutional barriers and to top it off, a lack of access to local role models, have been shown to inhibit female graduates' access to employment2, particularly in some of the countries experiencing the highest booms in female STEM education. While this has not had the same impact in Western Europe and North America, where the "gender gap" in the labour market is almost nil, the percentage of women actively participating in the market in the STEM fields is still very low. Even in the US, only 24.7% of computer science professionals and 15.1% of engineering professionals are women, although women constitute close to half of the total workforce (U.S. Department of Labor 2016)3.
To compound the low numbers transitioning from studies to work, "the attrition rate for STEM graduated women … reaches 40% [compared with] that of those holding a degree in management or law, or economics which reaches only 9%"4. Reasons for this difference vary widely, but can be categorized broadly as:
- (1) lack of career expectations
- (2) the impossibility to achieve work/life balance
- (3) organization and environment5
This is a huge loss not only for women, but for companies because, as Dr. Lucienne Blessing explains, "Research shows that gender-diverse companies are 15% more likely to perform better, in particular if leadership is gender-balanced (McKinsey)."
Women's achievements in STEM fields need to be harnessed to raise awareness, create role models and foster a more inclusive culture.
That's why we launched our campaign. It aims, via a series of interviews with female engineers who love their work and their jobs, to create role models in this field, provide sound advice to women looking to enter the field, and paint a positive picture for the next generation of women in engineering. It is only a start but one which we encourage others to also get behind in order to see real change in this field.
Helen studied history, German and international studies at Queen's University in Ontario, Canada. She started her career in marketing with an internship in Berlin with ResearchGate before becoming a Marketing, Advertising, and Sales Manager at INOMICS. She moved on to MEGA International as a Marketing Coordinator before moving to Heidleberg and Springer Nature in 2017 as a Marketing Manager.
Celebrating Chinese contribution to sustainable development research
With the fastest-growing scientific and scholarly research, China's importance for sustainable development is increasingly clear.
Transformative deals substantially aid the transition to OA. Let's give them the time they need to do so .
Last month, Springer Nature agreed a new transformative 'read and publish' deal with the Norwegian library consortium, Unit. This, coupled with renewals of existing deals in the UK (Jisc), Sweden (Bibsam) and Qatar, takes the number of such deals we have into double figures, the most of any publisher. These deals enable researchers in these ten countries to publish open access in over 1900 Springer journals as well as read the research of others across this portfolio.
The future of open access books
Open access book publishing has been growing in recent years. The Directory of Open Access Books (DOAB) lists 2,099 open access books published in 2018, an increase of 38% from 2017. Funders are also starting to engage with open access for books: a small number of European funders now mandate open access for books and provide financial support for open access book publication. COAlition S has also indicated that they support transitioning monographs to open access, and will provide guidance by the end of 2021.
Maximising the benefits of early sharing
At Springer Nature making great research available as quickly as possible is a central part of our commitment to the research community.
A faster path to an open future
At Springer Nature we want to find the fastest and most effective route to immediate open access (OA) for all primary research.
Going beyond the search bar: database publishing and how database usage can be measured
At Springer Nature we believe our mission is to support researchers in advancing discovery, and we strive to do this by publishing around 300,000 journal articles and over 13,000 academic books every year and embarking on initiatives, projects and innovations to ensure the discoverability and ease of access of this research. We are always looking for new ways to serve our community and ensure that we are both supporting, enhancing and delivering what our communities need.
Congratulations to Karen Keskulla Uhlenbeck
It's a great pleasure for us at Springer Nature to congratulate Karen Keskulla Uhlenbeck for the award of this year's Abel Prize.
Businesses must play a role in sustainable development
Today Springer Nature launches its Responsible Business report for 2018.
Setting targets at Springer Nature to help create a better balance
The theme of this year's IWD couldn't be more relevant to us. Last month, Springer Nature's management board announced to our 13,000 colleagues that we will set a target to improve gender representation in our leadership group.
Without you, we are nothing: why community engagement is at the core of everything we do
Sometimes there is great value in stating the obvious; the scholarly publishing industry would not exist without a broad international community of researchers, students, librarians, funders, and commercial partners.
Making Plan S work for all
Steven Inchcoombe discusses Springer Nature's submission to the cOAlition of participants to make Plan S work for all.
A postcard from Davos
My first impressions of Davos? Dazzling, overwhelming, unexpected, thought-provoking, incredibly busy and much, much more…
How Can We Accelerate Data Sharing?
What steps can publishers, funders and institutions take to make data sharing worth a researcher's time and energy, and accelerate progress?
Connecting curious minds to advance learning and discovery
Springer Nature will stay curious, connect ideas, question how things are done, explore new ways to deliver for our communities and then make the changes that matter.
The quest for more value: A Long Read
Daniel Ropers shares some of his early observations about the academic publishing industry.
Publication misconduct: changing the conversation
Suzanne Farley discusses how to increase prevention and detection of research and publication misconduct.
Lessons learned from open peer review: a publisher's perspective
Rachel Burley discusses BMC's history in openness and transparency and what has been learnt.
Accelerating open access: what is missing from Plan S
The transition to open access needs to be sustainable for the whole research community.
Finding the science in social media
At Springer Nature we believe that social media is a vital tool for everyone involved in the academic research and publishing process.
Hybrid journals can advance the move towards full open access
Hybrid journals play an important role in the transition to open access.
Science benefits from diversity
As a progressive publisher, we have a responsibility to support diversity and inclusion.
What next for Impact Factors?
Why we need to work together to create metrics that better meet the needs of the research community.
Can research change the world?
Springer Nature believes that great multidisciplinary research needs to be informing global discussions.
Advancing discovery
Future of the book all down to definition
The speed of recent change in the publishing industry in the past 10 years poses the question, what will book publishing look like in the future?


My friend had a 920 and an insurance plan through AT&T. He dropped and shattered the screen and AT&T said they dont have the 920 anymore but he could have the 8x. He refused anything but a Nokia so they gave him a 1020! He's a very lucky man, but give it a shot any of you with a 920!
Re: Replace your 920 with a 1020?!?!
wait, I know you have to pay like $50 or so to replace, how much did they charge for the 1020?
So were you using factory warranty or att insurance?
Sounds like they exchanged it under manufacturer's warranty in which they would send the broken one to Nokia and Nokia would send a 920 back. Now if it was under insurance, that has nothing to do with Nokia, that is AT&T exchanging their property for their property.
Factory warranty.......so go figure this morning while doing another search on this issue I found the update on this site showing this method that was posted via the Nokia blog.
So after installing the Nokia Software Updater I was able to get my phone back up. Unfortunately I removed the SIM card last night as part of troubleshooting and will have to finish up once home. So I wonder how AT&T is going to handle this if I just resent them the phone their sending me? Not sure if I should just swap mine out now with the replacement or not??