﻿/// <reference path='jquery-1.4.1.js' />

// Author: Bradley Teston
var map;
var geocoder;
var displayed = false;
var marker;
var locIsGood = false; // google maps successfully looked that location up.
var lat_val;   // lat long
var long_val;

/* Just a handy copy of a function for removing markers
function clearMarkers(){ 
  for(var i=0; i<markers.length; i++){ 
    markers[i].setMap(null); 
    markers[i] = null; 
  } 
  markers.length = 0;
*/
var latlongDiv;

function display_map() 
{
    if (displayed) // if map div is already displayed just clear the marker(s)
    {
        //map.clearOverlays();
    }
    else {

        $('map_div').slideDown(400, function() {
            
        });
    }
    displayed = true;
}
function getAddress(addr) // Here I'm testing the google geocoding api
{
    latlongDiv = document.getElementById('latlongHolder');
    display_map();
    var result = "";
    //var addr = document.getElementById('Address').value;
    //var spanR = document.getElementById('latlng_span');
    var addr_array = addr.split(' ');
    //addr = "stuff";
    var i = 0;
    var len = addr_array.length;
    for (i = 0; i < len; i++) // replace spaces with '+' while rebuilding address string
    {
        result += addr_array[i];
        if (i < (len - 1))
            result += '+';
    }
    //spanR.innerHTML = result;

    geocoder.geocode({ 'address': result }, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            map.setCenter(results[0].geometry.location);
            if (marker != null)
                marker.setMap(null);
            marker = null;
            marker = new google.maps.Marker({
                map: map,
                position: results[0].geometry.location
            });
            var latlong = results[0].geometry.location;
            lat_val = latlong.lat();
            long_val = latlong.lng();
            //latlongDiv.innerHTML = "Latitude: " + latlong.lat() + "  Longitude: " + latlong.lng();
            locIsGood = true;

            submit_final();
        }
        else {
            locIsGood = false;
            alert("The address entered is invalid. \nError Details:\n" + status);
        }
    });
    
}


