﻿function PublicForms(id) {
    this.MovieObject = [];        
    // Internal        
    this.IsInitialized = false;                
    this.MaxBytes = 0;
    this.Parameters = {};    
    this.ErrorDescription = "";
    this.SessionKey = "";

    // Url configuration
    this.UrlFileCheckScript = "";
    this.UrlUploadScript = "";
    this.UrlRedirect = "";

    // Message configuration
    this.MsgFileProgressMessage = "";
    this.MsgByteProgressMessage = "";
    this.MsgUploadComplete = "";
    this.MsgUploadCancelled = "";
    this.MsgUploadCompleteStatus = "";
    this.MsgCancelConfirm = "";
    this.MsgCancelComplete = "";
    this.MsgFilesize = "";
    this.MsgNewname = "";
    this.MsgProgressCheckingFile = "";
    this.MsgProgressAwaiting = "";
    this.MsgProgressUploading = "";
    this.MsgProgressError = "";
    this.MsgProgressDoneComplete = "";
    this.MsgProgressDoneSkipped = "";
    this.MsgColumnFileName = "";
    this.MsgColumnFileSize = "";
    this.MsgColumnUploadStatus = "";
    this.MsgSpaceStatus = "";
    this.MsgOutOfSpace = "";
    this.MsgErrorNotice = "";


    this.OverallProgress = {};    

    this.AddParameter = function (identifier, name, value) {
        var paramObject = this.Parameters[identifier];
        if (paramObject == null) {
            paramObject = { 'identifier': identifier, 'params': [], 'filters': [] }
            this.Parameters[identifier] = paramObject;
        }

        this.Parameters[identifier].params.push(new Array(name, value));
    }

    this.AddFileFilter = function (identifier, description, extensions) {
        var paramObject = this.Parameters[identifier];
        if (paramObject == null) {
            paramObject = { 'identifier': identifier, 'params': [], 'filters': [] }
            this.Parameters[identifier] = paramObject;
        }
        this.Parameters[identifier].filters.push(new Array(description, extensions));
    }

    this.GetMovie = function (identifier) {
        if (typeof (this.MovieObject[identifier]) == 'undefined') {
            var movie = document.getElementById(identifier);
            if (!movie || !movie.InitUpload) {                
                var embeds = document.getElementsByTagName("embed");

                for (var i = 0; i < embeds.length; i++) {
                    if (embeds[i].name == identifier) {
                        var movie = embeds[i];
                    }
                }
            }

            this.MovieObject[identifier] = movie;
        }
        return this.MovieObject[identifier];
    }

    this.InitUpload = function (clearCookie, identifier) {
        var paramObject = this.Parameters[identifier];
        this.GetMovie(identifier).InitUpload(this.UrlUploadScript, this.MsgFileProgressMessage, this.MsgByteProgressMessage, this.MsgUploadComplete, paramObject.params, this.UrlRedirect, this.UrlFileCheckScript, paramObject.filters, false, clearCookie, this.SessionKey);
        this.IsInitialized = true;
    }

    this.FlashButtonMouseOver = function (identifier) {
        //alert('over');
    }

    this.FlashButtonMouseOut = function (identifier) {
        //alert('and out');
    }

    this.AddFiles = function () {
        
    }

    this.Save = function (formId) {
        var sendBtn = $elm('*[id="' + formId + '_sendbutton"]');
        var nextBtn = $elm('*[id="' + formId + '_nextbutton"]');
        if (sendBtn) sendBtn.disabled = true;
        if (nextBtn) nextBtn.disabled = true;
        var multiFields = $elms('form[id="' + formId + '"] div[id$="multiuploadwrapper"]');
        if (multiFields.length == 0) return true;
        else {
            var pendingUploads = false;
            for (var i = 0; i < multiFields.length; i++) {
                var identifier = /(field\d+_)/gi.exec(multiFields[i].id)[1] + 'multiupload';
                this.OverallProgress[identifier] = { 'completed': false, 'identifier': identifier, 'form': formId }
                var fieldId = /field(\d+)_multiupload/.exec(identifier)[1];
                var elms = $elms('#field' + fieldId + 'table div');
                if (elms.length > 0) { pendingUploads = true; this.StartUpload(identifier); }
            }
            return !pendingUploads;
        }
    }

    this.StartUpload = function (identifier) {
        var success = this.GetMovie(identifier).StartUpload(this.GetFormValues(identifier));
        if (!success) {
            this.InitUpload(false);
            this.OverallProgress[identifier].completed = false;
            this.GetMovie(identifier).StartUpload(this.GetFormValues(identifier));
        }
    }

    this.RecalcAddButton = function (identifier) {
        //if (window.confirm('debug?')) throw new Error();
        var a = $elm(identifier + '_addButton');
        var wrp = $elm('#' + identifier + 'wrapper object');        
        wrp.style.width = a.offsetWidth + 'px';
        wrp.style.height = a.offsetHeight + 'px';

        var wrp = $elm('#' + identifier + 'wrapper object embed');
        wrp.style.width = a.offsetWidth + 'px';
        wrp.style.height = a.offsetHeight + 'px';

    }

    this.OnAddedFilesChange = function (files, identifier) {
        files = eval('(' + files + ')');
        var ident = /(field\d+)_/.exec(identifier);
        var table = $elm('#' + ident[1] + 'table tbody');
        while (table.childNodes.length > 1) {
            var elm = table.childNodes[1];
            elm.parentNode.removeChild(elm);
        }

        for (var i = 0; i < files.length; i++) {
            var tr = $ts.createElement('tr');
            var td = $ts.createElement('td');
            td.innerHTML = files[i].name;
            tr.appendChild(td);
            td = $ts.createElement('td');
            td.innerHTML = Math.floor((files[i].size / 1024)) + " KB";
            tr.appendChild(td);
            td = $ts.createElement('td');
            td.innerHTML = '<div data-filename="' + files[i].name + '">' + this.MsgProgressAwaiting + '</div>';
            tr.appendChild(td);
            table.appendChild(tr);
        }

        Tangora.Layout.Resize();
        Tangora.Layout.Resize();

        var accFileSize = 0;
        for (var i = 0; i < files.length; i++) accFileSize += files[i].size;
        this.SetRequiredSpace(accFileSize);

        if (files.length > 0 && this.MaxBytes > accFileSize) {
            //this.DisableButton("upload", false);
        }
        else {
            //this.DisableButton("upload", true);
        }
    }

    this.SetRequiredSpace = function (requiredSpace) {
        if (requiredSpace > this.MaxBytes) {
            LightBox.Open('<div style="background-color:whitesmoke;border:1px solid black;width:300px; height:40px;text-align:center;padding:20px;"><p>'+this.MsgOutOfSpace + '.</p></div>');
        }
    }

    this.SetStatus = function (identifier, name, msg, msg2) {

        //this.SetStatus(file.name, this.MsgProgressCheckingFile, "uploadinprogress");
        var ident = /(field\d+)_/.exec(identifier);        
        var fileDiv = $elm('#' + ident[1] + 'table div[data-filename="' + name + '"]');
        if (fileDiv) fileDiv.innerHTML = msg;

        return;
    }

    this.GetFormValues = function (identifier) {
        var formValues = new Array();        
        formValues.push(['orphaned', 'true']);        
        return formValues;
    }

    this.OnFileCheck = function (file, identifier) {                
        this.SetStatus(identifier, file.name, this.MsgProgressCheckingFile, "uploadinprogress");
    }

    this.OnFileUpload = function (file, identifier) {        
        file = eval('(' + file + ')');
        this.SetStatus(identifier, file.name, this.MsgProgressUploading, "uploadinprogress");
    }

    this.OnFileComplete = function (file, jsonProps, identifier) {        
        file = eval('(' + file + ')');
        var jsonString = decodeURIComponent(jsonProps);        
        var obj = eval('(' + jsonString + ')');
        this.SetStatus(identifier, file.name, this.MsgProgressDoneComplete, "uploadcomplete");

        var dataFields = $elms('input[data-relation="' + /(field\d+)_/gi.exec(identifier)[1] + '"]');
        var dataField = null;
        for (var i = 0; i < dataFields.length; i++) {
            var s = dataFields[i].getAttribute('data-relation');
            if (s != undefined && s != '') {
                dataField = dataFields[i];
                break;
            }
        }

        if (dataField.value == '') dataField.value = obj.id;
        else dataField.value += ',' + obj.id;
        //this.FilesUploaded.push(obj);
    }

    this.OnFileSkipped = function (file, identifier) {        
        file = eval('(' + file + ')');
        this.SetStatus(identifier, file.name, this.MsgProgressDoneSkipped, "uploadskipped");
        this.FilesCancelled.push(file.name);
    }

    this.OnFileError = function (file, description, identifier) {
        alert('on fileerror');
        file = eval('(' + file + ')');
        this.SetStatus(identifier, file.name, this.MsgProgressError + " " + description, "uploadskipped");
        this.ErrorDescription = description;
        this.FilesFailed.push(file.name);
    }

    this.OnProgress = function (percent, fileStatus, byteStatus) {        
        Tangora.ContentPage.Page.SetProgress(percent, fileStatus, byteStatus);
    }

    this.OnComplete = function (identifier) {
        this.OverallProgress[identifier].completed = true;
        for (var name in this.OverallProgress) {
            if (this.OverallProgress[name].completed !== true) return;
        }
        $elm(this.OverallProgress[identifier].form).submit();
    }

    this.OnCancel = function (identifier) {
    }

    this.ShowOverwriteDialog = function (json, newname, fileid, filesize, identifier) {
        var dataFields = $elms('input[data-relation="' + /(field\d+)_/gi.exec(identifier)[1] + '"]');
        var dataField = null;
        for (var i = 0; i < dataFields.length; i++) {
            var s = dataFields[i].getAttribute('data-relation');
            if (s != undefined && s != '') {
                dataField = dataFields[i];
                break;
            }
        }
        //alert(dataField.value);
        if (dataField.value == '') {
            this.GetMovie(identifier).Overwrite('rename');            
        }
        else {
            if ((',' + dataField.value + ',').indexOf(',' + fileid + ',') == -1) { this.GetMovie(identifier).Overwrite('rename');}
            else { this.GetMovie(identifier).Overwrite('overwrite');}
        }


    }

}

