﻿
var activeGabID;
var autoPlayNext = true;

//////////////////////////////////////////////
// Startup
//////////////////////////////////////////////

$(document).ready(function() {


    // Rounded corners - oh yeah!
    roundCorners();


    // Load JavaScript extension methods
    loadJavaScriptExtensionMethods();


    // Initialize audio player
    initializeAudioPlayer();


    // Register each gab's controls.
    registerGabs();
});





////////////////////////////////////////////
// Methods
////////////////////////////////////////////

function registerGabs() {
    $("[id^='gabContainer']").each(
        function() {
            registerGab($(this).attr("id").substring(12));
        }
    );
}



function registerGab(
    gabId
)
{
    registerGabPlayer(gabId);
    registerGabCharacterCounter(gabId);
}



function registerGabCharacterCounter(
    gabId
)
{
    var messageTextArea = $('#messageTextArea' + gabId);
    if (!$(messageTextArea).length)
        return;

    var submitPublish = $('#submitPublish' + gabId);
    var submitDraft = $('#submitDraft' + gabId);
    var submitUpdate = $('#submitUpdate' + gabId);
    
    messageTextArea.simplyCountable({
        counter: '#gabTextCounter' + gabId,
        countable: 'characters',
        maxCount: 120,
        countDirection: 'down',
        safeClass: 'safe',
        overClass: 'over'
    });

    messageTextArea.keyup(function() {
        var messageTextArea = $('#messageTextArea' + gabId);
        if ((messageTextArea.val() == '') || (messageTextArea.val().length > 120)) {
            if ($(submitPublish).length) {
                $(submitPublish).attr('disabled', 'disabled');
            }
            if ($(submitDraft).length) {
                $(submitDraft).attr('disabled', 'disabled');
            }
            if ($(submitUpdate).length) {
                $(submitUpdate).attr('disabled', 'disabled');
            }
        }
        else {
            if ($(submitPublish).length) {
                $(submitPublish).removeAttr('disabled');
            }
            if ($(submitDraft).length) {
                $(submitDraft).removeAttr('disabled');
            }
            if ($(submitUpdate).length) {
                $(submitUpdate).removeAttr('disabled');
            }
        }
    });
}



function roundCorners() {
    $("#bulletinsPane").corner();
    $("#contentPane").corner();
    $("#footerPane").corner();
    $("#menuBar").corner();
    $("div.gabContainer").corner();
}



function ResolveUrl(url) {
    if (url.indexOf("~/") == 0) {
        url = baseUrl + url.substring(2);
    }
    return url;
}

function loadJavaScriptExtensionMethods() {

    // endsWith method
    String.prototype.endsWith = function(str) {
        return (this.match(str+"$")==str);
    }
    
    // startsWith method
    String.prototype.startsWith = function(str) {
        return (this.match("^"+str)==str);
    }
}



// Initialize audio player global settings.
function initializeAudioPlayer() {

    // Don't use JPlayer for iPhone/iPod
    if ((navigator.userAgent.match(/iPhone/i)) 
        || (navigator.userAgent.match(/iPod/i)))
        return;
        
    var audioPlayer = $("#audioPlayer");
    if (audioPlayer.length > 0) {
        $(audioPlayer).jPlayer({
            cssPrefix: "gc1",
            volume: 75,
            oggSupport: false,
            swfPath: ResolveUrl("~/Content/SWF")
        });        
    }
}



// Handler for "New Gab" related links.
function registerNewGabHandlers() {
    // Gotta love rounded corners.
    $("#newGabDialog").corner();
    
    // "New Gab"
    $("#newGab").bind("click", function() {
        $("#newGabMenu").hide();
        $("#newGabDialog").slideDown("fast");
        return false;
    });
    
    // Cancel "X"
    $("#imgCancel_NewGabDialog").bind("click", function() {
        $("#newGabDialog").slideUp("fast", function() {
            $("#newGabMenu").show();

            if (isNewGabStep1 == false) {
                $.ajax({
                    type: "GET",
                    //url: "/Gabs/NewAudio",
                    url: $("#newGab").attr("href"),
                    timeout: ajaxTimeout,
                    complete: function(xhr, status) {
                    },
                    success: function(content, status) {
                        var selector = "#newGabStep";
                        isNewGabStep1 = true;
                        $(selector).html(content);
                        registerCallInNewGabHandler();
                        registerUploadAudioHandler();
                    },
                    error: function(xhr, status, error) {
                        $.jGrowl(error, { header: status, sticky: true });
                    }
                });
            }

        });
        return false;
    });
    
    registerCallInNewGabHandler();
    registerUploadAudioHandler();
}



