Powered.PhotoUpload = Class.create({
    progressBarId: null,
    callbackObj: null,
    galleryId:null,
    fileUploadStatus: null,
    fileCount:1,

    initialize: function(progressDivId, galleryId, callback) {
        this.progressBarId = progressDivId;
        this.callbackObj = callback;
        this.galleryId = galleryId;
        this.fileUploadStatus = 'done';
    },

    refreshProgress: function (uploader) {
        var date = new Date();
        var timestamp = date.getTime();
        var url = Powered.contextPath + '/files/fragments/fileUploadStatus.jsp?time=' + timestamp;
        new Ajax.Updater(uploader.progressBarId, url,
        {
            asynchronous:true,
            method: 'get',
            onSuccess: function (oXHR, oJson) {
                if (oXHR.status == 200) {
                    if (uploader.fileUploadStatus == 'inProgress') {
                        window.setTimeout(function() {
                            uploader.refreshProgress(uploader)
                        }, 1000);
                    }
                } else {
                    var progressDiv = document.getElementById('PhotoUploadError');
                    progressDiv.innerHTML = "There has been a network error during the upload process. Please retry.";
                }
            }
        });
    },

    addFileUpload: function(elemId, singleFile) {
        if (this.fileCount > 5) return;
        if (!singleFile || (singleFile && this.fileCount <= 1)) {
            var inputDiv = document.createElement('input')
            inputDiv.type = 'file';
            inputDiv.size = '40';
            inputDiv.name = 'file' + this.fileCount;
            inputDiv.id = 'file' + this.fileCount;
            Element.addClassName(inputDiv, 'File');
            Event.observe(inputDiv, 'change', this.addFileElement.bindAsEventListener(this, elemId, singleFile));
            if (this.fileCount > 1) {
                var lastFile = 'file' + (this.fileCount - 1);
                Event.stopObserving(lastFile, 'change', '');
            }
            this.fileCount++;
            var elemDiv = document.createElement('div');
            elemDiv.appendChild(inputDiv);
            $(elemId).appendChild(elemDiv);
            if (Powered.pageModal!=null) {
               Powered.pageModal.resizeToContent();
               Powered.pageModal._findFocusableElements();
            }
        }
    },

    addFileElement: function(elem) {
        var elemId = $A(arguments)[1];
        var singleFile = $A(arguments)[2];
        this.addFileUpload(elemId, singleFile);
    },


    submitPhotoUpload: function(form) {
        form.action.value = 'upload';
        document.getElementById('submitPhotoButton').disabled = true;
        form.onsubmit();
        form.submit();
    },


    startCallback: function (uploader) {
        uploader.fileUploadStatus = 'inProgress';
        Effect.Appear(uploader.progressBarId);
        window.setTimeout(function() {
            uploader.refreshProgress(uploader);
        }, 10);
        return true;
    },

    completeCallback: function(response) {
        this.fileUploadStatus = 'done';
        Effect.Fade(this.progressBarId);
        if (response.indexOf('STATUS_200') != -1) {
            this.callbackObj.callback();
            if (Powered.pageModal != null) {
                Powered.pageModal.hide();
            }
        }
        else {
            $('Modal_content').update(response);
            if (Powered.pageModal != null) {
                Powered.pageModal.resizeToContent();
                Powered.pageModal._findFocusableElements();
            }
        }
        return true;
    }
});

Powered.PhotoImport = Class.create({
    url:null,
    options: {},
    callBackFunction:null,

    initialize: function(url, options, callBackFunc) {
        this.url = url;
        this.options = options;
        this.callBackFunction = callBackFunc;
    },

    show:function() {
        Powered.pageModal = Powered.Modal.show(this.url, this.options);
    },

    callback: function() {
        if (Powered.Util.isFunction(this.callBackFunction)) {
            this.callBackFunction();
        }
        return true;
    }
});

