/*
*  PASSWORD STRENGTH METER
*/ 

//--- SCORE FUNCTIONS ---//

var passMaxScore = 9;
var colors = new Array("#ffffff", "#d90000", "#ff9c00", "#00a14a");
var dict_6 = "012345-123456-234567-345678-456789-567890-yankee-yamaha-yakima-y7u8i9-xyzxyz-wombat-wizard-wilson-willie-weenie-warren-visual-virgin-viking-venous-venice-venial-vasant-vagina-ursula-urchin-uranus-uphill-umpire-u.s.a.-tuttle-trisha-trails-tracie-toyota-tomato-toggle-tidbit-thorny-thomas-terror-tennis-taylor-target-tardis-tappet-taoist-tannin-tanner-tanker-tamara-system-surfer-summer-subway-stacie-stacey-spring-sondra-solemn-soleil-solder-solace-soiree-soften-soffit-sodium-sodden-snoopy-snatch-smooch-smiles-slavic-slater-single-singer-simple-sherri-sharon-sharks-sesame-sensor-secret-second-season-search-scroll-scribe-scotty-scooby-schulz-school-scheme-saturn-sandra-sandal-saliva-saigon-sahara-safety-safari-sadism-saddle-sacral-russel-runyon-runway-runoff-runner-ronald-romano-rodent-ripple-riddle-ridden-reveal-return-remote-recess-recent-realty-really-reagan-raster-rascal-random-radish-radial-racoon-racket-racial-rachel-rabbit-qwerty-qawsed-puppet-puneet-public-prince-presto-praise-poster-polite-polish-policy-police-plover-pierre-phrase-photon-philip-persia-peoria-penmen-penman-pencil-peanut-parrot-parent-pardon-papers-pander-pamela-pallet-palace-oxford-outlaw-osiris-orwell-oregon-oracle-olivia-oliver-olefin-office-notion-notify-notice-notate-notary-noreen-nobody-nicole-newton-nevada-mutant-mozart-morley-monica-moguls-minsky-mickey-merlin-memory-mellon-meagan-mcneil-mcleod-mclean-mckeon-mchugh-mcgraw-mcgill-mccann-mccall-mccabe-mayfly-maxine-master-massif-maseru-marvin-markus-malcom-mailer-maiden-magpie-magnum-magnet-maggot-lorenz-lisbon-limpid-leslie-leland-latest-latera-latent-lascar-larkin-langur-landis-landau-lambda-kristy-kristi-krista-knight-kitten-kinney-kerrie-kernel-kermit-kennan-kelvin-kelsey-kelley-keller-keenan-katina-karina-kansas-juggle-judith-jsbach-joshua-joseph-johnny-joanne-joanna-jixian-jimmie-jimbob-jester-jeanne-jasmin-janice-jaguar-jackie-island-invest-instar-ingrid-ingres-impute-holmes-holman-hockey-hidden-hawaii-hasten-harvey-harold-hamlin-hamlet-halite-halide-haggle-haggis-hadron-hadley-hacker-gustav-gusset-gurkha-gurgle-guntis-guitar-graham-gospel-gorton-gorham-gorges-golfer-glassy-ginger-gibson-ghetto-german-george-gauche-gasify-gambol-gamble-gambit-friend-freest-fourth-format-flower-flaxen-flaunt-flakes-finley-finite-fillip-fillet-filler-filled-fermat-fender-fatten-fatima-fathom-father-evelyn-euclid-estate-enzyme-engine-employ-emboss-elanor-elaine-eileen-eighty-eighth-effect-efface-eeyore-eerily-edwina-easier-durkin-durkee-during-durham-duress-duncan-donner-donkey-donate-donald-domino-disney-dieter-device-denise-deluge-delete-debbie-deaden-ddurer-dapper-daniel-dancer-damask-dakota-daemon-cuvier-cuddly-cuddle-cuckoo-cretin-create-cozier-coyote-cowpox-cooper-cookie-connie-coneck-condom-coffee-citrus-citron-citric-circus-charon-change-censor-cement-celtic-cecily-cayuga-catnip-catkin-cation-castle-carson-carrot-carrie-carole-carmen-caress-cantor-burley-burlap-buried-burial-brenda-bremen-breezy-breeze-breech-brandy-brandi-border-borden-borate-bloody-bishop-bilbao-bikini-bigred-betsie-berman-berlin-bedbug-became-beavis-beaver-beauty-beater-batman-bathos-barony-barber-baobab-bantus-banter-bantam-banish-bangui-bangor-bangle-bandit-banana-bakery-bailey-bahama-bagley-badass-aztecs-azsxdc-athena-asylum-arthur-arrest-arrear-arrack-arlene-anvils-answer-angela-andrea-anchor-analog-amazon-amanda-alison-alight-alicia-albino-albert-albeit-albany-alaska-adrian-adelia-adduce-addict-addend-accrue-access-abcdef-abcabc-abc123-a1b2c3-a12345-@#$%^&-7y8u9i-1qw23e-1q2w3e-1p2o3i-1a2b3c-123abc-10sne1-0p9o8i-!@#$%^";
var dict_7 = "0123456-1234567-2345678-3456789-4567890-yolanda-wyoming-winston-william-whitney-whiting-whatnot-vitriol-vitrify-vitiate-vitamin-visitor-village-vertigo-vermont-venturi-venture-ventral-venison-valerie-utility-upgrade-unknown-unicorn-unhappy-trivial-torrent-tinfoil-tiffany-tidings-thunder-thistle-theresa-test123-terrify-teleost-tarbell-taproot-tapping-tapioca-tantrum-tantric-tanning-takeoff-swearer-suzanne-susanne-support-success-student-squires-sossina-soldier-sojourn-soignee-sodding-smother-slavish-slavery-slander-shuttle-shivers-shirley-sheldon-shannon-service-seattle-scooter-scissor-science-scholar-scamper-satisfy-sarcasm-salerno-sailing-saguaro-saginaw-sagging-saffron-sabrina-russell-rupture-running-runneth-rosebud-receipt-rebecca-realtor-raleigh-rainbow-quarrel-quality-qualify-pumpkin-protect-program-profile-profess-profane-private-prelude-porsche-politic-playboy-phoenix-persona-persian-perseus-perseid-perplex-penguin-pendant-parapet-panoply-panning-panicle-panicky-pangaea-pandora-palette-pacific-olivier-olduvai-oldster-okinawa-oakwood-nyquist-nursery-numeric-number1-nullify-nucleus-nuclear-notused-nothing-newyork-network-neptune-montana-minimum-michele-michael-merriam-mercury-melissa-mcnulty-mcnally-mcmahon-mckenna-mcguire-mcgrath-mcgowan-mcelroy-mcclure-mcclain-mccarty-mcbride-mcadams-mbabane-mayoral-maurice-marimba-manhole-manager-mammoth-malcolm-malaria-mailbox-magnify-magneto-losable-lorinda-loretta-lorelei-lockout-lioness-limpkin-library-lazarus-lathrop-lateran-lateral-kristin-kristie-kristen-kinsman-kingdom-kennedy-kendall-kellogg-keelson-katrina-jupiter-judaism-judaica-jessica-janeiro-inspire-inspect-insofar-ingress-indiana-include-impetus-imperil-holmium-holmdel-herbert-heather-headmen-headman-harmony-handily-hamburg-halifax-halibut-halfway-haggard-hafnium-hadrian-gustave-gunther-gunshot-gryphon-gosling-goshawk-gorilla-gleason-glacier-ghostly-germane-georgia-geology-gaseous-gascony-gardner-gabriel-freeway-fourier-flowers-florida-fishers-finnish-finland-ferrari-felicia-feather-fatigue-fairway-express-expound-emulate-empress-empower-emitted-emerald-embrace-embower-ellwood-ellison-egghead-durward-durrell-drought-donning-donahue-digital-develop-desiree-default-deborah-damming-cynthia-cyanate-cutworm-cutting-cuddles-cubicle-crystal-coxcomb-cowslip-cowpony-cowpoke-console-conquer-connect-comrade-compton-collins-cluster-claudia-classic-citroen-citrate-citizen-citadel-cistern-christy-chester-charles-charity-celtics-celsius-catlike-cathode-carroll-carrion-careful-carbine-carbide-caraway-caravan-camille-burmese-burgess-bridget-breccia-bradley-bopping-blondie-bilayer-beverly-bernard-bermuda-berlitz-berlioz-beowulf-beloved-because-beatnik-beatles-beatify-bassoon-bartman-baroque-barbara-baptism-banshee-banquet-bannock-banning-bananas-bainite-bailiff-bahrein-bagpipe-baghdad-bagging-bacchus-asshole-arrange-arraign-arragon-arizona-ariadne-annette-animals-anatomy-anatole-amatory-amateur-amadeus-allison-alimony-aliases-algebra-albumin-alberto-alberta-albania-alameda-aladdin-alabama-airport-airpark-airfoil-airflow-airfare-airdrop-adenoma-adenine-address-addison-accrual-acclaim-academy-abcdefg-!@#$%^&";
var dict_8 = "yosemite-y7u8i9o0-wormwood-woodwind-whistler-whatever-warcraft-vitreous-virginia-veronica-venomous-trombone-transfer-tortoise-tientsin-tideland-ticklish-thailand-testtest-tertiary-terrific-terminal-telegram-tarragon-tapeworm-tapestry-tanzania-tantalus-tantalum-sysadmin-symmetry-sunshine-strangle-startrek-springer-sparrows-somebody-solecism-soldiery-softwood-software-softball-socrates-slatting-slapping-slapdash-slamming-simpsons-serenity-security-schwartz-sanctity-sanctify-samantha-salesman-sailfish-sailboat-sagittal-sagacity-sabotage-rushmore-rosemary-rochelle-robotics-reverend-regional-raindrop-rachelle-qwertyui-qwerasdf-qawsedrf-q1w2e3r4-protozoa-prodding-princess-precious-politics-politico-plymouth-pershing-penitent-penelope-pendulum-patricia-password-passport-paranoia-panorama-panicked-pandemic-pandanus-pakistan-painless-operator-olivetti-oleander-oklahoma-notocord-notebook-notarize-nebraska-napoleon-missouri-michigan-michelle-mesmeric-mercedes-mcmullen-mcmillan-mcknight-mckinney-mckinley-mckesson-mckenzie-mcintyre-mcintosh-mcgregor-mcgovern-mcginnis-mcfadden-mcdowell-mcdonald-mcdaniel-mcconnel-mccauley-mccarthy-mccallum-mayapple-masonite-maryland-marjoram-marinate-marietta-maneuver-mandamus-maledict-maladapt-magnuson-magnolia-magnetic-lyrebird-lymphoma-lorraine-lionking-linoleum-limitate-limerick-laterite-landmass-landmark-landlord-landlady-landhold-landfill-kristine-kirkland-kingston-kimberly-khartoum-keystone-kentucky-keeshond-kathrine-kathleen-jubilant-joystick-jennifer-jacobsen-irishman-interpol-internet-insulate-instinct-instable-insomnia-insolent-insolate-inactive-imperial-iloveyou-illinois-hydrogen-hutchins-homework-hologram-holocene-hibernia-hiawatha-heinlein-hebrides-headlong-headline-headland-hastings-hamilton-halftone-halfback-hagstrom-gunsling-gunpoint-gumption-gorgeous-glaucous-glaucoma-glassine-ginnegan-ghoulish-gertrude-geometry-geometer-garfield-gamesman-gamecock-fungible-function-frighten-freetown-foxglove-fourteen-foursome-forsythe-football-flaxseed-flautist-flatworm-flatware-fidelity-exposure-eternity-enthrone-enthrall-enthalpy-entendre-entangle-engineer-emulsion-emulsify-emporium-employer-employee-employed-emmanuel-elliptic-elephant-einstein-eighteen-duration-donnelly-dominion-dlmhurst-delegate-delaware-december-deadwood-deadlock-deadline-deadhead-danielle-cyanamid-cucumber-cristina-criminal-creosote-creation-cowpunch-couscous-conquest-comrades-computer-comprise-compress-colorado-clusters-citation-charming-cerulean-cenozoic-cemetery-cellular-catskill-cationic-catholic-cathodic-catheter-cascades-carriage-caroline-carolina-carefree-cardinal-burgundy-burglary-bumbling-broadway-breeches-bordello-bordeaux-bilinear-bilabial-bernardo-berliner-berkeley-bedazzle-beaumont-beatrice-beatific-bathrobe-baronial-baritone-bankrupt-banister-bakelite-azsxdcfv-asdfqwer-arkansas-appraise-apposite-anything-angerine-ancestry-ancestor-anatomic-anathema-ambiance-alphabet-albright-albrecht-alberich-albacore-alastair-alacrity-airspace-airplane-airfield-airedale-aircraft-airbrush-airborne-aerobics-adrianna-adelaide-additive-addition-addendum-accouter-academic-academia-abcdefgh-abcd1234-a1b2c3d4-7y8u9i0o-7890yuio-1234qwer-0p9o8i7u-0987poiu-!@#$%^&*";
var dict_9 = "zimmerman-worldwide-wisconsin-wholesale-vitriolic-ventricle-ventilate-valentine-tidewater-testament-territory-tennessee-telephone-telepathy-teleology-telemetry-telemeter-telegraph-tarantula-tarantara-tangerine-supported-superuser-stuttgart-stratford-stephanie-solemnity-softcover-slaughter-slapstick-signature-sheffield-sarcastic-sanctuary-sagebrush-sagacious-runnymede-rochester-receptive-reception-racketeer-professor-princeton-pondering-politburo-policemen-policeman-persimmon-persevere-persecute-percolate-peninsula-penetrate-pendulous-paralytic-panoramic-panicking-panhandle-oligopoly-oligocene-oligarchy-olfactory-oldenburg-nutrition-nurturant-notorious-notoriety-minnesota-microsoft-mcpherson-mcfarland-mcdougall-mcdonnell-mcdermott-mccracken-mccormick-mcconnell-mccluskey-mcclellan-marijuana-malicious-magnitude-magnetron-magnetite-macintosh-lynchburg-louisiana-lissajous-limousine-limnology-landscape-landowner-kinshasha-kingsbury-kibbutzim-kennecott-jamestown-ironstone-invisible-invention-intuitive-intervene-intersect-inspector-insomniac-insolvent-insoluble-impetuous-imperious-imperfect-holocaust-hollywood-hollyhock-headphone-headlight-headdress-headcount-headboard-happening-hamburger-halverson-gustafson-gunpowder-glasswort-glassware-ghostlike-geometric-gaucherie-freewheel-freethink-freestone-foresight-foolproof-extension-expositor-establish-entertain-employing-emittance-ellsworth-elizabeth-eightieth-eightfold-eiderdown-dusenbury-dusenberg-donaldson-dominique-discovery-desperate-delegable-delectate-decompose-decompile-damnation-cutthroat-crabapple-cornelius-conqueror-connubial-commrades-citizenry-christine-christina-chemistry-cellulose-celluloid-catherine-carryover-burlesque-bloodshot-bloodshed-bloodroot-bloodline-bloodbath-bilingual-bilateral-bijective-bijection-bernadine-berkshire-beethoven-beatitude-bakhtiari-asymptote-asymmetry-apprehend-appraisal-apportion-ancestral-anatomist-alexander-albatross-alabaster-alabamian-adenosine-abcabcabc";
var dict_10 = "washington-volkswagen-topography-tessellate-temptation-telephonic-telepathic-telemetric-telegraphy-tantamount-superstage-slanderous-salamander-qwertyuiop-polynomial-politician-phrasemake-photometry-photolytic-photolysis-photogenic-phosphorus-phosphoric-persiflage-persephone-perquisite-peninsular-penicillin-penetrable-panjandrum-oligoclase-oligarchic-oldsmobile-nottingham-noticeable-noteworthy-mcnaughton-mclaughlin-mccullough-mcallister-malconduct-maidenhair-limitation-lascivious-landowning-landlubber-landlocked-lamination-khrushchev-juggernaut-irrational-invariable-insouciant-insolvable-incomplete-impervious-impersonal-headmaster-glaswegian-geopolitic-geophysics-fourteenth-foursquare-expressive-expression-expository-exposition-enterprise-eightyfold-eighteenth-effaceable-donnybrook-delectable-decolonize-cuttlefish-cuttlebone-compromise-compressor-comprehend-cellophane-carruthers-california-burlington-burgundian-borderline-borderland-bloodstone-bloodstain-bloodhound-bijouterie-biharmonic-bernardino-beaujolais-basketball-bankruptcy-bangladesh-atmosphere-asymptotic-asymmetric-appreciate-apposition-ambassador-amateurish-alimentary-additional-accomplish-1q2w3e4r5t-";
var dict_11 = "yellowstone-venturesome-territorial-telekinesis-sagittarius-safekeeping-politicking-policewoman-photometric-photography-phosphorous-perseverant-persecutory-persecution-penitential-pandemonium-mississippi-marketplace-magnificent-irremovable-interrogate-institution-inspiration-incompetent-impertinent-impersonate-impermeable-headquarter-hamiltonian-halfhearted-hagiography-geophysical-expressible-emptyhanded-eigenvector-deleterious-decollimate-decolletage-connecticut-comptroller-compressive-compression-catholicism-bloodstream-bakersfield-arrangeable-appreciable-anastomotic-albuquerque";
var dict_12 = "williamsburg-testamentary-qwerasdfzxcv-q1w2e3r4t5y6-perseverance-pennsylvania-penitentiary-malformation-liquefaction-interstitial-inconclusive-incomputable-incompletion-incompatible-incomparable-imperishable-impenetrable-headquarters-geometrician-ellipsometry-decomposable-decommission-compressible-burglarproof-bloodletting-bilharziasis-asynchronous-asymptomatic-ambidextrous-1q2w3e4r5t6y";
var dict_13 = "ventriloquist-ventriloquism-poliomyelitis-phosphorylate-oleomargarine-massachusetts-jitterbugging-interpolatory-inconceivable-imperturbable-impermissible-decomposition-comprehensive-comprehension";
var dict_14 = "slaughterhouse-irreproducible-incompressible-comprehensible-bremsstrahlung";
var dict_15 = "irreconciliable-instrumentation-incomprehension-incomprehensible";
     
