// set up GOW namespaces
var GOW = GOW || {};
GOW.pages = GOW.pages || {};
GOW.pages.ageGate = GOW.pages.ageGate || {};

var ageGate = GOW.pages.ageGate;
ageGate.jq = {};
ageGate.visualStates = {};

ageGate.visualStates.SHOW_AGE_GATE = "showAgeGate";
ageGate.visualStates.SHOW_SILVERLIGHT_PROMPT = "showSilverlightPrompt";

  ///////////////////
 // GLOBAL EVENTS //
///////////////////

// JQuery Document Ready Handler
$(document).ready(function()
{
    if(Silverlight){Silverlight.onSilverlightInstalled = ageGate.onSilverlightInstalled;}

    ageGate.jq.dobInputs           = $("#dob-form input");
    ageGate.jq.dobForm             = $("#dob-form");
    ageGate.jq.dobFormSubmitButton = $("#dob-form button");
    ageGate.jq.ageGateContainer    = $("#age-gate-container");
    ageGate.jq.slPromptContainer   = $("#sl-dl-container");
    ageGate.jq.formError           = $("#form-error");
    ageGate.jq.slInstallButton     = $(".dl-sl-btn");
    ageGate.jq.gotoHtmlButton      = $(".goto-html-btn");

    ageGate.jq.dobForm.submit(ageGate.onDobFormSubmit);
    ageGate.jq.dobFormSubmitButton.click(ageGate.onDobFormSubmit);
    ageGate.jq.slInstallButton.click(ageGate.onSlInstallClick);
    ageGate.jq.dobInputs.click(ageGate.onInputsClick);
    ageGate.jq.gotoHtmlButton.click(ageGate.onGotoHtmlClick);

    // init ageGate
    ageGate.init();
})

  ////////////////////
 // INITIALIZATION //
////////////////////
ageGate.init = function()
{
    // create min age for validation later;
    GOW.minDate = new Date();
    GOW.minDate.setFullYear(GOW.minDate.getFullYear() - GOW.minAge);

    new GOW.LangMenu(ageGate.onLangChanged);
}

  //////////////////////////
 // SILVERLIGHT HANDLERS //
//////////////////////////
ageGate.onSilverlightInstalled = function()
{
    ageGate.submitForm();
}
  ////////////////////////////
 // JQUERY EVENT LISTENERS //
////////////////////////////
ageGate.onGotoHtmlClick = function(e)
{
    e.stopImmediatePropagation();
    e.preventDefault();

    ageGate.submitForm();
}
ageGate.onInputsClick = function(e)
{
    // clear defalut value
    $(e.target).select().val("");
}
ageGate.onLangChanged = function(location){
    var month = $('input:text[name = month]').val(), 
        day = $('input:text[name = day]').val(),
        year = $('input:text[name = year]').val(),
        url = location + '&month=' + month + '&day=' + day + '&year=' + year;
    
    log(url);
    var currentLocation = window.location.href;
    if(currentLocation !== location){
        window.location.href = location;
    }
}
ageGate.onDobFormSubmit = function(e)
{
    if(e){e.stopImmediatePropagation();}
    if(e){e.preventDefault();}
    
    ageGate.ageValidationResult = ageGate.validateAge();

    var is_validDate = ageGate.ageValidationResult.is_validDate;
    var is_validAge = ageGate.ageValidationResult.is_validAge;

    /* 
     * Validation Logic:
     * valid date?
     *  <> yes:
     *   |  - valid age?
     *   |      <> yes: 
     *   |       |  - has silverlight?
     *   |       |      <> yes:
     *   |       |       |  - submit form
     *   |       |      <> no:
     *   |       |          - hide age gate ui
     *   |       |          - show silverlight download ui
     *   |      <> no:
     *   |          - submit form
     *  <> no:
     *      - update form to show error
     */

    if(is_validDate)
    {
        if(is_validAge)
        {
            if(GOW.utils.has_silverlightEx())
            {
                ageGate.submitForm();
            }
            else
            {
                ageGate.gotoState(ageGate.visualStates.SHOW_SILVERLIGHT_PROMPT);
            }
        }
        else
        {
            ageGate.submitForm();
        }
    }
    else
    {
        // TODO: Implement; update form with useful info
        var error = ageGate.ageValidationResult.dateError;
        ageGate.showFormError(error);
    }
}
ageGate.onSlInstallClick = function(e)
{
    if(Silverlight)
    {
        // "" requests latest version
        Silverlight.getSilverlight("");
    }
}

  ////////////////////
 // HELPER METHODS //
////////////////////
ageGate.validateAge = function()
{
    var result = {is_validAge: false, 
                  is_validDate:false, 
                  dateError:GOW.utils.dateError.NO_ERROR, 
                  dateTime:undefined};

    var dateValidationResult = GOW.utils.validateDate(ageGate.extractDateFromFields().dateString);
    result.is_validDate = dateValidationResult.is_valid;
    result.dateError = dateValidationResult.error;
    result.dateTime = dateValidationResult.dateTime;

    if(dateValidationResult.is_valid)
    {
        result.is_validAge = (dateValidationResult.dateTime.getTime() < GOW.minDate.getTime()) ? true : false;
    }

    return result;
}
ageGate.extractDateFromFields = function()
{
    var result = {};
    var fields = ageGate.jq.dobForm.serializeArray();
    var len = fields.length;
    
    for(var i=0; i<len; i++)
    {
        // check for fields; add value to result;
        switch(fields[i].name)
        {
            case "month":
                result.month = fields[i].value;
                break;
            case "day":
                result.day = fields[i].value;
                break;
            case "year":
                result.year = fields[i].value;
                break;
            default:
                break;
        }
    }

    // construct a date string from field values; later to be sent to server
    result.dateString = String.format("{0}/{1}/{2}", result.month, result.day, result.year);
    return result;
}
ageGate.gotoState = function(state)
{
    switch(state)
    {
        case ageGate.visualStates.SHOW_AGE_GATE:
            ageGate.jq.ageGateContainer.toggle();
            ageGate.jq.slPromptContainer.toggle();
            break;
        case ageGate.visualStates.SHOW_SILVERLIGHT_PROMPT:
            ageGate.jq.ageGateContainer.toggle();
            ageGate.jq.slPromptContainer.toggle();
            break;
        default:
            break;
    }
}
ageGate.submitForm = function()
{
    document.forms["dob-form"].submit();
}
ageGate.showFormError = function(error)
{
    // console.log("showFormError");
    //ageGate.jq.formError.animate({top: "-7"}, 200);
    //ageGate.jq.formError.text(error);
    ageGate.jq.formError.removeClass("invisible");
}
ageGate.hideFormError = function(error)
{
    cosole.log("hideFormError");
    //ageGate.jq.formError.animate({top:"-107"}, 200);
    //ageGate.jq.formError.text(error);
    ageGate.jq.formError.addClass("invisible");
}
