pyc-website

main website for pyc inc.

git clone https://9o.is/git/pyc-website.git

commit 595f3e382d89aee352e0663cc163a0bfc8fea295
parent a68b5b9babfd9c08a9db3100dbc5027bc38df6ac
Author: Jul <jul@9o.is>
Date:   Wed, 27 Aug 2014 19:49:45 -0400

moved all text to resources (ready for internationalization), formatted lots of divs correctly with the new narrow look, and fixed the purchase limit process to start at ,000.

Diffstat:
Msbt.sh | 2+-
Msrc/main/scala/bootstrap/liftweb/Boot.scala | 2+-
Msrc/main/scala/inc/pyc/config/Site.scala | 6+++---
Msrc/main/scala/inc/pyc/model/field/PurchaseLimitField.scala | 33+++++++++++++--------------------
Msrc/main/scala/inc/pyc/snippet/AdminSnip.scala | 92+++++++++++++++++++++++++++++++++++++++++++++----------------------------------
Msrc/main/scala/inc/pyc/snippet/AtmSnip.scala | 34++++++++++++----------------------
Msrc/main/scala/inc/pyc/snippet/Contact.scala | 3++-
Msrc/main/scala/inc/pyc/snippet/NgAlert.scala | 9+++++++--
Msrc/main/scala/inc/pyc/snippet/UserSnip.scala | 95++++++++++++++++++++++++++++++++++---------------------------------------------
Msrc/main/scala/inc/pyc/snippet/UtilSnips.scala | 16++++++++++++++++
Msrc/main/webapp/about/contact.html | 9+++++----
Asrc/main/webapp/about/resources-hidden/_resources_contact.html | 9+++++++++
Asrc/main/webapp/about/resources-hidden/_resources_team.html | 15+++++++++++++++
Msrc/main/webapp/about/team.html | 16++++++----------
Msrc/main/webapp/app/mycontrollers/FindAtm.js | 1+
Msrc/main/webapp/app/mycontrollers/IdVerification.js | 1+
Msrc/main/webapp/app/mycontrollers/PhoneVerification.js | 11++---------
Msrc/main/webapp/app/mycontrollers/PurchaseLimit.js | 7+++++--
Msrc/main/webapp/faqs.html | 46++++++++++++----------------------------------
Rsrc/main/webapp/find-btm.html -> src/main/webapp/find.html | 0
Dsrc/main/webapp/forgot-password.html | 17-----------------
Asrc/main/webapp/help/password.html | 13+++++++++++++
Asrc/main/webapp/help/resources-hidden/_resources_password.html | 12++++++++++++
Dsrc/main/webapp/host-btm.html | 45---------------------------------------------
Asrc/main/webapp/host.html | 43+++++++++++++++++++++++++++++++++++++++++++
Msrc/main/webapp/index.html | 25+++++++++++++------------
Msrc/main/webapp/less/override/other.less | 4++++
Msrc/main/webapp/login.html | 8++------
Msrc/main/webapp/register.html | 8++------
Asrc/main/webapp/resources-hidden/_resources.html | 64++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/main/webapp/resources-hidden/_resources_faqs.html | 40++++++++++++++++++++++++++++++++++++++++
Asrc/main/webapp/resources-hidden/_resources_host.html | 30++++++++++++++++++++++++++++++
Asrc/main/webapp/resources-hidden/_resources_index.html | 10++++++++++
Asrc/main/webapp/resources-hidden/_resources_login.html | 14++++++++++++++
Asrc/main/webapp/resources-hidden/_resources_register.html | 15+++++++++++++++
Asrc/main/webapp/resources-hidden/_resources_settings.html | 11+++++++++++
Msrc/main/webapp/settings.html | 20+++++++++-----------
Asrc/main/webapp/settings/admin/resources-hidden/_resources_verify.html | 18++++++++++++++++++
Msrc/main/webapp/settings/admin/verify.html | 29++++++++++++++++-------------
Msrc/main/webapp/settings/password.html | 8+++-----
Msrc/main/webapp/settings/purchase_limit.html | 33+++++++++++++++------------------
Asrc/main/webapp/settings/resources-hidden/_resources_password.html | 23+++++++++++++++++++++++
Asrc/main/webapp/settings/resources-hidden/_resources_purchase_limit.html | 19+++++++++++++++++++
Msrc/main/webapp/settings/view/purchase_limits.html | 8++++----
Msrc/main/webapp/templates-hidden/base-default.html | 2+-
Msrc/main/webapp/templates-hidden/base-wrap.html | 2+-
Msrc/main/webapp/templates-hidden/no-base-default.html | 2+-
Msrc/main/webapp/templates-hidden/parts/apply-btm-form.html | 38+++++++++++++++++++-------------------
Msrc/main/webapp/templates-hidden/parts/btm-map.html | 8++++----
Msrc/main/webapp/templates-hidden/parts/change-password-form.html | 14+++++++-------
Msrc/main/webapp/templates-hidden/parts/contact-form.html | 22+++++++++++-----------
Msrc/main/webapp/templates-hidden/parts/footer.html | 2+-
Msrc/main/webapp/templates-hidden/parts/forgot-password-form.html | 6+++---
Msrc/main/webapp/templates-hidden/parts/id-verification-form.html | 16++++++++--------
Msrc/main/webapp/templates-hidden/parts/phone-verification-form.html | 22++++++----------------
Msrc/main/webapp/templates-hidden/parts/user-login-form.html | 10+++++-----
Msrc/main/webapp/templates-hidden/parts/user-registration-form.html | 20++++++++++----------
Msrc/main/webapp/templates-hidden/parts/user-settings-email-form.html | 6+++---
Msrc/main/webapp/templates-hidden/parts/user-settings-form.html | 6+++---
Msrc/main/webapp/templates-hidden/settings-wrap.html | 6++++--
60 files changed, 671 insertions(+), 435 deletions(-)

