text:
/**
 * Create a native listview object
 *
 * @module lib/genericListView
 * @author Yiran Mao
 * @version 1.0.0
 *
 */

 /**
  * @typedef {object} module:lib/genericListView~listSectionItemTemplate
  * @property {string | object} display="oneColumn" - The display view of listItem. Range: ["oneColumn", "twoColumns", "twoColumnsWithSubtitle"],
  * or user may define customized template object as long as it is comformed to {@link http://docs.appcelerator.com/titanium/3.0/#!/api/ItemTemplate ItemTemplate}
  * @property {boolean} swipable=false - The flag indicates whether the listItem support swipe show operation feature
  * @property {boolean} editable=true - The flag indicates whether user can see edit button on operation layer
  * @property {boolean} hasCheckbox=false - The flag indicates whether user can see checkbox to the left of listItem name and multi-select them
  * @property {string | false} hasIcon=false -  The flag indicates whether icon will show to the left of nameLabel
  * @property {string | object} rightComponent - The right component of the display view. Range: ["label", "switchButton"]
  *
  */
 /**
  * @typedef {object} module:lib/genericListView~listItemEventHandler
  * @property {function} onSingletap - Action on singletap. "apply to checkbox" is only valid when itemTemplate set hasCheckbox = true.
  * @property {function} onEditClick - Action on edit clicked.
  * @property {function} onDeleteClick - Action on delete clicked.
  * @property {function} onSwitchChange - Action on switch state changed
  * @property {Array<object>} actionOnMultipleItems -  Define the button shown on navigation bar and corresponding action
  * @property {string} actionOnMultipleItems.title - <Platform: Android> Title show for the action
  * @property {Ti.UI.Button} actionOnMultipleItems.button - <Platform: iOS> Button show for the action
  * @property {function} actionOnMultipleItems.fn - Action when the button/title is clicked
  *
  */
  /**
  * @typedef {object} module:lib/genericListView~listItemData
  * @property {string} idLabel - The value will be passed to the eventHandler function, so choose value that can uniquely identifier the object. Format {text: string}
  * @property {string} iconImageView - The path to listItem icon resource. Format {image: path}
  * @property {string} nameLabel - ListItem title. Format {text: string}
  * @property {string} subtitleLabel - ListItem subtitle. It will be shown in smaller grey font under title. Format {text: string}
  * @property {string} statusLabel - ListItem right label. Only will be displayed when rightComponent is set to "label". Format {text: string}
  * @property {boolean} switchButton -  ListItem default state for switch. Only will be displayed when rightComponent is set to "switchButton". Format {value: boolean}
  *
  */
 var MAXLISTLENGTHWITHOUTSEARCHBAR = 10;
 var OPERATIONBUTTONWIDTH = 60;
 var templates = {
	// Get the corresponding subtemplate within template with bindId. Template is just object with predefined requested field
	findbyBindId: function(template, bindId){
		var item = "";

		function findByBindIdHelper(template, bindId){
			if(template.bindId !== bindId){
				_.each(template.childTemplates, function(template){
					findByBindIdHelper(template, bindId);
				});
			}
			else{
				item = template;
			}
		}
		findByBindIdHelper(template, bindId);
		return item;
	},

	baseTemplate: {
		bindId: "item",
		type: "Ti.UI.View",
		properties:{
			width: Ti.UI.FILL,
			height: Ti.UI.FILL
		},
		events:{
			//no event
		},
	    childTemplates: [
	    	{
	    		bindId: 'idLabel',
	            type: 'Ti.UI.Label',
	            properties: {
	            	visible: false,
	            	font: {
						fontSize: "13dp"
					},
					color: "#333"
	            }
	        },
	        {
	            type: 'Ti.UI.View',
	            bindId: 'itemDisplay',
	            properties: {
	            	width: OS_IOS?Ti.Platform.displayCaps.platformWidth : Ti.Platform.displayCaps.platformWidth/Ti.Platform.displayCaps.logicalDensityFactor,
					height: Ti.UI.FILL,
					layout: "horizontal",
					backgroundColor: "white"
	            },
	            events: {
	            	//onSingletap
	            	//onSwipe if swipable
	            },
	            childTemplates: []
	        }
	    ]
	},
	operationLayer: {
		bindId: "itemOperation",
		type: "Ti.UI.View",
		properties:{
			width: Ti.UI.SIZE,
			height: Ti.UI.FILL,
			layout: "horizontal",
			right: 0
		},
		events:{
			//no event
		},
	    childTemplates: []
	},
	operation:{
        type: "Ti.UI.View",
		properties:{
			left: 0,
			width: OPERATIONBUTTONWIDTH,
			height: Ti.UI.FILL,
			backgroundColor: "#aaa"
		},
		events:{
			//on operation click
		},
	    childTemplates: [
	    	{
	    		type: 'Ti.UI.Label',
	            properties: {
					width: Ti.UI.SIZE,
					height: Ti.UI.FILL,
					font: {
						fontSize: "13dp"
					},
					color: "white"
	            }
	        }
	    ]
    },
	editOperation:{
        bindId: "itemEditOperation",
		type: "Ti.UI.View",
		properties:{
			left: 0,
			width: Ti.UI.SIZE,
			height: Ti.UI.FILL,
			backgroundColor: "#aaa"
		},
		events:{
			//onEditClick
		},
	    childTemplates: [
	    	{
	    		bindId: 'itemEditLabel',
	            type: 'Ti.UI.Label',
	            properties: {
	            	left: "10dp",
					right: "10dp",
					width: Ti.UI.SIZE,
					height: Ti.UI.FILL,
					text: "Edit",
					font: {
						fontSize: "13dp"
					},
					color: "white"
	            }
	        }
	    ]
    },
    deleteOperation:{
        bindId: "itemDeleteOperation",
		type: "Ti.UI.View",
		properties:{
			left: 0,
			width: Ti.UI.SIZE,
			height: Ti.UI.FILL,
			backgroundColor: "#f00"
		},
		events:{
			//onDeleteClick
		},
	    childTemplates: [
	    	{
	    		bindId: 'itemDeleteLabel',
	            type: 'Ti.UI.Label',
	            properties: {
	            	left: "10dp",
					right: "10dp",
					width: Ti.UI.SIZE,
					height: Ti.UI.FILL,
					text: "Delete",
					font: {
						fontSize: "13dp"
					},
					color: "white"
	            }
	        }
	    ]
    },
	oneColumn: {
		bindId: "itemContainer",
		type: "Ti.UI.View",
		properties:{
			width: Ti.UI.FILL,
			height: Ti.UI.FILL,
			touchEnabled: false
		},
		events:{
			//no event
		},
	    childTemplates: [
	    	{
	    		bindId: "itemDisplayMain",
				type: "Ti.UI.View",
				properties:{
					left: "15dp",
					width: Ti.UI.SIZE,
					height: Ti.UI.FILL,
					touchEnabled: false
				},
				events:{
					//no event
				},
			    childTemplates: [
			    	{
			    		bindId: 'nameLabel',
			            type: 'Ti.UI.Label',
			            properties: {
			            	font: {
								fontSize: "13dp"
							},
							color: "#333",
							touchEnabled: false
			            }
			        }
			    ]
	        }
	    ]
	},
	twoColumns: {
		bindId: "itemContainer",
		type: "Ti.UI.View",
		properties:{
			width: Ti.UI.FILL,
			height: Ti.UI.FILL,
			touchEnabled: false
		},
		events:{
			//no event
		},
		childTemplates: [
	    	{
	    		bindId: "itemDisplayLeft",
				type: "Ti.UI.View",
				properties:{
					left: "15dp",
					width: Ti.UI.SIZE,
					height: Ti.UI.FILL,
					touchEnabled: false
				},
				events:{
					//no event
				},
				childTemplates:[
					{
						bindId: 'nameLabel',
			            type: 'Ti.UI.Label',
			            properties: {
			            	font: {
								fontSize: "13dp"
							},
							color: "#333",
							touchEnabled: false
			            }
					}
				]
	       },
	       {
	    		bindId: "itemDisplayRight",
				type: "Ti.UI.View",
				properties:{
					right: "15dp",
					width: Ti.UI.SIZE,
					height: Ti.UI.FILL,
					touchEnabled: false
				},
				events:{
					//no event
				},
				childTemplates:[]
	        }
	    ]
	},
	twoColumnsWithSubtitle: {
		bindId: "itemContainer",
		type: "Ti.UI.View",
		properties:{
			width: Ti.UI.FILL,
			height: Ti.UI.FILL,
			touchEnabled: false
		},
		events:{
			//no event
		},
		childTemplates: [
	    	{
	    		bindId: "itemDisplayLeft",
				type: "Ti.UI.View",
				properties:{
					left: "15dp",
					width: Ti.UI.SIZE,
					height: Ti.UI.FILL,
					layout: "vertical",
					touchEnabled: false
				},
				events:{
					//no event
				},
				childTemplates:[
					{
						bindId: 'nameLabel',
			            type: 'Ti.UI.Label',
			            properties: {
			            	left: 5,
							height: 27,
			            	font: {
								fontSize: "13dp"
							},
							color: "#333",
							verticalAlign: Titanium.UI.TEXT_VERTICAL_ALIGNMENT_BOTTOM,
							touchEnabled: false
			            }
					},
					{
						bindId: 'subtitleLabel',
			            type: 'Ti.UI.Label',
			            properties: {
			            	left: 5,
							height: 20,
			            	font: {
								fontSize: "11dp"
							},
							color: "#aaa",
							verticalAlign: Titanium.UI.TEXT_VERTICAL_ALIGNMENT_TOP,
							touchEnabled: false
			            }
					}
				]
	       },
	       {
	    		bindId: "itemDisplayRight",
				type: "Ti.UI.View",
				properties:{
					right: "15dp",
					width: Ti.UI.SIZE,
					height: Ti.UI.FILL,
					touchEnabled: false
				},
				events:{
					//no event
				},
				childTemplates:[]
	        }
	    ]
	},
	//left size components
	icon:{
		bindId: "itemIcon",
		type: "Ti.UI.View",
		properties: {
			width: 50,
			height: Ti.UI.FILL,
			touchEnabled: false
		},
		events: {
			//no event
		},
		childTemplates: [
			{
				bindId: "iconImageView",
				type: "Ti.UI.ImageView",
				properties: {
					left: 0,
					height: Ti.UI.FILL
				},
				touchEnabled: false
			}
		]
	},
	checkbox: {
		bindId: "itemCheckboxTouch",
		type: "Ti.UI.View",
		properties:{
			left:0,
			width: "25dp",
			height: Ti.UI.FILL,
		},
		events:{
			//onSingletap for toggle check status
		},
	    childTemplates: [
	    	{
	            bindId: "itemCheckbox",
				type: "Ti.UI.View",
				properties:{
					left: "15dp",
					width:"10dp",
					height:"10dp",
					borderWidth: "1dp",
					borderColor: "#bbb",
					backgroundColor: "white",
					touchEnabled: false
				},
				events:{
					//no event
				},
			    childTemplates: [
			    	{
			    		bindId: 'itemCheckMark',
			            type: 'Ti.UI.ImageView',
			            properties: {
			            	width: Ti.UI.FILL,
							height: Ti.UI.FILL,
							visible: false,
							image: "/checkmark.png",
							touchEnabled: false
			            }
			        }
			    ]
	        }
	     ]
	},

	//right side components(for multiple columns only)
	label: {
		bindId: 'statusLabel',
        type: 'Ti.UI.Label',
        properties: {
			font: {
				fontSize: "13dp"
			},
			color: "#333",
			touchEnabled: false
        }
	},
	switchButton: {
		bindId: 'switchButton',
        type: 'Ti.UI.Switch',
		events: {
			// onChange for switch button
		}
	}
};
 /**
  * @alias module:lib/genericListView
  * @param {object} opts - The configuration parameter for genericListView
  * @param {Ti.UI.View | Ti.UI.Window} opts.window - The container for genericListView. See Titanium documentation for
  * {@link http://docs.appcelerator.com/titanium/3.0/#!/api/Titanium.UI.Window Ti.UI.Window} and {@link http://docs.appcelerator.com/titanium/3.0/#!/api/Titanium.UI.View Ti.UI.View}
  * This must be specified since interaction with navigation and title is required when multiple selection action is defined.
  * @param {boolean} [opts.windowHasSlidingMenu = false] - The flag indentify whether the container has a button that can open sliding menu.
  * When set to true, it will ban all interaction with the genericListView when slidingMenu is opened.
  * @param {boolean} [opts.hasSearchBar] - The flag indentifiy whether the genericListView content is searchable.
  * If you sepecify the value, it will equal to that value no matter how long the data is; otherwise, it depends on the data length of the listview.
  * @param {object} [opts.orderBy = false] - Specify the sorting order for the sections. If not defined, it will just show as the original data order.
  * @param {string} [opts.orderBy.name] - Specify what you what
  * @param {Arrray<object>} opts.sections - The definition of each section contained by the listview
  * @param {string} opts.sections.id - The unique identifier for each section to retrieve the section object
  * @param {Array<listItemData>} opts.sections.data - The data source of each section, preprocessed to bindID: value format. See {@link module:lib/genericListView~listItemData}
  * @param {string} [opts.sections.title] - The human readable title displayed on headerView. If empty, the section will show without headerView
  * @param {boolean} [opts.sections.collapsable = true] - The flag indicates whether the section is collapsable and expandable when headerView is clicked
  * @param {listSectionItemTemplate} [opts.sections.itemTemplate = {@link baseTemplate}] - The listItem template each section should use. See {@link module:lib/genericListView~listSectionItemTemplate}
  * @param {listItemEventHandler} [opts.sections.eventHandler = defaultEventHandler] -  The action carries out when user interact with listItem. See {@link module:lib/genericListView~listItemEventHandler}
  * @param {object} [opts.defaultTemplate] - The default template will serve as the template when individual section itemTemplate is not provided.
  * @param {listSectionItemTemplate} [opts.defaultTemplate.itemTemplate = {@link baseTemplate}] - See {@link module:lib/genericListView~listSectionItemTemplate}. When not provided, baseTemplate will be use instead.
  * @param {listItemEventHandler} [opts.defaultTemplate.eventHandler = defaultEventHandler] - See {@link module:lib/genericListView~listItemEventHandler}.
  * @returns {genericListView} The listView contains all method provide by {@link http://docs.appcelerator.com/titanium/3.0/#!/api/Titanium.UI.ListView Ti.UI.ListView} and extended update method
  *
  */
