@@ -209,6 +209,14 @@ Elm.Native.Graphics.Input.make = function(elm) {
212+ function setRange(node, start, end, dir) {
213+ if (node.parentNode) {
214+ node.setSelectionRange(start, end, dir);
216+ setTimeout(function(){node.setSelectionRange(start, end, dir);}, 0);
212 function updateIfNeeded(css, attribute, latestAttribute) {
220 function updateIfNeeded(css, attribute, latestAttribute) {
213 if (css[attribute] !== latestAttribute) {
221 if (css[attribute] !== latestAttribute) {
214 css[attribute] = latestAttribute;
222 css[attribute] = latestAttribute;
@@ -259,7 +267,10 @@ Elm.Native.Graphics.Input.make = function(elm) {
260 field.type = model.type;
268 field.type = model.type;
261 field.placeholder = JS.fromString(model.placeHolder);
269 field.placeholder = JS.fromString(model.placeHolder);
262− field.value = JS.fromString(model.content);
270+ field.value = JS.fromString(model.content.string);
271+ var selection = model.content.selection;
272+ var direction = selection.direction.ctor === 'Forward' ? 'forward' : 'backward';
273+ setRange(field, selection.start, selection.end, direction);
264 field.elm_signal = model.signal;
275 field.elm_signal = model.signal;
265 field.elm_handler = model.handler;
276 field.elm_handler = model.handler;
@@ -271,7 +282,15 @@ Elm.Native.Graphics.Input.make = function(elm) {
271 String.fromCharCode(event.keyCode) +
282 String.fromCharCode(event.keyCode) +
272 curr.slice(field.selectionEnd));
283 curr.slice(field.selectionEnd));
273 var pos = field.selectionEnd + 1;
284 var pos = field.selectionEnd + 1;
274− elm.notify(field.elm_signal.id, field.elm_handler(JS.toString(next)));
285+ elm.notify(field.elm_signal.id, field.elm_handler({
287+ string: JS.toString(next),
291+ direction: { ctor:'Forward' }
275 event.preventDefault();
294 event.preventDefault();
@@ -281,12 +300,46 @@ Elm.Native.Graphics.Input.make = function(elm) {
281 if (curr === next) {
300 if (curr === next) {
304+ var direction = field.selectionDirection === 'forward' ? 'Forward' : 'Backward';
305+ var start = field.selectionStart;
306+ var end = field.selectionEnd;
284 field.value = field.elm_old_value;
307 field.value = field.elm_old_value;
285− elm.notify(field.elm_signal.id, field.elm_handler(JS.toString(next)));
309+ elm.notify(field.elm_signal.id, field.elm_handler({
311+ string: JS.toString(next),
315+ direction: { ctor: direction }
320+ function mouseUpdate(event) {
321+ var direction = field.selectionDirection === 'forward' ? 'Forward' : 'Backward';
322+ elm.notify(field.elm_signal.id, field.elm_handler({
324+ string: field.value,
326+ start: field.selectionStart,
327+ end: field.selectionEnd,
328+ direction: { ctor: direction }
332+ function mousedown(event) {
334+ elm.node.addEventListener('mouseup', mouseup);
336+ function mouseup(event) {
338+ elm.node.removeEventListener('mouseup', mouseup)
288 field.addEventListener('keypress', keyUpdate);
340 field.addEventListener('keypress', keyUpdate);
289 field.addEventListener('input', inputUpdate);
341 field.addEventListener('input', inputUpdate);
342+ field.addEventListener('mousedown', mousedown);
291 return field;
344 return field;
@@ -300,9 +353,12 @@ Elm.Native.Graphics.Input.make = function(elm) {
301 field.type = newModel.type;
354 field.type = newModel.type;
302 field.placeholder = JS.fromString(newModel.placeHolder);
355 field.placeholder = JS.fromString(newModel.placeHolder);
303− var value = JS.fromString(newModel.content);
356+ var value = JS.fromString(newModel.content.string);
304 field.value = value;
357 field.value = value;
305 field.elm_old_value = value;
358 field.elm_old_value = value;
359+ var selection = newModel.content.selection;
360+ var direction = selection.direction.ctor === 'Forward' ? 'forward' : 'backward';
361+ setRange(field, selection.start, selection.end, direction);
308 function mkField(type) {
364 function mkField(type) {