// Register handler for "Call-In New Gab" link.
function registerCallInNewGabHandler() {
    $("#callInNewGab").bind("click", function() {
        var imgLoading = $("#ajaxLoader_CallInNewGab");
        imgLoading.show();

        $.ajax({
            type: "GET",
            url: $("#callInNewGab").attr("href"),
            timeout: ajaxTimeout,
            complete: function(xhr, status) {
                imgLoading.hide();
            },
            success: function(content, status) {
                var selector = "#newGabStep";
                $(selector).fadeOut("fast", function() {
                    $(content).hide();
                    $(selector).html(content);
                    isNewGabStep1 = false;
                    registerCancelRecordAudioFromPhoneHandler();
                    $("#btnDone_callInNewGab").hide();

                    var times = 30;
                    $(document).everyTime(
                        "5s",
                        "NewAudioCallStatus",
                        function(i) { newAudioCallStatusCheck(i); },
                        times);

                    $(selector).fadeIn("fast");
                });
            },
            error: function(xhr, status, error) {
                $.jGrowl(error, { header: status, sticky: true });
            }
        });

        return false;
    });
}


function newAudioCallStatusCheck(count) {
    var selector = "#hfWaitStartTimeUTCTicks_callInNewGab";
    if ($(selector).length == 0) {
        $(document).stopTime("NewAudioCallStatus");
        return false;
    }
    
    $.ajax({
    type: "GET",
    url: "/Gabs/EditNewGab/" + $(selector).attr("value"),
    timeout: ajaxTimeout,
    complete: function(xhr, status) {
//    imgLoading.hide();
    },
    success: function(content, status) {
        if (content == "Not found") {
            return false;
        }

        $(document).stopTime("NewAudioCallStatus");
        
        $.trim(content);
        var li = $(content);
        var selector = "#gabList";
        $(li).hide();
        $(selector).prepend(li);
        var gabID = $(li).attr("id").substring(11);
        registerGabEditHandlers(gabID, true);
        $("#imgCancel_NewGabDialog").click();
        $(li).fadeIn("fast");
        
//        $.trim(content);
//        var li = $(content);
//        var selector = "#gabListItem" + gabID;
//        $(selector).fadeOut("fast", function() {
//            $(li).hide();
//            $(selector).replaceWith(li);
//            registerGabEditHandlers(gabID, false);
//            $(selector).fadeIn("fast");
//        });
    },
    error: function(xhr, status, error) {
        $.jGrowl(error, { header: status, sticky: true });
    }
    });

    return false;
}


// Register handler for "Cancel" record audio from phone.
function registerCancelRecordAudioFromPhoneHandler() {
    var options = {
        success: function(content, statusText) {
            $(document).stopTime("NewAudioCallStatus");
            var selector = "#newGabStep";
            $(selector).fadeOut("fast", function() {
                $(content).hide();
                $(selector).html(content);
                registerCallInNewGabHandler();
                registerUploadAudioHandler();
                $(selector).fadeIn("fast");
                isNewGabStep1 = true;
            });
        }
    };
    $("#form_callInNewGab").ajaxForm(options);

    return false;
}



