var imgPreloaded;
var commentinfo = new Array();

var a_form;
var a_form_error;

var abbr_form;
var abbr_form_error;

var q_form;
var q_form_error;

var form_body;

var textarea;

var selection;

$.fn.check = function(mode) {
    if(typeof mode == 'undefined') {
        var mode = true;
    }
   
    return this.each(
        function() {
            this.checked = mode;
        }
   );
};

function trigger(o) {
    if(o.length == 0) {
        return;
    }

    selected = false;
    if(o.hasClass('selected')) {
        selected = true;
    }

    $('#form-body .selected').hide().removeClass('selected');

    if(!selected) {
        o.addClass('selected').show();
        
        o.find('input')[0].focus();
        
    } else {
        textarea[0].focus();
    }
}

function trigger_help(n) {
    standalone = false;
    if(!(n == 'a' || n == 'abbr' || n == 'q')) {
        form_reset($('#form-body .selected'));
        standalone = true;
    }
    
    all = $('#fasthelp dl > *');
    o = $('#fasthelp .' + n);

    selected = false;
    if(o.hasClass('selected')) {
        selected = true;
    }

    if (!standalone || (standalone && !selected)) {
        all.filter('.selected').hide().removeClass('selected');
    }

    if(!selected) {
        o.addClass('selected').show();
    }
}

function insert_at_caret(text, pos) {
    obj = $('textarea')[0];

    obj.focus();

    if (typeof(obj.selectionStart) != 'undefined') {
        var start = obj.selectionStart;

        obj.value = obj.value.substr(0, start) 
            + text
            + obj.value.substr(obj.selectionEnd, obj.value.length);

        if (typeof(pos) == 'undefined') {
            start += text.length;
        } else {
            start += pos;
        }

        obj.setSelectionRange(start, start);
    } else if (typeof(document.selection) != 'undefined') {

        var orig = obj.value.replace(/\r\n/g, "\n");
        
        if(selection) {
            var range = selection;
            selection = null;
        } else {
            var range = document.selection.createRange();
        }

        if (range.parentElement() != obj)
            return;

        range.text = text;
        
        if(typeof(pos) == 'undefined') {
            range.select();

            return;
        }

        var actual = tmp = obj.value.replace(/\r\n/g, "\n");
        
        for(var diff = 0; diff < orig.length; diff++) {  
            if(orig.charAt(diff) != actual.charAt(diff)) break;  
        }  

        for(var index = 0, start = 0;   
                tmp.match(text)   
                && (tmp = tmp.replace(text, ""))   
                && index <= diff;   
                index = start + text.length
           ) {  
            start = actual.indexOf(text, index);  
        }

        pos += start;
        range = obj.createTextRange();
        range.move('character', pos);
        range.select();
    } else {
        obj.value += text;
    }
}

function add_http_prefix(url) {
    pos = url.indexOf(':/');
    
    if(pos == -1) {
        url = 'http://' + url
    } else {
        url = 'http://' + url.substr(pos + 3);
    }

    return url
}

function a_form_submit() {
    url = $('#add-form-url').val();
    _title = $('#add-form-title').val();

    if(!url) {
        a_form_error.addClass('selected error').show();

        return false;
    }

    url = add_http_prefix(url);
    
    if(!_title) {
        insert_at_caret('<a href="' + url + '">' + url + '</a>');
    } else {
        insert_at_caret('<a href="' + url + '" title="' + _title + '">' + _title + '</a>');
    }

    form_reset(a_form);
    trigger_help('a');

    return false;
}

function abbr_form_submit () {
    abbr = $('#abbr-form-abbr').val();
    _title = $('#abbr-form-title').val();

    if (!abbr || !_title) {
        abbr_form_error.addClass('selected error').show();

        return false;
    }

    insert_at_caret('<abbr title="' + _title + '">' + abbr + '</abbr>');

    form_reset(abbr_form);
    trigger_help('abbr');

    return false;
}

function q_form_submit () {
    _quote = $('#q-form-quote').val();
    _a_cite = $('#q-form-cite').val();

    if (!_quote) {
        q_form_error.addClass('selected error').show();

        return false;
    }

    if(!_a_cite) {
        insert_at_caret('<q>' + _quote + '</q>');
    } else {
        _a_cite = add_http_prefix(_a_cite);
        insert_at_caret('<q cite="' + _a_cite + '">' + _quote + '</q>');
    }

    form_reset(q_form);
    trigger_help('q');

    return false;
}    

function form_reset(jobject) {
    jobject.find('input[type=text]').val('');

    trigger(jobject);

    return jobject;
}