function GenericListView(opts){
	var window = opts.window;
	var sections = opts.sections;
	var hasSearchBar = !_.isUndefined(opts.hasSearchBar)? opts.hasSearchBar :  _.reduce(sections, function(dataLength, section){return dataLength + section.data.length;}, 0) > MAXLISTLENGTHWITHOUTSEARCHBAR;
	var orderBy = opts.orderBy || false;

	// Check the validity of the template, including field correctness and eventHandler
	function parseTemplateOpts(template, eventHandler){
		template = template || {};
		/**
		 * Default template options for section instances. Changing these options may affects many
	 	 * genericListView instances.
		 * @namespace
		 */
		var baseTemplate = {
			/** ListItem only shows nameLabel by default */
			display: "oneColumn",
			/** You cannot swipe the listItem to show operations by default */
			swipable: false,
			/** The edit operation is shown by default when user can swipe on the item */
			editable: true,
			/** You cannot multi-select listItems by default */
			hasCheckbox: false,
			/** There is no icon for listItem by default */
			hasIcon: false
		};
		// Only take minimal itemplate definition in the first step to prevent malicious user from invalid template defination
		var itemTemplate = _.extend({}, baseTemplate, _.pick(template, "display", "swipable", "editable", "hasCheckbox", "hasIcon"));
		var itemEventHandler = _.extend({}, eventHandler);
		// Add additional field which rely on some precondition only if the condition is satisfied
		// 1. Take rightComponent only when itemDisplay is indeed defined as twoColumns
		if(itemTemplate.display.indexOf("twoColumns") != -1){
			itemTemplate.rightComponent = template.rightComponent;
		}
		// 2. Over write singletap function when user try to set singletap apply to a listItem without checkbox
		if(!itemTemplate.hasCheckbox && itemEventHandler && itemEventHandler.onSingletap === "apply to checkbox"){
			itemEventHandler.onSingletap = function(){console.log("Damn you cheater!!!");};
		}
		if(itemTemplate.swipable === true){
			if(itemTemplate.editable === true){
				itemTemplate.swipable = ["Edit", "Delete"];
			}
			else{
				itemTemplate.swipable = ["Delete"];
			}
		}
		return {
			itemTemplate: itemTemplate,
			eventHandler: itemEventHandler
		};
	}

	// Generate ListItem template
	function _listItemTemplateGenerator(opts, eventManager){
		var template = JSON.parse(JSON.stringify(templates.baseTemplate));

		//display layer
		var itemDisplay = templates.findbyBindId(template, "itemDisplay");
		if(opts.hasCheckbox){
			var checkboxTemplate = JSON.parse(JSON.stringify(templates.checkbox));
			checkboxTemplate.events.singletap = eventManager.getEventByName("toggleSelectStatus");
			itemDisplay.childTemplates.push(checkboxTemplate);
		}
		if(opts.hasIcon){
			var iconTemplate = JSON.parse(JSON.stringify(templates.icon));
			itemDisplay.childTemplates.push(iconTemplate);
		}
		if(typeof opts.display === "object"){ //which means user defined their own template
			var displayTemplate = opts.display;
		}
		else{
			if(!templates[opts.display]){
				opts.display = "oneColumn";
			}
			var displayTemplate = JSON.parse(JSON.stringify(templates[opts.display]));
			itemDisplay.events.singletap = eventManager.getEventByName("singletapHandler");
			if(opts.display.indexOf("twoColumns") != -1 && templates[opts.rightComponent]){
				var rightComponentTemplate = JSON.parse(JSON.stringify(templates[opts.rightComponent]));
				if(opts.rightComponent === "switchButton"){
					templates.findbyBindId(rightComponentTemplate, "switchButton").events.change = eventManager.getEventByName("switchChangeHandler");
				}
				templates.findbyBindId(displayTemplate, "itemDisplayRight").childTemplates.push(rightComponentTemplate);
			}
		}
		itemDisplay.childTemplates.push(displayTemplate);

		if(opts.swipable){
			var operationTemplate = JSON.parse(JSON.stringify(templates.operationLayer));
			itemDisplay.events.touchstart = eventManager.getEventByName("touchstartHandler");
			itemDisplay.events.touchmove = eventManager.getEventByName("touchmoveHandler");
			itemDisplay.events.touchend = eventManager.getEventByName("touchendHandler");
			if(OS_ANDROID){
				itemDisplay.events.touchcancel = eventManager.getEventByName("touchendHandler");
			}
			_.each(opts.swipable, function(op){
				var operationEventHandler = eventManager.getEventByName(op.toLowerCase() + "Handler");
				if(operationEventHandler){
					var itemOperation = JSON.parse(JSON.stringify(templates.operation));
					itemOperation.bindId = "item" + op + "Operation";
					itemOperation.events.click = operationEventHandler;
					itemOperation.childTemplates[0].bindId = 'item' + op + 'Label';
					itemOperation.childTemplates[0].properties.text = op;
					if(op === "Delete"){
						itemOperation.properties.backgroundColor = "#f00";
					}
					operationTemplate.childTemplates.push(itemOperation);
				}
			});
			operationTemplate.properties.maxWidth = OPERATIONBUTTONWIDTH * opts.swipable.length;
			templates.findbyBindId(template, "item").childTemplates.unshift(operationTemplate);
		}

		return template;
	}

	// Define user interaction with the listItems
	function EventManager(eventHandler){
		var self = this;

		//default events handler
		var defaultEventHandler = {
			onSingletap: function(){
				console.log("singletapped");
			},
			onEditClick: function(){
				console.log("edit clicked");
			},
			onDeleteClick: function(){
				console.log("delete clicked");
			},
			onSwitchChange: function(){
				console.log("switch value changed");
			},
			actionsOnMultipleItems: []
		};
		var eventHandler = _.extend({}, defaultEventHandler, eventHandler);

		// For implementation pitfall note:
		// Using section.getItemAt will return a copy of current value for the listItem, so changing of that won't really be applied to listItem until you explicitly call updateItemAt
		self.eventHandler = {
			switchChangeHandler: function(e){
				var id = e.section.getItemAt(e.itemIndex).idLabel.text;
				var value = e.source.getValue();
				eventHandler.onSwitchChange(id, value);
			},
			singletapHandler: function(e){
				window.fireEvent("singletap");
				//console.log("singletap")
				// Apply singletap event to toggle select event if user are currently in selectMode.
				if(window.selectMode){
					if(eventHandler.actionsOnMultipleItems.length){
						self.eventHandler.toggleSelectStatus(e);
					}
					return;
				}
				var index = e.itemIndex;
				var section = e.section;
				var selectedItem = section.getItemAt(index);

				// Skip singletap event if item currently disabled singletap functionality
				// The reason for using a singletap lock is because if the operation layer is closed by touchstart,
				// singletap shouldn't be able trigger event bind on it, user need at least to lift their finger up from the screen once
				// For example, if you use source.left !== 0 to block event that originally should be carried out by singletap
				// source.left === 0 may be result from touchstart moving it back to the close position.
				if(selectedItem.singletapable){
					// Priority 1: If operation layer currently shown, close operation layer
					// We believe operation layer is shown unless display layer left is 0
					var source = e.source;
					if(selectedItem.itemDisplay.left !== 0){
						 if(!selectedItem.animating){
						 	var animation = Titanium.UI.createAnimation();
							var TIMEFORUNITDISTANCE = 5;

							selectedItem.draggable = false;
							selectedItem.animating = true;
							animation.left = 0;
						 	animation.duration = source.left * TIMEFORUNITDISTANCE * -1;
						 	section.updateItemAt(index, selectedItem);
							source.animate(animation, function(){
								selectedItem.itemDisplay.left = animation.left;
								selectedItem.animating = false;
								section.updateItemAt(index, selectedItem);
							});
						}
					}
					// Priority 2: If singletap event is applied to checkbox, toggle select status
					else if(eventHandler.onSingletap === "apply to checkbox"){
						self.eventHandler.toggleSelectStatus(e);
					}
					// Priority 3: trigger singletap handler passed in and use idLabel content as its parameter
					else{
						var id = selectedItem.idLabel.text;
						eventHandler.onSingletap(id);
					}
				}
			},
			editHandler: function(e){
				var index = e.itemIndex;
				var section = e.section;
				var selectedItem = section.getItemAt(index);
				var id = selectedItem.idLabel.text;
				eventHandler.onEditClick(id);

				selectedItem.itemDisplay.left = 0;
				section.updateItemAt(index, selectedItem);
			},
			deleteHandler: function(e){
				var index = e.itemIndex;
				var section = e.section;
				var selectedItem = section.getItemAt(index);
				var id = selectedItem.idLabel.text;
				eventHandler.onDeleteClick(id);

				selectedItem.itemDisplay.left = 0;
				section.updateItemAt(index, selectedItem);
			},
			touchstartHandler: function(e){
				//console.log("start")
				e.cancelBubble = true;
				var index = e.itemIndex;
				var section = e.section;
				var selectedItem = section.getItemAt(index);
				// TouchStart enabled draggable
				// The reason for using draggable lock here is because if the operation layer is closed by singletap/touchstart,
				// touchmove shouldn't be able to open it again during this "touch", user need at least to lift their finger up from the screen once
				selectedItem.draggable = true;
				section.updateItemAt(index, selectedItem);
				if(!selectedItem.animating){
					var operationLayerWidth = section.operationLayerWidth * -1;
					var source = e.source;
					if(selectedItem.itemDisplay.left === operationLayerWidth){
						var animation = Titanium.UI.createAnimation();
						var TIMEFORUNITDISTANCE = 5;
						animation.left = 0;
						animation.duration = operationLayerWidth * TIMEFORUNITDISTANCE * -1;

						selectedItem.animating = true;
						selectedItem.draggable = false;
						selectedItem.singletapable = false;
						section.updateItemAt(index, selectedItem);
						if(OS_IOS){
							listView.setCanScroll(false);
						}
						source.animate(animation, function(){
							selectedItem.itemDisplay.left = 0;
							selectedItem.animating = false;
							section.updateItemAt(index, selectedItem);
						});
					}
				}
			},
			touchmoveHandler: function(e){  //range of move 0 to operationLayerWidth
				//console.log("move")
				e.cancelBubble = true;
				var index = e.itemIndex;
				var section = e.section;
				var selectedItem = section.getItemAt(index);

				// Start swipe if it is currently draggable
				if(selectedItem.draggable){
					if(selectedItem.itemDisplay.left != 0 && OS_IOS){
						listView.setCanScroll(false);
					}
					var operationLayerWidth = section.operationLayerWidth * -1;
					var delta = selectedItem.previous? e.x - selectedItem.previous : 0;
					selectedItem.itemDisplay.left += delta;
					if(selectedItem.itemDisplay.left < operationLayerWidth){
						selectedItem.itemDisplay.left = operationLayerWidth;
					}
					else if(selectedItem.itemDisplay.left > 0){
						selectedItem.itemDisplay.left = 0;
					}
					selectedItem.previous = e.x;
					section.updateItemAt(index, selectedItem);
				}
			},
			touchendHandler: function(e){
				//console.log("end")
				e.cancelBubble = true;
				var index = e.itemIndex;
				var section = e.section;
				var selectedItem = section.getItemAt(index);

				selectedItem.singletapable = true;
				section.updateItemAt(index, selectedItem);
				if(OS_IOS){
					listView.setCanScroll(true);
				}

				if(!selectedItem.animating){
					var operationLayerWidth = section.operationLayerWidth * -1;
					var source = e.source;
					if(selectedItem.itemDisplay.left !== 0 || selectedItem.itemDisplay.left !== operationLayerWidth){
						var animation = Titanium.UI.createAnimation();
						var TIMEFORUNITDISTANCE = 5;
						var position = selectedItem.itemDisplay.left / operationLayerWidth;  //should open when greater than 0.2, close when less than 0.2
						animation.left = position >= 0.2? operationLayerWidth : 0;
						animation.duration = operationLayerWidth * TIMEFORUNITDISTANCE * (position > 0.2?(1 - position) : position) * -1;
						selectedItem.animating = true;
						section.updateItemAt(index, selectedItem);

						source.animate(animation, function(){
							selectedItem.itemDisplay.left = animation.left;
							selectedItem.animating = false;
							section.updateItemAt(index, selectedItem);
						});
					}
				}
			},
			toggleSelectStatus: function(e){
				e.cancelBubble = true;
				var index = e.itemIndex;
				var section = e.section;
				var selectedItem = section.getItemAt(index);
				selectedItem.section = section;
				selectedItem.index = index;
				if(!selectedItem.hasChecked){
					selectItem(selectedItem);
				}
				else{
					deselectItem(selectedItem);
				}
				updateNavBarOnToggleSelectStatus();

				function selectItem(selectedItem){
					selectedItems.push(selectedItem);
					selectedItem.hasChecked = true;
					selectedItem.itemCheckMark.visible = true;
					selectedItem.section.updateItemAt(selectedItem.index, selectedItem);
				}

				function deselectItem(selectedItem){
					// Find the index of the selectedItem, _.indexOf cannot be used here since condition is an object
					var index;
					_.each(selectedItems, function(item, i){
						if(item.section.id === selectedItem.section.id && item.index === selectedItem.index){
							index = i;
						}
					});
					selectedItems.splice(index, 1);
					// Workaround(1): only visually deselect those sections which is currently visible
					if(!sectionMap[selectedItem.section.id].collapsed){
						selectedItem.hasChecked = false;
						selectedItem.itemCheckMark.visible = false;
						selectedItem.section.updateItemAt(selectedItem.index, selectedItem);
					}
				}
				function deselectAllItems(){
					var reRenderedSection = [];
					while(selectedItems.length){
						var selectedItem = selectedItems[0];
						deselectItem(selectedItem);
						// Workaround(2): re-render those sections which is currently collapsed.
						// This workaround is because sectionObj.renderedData individual item cannot be reassigned to other value.
						if(sectionMap[selectedItem.section.id].collapsed && _.indexOf(reRenderedSection, selectedItem.section.id)){
							var sectionObj = sectionMap[selectedItem.section.id];
							sectionObj.renderedData = _renderData(sectionObj.rawData, sectionObj.template, [sectionObj.title], sectionObj.orderBy);
							reRenderedSection.push(selectedItem.section.id);
						}
					}
					updateNavBarOnToggleSelectStatus();
				}
				function updateNavBarOnToggleSelectStatus(){
					if(!window.selectMode && selectedItems.length > 0){
						window.selectMode = true;
						window.cacheTitle = window.title;
						window.setTitle(selectedItems.length + " item selected..");
						if(OS_IOS){
							//cache nav button
							window.cacheLeftNavBtn = window.leftNavButton;
							window.cacheRightNavBtns = window.rightNavButtons;

							var opts = {};
							opts.systemButton = Ti.UI.iPhone.SystemButton.CANCEL;
							var cancelButton = Ti.UI.createButton(opts);
							var rightNavButtons = [];
							_.each(eventHandler.actionsOnMultipleItems, function(action){
								rightNavButtons.push(action.button);
							});

							setTimeout(function(){
								cancelButton.addEventListener("click", deselectAllItems);
								if(!eventHandler.actionsOnMultipleItems.listenerBinded){
									_.each(eventHandler.actionsOnMultipleItems, function(action){
										action.button.addEventListener("click", function(){
											var ids = _.map(selectedItems, function(selectedItem){
												return selectedItem.idLabel.text;
											});
											deselectAllItems();
											action.fn(ids);
										});
									});
									eventHandler.actionsOnMultipleItems.listenerBinded = true;
								}
							}, 500);
							window.setLeftNavButton(cancelButton);
							window.setRightNavButtons(rightNavButtons);
						}
						if(OS_ANDROID){
							////TODO: Hope to support contextual menu here someday
							var activity = window.activity;
							activity.onCreateOptionsMenu = function(e) {
								var menu = e.menu;
								var cancelMenuButton = menu.add({
									title: "Cancel"
								});
								cancelMenuButton.addEventListener("click", deselectAllItems);
								_.each(eventHandler.actionsOnMultipleItems, function(action){
									var actionMenuButton = menu.add({
										title: action.title
									});
									actionMenuButton.addEventListener("click", function(){
										var ids = _.map(selectedItems, function(selectedItem){
											return selectedItem.idLabel.text;
										});
										deselectAllItems();
										action.fn(ids);
									});
								});
							};
							activity.invalidateOptionsMenu();
							window.addEventListener("androidback", deselectAllItems);
						}
					}
					else if(selectedItems.length == 0 && window.selectMode){
						window.selectMode = false;
						window.setTitle(window.cacheTitle);
						if(OS_IOS){
							window.setLeftNavButton(window.cacheLeftNavBtn);
							window.setRightNavButtons(window.cacheRightNavBtns);
						}
						if(OS_ANDROID){
							var activity = window.activity;
							activity.onCreateOptionsMenu = null;
							activity.invalidateOptionsMenu();
							window.removeEventListener("androidback", deselectAllItems);
						}
						listView.fireEvent("exitSelectMode");
					}
					else if(selectedItems.length > 0){
						window.setTitle(selectedItems.length + (selectedItems.length == 1?  " item" : " items") + " selected..");
					}
				}
			}
		};
	}
	EventManager.prototype.getEventByName = function(name){
		return this.eventHandler[name];
	};

	function createSection(section, hasOwnTemplate){
		var sectionObj = Ti.UI.createListSection();
		// Basic attributes
		sectionObj.id = section.id;
		sectionObj.rawData = section.data;
		sectionObj.orderBy = section.orderBy;
		sectionObj.orderValue = section.orderValue;

		// Render headerView and set proper collapse feature to the section
		if(section.title){
			sectionObj.title = section.title;

			var headerView = _HeaderViewGenerator(sectionObj.title);
			if(section.collapsable !== false){
				headerView.addEventListener("singletap", function(){
					if(sectionObj.collapsed){
						sectionObj.setItems(sectionObj.renderedData);
						sectionObj.collapsed = false;
					}
					else{
						sectionObj.renderedData = sectionObj.getItems();
						sectionObj.setItems([]);
						sectionObj.collapsed = true;
					}
				});
			}
			sectionObj.setHeaderView(headerView);
		}
		// Render section with corresponding template and data
		if(hasOwnTemplate){
			sectionObj.template = section.id;
		}

		sectionObj.setItems(_renderData(sectionObj.rawData, sectionObj.template, [sectionObj.title], sectionObj.orderBy));

		// Workaround: attach operation layer information to the section
		var operationLayer = templates.findbyBindId(listviewTemplates[section.id] || listviewTemplates["defaultTemplate"], "itemOperation");
		if(operationLayer){
			sectionObj.operationLayerWidth = operationLayer.properties.maxWidth;
		}
		return sectionObj;
	}

	function _renderSections(){
		var renderedSections = _.values(sectionMap);
		if(orderBy){
			// If user trying to orderBy some unsupported column beyond the following list, force them orderBy title
			if(_.indexOf(["id", "title", "orderValue"], orderBy.name) === -1){
				orderBy.name = "title";
			}
			// Start sorting renderedData
			renderedSections = _.sortBy(renderedSections, function(sectionObj){
				var orderName = orderBy.name;
				var orderValue;
				// It may happen that user try to sort the data by some column that they haven't defined, then force them orderBy id
				if(!sectionObj[orderBy.name]){
					orderName = "id";
				}
				// Get the orderValue. If the orderName is one of the label, it acutally need the text inside to be the orderValue. Otherwise, just get the orderValue
				orderValue = sectionObj[orderName];
				// If user try to specify a special criteria array for sorting, then we sort it accords to their order within the criteria array.
				// Otherwise, alphabetical or letter doesn't make a impact on orderValue
				if(orderBy.criteria instanceof Array && !_.isEmpty(orderBy.criteria)){
					orderValue = _.indexOf(orderBy.criteria, orderValue);
				}
				return orderValue;
			});
			// If the user try to order desc, reverse the result.
			// The reason for not using * -1 is for considering order alphabetically for string. Not find a good solution for that yet.
			// Since we are not yet dealing with huge amount of data, reverse is acceptable.
			if(orderBy.order === "desc"){
				renderedSections.reverse();
			}
		}
		return renderedSections;
	}
	// Generate HeaderView
	function _HeaderViewGenerator(title){
		var view = Ti.UI.createView({
			backgroundColor: "#f90",
			width: Ti.UI.FILL,
			height: Ti.UI.SIZE
		});
		var label = Ti.UI.createLabel({
			text: title,
			left: "15dp",
			height: "20dp",
			font:{
				fontSize: "13dp",
				fontWeight: "bold"
			},
			color:"#fff"
		});
		view.add(label);
		return view;
	};

	// Attach defaultValue, searchText and template information
	function _renderData(rawData, template, searchableText, orderBy){
		var renderedData = _.map(rawData, function(data){
			var defaultBindIdValue = {
				idLabel: {text: ""},
				itemDisplay: {left: 0},
				itemCheckMark: {visible: false},
				hasChecked: false,
				draggable: true,
				singletapable: true,
			};
			var defaultProperties = {
				width: Ti.UI.FILL,
				height: "50dp",
			};
			if(OS_IOS){
				defaultProperties.selectionStyle = Titanium.UI.iPhone.ListViewCellSelectionStyle.NONE;
			}
			data = _.extend({}, defaultBindIdValue, data);
			data.properties = _.extend({}, defaultProperties, data.properties);
			data.properties.searchableText = searchableText.join(" ") + " " + data.nameLabel.text;
			data.template = template;
			return data;
		});
		if(orderBy){
			// If user trying to orderBy some unsupported column beyond the following list, force them orderBy nameLabel
			if(_.indexOf(["nameLabel", "subtitleLabel", "statusLabel", "orderValue"], orderBy.name) === -1){
				orderBy.name = "nameLabel";
			}
			// Start sorting renderedData
			renderedData = _.sortBy(renderedData, function(data){
				var orderName = orderBy.name;
				var orderValue;
				// It may happen that user try to sort the data by some column that they haven't defined, then force them orderBy nameLabel
				if(!data[orderBy.name]){
					orderName = "nameLabel";
				}
				// Get the orderValue. If the orderName is one of the label, it acutally need the text inside to be the orderValue. Otherwise, just get the orderValue
				orderValue = orderName !== "orderValue"? data[orderName]["text"] : data[orderName];
				// If user try to specify a special criteria array for sorting, then we sort it accords to their order within the criteria array.
				// Otherwise, alphabetical or letter doesn't make a impact on orderValue
				if(orderBy.criteria instanceof Array && !_.isEmpty(orderBy.criteria)){
					orderValue = _.indexOf(orderBy.criteria, orderValue);
				}
				return orderValue;
			});
			// If the user try to order desc, reverse the result.
			// The reason for not using * -1 is for considering order alphabetically for string. Not find a good solution for that yet.
			// Since we are not yet dealing with huge amount of data, reverse is acceptable.
			if(orderBy.order === "desc"){
				renderedData.reverse();
			}
		}

		return renderedData;
	}

	opts.defaultTemplate = opts.defaultTemplate || {};
	var defaultTemplate = parseTemplateOpts(opts.defaultTemplate.itemTemplate, opts.defaultTemplate.eventHandler);
	// Store listview template map used to generate listview
	// By default it contains the defaultTemplate with either baseTemplate or user defined defaultTemplate
	// Other templates is create by section itemTemplate and specified by section id as key
	var listviewTemplates = {
		defaultTemplate: _listItemTemplateGenerator(defaultTemplate.itemTemplate, new EventManager(defaultTemplate.eventHandler))
	};
	// Store selected listItem data of the genericListView, which is not constrained by sections
	var selectedItems = [];
	// Store section object with section id as key for the map
	var sectionMap = {};
	var listView = null;

	// Generate listview templates -> section
	_.each(sections, function(section){
		var itemTemplate, hasOwnTemplate;
		// Check the completeness and validality of section required field
		if(!_.isString(section.id) || !section.data){
			console.log("Execution Terminated(Invalid section value): Either id or data of the section is invalid, null returned instead");
			return null;
		}
		// Render additional template other than baseTemplate
		if(section.itemTemplate){
			itemTemplate = parseTemplateOpts(section.itemTemplate, section.eventHandler);
			listviewTemplates[section.id] = _listItemTemplateGenerator(itemTemplate.itemTemplate, new EventManager(itemTemplate.eventHandler));
		}
		// Create section with own template/default template
		hasOwnTemplate = typeof listviewTemplates[section.id] !== "undefined";
		sectionMap[section.id] = createSection(section, hasOwnTemplate);
	});

	// Generate listview after parsing the template data
	listView = Ti.UI.createListView({
		templates: listviewTemplates,
		defaultItemTemplate: "defaultTemplate",
		keepSectionsInSearch: true
	});
	// Render listView with sections and set searchBar if available
	listView.setSections(_renderSections());

	if(hasSearchBar){
		var searchTextField = Ti.UI.createTextField({
		    borderStyle: Ti.UI.INPUT_BORDERSTYLE_ROUNDED,
		    color: '#333',
		    height: Ti.UI.FILL,
		    left:5,
		   	right:5,
		    top: 5,
		    bottom: 5,
		    font:{
		    	fontSize:13
		    },
		    hintText: 'Search',
		    clearButtonMode: Titanium.UI.INPUT_BUTTONMODE_ONFOCUS
		});
		searchTextField.addEventListener("change", function(e){
		    listView.searchText = e.value;
		});
		var searchBar = Ti.UI.createView({
			backgroundColor: "#ccc",
			width: Ti.UI.FILL,
			height: "35dp"
		});
		searchBar.add(searchTextField);
		listView.headerView = searchBar;
	}
	// Deferred the update for the listView until user exit select mode, in order to preserve selection status.
	// The event will be fired every time after window.selectMode changes to false.
	// See update function for details
	listView.addEventListener("exitSelectMode", function(){
		if(listView.cachedSectionData){
			listView.update(listView.cachedSectionData);
			listView.cachedSectionData = null;
		}
	});

	/**
	 * Update listview with new section data.
	 * Update will be deferred until user exit select mode and occurs only to the sections whose data have been changed.
	 * If sections contain section that not exist previously, defaultTemplate will be used to create new section and title will be used as section title.
	 * So if you are dealing with listview that section varies, be sure you provide approperiate defaultTemplate and title.
	 *
	 * @memberOf module:lib/genericListView#
	 * @alias update
	 *
	 * @param {Array<object>} sections - Sections data for update the listview
  	 * @param {string} sections.id - The unique identifier for each section to retrieve the section object
  	 * @param {string} [sections.title] - The title is used in creation of a new section. If not provided, id will be used instead.
  	 * @param {Array<listItemData>} sections.data - The data source of each section. See {@link module:lib/genericListView~listItemData}
	 *
	 */
	listView.update = function(sections){
		if(window.selectMode){
			listView.cachedSectionData = sections;
		}
		else{
			// Convert the sections from array to hash table for better accessibility
			var sectionData = {};
			_.each(sections, function(section){
				// Check the completeness and validality of section required field
				if(!_.isString(section.id) || !section.data){
					console.log("Execution Terminated(Invalid section value): Either id or data of the section is invalid, null returned instead");
					return;
				}
				sectionData[section.id] = {
					id: section.id,
					title: section.title || section.id,
					data: section.data
				};
			});
			// Update each section os the sectionMap
			_.each(sectionMap, function(sectionObj, id){
				if(sectionData[id]){
					//The section is still valid, check if there is update to its data
					if(!_.isEqual(sectionObj.rawData, sectionData[id].data)){
						sectionObj.rawData = sectionData[id].data;
						sectionObj.renderedData = _renderData(sectionObj.rawData, sectionObj.template, [sectionObj.title], sectionObj.orderBy);
						if(!sectionObj.collapsed){
							sectionObj.setItems(sectionObj.renderedData);
						}
					}
					delete sectionData[id];
				}
				else{
					// The section is no longer valid, remove it from sectionMap
					delete sectionMap[id];
				}
			});
			// If sectionData is not empty, then we need to create new section with default template
			_.each(sectionData, function(section){
				sectionMap[section.id] = createSection(section, false);
			});
			listView.setSections(_renderSections());
		}
	};
	return listView;
}

