var MESSAGE_SPEED = 500;
var messages = { errors: Array(), successes: Array() };
var active = Array();

function loadPage(obj, inline)
{
    /*
        The jQuery address plugin does not work if the link is
        in the AJAX content area (main). This fixes that.
    */
    if(shiftPressed || ctrlPressed)
    {
        return true;
    }
    else
    {
        if(!inline)
            window.location='/#!/'+obj.rel.substring(8);
        else
        {
            var main = $('#main');
            var mainContent = $('#mainContent');
            main.addClass('loading');

            // Clears everything out so all the user sees is the loading animation
            mainContent.css('opacity', '0.3');

            //$.get(obj, function(data)
            var link = obj.toString().substring(0,obj.toString().indexOf('#'));
            var url = link.length > 0 ? link : obj;
            $.getJSON(url, function(data)
            {
                if(typeof data['redirect'] != "undefined" && data['redirect'].toString() != "")
                    loadPage(data['redirect'], true);
                else
                {
                    mainContent.css('opacity', '1');
                    $('.pageStyle').remove();
                    $('head').append(data['styles']);
                    if(navigator.userAgent.indexOf('MSIE 9.0') != -1) //is IE9
                        updateStylesheets();
                    main.removeClass('loading');
                    mainContent.html(data['markup'].toString());
                    $(document).attr('title', data['title'].toString());
                    changeTab($('#tab_'+data['tab']+' a').get());
                    bindClick();

                /*
                    if(typeof useEditor != "undefined" && useEditor == 1)
                    {
                        var objs = document.getElementsByTagName('TEXTAREA');
                        var len = objs.length;
                        for(var i=0;i<len;i++)
                        {
                            if(objs[i].id == "comment" || objs[i].id == "title" || objs[i].id == "text")
                                active[i] = new nicEditor({fullPanel : true, xhtml: true}).panelInstance(objs[i].id);
                        }

                        $('#tdTitle .nicEdit-main').bind('keyup', function()
                        { 
                           //var text = editor.getContent();
                          var rows = getContent('title');
                          var text = rows['text'];
                          var start = text.indexOf('href=');
                          
                          if(start > -1)
                          {
                            start += 5;
                            var link = "";
                            var quoteCount = 0;

                            for(var i=start;i<text.length;i++)
                            {
                              var ch = text.charAt(i);
                              if(ch == '"' || ch == "'")
                                quoteCount++;
                              else if(ch == ">")
                                break;
                              else
                                link += ch;
                              if(quoteCount > 1)
                                break;
                            }

                            $('#link').val(link);
                            var newText = removeHTML(text);
                            if(nicEditors.findEditor('title'))
                              nicEditors.findEditor('title').setContent(newText);
                            else
                              $('#editor').val(newText);
                          }
                        });
                        $('#tdTitle .nicEdit-main').bind('blur', function()
                        {
                          $('#description_IESUCKS').focus();
                          checkTags();
                        });

                    }
                    */

                    if(typeof data['anchor'] != "undefined" && data['anchor'] != "")
                        $(window).scrollTop($(data['anchor']).offset().top-65);
                    else
                        $(window).scrollTop(0);
                }
            });
        }
    }
    return false;
}

function removeHTML(text)
{
    var ignore = false;
    var newText = "";
    for(var i=0;i<text.length;i++)
    {
        var ch = text.charAt(i);
        if(!ignore)
        {
            if(ch == '<')
                ignore = true;
            else
                newText += ch;
        }
        else if(ch == '>')
            ignore = false;
    }
    return newText;
}


function loadPageSelect(rel)
{
    window.location='/#!/'+rel;
}

function refresh(data)
{
    if(data != "")
    {
        var message = $.parseJSON(data);
        if(typeof message['errors'] == "undefined" || message['errors'].length === 0)
            location.reload();
    }
    else
        location.reload();
}

function formSubmit(obj, callBack, postCallBack)
{
    if(typeof CKEDITOR != "undefined")
    {
        for(instance in CKEDITOR.instances)
        {
            try
            {
                CKEDITOR.instances[instance].updateElement();
            }
            catch(err)
            {}
        }
    }
    var form = $(obj);
    var submit = form.find('input[type="submit"]');
    submit.attr('disabled', 'disabled');
    submit.after('<span class="waitingNotice">Please wait...</span>');

    $.post(obj.action, form.serialize(), function(data)
    {
        if(typeof callBack == "undefined" || callBack === false || callBack(data))
        {
            try
            {
                // Return data is JSON object string, so eval to get object
                var message = $.parseJSON(data);
                if(message != "undefined")
                {
                    if(typeof message['redirect'] != "undefined" && message['redirect'].toString() != "") 
                        loadPage(message['redirect'], true);
                    else
                        showAll(message);
                }
            }
            catch(err)
            {
                setError('<pre>'+data+'</pre>');
                showErrors(messages['errors']);
            }
        }

        form.find('.waitingNotice').remove();
        submit.removeAttr('disabled');
        $(window).scrollTop(0);
        if(typeof postCallBack != "undefined")
            postCallBack(data);
    });

    return false;
}