// Register handler for "Upload New Gab" link.
function registerUploadAudioHandler() {
    $("#uploadNewGab").bind("click", function() {
        var imgLoading = $("#ajaxLoader_UploadNewGab");
        imgLoading.show();
        
        $.ajax({
            type: "GET",
            url: $("#uploadNewGab").attr("href"),
            timeout: ajaxTimeout,
            complete: function(xhr, status) {
                imgLoading.hide();
            },
            success: function(content, status) {
                var selector = "#newGabStep";
                $(selector).fadeOut("fast", function() {
                    $(content).hide();
                    $(selector).html(content);
                    
                    // We need this since the jquery form plugin uses an iframe for file uploads and
                    // doesn't include the X-Requested-With/XMLHttpRequest header that gets sent when
                    // doing ajax with XMLHttpRequest.
                    $("#form_uploadNewGab").append("<input type='hidden' name='isFileUploadAjaxPost' id='isFileUploadAjaxPost' value='true' />");
                    
                    var options = { 
                        //target:        '#output1',   // target element(s) to be updated with server response 
                        beforeSubmit: function() {
                            if (($("#audioFile").val().length == 0) ||
                                ($("#audioFile").val().endsWith("mp3") == false)) {
                                alert("Please select an mp3 file for upload.");
                                return false;
                            }
                            //$("#audioFile").attr('disabled', 'disabled');
                            $("#newGabCancel").hide();
                            $("#btnUpload_uploadNewGab").attr('disabled', 'disabled');
                            $("#ajaxLoader_btnUpload_uploadNewGab").show();
                            return true;
                        },
                        success: function (responseText, statusText) {
                            $("#ajaxLoader_btnUpload_uploadNewGab").hide();
                            //$("#audioFile").attr('disabled', '');
                            $("#btnUpload_uploadNewGab").attr('disabled', '');
                            $("#newGabCancel").fadeIn("fast");
                            if (responseText.startsWith("Error")) {
                                alert(responseText);
                                return false;
                            }
                            $.trim(responseText);
                            var li = $(responseText);
                            var selector = "#gabList";
                            $(li).hide();
                            $(selector).prepend(li);
                            var gabID = $(li).attr("id").substring(11);
                            registerGabEditHandlers(gabID, true);                           
                            $("#imgCancel_NewGabDialog").click();
                            $(li).fadeIn("fast");
                        },
                 
                        // other available options: 
                        //url:       url         // override for form's 'action' attribute 
                        //type:      type        // 'get' or 'post', override for form's 'method' attribute 
                        //dataType:  null        // 'xml', 'script', or 'json' (expected server response type) 
                        clearForm: true,        // clear all form fields after successful submit 
                        resetForm: true        // reset the form after successful submit 
                 
                        // $.ajax options can be used here too, for example: 
                        //timeout:   3000 
                    };                     
                    
                    $('#form_uploadNewGab').ajaxForm(options); 

                    isNewGabStep1 = false;
                    $(selector).fadeIn("fast");
                });
            },
            error: function(xhr, status, error) {
                $.jGrowl(error, { header: status, sticky: true });
            }
        });

        return false;
    });
}



// Register handlers for gab links and buttons in details mode.
function registerGabDetailsHandlers(gabID) {
    
    // Edit message link
    $("#editMessage" + gabID).bind("click", function() {
        var imgLoading = $("#ajax-loader-editMessage" + gabID);
        imgLoading.show();

        $.ajax({
            type: "GET",
            url: $("#editMessage" + gabID).attr("href"),
            timeout: ajaxTimeout,
            complete: function(xhr, status) {
                imgLoading.hide();
            },
            success: function(data, status) {
                $.trim(data);
                var li = $(data);
                var selector = "#gabListItem" + gabID;
                $(selector).fadeOut("fast", function() {
                    $(li).hide();
                    $(selector).replaceWith(li);
                    registerGabEditHandlers(gabID, false);
                    $(selector).fadeIn("fast");
                });            },
            error: function(xhr, status, error) {
                $.jGrowl(error, { header: status, sticky: true });
            }
        });
        
        return false;
    });    
    
    
    // Edit privacy link
    $("#editPrivacy" + gabID).bind("click", function() {
        var imgLoading = $("#ajax-loader-editPrivacy" + gabID);
        imgLoading.show();
    
        $.ajax({
            type: "GET",
            url: $("#editPrivacy" + gabID).attr("href"),
            timeout: ajaxTimeout,
            complete: function(xhr, status) {
                imgLoading.hide();
            },
            success: function(data, status) {
                $.trim(data);
                var li = $(data);
                var selector = "#gabListItem" + gabID;
                $(selector).fadeOut("fast", function() {
                    $(li).hide();
                    $(selector).replaceWith(li);
                    registerGabEditHandlers(gabID, false);
                    $(selector).fadeIn("fast");
                    
                });            },
            error: function(xhr, status, error) {
                $.jGrowl(error, { header: status, sticky: true });
            }
        });
        
        return false;
    });    

    
    // Delete link
    $("#delete" + gabID).bind("click", function() {
        if (confirm("Are you sure?") == false)
            return false;

        var imgLoading = $("#ajax-loader-delete" + gabID);

        $(imgLoading).show();

        $.ajax({
            type: "POST",
            url: $("#delete" + gabID).attr("href"),
            timeout: ajaxTimeout,
            complete: function(xhr, status) {
                $(imgLoading).hide();
            },
            success: function() {
                var selector = "#gabListItem" + gabID;
                $(selector).fadeTo("medium", 0.01, function() {
                    $(selector).slideUp("medium", function() {
                        $(selector).remove();
                    });
                });
            },
            error: function(xhr, status, error) {
                $.jGrowl(error, { header: status, sticky: true });
            }
        });
        
        return false;

    });
    
    
    // Play button
    registerGabPlayer(gabID);
}



