summaryrefslogtreecommitdiff
path: root/public
diff options
context:
space:
mode:
Diffstat (limited to 'public')
-rw-r--r--public/css/screen.css1
-rw-r--r--public/js/auth.js88
-rw-r--r--public/js/main.js65
-rw-r--r--public/js/nav.js99
-rw-r--r--public/js/party.js182
-rw-r--r--public/js/protocols_site.js919
-rw-r--r--public/js/user.js335
-rw-r--r--public/js/util.js137
-rw-r--r--public/js/vendor/base64.js (renamed from public/js/base64.js)0
-rw-r--r--public/js/vendor/jquery-1.4.4.min.js (renamed from public/js/jquery-1.4.4.min.js)0
-rw-r--r--public/protocols/index.html11
11 files changed, 915 insertions, 922 deletions
diff --git a/public/css/screen.css b/public/css/screen.css
index e403029..458078b 100644
--- a/public/css/screen.css
+++ b/public/css/screen.css
@@ -373,6 +373,7 @@ button:active {
#userViewContainer {
position: fixed; top: 160px; left: 320px;
width: 350px;
+ background-color: rgba(255,255,255,0.92);
float: left;
}
/* line 218, ../src/screen.sass */
diff --git a/public/js/auth.js b/public/js/auth.js
new file mode 100644
index 0000000..e16c2d2
--- /dev/null
+++ b/public/js/auth.js
@@ -0,0 +1,88 @@
+var Auth =
+ {
+ name: '',
+ userID: 1,
+ isHost: false,
+ loginPrompt: false,
+ hosts: {},
+ init: function () {
+ $.post(URL.auth.login, {}, Auth.loginCallback)
+ },
+ unload: function () {
+ if (Auth.loginPrompt) {
+ Auth.loginPrompt = false
+ $('#login').fadeOut(1000, function(){ Main.load()} )
+ }
+ else {
+ Main.load()
+ }
+ },
+ load: function () {
+ $('#login').fadeIn(1000)
+ $('#login-email').focus()
+ $('#login-email').keydown(Main.kp)
+ $('#login-password').keydown(Main.kp)
+ $('#login-go').click( Auth.login )
+ Auth.loginPrompt = true
+ Main.saveFunction = Auth.login
+ Main.saving = false
+ },
+ login: function () {
+ if (Main.saving)
+ return
+ Main.saving = true
+ warn("attempting login")
+ var data = {
+ username: $('#login-email').val(),
+ password: $('#login-password').val(),
+ }
+ $('#login-password').val(''),
+ $.post(URL.auth.login, data, Auth.loginCallback)
+ },
+ loginCallback: function (json) {
+ Main.saving = false
+
+ if (! json || json.error) {
+ if (! Auth.loginPrompt)
+ Auth.load()
+ else
+ warn("bad login!")
+ return
+ }
+
+ // 0 id 1 name 2 firstname 3 email 4 access
+ var user = Auth.user = json.user
+
+ var name = user.name.split(' ')[0] || user.email.split('@')[0]
+ warn( "Logged in! Hello "+name )
+ Auth.userID = user.id
+ Auth.isHost = user.access == 2 ? true : false;
+ Auth.name = user.name
+ Auth.firstName = name
+
+ $('#profile-edit').html(Auth.firstName + "!")
+ $('#logout').click( Auth.logout )
+
+ var hostSelect = ""
+ Auth.hosts = {}
+ json.hosts.forEach(function(host){
+ if (host.id === Auth.userID)
+ hostSelect += "<option value='"+host.id+"' selected='1'>"+host.name+"</option>"
+ else
+ hostSelect += "<option value='"+host.id+"'>"+host.name+"</option>"
+ Auth.hosts[ host.id ] = host.name
+ })
+
+ $("#user-host").html(hostSelect)
+
+ Auth.unload()
+ },
+ logout: function ()
+ {
+ warn("logging out")
+ $('#login-email').val(''),
+ $.get(URL.auth.logout,{}, function(){
+ Main.unload()
+ })
+ },
+ };
diff --git a/public/js/main.js b/public/js/main.js
new file mode 100644
index 0000000..cabfab6
--- /dev/null
+++ b/public/js/main.js
@@ -0,0 +1,65 @@
+var Main =
+ {
+ saveFunction: false,
+ saving: false,
+ kp: function (e)
+ {
+ var evt = window.event ? window.event : e
+ var key = evt.keyCode ? evt.keyCode : e.which
+ if (key === 13)
+ Main.saveFunction()
+ },
+ init: function ()
+ {
+ warn("init site")
+ Auth.init()
+ },
+ unload: function ()
+ {
+ $('header').fadeOut(500)
+ $('section').fadeOut(500)
+ $('footer').fadeOut(500)
+ $('#bg').fadeIn(500)
+ Auth.init()
+ },
+ load: function ()
+ {
+ warn("loading site")
+ $('#bg').fadeOut(500)
+ $('header').show()
+ $('#welcome').fadeIn(500)
+ $('#nav_about').click( Nav.aboutClick )
+ $('#nav_users').click( Nav.usersClick )
+ $('#nav_patrons').click( Nav.patronsClick )
+ $('#nav_reunions').click( Nav.reunionClick )
+ if (Auth.isHost)
+ {
+ $('#nav_parties').show()
+ $('#nav_parties').click( Nav.partiesClick )
+ $('#user-add').click( Users.addClick )
+ $('#user-delete').click( Users.deleteClick )
+ $('#party-add').click( Party.addClick )
+ $('#party-edit').click( Party.editClick )
+ }
+ else
+ {
+ $('#nav_parties').hide()
+ $('#user-add').hide()
+ $('#user-delete').hide()
+ $('#party-add').hide()
+ $('#party-edit').hide()
+ }
+ $('#user-save').click( Users.editSave )
+ $('#user-name').keydown(Main.kp)
+ $('#user-email').keydown(Main.kp)
+ $('#user-password2').keydown(Main.kp)
+ $('#party-location').keydown(Main.kp)
+ $('#party-day').keydown(Main.kp)
+ $('#party-year').keydown(Main.kp)
+ $('#party-save').click( Party.editSave )
+ Nav.selectClass(Nav.navIDs, "nav_about")
+ $('#aboutMode').show()
+ warn("done!")
+ },
+ };
+Main.init();
diff --git a/public/js/nav.js b/public/js/nav.js
new file mode 100644
index 0000000..1dba482
--- /dev/null
+++ b/public/js/nav.js
@@ -0,0 +1,99 @@
+var Nav =
+ {
+ navIDs: {"nav_about":0,"nav_parties":0,"nav_users":0,"nav_patrons":0,"nav_reunions":0},
+ aboutClick: function()
+ {
+ this.blur()
+ $('#aboutMode').show()
+ $('#patronMode').hide()
+ $('#partiesMode').hide()
+ $('#reunionMode').hide()
+ Nav.selectClass(Nav.navIDs, "nav_about")
+ $(window).unbind("keydown")
+ },
+ partiesClick: function()
+ {
+ this.blur()
+ $('#aboutMode').hide()
+ $('#patronMode').hide()
+ $('#partiesMode').show()
+ $('#reunionMode').hide()
+ Nav.selectClass(Nav.navIDs, "nav_parties")
+ $('#userViewContainer').css("left", 520)
+ Party.list()
+ $(window).unbind("keydown")
+ },
+ usersClick: function()
+ {
+ this.blur()
+ $('#aboutMode').hide()
+ $('#patronMode').hide()
+ $('#partiesMode').show()
+ $('#reunionMode').hide()
+ $('#userListContainer').hide()
+ $('#partyListContainer').hide()
+ Nav.selectClass(Nav.navIDs, "nav_users")
+ $('#userViewContainer').css("left", 320)
+ Users.all()
+ $(window).unbind("keydown")
+ $(window).bind("keydown", Nav.keydown)
+ },
+ patronsClick: function()
+ {
+ this.blur()
+ $('#aboutMode').hide()
+ $('#partiesMode').hide()
+ $('#patronMode').show()
+ $('#reunionMode').hide()
+ Nav.selectClass(Nav.navIDs, "nav_patrons")
+ $(window).unbind("keydown")
+ },
+ reunionClick: function()
+ {
+ this.blur()
+ $('#aboutMode').hide()
+ $('#patronMode').hide()
+ $('#partiesMode').hide()
+ $('#reunionMode').show()
+ Nav.selectClass(Nav.navIDs, "nav_reunions")
+ $(window).unbind("keydown")
+ },
+ selectClass: function (ids, selected)
+ {
+ for (var id in ids)
+ {
+ $("#"+id).removeClass("selected")
+ }
+ if (selected)
+ $("#"+selected).addClass("selected")
+ },
+ keydown: function (e)
+ {
+ kc = event.keyCode
+ if (kc === 38) // up
+ {
+ // select previous name or last
+ newIdx = parseInt(Users.currentIdx) - 1
+ if (newIdx < 0)
+ {
+ newIdx = Users.allCount - 1
+ scrollToBottom("body")
+ }
+ Users.viewIdx(newIdx)
+ return false
+ }
+ if (kc === 40) // down
+ {
+ // select next name or first
+ newIdx = parseInt(Users.currentIdx) + 1
+ if (newIdx === Users.allCount)
+ {
+ newIdx = 0
+ scrollToTop("body")
+ }
+ Users.viewIdx(newIdx)
+ return false
+ }
+ return true
+ },
+ };
diff --git a/public/js/party.js b/public/js/party.js
new file mode 100644
index 0000000..b4984f9
--- /dev/null
+++ b/public/js/party.js
@@ -0,0 +1,182 @@
+var Party =
+ {
+ parties: {},
+ currentID: -1,
+ partyData: '',
+ liclick: function ()
+ {
+ Nav.selectClass(Party.parties, this.id)
+ var id = this.id.split("-")[1]
+ warn("viewing party "+id)
+ Party.view(id)
+ },
+ list: function()
+ {
+ $('#partyListContainer').fadeOut(200)
+ $('#partyEditContainer').hide()
+ $('#userListContainer').hide()
+ $('#userEditContainer').hide()
+ $('#userViewContainer').hide()
+ $.get(URL.party.list,{},Party.listCallback)
+ },
+ listCallback: function (parties)
+ {
+ warn("got party list")
+ var partyList = ""
+ if (Party.currentID != -1) {
+ var firstPartyID = Party.currentID
+ }
+ parties.forEach(function(party){
+ if (! firstPartyID) {
+ firstPartyID = party.id
+ }
+ partyList += "<li id='party-"+party.id+"'>"+party.date+"</li>"
+ Party.parties["party-"+party.id] = party
+ })
+
+ $('#partyList').html(partyList)
+ $('#partyListContainer').fadeIn(200)
+ for (id in Party.parties) {
+ $('#'+id).click(Party.liclick).data('party', Party.parties[id])
+ }
+ Nav.selectClass(Party.parties, "party-"+firstPartyID)
+ if (firstPartyID)
+ Party.view(firstPartyID)
+ },
+ view: function(id)
+ {
+ $('#userViewContainer').hide()
+ $('#userEditContainer').hide()
+ $('#partyEditContainer').hide()
+ $('#userListContainer').fadeOut(200)
+ Party.partyData = $(this).data('party')
+ $.get(URL.party.view, {'id':id}, Party.viewCallback)
+ },
+ viewCallback: function (users)
+ {
+ var partyUserList = ""
+ var partyLocationTag = ""
+ var editable = []
+ var currentHost = -1
+
+ users.forEach(function(user){
+ var fields = lines[i].split('\t')
+
+ // 0 id 1 group 2 name 3 email 4 blurb
+ partyUserList += "<li><span class='view' id='user-"+ user.id +"'>"+ user.name +"</span>"
+ if (Auth.isHost || user.id === Auth.userID) {
+ partyUserList += "<span class='edit' id='edit-"+user.id+"'>edit</span>"
+ editable.push(user.id)
+ }
+ partyUserList += "</li>"
+ Users.userlist['user-'+user.id] = user
+ })
+
+ partyLocationTag = Party.partyData.location
+ Party.currentID = Party.partyData.id
+ Party.partyData = partyData
+ $('#partyLocation').html(partyLocationTag)
+ $('#userList').html(partyUserList)
+ if (Auth.isHost) {
+ $('#user-add').show()
+ $('#party-edit').show()
+ }
+ $('#userListContainer').fadeIn(200)
+ $('#userViewContainer').show()
+ for (id in Users.userlist) {
+ $('#'+id).hover(Users.limousein, Users.limouseout).click(Users.liclick).data('user', Users.userlist[id])
+ }
+ for (i in editable) {
+ $('#edit-'+editable[i]).bind("click",Users.editClick).data('user', Users.userlist[editable[i]])
+ }
+ Users.hovering = true
+ },
+ addClick: function ()
+ {
+ warn("NEW PARTY FORM")
+ var id = "NEW"
+ var today = new Date()
+ $('#party-id').val(id)
+ $('#party-day').val(today.getDate())
+ $('#party-year').val(today.getFullYear())
+ $('#party-month option').attr("selected", false);
+ $('#party-month option[value="'+today.getMonth()+'"]').attr("selected", true);
+ $('#party-location').val("")
+ $('#partyEditContainer h2').html("New party")
+ $('#userListContainer').hide()
+ $('#userViewContainer').hide()
+ $('#userEditContainer').hide()
+ $('#partyEditContainer').show()
+ $('#party-location').focus()
+ Main.saveFunction = Party.editSave
+ Nav.selectClass(Party.parties, "")
+ },
+ editClick: function ()
+ {
+ var id = Party.currentID
+ // 0 id 1 date 2 location
+ var party = Party.partyData
+ var date = party[1].split("-")
+ $('#party-id').val(id)
+ $('#party-day').val(date[0])
+ $('#party-year').val(date[2])
+ $('#party-month option').attr("selected", false);
+ $('#party-month option[value="'+months[date[1]]+'"]').attr("selected", true);
+ $('#party-location').val(party[2])
+ $('#partyEditContainer h2').html("Edit party")
+ $('#userListContainer').hide()
+ $('#userViewContainer').hide()
+ $('#userEditContainer').hide()
+ $('#partyEditContainer').show()
+ Main.saveFunction = Party.editSave
+ },
+ editSave: function ()
+ {
+ if (Main.saving)
+ return
+ Main.saving = true
+ warn("attempting save")
+ var data =
+ {
+ id: $('#party-id').val(),
+ userid: Auth.userID,
+ hostid: Auth.userID,
+ location: $('#party-location').val(),
+ month: $('#party-month').val(),
+ day: $('#party-day').val(),
+ year: $('#party-year').val(),
+ }
+ $('#partyEditContainer').fadeOut(200)
+ $.post(URL.party.edit, data, Party.editSaveCallback)
+ },
+ editSaveCallback: function (raw)
+ {
+ var lines = raw.split("\n")
+ if (lines.shift() !== API_MAGIC)
+ {
+ warn("bad api: party save")
+ return
+ }
+ var result = lines.shift().split("\t")
+ if (result[0] === "ERROR")
+ {
+ warn("save error: "+result[1])
+ return
+ }
+ var fields = lines.shift().split("\t")
+ var rowID = "party-"+fields[0]
+ if (result[0] === "OK")
+ { warn("party saved") }
+ else if (result[0] === "NEW")
+ {
+ warn("party created")
+ $("#partyList").append("<li id='"+rowID+"'>"+fields[1]+"</li>")
+ }
+ // Party.parties[rowID] = fields
+ // Party.view(fields[0])
+ // Nav.selectClass(Party.parties, rowID)
+ Main.saving = false
+ Party.currentID = fields[0]
+ Party.list()
+ },
+ };
diff --git a/public/js/protocols_site.js b/public/js/protocols_site.js
deleted file mode 100644
index 5d3d95c..0000000
--- a/public/js/protocols_site.js
+++ /dev/null
@@ -1,919 +0,0 @@
-var API_MAGIC = "#(@)PROTOCOLS"
-var URLregexp = /^(https?:\/\/)(www.)?([-A-Z0-9.]+)(\/)?([-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])*/ig;
-var months = { Jan: 0, Feb: 1, Mar: 2, Apr: 3, May: 4, Jun: 5, Jul: 6, Aug: 7, Sep: 8, Oct: 9, Nov: 10, Dec: 11 }
-function isScrolledIntoView (elem)
- {
- return true;
- var docViewTop = $(window).scrollTop();
- var docViewBottom = docViewTop + $(window).height();
- var elemTop = $(elem).offset().top;
- var elemBottom = elemTop + $(elem).height();
- return ((elemBottom >= docViewTop) && (elemTop <= docViewBottom));
- }
-function scrollToTop (div)
- { $(div).scrollTop( 0 ) }
-function scrollToBottom (div)
- { $(div).scrollTop( $(div)[0].scrollHeight ) }
-function warn(s)
- {
-// return
- console.log(s)
- var h = document.getElementById('msg').innerHTML
- h = s + '<br/>' + h
- document.getElementById('msg').innerHTML = h
- }
-var image_extensions = ["jpg","gif","png","jpeg","JPEG","JPG","GIF","PNG"]
-function is_image(s)
- {
- for (i in image_extensions)
- {
- if (s.indexOf(image_extensions[i]) !== -1)
- return true
- }
- return false
- }
-var domain_extensions = [".com",".net",".org",".uk",".fr",".de",".ch",".info",".nu",".mu",".io","facebook.com","twitter.com"]
-function has_domain(s)
- {
- for (var i in domain_extensions)
- {
- if (s.indexOf(domain_extensions[i]) !== -1)
- return true
- }
- return false
- }
-function parse_blurb(s)
- {
- // s = linkify(s+"\n")
- var parsed_lines = []
- var lines = s.split("\n")
- for (i in lines)
- {
- var parsed_words = []
- var words = lines[i].split(" ")
- for (j in words)
- {
- if (words[j].indexOf("http") !== -1)
- {
- if (is_image(words[j]))
- parsed_words.push('<img src="'+words[j]+'"/>')
- else
- parsed_words.push(linkify(words[j]))
- }
- else if (words[j].indexOf("www") === 0 || has_domain(words[j]))
- {
- parsed_words.push(linkify("http://"+words[j]))
- }
- else
- parsed_words.push(words[j])
- }
- parsed_lines.push( parsed_words.join(" ") )
- }
- // return s.replace(/\n/g, '<br/>')
- return parsed_lines.join("<br/>")
- }
-function linkify(s)
- {
- var link = '';
- var punctuation = '';
- var end = s.length-1;
-
- // strip the terminal punctuation mark if it's a period or comma
- if (s.indexOf(".", end) === end || s.indexOf(",", end) === end)
- {
- punctuation = s.substr(end, 1);
- s = s.substr(0, end);
- }
- if (s.indexOf("twitter.com") !== -1)
- {
- var partz = s.split("/");
- var uname = '';
- if (partz[partz.length-1].length)
- uname = partz[partz.length-1];
- else if (parts[-2].length)
- uname = partz[partz.length-2];
- link = '<a href="https://twitter.com/' + uname + '" target="_blank">@' + uname + '</a>';
- }
- else
- {
- // link = s.replace(URLregexp,"<a href='$1$2$3$4$5' target='_blank'>[$3]</a>");
- var match = URLregexp.exec(s);
- if (match && match.length == 6)
- {
- var url = match[0] || "";
- var http = match[1] || "";
- var www = match[2] || "";
- var domain = match[3] || "";
- var slash = match[4] || "";
- var uri = match[5] ? match[5].replace(/\/?index.html$/, "") : "";
- link = '<a href="' + url + '" target="_blank">[' + domain + ']</a>';
- }
- else
- {
- link = s.replace(URLregexp,"<a href='$1$2$3$4$5' target='_blank'>[$3]</a>");
- }
- }
- return link + punctuation;
- }
-var URL =
- {
- auth:
- {
- login: "/login",
- logout: "/logout",
- },
- party:
- {
- list: "/api/party/list",
- view: "/api/party/view",
- edit: "/api/party/edit",
- },
- user:
- {
- all: "/api/user/all",
- view: "/api/user/view",
- edit: "/api/user/edit",
- destroy: "/api/user/destroy",
- },
- };
-var Party =
- {
- parties: {},
- currentID: -1,
- partyData: '',
- liclick: function ()
- {
- Nav.selectClass(Party.parties, this.id)
- var id = this.id.split("-")[1]
- warn("viewing party "+id)
- Party.view(id)
- },
- list: function()
- {
- $('#partyListContainer').fadeOut(200)
- $('#partyEditContainer').hide()
- $('#userListContainer').hide()
- $('#userEditContainer').hide()
- $('#userViewContainer').hide()
- $.get(URL.party.list,{},Party.listCallback)
- },
- listCallback: function (parties)
- {
- warn("got party list")
- var partyList = ""
- if (Party.currentID != -1) {
- var firstPartyID = Party.currentID
- }
- parties.forEach(function(party){
- if (! firstPartyID) {
- firstPartyID = party.id
- }
- partyList += "<li id='party-"+party.id+"'>"+party.date+"</li>"
- Party.parties["party-"+party.id] = party
- })
-
- $('#partyList').html(partyList)
- $('#partyListContainer').fadeIn(200)
- for (id in Party.parties) {
- $('#'+id).click(Party.liclick).data('party', Party.parties[id])
- }
- Nav.selectClass(Party.parties, "party-"+firstPartyID)
- if (firstPartyID)
- Party.view(firstPartyID)
- },
- view: function(id)
- {
- $('#userViewContainer').hide()
- $('#userEditContainer').hide()
- $('#partyEditContainer').hide()
- $('#userListContainer').fadeOut(200)
- Party.partyData = $(this).data('party')
- $.get(URL.party.view, {'id':id}, Party.viewCallback)
- },
- viewCallback: function (users)
- {
- var partyUserList = ""
- var partyLocationTag = ""
- var editable = []
- var currentHost = -1
-
- users.forEach(function(user){
- var fields = lines[i].split('\t')
-
- // 0 id 1 group 2 name 3 email 4 blurb
- partyUserList += "<li><span class='view' id='user-"+ user.id +"'>"+ user.name +"</span>"
- if (Auth.isHost || user.id === Auth.userID) {
- partyUserList += "<span class='edit' id='edit-"+user.id+"'>edit</span>"
- editable.push(user.id)
- }
- partyUserList += "</li>"
- Users.userlist['user-'+user.id] = user
- })
-
- partyLocationTag = Party.partyData.location
- Party.currentID = Party.partyData.id
- Party.partyData = partyData
- $('#partyLocation').html(partyLocationTag)
- $('#userList').html(partyUserList)
- if (Auth.isHost) {
- $('#user-add').show()
- $('#party-edit').show()
- }
- $('#userListContainer').fadeIn(200)
- $('#userViewContainer').show()
- for (id in Users.userlist) {
- $('#'+id).hover(Users.limousein, Users.limouseout).click(Users.liclick).data('user', Users.userlist[id])
- }
- for (i in editable) {
- $('#edit-'+editable[i]).bind("click",Users.editClick).data('user', Users.userlist[editable[i]])
- }
- Users.hovering = true
- },
- addClick: function ()
- {
- warn("NEW PARTY FORM")
- var id = "NEW"
- var today = new Date()
- $('#party-id').val(id)
- $('#party-day').val(today.getDate())
- $('#party-year').val(today.getFullYear())
- $('#party-month option').attr("selected", false);
- $('#party-month option[value="'+today.getMonth()+'"]').attr("selected", true);
- $('#party-location').val("")
- $('#partyEditContainer h2').html("New party")
- $('#userListContainer').hide()
- $('#userViewContainer').hide()
- $('#userEditContainer').hide()
- $('#partyEditContainer').show()
- $('#party-location').focus()
- Main.saveFunction = Party.editSave
- Nav.selectClass(Party.parties, "")
- },
- editClick: function ()
- {
- var id = Party.currentID
- // 0 id 1 date 2 location
- var party = Party.partyData
- var date = party[1].split("-")
- $('#party-id').val(id)
- $('#party-day').val(date[0])
- $('#party-year').val(date[2])
- $('#party-month option').attr("selected", false);
- $('#party-month option[value="'+months[date[1]]+'"]').attr("selected", true);
- $('#party-location').val(party[2])
- $('#partyEditContainer h2').html("Edit party")
- $('#userListContainer').hide()
- $('#userViewContainer').hide()
- $('#userEditContainer').hide()
- $('#partyEditContainer').show()
- Main.saveFunction = Party.editSave
- },
- editSave: function ()
- {
- if (Main.saving)
- return
- Main.saving = true
- warn("attempting save")
- var data =
- {
- id: $('#party-id').val(),
- userid: Auth.userID,
- hostid: Auth.userID,
- location: $('#party-location').val(),
- month: $('#party-month').val(),
- day: $('#party-day').val(),
- year: $('#party-year').val(),
- }
- $('#partyEditContainer').fadeOut(200)
- $.post(URL.party.edit, data, Party.editSaveCallback)
- },
- editSaveCallback: function (raw)
- {
- var lines = raw.split("\n")
- if (lines.shift() !== API_MAGIC)
- {
- warn("bad api: party save")
- return
- }
- var result = lines.shift().split("\t")
- if (result[0] === "ERROR")
- {
- warn("save error: "+result[1])
- return
- }
- var fields = lines.shift().split("\t")
- var rowID = "party-"+fields[0]
- if (result[0] === "OK")
- { warn("party saved") }
- else if (result[0] === "NEW")
- {
- warn("party created")
- $("#partyList").append("<li id='"+rowID+"'>"+fields[1]+"</li>")
- }
- // Party.parties[rowID] = fields
- // Party.view(fields[0])
- // Nav.selectClass(Party.parties, rowID)
- Main.saving = false
- Party.currentID = fields[0]
- Party.list()
- },
- };
-var Users =
- {
- userlist: {},
- hovering: true,
- current: false,
- allCount: 0,
- userListIndex: [],
- currentIdx: -1,
- all: function ()
- {
- $('#userViewContainer').hide()
- $('#userEditContainer').hide()
- $('#partyEditContainer').hide()
- $('#userListContainer').fadeOut(200)
- $.get(URL.user.all,{},Users.allCallback)
- },
- allCallback: function (raw)
- {
- warn ("got all users")
- var lines = raw.split("\n")
- if (lines.shift() !== API_MAGIC)
- {
- warn("bad api: user all")
- return
- }
- var partyUserList = [];
- var guestHosts = [];
- var editable = [];
- var firstletter = "A";
- Users.allCount = 0;
- Users.userListIndex = [];
- for (i in lines)
- {
- if (! lines[i])
- continue
- var fields = lines[i].split('\t')
- // 0 id 1 group 2 name 3 email 4 blurb
-// if (fields[1] !== currentHost)
-// {
-// currentHost = fields[1]
-// partyUserList += "<li class='hostlist'>invited by "+Auth.hosts[fields[1]]+"</li>"
-// }
-
- var a = fields[2].substr(0,1)
- var li = "li id='r-"+Users.allCount+"'"
- var userRow = "";
- var editSpan = "";
-
- if (firstletter !== a)
- {
- firstletter = a
- li += " class='br'"
- }
-
- if (Auth.isHost || fields[0] === Auth.userID)
- {
- editSpan += "<span class='edit' id='edit-"+fields[0]+"'>edit</span>";
- editable.push(fields[0]);
- }
-
- switch (fields[1]) {
- case '2': // host
- userRow = "<"+li+"><span class='view' id='user-"+fields[0]+"'>"+fields[2]+" *</span>" + editSpan + "</li>";
- break;
- case '1': // guest host
- userRow = "<"+li+"><span class='view' id='user-"+fields[0]+"'>"+fields[2]+" *</span>" + editSpan + "</li>";
- guestHosts.push(userRow);
- Users.userListIndex.unshift('user-'+fields[0]);
- Users.allCount += 1;
-
- break;
- default: // guest
- userRow = "<"+li+"><span class='view' id='user-"+fields[0]+"'>"+fields[2]+"</span>" + editSpan + "</li>";
- }
-
- partyUserList.push(userRow);
- Users.userlist['user-'+fields[0]] = fields;
- Users.userListIndex.push('user-'+fields[0]);
- Users.allCount += 1;
- }
- $('#partyLocation').html("");
-
- var guestHostHeader = "<li class='hostlist'>Guest Hosts</li>";
- var guestListHeader = "<li class='br'></li><li class='hostlist'>Guest List</li>";
- for (var i in guestHosts)
- guestHosts[i] = guestHosts[i].replace("class='br'","").replace("*","");
- // console.log(guestHosts);
- // guestHosts[guestHosts.length-1] = guestHosts[guestHosts.length-1].replace("<li", "<li class='br'");
-
- $('#userList').html(guestHostHeader + guestHosts.join("") + guestListHeader + partyUserList.join(""));
- $('#user-add').hide();
- $('#party-edit').hide();
- $('#userListContainer').fadeIn(200);
-// $('#userViewContainer').html('<span id="userViewHelper">Here\'s a tip! Use the up and down arrow keys to browse this list.</span>').fadeIn(500)
- $('#userViewContainer').html('<span id="userViewHelper"></span>');
- for (id in Users.userlist)
- {
- $('#'+id).hover(Users.limousein, Users.limouseout)
- $('#'+id).click(Users.liclick)
- }
- for (i in editable)
- {
- $('#edit-'+editable[i]).bind("click",Users.editClick)
- }
- Users.hovering = true
- },
- limouseout: function ()
- {
- if (Users.hovering)
- $("#"+this.id).removeClass("selected")
- },
- limousein: function ()
- {
- if (Users.hovering)
- {
- $("#"+this.id).addClass("selected")
- Users.view(this.id)
- }
- },
- liclick: function ()
- {
- if (! Users.hovering && Users.current === this.id)
- {
- Nav.selectClass(Users.userlist, false)
- Users.current = false
- Users.hovering = true
- }
- else
- {
- Nav.selectClass(Users.userlist, this.id)
- Users.view(this.id)
- Users.hovering = false
- }
- },
- viewIdx: function (idx)
- {
- var id = Users.userListIndex[idx]
-
- if (isScrolledIntoView("#r-"+idx))
- {
- var offset = $("#r-"+idx)[0].offsetTop+5
- if (offset > 300)
- $("body").scrollTop( offset )
- }
- else
- {
- // get element at x,y
- var element = document.elementFromPoint(30,180);
- if (element.tagName === "UL")
- element = document.elementFromPoint(30,190);
- if (element.tagName === "UL")
- element = document.elementFromPoint(30,200);
- if (element.tagName === "SPAN")
- id = element.id
- }
- Users.hovering = false
- Users.view(id)
- Nav.selectClass(Users.userlist, id)
- },
- view: function (id)
- {
- var user = Users.userlist[id]
- var userRec = '';
- // 0 id 1 group 2 name 3 email 4 blurb
- var blurb = parse_blurb( atob ( user[4] ) )
- userRec += "<h2>" + user[2] + "</h2>"
- userRec += "<h3>" + ( user[3] ? "<a href='mailto:"+user[3]+"'>"+user[3]+"</a>" : "" ) + "</h3>"
- userRec += "<p>" + blurb + "</p>"
- $('#userViewContainer').html(userRec)
- $('#userEditContainer').hide()
- $('#partyEditContainer').hide()
- $('#userViewContainer').show()
- Users.currentIdx = $("#"+id).parent().attr("id").substr(2)
- },
- addClick: function ()
- {
- warn("NEW USER FORM")
- var id = "NEW"
- $('#user-id').val(id)
- $('#user-name').val("")
- $('#user-email').val("")
- $('#user-emailhidden').attr('checked', false)
- $('#user-blurb').val("")
- $('#userViewContainer').hide()
- $('#userEditContainer').show()
- $('#user-name').focus()
- $('#userEditContainer h2').html("Add a new guest")
- if (Auth.isHost)
- {
- $('#user-password-block').show()
- $('#user-isstaff-block').show()
- }
- Nav.selectClass(Users.userlist, "")
- Users.hovering = false
- Main.saveFunction = Users.editSave
- },
- editClick: function ()
- {
- $(window).unbind("keydown")
- var id = this.id.split("-")[1]
- Users.hovering = false
- $('#userViewContainer').fadeOut(200)
- $('#userEditContainer').hide()
- $.post(URL.user.view, {id:id}, Users.editClickCallback)
- },
- editClickCallback: function (raw)
- {
- var lines = raw.split("\n")
- if (lines.shift() !== API_MAGIC)
- {
- warn("bad api: user edit")
- return
- }
- var user = lines.shift().split('\t')
- warn ("editing user "+user[0])
- var hidemail = user[4] === '1' ? true : false
-
- // 0 id 1 name 2 email 3 access 4 emailhidden 5 hostid 6 blurb
- var blurb = atob ( user[6] )
- $('#user-id').val(user[0])
- $('#user-name').val(user[1])
- $('#user-email').val(user[2])
- $('#user-emailhidden').attr('checked', hidemail)
- $('#user-access option').attr("selected", false);
- $('#user-access option[value="'+parseInt(user[3])+'"]').attr("selected", true);
- $('#user-host option').attr("selected", false);
- $('#user-host option[value="'+parseInt(user[5])+'"]').attr("selected", true);
- $('#user-blurb').val(blurb)
- $('#userViewContainer').hide()
- if (user[0] === Auth.userID)
- {
- $('#userEditContainer h2').html("Editing your profile")
- $('#user-password-block').show()
- $('#user-isstaff-block').hide()
- }
- else
- {
- $('#user-password-block').hide()
- $('#user-isstaff-block').hide()
- $('#user-invitedby-block').hide()
- $('#userEditContainer h2').html("Editing "+user[1])
- }
- if (Auth.isHost)
- {
- $('#user-password-block').show()
- $('#user-isstaff-block').show()
- $('#user-invitedby-block').show()
- $('#user-delete').show()
- var ishost = user[3] === '1' ? true : false
- $('#user-ishost').attr('checked', ishost)
- }
- $('#user-password1').val('')
- $('#user-password2').val('')
- $('#userEditContainer').fadeIn(300)
- Main.saveFunction = Users.editSave
- },
- editSave: function ()
- {
- if (Main.saving)
- return
- Main.saving = true
- var hidemail = $('#user-emailhidden').attr("checked") === true ? 1 : 0
- warn("attempting save")
- var id = $('#user-id').val()
- var data =
- {
- id: id,
- partyid: Party.currentID,
- hostid: $('#user-host').val(),
- name: $('#user-name').val(),
- email: $('#user-email').val(),
- emailhidden: hidemail,
- blurb: $('#user-blurb').val(),
- }
- if (Auth.isHost)
- {
- var access = $('#user-access').val()
- data['access'] = access
- }
- if (Auth.isHost || id === Auth.userID)
- {
- var pw1 = $('#user-password1').val()
- var pw2 = $('#user-password2').val()
- if (pw1 && pw2)
- {
- warn("setting password?! "+pw1)
- if (pw1 === pw2)
- data['password'] = pw1
- else
- warn("passwords don't match!")
- }
- }
- $.post(URL.user.edit, data, Users.editSaveCallback)
- },
- editSaveCallback: function (raw)
- {
- var lines = raw.split("\n")
- if (lines.shift() !== API_MAGIC)
- {
- warn("bad api: user edit")
- return
- }
- var result = lines.shift().split("\t")
- if (result[0] === "ERROR")
- {
- warn("save error: "+result[1])
- return
- }
- var fields = lines.shift().split("\t")
- var rowID = "user-"+fields[0]
- if (result[0] === "OK")
- {
- warn("user saved")
- Users.userlist[rowID] = fields
- Users.view(rowID)
- Nav.selectClass(Users.userlist, rowID)
- }
- else if (result[0] === "NEW")
- {
- warn("user created")
- // $("#userList").append("<li id='"+rowID+"'>"+fields[1]+"</li>")
- Party.view( Party.currentID )
- }
- Main.saving = false
- },
- deleteClick: function ()
- {
- var id = $('#user-id').val()
- var name = $('#user-name').val()
- var r = confirm("ARE YOU SURE YOU WANT TO DELETE " + name + "?")
- if (r)
- $.post(URL.user.destroy, {'id':id}, Users.deleteClickCallback)
- },
- deleteClickCallback: function ()
- {
- var id = $('#user-id').val()
- var name = $('#user-name').val()
- Users.userlist['user-'+id] = []
- warn("DELETED "+id+ " "+name)
- $('#userViewContainer').hide()
- $('#userViewContainer h2').html('')
- $('#userViewContainer b').html('')
- $('#userViewContainer p').html('')
- $('#userEditContainer').hide()
- Party.view( Party.currentID )
- },
- };
-var Nav =
- {
- navIDs: {"nav_about":0,"nav_parties":0,"nav_users":0,"nav_patrons":0,"nav_reunions":0},
- aboutClick: function()
- {
- this.blur()
- $('#aboutMode').show()
- $('#patronMode').hide()
- $('#partiesMode').hide()
- $('#reunionMode').hide()
- Nav.selectClass(Nav.navIDs, "nav_about")
- $(window).unbind("keydown")
- },
- partiesClick: function()
- {
- this.blur()
- $('#aboutMode').hide()
- $('#patronMode').hide()
- $('#partiesMode').show()
- $('#reunionMode').hide()
- Nav.selectClass(Nav.navIDs, "nav_parties")
- $('#userViewContainer').css("left", 520)
- Party.list()
- $(window).unbind("keydown")
- },
- usersClick: function()
- {
- this.blur()
- $('#aboutMode').hide()
- $('#patronMode').hide()
- $('#partiesMode').show()
- $('#reunionMode').hide()
- $('#userListContainer').hide()
- $('#partyListContainer').hide()
- Nav.selectClass(Nav.navIDs, "nav_users")
- $('#userViewContainer').css("left", 320)
- Users.all()
- $(window).unbind("keydown")
- $(window).bind("keydown", Nav.keydown)
- },
- patronsClick: function()
- {
- this.blur()
- $('#aboutMode').hide()
- $('#partiesMode').hide()
- $('#patronMode').show()
- $('#reunionMode').hide()
- Nav.selectClass(Nav.navIDs, "nav_patrons")
- $(window).unbind("keydown")
- },
- reunionClick: function()
- {
- this.blur()
- $('#aboutMode').hide()
- $('#patronMode').hide()
- $('#partiesMode').hide()
- $('#reunionMode').show()
- Nav.selectClass(Nav.navIDs, "nav_reunions")
- $(window).unbind("keydown")
- },
- selectClass: function (ids, selected)
- {
- for (var id in ids)
- {
- $("#"+id).removeClass("selected")
- }
- if (selected)
- $("#"+selected).addClass("selected")
- },
- keydown: function (e)
- {
- kc = event.keyCode
- if (kc === 38) // up
- {
- // select previous name or last
- newIdx = parseInt(Users.currentIdx) - 1
- if (newIdx < 0)
- {
- newIdx = Users.allCount - 1
- scrollToBottom("body")
- }
- Users.viewIdx(newIdx)
- return false
- }
- if (kc === 40) // down
- {
- // select next name or first
- newIdx = parseInt(Users.currentIdx) + 1
- if (newIdx === Users.allCount)
- {
- newIdx = 0
- scrollToTop("body")
- }
- Users.viewIdx(newIdx)
- return false
- }
- return true
- },
- };
-var Auth =
- {
- name: '',
- userID: 1,
- isHost: false,
- loginPrompt: false,
- hosts: {},
- init: function () {
- $.post(URL.auth.login, {}, Auth.loginCallback)
- },
- unload: function () {
- if (Auth.loginPrompt) {
- Auth.loginPrompt = false
- $('#login').fadeOut(1000, function(){ Main.load()} )
- }
- else {
- Main.load()
- }
- },
- load: function () {
- $('#login').fadeIn(1000)
- $('#login-email').focus()
- $('#login-email').keydown(Main.kp)
- $('#login-password').keydown(Main.kp)
- $('#login-go').click( Auth.login )
- Auth.loginPrompt = true
- Main.saveFunction = Auth.login
- Main.saving = false
- },
- login: function () {
- if (Main.saving)
- return
- Main.saving = true
- warn("attempting login")
- var data = {
- username: $('#login-email').val(),
- password: $('#login-password').val(),
- }
- $('#login-password').val(''),
- $.post(URL.auth.login, data, Auth.loginCallback)
- },
- loginCallback: function (json) {
- Main.saving = false
-
- if (! json || json.error) {
- if (! Auth.loginPrompt)
- Auth.load()
- else
- warn("bad login!")
- return
- }
-
- // 0 id 1 name 2 firstname 3 email 4 access
- var user = Auth.user = json.user
-
-console.log(user)
-
- var name = user.name.split(' ')[0] || user.email.split('@')[0]
- warn( "Logged in! Hello "+name )
- Auth.userID = user.id
- Auth.isHost = user.access == 2 ? true : false;
- Auth.name = user.name
- Auth.firstName = name
-
- $('#profile-edit').html(Auth.firstName + "!")
- $('#logout').click( Auth.logout )
-
- var hostSelect = ""
- Auth.hosts = {}
- json.hosts.forEach(function(host){
- if (host.id === Auth.userID)
- hostSelect += "<option value='"+host.id+"' selected='1'>"+host.name+"</option>"
- else
- hostSelect += "<option value='"+host.id+"'>"+host.name+"</option>"
- Auth.hosts[ host.id ] = host.name
- })
-
- $("#user-host").html(hostSelect)
-
- Auth.unload()
- },
- logout: function ()
- {
- warn("logging out")
- document.cookie = 'sid.protocols=LOGGEDOUT; expires=Mon, 1 Jan 2001 12:00:00 UTC; path=/'
- Main.unload()
- },
- };
-var Main =
- {
- saveFunction: false,
- saving: false,
- kp: function (e)
- {
- var evt = window.event ? window.event : e
- var key = evt.keyCode ? evt.keyCode : e.which
- if (key === 13)
- Main.saveFunction()
- },
- init: function ()
- {
- warn("init site")
- Auth.init()
- },
- unload: function ()
- {
- $('header').fadeOut(500)
- $('section').fadeOut(500)
- $('footer').fadeOut(500)
- $('#bg').fadeIn(500)
- Auth.init()
- },
- load: function ()
- {
- warn("loading site")
- $('#bg').fadeOut(500)
- $('header').show()
- $('#welcome').fadeIn(500)
- $('#nav_about').click( Nav.aboutClick )
- $('#nav_users').click( Nav.usersClick )
- $('#nav_patrons').click( Nav.patronsClick )
- $('#nav_reunions').click( Nav.reunionClick )
- if (Auth.isHost)
- {
- $('#nav_parties').show()
- $('#nav_parties').click( Nav.partiesClick )
- $('#user-add').click( Users.addClick )
- $('#user-delete').click( Users.deleteClick )
- $('#party-add').click( Party.addClick )
- $('#party-edit').click( Party.editClick )
- }
- else
- {
- $('#nav_parties').hide()
- $('#user-add').hide()
- $('#user-delete').hide()
- $('#party-add').hide()
- $('#party-edit').hide()
- }
- $('#user-save').click( Users.editSave )
- $('#user-name').keydown(Main.kp)
- $('#user-email').keydown(Main.kp)
- $('#user-password2').keydown(Main.kp)
- $('#party-location').keydown(Main.kp)
- $('#party-day').keydown(Main.kp)
- $('#party-year').keydown(Main.kp)
- $('#party-save').click( Party.editSave )
- Nav.selectClass(Nav.navIDs, "nav_about")
- $('#aboutMode').show()
- warn("done!")
- },
- };
-Main.init();
diff --git a/public/js/user.js b/public/js/user.js
new file mode 100644
index 0000000..22943b5
--- /dev/null
+++ b/public/js/user.js
@@ -0,0 +1,335 @@
+var Users =
+ {
+ userlist: {},
+ hovering: true,
+ current: false,
+ allCount: 0,
+ userListIndex: [],
+ currentIdx: -1,
+ all: function ()
+ {
+ $('#userViewContainer').hide()
+ $('#userEditContainer').hide()
+ $('#partyEditContainer').hide()
+ $('#userListContainer').fadeOut(200)
+ $.get(URL.user.all,{},Users.allCallback)
+ },
+ allCallback: function (json)
+ {
+ var partyUserList = [];
+ var guestHosts = [];
+ var editable = [];
+ var firstletter = "A";
+ Users.allCount = 0;
+ Users.userListIndex = [];
+ json.forEach(function(user){
+ // 0 id 1 group 2 name 3 email 4 blurb
+// if (fields[1] !== currentHost)
+// {
+// currentHost = fields[1]
+// partyUserList += "<li class='hostlist'>invited by "+Auth.hosts[fields[1]]+"</li>"
+// }
+
+ var a = user.name.substr(0,1)
+ var li = "li id='r-"+Users.allCount+"'"
+ var userRow = "";
+ var editSpan = "";
+
+ if (firstletter !== a)
+ {
+ firstletter = a
+ li += " class='br'"
+ }
+
+ if (Auth.isHost || user.id === Auth.userID)
+ {
+ editSpan += "<span class='edit' id='edit-"+user.id+"'>edit</span>";
+ editable.push(user.id);
+ }
+
+ switch (user.access) {
+ case 2: // host
+ userRow = "<"+li+"><span class='view' id='user-"+user.id+"'>"+user.name+" *</span>" + editSpan + "</li>";
+ break;
+ case 1: // guest host
+ userRow = "<"+li+"><span class='view' id='user-"+user.id+"'>"+user.name+" *</span>" + editSpan + "</li>";
+ guestHosts.push(userRow);
+ Users.userListIndex.unshift('user-'+user.id);
+ Users.allCount += 1;
+
+ break;
+ default: // guest
+ userRow = "<"+li+"><span class='view' id='user-"+user.id+"'>"+user.name+"</span>" + editSpan + "</li>";
+ }
+
+ partyUserList.push(userRow);
+ Users.userlist['user-'+user.id] = user;
+ Users.userListIndex.push('user-'+user.id);
+ Users.allCount += 1;
+ })
+ $('#partyLocation').html("");
+
+ var guestHostHeader = "<li class='hostlist'>Guest Hosts</li>";
+ var guestListHeader = "<li class='br'></li><li class='hostlist'>Guest List</li>";
+ for (var i in guestHosts) {
+ guestHosts[i] = guestHosts[i].replace("class='br'","").replace("*","");
+ }
+
+ $('#userList').html(guestHostHeader + guestHosts.join("") + guestListHeader + partyUserList.join(""));
+ $('#user-add').hide();
+ $('#party-edit').hide();
+ $('#userListContainer').fadeIn(200);
+// $('#userViewContainer').html('<span id="userViewHelper">Here\'s a tip! Use the up and down arrow keys to browse this list.</span>').fadeIn(500)
+ $('#userViewContainer').html('<span id="userViewHelper"></span>');
+ for (id in Users.userlist)
+ {
+ $('#'+id).hover(Users.limousein, Users.limouseout)
+ $('#'+id).click(Users.liclick)
+ }
+ for (i in editable)
+ {
+ $('#edit-'+editable[i]).bind("click",Users.editClick)
+ }
+ Users.hovering = true
+ },
+ limouseout: function ()
+ {
+ if (Users.hovering)
+ $("#"+this.id).removeClass("selected")
+ },
+ limousein: function ()
+ {
+ if (Users.hovering)
+ {
+ $("#"+this.id).addClass("selected")
+ Users.view(this.id)
+ }
+ },
+ liclick: function ()
+ {
+ if (! Users.hovering && Users.current === this.id)
+ {
+ Nav.selectClass(Users.userlist, false)
+ Users.current = false
+ Users.hovering = true
+ }
+ else
+ {
+ Nav.selectClass(Users.userlist, this.id)
+ Users.view(this.id)
+ Users.hovering = false
+ }
+ },
+ viewIdx: function (idx)
+ {
+ var id = Users.userListIndex[idx]
+
+ if (isScrolledIntoView("#r-"+idx))
+ {
+ var offset = $("#r-"+idx)[0].offsetTop+5
+ if (offset > 300)
+ $("body").scrollTop( offset )
+ }
+ else
+ {
+ // get element at x,y
+ var element = document.elementFromPoint(30,180);
+ if (element.tagName === "UL")
+ element = document.elementFromPoint(30,190);
+ if (element.tagName === "UL")
+ element = document.elementFromPoint(30,200);
+ if (element.tagName === "SPAN")
+ id = element.id
+ }
+ Users.hovering = false
+ Users.view(id)
+ Nav.selectClass(Users.userlist, id)
+ },
+ view: function (id)
+ {
+ var user = Users.userlist[id]
+ var userRec = '';
+ // 0 id 1 group 2 name 3 email 4 blurb
+ var blurb = parse_blurb( user.blurb )
+ userRec += "<h2>" + user.name + "</h2>"
+ userRec += "<h3>" + ( ! user.emailhidden ? "<a href='mailto:"+user.email+"'>"+user.email+"</a>" : "" ) + "</h3>"
+ userRec += "<p>" + blurb + "</p>"
+ $('#userViewContainer').html(userRec)
+ $('#userEditContainer').hide()
+ $('#partyEditContainer').hide()
+ $('#userViewContainer').show()
+ Users.currentIdx = $("#"+id).parent().attr("id").substr(2)
+ },
+ addClick: function ()
+ {
+ warn("NEW USER FORM")
+ var id = "NEW"
+ $('#user-id').val(id)
+ $('#user-name').val("")
+ $('#user-email').val("")
+ $('#user-emailhidden').attr('checked', false)
+ $('#user-blurb').val("")
+ $('#userViewContainer').hide()
+ $('#userEditContainer').show()
+ $('#user-name').focus()
+ $('#userEditContainer h2').html("Add a new guest")
+ if (Auth.isHost)
+ {
+ $('#user-password-block').show()
+ $('#user-isstaff-block').show()
+ }
+ Nav.selectClass(Users.userlist, "")
+ Users.hovering = false
+ Main.saveFunction = Users.editSave
+ },
+ editClick: function ()
+ {
+ $(window).unbind("keydown")
+ var id = this.id.split("-")[1]
+ Users.hovering = false
+ $('#userViewContainer').fadeOut(200)
+ $('#userEditContainer').hide()
+ $.post(URL.user.view, {id:id}, Users.editClickCallback)
+ },
+ editClickCallback: function (raw)
+ {
+ var lines = raw.split("\n")
+ if (lines.shift() !== API_MAGIC)
+ {
+ warn("bad api: user edit")
+ return
+ }
+ var user = lines.shift().split('\t')
+ warn ("editing user "+user[0])
+ var hidemail = user.emailhidden === '1' ? true : false
+
+ // 0 id 1 name 2 email 3 access 4 emailhidden 5 hostid 6 blurb
+ var blurb = user.blurb
+ $('#user-id').val(user.id)
+ $('#user-name').val(user.name)
+ $('#user-email').val(user.email)
+ $('#user-emailhidden').attr('checked', hidemail)
+ $('#user-access option').attr("selected", false);
+ $('#user-access option[value="'+parseInt(user.access)+'"]').attr("selected", true);
+ $('#user-host option').attr("selected", false);
+ $('#user-host option[value="'+parseInt(user.host_id)+'"]').attr("selected", true);
+ $('#user-blurb').val(blurb)
+ $('#userViewContainer').hide()
+ if (user.id === Auth.userID)
+ {
+ $('#userEditContainer h2').html("Editing your profile")
+ $('#user-password-block').show()
+ $('#user-isstaff-block').hide()
+ }
+ else
+ {
+ $('#user-password-block').hide()
+ $('#user-isstaff-block').hide()
+ $('#user-invitedby-block').hide()
+ $('#userEditContainer h2').html("Editing "+user.name)
+ }
+ if (Auth.isHost)
+ {
+ $('#user-password-block').show()
+ $('#user-isstaff-block').show()
+ $('#user-invitedby-block').show()
+ $('#user-delete').show()
+ var ishost = user.access === '1' ? true : false
+ $('#user-ishost').attr('checked', ishost)
+ }
+ $('#user-password1').val('')
+ $('#user-password2').val('')
+ $('#userEditContainer').fadeIn(300)
+ Main.saveFunction = Users.editSave
+ },
+ editSave: function ()
+ {
+ if (Main.saving)
+ return
+ Main.saving = true
+ var hidemail = $('#user-emailhidden').attr("checked") === true ? 1 : 0
+ warn("attempting save")
+ var id = $('#user-id').val()
+ var data =
+ {
+ id: id,
+ partyid: Party.currentID,
+ hostid: $('#user-host').val(),
+ name: $('#user-name').val(),
+ email: $('#user-email').val(),
+ emailhidden: hidemail,
+ blurb: $('#user-blurb').val(),
+ }
+ if (Auth.isHost)
+ {
+ var access = $('#user-access').val()
+ data['access'] = access
+ }
+ if (Auth.isHost || id === Auth.userID)
+ {
+ var pw1 = $('#user-password1').val()
+ var pw2 = $('#user-password2').val()
+ if (pw1 && pw2)
+ {
+ warn("setting password?! "+pw1)
+ if (pw1 === pw2)
+ data['password'] = pw1
+ else
+ warn("passwords don't match!")
+ }
+ }
+ $.post(URL.user.edit, data, Users.editSaveCallback)
+ },
+ editSaveCallback: function (raw)
+ {
+ var lines = raw.split("\n")
+ if (lines.shift() !== API_MAGIC)
+ {
+ warn("bad api: user edit")
+ return
+ }
+ var result = lines.shift().split("\t")
+ if (result[0] === "ERROR")
+ {
+ warn("save error: "+result[1])
+ return
+ }
+ var fields = lines.shift().split("\t")
+ var rowID = "user-"+fields[0]
+ if (result[0] === "OK")
+ {
+ warn("user saved")
+ Users.userlist[rowID] = fields
+ Users.view(rowID)
+ Nav.selectClass(Users.userlist, rowID)
+ }
+ else if (result[0] === "NEW")
+ {
+ warn("user created")
+ // $("#userList").append("<li id='"+rowID+"'>"+fields[1]+"</li>")
+ Party.view( Party.currentID )
+ }
+ Main.saving = false
+ },
+ deleteClick: function ()
+ {
+ var id = $('#user-id').val()
+ var name = $('#user-name').val()
+ var r = confirm("ARE YOU SURE YOU WANT TO DELETE " + name + "?")
+ if (r)
+ $.post(URL.user.destroy, {'id':id}, Users.deleteClickCallback)
+ },
+ deleteClickCallback: function ()
+ {
+ var id = $('#user-id').val()
+ var name = $('#user-name').val()
+ Users.userlist['user-'+id] = []
+ warn("DELETED "+id+ " "+name)
+ $('#userViewContainer').hide()
+ $('#userViewContainer h2').html('')
+ $('#userViewContainer b').html('')
+ $('#userViewContainer p').html('')
+ $('#userEditContainer').hide()
+ Party.view( Party.currentID )
+ },
+ };
diff --git a/public/js/util.js b/public/js/util.js
new file mode 100644
index 0000000..7b2520e
--- /dev/null
+++ b/public/js/util.js
@@ -0,0 +1,137 @@
+var URLregexp = /^(https?:\/\/)(www.)?([-A-Z0-9.]+)(\/)?([-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])*/ig;
+var months = { Jan: 0, Feb: 1, Mar: 2, Apr: 3, May: 4, Jun: 5, Jul: 6, Aug: 7, Sep: 8, Oct: 9, Nov: 10, Dec: 11 }
+function isScrolledIntoView (elem)
+ {
+ return true;
+ var docViewTop = $(window).scrollTop();
+ var docViewBottom = docViewTop + $(window).height();
+ var elemTop = $(elem).offset().top;
+ var elemBottom = elemTop + $(elem).height();
+ return ((elemBottom >= docViewTop) && (elemTop <= docViewBottom));
+ }
+function scrollToTop (div)
+ { $(div).scrollTop( 0 ) }
+function scrollToBottom (div)
+ { $(div).scrollTop( $(div)[0].scrollHeight ) }
+function warn(s)
+ {
+// return
+ console.log(s)
+ var h = document.getElementById('msg').innerHTML
+ h = s + '<br/>' + h
+ document.getElementById('msg').innerHTML = h
+ }
+var image_extensions = ["jpg","gif","png","jpeg","JPEG","JPG","GIF","PNG"]
+function is_image(s)
+ {
+ for (i in image_extensions)
+ {
+ if (s.indexOf(image_extensions[i]) !== -1)
+ return true
+ }
+ return false
+ }
+var domain_extensions = [".com",".net",".org",".uk",".fr",".de",".ch",".info",".nu",".mu",".io","facebook.com","twitter.com"]
+function has_domain(s)
+ {
+ for (var i in domain_extensions)
+ {
+ if (s.indexOf(domain_extensions[i]) !== -1)
+ return true
+ }
+ return false
+ }
+function parse_blurb(s)
+ {
+ // s = linkify(s+"\n")
+ var parsed_lines = []
+ var lines = s.split("\n")
+ for (i in lines)
+ {
+ var parsed_words = []
+ var words = lines[i].split(" ")
+ for (j in words)
+ {
+ if (words[j].indexOf("http") !== -1)
+ {
+ if (is_image(words[j]))
+ parsed_words.push('<img src="'+words[j]+'"/>')
+ else
+ parsed_words.push(linkify(words[j]))
+ }
+ else if (words[j].indexOf("www") === 0 || has_domain(words[j]))
+ {
+ parsed_words.push(linkify("http://"+words[j]))
+ }
+ else
+ parsed_words.push(words[j])
+ }
+ parsed_lines.push( parsed_words.join(" ") )
+ }
+ // return s.replace(/\n/g, '<br/>')
+ return parsed_lines.join("<br/>")
+ }
+function linkify(s)
+ {
+ var link = '';
+ var punctuation = '';
+ var end = s.length-1;
+
+ // strip the terminal punctuation mark if it's a period or comma
+ if (s.indexOf(".", end) === end || s.indexOf(",", end) === end)
+ {
+ punctuation = s.substr(end, 1);
+ s = s.substr(0, end);
+ }
+ if (s.indexOf("twitter.com") !== -1)
+ {
+ var partz = s.split("/");
+ var uname = '';
+ if (partz[partz.length-1].length)
+ uname = partz[partz.length-1];
+ else if (parts[-2].length)
+ uname = partz[partz.length-2];
+ link = '<a href="https://twitter.com/' + uname + '" target="_blank">@' + uname + '</a>';
+ }
+ else
+ {
+ // link = s.replace(URLregexp,"<a href='$1$2$3$4$5' target='_blank'>[$3]</a>");
+ var match = URLregexp.exec(s);
+ if (match && match.length == 6)
+ {
+ var url = match[0] || "";
+ var http = match[1] || "";
+ var www = match[2] || "";
+ var domain = match[3] || "";
+ var slash = match[4] || "";
+ var uri = match[5] ? match[5].replace(/\/?index.html$/, "") : "";
+ link = '<a href="' + url + '" target="_blank">[' + domain + ']</a>';
+ }
+ else
+ {
+ link = s.replace(URLregexp,"<a href='$1$2$3$4$5' target='_blank'>[$3]</a>");
+ }
+ }
+ return link + punctuation;
+ }
+var URL =
+ {
+ auth:
+ {
+ login: "/login",
+ logout: "/logout",
+ },
+ party:
+ {
+ list: "/api/party/list",
+ view: "/api/party/view",
+ edit: "/api/party/edit",
+ },
+ user:
+ {
+ all: "/api/user/all",
+ view: "/api/user/view",
+ edit: "/api/user/edit",
+ destroy: "/api/user/destroy",
+ },
+ };
diff --git a/public/js/base64.js b/public/js/vendor/base64.js
index 2530e71..2530e71 100644
--- a/public/js/base64.js
+++ b/public/js/vendor/base64.js
diff --git a/public/js/jquery-1.4.4.min.js b/public/js/vendor/jquery-1.4.4.min.js
index 8f3ca2e..8f3ca2e 100644
--- a/public/js/jquery-1.4.4.min.js
+++ b/public/js/vendor/jquery-1.4.4.min.js
diff --git a/public/protocols/index.html b/public/protocols/index.html
index 62a5ebf..2c04d3f 100644
--- a/public/protocols/index.html
+++ b/public/protocols/index.html
@@ -224,8 +224,13 @@ Illustration by <a href="http://mollycrabapple.com/" target="_blank">Molly Craba
</section>
</body>
-<script type="text/javascript" src="/js/jquery-1.4.4.min.js"></script>
-<script type="text/javascript" src="/js/base64.js"></script>
-<script type="text/javascript" src="/js/protocols_site.js"></script>
+<script type="text/javascript" src="/js/vendor/jquery-1.4.4.min.js"></script>
+<script type="text/javascript" src="/js/vendor/base64.js"></script>
+<script type="text/javascript" src="/js/util.js"></script>
+<script type="text/javascript" src="/js/party.js"></script>
+<script type="text/javascript" src="/js/user.js"></script>
+<script type="text/javascript" src="/js/nav.js"></script>
+<script type="text/javascript" src="/js/auth.js"></script>
+<script type="text/javascript" src="/js/main.js"></script>
</html>