library(XML)
library(httr)
library(BBmisc) # for sorting

sort.data.frame <- function(x, by){
    # Author: Kevin Wright
    # with some ideas from Andy Liaw
    # http://tolstoy.newcastle.edu.au/R/help/04/07/1076.html
    
    # x: A data.frame
    # by: A one-sided formula using + for ascending and - for descending
    #     Sorting is left to right in the formula
    
    # Useage is:
    # library(nlme);
    # data(Oats)
    # sort(Oats, by= ~nitro-Variety)
    
    if(by[[1]] != "~")
        stop("Argument 'by' must be a one-sided formula.")
    
    # Make the formula into character and remove spaces
    formc <- as.character(by[2]) 
    formc <- gsub(" ", "", formc) 
    # If the first character is not + or -, add +
    if(!is.element(substring(formc, 1, 1), c("+", "-")))
        formc <- paste("+", formc, sep = "")
    
    # Extract the variables from the formula
    vars <- unlist(strsplit(formc, "[\\+\\-]"))    
    vars <- vars[vars != ""] # Remove any extra "" terms
    
    # Build a list of arguments to pass to "order" function
    calllist <- list()
    pos <- 1 # Position of + or -
    for(i in 1:length(vars)){
        varsign <- substring(formc, pos, pos)
        pos <- pos + 1 + nchar(vars[i])
        if(is.factor(x[, vars[i]])){
            if(varsign == "-") {
                calllist[[i]] <- -rank(x[, vars[i]])
            } else {
                calllist[[i]] <- rank(x[, vars[i]])
            }
        } else {
            if(varsign == "-") {
                calllist[[i]] <- -x[, vars[i]]
            } else {
                calllist[[i]] <- x[,vars[i]]
            }
        }
    }
    return(x[do.call("order", calllist), ])
}

# historical times for oot any%
# only shows the current best time for each player
oot_any <- readHTMLTable("http://zeldaspeedruns.com/leaderboards/oot/any")[[1]]
player_names <- as.character(oot_any$Player)

# grab profile for each player in oot any% speedrun leaderboards
num_players <- 5
# store oot profiles of each player in list
player_times <- vector("list", num_players)
names(player_times) <- player_names[1:num_players]
for(i in 1:num_players) {
    url <- paste0("http://zeldaspeedruns.com/profiles/",player_names[i])
    player_times[[i]] <- readHTMLTable(url)
    html <- GET(url)
    content2 <- content(html, as="text")
    parsedHTML = htmlParse(content2, asText=TRUE)
    game_names <- xpathSApply(parsedHTML,"//h3",xmlValue)
    names(player_times[[i]]) = game_names
}

load("C:/Users/Nathan/Documents/oot_data.Rdata")
for(i in 1:num_players) { # remove unneeded columns; take only oot game data
    player_times[[i]] <- player_times[[i]][which(names(player_times[[i]]) == "Ocarina of Time")]
    player_times[[i]][[1]] <- player_times[[i]][[1]][,-c(3,5)]
    player_times[[i]][[1]]$Player = names(player_times)[i]
}

oot_any_parsed <- player_times[[1]][[1]]
for(i in 2:num_players) {
    oot_any_parsed <- rbind(oot_any_parsed, player_times[[i]][[1]])
}
oot_any_parsed <- oot_any_parsed[which(oot_any_parsed$Category=="Any%"),]
oot_any_parsed <- oot_any_parsed[,-1]
oot_any_parsed$Date <- as.Date(as.character(oot_any_parsed$Date), format="%m/%d/%Y")
oot_any_parsed$Time <- as.character(oot_any_parsed$Time)
oot_any_parsed$Seconds <- lapply(strsplit(oot_any_parsed$Time,":"),
                                 function(x) as.numeric(x)[1]*3600 + 
                                     as.numeric(x)[2]*60 + as.numeric(x)[3])
