HD.UploadWidget = function(config) {
    this.config = config || {};
	// Actions is an array of action names to add to the upload dialog after confirmation.
	this.config.actions = this.config.actions || [];
	this.config.dialog = this.config.dialog || {};
	
	// Friendly names for category dropdown
    this.config.categoriesFriendly = this.config.categoriesFriendly || this.config.categories;
    this.config.siteSection = this.config.siteSection || "";
    this.observers = [];
};

HD.UploadWidget.templates = {
	overlayTitle            : 'Upload',
	unsupportedFileTypeText : [	"You must submit a photo or a video.<br/>",
						       	"Photo must use the following format: (.jpg, .gif)<br/>",
						       	"Video must use the following format: (.flv, .wmv, .asf, .avi, .mov, .3gp, .mpg, .mpeg, .mp4)<br/>"
						      ].join(""),
						      
	suggestionsAndGuidelinesText : '',					      
	
	getOverlayTitle : function() {
		return this.overlayTitle;
	},
	
	getUnsupportedFileTypeText : function() {
		return this.unsupportedFileTypeText;
	},
	
	getSuggestionsAndGuidelinesText : function() {
		return this.suggestionsAndGuidelinesText;
	}
};

HD.UploadWidget.prototype = {
	supportedVideoTypes : [".flv", ".wmv", ".asf", ".avi", ".mov", ".3gp", ".mpg", ".mpeg", ".mp4"],
	
	supportedPhotoTypes : [".jpeg", ".jpg", ".gif"],
	
	getUnsupportedFileTypeError : function(extension) {
		return HD.UploadWidget.templates.getUnsupportedFileTypeText();
	},
	
    renderPhoto : function() {		
		var cb=this;
		login.model.isUserLoggedIn(function(userResponse) {
			if(userResponse.loggedInLevel > 1) {
				cb.getPhotoHtml(null);
			} else {
				var observer = {
					update : function(eventName, eventData) {
						if (eventName == "logged_In") {
							cb.getPhotoHtml(null);
							login.model.removeObserver(this);
							HD.util.Common.getObservable().removeObserver(this);
						} else if (eventName == "overlayClose_Click") {
							login.model.removeObserver(this);
							HD.util.Common.getObservable().removeObserver(this);
						}
					}
				};
				
				HD.util.Common.getObservable().addObserver(observer);
				login.model.addObserver(observer);
				
				login.model.addObserver(observer);
				if(userResponse.loggedInLevel > 0){
					login.view.promptCreateScreenName();
				}else{
					login.view.promptAuthentication();
				}
			}
		});		
    },
    
    renderVideo : function() {
    	var cb=this;
		login.model.isUserLoggedIn(function(userResponse) {
			if(userResponse.loggedInLevel > 1) {
				cb.getVideoHtml(null);
			} else {

				var observer = {
					update : function(eventName, eventData) {
						if (eventName == "logged_In") {
							cb.getVideoHtml(null);	
							login.model.removeObserver(this);
							HD.util.Common.getObservable().removeObserver(this);
						} else if (eventName == "overlayClose_Click") {
							login.model.removeObserver(this);
							HD.util.Common.getObservable().removeObserver(this);
						}
					}
				};
				
				HD.util.Common.getObservable().addObserver(observer);
				login.model.addObserver(observer);
				
				if(userResponse.loggedInLevel > 0){
					login.view.promptCreateScreenName();
				}else{
					login.view.promptAuthentication();
				}
			}
		});		
    },
    
    renderBoth : function(category, categories, categoriesFriendly) {
    	this.category = category;
    	this.categories = categories;
    	this.categoriesFriendly = categoriesFriendly || categories;
    	
		var cb=this;
		login.model.isUserLoggedIn(function(userResponse) {
			if(userResponse.loggedInLevel > 1) {
				cb.getBothHtml(null);
			} else {
				var observer = {
					update : function(eventName, eventData) {
						if (eventName == "logged_In") {
							cb.getBothHtml(null);
							login.model.removeObserver(this);
							HD.util.Common.getObservable().removeObserver(this);
						} else if (eventName == "overlayClose_Click") {
							login.model.removeObserver(this);
							HD.util.Common.getObservable().removeObserver(this);
						}
					}
				};
				
				HD.util.Common.getObservable().addObserver(observer);
				login.model.addObserver(observer);
				
				login.model.addObserver(observer);
				if(userResponse.loggedInLevel > 0){
					login.view.promptCreateScreenName();
				}else{
					login.view.promptAuthentication();
				}
			}
		});		
    },
    
    loading : function(isShow) {
		var parentEl = this.getParent();
		if(isShow) {
			HD.addClass(parentEl, HD.CSS_CLASSES.LOADING);
		} else {
			HD.removeClass(parentEl, HD.CSS_CLASSES.LOADING);
		}
    },
    
    update : function(eventName, eventData) {
		var config = this.config;
    	if(eventName == "submitMedium_Start") {
    		this.loading(true);
    	} else if(eventName == "submitMedium_Finish") {
    		this.loading(false);
			var self = this;
	    	HD.util.Common.requestContent(comSvcBaseUrl + '/hd/hd_upload_widget/assets/uploadConfirmation.jsp?siteName='+ config.siteName+"&siteSection="+config.siteSection, function(responseText) {
				var overlayEl = HD.util.Common.showOverlay(responseText, HD.UploadWidget.templates.getOverlayTitle(), config.dialog.confirm ? config.dialog.confirm[0] : "580px", config.dialog.confirm ? config.dialog.confirm[1] : "150px");
				HD.util.Analytics.track(self.analyticsUploadConfirmationString(eventData[3] || ''));				
				// Add action buttons.
				if (self.config.actions.length > 0) {
					var wrapper = HD.getByClass('hdwcMedPadBtm', 'div', overlayEl)[0];
					var actionEl = document.createElement('div');
					actionEl.className = "btnOrange " + HD.CSS_CLASSES.ACTION;
					actionEl.innerHTML = "<a href='#'></a>";
					for (var i = 0; i < self.config.actions.length; i++) {
						var el = actionEl.cloneNode(true);
						(function() {
							var action = self.config.actions[i];
							el.firstChild.innerHTML = action;
							el.firstChild.onclick = function() {
								HD.util.Common.hideOverlay();
								self.model.notifyObservers("submitMedium_Action", action);
							};
						})();
						wrapper.appendChild(el);
					}
				}
			});
    	} else if(eventName == "submitMedium_Error") {
    		this.loading(false);
    		eventData[0].indexOf("photo") >= 0 ? this.getPhotoHtml(eventData):this.getVideoHtml(eventData);
    	}
    },
    
	getPhotoHtml : function(eventData) { 
    	var cb = this;			
		var config = this.config;
		var timestamp = HD.util.Common.timestamp();
		
		HD.util.Common.requestContent(comSvcBaseUrl + '/hd/hd_upload_widget/assets/photoUpload.jsp?siteName='+ config.siteName +'&category='+ config.categories[0] + "&timestamp=" + timestamp+"&siteSection="+config.siteSection, function(responseText) {
			HD.util.Common.showOverlay(responseText, "Upload", "590px", "525px");
			HD.util.Analytics.track(HD.UploadWidget.prototype.analyticsUploadPhotoString());
			if(eventData!=null){
				var formEl = document.getElementById("hdUploadPhotoForm");
				if(formEl != null){
					formEl.title.value = eventData[1];			
					formEl.story.value = eventData[2];					
				}					
			}
			
			cb.setPhotoListeners.call(cb);
		});
	},
	
	getVideoHtml : function(eventData) { 
		var cb = this;
		var config = this.config;
		var timestamp = HD.util.Common.timestamp();		
		
		HD.util.Common.requestContent(comSvcBaseUrl + '/hd/hd_upload_widget/assets/videoUpload.jsp?siteName='+ config.siteName +'&category='+ config.categories[0] + "&timestamp=" + timestamp+"&siteSection="+config.siteSection, function(responseText) {
			HD.util.Common.showOverlay(responseText, "Upload", "590px", "525px");
			HD.util.Analytics.track(HD.UploadWidget.prototype.analyticsUploadVideoString());
			if(eventData!=null){
				var formEl = document.getElementById("hdUploadVideoForm");
				if(formEl != null){
					formEl.title.value = eventData[1];			
					formEl.story.value = eventData[2];					
				}					
			}
			
			cb.setVideoListeners.call(cb);
		});
	},
	
	getBothHtml : function(eventData, selectedCategory) { 
		var cb = this;
		var config = this.config;
		var timestamp = HD.util.Common.timestamp();
				
		var categoriesParam = "categories=";
		for (var i=0; i<this.categories.length; i++){
			// Replace any commas, as the upload widget is expecting the categories comma delimited
			var categoryName = this.categories[i];
			categoryName = categoryName.replace(/,/g, 'acomma');
			
			categoriesParam += encodeURIComponent(categoryName);
			if (i<(this.categories.length-1)){
				categoriesParam += ",";
			}
		}
		
		var categoriesFriendlyParam = "categoriesFriendly=";
		for (var i=0; i<this.categoriesFriendly.length; i++){
			// Replace any commas, as the upload widget is expecting the categories comma delimited
			var categoryName = this.categoriesFriendly[i];
			categoryName = categoryName.replace(/,/g, 'acomma');
			
			categoriesFriendlyParam += encodeURIComponent(categoryName);
			if (i<(this.categoriesFriendly.length-1)){
				categoriesFriendlyParam += ",";
			}
		}

		var category = this.category;
		
		if(selectedCategory != null) {
			category = selectedCategory;
		}
		
		var url = comSvcBaseUrl + '/hd/hd_upload_widget/assets/uploadBoth.jsp?siteName='+ config.siteName +'&category='+ category + "&timestamp=" + timestamp + "&" + categoriesParam+ "&" + categoriesFriendlyParam+'&siteSection='+config.siteSection;
		
		HD.util.Common.requestContent(url, function(responseText) {
			HD.util.Common.showOverlay(responseText, "Upload", "590px", "525px");
			HD.util.Analytics.track(HD.UploadWidget.prototype.analyticsUploadBothString.call());
			if(eventData!=null){
				var formEl = document.getElementById("hdUploadBothForm");
				if(formEl != null){
					formEl.title.value = eventData[1];			
					formEl.story.value = eventData[2];					
				}					
			}
			
			cb.setBothListeners.call(cb);
		});
	},
	
	setBothListeners : function() {
		var cb = this;
		var modelCb = this.model;
		var formEl = document.getElementById("hdUploadBothForm");

		formEl.onsubmit = function() {
			var filePath = formEl.path.value;
			var extension = cb.getFileExtension.call(cb, filePath);
			var type = null;
			
			cb.removeErrors(formEl);
			
			if(cb.isSupportedVideoFile(extension)) {
				formEl.type.value = "video";
			} else if(cb.isSupportedPhotoFile(extension)) {
				formEl.type.value = "photo";
			} else {
				formEl.type.value = "";
			}
			
			var selectedCategory = formEl.category.value;
			
			var mediaObj = {
				title: formEl.title.value,
				path: formEl.path.value,
				story: formEl.story.value,
				type: formEl.type.value,
				category : selectedCategory
			};
			
			
			ValidationService.validateUpload(mediaObj, function(mediaResponse){
				if(mediaResponse.errors.length > 0){
					cb.getBothHtml(null, selectedCategory);
				} else {
					cb.startProgress();
					modelCb.submitMedium.call(modelCb, formEl);
				}				
				return false;
			});
			return false;
		};	
		
		cb.setToggleTerms();
		cb.setToggleSuggestions();
	},
	
	setPhotoListeners : function() {
		var cb = this;
		var modelCb = this.model;
		var formEl = document.getElementById("hdUploadPhotoForm");
		
		formEl.onsubmit = function() {	
			cb.removeErrors(formEl);
					
			var mediaObj = {
				title: formEl.title.value,
				path: formEl.path.value,
				story: formEl.story.value,
				type: formEl.type.value,
				category : formEl.category.value
			};
			
			ValidationService.validateUpload(mediaObj, function(mediaResponse){
				if(mediaResponse.errors.length > 0){
					cb.getPhotoHtml(null);
				} else {
					cb.startProgress();
					modelCb.submitMedium.call(modelCb, formEl);
				}				
				return false;
			});
			return false;
		};	
		
		cb.setToggleTerms();
		cb.setToggleSuggestions();
	},
	
	setVideoListeners : function() {
		var cb = this;
		var modelCb = this.model;
		var formEl = document.getElementById("hdUploadVideoForm");

		formEl.onsubmit = function() {	
			cb.removeErrors(formEl);
					
			var mediaObj = {
				title: formEl.title.value,
				path: formEl.path.value,
				story: formEl.story.value,
				type: formEl.type.value,
				category : formEl.category.value
			};
			
			ValidationService.validateUpload(mediaObj, function(mediaResponse){
				if(mediaResponse.errors.length > 0){
					cb.getVideoHtml(null);
				} else {
					cb.startProgress();
					modelCb.submitMedium.call(modelCb, formEl);
				}				
				return false;
			});
			return false;
		};	
		
		cb.setToggleTerms();
		cb.setToggleSuggestions();
	},
	
	removeErrors : function(formEl) {	
		var errorEl = HD.get('hdwcErrorOverlayLarge');
		if (errorEl) {
			errorEl.parentNode.removeChild(errorEl);
		}
		var errorClassEls = HD.getByClass('hdwcValidationError', 'div', formEl);
		for (var i = 0, l = errorClassEls.length; i < l; i++) {
			HD.removeClass(errorClassEls[i], 'hdwcValidationError');
		}		
	},
	
	refreshProgress : function (){
		var cb = this;		
		UploadMonitor.getUploadInfo(function(data){
			cb.updateProgress.call(cb, data);
			return false;
		});
	},

	updateProgress : function (uploadInfo){
		
		if (uploadInfo.inProgress){ 
	    	try{
	    		var fileIndex = uploadInfo.fileIndex;
		        var progressPercent = Math.ceil((uploadInfo.bytesRead / uploadInfo.totalSize) * 100);
		        document.getElementById('progressBarText').innerHTML = progressPercent + '%';
		        document.getElementById('progressBarBoxContent').style.width = parseInt(progressPercent * 3.5) + 'px';
	    	} catch (e){}	    	
	    } 
	    
		HD.UploadWidget.progressTimer = window.setTimeout("var uploadJS = new HD.UploadWidget();uploadJS.refreshProgress()", 500);
	},

	startProgress : function () {
	    document.getElementById('progressBar').style.display = 'block';
	    document.getElementById('progressBarText').innerHTML = '0%';
	    // wait a little while to make sure the upload has started ..
	    HD.UploadWidget.progressTimer = window.setTimeout("var uploadJS = new HD.UploadWidget();uploadJS.refreshProgress()", 500);
	},
	
	toggleTerms : function(){
	
		var termsEl = HD.util.Common.get('termsAndConditions');
		var swivelEl = HD.util.Common.get('tcSwivel');
		
		if (termsEl.style.display != 'block'){
			
			YAHOO.util.Dom.setStyle(termsEl, 'display', 'block');
			swivelEl.innerHTML = 'v';	 
			document.getElementById('scrollableDiv').scrollTop = 400;
			if (HD.UploadWidget.prototype.termsAndConditionsString) {
				HD.util.Analytics.track(HD.UploadWidget.prototype.termsAndConditionsString());			  					 									  									  					
			}
		}
		else{
			YAHOO.util.Dom.setStyle(termsEl, 'display', 'none');
			swivelEl.innerHTML = '&#62';	 
		}
		
	},
	
	setToggleTerms : function(){
		var cb = this;
		var termsEl = HD.util.Common.get('tcButton');
		termsEl.onclick = function(){
			cb.toggleTerms();
			return false;
		};		
	},
	
	toggleSuggestions : function(){
		var suggestionsEl = HD.util.Common.get('suggestionsAndGuidelines');
		var swivelEl = HD.util.Common.get('sgSwivel');
		
		if (suggestionsEl.style.display != 'block'){
			suggestionsEl.innerHTML = HD.UploadWidget.templates.getSuggestionsAndGuidelinesText();
			YAHOO.util.Dom.setStyle(suggestionsEl, 'display', 'block');
			swivelEl.innerHTML = 'v';	 
		}
		else{
			YAHOO.util.Dom.setStyle(suggestionsEl, 'display', 'none');
			swivelEl.innerHTML = '&#62';	 
		}
	},
	
	setToggleSuggestions : function(){
		var cb = this;
		var suggestionsEl = HD.util.Common.get('sgButton');
		if(suggestionsEl){
			suggestionsEl.onclick = function(){
				cb.toggleSuggestions();
				return false;
			};
		}
	},
	
	getFileExtension : function(file) {
		if(file == null) {
			return "";
		}
		return file.substring(file.lastIndexOf("."));
	},
	
	isSupportedVideoFile : function(fileExtension) {
		return this.isSupportedType(fileExtension, this.supportedVideoTypes);
	},
	
	isSupportedPhotoFile : function(fileExtension) {
		return this.isSupportedType(fileExtension, this.supportedPhotoTypes);
	},
	
	isSupportedType : function(type, supportedTypes) {
		if(type == null || supportedTypes == null) {
			return false;
		}
		
		type = type.toLowerCase();
		
		for(var i = 0, len = supportedTypes.length; i < len; i++) {
			if(supportedTypes[i] == type) {
				return true;
			}
		}
		
		return false;
	},
	
	showError : function(errorText, refEl) {
		refEl = HD.get(refEl);
		refEl.innerHTML += "<div id='hdwcErrorOverlayLarge'>" + errorText + "</div>"
	},
	
	analyticsUploadBothString : function() {
		return "default_analyticsUploadBothString";
	},
	
	analyticsUploadPhotoString : function() {
		return "default_analyticsUploadPhotoString";
	},
	
	analyticsUploadVideoString : function() {
		return "default_analyticsUploadVideoString";
	},
	
	analyticsUploadConfirmationString : function() {
		return "default_analyticsUploadConfirmationString";
	}
};

HD.extend(HD.UploadWidget, [HD.Widget]);

HD.register('hd_upload_widget', 'HD.UploadWidget', {version: "1.0", build: "1"});