// Handler for "Load Older" link.
function registerLoadOlderGabsHandler() {
    $("#lnkOlder").click(function() {
        var imgLoading = $("#ajax-loader-older");
        var lnkOlderHref = $("#lnkOlder").attr("href");

        imgLoading.show();

        $.ajax({
            type: "GET",
            url: lnkOlderHref,
            timeout: ajaxTimeout,
            complete: function(xhr, status) {
                imgLoading.hide();
            },
            success: function(data, status) {
                $.trim(data);
                var lis = $(data);
                lis.each(function() {
                    if ($(this).attr("id")) {
                        var gabID = $(this).attr("id").substring(11);
//                      $(this).hide();
                        $("#gabList").append($(this));
                        registerGabDetailsHandlers(gabID);
                    }
                    else {
                        imgLoading.hide();
                        alert("There are no more gabs.");
                    }
                });

                //                        lis.each(function() {
                //                            $(this).show("slow");
                //                        });
            },
            error: function(xhr, status, error) {
                $.jGrowl(error, { header: status, sticky: true });
            }
        });

        var actionPage = lnkOlderHref.substring(0, lnkOlderHref.lastIndexOf("/") + 1);
        var pageNum = (lnkOlderHref.substring(lnkOlderHref.lastIndexOf("/") + 1));
        $("#lnkOlder").attr("href", actionPage + (++pageNum));

        return false;
    });
}



// Register handlers for gab links and buttons in edit mode.
function registerGabEditHandlers(gabID, isNew) {
    // Save button
    $("#submit" + gabID).bind("click", function() {
        var privacy = $("#form" + gabID).find("input[name='privacy']:checked").val();
        
        if ((isNew == true) && (privacy == "private"))
            if (confirm("This gab is marked as private and will not be available to anyone but you.  Do you want to proceed?") == false)
                return false;
    
        $("#submit" + gabID).attr("disabled", "true").attr("value", "Saving...");
        $("#cancel" + gabID).attr("disabled", "true");
        $("#btnDelete" + gabID).attr("disabled", "true");

        $.ajax({
            type: "POST",
            url: $("#form" + gabID).attr("action"),
            data: "message=" + $("#messageTextArea" + gabID).attr("value") + "&privacy=" + privacy,
            timeout: ajaxTimeout,
            complete: function(xhr, status) {
            },
            success: function(data, status) {
                $.trim(data);
                var li = $(data);
                var selector = "#gabListItem" + gabID;
                $(selector).fadeOut("fast", function() {
                    $(li).hide();
                    $(selector).replaceWith(li);
                    registerGabDetailsHandlers(gabID);
                    $(selector).fadeIn("fast");
                });            },
            error: function(xhr, status, error) {
                $.jGrowl(error, { header: status, sticky: true });
            }
        });
        
        return false;
    });
    
    
    // Cancel button
    $("#cancel" + gabID).bind("click", function() {
        $("#submit" + gabID).attr("disabled", "true");
        $("#cancel" + gabID).attr("disabled", "true");
        
        $.ajax({
            type: "GET",
            url: $("#detailsUrl" + gabID).attr("value"),
            timeout: ajaxTimeout,
            complete: function(xhr, status) {
            },
            success: function(data, status) {
                $.trim(data);
                var li = $(data);
                var selector = "#gabListItem" + gabID;
                $(selector).fadeOut("fast", function() {
                    $(li).hide();
                    $(selector).replaceWith(li);
                    registerGabDetailsHandlers(gabID);
                    $(selector).fadeIn("fast");
                });            },
            error: function(xhr, status, error) {
                $.jGrowl(error, { header: status, sticky: true });
            }
        });    
        
        return false;
    });
    
    
    // Delete button
    $("#btnDelete" + gabID).bind("click", function() {
        if (confirm("Are you sure?") == false)
            return false;

        $("#btnDelete" + gabID).attr("disabled", "true");

        $.ajax({
            type: "POST",
            url: $("#form" + gabID).attr("action"),
            data: "message=" + $("#messageTextArea" + gabID).attr("value") + "&privacy=" + $("#form" + gabID).find("input[name='privacy']:checked").val() + "&submitButton=Delete",
            timeout: ajaxTimeout,
            complete: function(xhr, status) {
            },
            success: function(data, textStatus) {
                var selector = "#gabListItem" + gabID;
                $(selector).fadeTo("medium", 0.01, function() {
                    $(selector).slideUp("medium", function() {
                        $(selector).remove();
                    });
                });
            },
            error: function(xhr, status, error) {
                $.jGrowl(error, { header: status, sticky: true });
            }
        });
        
        return false;

    });    


    // Play button.
    registerGabPlayer(gabID);


    // Message character counter    
    var messageTextArea = $('#messageTextArea' + gabID);
    messageTextArea.simplyCountable({
        counter: '#gabCounter' + gabID,
        countable: 'characters',
        maxCount: 120,
        countDirection: 'down',
        safeClass: 'safe',
        overClass: 'over'
    });
    
    messageTextArea.keyup(function() {
        var messageTextArea = $('#messageTextArea' + gabID);
        var submitButton = $('#submit' + gabID);
        if ((messageTextArea.val() == '') || (messageTextArea.val().length > 120))
            submitButton.attr('disabled', 'disabled');
        else
            submitButton.removeAttr('disabled');
    });    
}