function setError(message)
{
    messages['errors'][messages['errors'].length] = message;
}

function setSuccess(message)
{
    messages['successes'][messages['successes'].length] = message;
}

function showAll(message)
{
    if(message != null && typeof message != "undefined")
    {
        if(typeof message['errors'] != "undefined")
            showErrors(message['errors']);
        if(typeof message['successes'] != "undefined")
            showSuccesses(message['successes']);
        if(typeof message['fieldErrors'] != "undefined")
            showFieldErrors(message['fieldErrors']);
    }
}

function showErrors(errorMessages, errorId)
{
    if(typeof errorId == "undefined")
        errorId = "errors";
    if(typeof errorMessages != "undefined")
    {
        $('#successes').css('display', 'none');
        var errors = $('#'+errorId);
        errors.css('display', 'none');
        errors.html(getMessageList(errorMessages));
        errors.fadeIn(MESSAGE_SPEED);
        messages['errors'] = Array();
    }
}

function showSuccesses(successMessages, successId)
{
    if(typeof successId == "undefined")
        successId = "successes";
    if(typeof successMessages != "undefined")
    {
        $('#errors').css('display', 'none');
        var successes = $('#'+successId);
        successes.css('display', 'none');
        successes.html(getMessageList(successMessages));
        successes.fadeIn(MESSAGE_SPEED);
        messages['successes'] = Array();
    }
}

function showFieldErrors(messages)
{
    $('.fieldError').remove();
    if(typeof messages != "undefined")
    {
        for(i in messages)
        {
            var error = $('#'+i);
            error.after(messages[i]);
        }
    }
}

function getStyles(styles)
{
    var output = '';
    for(i in styles)
        output += '<link rel="stylesheet" href="'+styles[i]+'" class="pageStyle" />';
    return output;
}

function getMessageList(messages)
{
    /*
        Converts a list of user notification messages to an unordered list
    */
    var output = '<ul>';
    for(i in messages)
        output += '<li>'+messages[i]+'</li>';
    output += '</ul>';
    return output;
}

function bindClick()
{
    $('#container a[rel]').unbind('click').click(function()
    {
        return loadPage(this);
    });
}

function changeTab(obj)
{
    var liObj = $(obj).parent();
    var pieces = liObj.attr('id').split('_');
    var li = pieces[1];

    var ulObj = liObj.parent();
    pieces = ulObj.attr('id').split('_');
    ul = pieces[0];

    ulObj.attr('id', ul+'_'+li);
}

function ajaxReload()
{
    var url = window.location.toString();
    if(url.indexOf('!/') > 0)
        url = url.substring(url.indexOf('!/')+2);    
    loadPage(url, true);
}

function updateNiceditBox(id)
{
    if(nicEditors.findEditor(id))
        $('#'+id).val(nicEditors.findEditor(id).getContent());
    return true;
}

function updateStylesheets() {
    var i,a,s;
    a=$('.pageStyle');
    for(i=0;i<a.length;i++) {
        s=$(a[i]);
        if(s.attr('rel').toLowerCase().indexOf('stylesheet')>=0&&s.attr('href')) {
            var h=s.attr('href').replace(/(&|\\?)forceReload=d /,'');
            s.attr('href',h+(h.indexOf('?')>=0?'&':'?')+'forceReload='+(new Date().valueOf()));
        }
    }
}

var ctrlPressed = false;
var shiftPressed = false;
$(window).keydown(function(evt)
{
    if (evt.which == 17)
    {
        ctrlPressed = true;
    }
    else if (evt.which == 16)
    {
        shiftPressed = true;
    }

}).keyup(function(evt) 
{
    if (evt.which == 17)
    {
       ctrlPressed = false;
    }
    else if (evt.which == 16)
    {
       shiftPressed = false;
    }
});

var first = true;
$.address.externalChange(function(event)
{
    var url = event.value.substring(1);
    if(window.location.toString().charAt(window.location.toString().length-1) == '/' || window.location.toString().indexOf('#!') != -1)
    {
        if(!(first && url == ''))
        {
            first = false;
            loadPage(url, true);
        }
    }
    bindClick();
});

$(window).scroll(function()
{
    if($(document).scrollTop() > 66)
    {
        $('#menu').addClass('stickyMenu');
    }
    else
    {
        $('#menu').removeClass('stickyMenu');
    }
});

function updateTime()
{
    var d = new Date();
    var hours = d.getUTCHours() < 10 ? "0" + d.getUTCHours() : d.getUTCHours();
    var minutes = d.getUTCMinutes() < 10 ? "0" + d.getUTCMinutes() : d.getUTCMinutes();
    var time = hours+":"+minutes+"UTC";
    $('#utcTime').html(time);
    setTimeout("updateTime()", 60000);
}

$(document).ready(function()
{
    updateTime();
});