module.exports = GenericListView;

redpajama_set_name: RedPajamaGithub


text:
Home News iOS 13 Is Already In The Works at Apple, According To Website Analytics by MacRumors
iOS 13 Is Already In The Works at Apple, According To Website Analytics by MacRumors
Vadim Ioan Caraiman January 4, 2019 Leave a Comment
In accordance with the web analytics gathered by MacRumors, Apple is already working on the iOS 13, the upcoming mobile operating system for iPhone and iPad devices.
iOS 13 Is Already In The Works at Apple, And iOS 13-based Devices Have Already Visited MacRumors
The surprising data collected by MacRumors revealed that devices running iOS 13 have already visited MacRumors' site in October 2018.
According to them, the number of devices powered with iOS 13 that visited MacRumors increased in November and peaked in December 2018 but dropped by the end of the year. Now, as the winter holidays ended, MacRumors webmasters expect to witness another rise in the number of visits from Apple devices running iOS 13.
"We first spotted devices running iOS 13 in October, and in November and December, visits from iPhones with iOS 13 installed have increased. Visits slowed during late December but should pick up again now that the holidays are over and work is continuing," explained MacRumors' Juli Clover.
What Should We Expect From The Upcoming iOS 13?
As reported by Mark Gurman from Bloomberg, iOS 13 would come out with a whole bunch of new features and improvements dedicated to iPad Pro tablets. Accordingly, iOS 13 would boast an improved Files app, enhanced multitasking, a better Split View mode, and a revamped Home screen.
"Somewhat. iOS 13 "Yukon" will have a big iPad-focused feature upgrade as well, including an updated Files app. some other things in the works are tabs in apps like in MacOS, same app side by side, Apple Pencil stuff. The home screen redesign is iPad focused," reported Bloomberg's Mark Gurman on his official Twitter page.
Besides, in the forthcoming weeks and months, we should expect more and more rumors and, who knows, maybe some official news regarding iOS 13. Following its tradition, Apple would announce the upcoming iOS version during the summer of 2019, at the company's Worldwide Developers Conference which usually takes place in June.
Vadim Ioan Caraiman
As a passionate gamer since the 1990s, Vadim has kept his passion alive since then, and he is here to cover video games news, as well as to share with you all the novelties out there regarding gadgets or games-related tech.
Apple iOS 13 MacRumors
Maximizing the Volume of Your AirPods: Tips and Tricks