function registerGabPlayer(gabID) {
    // Don't use JPlayer for iPhone/iPod
    if ((navigator.userAgent.match(/iPhone/i))
        || (navigator.userAgent.match(/iPod/i)))
        return;
        
    // The <a> element below is only needed if JavaScript is disabled.  
    // Since we're running JavaScript, hide it and let the "click" 
    // handler below process the clicks.
    $("#a_player_play" + gabID).hide();

    $("#player_play" + gabID).click(function() {

        var audioPlayer = $("#audioPlayer");

        // If another player is active or showing, stop it and hide its details.
        if ((activeGabID) && (activeGabID != gabID)) {
            audioPlayer.stop();
            showPlayButton(activeGabID);
            $("#player_details" + activeGabID).children().fadeOut(400);
        }


        // Show the player details on the selected audio, initialize its autoplay checkbox, and toggle
        // to show the stop button.
        $("#cb_player_auto" + gabID).attr("checked", autoPlayNext);
        $("#player_details" + gabID).show().children().show();
        $("#player_play" + gabID).fadeOut(50, function() {
            $("#player_pause" + gabID).fadeIn(50);
        });


        // Hook up the selected player GUI to the hidden audio player and play the audio.
        audioPlayer
    	    .jPlayerId("play", "player_play" + gabID)
    	    .jPlayerId("pause", "player_pause" + gabID)
            .jPlayerId("stop", "player_stop" + gabID)
            .jPlayerId("loadBar", "player_progress_load_bar" + gabID)
            .jPlayerId("playBar", "player_progress_play_bar" + gabID)
            .jPlayerId("volumeMin", "player_volume_min" + gabID)
            .jPlayerId("volumeMax", "player_volume_max" + gabID)
            .jPlayerId("volumeBar", "player_volume_bar" + gabID)
            .jPlayerId("volumeBarValue", "player_volume_bar_value" + gabID)
            .onProgressChange(function(loadPercent, playedPercentRelative, playedPercentAbsolute, playedTime, totalTime) {
                var myPlayedTime = new Date(playedTime);
                var ptMin = (myPlayedTime.getUTCMinutes() < 10) ? "0" + myPlayedTime.getUTCMinutes() : myPlayedTime.getUTCMinutes();
                var ptSec = (myPlayedTime.getUTCSeconds() < 10) ? "0" + myPlayedTime.getUTCSeconds() : myPlayedTime.getUTCSeconds();
                $("#play_time" + gabID).text(ptMin + ":" + ptSec);

                var myTotalTime = new Date(totalTime);
                var ttMin = (myTotalTime.getUTCMinutes() < 10) ? "0" + myTotalTime.getUTCMinutes() : myTotalTime.getUTCMinutes();
                var ttSec = (myTotalTime.getUTCSeconds() < 10) ? "0" + myTotalTime.getUTCSeconds() : myTotalTime.getUTCSeconds();
                $("#total_time" + gabID).text(ttMin + ":" + ttSec);
            })
    	    .onSoundComplete(function() {
    	        showPlayButton(gabID);
    	        if (autoPlayNext) {
    	            var nextGabListItem = $("#gabListItem" + gabID).nextAll("li[id^='gabListItem']:first");
    	            if (nextGabListItem) {

    	                $("#player_play" + $(nextGabListItem).attr("id").substring(11)).click();
    	            }
    	        }
    	    })
            .volume(75)
            .setFile($("#a_player_play" + gabID).attr("href"))
            .play();

        activeGabID = gabID;

        return false;
    });
 
    
    // Autoplay checkbox.
    $("#cb_player_auto" + gabID).click(function() {
        autoPlayNext = $("#cb_player_auto" + gabID).attr("checked");
    });
}



// Toggle off pause button and show play button.
function showPlayButton(gabID) {
    $("#player_pause" + gabID).fadeOut(50, function() {
        $("#player_play" + gabID).fadeIn(50);
    });        
}
