var audio = {
    init: function() {
        if(typeof(this.audioPlayer)=="undefined") {
            this.audioPlayer = $('<div id="audioPlayer"><div id="audioVolume"><div id="volumeLevel"><span id="volumeValue"></span><div id="volumeLine"></div></div></div><div id="trackNavigation"><div id="trackProgress"><em id="progressMarker"></em><div id="progressLine"></div></div></div></div>');
            audioPlaylistO.eq(0).after(audio.audioPlayer);
            this.trackNavigation = $("#trackNavigation");
            this.progressMarkerS = $("#progressMarker")[0].style;
            this.trackProgressS = $("#trackProgress")[0].style;
            this.progressLine = $("#progressLine");
            this.progressLineS = this.progressLine[0].style;
            this.audioVolume = $("#audioVolume");
            this.volumeLineS = $("#volumeLine")[0].style;
            this.volumeValue = $("#volumeValue");
            this.currVolume = parseInt($.cookie('playerVolume'));
            if(!this.currVolume) {
                this.currVolume = 75;
            }
            this.trackTime = $('<span id="trackTime"></span>');
            this.playedId = null;
            this.trackPlayed;
            this.playerAnimate = 0;
            this.trackStatus = "stop";
            pageContainer = $("#Container");
            this.audioRoomTitle = $("#audioRoomTitle");
    // init flash move
            swfobject.embedSWF(staticDomain+"/swf/audio/aacplayer.swf?n4", "swfPlayer", "1", "1", "9.0.0", staticDomain+"/swf/expressInstall.swf", {}, {allowScriptAccess: "always"});
    // Disable text select
            if(fs.ie) {
                this.audioPlayer.bind('selectstart.disableTextSelect', function() {
                    return false;
                });
            } else if(!$.browser.mozilla) {
                this.audioPlayer.bind('mousedown.disableTextSelect', function() {
                    return false;
                });
            }
    // Track navigation
            var xLast = -1;
            this.navMouseD = 0;
            this.trackNavigation.mousemove(function(e) {
                var x = e.pageX;
                if(x != xLast) {
                    xLast = x;
                    var x1 =  x - audio.trackNavigationOffsetL - 1;
                    if(audio.navMouseD == 1) {
                        if(x1 > audio.trackProgressW) {
                            x1 = audio.trackProgressW * 0.9;
                        }
                        audio.progressLineS.width = x1 + "px";
                    }
                    audio.progressMarkerS.left = x1 + "px";
                }
            }).mousedown(function(e) {
                audio.navMouseD = 1;
                var pW = e.pageX - audio.trackNavigationOffsetL - 1;
                if(pW > audio.trackProgressW) {
                    pW = audio.trackProgressW * 0.9;
                }
                audio.progressLineS.width = pW + "px";
                pageContainer.one("mouseup", function(e) {
                    audio.navMouseD = 0;
                    var pW = e.pageX - audio.trackNavigationOffsetL - 1;
                    if(pW > audio.trackProgressW) {
                        pW = audio.trackProgressW * 0.9;
                    }
                    audio.seek(Math.ceil(pW * (audio.audioLength / audio.maxProgressLine)));
                });
            });
            if(fs.ie6) {
                this.trackNavigation.mouseenter(function(e) {
                    audio.progressMarkerS.display = "block";
                }).mouseleave(function(e) {
                    audio.progressMarkerS.display = "none";
                });
            }
    // Volume
            var volMouseD = 0;
            this.audioVolume.mouseenter(function() {
                $(this).stop().animate({opacity: 1}, "fast");
                if(fs.ie6) {
                    audio.volumeValue.show();
                }
            }).mouseleave(function() {
                $(this).stop().animate({opacity: 0.65}, "normal");
                if(fs.ie6) {
                    audio.volumeValue.hide();
                }
            }).mousemove(function(e) {
                if(volMouseD == 1) {
                    moveVolumeLine(e.pageX);
                }
            }).mousedown(function(e) {
                volMouseD = 1;
                moveVolumeLine(e.pageX);
                pageContainer.one("mouseup", function(e) {
                    volMouseD = 0;
                });
            });
            var wheel = function(event) {
                var wheelDelta = 0;
                if(!event) {
                    event = window.event;
                }
                if(event.wheelDelta) {
                    wheelDelta = event.wheelDelta / 120;
                } else if(event.detail) {
                    wheelDelta = -event.detail / 3;
                }
                if(wheelDelta) {
                    if(wheelDelta < 0) {
                        audio.currVolume -= 3;
                    } else {
                        audio.currVolume += 3;
                    }
                    audio.changeVolume(audio.currVolume);
                }
                if(event.preventDefault) {
                    event.preventDefault();
                }
                event.returnValue = false;
            };
            if(this.audioVolume[0].addEventListener) {
                this.audioVolume[0].addEventListener('DOMMouseScroll', wheel, false);
            }
            this.audioVolume.bind("mousewheel", function(e) {
                wheel(e);
            });
            function moveVolumeLine(x) {
                var lW = Math.ceil(x - audio.audioVolumeOffsetL - 1);
                if(lW > audio.maxVolumeLine) {
                    lW = audio.maxVolumeLine;
                }
                audio.currVolume = Math.round(100 / (audio.maxVolumeLine/ lW));
                audio.changeVolume(audio.currVolume);
            }
            this.changeVolume = function(value) {
                if(value < 0) {
                    audio.currVolume = value = 0;
                } else if(value > 100) {
                    audio.currVolume = value = 100;
                }
                audio.volume(value / 100);
                audio.volumeLineS.width =  Math.round((value / 100) * audio.maxVolumeLine) + "px";
                audio.volumeValue.html(value + "%");
                $.cookie('playerVolume', value, {expires: 365, path: "/"});
            }
    // Edit buttons
            getHtmlTrackInfo = function(trackId) {
                return '<label for="trackArtist">Исполнитель</label><input id="trackArtist" type="text" value="'+trackList[trackId]["artist"]+'" /><label for="trackName">Название</label><input id="trackName" type="text" value="'+trackList[trackId]["title"]+'" />';
            };

            audio.initAudioMenu();
            audio.pageTitle = document.title;
            audio.mainPage = audioPlaylistO.html();
    // history back
            var setLocation = function() {
                if(audio.hash != "" && audio.hash != "#") {
                    var hashSplit = audio.hash.split("&");
                    if(hashSplit[0]) {
                        var albumId = parseInt(hashSplit[0].substring(7));
                    }
                    if(hashSplit[1]) {
                        var page = parseInt(hashSplit[1].substring(5));
                    }
                    getAlbum(albumId, page);
                } else {
                    audio.showAudioMainPage();
                }
            };
            audio.hash = "";
            audio.currentHash = "";
            var checkHash = function() {
                audio.hash = location.hash;
                if(audio.hash != audio.currentHash) {
                    audio.currentHash = audio.hash;
                    setLocation();
                }
            };
            var checkHashInterval = setInterval(checkHash, 200);
        }

        audioPlaylistO.unbind().click(function(e) {
            var jTarget = $(e.target);
            if(jTarget.hasClass("add")) {
                var trackId = jTarget.attr("rel");
                var htmlPopup = '<form id="audioEdit"><label for="section">Выбери альбом</label>';
                if(typeof(userAlbums) != 'undefined') {
                    htmlPopup += userAlbums;
                } else {
                    htmlPopup += "<p id='preloadAlbums'>Загрузка альбомов...</p>";
                    var data = {
                        'type':'user',
                        'ownerId':currentUser.userId,
                        'ajax':true
                    };
                    $.post("/audio/ajax/getAlbums/", data, function(res) {
                        if(res["status"] == "ok") {
                            userAlbums = '<select name="album_id" id="section">';
                            var albumsA = res["albums"];
                            var albumsL = albumsA.length;
                            for(id in albumsA) {
                                var disabled = "";
                                if(albumsA[id]["disabled"]) {
                                    disabled = " disabled='disabled'";
                                }
                                userAlbums += '<option'+disabled+' value="'+id+'">'+albumsA[id]["name"] + ' (' + albumsA[id]["count"] + ')</option>';
                            }
                            userAlbums += '</select><span class="add jsLink" onclick="$(\'#addAlbum\').show().find(\'#albumName\').focus();">новый<em class="ico"></em></span><div id="addAlbum" style="display: none"><input type="text" value="" id="albumName" /><span class="ok" title="Сохранить" onclick="addAlbumUpload(currentUser.userId, \'user\');"></span></div>';
                            $("#preloadAlbums").after(userAlbums).remove();
                        } else {
                            popup.error("Ошибка.");
                        }
                    }, "json");
                }
                htmlPopup += getHtmlTrackInfo(trackId);
                htmlPopup += '<button class="button" type="button" value="Добавить" onclick="audio.addTrack($(\'#section\').val(), '+trackList[trackId]["audioId"]+', $(\'#trackName\').val(), $(\'#trackArtist\').val());"><span><em class="buttonInner">Добавить</em></span></button></form>';
                popup.simple(htmlPopup, {title: "Добавить эту аудиозапись себе.", width: 340});
                return false;
            } else if(jTarget.hasClass("edit")) {
                var trackId = jTarget.attr("rel");
                var htmlPopup = '<form id="audioEdit">';
                htmlPopup += getHtmlTrackInfo(trackId);
                htmlPopup += '<label for="section">Выбери альбом</label><select name="album_id" id="section">';
                var albumValsL = albumVals.length;
                for(i = 0; i < albumValsL; i++) {
                    var selected = "";
                    if(albumVals[i]["id"] == trackList[trackId]["albumId"]) {
                        selected = ' selected="selected"';
                    }
                    htmlPopup += '<option'+selected+' value="'+albumVals[i]["id"]+'">'+albumVals[i]["name"]+'</option>';
                }
                htmlPopup += '</select><button class="button" type="button" value="Сохранить" onclick="audio.updateTrackInfo(\''+trackId+'\', '+trackList[trackId]["id"]+', $(\'#section\').val(), $(\'#trackName\').val(), $(\'#trackArtist\').val())"><span><em class="buttonInner">Сохранить</em></span></button></form>';
                popup.simple(htmlPopup, {title: "Редактирование аудиозаписи.", width: 340});
                return false;
            } else if(jTarget.hasClass("del")) {
                popup.confirm("Точно удалить?", function() {
                    var audioId = jTarget.attr("rel");
                    var data = {
                        'trackId':audioId,
                        'type':audioContentType,
                        'ownerId':profileParams.viewUserId,
                        'ajax':true
                    };
                    $.post("/audio/ajax/deleteTrack/", data, function(res) {
                        if(res["status"] == "ok") {
                            jTarget.parent().remove();
                            var countTrack = audio.albumLinks.filter(".active").find("small");
                            countTrack.html(parseInt(countTrack.text()) - 1);
                            audio.tracks.removeClass("even").filter(":nth-child(even)").addClass("even");
                        } else {
                            popup.error("Ошибка удаления.");
                        }
                    }, "json");
                });
                return false;
            }
        });
        audio.initEvents();
    },
    updateTrackInfo: function(audioId, trackId, albumId, trackName, trackArtist) {
        if($.trim(trackName) == "") {
            fs.notify("Необходимо ввести название");
            return;
        }
        if($.trim(trackArtist) == "") {
            fs.notify("Необходимо ввести исполнителя");
            return;
        }
        audioPlaylistO.css({opacity: 0.5});
        popup.simple.close();
        var data = {
            'trackId':trackId,
            'albumId':albumId,
            'trackName':trackName,
            'trackArtist':trackArtist,
            'type':audioContentType,
            'ownerId':profileParams.viewUserId,
            'ajax':true
        };
        if(trackList[audioId]["title"] != trackName || trackList[audioId]["artist"] != trackArtist || trackList[audioId]["albumId"] != albumId) {
            $.post("/audio/ajax/updateTrack/", data, function(res) {
                audioPlaylistO.removeAttr("style");
                if(res["status"] == "ok") {
                    if(albumId == trackList[audioId]["albumId"]) {
                        audio.titles.filter("[rel='"+audioId+"']").html(trackArtist+" &ndash; "+trackName+"<em class='ico'></em>");
                        trackList[audioId]["title"] = trackName;
                        trackList[audioId]["artist"] = trackArtist;
                    } else {
                        audio.titles.filter("[rel='"+audioId+"']").parent().remove();
                    }
                } else {
                    popup.error("Ошибка сохранения.");
                }
            }, "json");
        } else {
            audioPlaylistO.removeAttr("style");
        }
        return false;
    },
    addAlbum: function(albumName) {
        if($.trim(albumName) == "") {
            fs.notify("Необходимо ввести название");
            return;
        }
        var postData = {
            'ajax':true,
            'albumName':albumName,
            'type':audioContentType,
            'ownerId':profileParams.viewUserId
        };
        $.post('/audio/ajax/addAlbum/', postData, function(res) {
            if(res.status == 'ok') {
                popup.alert('Альбом добавлен!');
                $("#albumsList").append('<li><a href="#" rel="'+res.album["album_id"]+'"><span class="name">'+res.album["album_name"]+'</span> <small>0</small><em class="ico"></em></a></li>');
                var count = albumVals.length;
                albumKeys[res.album["album_id"]] = count;
                albumVals[count] = {
                    "id": res.album["album_id"],
                    "name": res.album["album_name"]
                }
                audio.initAudioMenu();
                if(audio.editLink.hasClass("active")) {
                    fillingAlbum();
                }
            } else {
                popup.error('Произошла ошибка!');
            }
        }, 'json');
    },
    addTrack: function(albumId, audioId, trackName, trackArtist) {
        if($.trim(trackName) == "") {
            fs.notify("Необходимо ввести название");
            return;
        }
        if($.trim(trackArtist) == "") {
            fs.notify("Необходимо ввести исполнителя");
            return;
        }
        if(albumId && albumId != "") {
            var data = {
                'albumId':albumId,
                'audioId':audioId,
                'trackName':trackName,
                'trackArtist':trackArtist,
                'type':'user',
                'ownerId':currentUser.userId,
                'ajax':true
            };
            $.post("/audio/ajax/addTrack/", data, function(res) {
                if(res["status"] == "ok") {
                    popup.simple.close();
                    fs.notify("Аудиозапись добавлена.");
                } else {
                    popup.error("Ошибка.");
                }
            }, "json");
        } else {
            fs.notify("Необходимо выбрать или создать новый альбом.");
        }
    },
    initOffset: function() {
        this.trackNavigationOffsetL = this.trackNavigation.offset().left;
        this.audioVolumeOffsetL = this.audioVolume.offset().left;
        this.maxProgressLine = this.trackNavigation.width() - 2;
        this.maxVolumeLine = this.audioVolume.width() - 2;
    },
    initEvents: function() {
        audio.tracks = $(".track", audioPlaylistO);
        audio.titles = $(".title", audio.tracks);
        audio.titles.unbind().click(function() {
            if(!$(this).hasClass("converting")) {
                var audioId = $(this).attr("rel");
                audio.play(audioId);
            } else {
                popup.alert("Аудиозапись еще обрабатывается");
            }
            return false;
        });
        audio.trackTimeH = 0;
        audio.trackTime.unbind().mouseenter(function() {
            audio.trackTimeH = 1;
        }).mouseleave(function() {
            audio.trackTimeH = 0;
        });
        /*
        $(".add", audio.tracks).tooltip({
            track:true,
            showURL:false,
            extraClass: "simpleTooltip"
        });*/
    },
    initAudioMenu: function() {
        $("#mainPageLink").click(function() {
            audio.showAudioMainPage();
            return false;
        });
        audio.albumLinks = $("#albumsList a");
        audio.albumLinks.click(function() {
            audio.viewAlbum = $(this).attr("rel");
            if(!$(this).hasClass("active")) {
                if(audio.viewAlbum == audio.albumI) {
                    getAlbum(audio.viewAlbum, audio.pageI);
                } else {
                    getAlbum(audio.viewAlbum);
                }
            }
            audio.uploadLink.attr("href", uploadLinkHref+"#"+audio.viewAlbum);
            return false;
        });
        var audioMenu = $("#audioMenu");
        audio.editLink = $("#editAlbum");
        audio.uploadLink = $(".upload a", audioMenu);
        audio.addAlbumdLink = $(".add a", audioMenu);
        var uploadLinkHref = audio.uploadLink.attr("href");
        audio.editLink.click(function() {
            if(typeof(audio.viewAlbum) != 'undefined' && audio.viewAlbum) {
                if($(this).hasClass("active")) {
                    getAlbum(audio.viewAlbum, 0);
                } else {
                    getAlbum(audio.viewAlbum, 0, null, true);
                }
            } else {
                var albumValsL = albumVals.length;
                if(albumValsL > 1) {
                    var htmlPopup = '<form id="audioEdit"><label for="section">Выбери альбом</label><select name="album_id" id="section">';
                    for(i = 0; i < albumValsL; i++) {
                        htmlPopup += '<option value="'+albumVals[i]["id"]+'">'+albumVals[i]["name"]+'</option>';
                    }
                    htmlPopup += '</select><button class="button" type="submit" value="Редактировать"><span><em class="buttonInner">Редактировать</em></span></button></form>';
                    popup.simple(htmlPopup, {title: "Редактирование", width: 340, onOpen: function() {
                        $("#audioEdit").submit(function() {
                            getAlbum($("#section").val(), 0, null, true);
                            popup.simple.close();
                            return false;
                        });
                    }});
                } else {
                    getAlbum(albumVals[0]["id"], 0, null, true);
                }
            }
            return false;
        });
        audio.addAlbumdLink.click(function() {
            var htmlPopup = '<form id="newAlbum"><label for="newAlbumName">Название альбома</label><input id="newAlbumName" type="text" value="" /><button class="button" type="submit" value="Добавить альбом"><span><em class="buttonInner">Добавить альбом</em></span></button></form>';
            popup.simple(htmlPopup, {title: "Добавить новый альбом.", width: 340, onOpen: function() {
                $("#newAlbum").submit(function() {
                    audio.addAlbum($('#newAlbumName').val())
                    return false;
                });
                $("#newAlbumName").focus();
            }});
            return false;
        });
    },
    showAudioMainPage: function() {
        if(audio.mainPage) {
            audio.albumLinks.removeClass("active");
            audioPlaylistO.after(audio.audioPlayer.hide()).html(audio.mainPage);
            audio.initEvents();
            audio.viewAlbum = null;
            audio.showPlayer();
            audio.editLink.removeClass("active").html("Редактирование<em class='ico'></em>");
            audio.currentHash = audio.hash = "";
            location.hash = audio.currentHash;
            audio.currentHash = audio.hash = location.hash;
            audio.audioRoomTitle.html("Аудио");
        } else {
            location.hash = "";
            location.reload(true);
        }
    },
    showPlayer: function() {
        var T = audio.titles.filter("#track" + trackList[audio.playedId]["id"]);
        if(T[0]) {
            audio.audioPlayer.insertAfter(T).slideDown(250, function() {
                audio.trackPlayed = T.parent();
                audio.trackPlayed.addClass(audio.trackStatus);
                T.append(audio.trackTime.show());
                audio.playerAnimate = 0;
            });
        } else {
            audio.playerAnimate = 0;
        }
        audio.albumLinks.removeClass("played").filter("[rel='"+audio.albumI+"']").addClass("played");
    },
    play: function(audioId) {
        if(audio.playerAnimate != 1) {
            if(audioId != audio.playedId) {
                audio.playerAnimate = 1;
                audio.playedId = audioId;
                var idSplit = audioId.split("_");
                audio.albumI = idSplit[0];
                audio.pageI = idSplit[1];
                audio.trackI = parseInt(idSplit[2]);
                audio.audioPlayer.slideUp(250, function() {
                    audio.progressLineS.width = "0px";
                    audio.trackStatus = "played";
                    if(typeof(audio.trackPlayed) != 'undefined') {
                        audio.trackPlayed.removeClass("played").removeClass("pause");
                    }
                    audio.showPlayer();
                    if(!audio.trackNavigationOffsetL) {
                        audio.initOffset();
                    }
                    url = trackList[audioId]["url"];
                    audio.audioLength = trackList[audioId]["seconds"];
                    if(typeof(audio.swfMove) == 'undefined') {
                        if(fs.ie) {
                            audio.swfMove = window["swfPlayer"];
                        }
                        else {
                            audio.swfMove = document["swfPlayer"];
                        }
                        audio.changeVolume(audio.currVolume);
                    }
                    if(url != "") {
                        audio.swfMove.musicSetUrl(url);
                        audio.favicon();
                    } else {
                        streamNotFound();
                    }
                });
                $.get('/audio/stat', {'ajax':1, 'trackId':trackList[audioId]['id']}); /*ajax for stats*/
            } else {
                if(audio.trackPlayed.hasClass("pause")) {
                    audio.trackPlayed.removeClass("pause");
                    audio.trackStatus = "played";
                    audio.swfMove.musicPlay();
                    audio.favicon();
                } else {
                    audio.pause();
                }
            }
        }
    },
    favicon: function() {
        audio.icon = $("link[rel='shortcut icon']")[0];
        var parent = $(audio.icon).parent();
        $(audio.icon).detach();
        var iconName = "audio/faviconplay.png";
        if(audio.trackStatus == "stop") {
            iconName = "favicon.ico";
        } else if(audio.trackStatus == "played pause") {
            iconName = "audio/faviconpause.png";
        }
        parent.append($(audio.icon).attr("href", staticDomain+"/images/"+iconName));
    },
    pause: function() {
        audio.trackPlayed.addClass("pause");
        audio.trackStatus = "played pause";
        audio.favicon();
        audio.swfMove.musicPause();
    },
    volume: function(percent) {
        audio.swfMove.musicSetVolume(percent);
    },
    seek: function(seconds) {
        audio.swfMove.musicSeek(seconds);
    },
    next: function() {
        var nextId = audio.trackI + 1;
        nextId = audio.albumI+"_"+audio.pageI+"_" + nextId;
        if(trackList[nextId]) {
            if(trackList[nextId]["status"] == 1) {
                audio.play(nextId);
            } else {
                audio.trackI++;
                audio.next();
            }
        } else {
            if(trackList[audio.playedId]["nextPage"] == 1) {
                audio.pageI++;
                audio.trackI = 0;
                getAlbum(audio.albumI, audio.pageI, true);
            } else {
                if(typeof(albumVals) != 'undefined') {
                    var aV = albumVals[parseInt(albumKeys[audio.albumI])+1];
                    if(aV) {
                        if(aV["empty"]) {
                            audio.albumI = albumVals[parseInt(albumKeys[audio.albumI])+1]["id"];
                            audio.next();
                            return;
                        } else {
                            audio.albumI = aV["id"];
                        }
                        if(audio.pageI < 0) {
                            nextId = audio.trackI + 1;
                            nextId = audio.albumI+"_"+audio.pageI+"_" + nextId;
                            if(!trackList[nextId]) {
                                audio.next();
                                return;
                            }
                            audio.play(nextId);
                        } else {
                            audio.pageI = 0;
                            audio.trackI = 0;
                            getAlbum(audio.albumI, audio.pageI, true);
                        }
                    } else {
                        audio.stop();
                    }
                } else {
                    audio.stop();
                }
            }
        }
    },
    stop: function() {
        if(audio.swfMove) {
            audio.swfMove.musicPause();
            audio.trackPlayed.removeClass("played").removeClass("pause");
            audio.albumLinks.removeClass("played");
        }
        audio.audioPlayer.hide();
        audio.trackTime.hide();
        audio.playedId = null;
        audio.trackStatus = "stop";
        audio.favicon();
    },
    moveTrack: function(albumId, audioId, position) {
        var data = {
            'trackId':trackList[audioId]["id"],
            'type':audioContentType,
            'ownerId':profileParams.viewUserId,
            'ajax': true
        };
        if(albumId) {
            data["albumId"] = albumId;
        }
        if(position) {
            data["position"] = position;
        }
        $.post("/audio/ajax/moveTrack/", data, function(res) {
            if(res.status == "ok") {
                for(id in trackList) {
                    if(trackList[id]["position"] > position) {
                        trackList[id]["position"] += 1;
                    }
                }
                trackList[audioId]["position"] = position + 1;
            }
        }, "json");
    },
    editInit: function() {
        if(typeof(bodyJ) == 'undefined') {
            var containerH = pageContainer.height();
            var offsetA = audioPlaylistO.offset();
            offsetT = offsetA.top;
            offsetL = offsetA.left;
            bodyJ = $("body");
            helper = $('<div id="helper"></div>');
            itemPosF = function(e, obj, startX) {
                itemPosY = e.pageY - offsetT - 14;
                obj.top = itemPosY + "px";
                itemPosX = e.pageX - startX;
                obj.left = itemPosX + "px";
            };
        }
        var itemPosA = [];
        var albumPosA = [];
        var itemIndex;
        var movedItem;
        var fillingItemPos = function(elements) {
            itemPosA = [];
            elements.each(function(i) {
                itemPosA[i] = Math.round($(this).offset().top - offsetT);
            });
        };
        fillingAlbum = function() {
            audio.albumLinks.each(function(i) {
                albumPosA[i] = Math.round($(this).offset().top - offsetT + 14);
            });
        };
        fillingAlbum();
        var albumIndex = audio.albumLinks.index(audio.albumLinks.filter(".active"));
        var albumPosAL = albumPosA.length;
        audio.tracks.bind("mousedown", function(e) {
            var et = $(e.target);
            if(e.target.tagName == "LI") {
                movedItem = $(this);
                var movedS = $(this)[0].style;
                var startX = e.pageX;
                itemPosF(e, movedS, startX);
                $(this).addClass("moved").before(helper);
                var elements = audio.tracks.not($(this));
                fillingItemPos(elements);
                var itemPosAL = itemPosA.length;
                itemIndex = audio.tracks.index($(this));
                var iLast = itemIndex;
                var hoverAlbum = 0;
                var aLast = albumIndex;
                scrollTop = $(window).scrollTop();
                pageContainer.mousemove(function(e) {
                    itemPosF(e, movedS, startX);
                    if(itemPosX > -100) {
                        for(var i = 0; i <= itemPosAL; i++) {
                            if(itemPosA[i] > itemPosY) {
                                if(i != iLast) {
                                    iLast = i;
                                    elements.eq(i).before(helper);
                                }
                                break;
                            } else if(i == itemPosAL) {
                                if(i != iLast) {
                                    iLast = i;
                                    elements.eq(iLast-1).after(helper);
                                }
                            }
                        }
                        if(hoverAlbum == 1) {
                            audio.albumLinks.removeClass("hoverMove");
                        }
                        hoverAlbum = 0;
                    } else {
                        if(hoverAlbum === 0) {
                            helper.remove();
                            aLast = albumIndex;
                            iLast = -1;
                        }
                        hoverAlbum = 1;
                        for(var i = 0; i <= albumPosAL; i++) {
                            if(albumPosA[i] > itemPosY) {
                                if(i != aLast && i != albumIndex) {
                                    audio.albumLinks.eq(aLast).removeClass("hoverMove").end().eq(i).addClass("hoverMove");
                                    aLast = i;
                                }
                                break;
                            }
                        }
                    }
                    if((e.pageY - scrollTop) < 70) {
                        scrollTop = $(window).scrollTop();
                        if(animateD != -1) {
                            animateD = -1;
                            animateScrollPage(0, 2000);
                        }
                    } else if(e.pageY > (scrollTop + fs.windowH - 70)) {
                        scrollTop = $(window).scrollTop();
                        if(animateD != 1) {
                            animateD = 1;
                            animateScrollPage(containerH - fs.windowH, 2000);
                        }
                    } else if(animateD != 0) {
                        animateD = 0;
                        scrollTop = $(window).scrollTop();
                        $("html, body").stop();
                    }
                    return false;
                }).mouseup(function() {
                    if(iLast != itemIndex && hoverAlbum != 1) {
                        if(iLast != itemPosAL) {
                            var element = elements.eq(iLast);
                            var position = trackList[$(".title", element).attr("rel")]["position"];
                            element.before(movedItem);
                        } else {
                            var element = elements.eq(iLast-1);
                            var position = trackList[$(".title", element).attr("rel")]["position"] - 1;
                            element.after(movedItem);
                        }
                        audio.moveTrack(null, $(".title", movedItem).attr("rel"), position);
                    } else if(hoverAlbum == 1) {
                        var album = audio.albumLinks.eq(aLast);
                        audio.moveTrack(album.attr("rel"), $(".title", movedItem).attr("rel"));
                        movedItem.remove();
                        album.removeClass("hoverMove");
                        var countTrack = album.find("small");
                        countTrack.html(parseInt(countTrack.text()) + 1);
                        countTrack = audio.albumLinks.filter(".active").find("small");
                        countTrack.html(parseInt(countTrack.text()) - 1);
                    }
                    helper.remove();
                    audio.tracks = $(".track", audioPlaylistO);
                    if(fs.ie) {
                        $("body, html").unbind("selectstart.disableTextSelect");
                    } else {
                        $("body, html").unbind("mousemove.disableTextSelect");
                    }
                    movedItem.removeAttr("style").removeClass("moved");
                    pageContainer.unbind("mousemove").unbind("mouseup");
                    if($.browser.mozilla) {
                        bodyJ.css({"MozUserSelect": ""});
                    }
                    audio.tracks.removeClass("even").filter(":nth-child(even)").addClass("even");
                });
                if(fs.ie) {
                    $("body, html").bind('selectstart.disableTextSelect', function() {
                        return false;
                    });
                } else if(!$.browser.mozilla) {
                    $("body, html").bind('mousemove.disableTextSelect', function() {
                        return false;
                    });
                }
                if($.browser.mozilla) {
                    bodyJ.css({"MozUserSelect": "none"});
                    e.preventDefault();
                }
            }
            audio.mainPage = null;
        });
        var editAlbumName = $("#editAlbumName");
        var saveAlbumName = $(".ok", editAlbumName);
        var albumNameV = $("#albumName").val();

        editAlbumName.bind("submit", function() {
            var name = $.trim($("#albumName").val());
            if(albumNameV != name) {
                if(name != "") {
                    var data = {
                        'albumName':name,
                        'albumId':audio.viewAlbum,
                        'type':audioContentType,
                        'ownerId':profileParams.viewUserId,
                        'ajax':true
                    };
                    $.post("/audio/ajax/updateAlbum/", data, function(res) {
                        if(res["status"] == "ok") {
                            fs.notify("Название изменено.");
                            $(".path .nameAlbum", audioPlaylistO).text(name);
                            audio.albumLinks.filter(".active").find(".name").text(name);
                            albumVals[albumKeys[audio.viewAlbum]]["name"] = name;
                            albumNameV = name;
                        } else {
                            popup.error("Ошибка сохранения.");
                        }
                    }, "json");
                } else {
                    fs.notify("Необходимо ввести название альбома.");
                }
            }
            return false;
        });
        saveAlbumName.click(function() {
            editAlbumName.submit();
        });
        $("#deleteAlbum").click(function() {
            popup.confirm("Точно удалить альбом?", function() {
                var data = {
                    'albumId':audio.viewAlbum,
                    'type':audioContentType,
                    'ownerId':profileParams.viewUserId,
                    'ajax':true
                };
                $.post("/audio/ajax/deleteAlbum/", data, function(res) {
                    if(res["status"] == "ok") {
                        audio.albumLinks.filter(".active").remove();
                        editAlbumName.next().hide().end().after("<p>Альбом удален.</p>").remove();
                        albumKeys[audio.viewAlbum] = "";
                    } else {
                        popup.error("Ошибка удаления.");
                    }
                }, "json");
            });
        });
        /*
        $(".edit, .del", audio.tracks).add(saveAlbumName).tooltip({
            track:true,
            showURL:false,
            extraClass: "simpleTooltip"
        });
        */
    }
};
var animateD = 0;
var animateScrollPage = function(y, t) {
    if($.browser.safari) {
        var animateBlock = $("body");
    } else {
        var animateBlock = $("html");
    }
    animateBlock.stop().animate({scrollTop: y + "px"}, t, function() {
        scrollTop = $(window).scrollTop();
        animateD = 0;
    });
};
var parseSeconds = function(seconds) {
    var minutes = parseInt(seconds / 60);
    var sec = Math.round(((seconds / 60) - minutes) * 60);
    if(sec < 10) {
        sec = "0" + sec;
    }
    return minutes +":"+ sec;
};
function musicStatusPosition(seconds) {
    if(audio.trackTimeH == 1) {
        var pSeconds = "-" + parseSeconds(audio.audioLength - seconds);
    } else {
        var pSeconds = parseSeconds(seconds);
    }
    audio.trackTime.html(pSeconds);
    if(audio.navMouseD != 1) {
        if(seconds != audio.currSec) {
            audio.currSec = seconds;
            iW = 0;
            delta = audio.maxProgressLine / audio.audioLength;
            currW = seconds * delta;
            delta = delta / 2;
        }
        audio.progressLineS.width = Math.round(currW + delta * iW) + "px";
        iW++;
    }
}
function musicStatusLoaded(bytesLoaded, bytesTotal) {
    audio.trackProgressW = Math.ceil((bytesLoaded / bytesTotal) * audio.maxProgressLine);
    audio.trackProgressS.width = audio.trackProgressW + "px";
}
function musicStatusEnded() {
    audio.next();
}
function musicStatusPause() {
    audio.stop();
}
function streamNotFound() {
    popup.error("Ошибка воспроизведения аудиозаписи.", setTimeout(function() {
        location.reload(true);
    }, 1000));
    audio.stop();
}
var getAlbum = function(albumId, page, play, edit) {
    if(!page || page < 0)
    {
        page = 0;
    }
    var data = {
        'albumId':albumId,
        'type': audioContentType,
        'ownerId':profileParams.viewUserId,
        'ajax':true,
        'page':page
    };
    if(edit) {
        data['edit'] = true;
    }
    if(albumId != audio.viewAlbum && play) {
        data['jsOnly'] = true;
        $.get('/audio/ajax/getTrackList/', data, function(res) {
            if(res == "error_service") {
                popup.error("Аудио временно не доступно.<br /> Попробуй через несколько минут.", setTimeout(function() {
                    location.reload(true);
                }, 1000));
            } else if(res == "error") {
                popup.error("Ошибка приложения.");
            } else {
                audio.play(audio.albumI+"_"+audio.pageI+"_"+audio.trackI);
            }
        }, "script");
        audio.trackTime.hide();
    } else {
        $("ul:not('.pager')", audioPlaylistO).css("opacity", 0.5);
        audioPlaylistO.after(audio.audioPlayer.hide()).load('/audio/ajax/getTrackList/', data, function(res) {
            if(res == "error_service") {
                popup.error("Аудио временно не доступно.<br /> Попробуй через несколько минут.", setTimeout(function() {
                    location.reload(true);
                }, 1000));
            } else if(res == "error") {
                popup.error("Ошибка приложения.");
                audioPlaylistO.html("");
            } else {
                $(window).scrollTop(0);
                audio.initEvents();
                if(play) {
                    if(!trackList[audio.albumI+"_"+audio.pageI+"_"+audio.trackI]) {
                        audio.next();
                        return;
                    }
                    audio.play(audio.albumI+"_"+audio.pageI+"_"+audio.trackI);
                } else if(albumId == audio.albumI) {
                    audio.showPlayer();
                }
                if(edit) {
                    audio.editInit();
                }
            }
            $(this).removeAttr("style");
        });
        audio.albumLinks.removeClass("active").filter("[rel="+albumId+"]").addClass("active");
        audio.viewAlbum = albumId;
        if(!edit) {
            audio.editLink.removeClass("active").html("Редактирование<em class='ico'></em>");
            audio.currentHash = "#album-"+albumId+"&page-"+page;
        } else {
            audio.editLink.addClass("active").html("Завершить редактирование<em class='ico'></em>");
            audio.currentHash = "#album-"+albumId+"&page-"+page+"&edit";
        }
        location.hash = audio.currentHash;
        if(albumKeys[albumId]) {
            var title = albumVals[albumKeys[albumId]]["name"];
            document.title = title + " – " + audio.pageTitle;
            audio.audioRoomTitle.html(title);
        }
    }
};