function getLengthScore(pass) {
  localScore = 0;
  if (pass.length > 6) localScore += 1;
  if (pass.length > 8) localScore += 1;
  if (pass.length > 10) localScore += 1;
  return localScore;
} // 3

function getLowerScore(pass) {
  localScore = 0;
  reLower = /[^a-z]/g;
  testLower = pass.replace(reLower, "");
  if (testLower.length > 0) localScore += 2;
  return localScore;
} // 2

function getRepetitionScore(pass) {
  localScore = 0;
  uniqueChars = new Array();
  for (i=0; i<pass.length; i++) {
    exists = false;
    if (uniqueChars.length > 0) {
      for (j=0; j<uniqueChars.length; j++) {
        if (uniqueChars[j] == pass.charCodeAt(i)) {
          exists = true;
          break;
        }
      }
    }
    if (!exists) uniqueChars[uniqueChars.length] = pass.charCodeAt(i);
  }
  if (uniqueChars.length > (Math.floor(pass.length / 2)) - 2) localScore += 2;
  return localScore;
} // 2

function getUpperScore(pass) {
  localScore = 0;
  reUpper = /[^A-Z]/g;
  testUpper = pass.replace(reUpper, "");
  if (testUpper.length > 0) localScore += 2;
  return localScore;
} // 2