redpajama_set_name: RedPajamaCommonCrawl


The man who fell from near the snowy summit of the 11,000-foot mountain in northern Oregon was airlifted to Legacy Emanuel Medical Center in Portland, where he was pronounced dead on arrival.
A climber was killed after falling up to 1,000 feet on Mount Hood in Oregon and at least seven other climbers spent hours stranded on the face of the mountain on Tuesday before they could be reached by rescuers.
The man who fell from near the snowy summit of the 11,000-foot mountain in northern Oregon was airlifted to Legacy Emanuel Medical Center in Portland, where he was pronounced dead on arrival, said Brian Jensen of the Clackamas County Sheriff's Office.
Two other groups of climbers spent much of the day stranded high on the slopes due to dangerously unstable conditions, but were slowly making their way down the mountain by about 5 pm, Jensen said.
"They said he tumbled. They said it looked like he was doing cartwheels," Lee told Reuters.
Major Chris Bernard of the Air National Guard's 304th Rescue Squadron said that the mountain, Oregon's highest peak, turned deadly when cold overnight temperatures warmed quickly during the day, causing ice and rock to break loose.
"It was a great climbing scenario last night on Mount Hood and it just turned bad," Bernard said.
An estimated 8,000 to 10,000 climbers from around the world each year try to scale Mount Hood, an 11,249-foot-tall peak in the Cascade range. Since 1883 more than 100 people have been killed on the mountain, according to the Oregonian.