var swfUse = false;
var swfMove;
var animateProgress;
var audioUpload = {
    onInit: function() {
        $("#audioFile, #startUpload").hide();
        audioUpload.uploadForm = $("#uploadForm");
        audioUpload.uploadFormF = $("fieldset", audioUpload.uploadForm);
        audioUpload.progress = $("#swfProgress");
        audioUpload.progressB = $(".bar", audioUpload.progress);
        audioUpload.progressBS = audioUpload.progressB[0].style;
        audioUpload.progressBe = $("em", audioUpload.progressB);
        audioUpload.progressBeS = audioUpload.progressBe[0].style;
        swfMove = document["swfUpload"];
        var oldUploaderInfo = $("#oldUploaderInfo");
        $(".jsLink", oldUploaderInfo).click(function() {
            $("#audioFile, #startUpload").show();
            oldUploaderInfo.add($("#swfUpload")).hide();
            swfUse = false;
            checkAgreeContent();
        });
        oldUploaderInfo.show();
        swfUse = true;
        checkAgreeContent();
    },
    onSelect: function() {
        audioUpload.getSessionId();
        audioUpload.uploadFormF.height(0);
        audioUpload.progress.show();
        audioUpload.progressBeS.width = 0+"px";
        audioUpload.progressBe.html("0%");
        var i = 0;
        animateProgress = setInterval(function() {
            i++;
            audioUpload.progressBS.backgroundPosition = i+"px 0px";
        }, 50);
        onCompleteF = 0;
    },
    getSessionId: function() {
        var albumId = $("#section").val();
        if(albumId && albumId != "") {
            var postData = {
                'ajax': true,
                'albumId': albumId,
                'type': audioContentType,
                'ownerId': profileParams.viewUserId
            };
            $.post('/audio/ajax/getSessionId', postData, function(resp) {
                if(resp.status == "ok") {
                    if(!swfUse) {
                        $("#sessId").val(resp.sessionId);
                        $("#uploadForm").submit();
                    } else {
                        swfMove.startFileUpload('http://'+uploadServer+'/music-upload/?type='+audioContentType+'&usid='+resp.sessionId+'&upload=1&albumId='+albumId);
                    }
                } else {
                    popup.error("Ошибка.");
                }
            }, 'json');
        } else {
            popup.alert("Необходимо выбрать или создать новый альбом.", function() {audioUpload.hideProgress();});
        }
    },
    onProgress: function(percent) {
        audioUpload.progressBeS.width = percent + "%";
        audioUpload.progressBe.html(percent + "%");
    },
    hideProgress: function() {
        audioUpload.progress.hide();
        audioUpload.uploadFormF.height("auto");
        clearInterval(animateProgress);
    },
    onComplete: function(res) {
        if(onCompleteF != 1) {
            onCompleteF = 1;
            audioUpload.progressBeS.width = "100%";
            audioUpload.progressBe.html("100%");
            if(typeof(completeInfo) == 'undefined') {
                completeInfo = $("<div id='completeInfo'></div>");
                $("#rightColumn .roomTitle").after(completeInfo);
            }
            audioUpload.hideProgress();
            if(res == "ok") {
                var albumSelect = $("#section");
                var albumSelectId = albumSelect.val();
                completeInfo.html("<p><strong style='color:green'>Аудиофайл успешно загружен!</strong><br /> Происходит обработка записи, скоро она будет доступна для <a href='http://"+projectDomain+"/"+audioContentType+"/"+profileParams.viewUserId+"/audio/index#album-"+albumSelectId+"&page-0'>прослушивания...</a></p>");
                var albumLength = parseInt(albumInfo[albumSelectId]["count"]);
                albumLength++;
                var selectOption = $("option[value='"+albumSelectId+"']", albumSelect);
                albumInfo[albumSelectId]["count"] = albumLength;
                selectOption.text(albumInfo[albumSelectId]["name"] + " (" + albumLength + ")");
                if(albumLength >= tracksPerAlbumLimit) {
                    popup.alert("В альбом загружено максимальное количество треков. Создай новый альбом.");
                    selectOption.attr("disabled", "disabled");
                    var openAlbums = $("option", albumSelect).not(":disabled");
                    if(openAlbums.length > 0) {
                        albumSelect.val(openAlbums.eq(0).val());
                    } else {
                        $("#addAlbum").show();
                        albumSelect.append('<option selected="selected"></option>');
                    }
                }
            } else {
                popup.error("Файл содержит ошибку. Загрузка невозможна.");
                completeInfo.html("");
            }
        }
    },
    onError: function(err, info) {
        var errorText = "";
        switch(err) {
            case "HTTP"     : errorText = "Сервер не доступен. Попробуй чуть позже."; break;
            case "IO"       : errorText = "Файл не удалось закачать."; break;
            case "SECURITY" : errorText = "В доступе отказано."; break;
            case "SIZE"     : errorText = "Размер файла ("+ Math.ceil(info/1024/1024) +" Мб) превышает допустимый (20 Мб)."; break;
        }
        popup.error(errorText);
        if(typeof(completeInfo) != 'undefined') {
            completeInfo.html("");
        }
    }
};