oot_any_parsed$Seconds <- as.numeric(oot_any_parsed$Seconds)
sort(oot_any_parsed,by = ~ Seconds)
##        Time       Date          Player Seconds
## 1   0:17:45 2015-07-10     skater82297    1065
## 2   0:17:47 2015-05-07     skater82297    1067
## 25  0:17:55 2015-03-16      Jodenstone    1075
## 3   0:18:03 2015-03-13     skater82297    1083
## 4   0:18:03 2015-03-13     skater82297    1083
## 5   0:18:03 2015-03-13     skater82297    1083
## 26  0:18:05 2015-03-10      Jodenstone    1085
## 27  0:18:07 2015-01-02      Jodenstone    1087
## 28  0:18:07 2015-03-05      Jodenstone    1087
## 29  0:18:10 2014-12-15      Jodenstone    1090
## 78  0:18:10 2014-07-20           Cosmo    1090
## 30  0:18:12 2014-12-07      Jodenstone    1092
## 6   0:18:18 2015-02-27     skater82297    1098
## 31  0:18:18 2014-10-17      Jodenstone    1098
## 91  0:18:19 2015-06-06 Aliensqueakytoy    1099
## 32  0:18:26 2014-10-17      Jodenstone    1106
## 33  0:18:29 2015-02-16      Jodenstone    1109
## 79  0:18:29 2014-07-17           Cosmo    1109
## 34  0:18:30 2014-09-07      Jodenstone    1110
## 80  0:18:32 2014-04-26           Cosmo    1112
## 35  0:18:33 2014-10-11      Jodenstone    1113
## 112 0:18:37 2015-06-23        ikswozol    1117
## 36  0:18:38 2014-08-21      Jodenstone    1118
## 37  0:18:39 2014-10-07      Jodenstone    1119
## 81  0:18:40 2014-04-19           Cosmo    1120
## 38  0:18:43 2014-10-02      Jodenstone    1123
## 7   0:18:50 2014-07-20     skater82297    1130
## 8   0:18:51 2014-07-13     skater82297    1131
## 82  0:18:51 2014-03-25           Cosmo    1131
## 9   0:18:52 2014-06-19     skater82297    1132
## 39  0:18:52 2014-08-12      Jodenstone    1132
## 10  0:18:55 2014-05-08     skater82297    1135
## 83  0:18:56 2014-03-17           Cosmo    1136
## 113 0:18:57 2014-11-25        ikswozol    1137
## 114 0:18:59 2014-11-19        ikswozol    1139
## 11  0:19:00 2014-02-28     skater82297    1140
## 12  0:19:05 2014-02-18     skater82297    1145
## 13  0:19:05 2014-02-18     skater82297    1145
## 14  0:19:05 2014-02-18     skater82297    1145
## 15  0:19:06 2014-02-06     skater82297    1146
## 16  0:19:10 2013-12-25     skater82297    1150
## 40  0:19:12 2014-08-09      Jodenstone    1152
## 115 0:19:14 2014-09-02        ikswozol    1154
## 84  0:19:15 2013-08-22           Cosmo    1155
## 41  0:19:16 2014-09-29      Jodenstone    1156
## 92  0:19:19 2015-01-05 Aliensqueakytoy    1159
## 17  0:19:20 2013-12-05     skater82297    1160
## 116 0:19:22 2014-08-01        ikswozol    1162
## 42  0:19:23 2014-05-27      Jodenstone    1163
## 43  0:19:26 2014-04-16      Jodenstone    1166
## 18  0:19:27 2013-12-03     skater82297    1167
## 19  0:19:27 2013-12-03     skater82297    1167
## 44  0:19:27 2014-04-12      Jodenstone    1167
## 45  0:19:27 2014-05-21      Jodenstone    1167
## 117 0:19:27 2014-06-05        ikswozol    1167
## 93  0:19:29 2014-11-28 Aliensqueakytoy    1169
## 46  0:19:32 2014-04-09      Jodenstone    1172
## 20  0:19:33 2013-11-09     skater82297    1173
## 47  0:19:33 2014-04-08      Jodenstone    1173
## 85  0:19:35 2013-08-11           Cosmo    1175
## 48  0:19:37 2014-04-06      Jodenstone    1177
## 118 0:19:39 2014-06-04        ikswozol    1179
## 21  0:19:42 2013-10-15     skater82297    1182
## 94  0:19:46 2014-11-09 Aliensqueakytoy    1186
## 49  0:19:47 2014-04-04      Jodenstone    1187
## 50  0:19:47 2014-05-05      Jodenstone    1187
## 51  0:19:50 2014-03-25      Jodenstone    1190
## 95  0:19:50 2014-10-24 Aliensqueakytoy    1190
## 119 0:19:51 2014-05-14        ikswozol    1191
## 52  0:19:52 2014-03-25      Jodenstone    1192
## 120 0:19:54 2014-05-13        ikswozol    1194
## 53  0:19:56 2014-03-25      Jodenstone    1196
## 22  0:20:03 2013-10-05     skater82297    1203
## 54  0:20:09 2014-03-25      Jodenstone    1209
## 86  0:20:12 2013-08-06           Cosmo    1212
## 55  0:20:14 2014-03-21      Jodenstone    1214
## 121 0:20:21 2014-05-08        ikswozol    1221
## 96  0:20:26 2014-10-22 Aliensqueakytoy    1226
## 97  0:20:29 2014-10-15 Aliensqueakytoy    1229
## 122 0:20:34 2014-05-07        ikswozol    1234
## 56  0:20:38 2014-03-21      Jodenstone    1238
## 98  0:20:41 2014-10-06 Aliensqueakytoy    1241
## 57  0:20:51 2014-03-16      Jodenstone    1251
## 58  0:21:02 2014-09-02      Jodenstone    1262
## 87  0:21:56 2012-11-25           Cosmo    1316
view_record <- function(date="2014-05-01") {
    tmp <- oot_any_parsed[which(oot_any_parsed$Date < date),]
    tmp <- sort(tmp, by = ~ Seconds)
    wr_players <- unique(tmp$Player)
    return_rows <- numeric(0)
    for(player in wr_players) {
        return_rows <- c(return_rows, which(tmp$Player==player)[1])
    }
    tmp[return_rows,]
}