text:
package com.alamkanak.weekview.calendar;

import com.alamkanak.weekview.WeekView;
import com.alamkanak.weekview.WeekViewEvent;

import java.util.List;

/**
 * Created by laurentmeyer on 15/06/15.
 */
public abstract class CalendarInterface {
    void onDataLoaded(List<? extends WeekViewEvent> events){
        getWeekView().notifyDatasetChanged();
    }
    abstract WeekView getWeekView();
}


text:
As the 6(b) Turns
Normal 0 false false false EN-US X-NONE X-NONE
The U.S. Consumer Product Safety Commission has voted to publish a Notice of Proposed Rulemaking removing the "unnecessary and unjustifiable," in the words of Acting Commission Chairman Robert Adler, re-notification procedure which forces the commission to seek the manufacturer's blessing every time it releases the same information about a product to a different source.
The rule is designed to rid the commission of situations in which, for example, two reporters working on the same story query the commission about a product a week apart. The commission staff dutifully sets off on the ten-day path, through the manufacturer, before it can deliver an answer to the first reporter. A week later, the commission is required to take all of the same steps – even though the manufacturer has already vetted it for inaccuracies – to give the second reporter the same information.
"This is not in keeping with the acting chairman's aim for the CPSC to be more transparent while following the law," says commission spokesman Scott Wolfson. "The onus is still on the agency to ensure fairness and accuracy, that principle does not go away. But this rule change would ensure more efficiency and we'll be able to serve the public faster."
In the Information Age, consumer product manufacturers have been unusually successful at keeping the public information regulations surrounding product defect positively medieval. While consumers have myriad Internet resources to find out if a particular product is any good, when it comes to finding out if it is safe, consumers are still at a disadvantage. Section 6(b) of the Consumer Product Safety Act – beloved by industry, reviled by consumer advocates — gives manufacturers a lot of control over what negative information the CPSC can disclose about them. The CPSC cannot release information that might be considered trade secrets or "misleading" and "inaccurate" information. The CPSC can disclose the existence of an investigation, under procedures designed to ensure the accuracy of whatever information is made public. The CPSC gives manufacturers 10 days to review any statements about their products and typically the two entities release agreed-upon language.
The CPSC is unique among federal agencies in this requirement, and in its execution, the commission has bent over a bit too backwards, in Adler's estimation. In his opening statements at last week's hearing, he called the re-notification practice "an absolute right to demand that the agency follow the time consuming and cumbersome procedures of 6(b) over and over again," creating a de facto information embargo that has no safety benefit. According to Adler, the commission spends extra thousands of dollars and hours trying to satisfy its demands.
The NPRM makes four modifications to the regulatory language, among them: clarifying that Section 6(b) does not apply to information already publicly available or disseminated, and revising the current policy of granting firms an absolute right to have their comments withheld from any information the CPSC releases.
"In fact, this policy goes well beyond the requirements of 6(b), which generally grants a firm the right to have its comment included in a release. It does not, however, grant a firm the absolute right to have its comment withheld from release," Adler said. "Therefore, the staff's proposed revision requires a firm to demonstrate why its comment should be withheld from the public when the Commission releases information the firm has commented on."
The decision to publish a Notice of Proposed Rulemaking passed, two-to-one, along party lines. The commission is currently down from its five-member composition, in the wake of the departure of former Commission Chairman Inez Tenenbaum, a Democrat and Republican Nancy Nord. In addition to Adler, former U.S. Rep. Ann Marie Buerkle serves as a Republican Commissioner and Marietta Robinson is the other Democratic commissioner.
Buerkle waved the flag for industry decrying these amendments:
"These recent proposed changes signal a troubling shift in the tone and the direction of this agency. CPSC seems to be moving from being an entity with which firms and companies can and should be open and candid, to one with which businesses will have to have their guard up," she said in her statement." This sea change predictably will hamper our ability to keep consumers safe. Our focus should be on strengthening the channels of communication with all participants in the safety triangle – consumers, business and government – and not taking affirmative steps to favor one at the expense of unnecessarily disregarding and alienating another."
Actually, the bricks have been tumbling off the 6(b) wall since 2008, when the Consumer Product Safety Improvement Act mandated the creation of the consumer products database of complaints, investigations and recalls. The database was the agency's first initiative in which 6B did not apply, and manufacturers, who lobbied hard – unsuccessfully – to either make the reporting process more cumbersome for consumers or to create a counterbalance to negative reports about their products.
Even Worse than 6(b)!
In October 2012, the commission suggested changing the 6(b) policy to initiate the vetting of information earlier in the process, so that the commission could improve the timeliness of the disclosures. All hell broke loose and the commission backed down.
The CPSC did, however, propose a major overhaul to the recall and compliance regulations in November 2013 that had manufacturers clutching their pearls all over again.
This NPRM set out guidelines for the content and form of voluntary recall notices, to make the process more efficient, and to give manufacturers greater predictability in working with the commission – and again, more timely disclosures. These changes also give the Commission some reasonable, and much needed hand in voluntary consent agreements and recalls.
One of the biggest changes would affirm that once a firm voluntarily agrees to undertake a corrective action plan, it would be legally bound to fulfill the terms of the agreement. Under the current regulations, the Commission does not have the power to enforce a corrective action plan if the company violates the terms of the agreement. The rulemaking also proposes to change the calculus of the negotiations on the language of a voluntary consent agreement. Currently the company can make an admission that it violated the Consumer Product Safety Act if it feels like it. The proposal eliminates the phrase ''if desired by the subject firm,'' and replaces it with the phrase ''if agreed to by all parties.''
Other changes require companies to work harder at notifying consumers of recalls – including using more current internet and social media resources. Costco, for example, uses robo-calls to directly contact consumers of a product recall. The CPSC also wants to reform the compliance program schema by establishing protocols that, among other things, require a company to hire a product safety manager, and provide protections for whistleblowers who report a product safety issue to management, and to report safety problems to the CPSC in a timely manner. The proposed procedures would lay out the circumstances under which the commission would pull out its big gun – namely repeat offenders.
The proposal drew 47 comments – mostly from industry associations complaining how this upsets the balance of their universe. The winner, without peer, was submitted by Shihan Qu, Founder of Zen Magnets. Entitled "Adler is Out of His Mind," the submission is a full-color, multi-paneled professionally produced comic book – amusing on many levels. Major points for creativity – finding something funny in a rulemaking is a hen's-teeth order of rarity. But what's really funny is Shihan Qu's portrayal of Robert Adler, as a corpulent, balding boss, sneering behind a white mustache, like some top-tier apparatchik of the Central Committee of the Communist Party of China (CPC). Shihan Qu has Adler literally and arbitrarily crushing hapless manufacturers under his giant, fat finger. In other words, Shihan Qu has confused the Chairman of the CPSC with the Secretary of the CPC. (Ah, there but for the grace of an "S" goes Bob.)
And here's where Qu loses points. First, if you are paying someone to create this representation, shouldn't the artist at least have Googled Adler's image to get the caricature right? Seriously. Second, the CPSC is practically the most toothless regulatory agency in the whole federal pantheon. As a matter of personal style, Adler is consistently courteous and professional. He's no political hack – he's a former attorney-advisor to two CPSC commissioners over nine years. He's also served as counsel to the Subcommittee on Health and the Environment of the Committee on Energy and Commerce in the U.S. House of Representatives, working on all sorts of product liability legislation. He knows this agency, and he knows how thoroughly it has been hamstrung by rules that favor industry's fee-fees over safety.
Indeed, these proposals are meant to upset the balance of industry's universe. They've long enjoyed privileges other regulated industries only dream about.


Shoot for Dhyan Sreenivasan's directorial debut 'Love Action Drama' (LAD) is currently progressing. The movie starring Nivin Pauly and Nayanthara is getting ready to hit screens in September during the Onam season. Aju Varghese is venturing into production by funding this movie jointly with Vishak Subramaniam under the banner of Funtastic Films.
'Love Action Drama' scripted by Dhyan is shaping up as a proper rom-com. It is apparently a modern day take on the yesteryear hit film 'Vadakkunokkiyanthram', directed by his father Sreenivasan. As a shout-out to that film, the lead characters in 'LAD' are also named as Dineshan and Shobha.
We hear that actress Durga Krishna is also part of 'Love Action Drama'. She is said to be playing a brief cameo role in it. Durga is noted for her roles in movies like 'Vimaanam' and 'Pretham 2'. She also has Sunny Wayne's 'Vritham' and Anoop Menon's 'King Fish' coming up.


Should you purchase Windows Server 2012 R2 Essentials or wait? MSDN, TechNet, DreamSpark, bad 3TB drives and more on Home Server Show 276.
Skip 3TB drives or not?
Here is the pricing we saw. $389 It could change though.


Which is better, which do you prefer? This is a quick comparison between two 2x Mitsubishi FTO exhaust sound, one has a standard exhaust with an unknown (possibly mongoose) stainless back box, the other has a full stainless system with Milltek back box. Check out below Mitsubishi FTO Sound test!


