function MusicAJAX(sid, collections, tr, groups) {
    var oThis = this;
    
    this.sid = sid;
    this.collection_popup = null;
    this.groups_popup = null;
    
    
    this.AddFavorites = function (music_id, obj, link) {
        var request = {
            url: '/music/ajax_handle.php?action=add_favorites',
            data: {
                music_id: music_id
            },
            onSuccess: function (res) {
                obj.innerHTML = res;
                setOpacity(obj, 100);
                obj.style.display = 'block';
                setTimeout(
                    function () {
                        oThis.fadeOut(obj, 100);
                    }, 5000);
                
                if (link) {
                    link.className += '-sel';
                    link.onclick = function () {
                        oThis.RemoveFavorites(music_id, obj, link);
                        return false;
                    }
                }
            },
            
            onFailure: function (res) {
                obj.innerHTML = res;
                setOpacity(obj, 100);
                obj.style.display = 'block';
            }
        };
        myAJAX(request);
    }
    
    
    this.RemoveFavorites = function (music_id, obj, link) {
        var request = {
            url: '/music/ajax_handle.php?action=remove_favorites',
            data: {
                music_id: music_id
            },
            onSuccess: function (res) {
                obj.innerHTML = res;
                setOpacity(obj, 100);
                obj.style.display = 'block';
                setTimeout(
                    function () {
                        oThis.fadeOut(obj, 100);
                    }, 5000);
                
                if (link) {
                    link.className = link.className.replace('-sel', '');
                    link.onclick = function () {
                        oThis.AddFavorites(music_id, obj, link);
                        return false;
                    }
                }
            },
            
            onFailure: function (res) {
                obj.innerHTML = res;
                setOpacity(obj, 100);
                obj.style.display = 'block';
            }
        };
        myAJAX(request);
    }
    
    
    this.AddPlaylist = function (music_id, obj, link) {
        var request = {
            url: '/music/ajax_handle.php?action=add_playlist',
            data: {
                music_id: music_id
            },
            onSuccess: function (res) {
                obj.innerHTML = res;
                setOpacity(obj, 100);
                obj.style.display = 'block';
                setTimeout(
                    function () {
                        oThis.fadeOut(obj, 100);
                    }, 5000);
                
                if (link) {
                    link.className += '-sel';
                    link.onclick = function () {
                        oThis.RemoveFavorites(music_id, obj, link);
                        return false;
                    }
                }
            },
            
            onFailure: function (res) {
                obj.innerHTML = res;
                setOpacity(obj, 100);
                obj.style.display = 'block';
            }
        };
        myAJAX(request);
    }
    
    
    this.RemovePlaylist = function (music_id, obj, link) {
        var request = {
            url: '/music/ajax_handle.php?action=remove_playlist',
            data: {
                music_id: music_id
            },
            onSuccess: function (res) {
                obj.innerHTML = res;
                setOpacity(obj, 100);
                obj.style.display = 'block';
                setTimeout(
                    function () {
                        oThis.fadeOut(obj, 100);
                    }, 5000);
                
                if (link) {
                    link.className = link.className.replace('-sel', '');
                    link.onclick = function () {
                        oThis.AddFavorites(music_id, obj, link);
                        return false;
                    }
                }
            },
            
            onFailure: function (res) {
                obj.innerHTML = res;
                setOpacity(obj, 100);
                obj.style.display = 'block';
            }
        };
        myAJAX(request);
    }
    
    // COLLECTIONS 
    this.ShowCollections = function (music_id) {
        if (this.collection_popup) {
            oThis.collection_popup.hide();
            delete oThis.collection_popup;
        }
        if (this.groups_popup) {
            this.groups_popup.hide();
            delete this.groups_popup;
        }
        
        var select = new DropDown(tr['MUSIC_SELECT_COLLECTION'], 'dropdown-std', null),
            msg = document.createElement('textarea');
        
        this.collection_popup = new PopupWindow(tr['MUSIC_ADD_TO_COLLECTION'], 'dialog-std');
        
        
        function buttons() {
            return [new Button(tr['MUSIC_ADD_COLLECTION_BTN'], 'input-submit', function () {
                        if (select.getValue() > 0) {
                            this.disabled=true;
                            oThis.add_to_collection(music_id, select.getValue(), this);
                        } else {
                           oThis.collection_popup.showError(tr['MUSIC_ERROR_SELECT_COLLECTION_FIRST']);
                        }
                    }),
                    new Button(tr['MUSIC_CLOSE_BTN'], 'input-button', function () {oThis.collection_popup.hide(); delete oThis.collection_popup;} ) ];
        }
        function content() {
            var cont = document.createElement('div'),
                add_elements = new Array(),
                add_cat = document.createElement('input');
            
            cont.appendChild(document.createTextNode(tr['MUSIC_ADD_TO_COLLECTION_DESC']));
            
            add_cat.className = 'input-std';
            add_cat.value = tr['MUSIC_CREATE_COLLECTION'];
            add_cat.onfocus = function () {if (this.value == tr['MUSIC_CREATE_COLLECTION']) this.value = '';};
            add_cat.onblur = function () {if (this.value == '') this.value = tr['MUSIC_CREATE_COLLECTION'];};
            add_cat.onkeydown = function (event) {var value = this.value;oThis.get_key(event, function () {oThis.add_collection(value, select)});};
            
            add_elements.push(add_cat);
            
            var options = new Array();
            for(var i in collections) {
                var opt = new DropDownOption(collections[i], 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.collection_popup.setContentFunction ( content );
        this.collection_popup.setButtonFunction ( buttons );
        
        this.collection_popup.init();
        this.collection_popup.show();
        $('main_wraper').appendChild(this.collection_popup.get());
        this.collection_popup.position('center');
    }
    
    this.add_to_collection = function (music_id, collection_id, btn) {
        
        var request = {
            url: '/music/ajax_handle.php?action=add_to_collection',
            data: {
                music_id: music_id,
                collection_id: collection_id
            },
            onSuccess: function (res) {
                oThis.collection_popup.removeButtons();
                oThis.collection_popup.addButton(new Button('Close', 'input-button', function () {oThis.collection_popup.hide(); delete oThis.collection_popup;} ));
                oThis.collection_popup.showMessage(res);
            },
            onFailure: function (res) {
                if (res && res != '')
                    oThis.collection_popup.showError(res);
                
                setTimeout(function () {btn.disabled = false;}, 1000);
            }
        };
        myAJAX(request);
        
    }
    
    this.add_collection = function (title, select) {
        var request = {
            url: '/music/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);
            }
        };
        myAJAX(request);
    }
    //
    
    
    // REMOVE COLLECTION
    this.RemoveFromCollection = function (music_id, collection_id, link) {
        if (this.collection_popup) {
            oThis.collection_popup.hide();
            delete oThis.collection_popup;
        }
        if (this.groups_popup) {
            this.groups_popup.hide();
            delete this.groups_popup;
        }
        
        var msg = document.createElement('textarea');
        
        this.collection_popup = new PopupWindow(tr['MUSIC_REMOVE_FROM_COLLECTION'], 'dialog-std');
        
        
        function buttons() {
            return [new Button(tr['MUSIC_REMOVE_COLLECTION_BTN'], 'input-submit', function () {
                        this.disabled=true;
                        oThis.remove_from_collection(music_id, collection_id, link);
                    }),
                    new Button(tr['MUSIC_CLOSE_BTN'], 'input-button', function () {oThis.collection_popup.hide(); delete oThis.collection_popup;} ) ];
        }
        function content() {
            var cont = document.createElement('div'),
                add_elements = new Array(),
                add_cat = document.createElement('input');
            
            cont.appendChild(document.createTextNode(tr['MUSIC_REMOVE_FROM_COLLECTION_DESC']));
            
            return cont;
        }
        
        this.collection_popup.setContentFunction ( content );
        this.collection_popup.setButtonFunction ( buttons );
        
        this.collection_popup.init();
        this.collection_popup.show();
        $('main_wraper').appendChild(this.collection_popup.get());
        this.collection_popup.position('center');
    }
    
    this.remove_from_collection = function (music_id, collection_id, link) {
        var request = {
            url: '/music/ajax_handle.php?action=remove_from_collection',
            data: {
                music_id: music_id,
                collection_id: collection_id
            },
            onSuccess: function (res) {
                oThis.collection_popup.hide(); delete oThis.collection_popup;
                oThis.fadeOut(link, 100, function () {link.parentNode.removeChild(link);});
            }
        };
        myAJAX(request);
    }
    //
    
    this.ShowGroups = function (music_id, link) {
        if (this.collection_popup) {
            this.collection_popup.hide();
            delete this.collection_popup;
        }
        if (this.groups_popup) {
            this.groups_popup.hide();
            delete this.groups_popup;
        }
        
        var select = new DropDown(tr['MUSIC_SELECT_GROUP'], 'dropdown-std', null);
        
        this.groups_popup = new PopupWindow(tr['MUSIC_ADD_TO_GROUP'], 'dialog-std');
        
        
        function buttons() {
            if (!groups) {
                return [new Button(tr['MUSIC_CLOSE_BTN'], 'input-button', function () {oThis.groups_popup.hide(); delete oThis.groups_popup;} )];
            }
            
            return [new Button(tr['MUSIC_ADD_TO_GROUP_BTN'], 'input-submit', function () {
                        this.disabled=true;
                        oThis.add_to_group(music_id, select.getValue(), link, this);
                    }),
                    new Button(tr['MUSIC_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['MUSIC_YOU_DONT_HAVE_GROUPS']));
            } else {
                cont.appendChild(document.createTextNode(tr['MUSIC_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 (music_id, group_id, link, btn) {
        var request = {
            url: '/music/ajax_handle.php?action=add_to_group',
            data: {
                music_id: music_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.ShowRemoveFromGroup = function (music_id, group_id, top_parent) {
        if (this.collection_popup) {
            this.collection_popup.hide();
            delete this.collection_popup;
        }
        if (this.groups_popup) {
            this.groups_popup.hide();
            delete this.groups_popup;
        }
        
        this.groups_popup = new PopupWindow(tr['MUSIC_REMOVE_FROM_GROUP'], 'dialog-std');
        
        function buttons() {
            return [new Button(tr['MUSIC_REMOVE_FROM_GROUP_BTN'], 'input-submit', function () {
                        this.disabled=true;
                        oThis.remove_from_group(music_id, group_id, top_parent, this);
                    }),
                    new Button(tr['MUSIC_CLOSE_BTN'], 'input-button', function () {oThis.groups_popup.hide(); delete oThis.groups_popup;} ) ];
        }
        function content() {
            var cont = document.createElement('div');
            
            cont.appendChild(document.createTextNode(tr['MUSIC_REMOVE_FROM_GROUP_CONFIRM']));
            
            return cont;
        }
        
        this.groups_popup.display($('main_wraper'), content, buttons, 'center');
    }
    
    this.remove_from_group = function (music_id, group_id, top_parent, btn) {
        var request = {
            url: '/music/ajax_handle.php?action=remove_from_group',
            data: {
                music_id: music_id,
                group_id: group_id
            },
            onSuccess: function (res) {
                oThis.groups_popup.hide();
                delete oThis.groups_popup;
                
                fadeOut(top_parent, 70, function (){top_parent.parentNode.removeChild(top_parent);});
            },
            onFailure: function (res) {
                oThis.groups_popup.showError(res);
                setTimeout(function () {btn.disabled = false;}, 1000);
            }
        };
        myAJAX(request);
        
    }
    
    
    
    this.fadeOut = function(obj, opacity, onComplete) {
        
        if (opacity < 20) {
            if (obj) obj.style.display = 'none';
            if (onComplete) onComplete();
        } else {
            setOpacity(obj, opacity);
            opacity -= 10;
            setTimeout(
                function () {
                    oThis.fadeOut(obj, opacity, onComplete);
                }, 150);
        }
    }
    
    this.fadeIn = function(obj, opacity, onComplete) {
        
        if (opacity > 100) {
            setOpacity(obj, 100);
            if (onComplete) onComplete();
        } else {
            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;
        }
        
        
    }
}