"use strict"; /// Constants var SIMILARCOUNT = 25; var RANDOMCOUNT = 25; var NAMELIST = ["Aaliyah","Aaron","Abigail","Abram","Abrams","Adalyn","Adam","Adams","Addison","Adeline","Adrian","Ahn","Aideen","Aiden","Akira","Al","Alaina","Alan","Alana","Alex","Alexander","Alexandra","Alexis","Alice","Allen","Allison","Altman","Alyssa","Amanda","Amelia","Anderson","Andonov","Andrew","Andy","Angel","Angela","Anna","Annabelle","Anthony","Archer","Aria","Arianna","Asdf","Ash","Asher","Ashford","Ashley","Asimov","Assface","Atkins","Atkinson","Atom","Atomic","Atticus","Aubrey","Audrey","Austin","Autumn","Ava","Avery","Bacon","Badass","Bailey","Baker","Banner","Bannerman","Bannion","Barnes","Barron","Barry","Bash","Bastard","Battosai","Batty","Baudoin","Bell","Bella","Ben","Benjamin","Bennell","Bennett","Bentley","Bery","Bill","Billy","Bilodeau","Black","Blaise","Blake","Blaze","Bob","Bobbi","Bobby","Bogdanove","Bond","Boob","Boobie","Boobies","Boom","Boston","Bowman","Bradley","Braun","Brayden","Brenda","Brenna","Brian","Brianna","Brick","Brigner","Brock","Brody","Brooklyn","Brooks","Browder","Brown","Browne","Bruce","Bruckheimer","Bryan","Bryant","Buffy","Bulger","Bull","Burgess","Burke","Burt","Butch","Butler","Caden","Cal","Caleb","Callie","Camden","Camilla","Campbell","Capable","Carey","Carnow","Carofano","Caroline","Carson","Carter","Carver","Casserly","Castle","Catherine","Cha","Chapin","Chappy","Charles","Charlie","Charlotte","Chase","Cheng","Cherise","Cherry","CherryBomb","Chloe","Chopper","Chris","Christian","Christiane","Christopher","Church","Claire","Clara","Clark","Clarke","Claw","Clemens","Clunk","Cobb","Cobra","Cock","Cockerham","Cole","Colin","Collins","Colton","Conall","Connor","Cook","Cooke","Cooper","Cormac","Corman","Cornelius","Cornett","Corrie","Corrine","Corvo","Corwin","Cory","Cosgrove","Courtenay","Courtney","Cox","Coyle","Craig","Crash","Cruz","Cubbison","Cullen","Cummings","Dag","Damien","Dan","Dane","Danger","Daniel","Daniels","Danny","Darrel","Darren","Darryl","Daryl","Dave","David","Davis","Dawson","Deag","Death","Deb","Debbie","Deborah","Deckard","Declan","Deitrick","Delaney","Dell","Dennis","Denton","Deschain","Deth","Diana","Diane","DiAngelo","Diaz","Dick","DiMaggio","Dinolt","DJ","Django","Dom","Domics","Dominguez","Dominic","Don","Donald","Dong","DongJun","Donnie","Donny","Doug","Douglas","Dragon","Draper","Dulany","Dutch","Duvall","Dylan","Eagle","East","Ed","Eddie","Eddy","Edwards","Elena","Eli","Eliana","Elijah","Elizabeth","Ella","Ellie","Elliot","Elliott","Emil","Emile","Emily","Emma","Erectus","Eric","Erik","Erin","Ernest","Ernie","Ethan","Eugene","Eva","Evan","Evans","Evelyn","Everdeen","Everett","Felipe","Ferret","Fifi","Finn","Finster","Fiona","Fisher","Flag","Flagg","Flash","Flores","Flynn","Foster","Fox","Fragile","Francis","Franke","Freeman","Frost","Fuck","Fucker","Fuckface","Furiosa","Fury","Gabriel","Gabriella","Gardiner","Gary","Gavin","Gene","George","Georgia","Gerry","Gianna","Gil","Glen","Gomez","Gonzalez","Goose","Gordon","Graber","Grace","Grant","Gravato","Gray","Grayson","Greco","Green","Greene","Grey","Griffin","Grognak","Gryphon","Gutierrez","Guy","Hackman","Hailey","Hall","Ham","Hamilton","Hamm","Hammer","Hammett","Hamrick","Han","Hannah","Hans","Harden","Hardi","Harold","Harper","Harris","Harry","Haschart","Hasenbuhler","Hastings","Hawk","Hawke","Hazel","Henning","Henry","Herbert","Hicks","Hill","Hines","Holly","Holmes","Hook","Hopgood","Houle","Howard","Hudson","Hughes","Humongous","Humungus","Hyun","Ian","Ilya","Imperator","Indiana","Indy","Isaac","Isabella","Isabelle","Isaiah","Ist","Istvan","J.P.","Jack","Jackson","Jacob","Jag","Jake","James","Jangjoon","Jasmine","Jason","Jay","Jayce","Jayden","Jeff","Jeffery","Jen","Jenkins","Jennifer","Jeremiah","Jeremy","Jerry","Jerusalem","Jess","Jessica","Jessie","Jet","Jim","Jimmy","Joan","Joe","Joel","Joey","John","Johnson","Jon","Jonathan","Jones","JonPaul","Jordan","Jordyn","Joseph","Josh","Joshua","Josiah","JP","Juan","Julia","Julian","Juliana","Justin","Kaela","Kaelyn","Kaitlyn","Kal","KalEl","Kaneda","Kate","Katharine","Katherine","Katniss","Kauffman","Kayla","Kaylee","Keira","Kelley","Kelly","Kelvin","Ken","Kennedy","Kenshin","Kevin","Kim","King","Kirk","Knight","Krietz","Kuhlmann","Kurt","Kylie","Lafferty","Lamb","Landon","Lane","Langlois","Laura","Lauren","Laurie","Layla","Lea","Leah","Lederer","Lee","Leo","Leon","Les","Leslie","Levi","Lewis","Li","Liam","Liesegang","Lila","Liliana","Lillian","Lily","Lincoln","Linda","Lionheart","Lipari","Liz","Logan","London","Loner","Long","Lopez","Losi","Lucas","Luce","Lucy","Luke","Lundin","Lupe","Lynda","Maam","Mackenzie","Macklin","Madam","Madeleine","Madelyn","Madison","Makayla","Mal","Malcolm","Mamba","Mandy","Mara","Marcus","Marge","Maria","Marie","Marji","Marjorie","Mark","Markiepoo","Marko","Markus","Marlowe","Marsden","Martin","Martinez","Marty","Mary","Mason","Mateo","Matt","Matthew","Matty","Max","Maya","McCoy","McDyer","McFly","McKay","McPherson","Means","Megan","Meister","Mejillones","Mia","Micah","Michael","Michonne","Miguel","Mikami","Mike","Mila","Miles","Miller","Mitchell","Mohammed","Molly","Monster","Montana","Moonves","Moore","Morales","Morgan","Morgue","Morpheus","Morris","Muck","Mudguts","Muhammad","Mulder","Muldoon","Murphy","Myers","Nadia","Nancy","Nanes","Nardone","Nasty","Natalia","Natalie","Natasha","Nate","Nathan","Nathaniel","Nazarov","nchez","Neary","Nelson","Neo","Nesmith","Neville","Nguyen","Nicholas","Nico","Nipple","Noah","Nogueira","Nolan","Noonan","Nora","Norm","Norm","Norman","Normand","North","Northup","Nourmohammadi","Nuclear","Nuke","Olds","Oliver","Olivia","Ollie","Olsen","Olson","Optical","Orgasmo","Orin","Ortiz","Owen","Owens","Pagliarulo","Palmer","Paris","Parker","Parson","Pat","Patrick","Patty","Paul","Pely","Pendleton","Penelope","Perez","Perry","Pete","Peter","Peterson","Peyton","Phil","Philip","Phillips","Picard","Plissken","Powell","Preacher","Price","Priest","Prince","Princess","Psycho","Puma","Purkey","Purkeypile","Python","Qin","Quartermain","Quatermass","Queen","Quinn","Rabil","Raf","Rafael","Ramirez","Ramsey","Randal","Randall","Rankin","Rapp","Ray","Raymond","Reagan","Red","Reed","Reese","Rex","Reyes","Reynolds","Ricardo","Richard","Richards","Richardson","Rick","Ricky","Rictus","Riddick","Riley","Ripken","Ripley","River","Rivera","Rob","Robb","Robert","Roberts","Robinson","Rock","Rockatansky","Rocky","Rodriguez","Roger","Rogers","Roland","Rollins","Romanov","Romanova","Romero","Ron","Ronald","Ronnie","Ronny","Rook","Rosa","Rose","Ross","Roy","Ruby","Russell","Ryan","Sadie","Sage","Salvatore","Sam","Samantha","Sammie","Sammy","Samuel","Sanchez","Sanders","Sandra","Sanjuro","Sara","Sarah","Sarse","Savannah","Sawyer","Scarlett","Schaefer","Scharf","Schram","Schreiber","Scott","Scully","Sears","Sebastian","Selena","Seljenes","Serena","Seth","Sex","Sexy","Shane","Shannon","Sheiman","Shen","Shinji","Shrike","Sidney","Simmons","Singer","Sir","Skyler","Slaughter","Slinger","Slit","Sloan","Smirnova","Smith","Snake","Snow","Snyder","Solo","Solomon","Sophia","Sophie","South","Southie","Spade","Spider","Spike","Splendid","Spring","Springsteen","Stark","Stef","Stella","Steph","Stephanie","Stephen","Sterling","Steve","Steven","Steward","Stewart","Stone","Struthers","Stuart","Sullivan","Summer","Sunshine","Sweetpea","Sydney","Tallahassee","Taylor","Teare","Ted","Teddy","Teitel","Tesla","Tetsuo","Texas","Thomas","Thompson","Thorn","Thorne","Tiana","Tim","Timmy","Timothy","Tit","Tittie","Titties","Toadie","Toast","Todd","Toecutter","Tom","Tommy","Tonon","Tony","Torres","Tracey","Tracy","Treadway","Tresnjak","Trinity","Tristan","Trump","Tuck","Turner","Tyler","Unbreakable","Utting","Valenti","Valentina","Valkyrie","Vargas","Vash","Venkman","Vic","Vicens","Victoria","Violet","Vivian","Vlatko","Wagner","Walker","Walton","Wanderer","Ward","Washington","Watson","Watts","Wayne","Webb","Wells","Wes","West","Weyland","Wez","White","Whitey","Wikus","Will","William","Williams","Willy","Wilson","Winter","Wisnewski","Wood","Woodward","Wright","Wyatt","Xavier","Yan","Yojimbo","Yorick","Young","Yutani","Zachary","Zdana","Zed","Zenith","Zetta","Ziggy","Zip","Zoe"]; /// Shared functions // Returns minimum of three integers var min = function(a, b, c) { return Math.min(Math.min(a, b), c); }; // Loads user options in template and returns combination var optionDefault = function(template, options) { var prop; for(prop in options) { if(options.hasOwnProperty(prop)) { template[prop] = options[prop]; } } return template; }; // Returns a mod b var modulo = function(a, b) { return (((a % b) + b) % b); }; /// Name generator function Name(size) { size = (size === undefined ? 10 : size); this.count_ = 0; this.history_ = []; this.size_ = size; } // Returns random name Name.prototype.generate_ = function() { return NAMELIST[Math.floor(Math.random() * NAMELIST.length)]; }; // Adds given name to history Name.prototype.add = function(name) { if(name !== undefined) { this.history_[modulo(this.count_, this.size_)] = name; this.count_++; } return name; }; // Adds a random name to history Name.prototype.addRandom = function() { var name = this.generate_(); return this.add(name); }; // Returns history Name.prototype.getHistory = function(separator, count) { count = (count === undefined ? Math.min(this.size_, this.count_) : count); var i, name, out = []; for(i = count; i > 0; i--) { name = this.history_[modulo((this.count_ - i), this.size_)]; if(name === undefined) { break; } out.push(name); } return out.join(separator); }; // Resets the name generator Name.prototype.reset = function() { this.count_ = 0; this.history_ = []; }; /// Levenshtein similarity function Levenshtein(name) { this.name_ = name; this.size_ = name.length; this.reset_(); this.populate_(); } // Set string algorithm Levenshtein.prototype.algo_ = levenshtein; // Resets object Levenshtein.prototype.reset_ = function() { this.buckets_ = []; for(var i = 0; i <= this.size_; i++) { this.buckets_[i] = []; } }; // Populates buckets Levenshtein.prototype.populate_ = function() { var listSize = NAMELIST.length, name, dist; for(var i = 0; i < listSize; i++) { name = NAMELIST[i]; dist = this.algo_(this.name_, name, { caseSensitive : false }); if(dist <= this.size_) { this.buckets_[dist].push(name); } } }; // Returns best matches, limited to amount Levenshtein.prototype.getSimilar = function(amount) { var i, len, matches = 0, top = [], bucket = 0; while(bucket < this.size_) { len = this.buckets_[bucket].length; for(i = 0; i < len; i++) { top.push(this.buckets_[bucket][i]); matches++; if(matches >= amount) { break; } } bucket++; if(matches >= amount) { break; } } return top; }; /// Jaro-Winkler similarity function JaroWinkler(name) { this.name_ = name; this.size_ = name.length; this.reset_(); this.populate_(); } // Set string algorithm JaroWinkler.prototype.algo_ = jaro_winkler; // Comparator for values returned by algorithm JaroWinkler.prototype.comparator_ = function(a, b) { return (b[1] - a[1]); }; // Resets object JaroWinkler.prototype.reset_ = function() { this.hits_ = []; }; // Populates hits JaroWinkler.prototype.populate_ = function() { var listSize = NAMELIST.length, i, name, value; for(i = 0; i < listSize; i++) { name = NAMELIST[i]; value = this.algo_(this.name_, name, { caseSensitive : false }); this.hits_[i] = [name, value]; } this.hits_.sort(this.comparator_); }; // Returns best matches, limited to amount JaroWinkler.prototype.getSimilar = function(amount) { var similar = []; for(var i = 0; i < amount; i++) { similar[i] = this.hits_[i][0]; } return similar; }; /// DOM elements // Similar name var simInput = document.getElementById("similarInput"); var simButton = document.getElementById("generateSimilar"); var simOutput = document.getElementById("similarNames"); simButton.addEventListener( "click", function(e) { e.preventDefault(); // Get input var name = simInput.value; if(name === undefined || name === "") { return; } // Find most similar names var sorter = new JaroWinkler(name); var names = sorter.getSimilar(SIMILARCOUNT); // Update contents simOutput.value = names.join("\n"); }, false ); // Random name var randNamer = new Name(RANDOMCOUNT); var randButton = document.getElementById("generateRandom"); var randOutput = document.getElementById("randomNames"); randButton.addEventListener( "click", function(e) { e.preventDefault(); // Add random name randNamer.addRandom(); // Update contents randOutput.value = randNamer.getHistory("\n"); randOutput.scrollTop = randOutput.scrollHeight; }, false );