diff --git a/sbt.sh b/sbt.sh @@ -1,2 +1,2 @@ #!/bin/bash -java -Drebel.lift_plugin=true -noverify -javaagent:/opt/jrebel/jrebel.jar -Dfile.encoding=UTF8 -Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=384M -jar `dirname $0`/project/sbt-launch.jar "$@" +java -Dfile.encoding=UTF8 -Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=384M -jar `dirname $0`/project/sbt-launch.jar "$@" diff --git a/src/main/scala/bootstrap/liftweb/Boot.scala b/src/main/scala/bootstrap/liftweb/Boot.scala @@ -23,7 +23,7 @@ import inc.pyc.rest.IdVerificationUpload class Boot extends Loggable { def boot { logger.info("Run Mode: "+Props.mode.toString) - + // init mongodb MongoConfig.init() diff --git a/src/main/scala/inc/pyc/config/Site.scala b/src/main/scala/inc/pyc/config/Site.scala @@ -44,8 +44,8 @@ object Site extends Locs { // Regular links val home = MenuLoc(Menu.i("Bitcoin Teller Machine Services") / "index") - val findBtm = MenuLoc(Menu.i("Find A BTM") / "find-btm" >> TopBarGroup) - val hostBtm = MenuLoc(Menu.i("Host A BTM") / "host-btm" >> TopBarGroup) + val findBtm = MenuLoc(Menu.i("Find A BTM") / "find" >> TopBarGroup) + val hostBtm = MenuLoc(Menu.i("Host A BTM") / "host" >> TopBarGroup) val team = MenuLoc(Menu.i("Team") / "about" / "team" >> SiteMapGroup) val press = MenuLoc(Menu.i("Press") / "about" / "press" >> RedirectPress >> SiteMapGroup) @@ -67,7 +67,7 @@ object Site extends Locs { // Regular Links for Users val register = MenuLoc(Menu.i("Register") / "register" >> RequireNotLoggedIn >> SiteMapGroup) val login = MenuLoc(Menu.i("Login") / "login" >> RequireNotLoggedIn >> SiteMapGroup) - val forgotPassword = MenuLoc(Menu.i("Forgot Password") / "forgot-password" >> RequireNotLoggedIn) + val forgotPassword = MenuLoc(Menu.i("Password Recovery") / "help" / "password" >> RequireNotLoggedIn) // extra public links diff --git a/src/main/scala/inc/pyc/model/field/PurchaseLimitField.scala b/src/main/scala/inc/pyc/model/field/PurchaseLimitField.scala @@ -15,12 +15,9 @@ trait PurchaseLimit extends Enumeration /** * Purchase limit in the United States by dollars. * - * $500 - not verified - * $1000 - verified phone and postal code - * $3000 - submitted identification - * $3000 - verified identification - * Unlimited - request to be checked by 3rd party - * Unlimited - verified by third party + * $1,000 - not verified + * $3,000 - verified phone + * $10,000 - verified identification * * For more information, visit * http://www.fincen.gov/financial_institutions/msb/materials/en/bank_reference.html @@ -30,12 +27,10 @@ trait PurchaseLimit extends Enumeration */ object USAPurchaseLimit extends PurchaseLimit { - val D500 = Value("$500") - val D1000 = Value("$1,000") - val D3000_Pending = Value("$3,000 Pending") - val D3000 = Value("$3,000") - val Unlimited_Pending = Value("$10,000 Pending") - val Unlimited = Value("$10,000") + val D1k = Value("$1,000") + val D3k = Value("$3,000") + val D10k_? = Value("$10,000 Pending") + val D10k = Value("$10,000") def options: List[(String, String)] = USAPurchaseLimit.values.map(i => (i.toString, i.toString)).toList @@ -70,16 +65,14 @@ trait USAUserVerification[A <: Record[A]] { /* * Friendly functions to check limits */ - def limit500: Boolean = purchaseLimit.get == USAPurchaseLimit.D500 - def limit1000: Boolean = purchaseLimit.get == USAPurchaseLimit.D1000 || purchaseLimit.get == USAPurchaseLimit.D3000_Pending - def limit3000: Boolean = purchaseLimit.get == USAPurchaseLimit.D3000 || purchaseLimit.get == USAPurchaseLimit.Unlimited_Pending - def unlimited: Boolean = purchaseLimit.get == USAPurchaseLimit.Unlimited + def limit1k: Boolean = purchaseLimit.get == USAPurchaseLimit.D1k + def limit3k: Boolean = purchaseLimit.get == USAPurchaseLimit.D3k || purchaseLimit.get == USAPurchaseLimit.D10k_? + def limit10k: Boolean = purchaseLimit.get == USAPurchaseLimit.D10k def userLimitAsString = - if(unlimited) "$10,000" - else if(limit3000) "$3,000" - else if(limit1000) "$1,000" - else "$500" + if(limit10k) "$10,000" + else if(limit3k) "$3,000" + else "$1,000" def userLimitAsInt = userLimitAsString.tail.replaceAll(",", "").toInt } \ No newline at end of file diff --git a/src/main/scala/inc/pyc/snippet/AdminSnip.scala b/src/main/scala/inc/pyc/snippet/AdminSnip.scala @@ -20,7 +20,7 @@ import ExecutionContext.Implicits.global trait AdminSnip extends AngularSnippet -class VerifyId extends AdminSnip { +class VerifyId extends AdminSnip with Logger { def roundTrips: List[RoundTripInfo] = List( "submit" -> submit _, @@ -28,8 +28,7 @@ class VerifyId extends AdminSnip { /** Pending Users */ val pending = User.or( - _.where(_.purchaseLimit eqs Unlimited_Pending), - _.where(_.purchaseLimit eqs D3000_Pending)). + _.where(_.purchaseLimit eqs D10k_?)). fetch @@ -42,49 +41,62 @@ class VerifyId extends AdminSnip { import net.liftweb.util.Mailer._ val fname = user.fname.get + info("Fname: "+fname) val limit = user.purchaseLimit.get + info("Limit: "+limit) val title = "Identity Verification" val settingsUrl = Site.domain+"/settings" + info("title: "+title) + info("settings: "+settingsUrl) - Future { - val html: Box[NodeSeq] = - if(accepted) { - - if(limit == D3000_Pending) user.purchaseLimit(D3000) - else user.purchaseLimit(Unlimited) - user.update - - val subtitle = s"Congratulations $fname, you've been verified!" - val body = - <div> - {subtitle} - <br/> - <h2>Your new bitcoin purchase limit is {user.purchaseLimit.get}</h2> - <br/> - To purchase bitcoin from a store BTM, you may need to authenticate face-to-face - with the store manager or an authorized employee using a one-time password - available in the <a href={settingsUrl}>settings page of your PYC account</a>. - Note, this password is not related to the bitcoin you possess; it's only a way to - prove to the store owner you can purchase up to {user.purchaseLimit.get}. - This is a requirement in only some states. - For information about the authorization process, read more about FinCen MSB requirements. - We apologize for the strict regulations and thank you for your interest in buying bitcoin. - </div> + val JString(reason) = + if(accepted) JString("") + else model \ "reason" - HtmlEmail.simpleMessage(title, subtitle, body) + info("Reason: "+reason) + + if(accepted) user.purchaseLimit(D10k) + else user.purchaseLimit(D3k) + user.update + + info("Limit NOW: "+user.purchaseLimit.get) + + val subtitle = + if(accepted) S ? "verify_subtitle_success" format fname + else S ? "verify_subtitle_fail" format fname - } else { - - if(limit == D3000_Pending) user.purchaseLimit(D1000) - else user.purchaseLimit(D3000) - user.update + info("subtitle: "+subtitle) - val JString(reason) = model \ "reason" - val subtitle = s"Sorry $fname, your verification failed!" - val body = s"$subtitle $reason -- Your bitcoin buy limit remains at ${user.purchaseLimit.get}" - HtmlEmail.simpleMessage(title, subtitle, Text(body)) - } - + val purchaseLimit = S ? "new_purchase_limit" format user.purchaseLimit.get + val settingsUrlText = S ? "setting_url_text" + val successPart1 = S ? "verify_body_success_part1" + val successPart2 = S ? "verify_body_success_part2" format user.purchaseLimit.get + + info("purchaseLimit: "+purchaseLimit) + info("settingsUrlText: "+settingsUrlText) + info("successPart1: "+successPart1) + info("successPart2: "+successPart2) + + val body = + if(accepted) + <div> + {subtitle} + <br/> + <h2>{purchaseLimit}</h2> + <br/> + {successPart1} <a href={settingsUrl}>{settingsUrlText}</a>. + {successPart2} + </div> + else + Text(S ? "verify_body_fail" format (subtitle, reason, user.purchaseLimit.get)) + + info("body: "+body) + + Future { + val html: Box[NodeSeq] = + if(accepted) HtmlEmail.simpleMessage(title, subtitle, body) + else HtmlEmail.simpleMessage(title, subtitle, body) + html map (sendMail( From(MongoAuth.systemFancyEmail), Subject("%s: %s".format(MongoAuth.siteName.vend, title)), @@ -113,7 +125,7 @@ class PurchaseLimitList extends AngularSnippet with Logger { def roundTrips: List[RoundTripInfo] = List( "init" -> init _) - val users = User.where(_.purchaseLimit gt D500).fetch + val users = User.where(_.purchaseLimit gt D1k).fetch def init(model: JValue): JValue = ("users" -> JArray(users.map(user => diff --git a/src/main/scala/inc/pyc/snippet/AtmSnip.scala b/src/main/scala/inc/pyc/snippet/AtmSnip.scala @@ -35,16 +35,9 @@ class AtmApplication extends AngularSnippet { rec.save(false) notifyByEmail(rec) - NgAlert.success( - <i class="fa-fw fa fa-thumbs-o-up"></i> ++ - <span>BTM application for {rec.name.get} has been received.</span> - ) + NgAlert.success(Text(S ? "btm_app_received" format rec.name.get)) case errors => - NgAlert.danger( - <i class="fa-fw fa fa-thumbs-o-down"></i> ++ - <span>Invalid submission</span>, - errors - ) + NgAlert.danger(Text(S ? "Invalid_submission"), errors) } } @@ -56,15 +49,15 @@ class AtmApplication extends AngularSnippet { import Mailer._ val msgTxt = s""" - |Business Asking for a BTM! - |Name: ${rec.name.get} - |Website: ${rec.website.get} - |Address: - |${rec.address.get} - |${rec.city.get}, ${rec.state.get} - |Email: ${rec.email.get} - |Phone: ${rec.phone.get} - |Best Time: ${rec.bestTime.get} + Business Asking for a BTM! + Name: ${rec.name.get} + Website: ${rec.website.get} + Address: + ${rec.address.get} + ${rec.city.get}, ${rec.state.get} + Email: ${rec.email.get} + Phone: ${rec.phone.get} + Best Time: ${rec.bestTime.get} """ sendMail( @@ -130,10 +123,7 @@ class FindAtm extends AngularSnippet with Logger { val email = e.toLowerCase.trim loc.emails.add(email).update - NgAlert.success( - <i class="fa-fw fa fa-thumbs-o-up"></i> ++ - <span>We will notify you when there is a BTM nearby.</span> - ) + NgAlert.success(Text(S ? "btm_notify")) } getOrElse JNull diff --git a/src/main/scala/inc/pyc/snippet/Contact.scala b/src/main/scala/inc/pyc/snippet/Contact.scala @@ -1,6 +1,7 @@ package inc.pyc package snippet +import xml._ import config._ import net.liftweb._ import http._ @@ -11,7 +12,7 @@ import net.liftmodules.mongoauth.MongoAuth class Contact extends AngularSnippet { - def roundTrips: List[RoundTripInfo] = List("submit" -> submit _) + def roundTrips: List[RoundTripInfo] = List("submit" -> submit _) def submit(model: JValue): JValue = for { diff --git a/src/main/scala/inc/pyc/snippet/NgAlert.scala b/src/main/scala/inc/pyc/snippet/NgAlert.scala @@ -11,6 +11,9 @@ import json.JsonAST._ * Builds Alert JSON messages for server-side responses. */ object NgAlert extends Logger { + + val thumbsUp = <i class="fa-fw fa fa-thumbs-o-up"></i> + val thumbsDown = <i class="fa-fw fa fa-thumbs-o-down"></i> private def msgBox(msgType: String, msg: NodeSeq, data: Option[JValue] = None): JValue = JObject(List( @@ -18,15 +21,17 @@ object NgAlert extends Logger { JField("msg", JString(msg.toString)), JField("data", data.getOrElse(JNull)))) - def success(msg: NodeSeq): JValue = msgBox("success", msg) + def success(msg: NodeSeq): JValue = msgBox("success", thumbsUp ++ msg) def success(msg: String): JValue = success(Text(msg)) def success(data: JValue): JValue = msgBox("success", Text(""), Some(data)) + def success(msg: NodeSeq, data: JValue): JValue = msgBox("success", msg, Some(data)) def success: JValue = success(Text("")) + def danger(msg: NodeSeq, errors: List[FieldError]): JValue = { debug(errors) - msgBox("danger", msg ++ + msgBox("danger", thumbsDown ++ msg ++ errors.foldLeft(<ul></ul>)((el,err) => el.copy(child = el.child :+ <li>{" - "+err.msg}</li>))) } diff --git a/src/main/scala/inc/pyc/snippet/UserSnip.scala b/src/main/scala/inc/pyc/snippet/UserSnip.scala @@ -98,7 +98,7 @@ trait AngularUserSnippet extends AngularSnippet { user.validate match { case Nil => f(user) case errors => - NgAlert.danger("Invalid submission", errors) + NgAlert.danger(S ? "Invalid_submission", errors) } } } @@ -126,9 +126,8 @@ class UserLogin extends AngularSnippet { User.findByEmail(email) match { case Full(user) if !user.verified.get => NgAlert.danger( - <i class="fa-fw fa fa-thumbs-o-down"></i> ++ - <span>Unverified Email:</span> ++ - <p>Please verify before logging in.</p>, Nil) + <span>{S ? "unverified.title"}:</span> ++ + <p>{S ? "unverified.message"}.</p>, Nil) case Full(user) if (user.password.isMatch(password)) => User.logUserIn(user, remember) @@ -138,9 +137,8 @@ class UserLogin extends AngularSnippet { case _ => NgAlert.danger( - <i class="fa-fw fa fa-thumbs-o-down"></i> ++ - <span>Invalid Credentials:</span> ++ - <p>Assure your email and password are correct.</p>, Nil) + <span>{S ? "invalid.title"}:</span> ++ + <p>{S ? "invalid.message"}.</p>, Nil) } } } @@ -171,13 +169,11 @@ class PasswordChange extends AngularCurrentUser { user.save() NgAlert.success( - <i class="fa-fw fa fa-thumbs-o-up"></i> ++ - <span>Password has been updated.</span>) + <span>{S ? "password_updated"}</span>) } else { NgAlert.danger( - <i class="fa-fw fa fa-thumbs-o-down"></i> ++ - <span>Password must have:</span> ++ - <ul><li>no white spaces</li><li>at least 8 characters</li><li>at least one non-alpha character</li></ul>, Nil) + <span>{S ? "password_req"}:</span> ++ + <ul><li>{S ? "password_whitespace"}</li><li>{S ? "password_atleast8"}</li><li>{S ? "password_nonalpha"}</li></ul>, Nil) } } @@ -195,9 +191,8 @@ class PasswordRecovery extends AngularSnippet { val email = e.toLowerCase.trim def msg = NgAlert.success( - <i class="fa-fw fa fa-thumbs-o-up"></i> ++ - <span>An email has been sent</span> ++ - <p>If email exists in our database, go to your inbox and follow the instructions for accessing your account.</p>) + <span>{S ? "sent.title"}</span> ++ + <p>{S ? "sent.message"}.</p>) User.findByEmail(email) match { case Full(user) => @@ -234,14 +229,12 @@ class UserRegistration extends AngularSnippet { User.sendRegistrationToken(user) NgAlert.success( - <i class="fa-fw fa fa-thumbs-o-up"></i> ++ - <span>Thank you for registering {user.fname.get}.</span> ++ - <p>An email has been sent with instructions for accessing your account.</p> + <span>{S ? "thanks.title" format user.fname.get}.</span> ++ + <p>{S ? "thanks.message"}.</p> ) case errors => NgAlert.danger( - <i class="fa-fw fa fa-thumbs-o-down"></i> ++ - <span>Invalid submission</span>, + Text(S ? "Invalid_submission"), errors ) } @@ -310,8 +303,7 @@ class UserSettingsEmail extends AngularCurrentUser { EmailResetToken.sendToken(user, email) NgAlert.success( - <i class="fa-fw fa fa-thumbs-o-up"></i> ++ - <span>An email has been sent for verification.</span> + Text(S ? "verify_email_msg") ) } } @@ -339,7 +331,7 @@ class UserVerifyPassword extends AngularCurrentUser with UserSnippet { def show(in: NodeSeq): NodeSeq = serve { user => - if(user.limit500) NodeSeq.Empty else in + if(user.limit1k) NodeSeq.Empty else in } } @@ -350,10 +342,10 @@ class VerificationSteps extends CurrentUser { import USAPurchaseLimit._ val step = - if(user.unlimited) Unlimited - else if(user.limit3000) Unlimited - else if(user.limit1000) D3000 - else D500 + if(user.limit10k) "Verified" + else if(user.limit3k) D10k + else if(user.limit1k) D3k + else D1k "wizard [current-step]" #> s"'$step'" } @@ -365,29 +357,17 @@ class PhoneVerification extends AngularCurrentUser { lazy val smscode = (100000 + new scala.util.Random().nextInt(900000)).toString def roundTrips: List[RoundTripInfo] = List( - "postal" -> postal _, "sendsms" -> sendsms _, "verifyphone" -> verifyphone _, "init" -> init _) - def postal(model: JValue): JValue = serve { - user => - for { - JString(postal) <- model - } yield - validateAndUpdate { () => - user.postal(postal) - } - } - def sendsms(model: JValue): JValue = serve { user => for { JString(phone) <- model \ "phone" } yield { - val msg = s"Hi ${user.fname.get}, enter $smscode to"+ - " verify your PYC account. This is a 1-time message." + val msg = S ? "sms_code_msg" format (user.fname.get, smscode) if(Twilio.sms(phone, msg)) { validateAndUpdate { () => @@ -396,9 +376,7 @@ class PhoneVerification extends AngularCurrentUser { } } else { NgAlert.danger( - <i class="fa-fw fa fa-thumbs-o-down"></i> ++ - <span>We apologize for the incovenience, but we're experiencing</span> ++ - <span> technical difficulties. Please try again later.</span>, Nil) + Text(S ? "technical_difficulties"), Nil) } } @@ -412,20 +390,20 @@ class PhoneVerification extends AngularCurrentUser { if(this.smscode == smscode) { validateAndUpdate { () => - user.purchaseLimit(USAPurchaseLimit.D1000) + user.purchaseLimit(USAPurchaseLimit.D3k) user.phoneverified(true) } + + NgAlert.success(("purchaseLimit" -> user.purchaseLimit.get.toString)) } else { NgAlert.danger( - <i class="fa-fw fa fa-thumbs-o-down"></i> ++ - <span>The private code is incorrect. Try again</span>, Nil) + Text(S ? "sms_verify_fail"), Nil) } } def init(model: JValue): JValue = serve { user => - ("postal" -> user.postal.get) ~ ("phone" -> user.phone.get) } } @@ -453,17 +431,26 @@ class IdVerification extends AngularCurrentUser { IdVerificationFiles(Nil) if (statusCodes.forall(_ == 200)) { - user.purchaseLimit(USAPurchaseLimit.D3000_Pending) + user.purchaseLimit(USAPurchaseLimit.D10k_?) user.update notifyIdentityRequest(user) NgAlert.success( - <i class="fa-fw fa fa-thumbs-o-up"></i> ++ - <span>We have received your application:</span> ++ - <p>We will notify you as soon as we are done reviewing your information.</p>) + <span>{S ? "file_received"}:</span> ++ + <p>{S ? "file_review"}.</p>, + ("purchaseLimit" -> user.userLimitAsString)) } else { - NgAlert.danger( - <i class="fa-fw fa fa-thumbs-o-down"></i> ++ - <span>File could not be uploaded. Please try again.</span>, Nil) + NgAlert.danger(Text(S ? "file_upload_fail"), Nil) } } +} + + +class PurchaseLimit extends AngularCurrentUser { + + def roundTrips: List[RoundTripInfo] = List("init" -> init _) + + def init(model: JValue): JValue = serve { + user => + ("purchaseLimit" -> user.userLimitAsString) + } } \ No newline at end of file diff --git a/src/main/scala/inc/pyc/snippet/UtilSnips.scala b/src/main/scala/inc/pyc/snippet/UtilSnips.scala @@ -15,6 +15,7 @@ import json.JsonAST._ import net.liftmodules._ import extras._, snippet._ import dispatch._, Defaults._ +import net.liftweb.builtin.snippet.Menu object Assets extends AssetLoader @@ -88,4 +89,19 @@ object Social { def twitterLink: CssSel = "* [href]" #> "https://twitter.com/pyc_inc" def gplusLink: CssSel = "* [href]" #> "https://plus.google.com/113129814840501272637" def instagramLink: CssSel = "* [href]" #> "https://instagram.com/pyc_inc" +} + +object Placeholder extends SnippetHelper { + + def render: CssSel = + for (name <- S.attr("name")) yield { + "* [placeholder]" #> {S ? name} + } +} + +object LocaleTitle extends SnippetHelper { + def render = "* *" #> ( for { + loc <- S.request.map(_.location) + name <- loc.map(S ? _.name) + } yield name) } \ No newline at end of file diff --git a/src/main/webapp/about/contact.html b/src/main/webapp/about/contact.html @@ -1,15 +1,16 @@ <div data-lift="surround?with=base-default&at=content"> -<div data-lift="ignore"> + + <div data-lift="ignore"> <div class="row padding-bottom-20"> <div class="col-xs-12"> <img style="width:100%" src="https://s3.amazonaws.com/assets-pyc/teamwork.jpg" /> </div> </div> -</div> + </div> <div class="row padding-bottom-20"> - <div class="col-xs-12 col-sm-6 padding-20"> - <p class="lead">Have a question? Please contact us. We'll be happy to answer it for you.</p> + <div class="col-xs-12 col-sm-6 padding-20 welcome"> + <span data-lift="Loc.welcome"></span> </div> <div class="col-xs-12 col-sm-6 simple-form"> diff --git a/src/main/webapp/about/resources-hidden/_resources_contact.html b/src/main/webapp/about/resources-hidden/_resources_contact.html @@ -0,0 +1,8 @@ +<resources> + <res name="contact_reason_tip">Reason you're contacting us today</res> + <res name="contact_message_tip">What's on your mind?</res> + + <res name="welcome"> + <p>Have a question? Please contact us. We'll be happy to answer it for you.</p> + </res> +</resources> +\ No newline at end of file diff --git a/src/main/webapp/about/resources-hidden/_resources_team.html b/src/main/webapp/about/resources-hidden/_resources_team.html @@ -0,0 +1,14 @@ +<resources> + <res name="team_ceo">Executive and Operations</res> + <res name="team_cto">Chief Developer and Engineer</res> + <res name="team_cmo">Marketing and Community</res> + <res name="team_strategy">Strategy Advisor</res> + + <res name="welcome"> + <p> + PYC is comprised of four Bitcoin enthusiasts that are bringing Bitcoin to the masses with easy + to use Bitcoin Teller Machines (BTMs) in the NYC area and beyond. Our goal is to help spread + awareness and adoption of this incredible new technology. + </p> + </res> +</resources> +\ No newline at end of file diff --git a/src/main/webapp/about/team.html b/src/main/webapp/about/team.html @@ -2,12 +2,8 @@ <div class="row ourteam"> <div class="col-xs-12"> - <div> - <p class="lead padding-20"> - PYC is comprised of four Bitcoin enthusiasts that are bringing Bitcoin to the masses with easy - to use Bitcoin Teller Machines (BTMs) in the NYC area and beyond. Our goal is to help spread - awareness and adoption of this incredible new technology. - </p> + <div class="welcome padding-20"> + <span data-lift="Loc.welcome"></span> </div> </div> @@ -19,7 +15,7 @@ <img class="img-thumbnail img-ourteam" src="https://s3.amazonaws.com/assets-pyc/emilio.jpg" /> <div> <h3>Emilio Pagan-Yourno</h3> - <h6>Executive and Operations</h6> + <h6><span data-lift="Loc.team_ceo"></span></h6> </div> </div> @@ -27,7 +23,7 @@ <img class="img-thumbnail img-ourteam" src="https://s3.amazonaws.com/assets-pyc/julio.jpg" /> <div> <h3>Julio Enrique Cabrera</h3> - <h6>Chief Developer and Engineer</h6> + <h6><span data-lift="Loc.team_cto"></span></h6> </div> </div> @@ -35,7 +31,7 @@ <img class="img-thumbnail img-ourteam" src="https://s3.amazonaws.com/assets-pyc/matt.jpg" /> <div> <h3>Matt Russell</h3> - <h6>Marketing and Community</h6> + <h6><span data-lift="Loc.team_cmo"></span></h6> </div> </div> @@ -43,7 +39,7 @@ <img class="img-thumbnail img-ourteam" src="https://s3.amazonaws.com/assets-pyc/hannah.jpg" /> <div> <h3>Hannah Yu</h3> - <h6>Strategy Advisor</h6> + <h6><span data-lift="Loc.team_strategy"></span></h6> </div> </div> diff --git a/src/main/webapp/app/mycontrollers/FindAtm.js b/src/main/webapp/app/mycontrollers/FindAtm.js @@ -27,6 +27,7 @@ angular.module("FindAtm", ['Forms', 'ngAlert', 'AtmHelper', 'Variables']) }; */ setDynamicMarkers(); + $scope.mapLoaded = true; }); $scope.nonfound = false; diff --git a/src/main/webapp/app/mycontrollers/IdVerification.js b/src/main/webapp/app/mycontrollers/IdVerification.js @@ -46,6 +46,7 @@ angular.module("IdVerification", ['Forms', 'ngAlert', 'angularFileUpload']) $scope.uploader.bind('success', function () { var success = function(alert) { + $rootScope.purchaseLimit = alert.data.purchaseLimit; $rootScope.$broadcast('alertIdVerification', alert); //$state.go($state.$current, null, { reload: true }); $scope.uploader.clearQueue(); diff --git a/src/main/webapp/app/mycontrollers/PhoneVerification.js b/src/main/webapp/app/mycontrollers/PhoneVerification.js @@ -11,14 +11,6 @@ angular.module("PhoneVerification", ['Forms', 'ngAlert', 'mgo-angular-wizard']) .controller('PhoneVerificationCtrl', ['$scope', '$controller', '$rootScope', 'WizardHandler', function($scope, $controller, $rootScope, WizardHandler) { $controller('AutoUpdateFormCtrl', {$scope: $scope, $controller: $controller, $rootScope: $rootScope}); $scope.init('PhoneVerification', 'init'); - - $scope.updatePostal = function() { - var failure = function(alert) { - $rootScope.$broadcast('alertPhoneVerification', alert); - }; - - $scope.update('PhoneVerification', 'postal', function(){}, failure); - }; $scope.sentsms = false; @@ -40,7 +32,8 @@ angular.module("PhoneVerification", ['Forms', 'ngAlert', 'mgo-angular-wizard']) }; $scope.verifyphone = function () { - var success = function() { + var success = function(data) { + $rootScope.purchaseLimit = data.data.purchaseLimit; WizardHandler.wizard().next(); }; diff --git a/src/main/webapp/app/mycontrollers/PurchaseLimit.js b/src/main/webapp/app/mycontrollers/PurchaseLimit.js @@ -1,7 +1,10 @@ angular.module("PurchaseLimit", ['Forms']) -.controller('PurchaseLimitCtrl', ['$scope', function($scope) { - $scope.thirdPartyVerified = false; +.controller('PurchaseLimitCtrl', ['$scope', '$rootScope', '$controller', function($scope, $rootScope, $controller) { + $controller('LoadedFormCtrl', {$scope: $scope, $controller: $controller}); + $scope.init('PurchaseLimit', 'init', function() { + $rootScope.purchaseLimit = $scope.model.purchaseLimit; + }); }]) .controller('PurchaseLimitListCtrl', ['$scope', '$controller', function($scope, $controller) { diff --git a/src/main/webapp/faqs.html b/src/main/webapp/faqs.html @@ -6,55 +6,33 @@ <div class="col-xs-12 col-md-10"> <ul class="list-unstyled"> <li> - <h3 class="bold">What is PYC?</h3> - <p> - PYC is a BTM (Bitcoin Teller Machine) Service Operator. - We enable customers to retrieve bitcoin instantly, just as they - retrieve cash from a bank ATM. - </p> + <h3 class="bold"><span data-lift="Loc.q1"></span></h3> + <p><span data-lift="Loc.a1"></span></p> </li> <li class="padding-top-10"> - <h3 class="bold">In which states is PYC available?</h3> - <p> - We established our first machine in Albany, NY on the 27th of June, 2014. Now - we're expanding to other locations such as Manhattan, New Hampshire and New Jersey. - BTMs may soon be available near your hometown -- stay tuned. - </p> + <h3 class="bold"><span data-lift="Loc.q2"></span></h3> + <p><span data-lift="Loc.a2"></span></p> </li> <li class="padding-top-10"> - <h3 class="bold">How can I find a BTM (Bitcoin Teller Machine)?</h3> - <p> - You can easily <a href="/##locations">search for a BTM near your area</a>. - </p> + <h3 class="bold"><span data-lift="Loc.q3"></span></h3> + <p><span data-lift="Loc.a3"></span></p> </li> <li class="padding-top-10"> - <h3 class="bold">I'm a merchant. How can I put a machine in my store?</h3> - <p> - If you're a merchant and interested in having us host a BTM in your establishment, - <a href="/about/contact">contact us and we'll respond as soon as possible</a>. - Please note, there is a selection process and we cannot guarantee all requests. - </p> + <h3 class="bold"><span data-lift="Loc.q4"></span></h3> + <p><span data-lift="Loc.a4"></span></p> </li> <li class="padding-top-10"> - <h3 class="bold">How long does the BTM take to transfer the - bitcoin to my wallet?</h3> - <p> - The BTM takes a few seconds -- no more than a minute -- - it is the fastest and easiest way to retrieve bitcoin, hence our - slogan. - </p> + <h3 class="bold"><span data-lift="Loc.q5"></span></h3> + <p><span data-lift="Loc.a5"></span></p> </li> <li class="padding-top-10"> - <h3 class="bold">How much money can I take out from the BTM?</h3> - <p> - At the moment, the maximum amount of money that can be - taken out per transaction is 1,000 USD. We will soon be able to sell over a thousand shortly. - </p> + <h3 class="bold"><span data-lift="Loc.q6"></span></h3> + <p><span data-lift="Loc.a6"></span></p> </li> </ul> </div> diff --git a/src/main/webapp/find-btm.html b/src/main/webapp/find.html diff --git a/src/main/webapp/forgot-password.html b/src/main/webapp/forgot-password.html @@ -1,16 +0,0 @@ -<div data-lift="surround?with=base-default&at=content"> - <div class="row margin-top-10"> - <div class="col-xs-12 col-sm-8 col-sm-offset-2"> - <div class="well"> - <span data-lift="embed?what=/templates-hidden/parts/forgot-password-form"></span> - </div> - </div> - <div class="col-xs-12 col-sm-8 col-sm-offset-2"> - <p class="lead"> - Did you forget your password? No problem, we'll email you with - instructions for accessing your account. - </p> - <p class="lead">Thank you for using our Bitcoin services.</p> - </div> - </div> -</div> -\ No newline at end of file diff --git a/src/main/webapp/help/password.html b/src/main/webapp/help/password.html @@ -0,0 +1,12 @@ +<div data-lift="surround?with=base-default&at=content"> + <div class="row margin-top-10"> + <div class="col-xs-12 col-sm-8 col-sm-offset-2"> + <div class="well"> + <span data-lift="embed?what=/templates-hidden/parts/forgot-password-form"></span> + </div> + </div> + <div class="col-xs-12 col-sm-8 col-sm-offset-2 welcome"> + <span data-lift="Loc.welcome"></span> + </div> + </div> +</div> +\ No newline at end of file diff --git a/src/main/webapp/help/resources-hidden/_resources_password.html b/src/main/webapp/help/resources-hidden/_resources_password.html @@ -0,0 +1,11 @@ +<resources> + <res name="sent.title">An email has been sent</res> + <res name="sent.message">If the email exists in our database, go to your inbox and follow the instructions for accessing your account</res> + <res name="welcome"> + <p> + Did you forget your password? No problem, we'll email you with + instructions for accessing your account. + </p> + <p>Thank you for using our Bitcoin services.</p> + </res> +</resources> +\ No newline at end of file diff --git a/src/main/webapp/host-btm.html b/src/main/webapp/host-btm.html @@ -1,44 +0,0 @@ -<div data-lift="surround?with=base-wrap&at=content"> - <div class="container"> - <h1 id="atm-app-title" class="text-primary text-center">Are you a merchant? Apply for a BTM!</h1> - - <div class="row padding-bottom-20"> - <div class="col-xs-10 col-xs-offset-1"> - - <p class="lead padding-20">Are you interested in hosting a - Bitcoin Teller Machine to increase foot traffic and spread the - acceptance of Bitcoin? We are currently accepting merchant interest - for our next NYC and greater-NY area. Contact us for more - information.</p> - - <div class="row"> - <div id="atm-benefits" class="col-xs-12 col-sm-6 text-primary margin-bottom-20"> - <table> - <tr> - <td><i class="fa fa-wrench fa-4x"></i></td> - <td><h5>Free installation and maintenance</h5></td> - </tr> - <tr> - <td><i class="fa fa-bitcoin fa-4x pull-left"></i></td> - <td><h5>Hot and new emerging technology</h5></td> - </tr> - <tr> - <td><i class="fa fa-thumbs-up fa-4x pull-left"></i></td> - <td><h5>Increase business exposure</h5></td> - </tr> - <tr> - <td><i class="fa fa-shield fa-4x pull-left"></i></td> - <td><h5>Safe and reliable way for customers to - purchase Bitcoin</h5></td> - </tr> - </table> - </div> - - <div class="col-xs-12 col-sm-6 simple-form"> - <span - data-lift="embed?what=/templates-hidden/parts/apply-btm-form"></span> - </div> - </div> - </div> - </div> -</div> -\ No newline at end of file diff --git a/src/main/webapp/host.html b/src/main/webapp/host.html @@ -0,0 +1,42 @@ +<div data-lift="surround?with=base-wrap&at=content"> + <div class="container"> + <h1 id="atm-app-title" class="text-primary text-center"><span data-lift="Loc.welcome_title"></span></h1> + + <div class="row padding-bottom-20"> + <div class="col-xs-10 col-xs-offset-1"> + + <div class="welcome padding-20"> + <span data-lift="Loc.welcome"></span> + </div> + + + <div class="row"> + <div id="atm-benefits" class="col-xs-12 col-sm-6 text-primary margin-bottom-20"> + <table> + <tr> + <td><i class="fa fa-wrench fa-4x"></i></td> + <td><h5><span data-lift="Loc.benefit_maintenance"></span></h5></td> + </tr> + <tr> + <td><i class="fa fa-bitcoin fa-4x pull-left"></i></td> + <td><h5><span data-lift="Loc.benefit_emerging"></span></h5></td> + </tr> + <tr> + <td><i class="fa fa-thumbs-up fa-4x pull-left"></i></td> + <td><h5><span data-lift="Loc.benefit_exposure"></span></h5></td> + </tr> + <tr> + <td><i class="fa fa-shield fa-4x pull-left"></i></td> + <td><h5><span data-lift="Loc.benefit_reliable"></span></h5></td> + </tr> + </table> + </div> + + <div class="col-xs-12 col-sm-6 simple-form"> + <span + data-lift="embed?what=/templates-hidden/parts/apply-btm-form"></span> + </div> + </div> + </div> + </div> +</div> +\ No newline at end of file diff --git a/src/main/webapp/index.html b/src/main/webapp/index.html @@ -1,6 +1,6 @@ <div data-lift="surround?with=base-wrap&at=content"> -<div ng-controller="IntroVideoCtrl"> +<div ng-controller="IntroVideoCtrl" ng-cloak> <div id="intro-content-bg"> <div id="bgvid"></div> @@ -9,39 +9,40 @@ </div> </div> - <div id="intro-content" ng-cloak> + <div id="intro-content"> <div class="inner"> <div class="container text-center text-white padding-20-sides"> <div class="jumbotron"> <div id="step-1" ng-show="current === 0"> - <h1 class="fade-in">PRESS START.</h1> + <h1 class="fade-in"><span data-lift="Loc.step1"></span>.</h1> </div> <div id="step-2" ng-show="current === 1"> - <h1 class="fade-in">SCAN BITCOIN CODE.</h1> + <h1 class="fade-in"><span data-lift="Loc.step2"></span>.</h1> </div> <div id="step-3" ng-show="current === 2"> - <h1 class="fade-in">INSERT CASH.</h1> + <h1 class="fade-in"><span data-lift="Loc.step3"></span>.</h1> </div> <div id="step-4" ng-show="current === 3"> - <h1 class="fade-in">SEND.</h1> + <h1 class="fade-in"><span data-lift="Loc.step4"></span>.</h1> </div> <div id="step-5" ng-show="current === 4"> - <h1 class="fade-in">DONE.</h1> + <h1 class="fade-in"><span data-lift="Loc.step5"></span>.</h1> </div> <div id="step-6" ng-show="current === 5" > - <h1 class="fade-in">BUY BITCOIN NOW</h1> + <h1 class="fade-in"><span data-lift="Loc.step6"></span></h1> <p class="lead fade-in"> <a id="view-locations-btn" href="##locations" - class="btn btn-lg btn-primary">View BTM Locations</a> + class="btn btn-lg btn-primary"><span data-lift="Loc.view_locations_btn"></span></a> </p> </div> </div> </div> </div> </div> -</div> -<div id="locations" class="row"><div class="col-xs-12"></div></div> -<span data-lift="embed?what=/templates-hidden/parts/btm-map"></span> + <div id="locations" class="row"><div class="col-xs-12"></div></div> + <span data-lift="embed?what=/templates-hidden/parts/btm-map"></span> + +</div> </div> diff --git a/src/main/webapp/less/override/other.less b/src/main/webapp/less/override/other.less @@ -47,4 +47,8 @@ footer { background-color: @body-bg; +} + +.welcome p { + .lead(); } \ No newline at end of file diff --git a/src/main/webapp/login.html b/src/main/webapp/login.html @@ -5,12 +5,8 @@ <span data-lift="embed?what=/templates-hidden/parts/user-login-form"></span> </div> </div> - <div class="col-xs-12 col-sm-8 col-sm-offset-2"> - <p class="lead"> - Welcome Back Bitcoin User! Remember, if you have any questions, be sure to check - our <a href="/faqs">frequently asked questions</a> and contact us if you need any other help. - </p> - <p class="lead">Thank you for using our Bitcoin services.</p> + <div class="col-xs-12 col-sm-8 col-sm-offset-2 welcome"> + <span data-lift="Loc.welcome"></span> </div> </div> </div> \ No newline at end of file diff --git a/src/main/webapp/register.html b/src/main/webapp/register.html @@ -5,12 +5,8 @@ <span data-lift="embed?what=/templates-hidden/parts/user-registration-form"></span> </div> </div> - <div class="col-xs-12 col-sm-8 col-sm-offset-2"> - <p class="lead"> - We believe Bitcoin is the future of all cash payments that will create healthier - businesses and happier customers. - </p> - <p class="lead">Thank you for being part of that future.</p> + <div class="col-xs-12 col-sm-8 col-sm-offset-2 welcome"> + <span data-lift="Loc.welcome"></span> </div> </div> </div> diff --git a/src/main/webapp/resources-hidden/_resources.html b/src/main/webapp/resources-hidden/_resources.html @@ -0,0 +1,63 @@ +<resources> + <res name="Bitcoin Teller Machine Services">Bitcoin Teller Machine Services</res> + <res name="Find A BTM">Find A BTM</res> + <res name="Host A BTM">Host A BTM</res> + <res name="About">About</res> + <res name="Team">Team</res> + <res name="Press">Press</res> + <res name="FAQs">FAQs</res> + <res name="What Is Bitcoin">What Is Bitcoin</res> + <res name="How To Use BTM">How To Use BTM</res> + <res name="Register">Register</res> + <res name="Login">Login</res> + <res name="Password Recovery">Password Recovery</res> + <res name="Terms of Service">Terms of Service</res> + <res name="Privacy">Privacy</res> + <res name="Settings">Settings</res> + <res name="Password">Password</res> + <res name="Purchase Limit">Purchase Limit</res> + <res name="Verify ID">Verify ID</res> + <res name="View Purchase Limits">View Purchase Limits</res> + <res name="BTM">BTM</res> + <res name="BTM Information">BTM Information</res> + <res name="Error">Error</res> + <res name="Contact">Contact</res> + <res name="ID">ID</res> + <res name="name">Name</res> + <res name="fname">First Name</res> + <res name="lname">Last Name</res> + <res name="Email">E-Mail</res> + <res name="Email_Address">Email Address</res> + <res name="username">Username</res> + <res name="limit">Limit</res> + <res name="Forgot_Password">Forgot Password</res> + <res name="Stay_Signed_In">Stay signed in</res> + <res name="Log_In">Log In</res> + <res name="Invalid_submission">Invalid submission</res> + <res name="name_tip">Please provide your name</res> + <res name="fname_tip">Please provide your first name</res> + <res name="lname_tip">Please provide your last name</res> + <res name="email_tip">Enter your email address</res> + <res name="phone_tip">Please provide phone number</res> + <res name="Register">Register</res> + <res name="Reset_Password">Reset Password</res> + <res name="Send_Message">Send Message</res> + <res name="Search_BTM">Search BTM</res> + <res name="Showing_Local">Only showing local time</res> + <res name="browse">Browse</res> + <res name="business_name">Business Name</res> + <res name="address">Address</res> + <res name="city">City</res> + <res name="website_url">Website URL</res> + <res name="phone_number">Phone Number</res> + <res name="with_text_messaging">with text messaging</res> + <res name="sms_code">SMS Code</res> + <res name="send_sms_code">Send SMS Code</res> + <res name="verify_number">Verify Number</res> + <res name="btm_notify">We will notify you when there is a BTM nearby.</res> + <res name="invalid_website">Invalid Website URL</res> + <res name="invalid_phone">Incomplete phone number</res> + <res name="invalid_email">Invalid email address</res> + <res name="invalid_phone_number">Invalid phone number</res> + <res name="technical_difficulties">We apologize for the incovenience, but we're experiencing technical difficulties. Please try again later.</res> +</resources> +\ No newline at end of file diff --git a/src/main/webapp/resources-hidden/_resources_faqs.html b/src/main/webapp/resources-hidden/_resources_faqs.html @@ -0,0 +1,39 @@ +<resources> + <res name="q1">What is PYC?</res> + <res name="a1"> + PYC is a BTM (Bitcoin Teller Machine) Service Operator. + We enable customers to retrieve bitcoin instantly, just as they + retrieve cash from a bank ATM. + </res> + + <res name="q2">In which states is PYC available?</res> + <res name="a2"> + We established our first machine in Albany, NY on the 27th of June, 2014. Now + we're expanding to other locations such as Manhattan, New Hampshire and New Jersey. + BTMs may soon be available near your hometown -- stay tuned. + </res> + + <res name="q3">How can I find a BTM (Bitcoin Teller Machine)?</res> + <res name="a3"> + You can easily <a href="/##locations">search for a BTM near your area</a>. + </res> + + <res name="q4">I'm a merchant. How can I put a machine in my store?</res> + <res name="a4"> + If you're a merchant and interested in having us host a BTM in your establishment, + <a data-lift="Menu.item?name=Contact" href="#">contact us and we'll respond as soon as possible</a>. + Please note, there is a selection process and we cannot guarantee all requests. + </res> + + <res name="q5">How long does the BTM take to transfer the bitcoin to my wallet?</res> + <res name="a5"> + The BTM takes a few seconds -- no more than a minute -- it is the + fastest and easiest way to retrieve bitcoin, hence our slogan. + </res> + + <res name="q6">How much money can I take out from the BTM?</res> + <res name="a6"> + At the moment, the maximum amount of money that can be + taken out per transaction is 1,000 USD. We will soon be able to sell over a thousand shortly. + </res> +</resources> +\ No newline at end of file diff --git a/src/main/webapp/resources-hidden/_resources_host.html b/src/main/webapp/resources-hidden/_resources_host.html @@ -0,0 +1,29 @@ +<resources> + <res name="welcome_title">Are you a merchant? Apply for a BTM!</res> + <res name="welcome"> + <p> + Are you interested in hosting a + Bitcoin Teller Machine to increase foot traffic and spread the + acceptance of Bitcoin? We are currently accepting merchant interest + for our next NYC and greater-NY area. Contact us for more + information. + </p> + </res> + <res name="apply_btm">Apply for A BTM</res> + + <res name="benefit_maintenance">Free installation and maintenance</res> + <res name="benefit_emerging">Hot and new emerging technology</res> + <res name="benefit_exposure">Increase business exposure</res> + <res name="benefit_reliable">Safe and reliable way for customers to purchase Bitcoin</res> + <res name="best_time">When is the best time to contact you?</res> + + <res name="business_name_tip">Please provide your unique business name</res> + <res name="business_email_tip">Please provide your business email for further information</res> + <res name="business_address_tip">Please provide the address of your business</res> + <res name="business_city_tip">The city your business is located</res> + <res name="business_state_tip">The state your business is located</res> + <res name="business_website_tip">The website URL of your business</res> + <res name="business_bestTime_tip">Enter time of day and/or week you would like to be contacted</res> + <res name="business_bestTime_example">Example: Saturday, 11am. Prefer phone call</res> + <res name="btm_app_received">BTM application for %s has been received.</res> +</resources> +\ No newline at end of file diff --git a/src/main/webapp/resources-hidden/_resources_index.html b/src/main/webapp/resources-hidden/_resources_index.html @@ -0,0 +1,9 @@ +<resources> + <res name="step1">PRESS START</res> + <res name="step2">SCAN WALLET</res> + <res name="step3">INSERT CASH</res> + <res name="step4">SEND</res> + <res name="step5">DONE</res> + <res name="step6">BUY BITCOIN NOW</res> + <res name="view_locations_btn">View BTM Locations</res> +</resources> +\ No newline at end of file diff --git a/src/main/webapp/resources-hidden/_resources_login.html b/src/main/webapp/resources-hidden/_resources_login.html @@ -0,0 +1,13 @@ +<resources> + <res name="invalid.title">Invalid Credentials</res> + <res name="invalid.message">Assure your email and password are correct</res> + <res name="unverified.title">Unverified Email</res> + <res name="unverified.message">Please verify before logging in</res> + <res name="welcome"> + <p> + Welcome Back Bitcoin User! Remember, if you have any questions, be sure to check + our <a data-lift="Menu.item?name=FAQs" href="#">frequently asked questions</a> and contact us if you need any other help. + </p> + <p>Thank you for using our Bitcoin services.</p> + </res> +</resources> +\ No newline at end of file diff --git a/src/main/webapp/resources-hidden/_resources_register.html b/src/main/webapp/resources-hidden/_resources_register.html @@ -0,0 +1,14 @@ +<resources> + <res name="thanks.title">Thank you for registering, %s</res> + <res name="thanks.message">An email has been sent with instructions for accessing your account</res> + <res name="welcome"> + <p> + We believe Bitcoin is the future of all cash payments that will create healthier + businesses and happier customers. + </p> + <p>Thank you for being part of that future.</p> + </res> + <res name="email_register_tip">You'll use this email when you log in and if you ever need to reset your password</res> + <res name="username_register_tip">You'll use this username to personally identify your account</res> + +</resources> +\ No newline at end of file diff --git a/src/main/webapp/resources-hidden/_resources_settings.html b/src/main/webapp/resources-hidden/_resources_settings.html @@ -0,0 +1,10 @@ +<resources> + <res name="Change_Email_Address">Change Email Address</res> + <res name="verify_email_msg">An email has been sent for verification.</res> + <res name="purchase_verification_title">Bitcoin Purchase Limit Verification</res> + <res name="purchase_limit_note"> + To take advantage of your {{ model.limit }} bitcoin purchase limit, + use these credentials to authenticate with the BTM. + This is a one-time password only. + </res> +</resources> +\ No newline at end of file diff --git a/src/main/webapp/settings.html b/src/main/webapp/settings.html @@ -1,40 +1,38 @@ <div data-lift="surround?with=settings-wrap&at=content"> <div class="padding-20"> <div class="row"> - <div class="col-xs-12 col-md-8 col-lg-6 col-md-offset-2 col-lg-offset-0"> - <h4>Settings</h4> + <div class="col-xs-12"> + <h4><span data-lift="Loc.Settings"></span></h4> <div class="well"> <span data-lift="embed?what=/templates-hidden/parts/user-settings-form"></span> </div> </div> - <div class="col-xs-12 col-md-8 col-lg-6 col-md-offset-2 col-lg-offset-0"> - <h4>Email Address</h4> + <div class="col-xs-12"> + <h4><span data-lift="Loc.Email_Address"></span></h4> <div class="well"> <span data-lift="embed?what=/templates-hidden/parts/user-settings-email-form"></span> </div> </div> <div data-lift="UserVerifyPassword.show" ng-controller="UserVerifyPasswordCtrl" ng-cloak - class="col-xs-12 col-md-8 col-lg-6 col-md-offset-2 col-lg-offset-0"> - <h4>Bitcoin Purchase Limit Verification</h4> + class="col-xs-12"> + <h4><span data-lift="Loc.purchase_verification_title"></span></h4> <div data-lift="UserVerifyPassword" class="well"> <table> <tbody> <tr> - <td class="padding-20-right">ID: </td> + <td class="padding-20-right"><span data-lift="Loc.ID"></span>: </td> <td class="break-word">{{ model.userId }}</td> </tr> <tr> - <td class="padding-20-right">Password: </td> + <td class="padding-20-right"><span data-lift="Loc.Password"></span>: </td> <td class="break-word">{{ model.password }}</td> </tr> </tbody> </table> <div class="note padding-top-20"> - To take advantage of your {{ model.limit }} bitcoin purchase limit, - use these credentials to authenticate with the store manager or an authorized employee. - This is a one-time password only. + <span data-lift="Loc.purchase_limit_note"></span> </div> </div> </div> diff --git a/src/main/webapp/settings/admin/resources-hidden/_resources_verify.html b/src/main/webapp/settings/admin/resources-hidden/_resources_verify.html @@ -0,0 +1,17 @@ +<resources> + <res name="verify_subtitle_fail">Sorry %s, you did not pass our identity verification process.</res> + <res name="verify_subtitle_success">Congratulations %s, you've been successfully verified!</res> + <res name="verify_body_fail">%s %s -- Your bitcoin buy limit remains at %s</res> + <res name="new_purchase_limit">Your new bitcoin purchase limit is %s</res> + <res name="setting_url_text">settings page of your PYC account</res> + + <res name="verify_body_success_part1"> + To purchase large amounts of bitcoin from a store BTM, you will need to authenticate with the + machine using a one-time password available in the + </res> + <res name="verify_body_success_part2"> + Note, this password is not related to the bitcoin you possess; it's only a way to + prove you can purchase up to %s. We apologize for the strict regulations and + thank you for your interest in buying bitcoin. + </res> +</resources> +\ No newline at end of file diff --git a/src/main/webapp/settings/admin/verify.html b/src/main/webapp/settings/admin/verify.html @@ -1,17 +1,7 @@ <div data-lift="surround?with=settings-wrap&at=content"> - <div data-lift="VerifyId" ng-controller="VerifyIdCtrl" class="row margin-top-10" ng-cloak> - <div class="col-xs-12 col-sm-5"> - <div class="well"> - <ul class="list-unstyled"> - <li ng-repeat="user in model.users"> - <a ng-click="setCurrentUser(user, $index)" href="#"> - {{user.fname}} {{user.lname}} - </a> - </li> - </ul> - </div> - </div> - <div class="col-xs-12 col-sm-7"> + <div data-lift="VerifyId" ng-controller="VerifyIdCtrl" class="row" ng-cloak> + + <div class="col-xs-12"> <h2>{{currentUser.fname}} {{currentUser.lname}}</h2> <h5>{{currentUser.status}}</h5> @@ -40,5 +30,18 @@ <textarea ng-model="response.reason" class="form-control" rows="3"></textarea> </div> </div> + + <div class="col-xs-12 margin-top-20"> + <div class="well"> + <ul class="list-unstyled"> + <li ng-repeat="user in model.users"> + <a ng-click="setCurrentUser(user, $index)" href="#"> + {{user.fname}} {{user.lname}} + </a> + </li> + </ul> + </div> + </div> + </div> </div> \ No newline at end of file diff --git a/src/main/webapp/settings/password.html b/src/main/webapp/settings/password.html @@ -1,14 +1,12 @@ <div data-lift="surround?with=settings-wrap&at=content"> <div class="row margin-top-10"> - <div class="col-xs-12 col-sm-9 col-md-7 col-sm-offset-1 col-md-offset-0"> + <div class="col-xs-12"> <div class="well"> <span data-lift="embed?what=/templates-hidden/parts/change-password-form"></span> </div> </div> - <div class="col-xs-12 col-sm-9 col-md-5 col-sm-offset-1 col-md-offset-0"> - <p class="lead"> - A strong password is needed to keep your information safe and secure. - </p> + <div class="col-xs-12 welcome"> + <span data-lift="Loc.welcome"></span> </div> </div> </div> diff --git a/src/main/webapp/settings/purchase_limit.html b/src/main/webapp/settings/purchase_limit.html @@ -1,58 +1,55 @@ <div data-lift="surround?with=settings-wrap&at=content"> -<div class="row"> - <div class="col-xs-12"> - <div class="jumbotron text-center padding-bottom-0"> +<div class="row"> + <div data-lift="PurchaseLimit" ng-controller="PurchaseLimitCtrl" ng-cloak class="col-xs-12"> + <div class="jumbotron text-center padding-0"> <div class="well well-lg bg-primary-light text-primary"> - <h1>Limit is <span data-lift="CurrentUser.limit"></span></h1> + <h1><span data-lift="Loc.purchase_limit_is"></span> {{ purchaseLimit }}</h1> </div> </div> </div> - <div data-lift="VerificationSteps" class="col-xs-12" ng-controller="PurchaseLimitCtrl"> + <div data-lift="VerificationSteps" class="col-xs-12 margin-bottom-20"> <wizard id="wizard-purchase-limit" on-finish="finishedWizard()" ng-cloak> - <wz-step title="$500"> + <wz-step title="$1,000"> <div class="jumbotron text-center"> <button type="submit" wz-next class="btn btn-primary btn-lg"> - Verify To Raise The Limit + <span data-lift="Loc.verify_btn_start"></span> </button> </div> </wz-step> - <wz-step title="$1,000"> + <wz-step title="$3,000"> <div class="text-center padding-20"> - <h1>$1,000: Verify Zip Code and Phone Number</h1> + <h1><span data-lift="Loc.verify_title_3000"></span></h1> </div> <div class="row"> - <div class="col-xs-12 col-sm-8 col-sm-offset-2 col-lg-6 col-lg-offset-3"> + <div class="col-xs-12"> <span data-lift="embed?what=/templates-hidden/parts/phone-verification-form"></span> </div> </div> </wz-step> - <wz-step title="$3,000"> + <wz-step title="$10,000"> <div class="text-center padding-10"> - <h1>$3,000: Verify Identity</h1> + <h1><span data-lift="Loc.verify_title_10000"></span></h1> </div> <div class="row"> - <div class="col-xs-12 col-sm-8 col-sm-offset-2"> + <div class="col-xs-12"> <span data-lift="embed?what=/templates-hidden/parts/id-verification-form"></span> </div> </div> </wz-step> - <wz-step title="$10,000"> + <wz-step title="Verified"> <div class="row"> <div class="col-xs-12"> <div class="jumbotron text-center"> - <p>For Unlimited Spending, you must complete at least 1 purchase of $100 minimum. <br><small>Then click the button below to verify with a Fraud Prevention Program.</small></p> - <button type="submit" wz-next class="btn btn-primary margin-top-20" ng-disabled="!thirdPartyVerified" disabler ng-model="loading"> - Fraud Prevention Verification - </button> + <p></p> </div> </div> </div> diff --git a/src/main/webapp/settings/resources-hidden/_resources_password.html b/src/main/webapp/settings/resources-hidden/_resources_password.html @@ -0,0 +1,22 @@ +<resources> + <res name="new_password">New Password</res> + <res name="new_password_tip">Enter your new password</res> + <res name="invalid_new_password">At least 8 alphanumeric characters are required</res> + <res name="confirm_password">Confirm Password</res> + <res name="confirm_password_tip">Enter your new password again to confirm</res> + <res name="invalid_confirm_password">Passwords do not match</res> + <res name="Change_Password">Change Password</res> + <res name="password_updated">Password has been updated.</res> + <res name="password_req">Password must have</res> + <res name="password_whitespace">no white spaces</res> + <res name="password_atleast8">at least 8 characters</res> + <res name="password_nonalpha">at least one non-alpha character</res> + + + + <res name="welcome"> + <p> + A strong password is needed to keep your information safe and secure. + </p> + </res> +</resources> +\ No newline at end of file diff --git a/src/main/webapp/settings/resources-hidden/_resources_purchase_limit.html b/src/main/webapp/settings/resources-hidden/_resources_purchase_limit.html @@ -0,0 +1,18 @@ +<resources> + <res name="purchase_limit_is">Limit is</res> + <res name="verify_btn_start">Verify To Raise The Limit</res> + <res name="verify_title_3000">$3,000: Verify Phone Number</res> + <res name="verify_title_10000">$10,000: Verify Identity</res> + <res name="verify_photo_id">Government Issued Photo ID</res> + <res name="browse_tip">Click browse and upload your identification document.</res> + <res name="verify_photo_id_req">Only JPEG, PNG and PDF are allowed to be uploaded.</res> + <res name="verify_photo_id_type">Identification should be either</res> + <res name="driver_license">Driver's License</res> + <res name="passport">Passport</res> + <res name="verify_my_identity">Verify My Identity</res> + <res name="sms_code_msg">Hi %s, enter %s to verify your PYC account. This is a 1-time message.</res> + <res name="sms_verify_fail">The private code is incorrect. Try again</res> + <res name="file_upload_fail">File could not be uploaded. Please try again.</res> + <res name="file_received">We have received your application</res> + <res name="file_review">We will notify you as soon as we are done reviewing your information</res> +</resources> +\ No newline at end of file diff --git a/src/main/webapp/settings/view/purchase_limits.html b/src/main/webapp/settings/view/purchase_limits.html @@ -5,10 +5,10 @@ <table class="table break-word"> <thead> <tr> - <td>Name</td> - <td>Id</td> - <td>Password</td> - <td>Limit</td> + <td><span data-lift="Loc.name"></span></td> + <td><span data-lift="Loc.ID"></span></td> + <td><span data-lift="Loc.password"></span></td> + <td><span data-lift="Loc.limit"></span></td> </tr> </thead> <tbody> diff --git a/src/main/webapp/templates-hidden/base-default.html b/src/main/webapp/templates-hidden/base-default.html @@ -5,7 +5,7 @@ <div class="main-content"> <div class="page-header"> <h1> - <span data-lift="Menu.title"></span> + <span data-lift="LocaleTitle"></span> <div style="display:none; float:right;" id="ajax-spinner"> <i class="fa fa-spinner fa-spin"></i> </div> diff --git a/src/main/webapp/templates-hidden/base-wrap.html b/src/main/webapp/templates-hidden/base-wrap.html @@ -7,7 +7,7 @@ <meta name="author" content="PYC"> <meta name="Copyright" content="Copyright PYC Inc 2014. All Rights Reserved."> <meta name="fragment" content="!" /> -<title data-lift="Menu.title">PYC: %*%</title> +<title data-lift="LocaleTitle"></title> <link data-lift="Assets.css" rel="stylesheet"> diff --git a/src/main/webapp/templates-hidden/no-base-default.html b/src/main/webapp/templates-hidden/no-base-default.html @@ -4,7 +4,7 @@ <div class="main-content"> <div class="page-header"> <h1> - <span data-lift="Menu.title"></span> + <span data-lift="LocaleTitle"></span> <div style="display:none; float:right;" id="ajax-spinner"> <i class="fa fa-spinner fa-spin"></i> </div> diff --git a/src/main/webapp/templates-hidden/parts/apply-btm-form.html b/src/main/webapp/templates-hidden/parts/apply-btm-form.html @@ -4,18 +4,18 @@ <section> <label class="input" ng-class="{{ stateSuccessError('name') }}"> <i class="icon-append fa fa-briefcase"></i> - <input name="name" ng-model="model.name" placeholder="Business Name" type="text" required> - <b class="tooltip tooltip-top-left">Please provide your unique business name.</b> + <input name="name" ng-model="model.name" data-lift="Placeholder?name=business_name" type="text" required> + <b class="tooltip tooltip-top-left"><span data-lift="Loc.business_name_tip"></span>.</b> </label> </section> <section> <label class="input" ng-class="{{ stateSuccessError('email') }}"> <i class="icon-append fa fa-envelope-o"></i> - <input name="email" ng-model="model.email" placeholder="E-Mail" type="email" required> - <b class="tooltip tooltip-top-left">Please provide your business email for further information.</b> + <input name="email" ng-model="model.email" data-lift="Placeholder?name=Email" type="email" required> + <b class="tooltip tooltip-top-left"><span data-lift="Loc.business_email_tip"></span>.</b> <span ng-show="form.email.$invalid && form.email.$dirty" class="text-danger small"> - Invalid email address + <span data-lift="Loc.invalid_email"></span> </span> </label> </section> @@ -24,32 +24,32 @@ <label class="input" ng-class="{{ stateSuccessError('phone') }}"> <i class="icon-append fa fa-phone"></i> <input name="phone" ng-model="model.phone" ui-mask="(999) 999-9999" placeholder="(xxx) xxx-xxxx" type="text" required> - <b class="tooltip tooltip-top-left">Please provide phone number for this contact.</b> + <b class="tooltip tooltip-top-left"><span data-lift="Loc.phone_tip"></span>.</b> <span ng-show="form.phone.$invalid && form.phone.$dirty" class="text-danger small"> - Incomplete phone number + <span data-lift="Loc.invalid_phone"></span> </span> </label> </section> <section> <label class="input" ng-class="{{ stateSuccessError('address') }}"> - <input name="address" ng-model="model.address" placeholder="Address" type="text" required> - <b class="tooltip tooltip-top-left">Please provide the address of your business.</b> + <input name="address" ng-model="model.address" data-lift="Placeholder?name=address" type="text" required> + <b class="tooltip tooltip-top-left"><span data-lift="Loc.business_address_tip"></span>.</b> </label> </section> <div class="row"> <section class="col col-6"> <label class="input" ng-class="{{ stateSuccessError('city') }}"> - <input name="city" ng-model="model.city" placeholder="City" type="text" required> - <b class="tooltip tooltip-top-left">The city your business is located.</b> + <input name="city" ng-model="model.city" data-lift="Placeholder?name=city" type="text" required> + <b class="tooltip tooltip-top-left"><span data-lift="Loc.business_city_tip"></span>.</b> </label> </section> <section class="col col-6" ng-class="{{ stateSuccessError('state') }}"> <label data-lift="Selector.states" class="select"> <select name="state" ng-model="model.state" required></select> <i></i> - <b class="tooltip tooltip-top-left">The state your business is located.</b> + <b class="tooltip tooltip-top-left"><span data-lift="Loc.business_state_tip"></span>.</b> </label> </section> </div> @@ -57,10 +57,10 @@ <section> <label class="input" ng-class="{{ stateSuccessError('website') }}"> <i class="icon-append fa fa-globe"></i> - <input name="website" ng-model="model.website" placeholder="Website URL" type="text" ng-pattern="url_regex"> - <b class="tooltip tooltip-top-left">The website URL of your business.</b> + <input name="website" ng-model="model.website" data-lift="Placeholder?name=website_url" type="text" ng-pattern="url_regex"> + <b class="tooltip tooltip-top-left"><span data-lift="Loc.business_website_tip"></span>.</b> <span ng-show="form.website.$error.pattern" class="text-danger small"> - Invalid website url + <span data-lift="Loc.invalid_website"></span> </span> </label> </section> @@ -69,10 +69,10 @@ <label class="textarea" ng-class="{{ stateSuccess('bestTime') }}"> <i class="icon-append fa fa-comment"></i> <textarea name="bestTime" ng-model="model.bestTime" - placeholder="When is the best time to contact you?" rows="2"></textarea> - <b class="tooltip tooltip-top-left">Enter time of day and/or week you would like to be contacted.</b> + data-lift="Placeholder?name=best_time" rows="2"></textarea> + <b class="tooltip tooltip-top-left"><span data-lift="Loc.business_bestTime_tip"></span>.</b> </label> - <em>Example: Saturday, 11am. Prefer phone call.</em> + <em><span data-lift="Loc.business_bestTime_example"></span>.</em> </section> </fieldset> @@ -82,7 +82,7 @@ <span data-lift="embed?what=/templates-hidden/parts/alert"></span> </div> - <button type="submit" class="btn btn-primary" ng-disabled="form.$invalid" disabler ng-model="loading">Apply for A BTM</button> + <button type="submit" class="btn btn-primary" ng-disabled="form.$invalid" disabler ng-model="loading"><span data-lift="Loc.apply_btm"></span></button> </footer> </form> </div> \ No newline at end of file diff --git a/src/main/webapp/templates-hidden/parts/btm-map.html b/src/main/webapp/templates-hidden/parts/btm-map.html @@ -31,7 +31,7 @@ <div class="map-panel" ng-cloak> - <div class="well preview-box" ng-hide="!currentMarker || nonfound"> + <div class="well preview-box" ng-hide="!mapLoaded || nonfound"> <div class="row"> <div class="col-xs-4 col-md-12 col-lg-4"> @@ -58,13 +58,13 @@ </tr> </tbody> </table> - <div class="note margin-top-10">Only showing local time.</div> + <div class="note margin-top-10"><span data-lift="Loc.Showing_Local"></span>.</div> </div> </div> </div> - <div class="well search-box"> + <div class="well search-box" ng-hide="!mapLoaded || nonfound"> <form name="form" ng-submit="search()" novalidate ng-cloak> <div class="input-group"> @@ -81,7 +81,7 @@ <div class="input-group-btn"> <button class="btn btn-default btn-primary" type="submit" ng-disabled="form.$invalid" disabler ng-model="loading"> - <i class="fa fa-search"></i> Search BTM + <i class="fa fa-search"></i> <span data-lift="Loc.Search_BTM"></span> </button> </div> </div> diff --git a/src/main/webapp/templates-hidden/parts/change-password-form.html b/src/main/webapp/templates-hidden/parts/change-password-form.html @@ -2,24 +2,24 @@ <form name="form" class="smart-form client-form" ng-submit="save()" novalidate> <fieldset> <section> - <label>New Password</label> + <label><span data-lift="Loc.new_password"></span></label> <label class="input" ng-class="{{ stateSuccessError('password') }}"> <i class="icon-append fa fa-key"></i> <input name="password" ng-model="model.password" type="password" ng-pattern="password_regex" required> - <b class="tooltip tooltip-top-left">Enter your new password.</b> + <b class="tooltip tooltip-top-left"><span data-lift="Loc.new_password_tip"></span>.</b> <span ng-show="form.password.$error.pattern" class="text-danger small"> - At least 8 alphanumeric characters are required + <span data-lift="Loc.invalid_new_password"></span> </span> </label> </section> <section> - <label>Confirm Password</label> + <label><span data-lift="Loc.confirm_password"></span></label> <label class="input" ng-class="{{ stateSuccessError('passwordconfirm') }}"> <i class="icon-append fa fa-key"></i> <input name="passwordconfirm" ng-model="model.passwordconfirm" type="password" data-match="model.password" required> - <b class="tooltip tooltip-top-left">Enter your new password again to confirm.</b> + <b class="tooltip tooltip-top-left"><span data-lift="Loc.confirm_password_tip"></span>.</b> <span ng-show="model.password != model.passwordconfirm" class="text-danger small"> - Passwords do not match + <span data-lift="Loc.invalid_confirm_password"></span> </span> </label> </section> @@ -30,7 +30,7 @@ <span data-lift="embed?what=/templates-hidden/parts/alert"></span> </div> - <button type="submit" class="btn btn-primary" ng-disabled="form.$invalid" disabler ng-model="loading">Change Password</button> + <button type="submit" class="btn btn-primary" ng-disabled="form.$invalid" disabler ng-model="loading"><span data-lift="Loc.Change_Password"></span></button> </footer> </form> </div> \ No newline at end of file diff --git a/src/main/webapp/templates-hidden/parts/contact-form.html b/src/main/webapp/templates-hidden/parts/contact-form.html @@ -4,18 +4,18 @@ <section> <label class="input" ng-class="{{ stateSuccessError('name') }}"> <i class="icon-append fa fa-user"></i> - <input name="name" ng-model="model.name" placeholder="Name" type="text" required> - <b class="tooltip tooltip-top-left">Please provide your name.</b> + <input name="name" ng-model="model.name" data-lift="Placeholder?name=name" type="text" required> + <b class="tooltip tooltip-top-left"><span data-lift="Loc.name_tip"></span>.</b> </label> </section> <section> <label class="input" ng-class="{{ stateSuccessError('email') }}"> <i class="icon-append fa fa-envelope-o"></i> - <input name="email" ng-model="model.email" placeholder="E-Mail" type="email" required> - <b class="tooltip tooltip-top-left">Please provide your business email for further information.</b> + <input name="email" ng-model="model.email" data-lift="Placeholder?name=Email" type="email" required> + <b class="tooltip tooltip-top-left"><span data-lift="Loc.email_tip"></span>.</b> <span ng-show="form.email.$invalid && form.email.$dirty" class="text-danger small"> - Invalid email address + <span data-lift="Loc.invalid_email"></span> </span> </label> </section> @@ -24,9 +24,9 @@ <label class="input" ng-class="{{ stateSuccessError('phone') }}"> <i class="icon-append fa fa-phone"></i> <input name="phone" ng-model="model.phone" ui-mask="(999) 999-9999" placeholder="(xxx) xxx-xxxx" type="text" required> - <b class="tooltip tooltip-top-left">Please provide phone number for this contact.</b> + <b class="tooltip tooltip-top-left"><span data-lift="Loc.phone_tip"></span>.</b> <span ng-show="form.phone.$invalid && form.phone.$dirty" class="text-danger small"> - Incomplete phone number + <span data-lift="Loc.invalid_phone"></span> </span> </label> </section> @@ -34,12 +34,12 @@ <section ng-class="{{ stateSuccess('reason') }}"> <label class="select"> <select name="reason" ng-model="model.reason"> - <option value="General Question">General Question</option> + <option value="General Question">General Question</span></option> <option value="Press Inquiry">Press Inquiry</option> <option value="Interested in hosting a BTM">Interested in hosting a BTM</option> </select> <i></i> - <b class="tooltip tooltip-top-left">Reason you're contacting us today.</b> + <b class="tooltip tooltip-top-left"><span data-lift="Loc.contact_reason_tip"></span>.</b> </label> </section> @@ -47,7 +47,7 @@ <label class="textarea" ng-class="{{ stateSuccess('msg') }}"> <i class="icon-append fa fa-comment"></i> <textarea name="msg" ng-model="model.msg" rows="6"></textarea> - <b class="tooltip tooltip-top-left">What's on your mind?</b> + <b class="tooltip tooltip-top-left"><span data-lift="Loc.contact_message_tip"></span></b> </label> </section> @@ -58,7 +58,7 @@ <span data-lift="embed?what=/templates-hidden/parts/alert"></span> </div> - <button type="submit" class="btn btn-primary" ng-disabled="form.$invalid" disabler ng-model="loading">Send Message</button> + <button type="submit" class="btn btn-primary" ng-disabled="form.$invalid" disabler ng-model="loading"><span data-lift="Loc.Send_Message"></span></button> </footer> </form> </div> \ No newline at end of file diff --git a/src/main/webapp/templates-hidden/parts/footer.html b/src/main/webapp/templates-hidden/parts/footer.html @@ -1,4 +1,4 @@ -<footer class="text-center padding-20"> +<footer class="text-center padding-20" ng-cloak> <div class="container"> <ul class="list-inline" data-lift="Menus.group?group=footer"></ul> <span>&copy; 2014 PYC, Inc.</span> diff --git a/src/main/webapp/templates-hidden/parts/forgot-password-form.html b/src/main/webapp/templates-hidden/parts/forgot-password-form.html @@ -2,11 +2,11 @@ <form name="form" class="smart-form client-form" ng-submit="save()" novalidate> <fieldset> <section> - <label>E-mail</label> + <label><span data-lift="Loc.Email"></span></label> <label class="input"> <i class="icon-append fa fa-envelope-o"></i> <input name="email" ng-model="model.email" type="email" required> - <b class="tooltip tooltip-top-left">Enter your email address.</b> + <b class="tooltip tooltip-top-left"><span data-lift="Loc.email_tip"></span>.</b> </label> </section> </fieldset> @@ -16,7 +16,7 @@ <span data-lift="embed?what=/templates-hidden/parts/alert"></span> </div> - <button type="submit" class="btn btn-primary" ng-disabled="form.$invalid" disabler ng-model="loading">Reset Password</button> + <button type="submit" class="btn btn-primary" ng-disabled="form.$invalid" disabler ng-model="loading"><span data-lift="Loc.Reset_Password"></span></button> </footer> </form> </div> \ No newline at end of file diff --git a/src/main/webapp/templates-hidden/parts/id-verification-form.html b/src/main/webapp/templates-hidden/parts/id-verification-form.html @@ -2,21 +2,21 @@ <form name="form" class="smart-form client-form" ng-submit="save()" ng-upload="complete(content)" novalidate> <fieldset> <section> - <label>Government Issued Photo ID</label> + <label><span data-lift="Loc.verify_photo_id"></span></label> <label class="input input-file" ng-class="{{ stateSuccessError('idfile') }}"> <div class="button"> <input name="idfile" type="file" ng-file-select required> - Browse + <span data-lift="Loc.browse"></span> </div> <input type="text" readonly=""></input> - <b class="tooltip tooltip-top-left">Click browse and upload your identification document.</b> + <b class="tooltip tooltip-top-left"><span data-lift="Loc.browse_tip"></span></b> <small class="help-block"> - Only JPEG, PNG and PDF are allowed to be uploaded. + <span data-lift="Loc.verify_photo_id_req"></span> <br/><br/> - Identification should be either: + <span data-lift="Loc.verify_photo_id_type"></span>: <ul class="list-unstyled"> - <li>- Driver's License</li> - <li>- Passport</li> + <li>- <span data-lift="Loc.driver_license"></span></li> + <li>- <span data-lift="Loc.passport"></span></li> </ul> </small> </label> @@ -41,7 +41,7 @@ <span data-lift="embed?what=/templates-hidden/parts/alert"></span> </div> - <button type="submit" class="btn btn-primary" ng-disabled="form.$invalid || filesRequired()" disabler ng-model="loading">Verify My Identity</button> + <button type="submit" class="btn btn-primary" ng-disabled="form.$invalid || filesRequired()" disabler ng-model="loading"><span data-lift="Loc.verify_my_identity"></span></button> </footer> </form> </div> \ No newline at end of file diff --git a/src/main/webapp/templates-hidden/parts/phone-verification-form.html b/src/main/webapp/templates-hidden/parts/phone-verification-form.html @@ -1,31 +1,21 @@ <div data-lift="PhoneVerification" ng-controller="PhoneVerificationCtrl" ng-cloak> <form name="form" class="smart-form client-form padding-20-sides" novalidate> <fieldset> - <section> - <label>Zip Code</label> - <label class="input" ng-class="{{ stateSuccessError('postal') }}"> - <i ng-show="postal_loading" class="icon-append fa fa-spinner fa-spin"></i> - <input name="postal" ng-model="model.postal" ui-mask="99999" placeholder="xxxxx" type="text" ng-blur="updatePostal()" required> - <span ng-show="form.postal.$invalid && form.postal.$dirty" class="text-danger small"> - Invalid postal code - </span> - </label> - </section> - <section ng-show="form.postal.$valid"> - <label>Phone Number <small>with text messaging</small></label> + <section> + <label><span data-lift="Loc.phone_number"></span> <small><span data-lift="Loc.with_text_messaging"></span></small></label> <label class="input" ng-class="{{ stateSuccessError('phone') }}"> <i class="icon-append fa fa-phone"></i> <input name="phone" ng-model="model.phone" ui-mask="(999) 999-9999" placeholder="(xxx) xxx-xxxx" type="text" required> <span ng-show="form.phone.$invalid && form.phone.$dirty" class="text-danger small"> - Invalid phone number + <span data-lift="Loc.invalid_phone_number"></span> </span> </label> </section> <section ng-show="sentsms"> <label class="input" ng-class="{{ stateSuccessError('smscode') }}"> - <label>SMS Code</label> + <label><span data-lift="Loc.sms_code"></span></label> <input name="smscode" ng-model="model.smscode" ui-mask="999-999" placeholder="xxx-xxx" type="text" required> </label> </section> @@ -36,8 +26,8 @@ <span data-lift="embed?what=/templates-hidden/parts/alert"></span> </div> - <button ng-show="form.postal.$valid && !sentsms" ng-disabled="form.phone.$invalid" ng-click="sendsms()" class="btn btn-primary" disabler ng-model="loading">Send SMS Code</button> - <button ng-show="sentsms" ng-disabled="form.smscode.$invalid" ng-click="verifyphone()" class="btn btn-primary" disabler ng-model="loading">Verify Number</button> + <button ng-show="!sentsms" ng-disabled="form.phone.$invalid" ng-click="sendsms()" class="btn btn-primary" disabler ng-model="loading"><span data-lift="Loc.send_sms_code"></span></button> + <button ng-show="sentsms" ng-disabled="form.smscode.$invalid" ng-click="verifyphone()" class="btn btn-primary" disabler ng-model="loading"><span data-lift="Loc.verify_number"></span></button> </footer> </form> </div> \ No newline at end of file diff --git a/src/main/webapp/templates-hidden/parts/user-login-form.html b/src/main/webapp/templates-hidden/parts/user-login-form.html @@ -2,7 +2,7 @@ <form name="form" class="smart-form client-form" ng-submit="save()" novalidate> <fieldset> <section> - <label>E-mail</label> + <label><span data-lift="Loc.Email"></span></label> <label class="input"> <i class="icon-append fa fa-envelope-o"></i> <input name="email" ng-model="model.email" type="email" required> @@ -10,13 +10,13 @@ </section> <section> - <label>Password</label> + <label><span data-lift="Loc.Password"></span></label> <label class="input"> <i class="icon-append fa fa-key"></i> <input name="password" ng-model="model.password" type="password" required> </label> <div class="note"> - <a href="forgot-password">Forgot Password?</a> + <a data-lift="Menu.item?name=Password Recovery" href="#"><span data-lift="Loc.Forgot_Password"></span>?</a> </div> </section> @@ -24,7 +24,7 @@ <label class="checkbox"> <input name="remember" ng-model="model.remember" type="checkbox"></input> <i></i> - Stay signed in + <span data-lift="Loc.Stay_Signed_In"> </label> </section> </fieldset> @@ -34,7 +34,7 @@ <span data-lift="embed?what=/templates-hidden/parts/alert"></span> </div> - <button type="submit" class="btn btn-primary" ng-disabled="form.$invalid" disabler ng-model="loading"><i class="fa fa-lock fa-fw"></i>Log In</button> + <button type="submit" class="btn btn-primary" ng-disabled="form.$invalid" disabler ng-model="loading"><i class="fa fa-lock fa-fw"></i><span data-lift="Loc.Log_In"></button> </footer> </form> </div> \ No newline at end of file diff --git a/src/main/webapp/templates-hidden/parts/user-registration-form.html b/src/main/webapp/templates-hidden/parts/user-registration-form.html @@ -4,14 +4,14 @@ <div class="row"> <section class="col col-6"> <label class="input" ng-class="{{ stateSuccessError('fname') }}"> - <input name="fname" ng-model="model.fname" placeholder="First name" type="text" autofocus required> - <b class="tooltip tooltip-top-left">Please provide your first name.</b> + <input name="fname" ng-model="model.fname" data-lift="Placeholder?name=fname" type="text" autofocus required> + <b class="tooltip tooltip-top-left"><span data-lift="Loc.fname_tip"></span>.</b> </label> </section> <section class="col col-6"> <label class="input" ng-class="{{ stateSuccessError('lname') }}"> - <input name="lname" ng-model="model.lname" placeholder="Last name" type="text" required> - <b class="tooltip tooltip-top-left">Please provide your last name.</b> + <input name="lname" ng-model="model.lname" data-lift="Placeholder?name=lname" type="text" required> + <b class="tooltip tooltip-top-left"><span data-lift="Loc.lname_tip"></span>.</b> </label> </section> </div> @@ -19,10 +19,10 @@ <section> <label class="input" ng-class="{{ stateSuccessError('email') }}"> <i class="icon-append fa fa-envelope-o"></i> - <input name="email" ng-model="model.email" placeholder="E-Mail" type="email" required> - <b class="tooltip tooltip-top-left">You'll use this email when you log in and if you ever need to reset your password.</b> + <input name="email" ng-model="model.email" data-lift="Placeholder?name=Email" type="email" required> + <b class="tooltip tooltip-top-left"><span data-lift="Loc.email_register_tip"></span>.</b> <span ng-show="form.email.$invalid && form.email.$dirty" class="text-danger small"> - Invalid email address + <span data-lift="Loc.invalid_email"></span> </span> </label> </section> @@ -30,8 +30,8 @@ <section> <label class="input" ng-class="{{ stateSuccessError('username') }}"> <i class="icon-append fa fa-user"></i> - <input name="username" ng-model="model.username" placeholder="Username" type="text" required> - <b class="tooltip tooltip-top-left">You'll use this username to personally identify your account.</b> + <input name="username" ng-model="model.username" data-lift="Placeholder?name=username" type="text" required> + <b class="tooltip tooltip-top-left"><span data-lift="Loc.username_register_tip"></span>.</b> </label> </section> </fieldset> @@ -41,7 +41,7 @@ <span data-lift="embed?what=/templates-hidden/parts/alert"></span> </div> - <button type="submit" class="btn btn-primary" ng-disabled="form.$invalid" disabler ng-model="loading"><i class="fa fa-lock fa-fw"></i>Register</button> + <button type="submit" class="btn btn-primary" ng-disabled="form.$invalid" disabler ng-model="loading"><i class="fa fa-lock fa-fw"></i><span data-lift="Loc.Register"></span></button> </footer> </form> </div> \ No newline at end of file diff --git a/src/main/webapp/templates-hidden/parts/user-settings-email-form.html b/src/main/webapp/templates-hidden/parts/user-settings-email-form.html @@ -2,12 +2,12 @@ <form name="form" class="smart-form client-form" ng-submit="save()" novalidate> <fieldset> <section> - <label>Email Address</label> + <label><span data-lift="Loc.Email_Address"></span></label> <label class="input" ng-class="{{ stateSuccessError('email') }}"> <i class="icon-append fa fa-envelope-o"></i> <input name="email" ng-model="model.email" type="email"> <span ng-show="form.email.$invalid" class="text-danger small"> - Invalid email address + <span data-lift="Loc.invalid_email"></span> </span> </label> </section> @@ -18,7 +18,7 @@ <span data-lift="embed?what=/templates-hidden/parts/alert"></span> </div> - <button type="submit" class="btn btn-primary" ng-disabled="form.$invalid || form.$pristine" disabler ng-model="loading">Change Email Address</button> + <button type="submit" class="btn btn-primary" ng-disabled="form.$invalid || form.$pristine" disabler ng-model="loading"><span data-lift="Loc.Change_Email_Address"></span></button> </footer> </form> </div> \ No newline at end of file diff --git a/src/main/webapp/templates-hidden/parts/user-settings-form.html b/src/main/webapp/templates-hidden/parts/user-settings-form.html @@ -2,7 +2,7 @@ <form name="form" class="smart-form client-form" novalidate> <fieldset> <section> - <label>First Name</label> + <label><span data-lift="Loc.fname"></span></label> <label class="input" ng-class="{{ stateSuccessError('fname') }}"> <i ng-show="fname_loading" class="icon-append fa fa-spinner fa-spin"></i> <input name="fname" ng-model="model.fname" type="text" ng-blur="updateUserSettings('fname')" ng-maxlength="30"> @@ -10,7 +10,7 @@ </section> <section> - <label>Last Name</label> + <label><span data-lift="Loc.lname"></span></label> <label class="input" ng-class="{{ stateSuccessError('lname') }}"> <i ng-show="lname_loading" class="icon-append fa fa-spinner fa-spin"></i> <input name="lname" ng-model="model.lname" type="text" ng-blur="updateUserSettings('lname')" ng-maxlength="30"> @@ -18,7 +18,7 @@ </section> <section> - <label>Username</label> + <label><span data-lift="Loc.username"></span></label> <label class="input" ng-class="{{ stateSuccessError('username') }}"> <i ng-show="username_loading" class="icon-append fa fa-spinner fa-spin"></i> <i ng-hide="username_loading" class="icon-append fa fa-user"></i> diff --git a/src/main/webapp/templates-hidden/settings-wrap.html b/src/main/webapp/templates-hidden/settings-wrap.html @@ -1,4 +1,5 @@ <div data-lift="surround?with=base-wrap;at=content"> +<div class="container"> <div class="row"> <div class="col-xs-10 col-xs-offset-1"> <div class="main-content"> @@ -10,15 +11,16 @@ </div> </div> <div class="row"> - <div class="col-xs-12 col-sm-3 col-lg-2"> + <div class="col-xs-12 col-sm-4"> <ul data-lift="Menus.group?group=settings" class="nav nav-pills nav-stacked nav-sidebar"></ul> </div> - <div class="col-xs-12 col-sm-9 col-lg-10 settings-main"> + <div class="col-xs-12 col-sm-8 settings-main"> <div id="content"></div> </div> </div> </div> </div> </div> +</div> </div> \ No newline at end of file