//requires jquery
window.log=function(){log.history=log.history||[];log.history.push(arguments);if(this.console){console.log(Array.prototype.slice.call(arguments))}};

var Promo = {
	debug : false,
	indicatorMsg : 'Loading',
	lastReturnedData : '',
	attributes : [],
	uploadButtons : [],
	module_capacity : [],
	onload : function() {},
	
	init : function() {
		Promo.onload();
	},
	
	addLoadEvent : function (func) {
	  var oldonload = Promo.onload;
	  if (typeof Promo.onload != 'function') {
	    Promo.onload = func;
	  } else {
	    Promo.onload = function() {
	      if (oldonload) {
	        oldonload();
	      }
	      func();
	    }
	  }
	},
	
	uploadMedia : function(formObj) {
		topLevelHandlerFn = this.onMediaUpload;
		var params = $(formObj).serialize();
		$.post(this.media_url_submit, params, responseHandler, 'json');
	},
	
	onMediaUpload : function(data) {
		
	},
	
	ajaxFormSubmit : function(formObj, submitUrl, callbackFn) {
		if(!$.isFunction(callbackFn)) callbackFn = this.formSubmitHandler;
		var params = $(formObj).serialize();
		$.post(submitUrl, params, function(response) { callbackFn(response) }, 'json');
	},
	
	redirect : function(url) {
		Promo.log('redirect'+url);
		window.location = url;
	},
	
	refresh : function() {
		location.reload(true);
	},
	
	formSubmitHandler : function(data) {
		this.lastReturnedData = data;
	},

	showLoading : function(div_id) {
		$('#'+div_id).html( Promo.loadingImgHtml() );
	},
	
	loadingImgHtml : function() {
		return  '<img src="/img/ajax-loader-wheel.gif" />';
	},

	showIndicator : function(div_id) {
		if(div_id != undefined) { }
	},
	
	hideIndicator : function() {
		Promo.hide('indicator');
	},
	
	show : function(id) {
		$('#'+id).css('display', 'block');
	},
	
	hide : function(id) {
		$('#'+id).css('display', 'none');
	},
	
	log : function(message) {
		if(Promo.debug && console) {
			console.log(message);
		}
	},

	deleteComment : function(module_id, comment_id, div_id) {
		Promo.showIndicator();
		var url = Promo.deleteCommentUrl+module_id+'/'+comment_id;
		Promo.log('deleteComment::url: '+url);
		$.post(url, '', 
		function(response) { 
			Promo.log('deleteComment::response: '+response);
			Promo.hideIndicator();
			if(response.status) {
				$('#'+div_id).hide('slow', function () { Promo.showNotification('The item has been deleted.', 'Deleted!'); });
			} else {
				Promo.showNotification(response.result.error.message, 'Error!');
			}
		}, 'json');
	},	
	
	onModuleAttributeReorder : function(order) {
	
		$.post(Promo.moduleAttributeReorderUrl, order, function(response) {
			Promo.ajaxNotify(response, '');
			Promo.onUpdateCampaign();
		}, 'json'); 
	},
	
	onUpdateAttribute : function(response, uData) {
		Promo.log('onUpdateAttribute::status::'+response.status);
		
		if(response.status) {
			if(Promo.isEmpty(uData.module_id)) {
				uData.module_id = response.result.Module[0].id;
				var status_div_id =  uData.module_type_token;
				Promo.log(status_div_id);
				Promo.moduleNewCheckExist(uData.module_type_token,uData.module_id);
				Promo.moduleActivate(uData.module_id, status_div_id, true);

			}
			var displayUrl = Promo.attributeDisplayUrl+response.result.Attribute.id;
			Promo.log('onUpdateAttribute::displayUrl:: '+displayUrl);
			$.ajax({
				url:displayUrl, 
				type: 'POST',
				success:function (displayCode) {
					Promo.log('onUpdateAttribute::displayCode:: '+displayCode);
					var div_id = '#'+uData.preview_id;
					Promo.showNotification('Your data has been saved', 'Saved!');
					$(div_id).html(displayCode);
				},
				async: false
				
			});
			Promo.moduleNewShowStatus(uData.module_id, status_div_id);
		} else {
			Promo.showNotification(response.result.error.message, 'Error!');
		}
	},
	
	onUpdateAttributeList : function(response, uData) {
		Promo.log('status'+response.status);
		
		if(response.status) {
			if(Promo.isEmpty(uData.module_id)) {
				uData.module_id = response.result.Module[0].id;
				var status_div_id =  $('#module_'+uData.module_type_token+'_status').attr('id');
				Promo.moduleNewCheckExist(uData.module_type_token,uData.module_id);
				Promo.moduleActivate(uData.module_id, status_div_id, true);
				Promo.moduleNewShowStatus(uData.module_id, status_div_id);
			}
			var displayUrl = Promo.attributeEditUrl+uData.campaign_id+'/'+uData.module_id+'/'+'/'+uData.attribute_type_id+'/'+response.result.Attribute.id;
			
			Promo.log(displayUrl);
			
			$.post(displayUrl, '', 
				function (displayCode) {
					Promo.log(displayCode);
					var div_id = '#'+uData.preview_id;
					Promo.showNotification('Your data has been saved', 'Saved!');
					$(div_id).parent().parent().html(displayCode);
				});
			Promo.onUpdateCampaign();
		} else {
			Promo.showNotification(response.result.error.message, 'Error!');
		}
	},
	
	showAttributeMetadata : function(attribute_id, attribute_type_id, div_id) {
		var displayUrl = Promo.attributeMetadataEditUrl+attribute_id+'/'+attribute_type_id+'/0';
		Promo.showLoading(div_id, 'Loading..');
		Promo.log('displayUrl '+displayUrl);
		$.post(displayUrl, '', 
			function (displayCode) {
				Promo.log(div_id);
				Promo.log(displayCode);
				Promo.hideLoading();
				$('.loading_container').remove();
				Promo.generic_modal('#'+div_id, displayCode, '<input class="generic_modal_close" type="submit" value="Save" /></form>');
			
				Promo.log('edit_metadata_'+attribute_id);
			});
	},
	
	showAddAttributeMetadata : function(attribute_type_id, div_id, listing_div_id, module_id) {
		var displayUrl = Promo.attributeMetadataAddUrl+attribute_type_id+'/0/'+listing_div_id+'/'+module_id;
		Promo.showLoading(div_id, 'Loading..');
		Promo.log('displayUrl '+displayUrl);
		$.post(displayUrl, '', 
			function (displayCode) {

				Promo.hideLoading(div_id);
				Promo.generic_modal('#'+div_id, displayCode, '<input class="generic_modal_close" type="submit" value="Save" /></form>');
			});
	},
	
	showLoading : function(div_id, message) {
		Promo.loading_overlay('#'+div_id, message);
	},
	
	hideLoading : function(div_id) {
		if(div_id == undefined) div_id = '';
		$('.loading_container').remove();
	},
	
	//Generic loading window
	loading_overlay : function(current_location, message) {
		$(current_location).parents('.edit').append($(
			'<div class="loading_container">' +
				'<div class="loading_text">'+message+'</div>' +
			'</div>'
		).hide().fadeIn().css('display', 'block'));
	},
	
	generic_modal : function(current_location, html, submit) {
		if(submit == undefined) submit = '<a href="##" class="generic_modal_close"><span>Ok</span></a>'
		$(current_location).parents('.edit').append($(
			'<div class="overlay"></div>' +
			'<div class="generic_modal">' +
				'<div class="generic_modal_content">' +
				html  +
				'<div class="clear"></div></div>' +
				'<div class="modal_nav">'+submit+'</div>' +
			'</div>'
		).hide().fadeIn().css('display', 'block'));
		
		var top = (($('.generic_modal').height()) / 2) * -1;
		
		$('.generic_modal').css('margin-top', top);

		$('.generic_modal_close').live('click', function(){
			$('.overlay, .generic_modal').fadeOut().remove();
		});
	},
	
	error_overlay : function(current_location) {
		$(current_location).parents('.edit').append($(
			'<div class="overlay"></div>' +
			'<div class="error_modal">' +
				'<div class="error_modal_content">' +
					'error message here' +
				'<div class="clear"></div></div>' +
				'<div class="modal_nav"><a href="##" class="error_modal_close"><span>Close</span></a></div>' +
			'</div>'
		).hide().fadeIn().css('display', 'block'));
		
		var top = (($('.error_modal').height()) / 2) * -1;
		
		$('.error_modal').css('margin-top', top);
		
		$('.error_modal_close').click(function(){
			$('.overlay, .error_modal').fadeOut().remove();
		});
	},
	
	onUpdateAttributeMetadata : function(response, uData) {
		Promo.log('onUpdateAttributeMetadata');
		Promo.log('onUpdateAttributeMetadata::status::'+response.status);
		
		if(response.status) {
			Promo.updateAttributeDisplay(uData.attribute_id, uData.attribute_type_id, uData.attribute_display_div_id, function() { Promo.showNotification('Your data has been saved', 'Saved!'); });
			
			Promo.onUpdateCampaign();
			if($('#edit_metadata_'+uData.attribute_id).length)
				$('#edit_metadata_'+uData.attribute_id).slideUp();
		} else {
			Promo.showNotification(response.result.error.message, 'Error!');
		}
	},
	
	deleteAttribute : function(attribute_id, div_id, module_id, callbackFn) {
			Promo.showLoading(div_id, 'Deleting...');
			var url = Promo.attributeDeleteUrl+attribute_id;
			Promo.log(url);
			$.post(url, '', 
			function(response) { 
				Promo.log(response);
				Promo.hideLoading(div_id);
				if(response.status) {
					$('#'+div_id).slideUp('slow', function () { Promo.showNotification('The item has been deleted.', 'Deleted!'); $('#'+div_id).remove();} );
					
					Promo.moduleNewShowStatus(module_id, 'module_'+module_id+'_status');
					Promo.onUpdateCampaign(callbackFn);
				} else {
					Promo.showNotification(response.result.error.message, 'Error!');
				}
			}, 'json');
	},
	
	updateAttributeDisplay : function(attribute_id, attribute_type_id, div_id, callbackFn) {
		var displayUrl = Promo.attributeDisplayUrl+attribute_id;
		$.post(displayUrl, '', 
			function (displayCode) {
				$(div_id).html(displayCode);
				$(div_id).effect("highlight", {}, 3000);
				callbackFn();
			});
	},
	
	onUpdateCampaign : function(callbackFn) {
		if (callbackFn === undefined ) {
	      	callbackFn = function(response) { Promo.log('callback is empty'); };
	   	}
		$.post(Promo.updateCacheUrl, '', 
			function (response) { Promo.log(response); callbackFn(response); });
	},
	
	//for text attributes, uploaded for the first time 
	attributeMetadataUpload : function(formObj, uData) {
		//ajax post form data to url
		var updateUrl = Promo.attributeUpdateUrl+uData.campaign_id+'/'+uData.module_type_id+'/'+uData.attribute_type_id+'/'+uData.module_id+'/'+uData.attribute_id+'/'+uData.list;
		Promo.showLoading(formObj.id, 'Saving...');

		Promo.ajaxFormSubmit(formObj, updateUrl, 
			function(response) { 
				Promo.hideLoading(uData.id);
				uData.onComplete(response, uData); 
					Promo.attributes["attribute_"+uData.id].attribute_id = response.result.Attribute.id;
					Promo.log(response.result.Attribute.id);
				if(uData.attribute_id == 0) {
					uData.preview_id += uData.id;
					Promo.log(uData.preview_id);
					formObj.disabled = '';
					$('#attribute_'+uData.id).before('<div id="'+uData.preview_id+'">'+response.result.Attribute.metadata.value+'</div>');
					Promo.onUpdateCampaign();
				}
			});
	},
	
	attributeMetadataUploadJSON : function(metadata, uData) {
		var updateUrl = Promo.attributeUpdateUrl+'0'+'/'+uData.module_type_id+'/'+uData.attribute_type_id+'/'+uData.module_id+'/'+uData.attribute_id+'/'+uData.list;
		var params = {'metadata':metadata};
		$.post(updateUrl, params, function(response) { Promo.hideIndicator(); uData.onComplete(response, uData); }, 'json');
	},
	
	layoutEditMetadata : function(layout_id, metadata) {
		$.post(Promo.layoutEditMetadataUrl+layout_id, metadata, 
			function (data) { Promo.ajaxNotify(data, 'Saved!'); }, 'json');
	},
	
	moduleSetStatus : function(module_id, status, module_type_token) {
		var module_id_suffix = module_id;
		Promo.log(module_type_token);
		if(module_id == undefined || module_id == 0) module_id_suffix = '';
		var div_id = module_type_token;
		if(status) {
			Promo.moduleActivate(module_id, div_id, false, module_type_token);
		} else {
			Promo.moduleDeactivate(module_id, div_id);
		}
	},
	
	moduleActivate : function(module_id, module_type_token, auto_activate) {
		
		Promo.log('moduleActivate: '+module_id+' '+module_type_token+' '+auto_activate);
		Promo.log(Promo.moduleActivateUrl+Promo.campaign_id+'/'+module_id);
		$.post(Promo.moduleActivateUrl+Promo.campaign_id+'/'+module_id, null, 
			function (data) { 
				Promo.log(data);
				if(!auto_activate){
					Promo.ajaxNotify(data, 'The module has been turned on and is now visible on your fan page.');
				}
				if(data.status) {
					Promo.moduleShowStatus(module_id, module_type_token);
				}
			}, 'json');
	},
	
	moduleDeactivate : function(module_id, div_id) {
		Promo.log(Promo.moduleDeactivateUrl+Promo.campaign_id+'/'+module_id);
		$.post(Promo.moduleDeactivateUrl+Promo.campaign_id+'/'+module_id, null, 
			function (data) { 	
				Promo.ajaxNotify(data, 'Deactivated.');
				if(data.status) {
					Promo.moduleShowStatus(module_id, div_id);
				}
			}, 'json');
	},
	
	moduleReposition : function(order) {
		$.post(Promo.moduleRepositionUrl+Promo.campaign_id, order, 
			function (data) { Promo.log(data); Promo.ajaxNotify(data, 'Saved!'); }, 'json');
	},
	
	moduleShowStatus : function(module_id, module_type_token) {
	},
	
	moduleNewOnOff:function(mod_id){
		$(document).ready(function() {
			$.ajax({
				url: Promo.moduleStatusUrl+Promo.campaign_id+'/'+mod_id,
				type: 'POST',
				success: function(result){
					status = result.status;
					if(status == 1){
						alert ('on');

					} else {
						alert ('off');
					}
				},
				dataType:'json',
				async:false
			});
		  });
	},
	
	moduleNewCheckExist:function(module_token,new_module_id) {
		Promo.log('ModuleNewCheckExist : '+new_module_id+' '+module_token);
		if(new_module_id != null && new_module_id !=0)
		{
			if($("#"+module_token+ " .switch").hasClass('.not_created')) {
				$("#"+module_token+ " .switch").attr('id',new_module_id);
				$("#"+module_token+ " .switch").removeClass('not_created');
				$("#"+module_token+ " .switch").addClass('created');
				$("#"+module_token+ " .switch .cb").removeAttr('disabled');
				$("#"+module_token+ " .switch").change();
			}	
		}
	},
	
	moduleNewShowStatus : function(module_id, div_id, module) {

		if( module_id != null && module_id != 0)
		{
			$.ajax({
				url: Promo.moduleStatusUrl+Promo.campaign_id+'/'+module_id,
				type: 'POST',
				success: function(result){
					status = result.status;
					$("#"+module_id+" .cb").attr('disabled',false);
					if(status == 1)
					{
			     		$("#"+module_id+" .cb").attr('checked',true);
						$('#'+module_id+' .cb').change();

					}
					else
					{
						$("#"+module_id+" .cb").attr('checked',false);
						$("#"+module_id+" .cb").change();
					}
				},
				dataType:'json',
				async:false
			});
			
		}
		
		else
		{
     		$('.not_created .cb').attr('checked',false);
			$('.not_created .cb').attr('disabled', 'disabled');
			$('.not_created .cb').unbind('click');
			$('.not_created  .cb').change();
		}
	},
	
	moduleNewActivate : function(module_id, div_id,module) {
		Promo.log(Promo.moduleActivateUrl+Promo.campaign_id+'/'+module_id);
		$.post(Promo.moduleActivateUrl+Promo.campaign_id+'/'+module_id, null, 
			function (data) { 
					Promo.ajaxNotify(data, 'The module is turned ON.  It can now be viewed by your fans on your page.');
					Promo.moduleNewShowStatus(module_id, div_id,module);
				
			}, 'json');
	},
	
	
	moduleNewDeactivate : function(module_id, div_id,module) {
		Promo.log(Promo.moduleDeactivateUrl+Promo.campaign_id+'/'+module_id);
		$.post(Promo.moduleDeactivateUrl+Promo.campaign_id+'/'+module_id, null, 
			function (data) { 	
				Promo.ajaxNotify(data, 'The module is turned OFF.  It can not be seen by visitors to your page.');
				if(data.status) {
					Promo.moduleNewShowStatus(module_id, div_id,module);
				}
			}, 'json');
	},
	
	//for metadata of attributes
	attributeMetadataUpdate : function(formObj, uData) {
		//ajax post form data to url
		var updateUrl = uData.updateUrl;
		Promo.log(updateUrl);
		Promo.showLoading(uData.preview_id, 'Saving...');
		Promo.ajaxFormSubmit(formObj, updateUrl, function(response) { Promo.hideLoading(uData.preview_id); uData.onComplete(response, uData); });
	},
	
	addUploadButton : function(uData){
		Promo.uploadButtons["attributes_"+uData.button_id] = uData;
		var button_id = uData.button_id;
		var preview_id = uData.preview_id;
		var campaign_id = uData.campaign_id;
		var module_type_id = uData.module_type_id;
		var attribute_type_id = uData.attribute_type_id;
		var module_id = uData.module_id;
		var completeFn = uData.onComplete;
		
		Promo.log('addUploadButton: uploadDetailsUrl '+uData.button_id);
		var	button = $('#'+button_id);

		button.list_id = preview_id;
		if(module_type_id == '') module_type_id = 0;
		var uploadDetailsUrl = uData.uploadDetailsUrl+'/'+campaign_id+'/'+module_type_id+'/'+attribute_type_id+'/'+module_id+'/'+uData.attribute_id;

		Promo.log('addUploadButton: uploadDetailsUrl '+uploadDetailsUrl);
		try {
		$.post(uploadDetailsUrl, '', 
			function (data) { 
				Promo.log(data.action); 
				
				Promo.updateCapacityDisplay(uData.id, data.capacity);
			
				if(data.capacity.capacity > 0 || uData.overwrite) {
				
				new AjaxUpload(button, {
					action: data.action, 
					name: 'file',
		            hoverClass: 'upload_hover',
					onSubmit : function(file, ext){
						Promo.log(ext);
						if(data.requirements.allowedExtensions.length >= 1) {
							if($.inArray(ext, data.requirements.allowedExtensions) == -1) {
								alert('File must be of the following type: '+data.requirements.allowedExtensions.join(', '));
								return false;
							}
						}
						Promo.showLoading(uData.preview_id, 'Uploading...');

						this.setData(data.upload_details);
						// If you want to allow uploading only 1 file at time,
						// you can disable upload button
						this.disable();

						},
					onComplete: function(file, response){
						Promo.hideLoading(uData.preview_id);
						Promo.log('['+response+']');
						try {
							var response = JSON.parse(response);
								Promo.log(response.status);
								Promo.log(button.list_id);
								uData.onComplete(response, uData);
						} catch(e) {
							Promo.log(e);
						}
					
						
						Promo.addUploadButton(uData);
						this.enable();					
					},
					onUploadError: function(file, errorMsg) {
						Promo.hideLoading(uData.previewId);
						alert(errorMsg+'. Please make sure your file is not larger than '+(data.requirements.maxFileSize / 1048576)+' megabytes.');
						Promo.addUploadButton(uData);
						this.enable();
					}
				}); 
				} else {
					uData.onNoCapacity(button_id);
				}
			}, 
			'json');
		} catch(err) {
			alert(err);
		}

	},
	
	//Authorize 3rd party partners.  Some require no auth, like the first one.
	authorize : function (campaign_id, partner_token, formObj, callbackFn) {
		//put logic to auth partner here.  pref an ajax call.  maybe oauth triggered by backend via partner_token.
		callbackFn(formObj);
		$('#partner_auth_'+partner_token).toggle();
	},
	
	updateCapacity : function(capacityId) {
		Promo.log('updateCapacity :'.capacityId);
		
		var moduleCapacityUrl = Promo.moduleCapacityUrl+Promo.module_capacity[capacityId].module_id+'/'+Promo.module_capacity[capacityId].attribute_type_id;
		Promo.log(moduleCapacityUrl);
		$.post(moduleCapacityUrl, '', 
			function (data) { Promo.log(data.result.capacity); Promo.updateCapacityDisplay(capacityId, data.result); }, 'json');
	},
	
	updateCapacityDisplay : function(capacityId, capacity) {
		Promo.log('updateCapacityDisplay: '+capacityId);
		$('#'+capacityId+'capacity').html(capacity.min+' required. '+capacity.max+' maximum. <span class="remaining">'+capacity.capacity+'</span> remaining.');
	},
	
	onNoCapacity : function(uploadButtonId) {
		$('#'+uploadButtonId).click(function() {
			alert('You have reached your capacity for that module.  You must delete items before adding more.');
		});
	},

	onUploadComplete : function(response, uData) {
		Promo.showLoading(uData.module_type_token, 'Saving...');
		Promo.log('onUploadComplete: status'+response.status);
		if(response.status) {
			if((Promo.isEmpty(uData.module_id)) || (uData.module_id == 0)) {
				uData.module_id = response.result.Module[0].id;
				var status_div_id =  uData.module_type_token;
				Promo.log(status_div_id);
				Promo.moduleNewCheckExist(uData.module_type_token, uData.module_id);
				Promo.moduleActivate(uData.module_id, status_div_id, true);
			}
			var displayUrl = Promo.attributeEditUrl+uData.campaign_id+'/'+uData.module_id+'/'+uData.attribute_type_id+'/'+response.result.Attribute.id+'/'+uData.id;
			Promo.log(displayUrl);
				$.ajax({
					url:displayUrl, 
					type:'POST',
					success:function (displayCode) {
						Promo.log(displayCode);
						var div_id = '#'+uData.preview_id;
						Promo.log(div_id);
						Promo.hideLoading(uData.module_type_token)
						Promo.showNotification('Your file has been uploaded', 'Saved!');

						$(div_id).slideUp(1000,
							function() {
								$(div_id).html(displayCode);
								Promo.log('sortable: '+uData.sortable);
								if(uData.sortable) {
									Promo.log('sortable id: '+$(div_id).attr('id'));
									$(div_id).sortable({
						      			handle : '.handle',
						      			update : function () {
								  			var order = $(div_id).sortable('serialize');
											Promo.log('sortable order: '+order);
											Promo.onModuleAttributeReorder(order);
						      			}
						    		});
								}
								$(div_id).slideDown(1000);
							}
						);
						Promo.log("attributes_"+uData.button_id);
						if(uData.overwrite) {
							Promo.uploadButtons["attributes_"+uData.button_id].attribute_id = response.result.Attribute.id;
							Promo.log('new attribute id :'+Promo.uploadButtons["attributes_"+uData.button_id].attribute_id);
						}
						Promo.uploadButtons["attributes_"+uData.button_id].module_id = uData.module_id;
						Promo.addUploadButton(Promo.uploadButtons["attributes_"+uData.button_id]);
					
					},
					async: false
			});
			Promo.onUpdateCampaign();
			Promo.moduleNewShowStatus(uData.module_id, status_div_id);
		} else {
			Promo.showNotification('Oops... something went wrong: '+response.result.error.message, 'Error!');
		}
		Promo.moduleNewShowStatus(uData.module_id, status_div_id);
	},
	
	onAddComplete : function(response, uData) {
		Promo.showLoading(uData.preview_id, 'Saving...');
		Promo.log('onUploadComplete: status'+response.status);
		if(response.status) {
			if((Promo.isEmpty(uData.module_id)) || (uData.module_id == 0) ) {
				uData.module_id = response.result.Module[0].id;
				var status_div_id =  uData.module_type_token;
				Promo.log(status_div_id);
				Promo.moduleNewCheckExist(uData.module_type_token,uData.module_id);
				Promo.moduleActivate(uData.module_id, status_div_id, true);
			}
			var displayUrl = Promo.attributeEditUrl+uData.campaign_id+'/'+uData.module_id+'/'+uData.attribute_type_id+'/'+response.result.Attribute.id+'/'+uData.id;
			Promo.log(displayUrl);
			$.ajax({
				url: displayUrl,
				type: 'POST',
				success:
					function (displayCode) {
						Promo.log(displayCode);
						var div_id = '#'+uData.preview_id;
						Promo.log(div_id);
						Promo.hideLoading(uData.preview_id);
						Promo.showNotification('Your file has been uploaded', 'Saved!');	
						$(div_id).slideUp(1000,
							function() {
								$(div_id).html(displayCode);
								Promo.log('sortable: '+uData.sortable);
								if(uData.sortable) {
									Promo.log('sortable id: '+$(div_id).attr('id'));
									$(div_id).sortable({
						      			handle : '.handle',
						      			update : function () {
								  			var order = $(div_id).sortable('serialize');
											Promo.log('sortable order: '+order);
											Promo.onModuleAttributeReorder(order);
						      			}
						    		});
								}
								try {
								} catch(e) {
								}
								$(div_id).slideDown(1000);
								if($('#form_'+uData.preview_id).length)
									$('#form_'+uData.preview_id).slideUp();
							}
						);				
					},
				async:false
					
			});
			Promo.onUpdateCampaign();
			Promo.moduleNewShowStatus(uData.module_id, status_div_id);
		} else {
			Promo.showNotification('Oops... something went wrong: '+response.result.error.message, 'Error!');
		}
	},

	
	onUploadCompleteList : function(response, uData) {
		Promo.showLoading(uData.preview_id, 'Saving...');
		Promo.log('status'+response.status);
		if(response.status) {
			var displayUrl =  Promo.attributeEditUrl+uData.campaign_id+'/'+uData.module_id+'/'+uData.attribute_type_id+'/'+response.result.Attribute.id;
			if(Promo.isEmpty(uData.module_id)) {
				uData.module_id = response.result.Module[0].id;
				var status_div_id =  $('#module_'+uData.module_type_token+'_status').attr('id');
				Promo.moduleNewCheckExist(uData.module_type_token,uData.module_id);
				Promo.moduleActivate(uData.module_id, status_div_id, true);
				Promo.moduleNewShowStatus(uData.module_id, status_div_id);
			}
			Promo.log(displayUrl);
			$.post(displayUrl, '', 
				function (displayCode) {

					var content = '<div id="attribute_'+response.result.Attribute.id+'" class="content_row hidden altrow"><div class="content">'+displayCode+'</div><div class="content_actions">edit / delete</div><div class="clear"></div></div>';
					var div_id = '#'+uData.preview_id;
					Promo.log(div_id);
					Promo.log(content);
					$(div_id).append(content);
					Promo.log('#attribute_'+response.result.Attribute.id);
					$('#attribute_'+response.result.Attribute.id).slideDown();
					Promo.showLoading(uData.preview_id);
					Promo.showNotification('Your file has been uploaded', 'Saved!');
				});
			Promo.onUpdateCampaign();
		}
		else {
			Promo.showNotification('Oops... something went wrong: '+response.result.error.message, 'Error!');
		}
	},
	
	datasource : function(service, method, params, callBackFn) {
		var params = {'service':service, 'method':method, 'params':params};
		Promo.log(params);
		Promo.log(Promo.apiUrl+'datasource/');
		$.post(Promo.apiUrl+'datasource/', params, function(response) { callBackFn(response); Promo.hideIndicator(); }, 'json');
	},
	
	ajaxNotify : function(response, successMessage) {
		if(response.status) {
			if(successMessage == '') successMessage = 'Your change has been saved';
			Promo.showNotification(successMessage, 'Success!'); 
		}
		else { 
			var errorMessage = response.result.error.message;
			if(Promo.isEmpty(errorMessage)) errorMessage = 'An unknown error has occurred. Please try again. Contact support@damntheradio.com for assistance.';
			Promo.showNotification(errorMessage, 'Error!'); 
		}
	},
	
	isEmpty : function(obj) {
		return (obj == '' || obj == null || obj == undefined);
	},
	
	showNotification : function(message, headline) {

		$('#notification_flash').html('<div id="message" style="margin-left:400px;position:absolute;top:0;padding:4px 8px;border:1px solid #F0C36D;background-color: #F9EDBE;font-weight:bold;">'+headline+': '+message+'</div>');
		setTimeout(function() {$('#notification_flash #message').fadeOut('slow')}, 3000);
	}, 
	
	showError : function(message, headline) {
		var unique_id = $.gritter.add({
			// (string | mandatory) the heading of the notification
			title: headline,
			// (string | mandatory) the text inside the notification
			text: message,
			// (bool | optional) if you want it to fade out on its own or just sit there
			sticky: true 
		});
	},
	
	dummyFn : function() {	
		// trailing commas break ie7
		return true;
	}
};

