var pad_manager = new Class({

    data: {},
    bookmarks: {},
    forms: {},

    Implements: [Options, Events],

    initialize: function(options)
    {
        this._initBookmarks();
        this._addLinkActions();
        this._actionLinks();
        this._aboutLinks();
    },

    _parseRelValues: function(rel)
    {
        var values = rel.split(",");

        var ret = {};

        for(var x = 0, l = values.length; x < l; x++)
        {
            var kv = values[x].split(":");
            ret[kv[0]] = kv[1];
        }

        return ret;
    },

    _initBookmarks: function()
    {
        $$('.bookmark_area').each(function(area)
        {
            var link = area.getElement('a');
            var text = area.getElement('span').getHTML();

            var area_data = this._parseRelValues(link.rel);

            this.bookmarks[area.id] = {'link' : link.href, 'text' : text, 'position' : area_data.position};
        }.bind(this));
    },

    _addLinkActions: function()
    {
        $$('.bookmark_area').each(function(area)
        {
            var add_link = $$(area).getElements('.add_bookmark_link');

            if(add_link[0][0])
            {
                add_link[0][0].removeEvents('click');
                add_link[0][0].addEvent('click', function(e)
                {
                    e.preventDefault();
                    this._requestBookmarkForm(area);                
                }.bind(this));
            }

            var action_links = $$(area).getElements('.bookmark_action_links a');
            if(action_links[0])
            {
                action_links = action_links[0];

                action_links.each(function(link)
                {
                    link.removeEvents('click');
                    link.addEvent('click', function(e)
                    {
                        e.preventDefault();
                        this._submitActionLinks(area, link);
                    }.bind(this));
                }.bind(this));
            }

        }.bind(this));
    },

    _submitActionLinks: function(area, link)
    {
        var link_data = this._parseRelValues(link.rel);

        new Request({
            method: 'get',
            url:'/bookmark_action.php', 
            data: link_data,
            onSuccess: function(response_text, response_xml)
            {
                resp = JSON.decode(response_text);
                area.setHTML(resp.message);
                area.setStyle('padding-top', '12px');
                this._addLinkActions();
            }.bind(this)
        }).send();

    },

    _requestBookmarkForm: function(area)
    {
        var link = area.getElement('a');

        var area_data = this._parseRelValues(link.rel);

        new Request({
            method: 'get',
            url:'/bookmark_action.php', 
            data: area_data,
            onSuccess: function(response_text, response_xml)
            {
                resp = JSON.decode(response_text);

                this.bookmarks[area.id]['old_html'] = area.getHTML();

                area.setHTML(resp.message);

                //this comes in with the form.
                area.getElement('#position').value = this.bookmarks[area.id]['position'];

                this.forms[area.id] = area.getElement('.create_bookmark_form');

                var form = this.forms[area.id];

                this._prepareInputs(form);

                form.removeEvents('submit');
                form.addEvent('submit', function(e)
                {
                    e.preventDefault();
                    this._submitBookmarkForm(area, form);
                }.bind(this));

                form.removeEvents('reset');
                form.addEvent('reset', function(e)
                {
                    e.preventDefault();
                    area.setHTML(this.bookmarks[area.id]['old_html']);
                    this._addLinkActions();
                }.bind(this));

            }.bind(this)
        }).send();
    },

    _submitBookmarkForm: function(area, form)
    {
        var bookmark_data = form;

        new Request({
            method: 'get',
            url: '/bookmark_action.php',
            data: bookmark_data,
            onSuccess: function(response_text, response_xml)
            {
                var resp = JSON.decode(response_text);
                if(resp.status == 'success')
                {
                    area.setHTML(resp.message);
                    area.setStyle('padding-top', '0px');
                    this.bookmarks[area.id] = {'link' : resp.link, 'text' : resp.link_text, 'position' : resp.position};

                    $$('.bookmark_link').each(function(link)
                    {
                        link.removeEvents('click');
                    });
                    this._addLinkActions();
                }
            }.bind(this)
        }).send();
    },

    _actionLinks: function()
    {
        var elements = $$('#action_links').getElements('a.action_link');
        elements = elements[0];

        elements.each(function(link)
        {
            link.removeEvents('click');
            link.addEvent('click', function(e)
            {
                e.preventDefault();

                link_data = this._parseRelValues(link.rel);

                if(link_data.send_bookmarks == 'true')
                {
                    form_data = {'action':link_data.action, 'bookmarks' : this.bookmarks};
                }
                else
                {
                    form_data = {'action':link_data.action};
                }
                form_data = {'action':link_data.action};

                new Request({
                    method: 'get',
                    url: '/bookmark_action.php',
                    data: form_data,
                    onSuccess: function(response_text, response_xml)
                    {
                        var resp = JSON.decode(response_text);
                        if(resp.status == 'success')
                        {
                            switch(resp.next_step)
                            {
                                case 'prepare_clear_link':
                                    $$('#action_links').setHTML(resp.message);
                                    this._actionLinks();
                                    break;
                                case 'clear_bookmarks':
                                    this._clearBookmarks(resp);
                                    this._actionLinks();
                                    break;
                                case 'show_message':
                                    $$('#action_links').setHTML(resp.message);
                                    this._actionLinks();
                                    break;
                                case 'prepare_save_form':
                                    this._prepareSaveForm(resp);
                                    break;
                               case 'prepare_login_form':
                                    this._prepareLoginForm(resp);
                                    break;
                            }
                            this._addLinkActions();

                            if(resp.pad_name)
                            {
                                if(resp.pad_name = 'not saved')
                                {
                                    document.title = resp.pad_name;
                                }
                                else
                                {
                                    document.title = 'this pad: '+resp.pad_name;
                                }
                            }
                        }
                    }.bind(this)
                }).send();
            }.bind(this));
        }.bind(this));
    },

    _aboutLinks: function()
    {
        var elements = $$('#about_links').getElements('a.action_link');
        elements = elements[0];

        elements.each(function(link)
        {
            link.removeEvents('click');
            link.addEvent('click', function(e)
            {
                e.preventDefault();

                link_data = this._parseRelValues(link.rel);

                if(link_data.send_bookmarks == 'true')
                {
                    form_data = {'action':link_data.action, 'bookmarks' : this.bookmarks};
                }
                else
                {
                    form_data = {'action':link_data.action};
                }
                form_data = {'action':link_data.action};

                new Request({
                    method: 'get',
                    url: '/bookmark_action.php',
                    data: form_data,
                    onSuccess: function(response_text, response_xml)
                    {
                        var resp = JSON.decode(response_text);
                        if(resp.status == 'success')
                        {
                            switch(resp.next_step)
                            {
                                case 'show_message':
                                    $$('#about_links').setHTML(resp.message);
                                    this._aboutLinks();
                                    this._actionLinks();
                                    break;
                            }
                            this._addLinkActions();
                        }
                    }.bind(this)
                }).send();
            }.bind(this));
        }.bind(this));
    },


    _submitSaveForm: function(form)
    {
        var link_objects = $$('a.bookmark');

        link_objects.each(function(link)
        {
            var url = link.href;
            var text = link.getElement('span.bookmark_link').getHTML();
            var link_data = this._parseRelValues(link.rel);
            var position = link_data.position;

            new Element('input', 
            {
                'type' : 'hidden',
                'id' : 'link_'+position,
                'name' : 'link_'+position,
                'value' : url
            }).injectInside(form);

            new Element('input', 
            {
                'type' : 'hidden',
                'id' : 'text_'+position,
                'name' : 'text_'+position,
                'value' : text 
            }).injectInside(form);

            new Element('input', 
            {
                'type' : 'hidden',
                'id' : 'position_'+position,
                'name' : 'position_'+position,
                'value' : position 
            }).injectInside(form);

        }.bind(this));

        new Request({
            method: 'get',
            url: '/bookmark_action.php',
            data: form.toQueryString(),
            onSuccess: function(response_text, response_xml)
            {
                var resp = JSON.decode(response_text);
                if(resp.status == 'success' && resp.next_step == 'update_bookmarks')
                {
                    $$('.bookmark_area').each(function(area)
                    {
                        i = area.id.replace("bookmark_area_", "");
                        if(resp.bookmarks[i])
                        {
                            this.bookmarks[area.id] = {'link' : resp.bookmarks[i]['link'], 'text' : resp.bookmarks[i]['text'], 'position' : resp.bookmarks[i]['position']};
                            output = resp.bookmark_template.replace(/{POSITION}/g, this.bookmarks[area.id]['position']);
                            output = output.replace(/{LINK}/g, this.bookmarks[area.id]['link']);
                            output = output.replace(/{TEXT}/g, this.bookmarks[area.id]['text']);
                            area.setHTML(output);
                        }
                    }.bind(this));

                    document.title = 'this pad: '+resp.pad_name;
                }

                $$('#action_links').setHTML(resp.message);
                this._actionLinks();

            }.bind(this)
        }).send();
    },

    _submitLoginForm: function(form)
    {
        new Request({
            method: 'get',
            url: '/bookmark_action.php',
            data: form,
            onSuccess: function(response_text, response_xml)
            {
                var resp = JSON.decode(response_text);
                if(resp.status == 'success' && resp.next_step == 'update_bookmarks')
                {
                    $$('.bookmark_area').each(function(area)
                    {
                        i = area.id.replace("bookmark_area_", "");
                        if(resp.bookmarks && resp.bookmarks[i])
                        {
                            this.bookmarks[area.id] = {'link' : resp.bookmarks[i]['link'], 'text' : resp.bookmarks[i]['text'], 'position' : resp.bookmarks[i]['position']};

                            output = resp.bookmark_template.replace(/{POSITION}/g, this.bookmarks[area.id]['position']);
                            output = output.replace(/{LINK}/g, this.bookmarks[area.id]['link']);
                            output = output.replace(/{TEXT}/g, this.bookmarks[area.id]['text']);
                            
                            area.setHTML(output);
                            area.setStyle('padding-top', '0px');
                        }
                        else
                        {
                            this.bookmarks[area.id] = {'link' : '', 'text' : '', 'position' : i};

                            output = resp.add_bookmark_template.replace(/{POSITION}/g, this.bookmarks[area.id]['position']);
                            area.setHTML(output);
                            area.setStyle('padding-top', '12px');
                        }

                    }.bind(this));
                }

                document.title = 'this pad: '+resp.pad_name;

                $$('#action_links').setHTML(resp.message);
                this._actionLinks();
                this._addLinkActions();

            }.bind(this)
        }).send();
    },

    _clearBookmarks: function(resp)
    {
        $$('.bookmark_area').each(function(area)
        {
            output = resp.bookmark_template.replace(/{POSITION}/g, this.bookmarks[area.id]['position']);
            area.setHTML(output);
            area.setStyle('padding-top', '12px');
        }.bind(this));
        $$('#action_links').setHTML(resp.message);
        this._actionLinks();
    },

    _prepareSaveForm: function(resp)
    {
        var action_links_old_html = $$('#action_links').getHTML();

        $$('#action_links').setHTML(resp.message);

        var form = $(document).getElement('#save_form');

        this._prepareInputs(form);

        form.removeEvents('submit');
        form.addEvent('submit', function(e)
        {
            e.preventDefault();
            this._submitSaveForm(form);
        }.bind(this));

        form.removeEvents('reset');
        form.addEvent('reset', function(e)
        {
            e.preventDefault();
            $$('#action_links').setHTML(action_links_old_html[0]);
            this._actionLinks();
        }.bind(this));
    },

    _prepareLoginForm: function(resp)
    {
        var action_links_old_html = $$('#action_links').getHTML();

        $$('#action_links').setHTML(resp.message);

        var form = $(document).getElement('#login_form');

        this._prepareInputs(form);

        form.removeEvents('submit');
        form.addEvent('submit', function(e)
        {
            e.preventDefault();
            this._submitLoginForm(form);
        }.bind(this));

        form.removeEvents('reset');
        form.addEvent('reset', function(e)
        {
            e.preventDefault();
            $$('#action_links').setHTML(action_links_old_html[0]);
            this._actionLinks();
        }.bind(this));
    },

    _prepareInputs: function(form)
    {
        $(form).getElements('input').each(function(input)
        {
            input.addEvent('focus', function(e)
            {
                input.setStyle('border', 'solid 1px black');
            });

            input.addEvent('blur', function(e)
            {
                input.setStyle('border', 'solid 1px #C0C0C0');
            });

        });
    }

});