function map_init() // initialize the map
{
    geocoder = new google.maps.Geocoder();
    var latlng = new google.maps.LatLng(-34.5, 143.55);
    var options = {
        zoom: 6,
        center: latlng,
        mapTypeId: google.maps.MapTypeId.HYBRID
    };
    var mapDiv = document.getElementById('map_div');
    map = new google.maps.Map(mapDiv, options);
    //var spanR = document.getElementById('latlng_span').innerHTML = "testing";
    
}
var userBox;
var passBox;
var emailBox;
var locBox;
var i;
// true passes check, false fails check
function hasLettersAndNumbers(pass) {
    var alpha = false;
    var num = false;
    for (i = 0; i < pass.length; i++)
    {
        if (isNaN(pass.charAt(i))) // if NaN
        {
            alpha = true;
        }
        else
            num = true;
    }
    return alpha && num;
}
function badCharCheck(field)
{
    for (i = 0; i < field.length; i++)
    {
        if (!badCharSingle(field.charAt(i)))
        {
            return false;
        }
    }
    return true;
}
function badCharSingle(cc) {
    if ((cc == '<') || (cc == '>') || (cc == '(') || (cc == ')') || (cc == '+') || (cc == '?') ||
        (cc == '/') || (cc == '\\') || (cc == '\'')||(cc == '\"')||(cc == "~")||(cc == "`")) //
    {
        
        return false;
    }
    return true;
}
function checkField(field) 
{
    if ((field == null) || (field == "")) // fail
        return false;
    return true;
}
function checkUser(user)
{
    if (!checkField(user))
        return false;
    if (!badCharCheck(user))
        return false;
    return true;
}
function checkPass(pass) {
    if ((pass == null) || (pass.length < 6)) {
        //alert("pass failed: " + pass);
        return false;
    }
    if (!badCharCheck(pass))
        return false;
    if (!hasLettersAndNumbers(pass))
        return false;
    return true;
}
function checkEmail(email_in) {
    var email_regexp = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;
    return email_regexp.test(email_in);
}
function reg_submit() {
    // Order of operations...
    //       Check to see that all the fields are sufficiently filled up.
    //       Validate username.
    //       Geocode street address and open map view.
    //       Post to database.
    userBox = document.getElementById('UserBox').value;
    passBox = document.getElementById('PassBox').value;
    emailBox = document.getElementById('EmailBox').value;
    locBox = document.getElementById('AddrBox').value;
    var userPassed = false;
    var passPassed = false;
    var emailPassed = false;
    var locPassed = false;
    userPassed = checkUser(userBox);
    passPassed = checkPass(passBox);
    emailPassed = checkEmail(emailBox);
    locPassed = checkField(locBox);
    if (!(userPassed && passPassed && locPassed && emailPassed)) {
        // Inform the user of the parts that failed.
        alert("something's not filled in or valid");
        return;
    }
    //var userdata = {'username':''+userBox};
    $.ajax({
        type: "POST",
        url: "RegService.asmx/CheckUser",
        contentType: "application/json; charset=utf-8",
        data: "{'username':'" + userBox + "'}",
        dataType: "json",
        success: userPassedCheck,
        error: (function(result) //
        {
            userWarning.innerHTML = "The username '" + userBox + "' is already in use.";
        })
    });
    /*
    if (!userPassed) 
    {
        userWarning.innerHTML = "The username '"+userBox+"' is already in use.";
        return;
    }
    if(map == null)
        map_init(); // init the map
    getAddress(locBox); // mark that address
    if (!locIsGood)
        return;
    $.ajax({
        type: "POST",
        url: "RegService.asmx/CheckUser",
        contentType: "application/json; charset=utf-8",
        data: "{'username':'" + userBox + "'}",
        dataType: "json",
        success: (function(msg) {
            userPassed = msg.d;
        }),
        error: AjaxFailed
    });
    */
}
function userPassedCheck(msg) {
    if (!msg.d) {
        document.getElementById('userWarning').innerHTML = "The username '" + userBox + "' is already in use.";
        return;
    }
    if (map == null)
        map_init(); // init the map
    getAddress(locBox); // mark that address

}
function submit_final() {
    if (!locIsGood) {
        return;
    }
    $.ajax({
        type: "POST",
        url: "RegService.asmx/Submit",
        contentType: "application/json; charset=utf-8",
        data: "{'username':'" + userBox + "'," +
               "'password':'" + passBox + "'," +
               "'email':'"+ emailBox + "'," +
               "'first':'" + "'," +
               "'last':'" + "'," +
               "'showName':'" + false + "'," +
               "'address':'" + locBox + "'," +
               "'latitude':'" + lat_val + "'," +
               "'longitude':'" + long_val + "'," +
               "'activityList':'" + "'" +
        "}",
        dataType: "json",
        success: (function(msg) {
            alert((msg.d == "") ? "entry successful" : "entry failed: \n\n"+msg.d);
        }),
        error: AjaxFailed
    });
}
function AjaxFailed(result) 
{  
    alert(result.status + " " + result.statusText);
}
function reg_reload()
{
    // Browser cookie point at this page.
    createCookie("Page", "registration", 10);
    // clear the fields.
    document.getElementById('UserBox').value = "";
    document.getElementById('PassBox').value = "";
    document.getElementById('EmailBox').value = "";
    document.getElementById('AddrBox').value = "";
    document.getElementById('userWarning').innerHTML = "";
    document.getElementById('passWarning').innerHTML = "(at least 6 characters long)";
    document.getElementById('emailWarning').innerHTML = "";
    document.getElementById('addrWarning').innerHTML = "";

    // hide the map.
    document.getElementById('map_div').style.display = "none";
    displayed = false;
}
/*
function service_init() {
    //service.useService("RegService.asmx");
}
service_init();
*/
