// Class for a password field: let user choose into a bunch of small images enyo.kind({ name: "Sugar.Password", kind: enyo.Control, published: { label: '', password: '', }, events: { onEnter: "" }, classes: "password-class", components: [ {name: "line", classes: "password-line", components: [ {name: "text", content: "xxx", classes: "password-label"}, {classes: "password-input", components: [ {name: "pass", classes: "password-value", content: "", allowHtml: true}, {name: "cancel", classes: "password-iconcancel", showing: false, ontap: "cancelClicked"}, ]}, {components:[ {name: "emojis", classes: "password-emojis", components: [ {components: [ {name: "emoji0", kind: "Sugar.Emoji", index: 0, ontap: "emojiClicked", selected: true}, {name: "emoji1", kind: "Sugar.Emoji", index: 1, ontap: "emojiClicked", selected: true}, {name: "emoji2", kind: "Sugar.Emoji", index: 2, ontap: "emojiClicked", selected: true}, {name: "emoji3", kind: "Sugar.Emoji", index: 3, ontap: "emojiClicked", selected: true}, {name: "emoji4", kind: "Sugar.Emoji", index: 4, ontap: "emojiClicked", selected: true}, ]}, {components: [ {name: "emoji5", kind: "Sugar.Emoji", index: 5, ontap: "emojiClicked", selected: true}, {name: "emoji6", kind: "Sugar.Emoji", index: 6, ontap: "emojiClicked", selected: true}, {name: "emoji7", kind: "Sugar.Emoji", index: 7, ontap: "emojiClicked", selected: true}, {name: "emoji8", kind: "Sugar.Emoji", index: 8, ontap: "emojiClicked", selected: true}, {name: "emoji9", kind: "Sugar.Emoji", index: 9, ontap: "emojiClicked", selected: true}, ]}, ]}, {classes: "password-emojis-category", components: [ {name: "category0", kind: "Sugar.Emoji", classes: "emoji-category", ontap: "category0Clicked", index: 0, letter: false, size: 15, selected: true}, {name: "category1", kind: "Sugar.Emoji", classes: "emoji-category", ontap: "category1Clicked", index: 10, letter: false, size: 15}, {name: "category2", kind: "Sugar.Emoji", classes: "emoji-category", ontap: "category2Clicked", index: 20, letter: false, size: 15} ]} ]} ]}, ], // Constructor create: function() { this.inherited(arguments); this.labelChanged(); this.listen = false; this.password = ""; var that = this; document.addEventListener('keydown', function(event) { if (that.listen) { if (event.keyCode === 13) { that.doEnter(); return true; } else if (event.keyCode == 8) { that.removeCharacter(); return true; } else { that.addCharacter(event.key); return true; } return false; } return false; }); }, startInputListening: function() { this.listen = true; }, stopInputListening: function() { this.listen = false; }, // Property changed labelChanged: function() { this.$.text.setContent(this.label); }, passwordChanged: function() { this.drawPassword(); if (this.password.length == 0) { this.$.cancel.setShowing(false); } }, // Event handling emojiClicked: function(emoji) { emoji.animate(); this.addCharacter(constant.emojis[emoji.getIndex()].letter); }, category0Clicked: function(category) { if (category.getSelected()) { return; } var categoryIndex = category.index; if (categoryIndex - 10 >= 0) { // Scroll categories this.$.category0.setIndex(categoryIndex-10); this.$.category1.setIndex(categoryIndex); this.$.category2.setIndex(categoryIndex+10); category = this.$.category1; } this.changeCategory(category); }, category1Clicked: function(category) { if (category.getSelected()) { return; } this.changeCategory(category); }, category2Clicked: function(category) { if (category.getSelected()) { return; } var categoryIndex = category.index; if (categoryIndex + 10 < constant.emojis.length) { // Scroll categories this.$.category0.setIndex(categoryIndex-10); this.$.category1.setIndex(categoryIndex); this.$.category2.setIndex(categoryIndex+10); category = this.$.category1; } this.changeCategory(category); }, changeCategory: function(category) { this.$.category0.setSelected(false); this.$.category1.setSelected(false); this.$.category2.setSelected(false); category.setSelected(true); var startIndex = category.index; this.$.emoji0.setIndex(startIndex++); this.$.emoji1.setIndex(startIndex++); this.$.emoji2.setIndex(startIndex++); this.$.emoji3.setIndex(startIndex++); this.$.emoji4.setIndex(startIndex++); this.$.emoji5.setIndex(startIndex++); this.$.emoji6.setIndex(startIndex++); this.$.emoji7.setIndex(startIndex++); this.$.emoji8.setIndex(startIndex++); this.$.emoji9.setIndex(startIndex++); }, cancelClicked: function() { this.password = ""; this.drawPassword(); this.$.cancel.setShowing(false); }, // Handle password changed drawPassword: function() { var html = ""; for (var i = 0 ; i < this.password.length ; i++) { for (var j = 0 ; j < constant.emojis.length ; j++) { if (constant.emojis[j].letter == this.password[i]) { html += "&#x"+constant.emojis[j].value+";"; } } } this.$.pass.setContent(html); }, addCharacter: function(char) { if (this.password.length == 8) { return; } var len = constant.emojis.length; for (var i = 0 ; i < len ; i++) { if (char == constant.emojis[i].letter) { break; } } if (i == len) { return; } this.password += char; this.$.cancel.setShowing(true); this.drawPassword(); }, removeCharacter: function() { var len = this.password.length; if (len == 0) { return; } this.password = this.password.substr(0, len-1); if (this.password.length == 0) { this.$.cancel.setShowing(false); } this.drawPassword(); } }); // Class for an emoji enyo.kind({ name: "Sugar.Emoji", kind: enyo.Control, published: { index: null, letter: true, size: null, selected: false }, classes: "emoji", components: [ {name: "icon", content: "", allowHtml: true, classes: "emoji-icon"}, {name: "letter", content: "", showing: true, classes: "emoji-letter"} ], // Constructor create: function() { this.inherited(arguments); this.indexChanged(); this.letterChanged(); this.sizeChanged(); this.selectedChanged(); }, rendered: function() { this.inherited(arguments); if (this.size) { document.getElementById(this.$.icon.id).style = "font-size: "+this.size+"pt"; } }, // Property changed indexChanged: function() { if (this.index >= 0 && this.index < constant.emojis.length) { var emoji = constant.emojis[this.index]; this.$.icon.setContent("&#x"+emoji.value+";"); this.$.letter.setContent(emoji.letter); } }, letterChanged: function() { this.$.letter.setShowing(this.letter); }, sizeChanged: function() { }, selectedChanged: function() { this.removeClass("emoji-selected"); this.removeClass("emoji-unselected"); if (this.selected) { this.addClass("emoji-selected"); } else { this.addClass("emoji-unselected"); } }, // Do a small animation to show a click animate: function() { var that = this; that.addClass("emoji-flash"); window.setTimeout(function() { that.removeClass("emoji-flash"); }, 500); } });