var PromoUser = {
	authRequired : false,
	authType : null,
	loginNext : null, //'',
	logoutNext : null, //'/dashboard/connect/graph',
	facebook : {},
	loginButtonId : null,
	logoutButtonId : null,
	
	init : function() {
		Promo.log('PromoUser.init');
		//if !authorize, try to login
		if(PromoUser.authType == 'facebook') {
			Promo.log(PromoUser.authType);
			if(PromoUser.authRequired) {
			//if login and next is set, go to next.  otherwise, do nothing.
				//if permissions required, do login
				if(PromoUser.facebook.permissions != '') {
					//include permissions handling
					var options = {};
					options.scope = PromoUser.facebook.permissions;
					FB.login(PromoUser.facebookPermissionsResponse, options);
				}
				//else just check status
			}
			else {
				Promo.log(PromoUser.authRequired);
				//else just check status
				PromoUser.setLoginButton(PromoUser.loginButtonId);
				PromoUser.setLogoutButton(PromoUser.logoutButtonId);
			}
		}
	},
	
	//dtr checks user status--performs perms checks if log in is necessary, sets up buttons if not.
	facebookStatusResponse : function(response) {
		Promo.log('status response');
		Promo.log(response);
		Promo.log(PromoUser.logoutNext);
		if (response.authResponse) {
			Promo.log('Session');
			PromoUser.setLogoutButton(PromoUser.logoutButtonId);
		}
		else {
			Promo.log('no session');
			//not logged in. if auth required, redirect to logoutNext
			if(PromoUser.authRequired) Promo.redirect(PromoUser.logoutNext);
			PromoUser.setLoginButton(PromoUser.loginButtonId);
		}
	},
	
	//user actively logs in (check for next url, check for required perms)
	facebookLoginResponse : function(response) {
		return PromoUser.facebookPermissionsResponse(response);
	},
	
	facebookLogoutResponse : function(response) {
		if(PromoUser.logoutNext != null) {
			Promo.redirect(PromoUser.logoutNext);
		}
	},
	
	facebookPermissionsResponse : function(response) {
		
		if (response.authResponse) {
			if(PromoUser.loginNext != null && PromoUser.loginNext != '') {
				Promo.redirect(PromoUser.loginNext);
			} else {
				Promo.redirect('/dashboard/?src=hp_err');
			}
		}
		else {
			Promo.log(response);
			Promo.log(PromoUser.facebook.permissions);
			alert('All permissions need to be granted in order to proceed.');
		}			
		
		return true;
	},
	
	setLoginButton : function(buttonId) {
		Promo.log(buttonId);
		if(buttonId != null) {
			$('#'+buttonId).bind('click', function() {
				var options = {};
				options.scope = PromoUser.facebook.permissions;
				Promo.log(options.scope);
				FB.login(PromoUser.facebookLoginResponse,options);


	   		});
		}
	},
	
	setLogoutButton : function(buttonId) {
		if(buttonId != null) {
			$('#'+buttonId).bind('click', function() {
				FB.logout(PromoUser.facebookLogoutResponse);
      		});
		}
	},
	
	
	dummyFn : function() {
		// trailing commas break ie7
		return true;
	}
	

};
