/* override some bad prototype behaviours */
Form.Element.Serializers.selectOne = function(element) {
    var value = '', opt, index = element.selectedIndex;
    if (index >= 0) {
        opt = element.options[index];
        value = opt.value;
    }
    return [element.name, value];
}

Form.Element.Serializers.selectMany = function(element) {
    var value = [];
    for (var i = 0; i < element.length; i++) {
        var opt = element.options[i];
        if (opt.selected)
            value.push(opt.value || opt.text);
    }
    return [element.name, value];
}

var ajaxActions = {
    obj : Object,
    loading_cnt: 0,

    init : function(root) {
        if (!document.getElementById || !document.createElement || !document.getElementsByTagName) {
            return;
        }

        var i,j;

        if (!root) {
            root = document;
        } else {
            root = $(root);
        }

        /* parse links */
        var current = root.getElementsByTagName('a');
        var curLen = current.length;

        for (j = 0; j < curLen; j++) {
            if (current[j].name != 'ajax') {
                continue;
            }

            current[j].onclick = this.click;
        }

        /* parse forms */
        var current = root.getElementsByTagName('input');
        var curLen = current.length;

        for (j = 0; j < curLen; j++) {
            if (current[j].name != 'ajax' || !current[j].form) {
                continue;
            }

            current[j].form.onsubmit = this.submit;
        }

//         Element.hide('loading');
    },

    request: function(url, noHistory) {
        if (!noHistory) {
            dhtmlHistory.add(MyHistory.getHashFromUrl(url), url + '::' + pars);
        }

        ajaxActions.loading_cnt++;
        var pars = '';
        var myAjax = new Ajax.Request(url,
            {
                method: 'get',
                parameters: pars,
                onLoading: ajaxActions.loading,
                onComplete: ajaxActions.callBack
            }
        );
    },

    click: function(e) {
        ajaxActions.obj = this;
        ajaxActions.request(this.href, !Element.hasClassName(this, 'no_history'));

        return false;
    },

    submit: function(e) {
        ajaxActions.obj = this;
        url = this.action;

        var pars = Form.serialize(this);
        var myAjax = new Ajax.Request(url,
            {
                method: 'post',
                parameters: pars,
                onLoading: ajaxActions.loading,
                onComplete: ajaxActions.callBack
            }
        );

        return false;
    },

    windowHeight: function() {
        if (typeof(window.innerHeight) == 'number') {
            return (window.innerHeight);
        } else if (document.documentElement && document.documentElement.clientHeight) {
            return (document.documentElement.clientHeight);
        } else if (document.body && document.body.clientHeight) {
            return (document.body.clientHeight);
        }
    },

    loading: function(XHR, eJSON) {
        var loading = $('loading');
        var offsets = Position.realOffset(loading);
        var height = ajaxActions.windowHeight() * 45 / 100;
        loading.style.top = '0px';
        loading.style.left = '0px';
        Element.show('loading');
        $('ajax_test').value = 'loading';
    },

    callBack: function(XHR, eJSON) {
        var debug;

        debug = $('ajax_test');
        if (debug) {
            debug.value = XHR.responseText;
        }

        try {
            eval(XHR.responseText);
        } catch (e) {
//             if (debug) {
                alert(e.message);
//             }
        }

        ajaxActions.loading_cnt--;
        if (ajaxActions.loading_cnt < 1) {
            ajaxActions.loading_cnt = 0;
            Element.hide('loading');
        }
    },

    initJavascript: function() {
        var scripts = $('right_column').getElementsByTagName('script');
        var i;

        for (i = 0; i < scripts.length; i++) {
            eval(scripts[i].firstChild.nodeValue);
        }
    },

    setAlternateLinks: function(newLinks) {
        var head;
        var links;
        var i;
        var j;

        if (!newLinks) {
            return ;
        }

        head = document.getElementsByTagName('head')[0];

        /* replacing old alternate links */
        links = head.getElementsByTagName('link');
        for (i = 0, j = 0; i < links.length && j < newLinks.length; i++) {
            if (links[i].rel == 'alternate') {
                links[i].href = newLinks[j++];
            }
        }

        if (i < links.length) {
            /* removing remaining links if any */
            for (; i < links.length; i++) {
                if (links[i].rel == 'alternate') {
                    head.removeChild(links[i]);
                }
            }
        }
        if (j < newLinks.length) {
            /* adding remaining links */
            for (; j < newLinks.length; j++) {
                var node = document.createElement('link');
                node.rel = 'alternate';
                node.type = 'application/atom+xml';
                node.title = 'Atom';
                node.href = newLinks[j];
                head.appendChild(node);
            }
        }
    },

    updateLabel: function(id, label, href) {
        var obj;

        obj = $(id);
        if (!obj) {
            return ;
        }

        Element.update(id, label);
        if (href && obj.href) {
            obj.href = href;
        }
    },

    addInputText: function(id, name, rss_url, uri, but_label) {
        var text;
        var form;
        var button;
        var obj;

        obj = $(id);
        if (!obj) {
            return ;
        }

        while (obj.firstChild) {
            obj.removeChild(obj.firstChild);
        }

        form = document.createElement('form');
        form.method = 'post';
        form.action = uri;

        text = document.createElement('input');
        text.type = 'text';
        text.size = '50';
        text.value = rss_url
        text.completions = null;
        text.selectedIndex = -1;
        text.setAttribute('name', name);

        form.appendChild(text);

        text = document.createElement('input');
        text.type = 'hidden';
        text.value = '1';
        text.setAttribute('name', 'ajax');

        form.appendChild(text);

        text = document.createElement('input');
        text.type = 'hidden';
        text.value = '1';
        text.setAttribute('name', 'posted_rss_url');

        form.appendChild(text);

        button = document.createElement('input');
        button.style.marginLeft = '5px';
        button.type = 'submit';
        button.setAttribute('name', 'submit');
        button.value = but_label;

        form.appendChild(button);

        obj.appendChild(form);
        obj.onclick = null;

        text.focus();
    },

    addScript: function(src) {
        var head;
        var scripts;
        var found;
        var node;
        var i;

        head = document.getElementsByTagName('head')[0];
        scripts = head.getElementsByTagName('script');
        for (i = 0, found = false; !found && i < scripts.length; i++) {
            if (scripts[i].src == src) {
                found = true;
            }
        }
        if (!found) {
            node = document.createElement('script');
            node.type = 'text/javascript';
            node.src = src;
            head.appendChild(node);
        }
    }
};

//function ajaxActionsLoader() {
//    ajaxActions.init();
//}

document.observe('dom:loaded', function () {
    ajaxActions.init();
});
