var FS = window.FS || {};
FS.PhotoAlbum = FS.PhotoAlbum || {};

FS.PhotoAlbum.UI = function() {
    
    var Event = YAHOO.util.Event;
    var Dom = YAHOO.util.Dom;
    
    var editModal;
    var shareModal;
    var buffer;
    
    var albumsContainerId = 'albumsContainer';
    var editId = 'editAlbum';
    var editFormId = 'editForm';
    var editSaveId = 'editSave';
    var editCancelId = 'editCancel';
    var errorLoadCloseId = 'loadErrorClose';
    var errorSaveCloseId = 'saveErrorClose';
    var editLinkClass = 'editLink';
    var editLoaderId = 'editLoader';
    var editSaveLoaderId = 'saveLoader';
    var editSaveErrorId = 'saveError';
    var editSaveSuccessId = 'saveSuccess';
    var editLoadErrorId = 'editLoadError';
    var editNameErrorId = 'editNameError';
    var editContentId = 'editContent';
    var editPrivacySectionId = 'editPrivacySection';
    var editPrivacyNoteId = 'editPrivacyNote';
    
    // Share album
    var shareId = 'shareAlbum';
    var shareFormId = 'shareForm';
    var shareSendId = 'shareSend';
    var shareCancelId = 'shareCancel';
    var shareCloseId = 'shareClose';
    var shareLinkClass = 'shareLink';
    var shareSendLoaderId = 'sendLoader';
    var shareSendErrorId = 'sendError';
    var shareEmailsErrorId = 'emailsError';
    var shareSendSuccessId = 'sendSuccess';
    var shareContentId = 'shareContent';
    
    var locale = Locale.getLocale();
    
    // LABELS
    var editCloseLabel = Locale.getString('verifyCloseLabel', locale);
    var editCancelLabel = Locale.getString('verifyCancelLabel', locale);
    //var updateEmailButtonLabel = Locale.getString('updateEmailButtonLabel', locale);
    var editAlbumTitle = Locale.getString('editAlbumTitle', locale);
    var editNameLabel = Locale.getString('editNameLabel', locale);    
		var editSmallNameLabel = Locale.getString('editSmallNameLabel', locale);
    var editDescriptionLabel = Locale.getString('editAlbumDesc', locale);
    var editPrivacyLabel = Locale.getString('editPrivacyLabel', locale);
    var editSubmitLabel = Locale.getString('editSubmitLabel', locale);
    var editPrivateLabel = Locale.getString('privacyPrivate', locale);
    var editPublicLabel = Locale.getString('privacyPublic', locale);
    var editButtonLabel = Locale.getString('saveChanges', locale);
    var editLoaderLabel = Locale.getString('editAlbumLoading', locale);
    var editSaveLoaderLabel = Locale.getString('editSaveLoaderLabel', locale);
    var editLoadErrorLabel =  Locale.getString('editLoadErrorLabel', locale);
    var editSaveErrorLabel = Locale.getString('editSaveErrorLabel', locale);
    var editSaveSuccessLabel = Locale.getString('editSaveSuccessLabel', locale);
    var editNameError = Locale.getString('editNameError', locale);
    var errorCloseLabel = Locale.getString('closeLabel', locale);
    
    var shareCloseLabel = Locale.getString('verifyCloseLabel', locale);
    var shareCancelLabel = Locale.getString('verifyCancelLabel', locale);
    
    var shareAlbumTitle =  Locale.getString('shareThisAlbum', locale);
    var shareLabel = Locale.getString('shareLabel', locale);    
		var shareSmallLabel = Locale.getString('shareSmallLabel', locale);

    var shareButtonLabel = Locale.getString('share', locale);
    var shareSendLoaderLabel = Locale.getString('shareSendLoaderLabel', locale);
    var shareSendErrorLabel = Locale.getString('shareSendErrorLabel', locale);
    var shareEmailsErrorLabel = Locale.getString('shareEmailsErrorLabel', locale);
    var shareSendSuccessLabel = Locale.getString('shareSendSuccessLabel', locale);
    
    // Form ids
    var albumNameId = 'album-name';
    var albumDescId = 'album-desc';
    var albumPublicId = 'album-public';
    var albumPrivateId = 'album-private';
    var albumSubmitId = 'album-submit';
    var emailsTextAreaId = 'email-addresses';
    var albumHiddenId = 'album-id';
    var ownerHiddenId = 'owner-id';    
    
    var nameErrorTimeout = '3000';
    var emailsErrorTimeout = '3000';
    var statusTimeout = '3000';
 
    var showLoadError = function() {
    	Dom.get(editSaveLoaderId).style.display = 'none';
		Dom.get(editSaveErrorId).style.display = 'none';
		Dom.get(editSaveSuccessId).style.display = 'none';
    	Dom.get(editLoaderId).style.display = 'none';
        Dom.get(editContentId).style.display = 'none';
        Dom.get(editLoadErrorId).style.display = '';
        return false;
    }
    
    var showLoading = function() {    	
    	Dom.get(editLoaderId).style.display = '';
		Dom.get(editSaveLoaderId).style.display = 'none';
		Dom.get(editSaveErrorId).style.display = 'none';
		Dom.get(editSaveSuccessId).style.display = 'none';
        Dom.get(editContentId).style.display = 'none';
        Dom.get(editLoadErrorId).style.display = 'none';
        return false;
    }
    
    var showSaveError = function() {
    	Dom.get(editSaveLoaderId).style.display = 'none';
    	Dom.get(editLoaderId).style.display = 'none';
        Dom.get(editLoadErrorId).style.display = 'none';
        Dom.get(editSaveErrorId).style.display = '';
    	Dom.get(editContentId).style.display = '';
    	return false;
    }
    
    var showSaving = function() {
    	Dom.get(editSaveSuccessId).style.display = 'none';
    	Dom.get(editLoaderId).style.display = 'none';
        Dom.get(editContentId).style.display = 'none';
        Dom.get(editLoadErrorId).style.display = 'none';
        Dom.get(editSaveLoaderId).style.display = '';
        return false;
    }

    var showEditForm = function() {
    	Dom.get(editSaveLoaderId).style.display = 'none';
		Dom.get(editSaveErrorId).style.display = 'none';
		Dom.get(editSaveSuccessId).style.display = 'none';
    	Dom.get(editLoaderId).style.display = 'none';
    	Dom.get(editLoadErrorId).style.display = 'none';
        Dom.get(editContentId).style.display = '';
        return false;
    }
    var showSaveSuccess = function() {
    	Dom.get(editSaveLoaderId).style.display = 'none';
    	Dom.get(editLoaderId).style.display = 'none';
        Dom.get(editLoadErrorId).style.display = 'none';
        Dom.get(editContentId).style.display = 'none';
    	Dom.get(editSaveSuccessId).style.display = '';
    	return false;
    }
    
    var showSendError = function() {
    	Dom.get(shareSendLoaderId).style.display = 'none';
        Dom.get(shareSendErrorId).style.display = '';
    	Dom.get(shareContentId).style.display = '';
    	return false;
    }
    
    var showSending = function() {
    	Dom.get(shareSendSuccessId).style.display = 'none';
    	Dom.get(shareContentId).style.display = 'none';
        Dom.get(shareSendLoaderId).style.display = '';
        return false;
    }

    var showSendForm = function() {
    	Dom.get(shareSendLoaderId).style.display = 'none';
		Dom.get(shareSendErrorId).style.display = 'none';
		Dom.get(shareSendSuccessId).style.display = 'none';
        Dom.get(shareContentId).style.display = '';
        return false;
    }
    var showSendSuccess = function() {
    	Dom.get(shareSendLoaderId).style.display = 'none';
        Dom.get(shareContentId).style.display = 'none';
    	Dom.get(shareSendSuccessId).style.display = '';
    	return false;
    }
    
    var setUpEditModal = function() {
        FS.Util.Modal.setHeader(editModal, editAlbumTitle);
        
        buffer.append('<div id="editAlbumModal">');
					buffer.append('<div id="',editLoaderId,'" class="modLoader center">');
					buffer.append('<strong><em>', editLoaderLabel,'</em></strong>');
					buffer.append('<br /><br />');
					buffer.append('<img src="',imagesURL,'/wallet/bigloading.gif" alt="Loading..."/>');
					buffer.append('</div>');
        
					buffer.append('<div id="',editSaveLoaderId,'" class="modLoader center" style="display:none">');
					buffer.append('<strong><em>', editSaveLoaderLabel,'</em></strong>');
					buffer.append('<br /><br />');
					buffer.append('<img src="',imagesURL,'/wallet/bigloading.gif" alt="Saving..."/>');
					buffer.append('</div>');
        
					buffer.append('<div id="',editSaveSuccessId,'" class="modLoader center" style="display:none">');
					buffer.append('<strong><em>', editSaveSuccessLabel,'</em></strong>');
					buffer.append('<div class="modalClose" style="display: none;">');
					buffer.append('<a href="#" id="',errorSaveCloseId,'">', errorCloseLabel, ' <img src="',imagesURL,'/close.png"/></a>');
					buffer.append('</div>');        
					buffer.append('</div>');
					
					buffer.append('<div id="',editLoadErrorId,'" class="modLoader center" style="display:none">');
					buffer.append('<strong><em>', editLoadErrorLabel,'</em></strong>');
					buffer.append('<div class="modalClose" style="display: none;">');
					buffer.append('<a href="#" id="',errorLoadCloseId,'">', errorCloseLabel, ' <img src="',imagesURL,'/close.png"/></a>');
					buffer.append('</div>');        
					buffer.append('</div>');
        
					buffer.append('<div id="',editContentId,'" style="display:none">');
						buffer.append('<form action="editalbum.php" method="post" id="',editFormId,'" name="editalbum">');
						buffer.append('<input type="hidden" name="a" id="',albumHiddenId,'"></input>');
						buffer.append('<fieldset id="',editSaveErrorId,'" style="display:none">');
						buffer.append('<div class="moderror">', editSaveErrorLabel, '</div>');
						buffer.append('</fieldset>');
						buffer.append('<fieldset>');
						buffer.append('<label class="field">', editNameLabel, ' <span class="font11">(', editSmallNameLabel ,')</span></label>');
						buffer.append('<span class="value"><input name="albumname" id="',albumNameId,'" maxlength="50" type="text" />');
						buffer.append('</span>');
						buffer.append('</fieldset>');
						buffer.append('<fieldset id="',editNameErrorId,'" style="display:none">');
						buffer.append('<div class="moderror">', editNameError, '</div>');
						buffer.append('</fieldset>');			
						buffer.append('<fieldset>');
						buffer.append('<label class="field">', editDescriptionLabel, '</label>');
						buffer.append('<span class="value"><textarea name="desc" id="',albumDescId,'" rows="5"></textarea>');
						buffer.append('</span>');
						buffer.append('</fieldset>');					
						buffer.append('<fieldset>');
						buffer.append('<label class="field">', editPrivacyLabel, '</label>');
						
						buffer.append('<span id="',editPrivacySectionId,'">');
						buffer.append('<input name="album-priv" id="',albumPublicId,'" value="0" type="radio"/><label id="private-label" for="',albumPublicId,'">', editPublicLabel ,'</label>');
						buffer.append('<input name="album-priv" id="',albumPrivateId,'" value="1" type="radio"><label id="public-label" for="',albumPrivateId,'">', editPrivateLabel,'</label>');        
						buffer.append('</span>');
						buffer.append('<span id="',editPrivacyNoteId,'" style="display:none">'); 						
						buffer.append('<span>', Locale.getString('primaryAlbumNote'),'</span>'); 
						buffer.append('</span>'); 
						
						buffer.append('<br/>');        
						buffer.append('<input name="submit_level" id="',albumSubmitId,'" type="checkbox"><label id="submit-label" for="',albumSubmitId,'">', editSubmitLabel ,'</label>');
						buffer.append('</fieldset>');        
						buffer.append('<div class="button">');
							buffer.append('<a href="#" id="',editSaveId,'" class="fakelink greyButton"><span>', editButtonLabel, '</span></a>');
							buffer.append('<a href="#" id="',editCancelId,'">', editCancelLabel, '</a>');
						buffer.append('</div>');
						buffer.append('</form>');
					buffer.append('</div>');
				
        buffer.append('</div>');	
        
        FS.Util.Modal.setBody(editModal, buffer.toString());
        buffer.reset();
        return false;
    };
    
    
    var setUpShareModal = function() {
        FS.Util.Modal.setHeader(shareModal, shareAlbumTitle);

        buffer.append('<div id="shareAlbumModal">');
					buffer.append('<div id="',shareSendLoaderId,'" class="modLoader center" style="display:none">');
					buffer.append('<strong><em>', shareSendLoaderLabel,'</em></strong>');
					buffer.append('<br /><br />');
					buffer.append('<img src="',imagesURL,'/wallet/bigloading.gif" alt="Saving..."/>');
					buffer.append('</div>');
					
					buffer.append('<div id="',shareSendSuccessId,'" class="modLoader center" style="display:none">');
					buffer.append('<strong><em>', shareSendSuccessLabel,'</em></strong>');
					buffer.append('<div class="modalClose" style="display: none;">');
					buffer.append('<a href="#" id="',shareCloseId,'">', shareCloseLabel, ' <img src="',imagesURL,'/close.png"/></a>');
					buffer.append('</div>');        
					buffer.append('</div>');
												
					buffer.append('<div id="',shareContentId,'" style="display:none">');
						buffer.append('<form action="editalbum.php" method="post" id="',shareFormId,'" name="editalbum">');
						buffer.append('<input type="hidden" name="a" id="',albumHiddenId,'"></input>');
						buffer.append('<input type="hidden" name="o" id="',ownerHiddenId,'"></input>');
													
						buffer.append('<fieldset id="',shareSendErrorId,'" style="display:none">');
						buffer.append('<div class="moderror">', shareSendErrorLabel, '<br /><div>');
						buffer.append('</fieldset>');
						
						buffer.append('<fieldset>');
						buffer.append('<label class="field">', shareLabel, ' <span class="font11">(', shareSmallLabel ,')</span></label>');
						buffer.append('<textarea name="emails" id="', emailsTextAreaId, '" rows="5"></textarea>');						
						buffer.append('</fieldset>');
						
						buffer.append('<fieldset id="',shareEmailsErrorId,'" style="display:none">');
						buffer.append('<div class="moderror">', shareEmailsErrorLabel, '</div>');
						buffer.append('</fieldset>');

						buffer.append('<div class="button">');
							buffer.append('<a href="#" id="',shareSendId,'" class="fakelink greyButton"><span>', shareButtonLabel, '</span></a>');
							buffer.append('<a href="#" id="',shareCancelId,'">', shareCancelLabel, '</a>');
						buffer.append('</div>');
						
						buffer.append('</form>');
					buffer.append('</div>');
				buffer.append('</div>');
        
        FS.Util.Modal.setBody(shareModal, buffer.toString());
        buffer.reset();
        return false;
    };
    return {
        init: function() {
        
            //instantiate our string buffer for use
            buffer = new FS.Util.StringBuffer();
            
            editModal = FS.Util.Modal.getInstance();        
            setUpEditModal();            
            editModal.center();
            
            shareModal = FS.Util.Modal.getInstance();
            setUpShareModal();            
            shareModal.center();
            
            ///Event Listeners for modal close button/////
            Event.on(editCancelId, 'click', function(e) {
            	Dom.get(editFormId).reset();
                editModal.hide();
                Event.preventDefault(e);
                return false;
            });
            
            Event.on(errorLoadCloseId, 'click', function(e) {
            	Dom.get(editFormId).reset();
                editModal.hide();
                Event.preventDefault(e);
                return false;
            });
            
            Event.on(errorSaveCloseId, 'click', function(e) {
            	Dom.get(editFormId).reset();
                editModal.hide();
                Event.preventDefault(e);
                return false;
            });
            
            Event.on(shareCancelId, 'click', function(e) {
            	Dom.get(shareFormId).reset();
                shareModal.hide();
                Event.preventDefault(e);
                return false;
            });
            
            Event.on(shareCloseId, 'click', function(e) {
            	Dom.get(shareFormId).reset();
                shareModal.hide();
                Event.preventDefault(e);
                return false;
            });
            /////////////////////////////////////////
            
            Event.on(albumsContainerId, 'click', this.clickHandler, this, true);
            Event.on(editSaveId, 'click', function(e) {
                FS.PhotoAlbum.UI.save();
                Event.preventDefault(e);
            });
            Event.on(shareSendId, 'click', function(e) {
                FS.PhotoAlbum.UI.send();
                Event.preventDefault(e);
            });
        
        },
        clickHandler: function(e) {
            var target = Event.getTarget(e);
            while (target.id !== albumsContainerId) {
                if (Dom.hasClass(target, editLinkClass) === true) {
                	var param = target.id.split('_');
                	var albumId = param[1];
                	shareModal.hide();
                	editModal.show();
                	
                	this.get(albumId);
                	
                    Event.preventDefault(e);
                    break;
                }
                else if(Dom.hasClass(target, shareLinkClass) === true) {
                	var param = target.id.split('_');
                	var albumId = param[1];
                	var ownerId = param[2];
                	editModal.hide();
                	shareModal.show();
                	this.set(albumId, ownerId);
                    Event.preventDefault(e);
                    break;
                }
                else {
                    target = target.parentNode;
                }
                
            }            
            
            
        },
        
        set: function(aid, oid) {
        	Dom.get(albumHiddenId).value = aid;
        	Dom.get(ownerHiddenId).value = oid;
        	showSendForm();
        },
        
        send: function() {
        	
        	var emailList = Dom.get(emailsTextAreaId).value;            
            //empty email list
            if(emailList.replace(/^\s\s*/, '').replace(/\s\s*$/, '') === '') {
                var emailsError = Dom.get(shareEmailsErrorId);
                emailsError.style.display = '';
                setTimeout(function() {
                	emailsError.style.display = 'none';
                }, emailsErrorTimeout);
            }
            else {
                var shareAlbumReq = new FS.PhotoAlbum.Request();
                var albumId = Dom.get(albumHiddenId).value;
                var ownerId = Dom.get(ownerHiddenId).value;
                var postObj = {
                        a: albumId, // TODO: check existence first!
                        o: ownerId, // TODO: check existence first!
                        emails: emailList,
                        x: 'share'
                };
                
                shareAlbumReq.onSendStart.subscribe(function(type, args, obj) {
                	showSending();                	
	            });
	                
                shareAlbumReq.onSendSuccess.subscribe(function(type, args, obj) {
                    var responseText = args[0].args[0].responseText;
                    var response =  YAHOO.lang.JSON.parse(responseText);
                    

                    //check if error
                    if (response.status === 'FAIL') {                    	  
                    	showSendError();
                    }
                    //success
                    else {              
                    	showSendSuccess();
                    	setTimeout(function(e) {
                        	shareModal.hide(); 
                        }, statusTimeout);
                    }
                    
                });
                
                shareAlbumReq.onSendFailure.subscribe(function(type, args, obj) {
                	showSendError();
                	
                    var sendError = Dom.get(shareSendErrorId);
                    sendError.style.display = '';
                    setTimeout(function(e) {
                       sendError.style.display = 'none'; 
                    }, statusTimeout);
                });                
                
                
                shareAlbumReq.send(postObj);
                
            }//end of else           
        }, //end of send function
        
        get: function(aid) {
        	var requestObj = {
                    a: aid,
                    x: 'load'
            };
            
            
            this.load(requestObj);
        },
        
        save: function() {
        	
        	var albumName = Dom.get(albumNameId).value;
            var albumDesc = Dom.get(albumDescId).value;
            
            if(Dom.get(albumPrivateId).checked) {
            	var albumPrivacy = Dom.get(albumPrivateId).value;
            	var albumPrivacyText = editPrivateLabel;
            } else {
            	var albumPrivacy = Dom.get(albumPublicId).value;
            	var albumPrivacyText = editPublicLabel;
            }
            
            if(Dom.get(albumSubmitId).checked)
            	var albumSubmit = 0;
            else
            	var albumSubmit = 1;
            
            //empty album name
            if(albumName.replace(/^\s\s*/, '').replace(/\s\s*$/, '') === '') {
                var nameError = Dom.get(editNameErrorId);
                nameError.style.display = '';
                setTimeout(function() {
                	nameError.style.display = 'none';
                }, nameErrorTimeout);
            }
            else {
                var editAlbumReq = new FS.PhotoAlbum.Request();
                var albumId = Dom.get(albumHiddenId).value;
                var postObj = {
                        a: albumId, // TODO: check existence first!
                        desc: albumDesc,
                        name: albumName,
                        priv: albumPrivacy,
                        sl: albumSubmit,
                        x: 'save'
                };
                
                editAlbumReq.onSaveStart.subscribe(function(type, args, obj) {
                	showSaving();                	
	            });
	                
                editAlbumReq.onSaveSuccess.subscribe(function(type, args, obj) {
                	
                	
                    var responseText = args[0].args[0].responseText;
                    var response =  YAHOO.lang.JSON.parse(responseText);
                    

                    //check if error
                    if (response.status === 'FAIL') {
                    	  
                    	showSaveError();
                    }
                    //success
                    else {                        
                        
                    	showSaveSuccess();
                    	// Replace the old properties of target album
                    	if(Dom.get('abAlbumTitle-'+albumId))
                    		Dom.get('abAlbumTitle-'+albumId).innerHTML = albumName;
                    	
                    	if(Dom.get('abAlbumDesc-'+albumId))
                    		Dom.get('abAlbumDesc-'+albumId).innerHTML = albumDesc;	
                    	
                    	Dom.get('abAlbumName-'+albumId).innerHTML = albumName;
                    	Dom.get('abAlbumPrivacy-'+albumId).innerHTML = albumPrivacyText;
                    	
                        setTimeout(function(e) {
                        	editModal.hide(); 
                        }, statusTimeout);
                    }
                    
                });
                
                editAlbumReq.onSaveFailure.subscribe(function(type, args, obj) {
                	showSaveError();
                	
                    var saveError = Dom.get(editSaveErrorId);
                    saveError.style.display = '';
                    setTimeout(function(e) {
                       saveError.style.display = 'none'; 
                    }, statusTimeout);
                });                
                
                
                editAlbumReq.save(postObj);
                
            }//end of else           
        },//end of save function
        
        load: function(postObj) {
        	var editAlbumReq = new FS.PhotoAlbum.Request();
            
        	// Start requesting
        	editAlbumReq.onGetStart.subscribe(function(type, args, obj) {
        		showLoading();
            });
            
        	// Successful request
        	editAlbumReq.onGetSuccess.subscribe(function(type, args, obj) {
                
                var responseText = args[0].args[0].responseText;
                var response =  YAHOO.lang.JSON.parse(responseText);

                //check if error
                if (response.status === 'FAIL') {
                	showLoadError();
                }
                //success
                else {
                    // Populate form fields
                	Dom.get(albumHiddenId).value = response.details.id;
                	Dom.get(albumNameId).value = response.details.name;
                	Dom.get(albumDescId).value = response.details.description;
                	if(response.details.submit_level == 0) 
                		Dom.get(albumSubmitId).checked = 'checked';
                	
                	if(response.details.id != primaryAlbumRid) {
                		Dom.get(editPrivacySectionId).style.display = '';
                		Dom.get(editPrivacyNoteId).style.display = 'none';
                		if(response.details.privacy == 0) 
                    		Dom.get(albumPublicId).checked = 'checked';
                    	else
                    		Dom.get(albumPrivateId).checked = 'checked';	
                	} else {
                		// Hide privacy form
                		Dom.get(editPrivacySectionId).style.display = 'none';
                		Dom.get(editPrivacyNoteId).style.display = '';
                	}
                	
                	
                	
                	// Show form
                	showEditForm();
                    
                }
        	});
        	
        	editAlbumReq.onGetFailure.subscribe(function(type, args, obj) {
        		showLoadError();
                
                setTimeout(function(e) {
                	editModal.hide(); 
                }, statusTimeout);
            });    
        	
        	editAlbumReq.get(postObj);
        }
    };
}();

YAHOO.util.Event.onDOMReady(FS.PhotoAlbum.UI.init, FS.PhotoAlbum.UI, true);