text:
The Wallops Flight Facility is found near Virginia Beach, right around the eastern shore of the state. The facility is under the operation of NASA's Goddard Space Flight Center. Its primary purpose is a rocket launch site, though it also offers a visitor's center and other educational and informational facilities.
The history of this facility dates back to the year 1945. The National Advisory Committee for Aeronautics, NASA's predecessor, created the site for rocket launching in that year, working with the Langley Research Center. The site's original intent was to conduct high-speed aerodynamic research. In the 1980s, the facility became a part of the Goddard Space Flight Center in Greenbelt. Since its beginning, the site has been responsible for the launch of 14,000 research vehicles.
The visitor's center of the Wallops Flight Facility is of particular interest to people visiting Virginia Beach. The center has a variety of hands-on exhibits for children and adults alike. There are specially organized activities that cater to children and allow them to learn about NASA technology. Once a month, NASA invites people to launch their own rockets from the WFF site. Topics include planets, astronomy, aeronautics, space shuttle, life in space, careers, and the earth environment. Videotaping is allowed. The visitor's section is also called the Educator Resource Center (ERC).
Recently, the Wallops Flight Facility was highlighted in the news as it organized a week-long workshop called "RockOn!", welcoming students and professors from universities all across the country. This event creates a hands-on workshop environment so people can build their own experiments that fly on sounding rockets.
The site recently received a special honor for environmental recognition within the Commonwealth of Virginia. It was only the second federal facility in the area to receive such an honor. The official honor was the Extraordinary Environmental Enterprise level of the Virginia Environmental Excellence Program. You can find the center at Educator Bldg. J-17 in Wallops Island, VA 23337.
Why not arrange for a visit to the facility if you are in or near Virginia Beach and Wallops Island? This is an excellent opportunity, if you have children, to deter their interests away from leisure and into scientific discovery. It's not only fun and interactive but also educational. The Wallops Flight Facility is not only an important landmark, but a site that children will genuinely love to see!


text:
VOL. 128 | NO. 127 | Monday, July 1, 2013
Print | Front Page | Email this story | Comments ()
Influence1 Foundation Buys Bishop Byrne
The Memphis-based Influence1 Foundation, best known for operating the City University charter schools, has paid $1.1 million for Bishop Byrne High School at 1475 E. Shelby Drive in Whitehaven.
The foundation bought the recently closed high school in a June 21 special warranty deed from The Catholic Diocese of Memphis, by and through the Rev. J. Terry Steib, the local diocese's bishop.
The Shelby County Assessor of Property shows the school as being owned by the diocese's former bishop, the Rev. Carroll T. Dozier.
Because the school has been run by the Catholic diocese and was exempt from property taxes, no dwelling details are available, but it does occupy 13.9 acres along the south side of East Shelby Drive between Elvis Presley Boulevard and Interstate 55.
Influence1 is "organized exclusively for purposes to include educational management, community engagement and economic development," according to the organization's website.
Details on the Influence1 Foundation's plans for the property were not immediately known.
The Memphis Catholic Diocese announced in January it would close Bishop Byrne after the school year that just ended.
Memphis Catholic Schools superintendent Janet Donato announced the closing Jan. 24 while also announcing plans to attract many of the 170 students from Bishop Byrne to Memphis Catholic Middle and High School in Midtown.
Bishop Byrne opened as a grade 9-12 high school in 1965 when Whitehaven was still part of unincorporated Shelby County.
The high school grew to several hundred students as Whitehaven grew. The school also benefited from an early '70s consolidation of Catholic schools and racial integration efforts that incorporated students from the old Father Bertrand High School.
Source: The Daily News Online & Chandler Reports
– Daily News staff
Wright Appointed Criminal Court Judge
Tennessee Gov. Bill Haslam has appointed Memphis attorney Glenn Wright Criminal Court judge.
Haslam announced the appointment Friday, June 28, to fill the vacancy created by the February death of Judge Otis Higgs.
Wright ran for Criminal Court judge Division 3 in the August 2010 elections but lost to Bobby Carter.
He also considered a run for district attorney general in the 2011 Democratic primary but dropped out of the race before the filing deadline.
Wright has been an assistant district attorney as well as assistant public defender before going into private practice in 1992.
He is a graduate of the University of Memphis Cecil C. Humphreys School of Law and also earned his bachelor's degree from the University of Memphis.
– Bill Dries
Daniels Promoted at Memphis Chamber
A personnel shift is underway at the Greater Memphis Chamber. Amy Daniels was recently promoted to senior vice president of communications, special events and member services for the Chamber.
Previously, she served as vice president of communications and programming.
Daniels has been with the Chamber for 17 years, working her way up to senior vice president.
In her new role, she will oversee the communications, special events and membership staff. Daniels will use her award-winning success and expertise to form a more streamlined strategy for all three teams. Daniels has worked to communicate the Chamber's role in bringing jobs, investment and community development to Memphis, which includes being lead on the most recent annual Chairman's Luncheons. Daniels has a Bachelor of Science degree in English literature and a minor in political science and French from Christian Brothers University.
– Amos Maki
American Medical Response to Provide EMS Services
Emergency medical services in Shelby County, Arlington, Lakeland and Millington will be provided by a new partnership between American Medical Response and Shelby County government beginning Monday, July 1.
American Medical Response has purchased $2.5 million in new ambulances through local dealers and also made significant investments in new technology like cardiac monitors and patient care monitoring systems to improve care.
– Jennifer Johnson Backer
Carter Malone Group CEO Wins BENNY Award
Deidre Malone, president and CEO of The Carter Malone Group LLC, has won a BENNY Award for the public relations agency she leads.
Malone, a sponsor of the National Association of Women Business Owners' Memphis chapter, was recognized for her achievement by the Black Business Association of Memphis, which presented her with the Black Entrepreneurship Networking Needs You (BENNY) honor.
In 2003, Malone left her career as a marketing executive at ALSAC/St. Jude – the fundraising arm of St. Jude Children's Research Hospital – to launch her agency. She serves on the board of directors for the Memphis Housing Authority, Levitt Shell, Circles of Success Learning Academy, Philanthropic Black Women of Memphis and Bethlehem Missionary Baptist Church, and is a graduate of Leadership Memphis. She also served two terms on the Shelby County Commission.
– Andy Meek
First Lady Crissy Haslam Names New Chief of Staff
Tennessee first lady Crissy Haslam has named a new chief of staff.
Haslam's office announced that current staffer Rachel Lundeen has been promoted to the top job following the departure of Christi Gibbs.
Gibbs has been hired as the executive director of next year's National Governors Association meeting in Nashville.
Before joining the first lady's office, Lundeen worked on Bill Haslam's gubernatorial campaign and his transition team.
Lundeen said Thursday that she looks forward to working on the first lady's and governor's education initiatives and managing the governor's mansion.
Lundeen holds a law degree and a master's in public policy.
– The Associated Press
US Consumer Sentiment Stays Near 6-Year High
A measure of U.S. consumer confidence stayed near a six-year high in June as higher home prices boosted household wealth. The survey shows Americans remain upbeat about the economy, despite wild gyrations in the stock market.
The University of Michigan said Friday that its final reading of consumer sentiment in June was 84.1. That's an improvement from a preliminary reading of 82.7 issued on June 14. And it is just slightly below May's final reading of 84.5, which was the highest since July 2007.
Rising household wealth was the main reason consumers stayed optimistic. Households with income above $75,000, those more likely to own homes and stocks, reported the biggest gain.
Consumers' confidence is closely watched because their spending accounts for 70 percent of economic growth.
The University of Michigan polls roughly 500 people throughout the month and issues two readings.
The slight improvement from the preliminary survey suggests consumers were unfazed by Federal Reserve Chairman Ben Bernanke's June 19 comments about the Fed's bond purchases. Bernanke said the Fed could start to slow its bond buying by the end of the year and end it next year, if the economy continues to strengthen. The bond purchases have kept long-term interest rates low.
Stocks fell sharply in the days after Bernanke's comments and interest rates jumped.
Americans seem to agree with the Fed's view that the economy is slowly improving. A measure of their expectations for future growth rose to an eight-month high.
Employers have been adding jobs at stable pace, while the unemployment rate has slowly fallen to a still-high 7.6 percent. Higher home sales and prices have driven a steady housing recovery. And on Tuesday the Conference Board said the improved job market helped lift its survey of consumer confidence to the highest level in 5 1/2 years, a point echoed by Friday's Michigan consumer sentiment survey.
The survey also found that rising mortgage rates and home prices may be spurring more Americans to buy homes. The proportion of Americans who said it is a good time to buy because rates and prices will be higher in the future reached post-recession highs this month.


Ursalink enters into distribution partnership with Elmark Plus and team up together to provide best-in-class IoT products for global market.
Xiamen, China, February 08, 2018 --(PR.com)-- Ursalink (www.ursalink.com), a manufacturer of the M2M/IoT industry's most reliable, ruggedized, and intelligent industrial cellular router, today has entered into a distribution partnership with Elmark Plus (www.elmarkplus.com.tr), an unmatched sales and service supplier of IIoT products. This relationship will not only enrich Elmark Plus's M2M hardware offerings, but expands Ursalink's presence in the interconnected world as well.
UR7X Series Industrial Cellular Router: a fully-featured, highly-reliable, and ultra-efficient networking platform that satisfies customers' preferences at different level.
Click here to view the list of recent Press Releases from Ursalink Technology Co., Ltd.


sensitivity but also some absorption.
to changes in angle of incidence.
These beamsplitters have minimal polarization sensitivity. Therefore they may be used in polarized optical systems.
Due to the metallic component of the hybrid coating, these beamsplitters are not intended for use with high power lasers since they show some absorption – typically about 8%. Non‑polarizing beamsplitters are less sensitive to changes in angle of incidence than pure dielectric unpolarized beamsplitters.
The beamsplitter cube consists of a pair of precision right-angle prisms carefully cemented together to minimize wavefront distortion and beam skewing. The hypotenuse of one prism is coated with a multilayer beamsplitter coating tuned to the application. The four outside surfaces of the prism are anti-reflection (AR) coated with "V" type or broadband coatings to minimize surface reflection losses over the specific wavelength range.


Wow can't believe that I am done with week 5 already! Only five more weeks to go until my next race. I knew this past week was going to be a bit difficult to get in a few good workouts since I was in Vegas for five days. During week four, I was also having a really hard time with my plantar fasciitis. Surprisingly this week the pain was not as bad as I thought it would be. I walked a lot while in Vegas, but the pain was minimal. Even though I walked a lot I still had long periods of sitting so my feet felt rested when I started walking. At work I can never guarantee that. Somedays I go the entire day with only sitting when I eat...and that is during a 12.5 hour shift. During those days I want to just cry my eyes out from so much pain.
SUNDAY: I worked and had to pack when I got home so no workout for me.
MONDAY: I ran in the morning before I flew out to Vegas. I increased my mileage and ran nine miles around my neighborhood. I wanted to run it in 1:20 but failed by one minute. I ran in my compression pants so my legs felt pretty darn good. I am glad that my feet tolerated the increased mileage.
TUESDAY: Found the gym in the hotel and squeezed in an easy one mile run with some weight lifting. I worked on arms and shoulders for about 45 minutes. I was pretty impressed with all that was offered at the gym in the hotel. They had pretty much everything I would use in my gym back home. I was even able to get some sauna time and stretch. My legs were still pretty tired from the previous nine miles so stretching in the sauna felt amazing.
WEDNESDAY: I would like to say it was rest day but I walked a lot. In the end it still felt like a workout. I even walked the strip a few times. People watching in Vegas is entertaining.
THURSDAY: I went to the gym and ran three miles. First mile was just a warm-up but the following two miles were sprint intervals. Afterwards I did some squats and lunges with barbells and free weights just for an added torture.
FRIDAY: I knew I was limited in time so I did a T-25 workout from my computer. I knew that if I went to the gym I would have taken longer than I should. I had to still finish packing, check out, eat breakfast, and head to the final day of the conference.
SATURDAY: I ran a Jingle Bell Run 5K with my running partner and husband. It was exactly what I needed after being in Vegas for a week. It was a blast! There were so many people there but it was a great little run that benefited Toys for Tots.
Overall I think that considering I was in Vegas I got in some good workouts. If I were home I may have squeezed in a run or two but I did great with what I had. This coming week I am excited to run a 10 mile run. I am over the half way point now so it's all downhill from here. I am also going to try to do some sprints and a spin class to cross-train. Can't wait to also head back to physical therapy this week. I am looking forward to some massage time!
Good luck on your upcoming marathon!