Tangora.MultiUploader = new PublicForms("multiupload");

//Tangora.MultiUploader.UrlFileCheckScript = 'http://localhost:50000/filecheck.ashx';
//Tangora.MultiUploader.UrlUploadScript = 'http://localhost:50000/fileupload.ashx';
Tangora.MultiUploader.UrlFileCheckScript = '/filecheck.ashx';
Tangora.MultiUploader.UrlUploadScript = '/fileupload.ashx';

function TangoraFormUtils() {

    this.displayInlineCategoryField = function (fieldId, a) {
        var categoryField = $elm(fieldId);
        if (!categoryField) return;
        var inlineField = $elm(fieldId + '_text');
        if (categoryField.style.display != 'none') {
            a.setAttribute('data-text', a.innerHTML);
            a.innerHTML = a.nextSibling.innerHTML;
            categoryField.style.display = 'none';
            inlineField = $ts.createElement('input', { 'id': fieldId + '_text', 'name': categoryField.name + '_text', 'className': categoryField.className });
            var v = categoryField.getAttribute('data-inlineValue');
            inlineField.value = v ? v : '';
            categoryField.parentNode.insertBefore(inlineField, categoryField);
            inlineField.style.display = 'inline-block';
        }
        else {
            a.innerHTML = a.getAttribute('data-text');
            categoryField.style.display = 'inline-block';
            categoryField.setAttribute('data-inlineValue', inlineField.value);
            inlineField.parentNode.removeChild(inlineField);
        }

    }
}

Tangora.FormUtils = new TangoraFormUtils();