var checkAgreeContent = function() {
    if($("#agreeContent input").is(":checked")) {
        if(swfUse) {
            swfMove.setEnabled();
        } else {
            $("#audioFile, #startUpload").attr("disabled", "");
        }
    } else {
        if(swfUse) {
            swfMove.setDisabled();
        } else {
            $("#audioFile, #startUpload").attr("disabled", "disabled");
        }
    }
};
$(document).ready(function() {
    $("#agreeContent").bind("click", checkAgreeContent);
    checkAgreeContent();
});
var addAlbumUpload = function(ownerId, type) {
    albumName = $.trim($("#albumName").val());
    if(albumName == "") {
        popup.alert("Необходимо ввести название альбома.");
        return;
    }
    var postData = {
        'ajax':true,
        'albumName':albumName,
        'type':type,
        'ownerId':ownerId
    };
    $.post('/audio/ajax/addAlbum/', postData, function(resp) {
        $("#addAlbum").hide();
        if(resp.status == 'ok') {
            var option = $('<option selected="selected"></option>').val(resp.album.album_id).text(resp.album.album_name + ' (0)');
            $("#section").append(option);
            if(typeof(albumInfo) != 'undefined') {
                albumInfo[resp.album.album_id] = {"name":resp.album.album_name, "count":0};
            }
        } else {
            popup.alert('Произошла ошибка!');
        }
    }, 'json');
};