function getDigitScore(pass) {
  localScore = 0;
  reDigit = /[^0-9]/g;
  testDigit = pass.replace(reDigit, "");
  if (testDigit.length > 0) localScore += 2;
  return localScore;
} // 2

function getSymbolScore(pass) {
  localScore = 0;
  reSymb = /[a-zA-Z0-9]/g;
  testSymb = pass.replace(reSymb, "");
  if (testSymb.length > 0) localScore += 2;
  return localScore;
} // 2

function getDictScore(pass) {
  localScore = 0;
  size = pass.length;
  if (size >= 6 && size <= 15) {
  	for (i=size;i<=15;i++) {
      if (eval("dict_"+i).indexOf(pass.toLowerCase()) != -1) {
      	localScore = -4;
        break;
      }
    }
  }
  return localScore;
} // -4

//--- DISPLAY FUNCTIONS ---//

function setPassStatus(msg) {
  s = document.getElementById("passMessage");
  s.innerHTML = msg;
}

function checkPassValidity(pass) {
  for (i=0; i<pass.length; i++) {
    x = pass.charCodeAt(i);
    if (x < 33 || x > 126) {
      setPassStatus("В паролата има недопустими символи.");
      return false;
    }
  }
  
  if (pass.length < 6) {
    setPassStatus("Паролата не може да съдържа по-малко от 6 символа.");
    return false;
  }
  
  if (pass.length > 30) {
    setPassStatus("Паролата не може да съдържа повече от 30 символа.");
    return false;
  }
  
  setPassStatus("");
  return true;
}

function checkPassStrength(pass) {
  var score = 0;
  
  score += getLengthScore(pass);
  score += getLowerScore(pass);
  score += getUpperScore(pass);
  score += getRepetitionScore(pass);
  score += getDigitScore(pass);
  score += getSymbolScore(pass);
  score += getDictScore(pass);
  
  if (score > passMaxScore) score = passMaxScore;
  if (score < 1) score = 1;
  
  for (i=1; i<=9; i++) {
    el = document.getElementById("ps"+i);
    el.style.backgroundColor = colors[0];
  }
  
  if (checkPassValidity(pass) && score > 0)
    for (i=1; i<=score; i++) {
      el = document.getElementById("ps"+i);
      el.style.backgroundColor = colors[Math.ceil(score/3)];
    }
}