function VideoAJAX(sid, tr, groups, tr_popup, collections) {
    var oThis = this;
    
    this.sid = sid;
    this.groups_popup = null;
    
    this.smiles = {
        ':)': '<img src="http://m1.kefche.com/icons/c/smile.gif" alt=":)" />',
        ':-)': '<img src="http://m1.kefche.com/icons/c/smile.gif" alt=":-)" />',
        ':(': '<img src="http://m1.kefche.com/icons/c/sadsmile.gif" alt=":(" />',
        ':-(': '<img src="http://m1.kefche.com/icons/c/sadsmile.gif" alt=":-(" />',
        ':D': '<img src="http://m1.kefche.com/icons/c/bigsmile.gif" alt=":D" />',
        ':d': '<img src="http://m1.kefche.com/icons/c/bigsmile.gif" alt=":D" />',
        '8)': '<img src="http://m1.kefche.com/icons/c/cool.gif" alt="8)" />',
        ':O)': '<img src="http://m1.kefche.com/icons/c/surprised.gif" alt=":O)" />',
        ':o)': '<img src="http://m1.kefche.com/icons/c/surprised.gif" alt=":O)" />',
        ';)': '<img src="http://m1.kefche.com/icons/c/wink.gif" alt=";)" />',
        ';-)': '<img src="http://m1.kefche.com/icons/c/wink.gif" alt=";-)" />',
        ';(': '<img src="http://m1.kefche.com/icons/c/crying.gif" alt=";(" />',
        ';-(': '<img src="http://m1.kefche.com/icons/c/crying.gif" alt=";-(" />',
        ':*': '<img src="http://m1.kefche.com/icons/c/kiss.gif" alt=":*" />',
        ':P': '<img src="http://m1.kefche.com/icons/c/tongueout.gif" alt=":P" />',
        ':p': '<img src="http://m1.kefche.com/icons/c/tongueout.gif" alt=":P" />',
        ':-P': '<img src="http://m1.kefche.com/icons/c/tongueout.gif" alt=":-P" />',
        ':-p': '<img src="http://m1.kefche.com/icons/c/tongueout.gif" alt=":-P" />',
        '|-)': '<img src="http://m1.kefche.com/icons/c/sleepy.gif" alt="|-)" />', 
        'x=(': '<img src="http://m1.kefche.com/icons/c/angry.gif" alt="x=(" />',
        'X=(': '<img src="http://m1.kefche.com/icons/c/angry.gif" alt="x=(" />',
        ':-S': '<img src="http://m1.kefche.com/icons/c/worried.gif" alt=":-S" />',
        ':-s': '<img src="http://m1.kefche.com/icons/c/worried.gif" alt=":-S" />',
        '8-|': '<img src="http://m1.kefche.com/icons/c/nerd.gif" alt="8-|" />'
    };
    
    
    this.RemoveCollections = function (video_id, coll_id, obj) {
        var request = {
            url: '/video/ajax_handle.php?action=remove_collections',
            data: {
                video_id: video_id,
                coll_id: coll_id
            },
            onSuccess: function (res) {
                oThis.fadeOut(obj, 100);
            }
        };
        myAJAX(request);
    }
    
    this.RemoveVideo = function (video_id, obj) {
        var request = {
            url: '/video/ajax_handle.php?action=remove_video',
            data: {
                video_id: video_id
            },
            onSuccess: function (res) {
                if(obj) {
                    oThis.setOpacity(obj, 100);
                    oThis.fadeOut(obj, 60);
                } else {
                    location.reload();
                }
                
            }
        };
        myAJAX(request);
    }
    
    
    this.AddFavorites = function (video_id, obj, link, text, text2) {
        var request = {
            url: '/video/ajax_handle.php?action=add_favorites',
            data: {
                video_id: video_id
            },
            onSuccess: function (res) {
                obj.innerHTML = res;
                oThis.setOpacity(obj, 100);
                obj.style.display = 'block';
                setTimeout(
                function () {
                    oThis.fadeOut(obj, 100);
                }, 5000);
                if (link) {
                    link.innerHTML = '<span></span>'+text;
                    link.onclick = function () {
                        oThis.RemoveFavorites(video_id, obj, link, text2, text);
                    }
                }
            },
            
            onFailure: function (res) {
                obj.innerHTML = res;
                oThis.setOpacity(obj, 100);
                obj.style.display = 'block';
            }
        };
        myAJAX(request);
    }
    
    this.RemoveFavorites = function (video_id, obj, link, text, text2) {
        var request = {
            url: '/video/ajax_handle.php?action=remove_favorites',
            data: {
                video_id: video_id
            },
            onSuccess: function (res) {
                if (link) {
                    obj.innerHTML = res;
                    oThis.setOpacity(obj, 100);
                    obj.style.display = 'block';
                    setTimeout(
                    function () {
                        oThis.fadeOut(obj, 100);
                    }, 5000);
                    link.innerHTML = '<span></span>'+text;
                    link.onclick = function () {
                        oThis.AddFavorites(video_id, obj, link, text2, text);
                    }
                } else {
                    oThis.fadeOut(obj, 100);
                }
            },
            
            onFailure: function (res) {
                obj.innerHTML = res;
                oThis.setOpacity(obj, 100);
                obj.style.display = 'block';
            }
        };
        myAJAX(request);
    }
    
    this.AddAbuse = function (video_id, type_id, obj, abuse_panel) {
        var request = {
            url: '/video/ajax_handle.php?action=add_abuse',
            data: {
                video_id: video_id,
                abuse_id: type_id
            },
            onSuccess: function (res) {
                obj.innerHTML = res;
                oThis.setOpacity(obj, 100);
                obj.style.display = 'block';
                abuse_panel.style.display = 'none';
                setTimeout(
                function () {
                    oThis.fadeOut(obj, 100);
                }, 5000);
            },
            
            onFailure: function (res) {
                obj.innerHTML = res;
                oThis.setOpacity(obj, 100);
                obj.style.display = 'block';
            }
        };
        myAJAX(request);
    }
    
    this.AddVote = function (video_id, vote, obj) {
        var request = {
            url: '/video/ajax_handle.php?action=add_vote',
            data: {
                video_id: video_id,
                vote: vote
            },
            onSuccess: function (res) {
                obj.innerHTML = res;
                oThis.setOpacity(obj, 100);
                obj.style.display = 'block';
                setTimeout(
                function () {
                    oThis.fadeOut(obj, 100);
                }, 5000);
            },
            
            onFailure: function (res) {
                obj.innerHTML = res;
                oThis.setOpacity(obj, 100);
                obj.style.display = 'block';
            }
        };
        myAJAX(request);
    }
    
    this.AddSpam = function (comment_id, obj) {
        var request = {
            url: '/video/ajax_handle.php?action=add_spam',
            data: {
                comment_id: comment_id
            },
            onSuccess: function (res) {
                $('spam_'+comment_id).innerHTML = res;
            },
            onFailure: function (res) {
                alert(tr_popup['VIDEO_COMMENTS_YOU_CAN_VOTE_ONCE_PER_DAY']);
                return false;
            }
        };
        myAJAX(request);
    }
    
    this.RemoveSpam = function (comment_id, obj) {
        var request = {
            url: '/video/ajax_handle.php?action=remove_spam',
            data: {
                comment_id: comment_id
            },
            onSuccess: function (res) {
                $('spam_'+comment_id).innerHTML = res;
            },
            onFailure: function (res) {
                alert(tr_popup['VIDEO_COMMENTS_YOU_CAN_VOTE_ONCE_PER_DAY']);
                return false;
            }
        };
        myAJAX(request);
    }
    
    this.DelComment = function (comment_id, obj) {
        var request = {
            url: '/video/ajax_handle.php?action=del_comment',
            data: {
                comment_id: comment_id
            },
            onSuccess: function (res) {
                oThis.setOpacity(obj.parentNode.parentNode.parentNode, 100);
                oThis.fadeOut(obj.parentNode.parentNode.parentNode, 100, function () {obj.parentNode.parentNode.parentNode.parentNode.removeChild(obj.parentNode.parentNode.parentNode);});
            },
            
            onFailure: function (res) {
                return false;
            }
        };
        myAJAX(request);
    }
    
    this.editComment = function (msg_id, link) {
        var msg = link.parentNode.parentNode.getElementsByTagName('p')[0];
        
        if(!link.taEdit) {
            var br = document.createElement('br');
            link.formEdit = document.createElement('div');
            link.taEdit = document.createElement('textarea');
            link.saveBtn = document.createElement('input');
            
            link.saveBtn.type = 'button';
            link.saveBtn.value = tr['COMMENTS_SAVE_COMMENT'];
            link.saveBtn.onclick = function () {
                oThis.save_comment(msg_id, link);
            };
            
            link.taEdit.className = 'comment_ta';
            
            msg.parentNode.appendChild(link.formEdit);
            link.formEdit.appendChild(link.taEdit);
            link.formEdit.appendChild(br);
            link.formEdit.appendChild(link.saveBtn);
            
            show(msg);
            
            var comm = msg.innerHTML;
            comm = comm.replace(/<img[^>]+alt="([^"><]+?)".*?>/gi, '$1');
            link.taEdit.value = br2nl(comm);
        }
        
        toggle(link.formEdit);
        toggle(msg);
    }
        this.save_comment = function (msg_id, link) {
            var request = {
                url: '/video/ajax_handle.php?action=save_comment',
                data: {
                    msg_id: msg_id,
                    comment: link.taEdit.value
                },
                onSuccess: function (res) {
                    var comm = link.taEdit.value,
                        msg = link.parentNode.parentNode.getElementsByTagName('p')[0];
                    
                    hide(link.formEdit);
                    show(msg);
                    
                    for(var smilie in oThis.smiles) {
                        var regex = new RegExp(RegExp.escape(smilie), "g");
                        comm = comm.replace(regex, oThis.smiles[smilie]);
                    }
                    
                    msg.innerHTML = nl2br(comm);
                }
                
            };
            myAJAX(request);
        }
    
    this.AddComment = function (video_id, comment, obj, msg_obj) {
        var request = {
            url: '/video/ajax_handle.php?action=add_comment',
            data: {
                video_id: video_id,
                comment: comment
            },
            onSuccess: function (res) {
                var info = eval('('+res+')');
                    comm = document.createElement('div'),
                    panel = obj.parentNode;
                
                comm.innerHTML = info.comment;
                panel.parentNode.insertBefore(comm, nextNode(panel));
                if (obj.parentNode.reset) obj.parentNode.reset();
                
                msg_obj.style.display = 'block';
                msg_obj.innerHTML = info.msg;
                
                if(tooltip) tooltip.initElements();
                
                oThis.setOpacity(comm, 10);
                setTimeout(
                    function () {
                        oThis.fadeIn(comm, 20);
                    }, 500);
                
                oThis.setOpacity(msg_obj, 100);
                setTimeout(
                    function () {
                        oThis.fadeOut(msg_obj, 100);
                    }, 5000);
            },
            
            onFailure: function (res) {
                msg_obj.style.display = 'block';
                msg_obj.innerHTML = res;
                
                oThis.setOpacity(msg_obj, 100);
                setTimeout(
                    function () {
                        oThis.fadeOut(msg_obj, 100);
                    }, 5000);
                
                return false;
            }
        };
        myAJAX(request);
    }
    
    this.ShowReply = function (video_id, comment_id, obj) {
        var cont = obj.parentNode.parentNode.parentNode;
            panel = $('comment_reply_'+comment_id);
        
        if (!panel) {
            var panel = document.createElement('div'),
                comm = document.createElement('textarea'),
                btn_ok = document.createElement('input'),
                btn_cancel = document.createElement('input'),
                msg = document.createElement('div');
            
            comm.className = 'comment_ta';
            
            btn_ok.type = 'button';
            btn_ok.value = tr['COMMENTS_SAVE_COMMENT'];
            btn_ok.onclick = function () {
                oThis.AddReply(video_id, comment_id, comm.value, this.parentNode, msg);
            }
            
            btn_cancel.type = 'button';
            btn_cancel.value = tr['COMMENTS_CANCEL_COMMENT'];
            btn_cancel.onclick = function () {
                hide(panel);
            }
            
            panel.id = 'comment_reply_'+comment_id;
            panel.style.display = 'none';
            panel.appendChild(comm);
            
            if($('emote_list')) {
                /* Kopirame i ikonkite */
                var emote = document.createElement('div');
                emote.innerHTML = $('emote_list').innerHTML;
                emote.className = $('emote_list').className;
                
                var elink = nextNode($('emote_list'));
                var link = document.createElement('a');
                
                link.innerHTML = elink.innerHTML;
                link.className = 'emote-link';
                link.href='#';
                link.onclick = function () {toggle(prevNode(this)); return false;};
                
                panel.appendChild(emote);
                panel.appendChild(link);
                
                var list = emote.getElementsByTagName('a');
                for(var i=0; i<list.length; i++) {
                    list[i].onclick = function (){
                        var msgbox = prevNode(this.parentNode),
                            img = this.getElementsByTagName('img')[0];
                        
                        msgbox.value += "" + img.getAttribute('alt') + " ";
                        msgbox.focus();
                        
                        hide(this.parentNode);
                    }
                }
            }
            
            panel.appendChild(btn_ok);
            panel.appendChild(document.createTextNode(' '));
            panel.appendChild(btn_cancel);
            panel.appendChild(msg);
            cont.appendChild(panel);
        }
        
        toggle(panel);
        
        if(panel.style.display != 'none') {
            panel.getElementsByTagName('textarea')[0].focus();
        }
    }
    
    this.AddReply = function (video_id, comment_id, comment, obj, msg) {
        var request = {
            url: '/video/ajax_handle.php?action=add_reply',
            data: {
                video_id: video_id,
                comment_id: comment_id,
                comment: comment
            },
            onSuccess: function (res) {
                var info = eval('('+res+')');
                    comm = document.createElement('div'),
                    bf = obj.parentNode.getElementsByTagName('div')[0];
                
                comm.innerHTML = info.comment;
                bf.appendChild(comm);
                
                hide(obj);
                if(tooltip) tooltip.initElements();
                
                oThis.setOpacity(comm, 10);
                setTimeout(
                    function () {
                        oThis.fadeIn(comm, 20);
                    }, 500);
            },
            onFailure: function (res) {
                msg.style.display = 'block';
                msg.innerHTML = res;
                
                oThis.setOpacity(msg, 100);
                setTimeout(
                    function () {
                        oThis.fadeOut(msg, 100);
                    }, 5000);
                
                return false;
            }
        };
        myAJAX(request);
    }
    
    this.ShowReplys = function (obj) {
        var list = obj.parentNode.getElementsByTagName('div');
        
        for(var i=0; i<list.length; i++) {
            if (list[i].className == 'comment-item hide') {
                list[i].style.display = 'block';
                fadeIn(list[i], 10);
            }
        }
    }
    
    
    this.ShowCollections = function (video_id, link) {
        if (this.groups_popup) {
            this.groups_popup.hide();
            delete this.groups_popup;
        }
        
        var select = new DropDown(tr_popup['VIDEO_SELECT_COLLECTION'], 'dropdown-std', null);
        
        this.groups_popup = new PopupWindow(tr_popup['VIDEO_ADD_TO_COLLECTION'], 'dialog-std');
        
        
        function buttons() {
            return [new Button(tr_popup['VIDEO_ADD_TO_COLLECTION_BTN'], 'input-submit', function () {
                        this.disabled=true;
                        oThis.add_to_collection(video_id, select.getValue(), link, this);
                    }),
                    new Button(tr_popup['VIDEO_CLOSE_BTN'], 'input-button', function () {oThis.groups_popup.hide(); delete oThis.groups_popup;} ) ];
        }
        function content() {
            var cont = document.createElement('div'),
                add_elements = new Array(),
                add_coll = document.createElement('input');
            
            add_coll.className = 'input-std';
            add_coll.value = tr_popup['VIDEO_CREATE_COLLECTION'];
            add_coll.onfocus = function () {if (this.value == tr_popup['VIDEO_CREATE_COLLECTION']) this.value = '';};
            add_coll.onblur = function () {if (this.value == '') this.value = tr_popup['VIDEO_CREATE_COLLECTION'];};
            add_coll.onkeydown = function (event) {var value = this.value;oThis.get_key(event, function () {oThis.add_video_collection(value, select)});};
            
            add_elements.push(add_coll);
            
            cont.appendChild(document.createTextNode(tr_popup['VIDEO_ADD_TO_COLLECTION_DESC']));
            
            var options = new Array();
            for(var i in collections) {
                var opt = new DropDownOption(collections[i].title, i, function (event) {select.selectOption(event, this.v, this.t);});
                options.push(opt);
            }
            
            select.setOptions(options);
            select.init();
            select.addElements(add_elements);
            cont.appendChild(select.get());
            
            return cont;
        }
        
        this.groups_popup.setContentFunction ( content );
        this.groups_popup.setButtonFunction ( buttons );
        
        this.groups_popup.init();
        this.groups_popup.show();
        $('main_wraper').appendChild(this.groups_popup.get());
        this.groups_popup.position('center');
    }
    
    this.add_video_collection = function (title, select) {
        var request = {
            url: '/video/ajax_handle.php?action=add_collection',
            data: {
                title: title
            },
            onSuccess: function (res) {
                var cat_id = eval('('+res+')');
                select.addOption(title, cat_id, function (event) {select.selectOption(event, this.v, this.t);});
                select.selectOption (null, cat_id, title);
                
                if (!collections) collections = {};
                
                collections[cat_id] = {"title": title};
            }
        };
        myAJAX(request);
    }
    
    this.add_to_collection = function (video_id, coll_id, link, btn) {
        var request = {
            url: '/video/ajax_handle.php?action=add_to_collection',
            data: {
                video_id: video_id,
                coll_id: coll_id
            },
            onSuccess: function (res) {
                oThis.groups_popup.showMessage(res);
                oThis.groups_popup.removeButtons();
                oThis.groups_popup.addButton(new Button(tr_popup['VIDEO_CLOSE_BTN'], 'input-button', function () {oThis.groups_popup.hide(); delete oThis.groups_popup;} ));
            },
            onFailure: function (res) {
                oThis.groups_popup.showError(res);
                setTimeout(function () {btn.disabled = false;}, 2000);
            }
        };
        myAJAX(request);
    }
    
    
    
    this.ShowGroups = function (video_id, link) {
        if (this.groups_popup) {
            this.groups_popup.hide();
            delete this.groups_popup;
        }
        
        var select = new DropDown(tr_popup['VIDEO_SELECT_GROUP'], 'dropdown-std', null);
        
        this.groups_popup = new PopupWindow(tr_popup['VIDEO_ADD_TO_GROUP'], 'dialog-std');
        
        
        function buttons() {
            return [new Button(tr_popup['VIDEO_ADD_TO_GROUP_BTN'], 'input-submit', function () {
                        this.disabled=true;
                        oThis.add_to_group(video_id, select.getValue(), link, this);
                    }),
                    new Button(tr_popup['VIDEO_CLOSE_BTN'], 'input-button', function () {oThis.groups_popup.hide(); delete oThis.groups_popup;} ) ];
        }
        function content() {
            var cont = document.createElement('div');
            
            if (!groups) {
                cont.appendChild(document.createTextNode(tr_popup['VIDEO_YOU_DONT_HAVE_GROUPS']));
            } else {
                cont.appendChild(document.createTextNode(tr_popup['VIDEO_ADD_TO_GROUP_DESC']));
                
                var options = new Array();
                for(var i in groups) {
                    var opt = new DropDownOption(groups[i], i, function (event) {select.selectOption(event, this.v, this.t);});
                    options.push(opt);
                }
                
                select.setOptions(options);
                select.init();
                cont.appendChild(select.get());
            }
            
            return cont;
        }
        
        this.groups_popup.setContentFunction ( content );
        this.groups_popup.setButtonFunction ( buttons );
        
        this.groups_popup.init();
        this.groups_popup.show();
        $('main_wraper').appendChild(this.groups_popup.get());
        this.groups_popup.position('center');
    }
    
    this.add_to_group = function (video_id, group_id, link, btn) {
        var request = {
            url: '/video/ajax_handle.php?action=add_to_group',
            data: {
                video_id: video_id,
                group_id: group_id
            },
            onSuccess: function (res) {
                oThis.groups_popup.showMessage(res);
                setTimeout(function () {btn.disabled = false;}, 2000);
            },
            onFailure: function (res) {
                oThis.groups_popup.showError(res);
                setTimeout(function () {btn.disabled = false;}, 2000);
            }
        };
        myAJAX(request);
        
    }
    
    this.showHideSpam = function (obj, link) {
        var n = obj;
        
        do n = n.nextSibling;
        while (n && n.nodeType != 1);
        
        if (n.style.display == 'none' || n.style.display == '') {
            link.className = 'hide-btn';
            show(n);
            fadeIn(n, 50);
        } else {
            link.className = 'show-btn';
            fadeOut(n, 50, function () {hide(n);});
        }
    }
    
    
    
    this.fadeOut = function(obj, opacity, onComplete) {
        
        if (opacity < 20) {
            if (obj) obj.style.display = 'none';
            if (onComplete) onComplete();
        } else {
            oThis.setOpacity(obj, opacity);
            opacity -= 10;
            setTimeout(
                function () {
                    oThis.fadeOut(obj, opacity, onComplete);
                }, 150);
        }
    }
    
    this.fadeIn = function(obj, opacity, onComplete) {
        
        if (opacity > 100) {
            oThis.setOpacity(obj, 100);
            if (onComplete) onComplete();
        } else {
            oThis.setOpacity(obj, opacity);
            opacity += 10;
            setTimeout(
                function () {
                    oThis.fadeIn(obj, opacity, onComplete);
                }, 150);
        }
    }
    
    this.get_key = function(e, okFunc) {
        if (!e) e = window.event;
        
        var asc = !e.keyCode ? (!e.which ? e.charCode : e.which) : e.keyCode;
        
        if (asc != 17) {
            // натиснат е клавиш
            if (asc == 13 || (this.is_control_pressed && asc == 83)) {
                // CTRL + ENTER или CTRL+S
                this.is_control_pressed = false;
                if(okFunc) okFunc();
            }
        } else if (asc == 17) {
            this.is_control_pressed = 1;
        } else {
            this.is_control_pressed = false;
        }
        
        
    }
    
    this.setOpacity = function (obj, opacity) {
        obj.style.opacity = opacity / 100;
        obj.style.filter = 'alpha(opacity=' + opacity + ')';
    }
}