﻿/// <reference path="../ActivityDataAccess.js" />
/// <reference path="../AgilityData.js" />


Agility.RegisterNamespace("Subaru.NewsletterSignup");

(function(NewsletterSignup) {

    var _randomQueryString = "";
    var _thankyouMessage = "";
    var _invalidEmailMessage = "";
    var ActivitySubmissionConfirmationDialog = null;
    var _watermarkLabel = "";

    NewsletterSignup.Init = function(thankyouMessage, watermarkLabel, invalidEmailMessage) {
        _thankyouMessage = thankyouMessage;
        _watermarkLabel = watermarkLabel;
        _invalidEmailMessage = invalidEmailMessage;

        setTimeout("Subaru.NewsletterSignup.SetWatermark()", 2000);

        if (NewsletterSignup.SubmitActivityOpen()) {

            var user = null;
            if (window.location.href.indexOf("&User=") > -1) {
                user = window.location.href.substring(window.location.href.indexOf("&User=") + 6);
            }
            _removeSubmitActivityHash();
            NewsletterSignup.AuthenticateOrSubmitActivity(user);
        }
    };

    NewsletterSignup.SetWatermark = function() {
        $("#txtNewsletterSignupEmail").watermark(_watermarkLabel);
    };

    NewsletterSignup.SubmitActivity = function() {
        _showSubmissionDialog();
        Subaru.MapUtils.HideContextMenu();
    };

    NewsletterSignup.AuthenticateOrSubmitActivity = function(user) {
        if (Subaru.ContextUtil.IsAuthenticated()) {
            _showSubmissionDialog();
        } else {
            Subaru.Controls.Login.OnPopupLogin(null, _showSubmissionDialog, user);
        }
    };

    $(function() {
        var d = new Date();
        _randomQueryString = d.getFullYear() + d.getMonth() + d.getDate() + d.getHours() + d.getMinutes() + d.getSeconds();

        var lnkLaunchActivitySubmission = $("#lnkLaunchActivitySubmission");
        $("h1", lnkLaunchActivitySubmission.parent()).click(NewsletterSignup.AuthenticateOrSubmitActivity);

        lnkLaunchActivitySubmission.click(NewsletterSignup.AuthenticateOrSubmitActivity);

        $("#txtNewsletterSignupEmail").keydown(function(event) {
            if (event.keyCode == 13) {
                NewsletterSignup.SubmitEmail();
                return false;
            }
        });

        $("#pnlActivitySubmission").dialog({
            autoOpen: false,
            modal: true,
            closeText: 'hide',
            dialogClass: 'ActivitySubmissionDialog',
            title: "",
            resizable: false
        });

        ActivitySubmissionConfirmationDialog = $("#pnlActivitySubmissionConfirmation").dialog({
            autoOpen: false,
            modal: true,
            closeText: 'hide',
            dialogClass: 'ForgotPasswordDialog Confirmation1',
            title: "",
            resizable: false,
            close: function() {
                location.hash = "#";
            }
        });
    });

    function _showSubmissionDialog() {

        Subaru.MapUtils.ClearAllMapData();
        Subaru.TemplateUtils.LoadDefaultScreen();
        Subaru.TemplateUtils.CloseAllDialogs();

        $("#pnlActivitySubmission").html('<div class="SubmitActivityHeader">&nbsp;</div><div class="SubmitActivityContainer" style="height: 500px"><div class="Spinner"></div></div><div class="SubmitActivityFooter">&nbsp;</div>');

        $("#pnlActivitySubmission").dialog("open");
        setTimeout(function() {
            $(window).resize();
        }, 100);

        var url = Agility.ResolveUrl("~/Dialogs/ActivitySubmission.aspx?r=" + _randomQueryString);

        $("#pnlActivitySubmission").load(url, function(responseText, textStatus, XMLHttpRequest) {

            if (responseText == "error") {
                //alert(XMLHttpRequest.status + ' ' + textStatus);
                //alert(XMLHttpRequest.responseText);
                return;
            }

            jQuery("#pnlActivitySubmission .SubmitActivity").keydown(function(event) {
                if (event.keyCode == 13) {

                    if (event.originalTarget == null || event.originalTarget.nodeName.toLowerCase() != "textarea") {
                        _doActivitySubmission();
                        return false;
                    }
                }
            });

            $("#pnlActivitySubmission .btnCancel").click(function() {
                _showSubmissionDialog();
            });

            $("#pnlActivitySubmission .btnSubmit").click(function() {
                _doActivitySubmission();
            });

            Agility.UGC.API.GetAllRecordTypes(function(dRecordTypes) {

                if (dRecordTypes.ResponseType == Agility.UGC.API.ResponseType.OK) {

                    var lstRecordTypes = $.grep(dRecordTypes.ResponseData, function(elem, index) {
                        return elem.Name == "ActivityFileMedia";
                    });

                    Agility.UGC.API.GetRecordType(lstRecordTypes[0].ID, function(dRecordType) {
                        if (dRecordType.ResponseType == Agility.UGC.API.ResponseType.OK) {
                            var recordType = dRecordType.ResponseData;
                            //populate the uploads

                            Subaru.SubmitActivity.ActivityPhotos = [];

                            NewsletterSignup.RenderAttachment(recordType.FieldTypes,
								"Image1",
								"txtActivityPhoto_SubmitActivity",
								"pnlActivityPhoto_SubmitActivity",
								"pnlActivityPhotoProgress_SubmitActivity",
								Subaru.SubmitActivity.ActivityPhotos,
								4,
								"pnlActivityPhotoList_SubmitActivity",
								Subaru.NewsletterSignup.UpdateActivityPhotoPanel);

                            //map
                            NewsletterSignup.RenderAttachment(recordType.FieldTypes,
								"PDFDocument",
								"txtActivityMap_SubmitActivity",
								"pnlActivityMap_SubmitActivity",
								"pnlActivityMapa_SubmitActivity");

                            //video
                            NewsletterSignup.RenderAttachment(recordType.FieldTypes,
								"Video",
								"txtActivityVideo_SubmitActivity",
								"pnlActivityVideo_SubmitActivity",
								"pnlActivityVideoa_SubmitActivity");
                        }
                    });
                }
            });
        });
    };

    NewsletterSignup.UpdateActivityPhotoPanel = function(panelId, items) {

        var html = "";

        if (items.length > 0) {
            for (var i = 0; i < items.length; i++) {

                html += "<div>";
                html += "<span>" + items[i].FileName + "</span>";
                html += "<input type='text' value='" + items[i].Caption + "' onblur='Subaru.SubmitActivity.UpdateActivityPhotoCaption(" + i + ", this)' />";
                html += "<span class='DeletePhoto' onclick='Subaru.SubmitActivity.RemoveActivityPhoto(" + i + ")'>" + $("#hdnRemovePhotoText").val() + "</span>";
                html += "</div>";
            }
        }

        $("#" + panelId).html(html);
    }

    NewsletterSignup.RenderAttachment = function(allFieldTypes, fieldName, inputID, panelID, progressPanelID, items, maxItems, listPanelId, updateFunction) {

        var fieldTypes = $.grep(allFieldTypes, function(elem, index) {
            return elem.Name == fieldName;
        });

        //fieldName, inputID, fieldType  fieldPanel, swfUploadUrl, beforeUpload, uploadComplete, uploadError, uploadProgress, uploadButtonImageUrl, uploadButtonImageHeight, uploadButtonImageWidth, </param>        
        Agility.UGC.API.GetAmazonS3Form({
            fieldname: fieldName,
            inputID: inputID,
            fieldType: fieldTypes[0],
            fieldPanel: $("#" + panelID),
            swfUploadUrl: Agility.ResolveUrl("~/Scripts/SwfUpload/swfupload.swf"),
            uploadButtonImageUrl: "http://getoutmore.s3.amazonaws.com/Buttons/" + Agility_LanguageCode + "/btnUpload.png",
            uploadButtonImageHeight: 21,
            uploadButtonImageWidth: 98,
            beforeUpload: function(fileName, mime, filesize, uploader) {
                //before upload
                //show the progress...

                if ((items != null) && (maxItems != null) && (items.length >= maxItems)) {
                    return false;
                }

                $("#" + progressPanelID).html('<div class="UploadProgressContainer"><div class="UploadProgress"></div></div>');

                var percent = "50%";
                if (uploader != undefined && uploader != null) {
                    percent = "0%";
                }

                $("#" + progressPanelID + " .UploadProgress").css("width", percent);

            },
            uploadComplete: function(key, filesize) {
                //upload complete

                //hide the progress...
                var index = key.lastIndexOf("\\");
                if (index == -1) index = key.lastIndexOf("/");
                var fileName = key.substring(index + 1);

                $("#" + inputID).val(key);

                if ((listPanelId == null) || (items == null) || (updateFunction == null)) {

                    $("#" + progressPanelID).html("&nbsp;&nbsp;" + fileName);
                } else {

                    $("#" + progressPanelID).html("");
                    items.push({ Url: key, FileName: fileName, Caption: "" });
                    updateFunction(listPanelId, items);
                }
            },
            uploadError: function(file, errorCode, message) {
                //upload error...

                //hide the progress

                var html = "An error occurred.";

                //determine the message...
                switch (errorCode) {
                    case SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT:
                        html = "Please choose a file less than or equal to " + fieldType.MaxLength + "kb";
                        break;
                    case SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE:
                        html = "Please choose a file greater than zero bytes.";
                        break;
                    case SWFUpload.QUEUE_ERROR.INVALID_FILETYPE:
                    case SWFUpload.UPLOAD_ERROR.FILE_VALIDATION_FAILED:
                        html = fieldType.ValidationMessage;
                        break;

                    case SWFUpload.UPLOAD_ERROR.HTTP_ERROR:
                    case SWFUpload.UPLOAD_ERROR.IO_ERROR:
                    case SWFUpload.UPLOAD_ERROR.UPLOAD_FAILED:
                    case SWFUpload.UPLOAD_ERROR.UPLOAD_LIMIT_EXCEEDED:
                    case SWFUpload.UPLOAD_ERROR.SPECIFIED_FILE_ID_NOT_FOUND:
                    case SWFUpload.UPLOAD_ERROR.IO_ERROR:
                        html = "An error occurred while uploading the file.  Please check your connection and try again."
                        break;
                    case SWFUpload.UPLOAD_ERROR.SECURITY_ERROR:
                        html = "An error occurred while uploading the file.  You may need to add the crossdomain.xml file to your Amazon S3 bucket.";
                        break;
                    case SWFUpload.UPLOAD_ERROR.FILE_CANCELLED:
                    case SWFUpload.UPLOAD_ERROR.UPLOAD_STOPPED:
                        //ignore these errors...
                        break;
                    default:
                        html = message;
                        break;
                }

                $("#" + progressPanelID).html(html);

            },
            uploadProgress: function(file, bytesLoaded) {

                //progress...
                var percent = Math.ceil((bytesLoaded / file.size) * 100);

                $("#" + progressPanelID + " .UploadProgress").css("width", percent + "%");
            }

        });
    }

    function _doActivitySubmission() {

        $("#spnPinError").hide();

        var isValid = true;
        var type = $("#ddlActivityType_SubmitActivity").val();
        var title = Subaru.AgilityData.HTMLFilter($("#txtActivityTitle_SubmitActivity").val());
        var pin = $("#txtActivityPin_SubmitActivity").val();
        var desc = Subaru.AgilityData.HTMLFilter($("#txtActivityDesc_SubmitActivity").val());
        var tags = Subaru.AgilityData.HTMLFilter($("#txtActivityTags_SubmitActivity").val());
        var distance = $("#txtActivityDistance_SubmitActivity").val();
        var duration = $("#txtActivityDuration_SubmitActivity").val();

        var spring = $("#chkSpring_SubmitActivity").is(':checked');
        var summer = $("#chkSummer_SubmitActivity").is(':checked');
        var autumn = $("#chkAutumn_SubmitActivity").is(':checked');
        var winter = $("#chkWinter_SubmitActivity").is(':checked');
        var snapToRoads = $("#chkRouteControlSnapToRoads").is(":checked");

        var startAddress = Subaru.AgilityData.HTMLFilter($("#txtFoundStartLocation_SubmitActivity").val());

        var startProvince = "";
        var startAddressLower = startAddress.toLowerCase();
        for (var i = 0; i < Subaru.AgilityData.Provinces.length; i++) {
            if ((startAddressLower.indexOf(Subaru.AgilityData.Provinces[i].Name.toLowerCase()) > -1) || (startAddress.indexOf(Subaru.AgilityData.Provinces[i].IsoCode)) > -1) {
                startProvince = Subaru.AgilityData.Provinces[i].ProvinceID;
                break;
            }
        }

        var photo1 = "";
        var photo1Caption = "";
        var photo2 = "";
        var photo2Caption = "";
        var photo3 = "";
        var photo3Caption = "";
        var photo4 = "";
        var photo4Caption = "";

        if (Subaru.SubmitActivity.ActivityPhotos.length > 0) {

            if (Subaru.SubmitActivity.ActivityPhotos[0] != null) {
                photo1 = Subaru.SubmitActivity.ActivityPhotos[0].Url;
                photo1Caption = Subaru.AgilityData.HTMLFilter(Subaru.SubmitActivity.ActivityPhotos[0].Caption);
            }

            if (Subaru.SubmitActivity.ActivityPhotos[1] != null) {
                photo2 = Subaru.SubmitActivity.ActivityPhotos[1].Url;
                photo2Caption = Subaru.AgilityData.HTMLFilter(Subaru.SubmitActivity.ActivityPhotos[1].Caption);
            }

            if (Subaru.SubmitActivity.ActivityPhotos[2] != null) {
                photo3 = Subaru.SubmitActivity.ActivityPhotos[2].Url;
                photo3Caption = Subaru.AgilityData.HTMLFilter(Subaru.SubmitActivity.ActivityPhotos[2].Caption);
            }

            if (Subaru.SubmitActivity.ActivityPhotos[3] != null) {
                photo4 = Subaru.SubmitActivity.ActivityPhotos[3].Url;
                photo4Caption = Subaru.AgilityData.HTMLFilter(Subaru.SubmitActivity.ActivityPhotos[3].Caption);
            }
        }

        var map = $("#txtActivityMap_SubmitActivity").val();

        var video = $("#txtActivityVideo_SubmitActivity").val();


        //validate req fields
        $("#pnlActivitySubmission label[for='ddlActivityType_SubmitActivity']").parent("div").attr("className", "Label");
        if (type == "") {
            isValid = false;
            $("#pnlActivitySubmission label[for='ddlActivityType_SubmitActivity']").parent("div").attr("className", "RequiredLabel");
        }

        $("#pnlActivitySubmission label[for='txtActivityTitle_SubmitActivity']").parent("div").attr("className", "Label");
        if ($.trim(title) == "") {
            isValid = false;
            $("#pnlActivitySubmission label[for='txtActivityTitle_SubmitActivity']").parent("div").attr("className", "RequiredLabel");
        }

        $("#pnlActivitySubmission label[for='txtActivityDesc_SubmitActivity']").parent("div").attr("className", "Label");
        if ($.trim(desc) == "") {
            isValid = false;
            $("#pnlActivitySubmission label[for='txtActivityDesc_SubmitActivity']").parent("div").attr("className", "RequiredLabel");
        }

        $("#pnlActivitySubmission label[for='txtActivityTags_SubmitActivity']").parent("div").attr("className", "Label");
        if ($.trim(tags) == "") {
            isValid = false;
            $("#pnlActivitySubmission label[for='txtActivityTags_SubmitActivity']").parent("div").attr("className", "RequiredLabel");
        }

        $("#pnlActivitySubmission label[for='txtActivityDistance_SubmitActivity']").parent("div").attr("className", "Label");
        if ($.trim(distance) != "" && isNaN(parseFloat(distance))) {
            isValid = false;
            $("#pnlActivitySubmission label[for='txtActivityDistance_SubmitActivity']").parent("div").attr("className", "RequiredLabel");
        }

        $("#pnlActivitySubmission label[for='txtActivityDuration_SubmitActivity']").parent("div").attr("className", "Label");
        if ($.trim(duration) != "" && isNaN(parseFloat(duration))) {
            isValid = false;
            $("#pnlActivitySubmission label[for='txtActivityDuration_SubmitActivity']").parent("div").attr("className", "RequiredLabel");
        }

        if (!$("#cbIAgree_SubmitActivity").is(':checked')) {
            isValid = false;
        }

        if ((Subaru.SubmitActivity.Route == null) || (Subaru.SubmitActivity.Route.points == null) && (Subaru.SubmitActivity.Route.points.length < 1)) {
            isValid = false;
        }

        // Create the Records ready to save....
        var activityRecord = null;
        var detailsRecord = null;
        var mediaRecord = null;

        if (isValid) {

            activityRecord = {
                RecordTypeName: "Activity",
                Title: title,
                TypeID: type,
                ProvinceID: startProvince,
                Tags: tags,
                PrimaryImage: ((photo1 == "") ? "subaru_logo.jpg" : photo1),
                SubmittedBy: $("#pnlLoginArea .Username").html(),
                SubmittedByUserID: Subaru.ContextUtil.CurrentUserID,
                StartLatitude: Subaru.SubmitActivity.Route.points[0].Latitude,
                StartLongitude: Subaru.SubmitActivity.Route.points[0].Longitude,
                WinterGames : false
            }

            detailsRecord = {
                RecordTypeName: "ActivityDetails",
                ActivityID: -1,
                Description: desc,
                Distance: parseFloat(distance),
                Address: startAddress,
                City: "",
                PostalCode: "",
                AdditionalFieldData: "",
                Duration: parseFloat(duration),
                IdealForSpring: spring,
                IdealForSummer: summer,
                IdealForAutumn: autumn,
                IdealForWinter: winter,
                SnapToRoads: snapToRoads
            };

            mediaRecord = {
                RecordTypeName: "ActivityFileMedia",
                ActivityID: -1,
                Image1: photo1,
                Image1Caption: photo1Caption,
                Image2: photo2,
                Image2Caption: photo2Caption,
                Image3: photo3,
                Image3Caption: photo3Caption,
                Image4: photo4,
                Image4Caption: photo4Caption,
                Video: video,
                VideoLanguageCode: Agility_LanguageCode,
                PDFDocument: map
            };
        }

        if (pin.length > 0) {

            var pinSearchArgs = {
                RecordTypeName: "ContestPIN",
                PageSize: 1,
                RecordOffset: 0,
                Search: "PIN = '" + pin + "'"
            }

            Agility.UGC.API.SearchRecords(pinSearchArgs, function(data) {
                
                if ((data.ResponseType != Agility.UGC.API.ResponseType.OK) || (data.ResponseData.Records.length < 1)) {
                
                    isValid = false;
                    $("#spnPinError").show();
                } else {

                    activityRecord.WinterGames = true;
                }

                if (!isValid) {
            
                    _displayError();
                } else {

                    _saveDataToUgc(activityRecord, detailsRecord, mediaRecord);        
                }
            });
        } else {

            if (!isValid) {
            
                _displayError();
            } else {

                _saveDataToUgc(activityRecord, detailsRecord, mediaRecord);        
            }
        }
    };

    function _displayError() {
        
        $("#pnlBottomValidationMessage_ActivitySubmission").css("visibility", "visible").fadeOut("normal", function() {
            $(this).fadeIn("normal", function() {
                $(this).fadeOut("normal", function() {
                    $(this).fadeIn("normal", function() {
                    });
                });
            });
        });
    }

    function _saveDataToUgc(activityRecord, detailsRecord, mediaRecord) {

        Agility.UGC.API.SaveRecord(activityRecord, function(actSaveData) {
            if (actSaveData.ResponseType != Agility.UGC.API.ResponseType.OK) {
                alert("An error occurred while saving the Activity: " + actSaveData.Message);
                return;
            } else {

                var activityID = actSaveData.ResponseData;
                detailsRecord.ActivityID = activityID;

                Agility.UGC.API.SaveRecord(detailsRecord, function(actdetailsSaveData) {

                    if (actdetailsSaveData.ResponseType != Agility.UGC.API.ResponseType.OK) {
                        alert("An error occurred while saving the Activity Details: " + actdetailsSaveData.Message);
                        return;
                    } else {

                        mediaRecord.ActivityID = activityID;

                        Agility.UGC.API.SaveRecord(mediaRecord, function(actFileMediaSaveData) {
                            if (actFileMediaSaveData.ResponseType != Agility.UGC.API.ResponseType.OK) {
                                alert("An error occurred while saving the Activity File Media: " + actFileMediaSaveData.Message);
                                return;
                            } else {

                                var pointsData = Subaru.SubmitActivity.Route.points;
                                var pointsDataSaveError = false;

                                for (var i = 0; i < pointsData.length; i++) {

                                    if (pointsDataSaveError) {
                                        break;
                                    }

                                    pointsData[i].ActivityID = activityID;
                                    pointsData[i].PointIndex = i;

                                    Agility.UGC.API.SaveRecord(pointsData[i], function(actPointsMetadataSaveData) {

                                        if (actPointsMetadataSaveData.ResponseType != Agility.UGC.API.ResponseType.OK) {
                                            pointsDataSaveError = true;
                                            return;
                                        }
                                    });
                                }

                                if (!pointsDataSaveError) {

                                    $("#pnlActivitySubmission").dialog("close");
                                    Subaru.SubmitActivity.Route = null;
                                    Subaru.SubmitActivity.LastSelectedPoint = null;

                                    _doActivitySubmissionConfirmation();
                                } else {
                                    alert("An error occurred while saving the Activity Points Metadata");
                                }
                            }
                        });
                    }
                });
            }
        });
    }


    function _doActivitySubmissionConfirmation() {

        location.hash = "#Activity_Entry_Confirmation";

        //show the dialog
        $("#pnlActivitySubmissionConfirmation").html('<div class="Spinner"></div>');

        ActivitySubmissionConfirmationDialog.dialog("open");

        //load the dialog content...
        var d = new Date();
        var url = Agility.ResolveUrl("~/Dialogs/ActivitySubmissionConfirmation.aspx?r=" + d.getTime());
        $("#pnlActivitySubmissionConfirmation").load(url, function() {
            _sendEmail($("#pnlActivitySubmissionConfirmation input:first").val(), "");
        });
    }

    function isValidEmailAddress(emailAddress) {
        var emailRegEx = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
        return emailAddress.match(emailRegEx);
    };

    NewsletterSignup.SubmitEmail = function(thankyouMessage) {
        var txtNewsletterSignupEmail = $("#txtNewsletterSignupEmail");
        var email = $.trim(txtNewsletterSignupEmail.val());

        if (!isValidEmailAddress(email)) {
            alert(_invalidEmailMessage);
            txtNewsletterSignupEmail.focus();
            return;
        }
        
        NewsletterSignup.Subscribe(email, Subaru.ContextUtil.CurrentUserID, function() {
            
            $("#txtNewsletterSignupEmail").val("");
            alert(_thankyouMessage);
        });
    };

    NewsletterSignup.Subscribe = function(email, getOutMoreID, callback) {

        jQuery.ajax({
            url: Agility.ResolveUrl("~/HTTPHandlers/NewsletterSubscribe.ashx"),
            cache: false,
            data: {
                "email": email,
                "getOutMoreID": getOutMoreID
            },
            dataType: "text",
            complete: function() {
                
                if(callback != null) {
                    callback();
                }                
            }
        });     
    };

    function _sendEmail(referenceName, email) {
        jQuery.ajax({
            url: Agility.ResolveUrl("~/HTTPHandlers/SendConfirmation.ashx"),
            cache: false,
            data: {
                "email": email,
                "referenceName": referenceName
            },
            dataType: "text",
            complete: function(XMLHttpRequest, textStatus) {
                //alert(XMLHttpRequest.status + ' ' + textStatus);
                //alert(XMLHttpRequest.responseText);
            }
        });
    };

    function _removeSubmitActivityHash() {
        if (window.location.hash.indexOf("SubmitActivity&User=") > -1) {
            window.location.hash = window.location.hash.substring(0, window.location.hash.indexOf("SubmitActivity&User="));
        }

        if (window.location.hash.indexOf("SubmitActivity&") > -1) {
            window.location.hash = window.location.hash.replace("SubmitActivity&", "");
        }
        else if (window.location.hash.indexOf("SubmitActivity") > -1) {
            window.location.hash = window.location.hash.replace("SubmitActivity", "");
        }
    };

    NewsletterSignup.SubmitActivityOpen = function() {

        return location.hash.indexOf("SubmitActivity") > -1;
    };

})(Subaru.NewsletterSignup);


function SubmitActivity() {
    Subaru.NewsletterSignup.AuthenticateOrSubmitActivity();
}