$(document).ready(
    function() {
        /* Unobtrusive javascript -> adding functionality to each element */
        $('.comment-username').each(
            function () {
                this._href = $(this).attr('href');
                
                /* When element toggled */
                $(this).toggle(
                    function() {
                        /* If we loaded successfully the info about an user,
                         * clone it and put in new place. */
                        if(!this.div && commentinfo[this._href]) {
                            this.div = commentinfo[this._href].clone();
                            $(this.parentNode).append(this.div);
                        }
                        
                        /* If user hid the div before, unhide it. */
                        if(this.div) {
                            this.div.show();
                            return;
                        }

                        /* Make a new jquery representation of the node */
                        divNode = document.createElement('div');
                        divNode.element = this;
                        div = $(divNode);

                        /* Make subnode for presentation layer. */
                        second_div = $('<p></p>').addClass('profile-info center');
                        
                        /* Add `loading' image */
                        imgel = new Image();
                        imgel.src = imgPreloaded.src;
                        imgel.setAttribute('alt', 'Loading');
                        imgel.setAttribute('title', 'Loading');
                        
                        /* Merge all elements */
                        second_div.append(imgel);
                        div.append(second_div);
                        
                        /* Ajax load the profile-info node into it. */
                        div.load('/ajax' + this._href + ' .profile-info', null,
                            function() {
                                /* When successfully loaded, store div with real info
                                 * in an array. We do not want to store `loading'
                                 * elements there, though. */
                                commentinfo[this.element._href] = $(this);
                            }
                        );
                        
                        /* Append div into parentNode */
                        $(this.parentNode).append(div);
                        
                        /* And store div within an object. */
                        this.div = div;
                    },

                    function () {
                        /* Hide the div. */
                        this.div.hide();
                    }
                )
            }
        )
        
        /* Preload loading image that it will be immediately used when needed. */
        imgPreloaded = new Image();
        imgPreloaded.src = 'http://cytaty.e.pl/media/ajax-loader.gif'

        /* Now check a cookie. */
        if($.cookie('dont_follow')) {
            /* And uncheck the checkbox */
            $('#id_subscribe').check(false);
        }

        form_body = $('#form-body');
        textarea = $('textarea');
        
        /* Prepare the form for `a' element */
        a_form = $('<div class="subform" id="a-form"><label for="add-form-url">' + gettext('URL') + ' <b>*</b></label> <input autocomplete="off" id="add-form-url" type="text" /> <label for="add-form-title">' + gettext('Title') + '</label> <input autocomplete="off" id="add-form-title" type="text" /> <input class="reset" type="button" value="' + gettext('Close') + '" /> <input class="submit" type="button" value="' + gettext('Submit') + '"></div>');

        abbr_form = $('<div class="subform" id="abbr-form"><label for="abbr-form-abbr">' + gettext('Abbreviation/Acronym') + ' <b>*</b></label> <input autocomplete="off" id="abbr-form-abbr" type="text" /> <label for="abbr-form-title">' + gettext('Meaning') + ' <b>*</b></label> <input autocomplete="off" id="abbr-form-title" /> <input class="reset" type="button" value="' + gettext('Close') + '" /> <input class="submit" type="button" value="' + gettext('Submit') + '"></div>');

        q_form = $('<div class="subform" id="q-form"><label for="q-form-quote">' + gettext('Quote') + ' <b>*</b></label> <input autocomplete="off" id="q-form-quote" type="text" /> <label for="q-form-cite">' + gettext('Reference URL') + '</label> <input autocomplete="off" id="q-form-cite" type="text" /> <input class="reset" type="button" value="' + gettext('Close') + '" /> <input class="submit" type="button" value="' + gettext('Submit') + '"></div>');
        
        /* Bind submit/reset events */
        a_form.find('.submit').click(a_form_submit);
        a_form.find('input[type=text]').keypress(function(e) {
            if(e.which == 13) {
                return a_form_submit();

                return false;
            }

        });

        a_form.find('.reset').click(function () { 
            form_reset(a_form);
            trigger_help('a');
        });

        a_form.appendTo(form_body).hide();

        a_form_error = $('<div>' + gettext('URL field is required!') + '</div>');
        a_form_error.appendTo(form_body).hide();

        abbr_form.find('.submit').click(abbr_form_submit);
        abbr_form.find('input[type=text]').keypress(function(e) {
            if(e.which == 13) {
                abbr_form_submit();

                return false;
            }
        });

        abbr_form.find('.reset').click(function() {
            form_reset(abbr_form);
            trigger_help('abbr');
        });

        abbr_form.appendTo(form_body).hide();

        abbr_form_error = $('<div>' + gettext('Either Abbreviation/Acronym field and Title field are required!') + '</div>');
        abbr_form_error.appendTo(form_body).hide();

        q_form.find('.submit').click(q_form_submit);
        q_form.find('input[type=text]').keypress(function(e) {
            if(e.which == 13) {
                q_form_submit();
                
                return false;
            }
        });

        
        q_form.find('.reset').click(function () {
           form_reset(q_form);
           trigger_help('q');
        });

        q_form.appendTo(form_body).hide();

        q_form_error = $('<div>' + gettext('Quote field is required!') + '</div>');
        q_form_error.appendTo(form_body).hide();
        
        /* Apply a toggle action to a button */
        $('#comment-buttons .a').click(function() {
            trigger(a_form);
            trigger_help('a');
        });

        $('#comment-buttons .abbr').click(function() {
            trigger(abbr_form);
            trigger_help('abbr');
        });

        $('#comment-buttons .cite').click(function() {
            insert_at_caret('<cite></cite>', 6);
            trigger_help('cite');
        });

        $('#comment-buttons .em').click(function() {
            insert_at_caret('<em></em>', 4);
            trigger_help('em');
        });

        $('#comment-buttons .q').click(function() {
            trigger(q_form);
            trigger_help('q');
        });

        $('#comment-buttons .strong').click(function() {
            insert_at_caret('<strong></strong>', 8);
            trigger_help('strong');
        });

        textarea.change(function() {
            if(typeof(document.selection) != 'undefined' && typeof(textarea[0].selectionStart) == 'undefined') {
                selection = document.selection.createRange();
            }
        });

        $('#comment-buttons span').css({/*'border-bottom': '1px dotted #580', 'color': '#580', */'cursor': 'pointer'});
        $('#fasthelp dt, #fasthelp dd, #fasthelp h4').hide();

    }
)
