(function() {
    var Dom = YAHOO.util.Dom,
        Connect = YAHOO.util.Connect,
        Event = YAHOO.util.Event,
        CustomEvent = YAHOO.util.CustomEvent;
        
uAsyncForm = function(sFormIdOrName) {
    this.oAsyncForm      = new ark.util.AsyncForm(sFormIdOrName);

    this.submittingEvent = new CustomEvent('submittingEvent');
    this.submittedEvent  = new CustomEvent('submittedEvent');
    this.failedEvent     = new CustomEvent('failedEvent');
    this.invalidEvent    = new CustomEvent('invalidEvent');
    this.resetEvent      = new CustomEvent('resetEvent');

    /*
    this.flashReadyEvent = new CustomEvent('flashReadyEvent');
    this.selectedEvent   = new CustomEvent('selectedEvent');
    this.progressEvent   = new CustomEvent('progressEvent');
    this.uploadedEvent   = new CustomEvent('uploadedEvent');
    this.completeEvent   = new CustomEvent('completeEvent');
    this.errorEvent      = new CustomEvent('errorEvent');
    */

    this._verbose = false;
    this._log = function(msg) {
        if( "console" in window ) {
            if( this._verbose ) {
                console.log('[uAsyncForm] '+msg);
            }
        }
    }

    this._submitting = function(t,args) {
        this.submittingEvent.fire(args[0]);
    }
    this._submitted = function(t,args) {
        this._restore_visual();
        this.submittedEvent.fire(args[0],args[1]);
    }
    this._failed = function(t,args) {
        // REMOVE BLIND
        this._restore_visual();
        this.failedEvent.fire(args[0]);
    }
    this._invalid = function(t,args) {
        // REMOVE BLIND
        this._restore_visual();
        this.invalidEvent.fire(args[0],args[1]);
    }
    this._reset = function(t,args) {
       this._log('uAsyncForm._reset');

        if( this.bFlash ) {
            var elt = Dom.get(this.sId+'advanced_filename');
            elt.innerHTML = '';
            Dom.setStyle(this.sId+'advanced_selected','display','none');
            Dom.setStyle(this.sId+'advanced_browse','display','block');
			this.setSubmitDisplay('none');
            this.oUploader.clear();
            this.bSelected = false;
			
        }
		
		
       this.resetEvent.fire(args[0]);
    }

    this._restore_visual = function() {
        this._log('uAsyncForm._restore_visual');
        Dom.setStyle(this.sId+'bar','display','none');
        Dom.setStyle(this.sId+'advanced_status','display','none');

        var b = Dom.get(this.sId+'advanced_other_panel_blind');
        if( b ) {
            b.parentNode.removeChild(b);
        }
        Dom.setStyle(this.sId+'advanced_other_panel','opacity','1');
        Dom.setStyle(this.sId+'advanced_remove','visibility','visible');
    }


    this.oAsyncForm.submittingEvent.subscribe(this._submitting,this,true);
    this.oAsyncForm.submittedEvent.subscribe(this._submitted,this,true);
    this.oAsyncForm.failedEvent.subscribe(this._failed,this,true);
    this.oAsyncForm.invalidEvent.subscribe(this._invalid,this,true);
    this.oAsyncForm.resetEvent.subscribe(this._reset,this,true);

    this.bFile = false;
    this.sFileName = null;
    this.sId = null;

    this._init = function() {
        var oForm = Dom.get(this.oAsyncForm._formId);
        if (oForm) {
            this.sId = this.oAsyncForm._formId+'_';
            // Is this a file uploader?
            var elements = oForm.elements;
            if( typeof elements != 'undefined' && elements ) {
                var n = elements.length;
                for(var i = 0; i < n; i++ ) {
                    if( elements[i].type == 'file' ) {
                        this.bFile = true;
                        this.sFileName = elements[i].name;
                        break;
                    }  
                }
            }
        }
        this._log('has file '+this.bFile);
    }

    this.submit_clicked = function(e,obj) {
        if( e ) {
            Event.stopEvent(e);
        }
        obj._parent.submit(e,obj);
    }

    this.bSelected = false;
    this.submit = function(e,obj) {
        if( e ) {
            Event.stopEvent(e);
        }

        var oParent = obj._parent;
        if( oParent && oParent.bSelected ) {
            var sQuery = '';
            var oForm = Dom.get(oParent.oAsyncForm._formId);
            if( !oForm ) {
                return;
            }
            var elements = oForm.elements;
            if( typeof elements == 'undefined' || !elements ) {
                return;
            }
            var n = elements.length;
            for(var i = 0; i < n; i++ ) {
                if(    typeof elements[i].type != 'undefined'
                    && elements[i].type != 'button'
                    && elements[i].type != 'submit'
                    && elements[i].type != 'reset'
                    && elements[i].type != 'file' ) {
                    sQuery += elements[i].name + '=' + encodeURIComponent(elements[i].value)+'&';
                }
            }
     
            var sCookie = oParent.read_cookie('MASession');
            sCookie += '.' + oParent.read_cookie('MAUserId');
            sCookie += '.' + oParent.read_cookie('MASessionTime');
            sQuery += 'TRIBID='+sCookie;
            oParent._log(sQuery);

            // show progress bar
            Dom.setStyle(oParent.sId+'bar','display','block');
            Dom.setStyle(oParent.sId+'progress','width','0%');
            obj._log(oParent.sId+'advanced_status_text');
            var elt = Dom.get(oParent.sId+'advanced_status_text');
            elt.innerHTML = 'Uploading...';
            Dom.setStyle(oParent.sId+'advanced_status','display','block');

            // GREY OUT REST
            Dom.setStyle(oParent.sId+'advanced_other_panel','position','relative');
            var b = Dom.get(oParent.sId+'advanced_other_panel_blind');
            var c = Dom.get(oParent.sId+'advanced_other_panel');
            if( c ) {
            if( !b ) {
                b = document.createElement('DIV');
                b.setAttribute('id',oParent.sId+'advanced_other_panel_blind');
                c.appendChild(b);
            }
            Dom.setStyle(b,'position','absolute');
            Dom.setStyle(b,'top','0px');
            Dom.setStyle(b,'left','0px');
            Dom.setStyle(b,'width',c.scrollWidth+'px');
            Dom.setStyle(b,'height',c.scrollHeight+'px');
            Dom.setStyle(c,'opacity','0.5');
            }
        
            Dom.setStyle(oParent.sId+'advanced_remove','visibility','hidden');
        
            oParent.oUploader.startUpload(sQuery);
        }
    }

    this.oUploader = null;
    this._sc = null;
    this._c = null;
    this._takeOverSubmit = function() {
        this._sc = this.oAsyncForm.submit_clicked;
        this._s  = this.oAsyncForm.submit;
        this.oAsyncForm._parent = this;

        this.oAsyncForm.submit_clicked = this.submit_clicked;
        this.oAsyncForm.submit         = this.submit;
    }

    this._restoreSubmit = function() {
        this.oAsyncForm.submit_clicked = this._sc;
        this.oAsyncForm.submit         = this._s;
    }

    this._initUploader = function() {
        var id = 'swf_'+this.oAsyncForm._formId+'_uploader';

        var oForm = Dom.get(this.oAsyncForm._formId);

        var config = {
            id: id,
            uploadTargetURL: oForm.action,
            filePostName: this.sFileName,
            debug: this._verbose,
            flashURL: '/swfuploader.swf'
        };
        var name = 'o_'+id;
        this._log('uploader name '+name);
        this.oUploader = eval(name+'= new uploader("'+name+'",config)');
        //this.oUploader = new uploader(this.oUploader,config);
        this.oUploader.ReadyEvent.subscribe(this.flashReady,this);
        this.oUploader.SelectedEvent.subscribe(this.selected,this);
        this.oUploader.ProgressEvent.subscribe(this.progress,this);
        this.oUploader.UploadedEvent.subscribe(this.uploaded,this);
        this.oUploader.CompleteEvent.subscribe(this.completed,this);
        this.oUploader.ErrorEvent.subscribe(this.error,this);
        this._log('subscribed to events');
        this.oUploader.create_flash();
    }

    this.bFlash = false;
    this.flashReady = function(t,args,obj) {
        obj.bFlash = true;
        obj._log('__ flash mode');
        Dom.setStyle(obj.sId+'regular_upload','display','none');
        Dom.setStyle(obj.sId+'advanced_upload','display','block');

		obj.setSubmitDisplay('none');
		
        Event.on('browse_button','click',obj.browseClicked,obj,true);
        Event.on(obj.sId+'advanced_remove','click',obj.removeClicked,obj,true);

        // Need to swoop in submit event
        obj._takeOverSubmit();
    }
	
	this.setSubmitDisplay = function(value){
		if(this.sId == 'add_tribute_photo_form_'){
			if(Dom.getStyle('add_tribute_photo_from_web', 'display') == 'block'){
				Dom.setStyle('add_photo_submit', 'display', 'inline');
			}else{
				Dom.setStyle('add_tribute_photo_submit', 'display', value);
			}
		}else if(this.sId == 'add_photo_form_'){
			if(Dom.getStyle('add_photo_from_web', 'display') == 'block'){
				Dom.setStyle('add_photo_submit', 'display', 'inline');
			}else{
				Dom.setStyle('add_photo_submit', 'display', value);
			}
		}
	}

    this.removeClicked = function(e) {
        if( e ) { 
            Event.stopEvent(e);
        }
        var elt = Dom.get(this.sId+'advanced_filename');
        elt.innerHTML = '';
        Dom.setStyle(this.sId+'advanced_selected','display','none');
        Dom.setStyle(this.sId+'advanced_browse','display','block');
        this.oUploader.clear();
        this.bSelected = false;
    }

    this.browseClicked = function(e) {
        this._log('browseClicked');
        Event.stopEvent(e);
        this.oUploader.browse();
        Dom.setStyle(this.sId+'bar','display','none');
        Dom.setStyle(this.sId+'advanced_status','display','none');
    }

    // UPLOADER CALLBACKS
    this.selected = function(type,filename,obj) {
        var elt = Dom.get(obj.sId+'advanced_filename');
        elt.innerHTML = filename;
        Dom.setStyle(obj.sId+'advanced_browse','display','none');
        Dom.setStyle(obj.sId+'advanced_selected','display','block');

        obj.bSelected = true;

        Dom.setStyle('add_photo_confirmation','display','none');
		obj.setSubmitDisplay('inline');
		
    }

    this.progress = function(type,args,obj) {
        var filename = args[0];
        var current  = args[1];
        var total    = args[2];

        var p = Math.ceil(100 * current / total);
        obj._log(filename+' '+current+' '+total+' '+p);

        if( p >= 100 ) {
            // processing image now
            var elt = Dom.get(obj.sId+'advanced_status_text');
            elt.innerHTML = 'Processing...';
        }
        Dom.setStyle(obj.sId+'progress','width',p+'%');
    }

    this.uploaded = function(type,args,obj) {
        obj._log('uAsyncForm.uploaded');
    }

    this.completed = function(type,args,obj) {
        obj._log('uAsyncForm.completed');
        var filename = args[0];
        var response = args[1];
        var oR = {
            responseText: response,
            argument: obj.oAsyncForm
        };
        obj._log(filename+' '+response);

        if( obj.bFile && obj.bFlash && obj.bUploaderEnabled ) {
           obj.removeClicked(null);
        }
 
        obj._restore_visual();          
        obj.oAsyncForm._submitSuccess(oR);
        obj.bSelected = false;
    }

    this.error = function(type,args,obj) {
    }

    // UPLOADER SPECIFIC CONTROLS
    this.bUploaderEnabled = true;
    this.disableUploader = function() {
        this._log('disabling Uploader');
        this.bUploaderEnabled = false;
        this._restoreSubmit();
    }
    this.enableUploader = function() {
        this._log('enabling Uploader');
        // we might need to do something here
        this.bUploaderEnabled = true;
        this._takeOverSubmit();
    }
 
    // CONSTRUCTOR
    this._constructor = function() {
        this._init();
        if( this.bFile ) {
            this._initUploader();
        }
    }

    Event.onAvailable(this.oAsyncForm._formId,this._constructor,this,true);


    // NEED TO SUBSCRIBE TO EVENT TO FIRE SAME ONE :(
    this.reset = function(e,obj) {
       obj._log('uAsyncForm.reset');
       obj.oAsyncForm.reset(e,obj.oAsyncForm);
    }
    this._initForm = function(obj,form) {
        this.oAsyncForm._initForm(this.oAsyncForm,form);
        // if bFile do something about it :)
        if( this.bFile && this.bFlash && this.bUploaderEnabled ) {
            this.flashReady(null,null,this);
        }
    }

    this.read_cookie = function(name) {
        var nameEQ = name + "=";
        var ca = document.cookie.split(';');
        for(var i=0;i < ca.length;i++) {
            var c = ca[i];
            while (c.charAt(0)==' ') c = c.substring(1,c.length);
            if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
        }
        return null;
    }

}
})();