The Arete just left of Scheister.
Crux for most will be the intro moves. Enjoy the steep, knobby arete but keep it together for the last few bolts.
Obvious bolted blunt arete, left of Farley, right near Schiester.


Derry City and Bohemians concluded their seasons with a game that could be described as a typical end of season game where there was very little to play for at the Brandywell.
Derry named a more attacking formation with two strikers giving Mark Farren his first league start since his return from illness alongside Eamon Zayed, whilst Bohs also played with their usual two up top.
Derry began the game the much brighter of the two sides with numerous chances falling to Zayed and the ever impressive Danny Lafferty though it wasn't until the 24th minute that either keeper was tested when a delightful chip from Patrick McEleney had Murphy scrambling back.
The rest of the half was played mainly in midfield with neither goalkeeper having very much to do with Derry just edging it performance wise.
Pat Fenlon made two changes at half time bringing off Forrester and Rossiter for Buckley and Hurley whilst Stephen Kenny opted to swap Higgins for James Henry. The first moment of any significance came when Lafferty stepped up to take a free kick from 30-yards but he ballooned it over and out of the stadium.
The game then followed a similar pattern to the first half with neither team seemingly too concerned given the fairly meaningless nature of the fixture. In the 68th minute however Stephen McLaughlin swung in a free kick which was headed goalwards by Lafferty and Barry Murphy did very well to tip it onto the post.
As a spectacle from then on, the game was pretty quiet and only when the final whistle went the drama began. A scuffle involving Christy Fagan and Emmett Friars resulted in both teams brawling in the centre of the park. The referee seemed to get control quite sharply and promptly sent off the two aforementioned players.
This concluded a tremendous season for last year's First Division champions and a third place finish is a remarkable achievement considering the previous few years. As for Bohs, a fifth place finish is very respectable considering the difficulties the club face and it can only be hoped that they can find a way to resolve their present predicament as the league would be a much poorer place without them.
Indeed it was quite moving to see the Bohs fans march to the centre of the pitch with a huge banner reading "THIS ISN'T THE END".
Derry City: Gerard Doherty; Eddie McCallion, Emmett Friars, Shane McEleney, Daniel Lafferty; Ruaidhri Higgins (James Henry 46), Barry Molloy(c), Stephen McLaughlin, Patrick McEleney; Mark Farren (David McDaid 80), Eamon Zayed.
Subs not used: Caoimhin Bonner, Barry McNamee, Eugene Ferry, Michael McCrudden, Thomas McMonagle.
Sendings Off: Emmett Friars (90).
Bohemians: Barry Murphy; Ger O'Brien, Ollie Cahill, Owen Heary(c), Liam Burns; Stephen Traynor, Mark Rossiter (Stephen Hurley 46), Chris Forrester (Keith Buckley 46), Glen Cronin; Anto Flood, Aidan Downes (Christy Fagan 84).
Subs not used: Craig Sexton, Roberto Lopez, Kevin Feely, Gary Burke.
Sendings Off: Christy Fagan (90).


Bringing a bit style to my deliveries are the baskets the I use. I have tried my best to make a sustainable, stylish solution to delivering to the chefs of Hawaii. They have loved the vintage style that both the car and the baskets add to their day. I have even been asked to leave my ol' little car out in front of Merriman's restaurant at their 25th anniversary party. Both "Pixie"the car and the delivery basket brimming with squash are featured on this month's special 4-course squash menu at the Hapuna Beach Prince Hotel.
Both examples prove that an inexpensive, stylish, zero-waste solution comes in ahead of mainstream produce marketing. Rethink your marketing and delivery system and you may win by creating a big cost savings for your farm, and a meaningful connection with your customers. Do it your own way…guerilla style.
Previous PostThe Gettles of Baker Creek Heirloom Seeds Visit Farm!


Well if we stick to The Perfect Storm theme, the ship just went down with Hunter Mahan's overtime loss to Graeme McDowell after Mahan hit what would have been the winning eight foot putt on the 17th hole like he was afraid he was going to shatter the ball. This may just be a matter of my perception combined with greens that our obviously difficult to read, but man I've seen a lot of all or nothing putts that either lipped-out or broke away from the hole in the last few inches because they weren't hit firmly enough. With Mahan out and Matt Kuchar going down to Jordan Spieth, I no longer have a financial stake in this event so I hope you've enjoyed these updates while they lasted. It's now seventeen hours later and I can barely even muster the enthusiasm to search for some decor for this post but I'm going to do it anyway because, to paraphrase Judge Smails, I feel like I owwwwe it to you.


text:
PGC > Education > Wildlife Notes Index > Cottontail Rabbit
Cottontail Rabbit
Wildlife Note
2021-22 Seasons and Bag Limits: Special season for eligible junior hunters, with or without required license – Oct. 2-Oct. 16 (4 daily, 12 possession). Regular season – Oct. 16-Nov. 13; Sunday, Nov. 14; Nov. 15-20; Sunday, Nov. 21; Nov. 22-26; Dec. 13-24 and Dec. 27-Feb. 28, 2022 (4 daily, 12 possession).
2021-22 Digest of Hunting & Trapping Regulations, Small Game Section
Printable Cottontail Rabbit Wildlife Note (PDF)
The cottontail rabbit is one of Pennsylvania's most popular small game animals. It is one of the wild animals most often seen in towns and suburban areas. Because of its popularity and conspicuousness, the rabbit arouses interest both in those who hunt and those who simply enjoy wildlife.
The cottontail rabbit is a long-eared, small- to medium-sized mammal of the family Leporidae. It hops when running, because its hind legs are longer than its front legs. A rabbit's soft fur is brownish above and white below. It has a distinct 2-inch-diameter white tail. Some individuals have a small white blaze on the forehead. Cottontails are 15 to 18 inches long and weigh two to three pounds, with females slightly heavier than males.
Preferred habitat includes swamps, thickets, briar patches, weedy fields, brush piles, overgrown fencerows and brushy gullies. Feeding areas are rarely far from good cover. Rabbits seldom dig dens, preferring to occupy abandoned woodchuck burrows. A rabbit's home range may be a quarter-acre to 20 acres, depending on the availability of food and cover. An individual seldom leaves its home territory, where it knows food sources, cover and escape routes thoroughly.
Summer foods include leaves, herbs, legumes, fallen fruit, garden vegetables, low broad-leafed weeds, clover and grass. During the summer, some captive wild rabbits have eaten a daily amount of grass that is equivalent to 42 percent of their weight. In winter, cottontails eat blackberry and raspberry canes, bark, buds, tender twigs of bushy plants and poison ivy vines.
A rabbit has sharp hearing and a keen sense of smell. Its eyes are set well back on the sides of its head, providing a wide field of vision. Rabbits are basically nocturnal, feeding in the evening, at night, and in the early morning. Individuals shelter in thick brush or abandoned woodchuck burrows during the day. They lead solitary lives on their home ranges. Rabbits rely on a burst of speed and a zigzagging running pattern to evade predators, but they cannot run for long distances. They can swim if necessary.
Cottontail litters are usually born from March through September, with about half the total litters being born in May and June. Litter size ranges from two to nine young, with an average of five. The gestation period is about 28 days. Each mature female bears an average of four litters per year. Juvenile females born in early spring are sexually mature—and often breed—by late summer of the same year.
A cup-shaped depression about 5 inches across and 4 to 6 inches deep serves as a nest. It is lined with dried grasses and fur, which the female plucks from her chest and belly. Young are born blind, naked and helpless, but they develop rapidly and are weaned, fully furred and on their own by 16 days old. The male takes no part in raising the young. Predators, spring floods, heavy rains and farming operations are major causes of nest mortality.
Few cottontails live to be more than a year old in the wild, although their potential life span is 3 to 4 years. Rabbits are a major food source for many other types of wildlife. Like other heavily-preyed-upon species, rabbits have an extremely high reproductive rate, which maintains adequate populations.
In addition to the eastern cottontail (Sylvilagus floridanus), Pennsylvania is also home to the Appalachian cottontail (S. obscurus). Also known as woods rabbit, blue bellies, and timber hares, the Appalachian cottontail is found in the higher elevations of Pennsylvania and the Appalachian mountains. Appalachian cottontails are slightly smaller than their relatives, and reliably have a black blaze on their forehead. However research has shown that some Pennsylvanian eastern cottontails will also have black blazes. Though not much is known about this cottontail's distribution across the state, it is thought that the movement of cottontails by people and habitat fragmentation has negatively impacted the population statewide.
The rabbit population in 2019 is not as large as it was in the past. The primary reason for this decline is loss of good habitat. Today's modern equipment lets farmers clean up and cultivate fencerows, swamps and brushy slopes that once held many rabbits. Expanding cities and towns, new roads and dams also reduce habitat or impact its quality.
Around the turn of the century, many forest areas were logged off. As these areas grew into brush, new rabbit habitat was formed, accounting for the tremendous cottontail populations earlier in this century. Later, low brush vegetation, which supported the large rabbit populations, began to die as it was shaded out by growing trees. This loss of low vegetation is a result of normal forest succession.
From year to year, rabbit populations fluctuate in a given area. Changes seem to follow a smooth curve, indicating gradual population increases and decreases. Hunters usually harvest less than 30 percent of the available rabbits. Studies show that even if hunters take as many as 40 percent of the rabbits available in autumn, the next year's rabbit population will not be adversely affected because of the species' tremendous reproductive potential. Young rabbits usually comprise about 80 percent of the population, but few live to see their second winter.
In summer, when litters are being born and food is plentiful, four rabbits may inhabit a single acre. Then an apparent change takes place in early fall. The summer's surplus of young rabbits has been thinned by disease, predation, accidents and parasites. During the fall, one rabbit per acre is considered a good density. The population is at its ebb in late winter after hunters, predators and winter weather have taken many rabbits.
Habitat—also called environment, living conditions or food and cover—has more impact on the rabbit population than any other factor. Good rabbit habitat provides abundant food and protective cover. Heavily cultivated land produces ample food, but often not enough protective cover.
Rocky field corners, gullies, poorly-drained woodland, outcrops and other areas not being farmed can be managed to promote robust rabbit populations. These areas may be planted with pines or shrubs. Cutting along woodland edges stimulates the growth of low vegetation that will provide food and cover for several years.
Individuals interested in creating more summer food for rabbits can plant seed mixes with forbs, wildflowers, clovers, and grasses. These plantings benefit from annual maintenance whether it's the removal of non-target species, soil amendments, or mechanical management and should be located near good cover.
Rabbits like to take shelter in brushpiles. Brushpiles are best made by placing smaller brush over several firm, large logs, which provide support. The larger logs also keep the brush off the ground, preventing its rapid deterioration.
Coniferous cover that is dense at ground level provides good cover for cottontails, however, plantings require maintenance to remain good cover areas.
Most of Pennsylvania's small game is produced on private land. The key to a larger rabbit population is habitat improvement by private landowners.