for(year in "2014") {
    for(month in c("04","05","06")) {
        for(day in c("01","02","03","04","05","06","07","08"))
            print(view_record(date=paste0(year,"-",month,"-",day)))
    }
}
##       Time       Date      Player Seconds
## 82 0:18:51 2014-03-25       Cosmo    1131
## 11 0:19:00 2014-02-28 skater82297    1140
## 51 0:19:50 2014-03-25  Jodenstone    1190
##       Time       Date      Player Seconds
## 82 0:18:51 2014-03-25       Cosmo    1131
## 11 0:19:00 2014-02-28 skater82297    1140
## 51 0:19:50 2014-03-25  Jodenstone    1190
##       Time       Date      Player Seconds
## 82 0:18:51 2014-03-25       Cosmo    1131
## 11 0:19:00 2014-02-28 skater82297    1140
## 51 0:19:50 2014-03-25  Jodenstone    1190
##       Time       Date      Player Seconds
## 82 0:18:51 2014-03-25       Cosmo    1131
## 11 0:19:00 2014-02-28 skater82297    1140
## 51 0:19:50 2014-03-25  Jodenstone    1190
##       Time       Date      Player Seconds
## 82 0:18:51 2014-03-25       Cosmo    1131
## 11 0:19:00 2014-02-28 skater82297    1140
## 49 0:19:47 2014-04-04  Jodenstone    1187
##       Time       Date      Player Seconds
## 82 0:18:51 2014-03-25       Cosmo    1131
## 11 0:19:00 2014-02-28 skater82297    1140
## 49 0:19:47 2014-04-04  Jodenstone    1187
##       Time       Date      Player Seconds
## 82 0:18:51 2014-03-25       Cosmo    1131
## 11 0:19:00 2014-02-28 skater82297    1140
## 48 0:19:37 2014-04-06  Jodenstone    1177
##       Time       Date      Player Seconds
## 82 0:18:51 2014-03-25       Cosmo    1131
## 11 0:19:00 2014-02-28 skater82297    1140
## 48 0:19:37 2014-04-06  Jodenstone    1177
##       Time       Date      Player Seconds
## 80 0:18:32 2014-04-26       Cosmo    1112
## 11 0:19:00 2014-02-28 skater82297    1140
## 43 0:19:26 2014-04-16  Jodenstone    1166
##       Time       Date      Player Seconds
## 80 0:18:32 2014-04-26       Cosmo    1112
## 11 0:19:00 2014-02-28 skater82297    1140
## 43 0:19:26 2014-04-16  Jodenstone    1166
##       Time       Date      Player Seconds
## 80 0:18:32 2014-04-26       Cosmo    1112
## 11 0:19:00 2014-02-28 skater82297    1140
## 43 0:19:26 2014-04-16  Jodenstone    1166
##       Time       Date      Player Seconds
## 80 0:18:32 2014-04-26       Cosmo    1112
## 11 0:19:00 2014-02-28 skater82297    1140
## 43 0:19:26 2014-04-16  Jodenstone    1166
##       Time       Date      Player Seconds
## 80 0:18:32 2014-04-26       Cosmo    1112
## 11 0:19:00 2014-02-28 skater82297    1140
## 43 0:19:26 2014-04-16  Jodenstone    1166
##       Time       Date      Player Seconds
## 80 0:18:32 2014-04-26       Cosmo    1112
## 11 0:19:00 2014-02-28 skater82297    1140
## 43 0:19:26 2014-04-16  Jodenstone    1166
##       Time       Date      Player Seconds
## 80 0:18:32 2014-04-26       Cosmo    1112
## 11 0:19:00 2014-02-28 skater82297    1140
## 43 0:19:26 2014-04-16  Jodenstone    1166
##        Time       Date      Player Seconds
## 80  0:18:32 2014-04-26       Cosmo    1112
## 11  0:19:00 2014-02-28 skater82297    1140
## 43  0:19:26 2014-04-16  Jodenstone    1166
## 122 0:20:34 2014-05-07    ikswozol    1234
##        Time       Date      Player Seconds
## 80  0:18:32 2014-04-26       Cosmo    1112
## 10  0:18:55 2014-05-08 skater82297    1135
## 42  0:19:23 2014-05-27  Jodenstone    1163
## 119 0:19:51 2014-05-14    ikswozol    1191
##        Time       Date      Player Seconds
## 80  0:18:32 2014-04-26       Cosmo    1112
## 10  0:18:55 2014-05-08 skater82297    1135
## 42  0:19:23 2014-05-27  Jodenstone    1163
## 119 0:19:51 2014-05-14    ikswozol    1191
##        Time       Date      Player Seconds
## 80  0:18:32 2014-04-26       Cosmo    1112
## 10  0:18:55 2014-05-08 skater82297    1135
## 42  0:19:23 2014-05-27  Jodenstone    1163
## 119 0:19:51 2014-05-14    ikswozol    1191
##        Time       Date      Player Seconds
## 80  0:18:32 2014-04-26       Cosmo    1112
## 10  0:18:55 2014-05-08 skater82297    1135
## 42  0:19:23 2014-05-27  Jodenstone    1163
## 119 0:19:51 2014-05-14    ikswozol    1191
##        Time       Date      Player Seconds
## 80  0:18:32 2014-04-26       Cosmo    1112
## 10  0:18:55 2014-05-08 skater82297    1135
## 42  0:19:23 2014-05-27  Jodenstone    1163
## 118 0:19:39 2014-06-04    ikswozol    1179
##        Time       Date      Player Seconds
## 80  0:18:32 2014-04-26       Cosmo    1112
## 10  0:18:55 2014-05-08 skater82297    1135
## 42  0:19:23 2014-05-27  Jodenstone    1163
## 117 0:19:27 2014-06-05    ikswozol    1167
##        Time       Date      Player Seconds
## 80  0:18:32 2014-04-26       Cosmo    1112
## 10  0:18:55 2014-05-08 skater82297    1135
## 42  0:19:23 2014-05-27  Jodenstone    1163
## 117 0:19:27 2014-06-05    ikswozol    1167
##        Time       Date      Player Seconds
## 80  0:18:32 2014-04-26       Cosmo    1112
## 10  0:18:55 2014-05-08 skater82297    1135
## 42  0:19:23 2014-05-27  Jodenstone    1163
## 117 0:19:27 2014-06-05    ikswozol    1167