Powered.PhotoSelect = Class.create({
    selectedMediaId: null,
    photoStatus: null,
    maxSize: null,

    initialize: function() {
        this.selectedMediaId = new Array();
        this.maxSize = null;
    },
    initialize: function(maxSize) {
        this.selectedMediaId = new Array();
        this.maxSize = maxSize;
    },

    selectMedia:function(mediaId) {
        try {
            if (this.selectedMediaId.contains(mediaId)) {
                $(mediaId).removeClassName("SelectedThumb");
                this.selectedMediaId.remove(mediaId);
            } else {
                if (this.maxSize == null ||  this.selectedMediaId.length < this.maxSize) {
                    $(mediaId).addClassName("SelectedThumb");
                    this.selectedMediaId.push(mediaId);
                }
            }
            if ($('photoImportButton') != null) {
                if (this.selectedMediaId.length > 0) {
                    $('photoImportButton').setAttribute("onclick", 'photoSelectWidget.importPhotos(document.importForm);');
                } else {
                    $('photoImportButton').setAttribute("onclick", '');
                }
            }

            if ($('photoExportButton') != null) {
                if (this.selectedMediaId.length > 0) {
                    $('photoExportButton').setAttribute("onclick", 'photoSelectWidget.exportPhotos(document.exportForm);');
                } else {
                    $('photoExportButton').setAttribute("onclick", '');
                }
            }

            $('PhotoSelectCount').innerHTML = this.selectedMediaId.length;
            if (this.maxSize!=null) {
                $('PhotoRemaining').innerHTML = this.maxSize - this.selectedMediaId.length;
            }
        }
        catch(err) {
        }
        return false;
    },

    removeAllMediaSelectStyle: function() {
        try {
            var mediaDivs = document.getElementsByClassName("SelectedThumb");
            for (var i = 0; i < mediaDivs.length; i++) {
                mediaDivs[i].removeClassName("SelectedThumb");
            }
        }
        catch(err) {
        }
    },

    getMediaIds: function() {
        var elems = $('PhotoSelectElement').select('.Thumbnail');
        res = new Array();
        for (var i = 0; i < elems.length; i++) {
            res.push(elems[i].id);
        }
        return res;
    },

    selectPage: function () {
        var elems = this.getMediaIds();
        for (var i = 0; i < elems.length; i++) {
            if (!this.selectedMediaId.contains(elems[i])) {
                $(elems[i]).addClassName("SelectedThumb");
                this.selectedMediaId.push(elems[i]);
            }
        }
        if ($('photoImportButton') != null) {
            $('photoImportButton').setAttribute("onclick", 'photoSelectWidget.importPhotos(document.importForm);');
        }
        if ($('photoExportButton') != null) {
            $('photoExportButton').setAttribute("onclick", 'photoSelectWidget.exportPhotos(document.exportForm);');
        }
        $('PhotoSelectCount').innerHTML = this.selectedMediaId.length;
    },

    deselectPage: function () {
        var elems = this.getMediaIds();
        for (var i = 0; i < elems.length; i++) {
            if (this.selectedMediaId.contains(elems[i])) {
                $(elems[i]).removeClassName("SelectedThumb");
                this.selectedMediaId.remove(elems[i]);
            }
        }
        if ($('photoImportButton') != null) {
            $('photoImportButton').setAttribute("onclick", '');
        }
        if ($('photoExportButton') != null) {
            $('photoExportButton').setAttribute("onclick", '');
        }
        $('PhotoSelectCount').innerHTML = this.selectedMediaId.length;
    },

    refreshMedia:function() {
        for (var i = 0; i < this.selectedMediaId.length; i++) {
            if ($(this.selectedMediaId[i])) {
                $(this.selectedMediaId[i]).addClassName("SelectedThumb");
            }
        }
    },

    exportPhotos:function(exportForm) {
        if (this.photoStatus ==null) {
            this.photoStatus = 'inProgress';
             document.getElementById('photoExportButton').disabled = true;
            this.refreshProgress(this);
            exportForm.mediaId.value = Powered.Util.arrayToString(this.selectedMediaId);
            Powered.Util.submitAjax('export', '/files/photoExport.jsp',
                    exportForm, 'Modal_content', null, function() {
                this.photoStatus = null;
                Powered.pageModal.resizeToContent();
                Powered.pageModal._findFocusableElements();
            }.bind(this));
        }
    },

    importPhotos:function(importForm) {
        if (this.photoStatus == null) {
            this.photoStatus = 'inProgress';
            document.getElementById('photoImportButton').disabled = true;
            this.refreshProgress(this);
            importForm.mediaId.value = Powered.Util.arrayToString(this.selectedMediaId);
            Powered.Util.submitAjax('import', '/files/photoImport.jsp',
                    importForm, 'Modal_content', null, function() {
                this.photoStatus = null;
                Powered.pageModal.resizeToContent();
                Powered.pageModal._findFocusableElements();
            }.bind(this));
        }
    },

    refreshProgress: function (photoSelect) {
        var url = Powered.contextPath + '/files/fragments/photoStatus.jsp?time=' + new Date().getTime();
        new Ajax.Updater('PhotoStatus', url,
        {
            asynchronous:true,
            method: 'get',
            onSuccess: function () {
                if (photoSelect.photoStatus == 'inProgress') {
                    window.setTimeout(function() {
                        photoSelect.refreshProgress(photoSelect);
                    }, 1000);
                }
            }.bind(this)
        });
    }
});