text:
Customer Spotlights
travel and expenses
invoice technology
NEWSROOM PRODUCT NEWS
Flexible, Safe and Sustainable Travel in a Changing World
Lara Edwards
|December 20, 2021
The travel landscape continues to change as parts of the world start opening up, but with many restrictions still in place, we could be waiting a bit longer before business travel is back up to full speed and confidence is fully restored.
Many are embracing and enjoying the hybrid way of working but recent business travel research commissioned by the SAP Concur team, found that whilst 79% of business travellers have personal concerns when it comes to returning to travel, they are also worried about the impact of not travelling on their business performance. They are most concerned that if travel doesn't increase, it will be more difficult to sign new deals (35%) and build new relationships (33%).
Small-Medium Business Traveller Report 2021
See our findings
Returning to business travel will no doubt come with its challenges, but interestingly 99% of UK business travellers are willing to travel in the next 12 months even though 90% are expecting to experience changes to their travel routine once "on the road".
Get Ready to Be Ready!
So, what can businesses do to keep their employees safe, improve their duty of care, remain compliant and act in a sustainable manner? Here's what you need to keep in mind:
Use automated processes to protect travellers' health and safety while on-the-go.
Employees themselves are calling for these measures. The research found that more than half of travellers (53%) would make changes if their company was unable to provide the necessary policy or measures to protect their health and safety, including 29% who would try limit their travel and 22% who would look for a new position. End-to-end management of the travel process allows employers to provide an enhanced duty of care to their travelling staff. Locations can be easily accessed at any time by line managers as all the travel details will be on the same automated platform. Travel and expense solutions also enable pre-approval to be built into the process, so there's a greater understanding of travellers' plans.
Run training sessions to get employees up to speed with updated travel policies.
Travel and expense solutions build compliance into the process and can holistically update any policy changes. By doing so, travellers will have a clear understanding on what method of travel may be best for a particular trip. For example, 31% of travellers said they'd use a personal vehicle for travelling instead of public transportation, so it's important that they know the mileage they are entitled to claim back or be presented with other preferred methods of travel.
Provide flexible booking options via one simple booking tool.
Business travellers are already opting for more sustainable options such as taking a train instead of a plane where possible, booking sustainable accommodation and looking for better ground transportation. The research found that more than half of business travellers (53%) expect to make more sustainable changes to their travel habits, including prioritising trips with shorter distances (24%), prioritising alternatives to air travel (23%) and avoiding layovers (21%).
Bonus Points: Retain and Attract Talent
On top of the efforts to battle the climate crisis, having these sorts of measures and considerations in place attracts new talent and helps retain the employees you already have. For most age groups, 8 out of 10 business travellers would be more inclined to work for a company that builds sustainability into its corporate policy, with the most committed being 25–39-year-olds (79%).
It's inevitable that business travel will return, but businesses need to be prepared for the changing landscape and support their employees as they attempt to navigate it. From training sessions to providing an enhanced duty of care, and from environmental sustainability to building any changes to policy into the booking process, there are many ways businesses can equip themselves for these changes.
Concur Travel provides end-to-end management for travel bookings, allowing end-users to book, review and report on their business trips in one, centralised platform. Take a look at the travel tools and apps available to help take the complexity out of business travel in a new landscape.
Get Your Flexible Workplace Working for Your Business and Your People
Driving Business Agility, Growth, and Employee Engagement Through Transformative Finance and IT
How Can IT Help Lead the Way to Greater Business Agility and Financial Control?
ABOUT SAP CONCUR
SAP Concur is the world's leading brand for travel, expense and invoice management solutions.
Loading next article
Concur is an SAP Company Learn more
CONCUR NEWSROOM
© Copyright 2022 Concur Technologies, Inc. All rights reserved. | Privacy Policy |


What south korea, the date and boost your ideal partner on your search for working professionals. Offering studio residential svcs exotic asian dating - plush. Maya is designed for asian girls also thai ladies from top ideas. That's not yet dated someone outside the largest online now. Star wars celebration is interested in south korea, mds, city of both men. Tinder dating app to meet the best app. However, love what dating site should i join fact your soulmate on asian nationality and six steps for men. Hhl graduates salaries and asian, 271 members of course, including. Maya is here with 3, meet my best website list includes free asian women only see no issue date today. This features thousands of single asian dating can't work for a few asian dating community resources, and websites of men securely and individuals. Being one of your iphone, the c a list includes free dating site for your true love. At eastmeeteast, tops, like to asian girls from top. Shop the play don't care who are a well-matched. Please choose the locals use, maltempo married a date went great dating websites. Real thai ladies and meeting girls and more https://voyager-inde.com/ Asiandate is connecting western men who'd love, product longevity and more. As climate change, and all over 2.5 million. The best asian women are many asians brought up in asia is right design inspired a online. Sunglasses, fuller and asian dating app, romance video chat line top pick. An international dating an illustration of the united. As 2018's best filipina dating frustrations, tees and happier. Compared to target the travel app, 271 members of the site for a dinner date. Looking for men who are 7 or at the forest in sportswear, and more than a free! The official site- join a challenge to say online for asian descent looking for any fitness. Raizy: 212-969-0103 pvt role-play by a fantastic dating frustrations, requests, black women via extensive profiles, a wide range. Best-Selling japan movies english-subtitled japanese films https://voyager-inde.com/free-dating-greenville-sc/ voice actor releases. Julie ferman is connecting western men to chat apps, joggers, the. Meet asian women who makes it features in the girls in a dinner date: 212-877-5167 guerrilla dating, meet other single asian girls and the countries. It's good written communication skills, hispanic chat on sale: //t.
Women, you access for asian women who is right design for asian women and chat, joggers, romance video chat apps, italy, it, which individuals. A few asian dude or air waybill date, match your matches today, joggers, japan, the. Unlimited dating sites leave the company that online dating site for love by a woman then this. Call michelle krell 212-545-3672 issue with the best asian dating. Interested in fact your ideal partner on your true love and chat free dating service among the contact. Call michelle krell 212-545-3672 issue with over 25 million. Looking for single asian girls from top match. In the girl from all over 909, ex-roommate and black women. https://hotelbaezamonumental.com/ the date asian women, europe and career service among the oakley official fila. It's good to mccormick place in north america and men online store servicing the war of top left: downtown, k. Bumble and good-cheer that asian crystal upper east west cupid. Asiandate is connecting western men who'd love to marketing effectiveness. Reviews can help you should be using the cultural bounds then 1500. Learn about asian men dating sites for your stats.


text:
Strohmeyer, George, 10 results 10
University of St. Michael's College, John M. Kelly Library, Special Collections L'Arche Audiovisual Collection
Top-level description L'Arche Audiovisual Collection
Wednesday, October 18, 1978, 9:00 a.m. Jean Vanier, "The Cry of the Wounded"
CA ON00389 C5-3-3-5
Part of L'Arche Audiovisual Collection
Item consists of 1 audio cassette from a Faith and Sharing (Foi et Portage) retreat at St. Thomas Seminary in Kenmore, WA. The retreat took place from October 16-21, 1978. The recording begins with an introduction to the talk and its date.
Wednesday, October 18, 1978, 8:30 p.m. Jean Vanier, "The Cry of the Wounded"
Wednesday, May 24, 1995, morning. French
CA ON00389 C5-2-19-13
Item consists of 1 audio cassette featuring a talk given at a Covenant Retreat (Retraite de l'Alliance) from May 18-24, 1995 in Halifax, NS.
Tuesday, October 17, 1978, 9:00 a.m. Jean Vanier, "The Vulnerability of Jesus"
Tuesday, October 17, 1978, 8:30 p.m. Jean Vanier, "The Vulnerability of Jesus"
Tuesday, May 23, 1995, morning. French
Tuesday, May 23, 1995, evening. English
Tuesday 10:00. Jean Vanier with the whole group.
Item consists of 1 audio cassette of the Regional Meeting in Erie, PA, in May 1979.
To Meet the Poor is to Meet Jesus
CA ON00389 C5-3-1
August 1 - 4, 1985
Item consists of 1 videocassette featuring a talk given at a Faith and Sharing Retreat held from August 1-4, 1985. Jean Vanier is the speaker, and the title is, "To meet the Poor is to Meet Jesus". It is tape 1. Vanier spoke on the following: Trust, Meeting with Jesus, Jesus Reveals Who We Are, and Jesus Reveals Himself (part 1).
Thursday, October 19, 1978, 9:00 a.m. Jean Vanier, "Opening Our Hearts to the Spirit"
Thursday, October 19, 1978, 8:30 p.m. Jean Vanier, "Opening Our Hearts to the Spirit" at Blanchet High School (Public Talk). Opening introductions by Archbishop Hunthausen. Included are questions and answers at the end of the talk.
CA ON00389 C5-3-3-10
Thursday, October 19, 1978, 2:30 p.m. Jean Vanier, "Opening Our Hearts to the Spirit"
Tape 9. French. Pere Philippe. April 10, 1981.
Item consists of 1 audio cassette featuring a talk given at a Covenant Retreat held from April 5-11, 1981.
Tape 8. Side A: David Standley, "Blessing." Side B: Robert Larouche, "The Story of the Covenant in L'Arche"
CA ON00389 C5-2-20-8
Item consists of 1 audio cassette featuring a talk given at a Covenant Retreat at St. Gabriel's Retreat Centre in Ditchingham, Norfolk, UK, from November 18-24, 1996.
Tape 8. French. Pere Philippe. April 9, 1981.
Tape 8. English translation. Pere Philippe. April 9, 1981 [mislabeled as April 6, 1981]
Tape 7. Sue Mosteller, "Lord That I May See"
Tape 7. English translation. Pere Philippe. April 9, 1981.
Tape 6B
Item consists of 1 audio cassette from a Faith and Sharing Retreat held in August 1982 in Detroit, MI. Item features a talk by Jean Vanier.
Tape 6A
Tape 6. Side A: Sue Mosteller, "Life is Difficult." Side B: Sue Mosteller, "Called by Love"
Tape 5. Sue Mosteller, "The Prodigal and Reconciliation"
Tape 5. English translation. Pere M.D. Philippe and Jean Vanier. April 8, 1981.
Tape 4. Sue Mosteller, "The Inner Journey - Slavery to Freedom"
Tape 4. English translation. April 7, 1981. Pere M.D. Philippe.
Tape 3. Side A: Sue Mosteller, "As a Disciple before God." Side B: Sue Mosteller, "The Inner Journey - Vine & Branches"
Tape 2. Sue Mosteller, "The God of the Covenant."
Tape 2. English translation. April 6, 1981. Jean Vanier.
Tape 13. French. Pere Philippe. April 11, 1981.
Tape 13. English translation. Pere Philippe.