

/***
 * Permissions object for handling spellchecking of document
 */
var Permissions = {

	// current namespace
	namespace : '',
	// global account Id
	userId : '',
	// current membershipType
	membershipType : '',
	// pricing model ["freemium", "school_sponsored"]
	pricingModel : '',
	freemiumPackage : '',
	// indicates if user bought school package access ('1' for true)
	hasSchoolPackage : false,
	schoolPackageLabels : [],
	schoolPackageIds : [],
	schoolPackageNames : [],
	affiliateModulePrice : '',
	affiliateSchoolPackagePrice : '',

	// jsCall if any
	jsCall : null,
	lastMembershipCheck : null,
	modulesPurchased : [],



	// events 
	beforeUpgradeForm : function() {  },
	afterUpgradeForm : function() {  },

	// indicates if the upgrade options dialog was created
	upgradeOptionsDialogCreated : false,

	// name of current order
	orderItem : null,
	// price of current order
	orderPriceTotal : null,
	accountId : null,
	module : null,
	documentId : null,

	// Last JS operation that was executed to generate upgrade/access form (string, needs to be evaluated)
	lastJsOperation : null,

	items : [
		/*
			{ orderItem : 'examples', price : '3.99', description : '24 Hour Access to Examples and Action Verbs'},
			{ orderItem : 'samples', price : '5.99', description : '24 Hour Access to Samples'},
			{ orderItem : 'onet', price : '3.99', description : '24 Hour access to the Onet database'},
			{ orderItem : 'save_as_zip', price : '5.99', description : 'Download ZIP'},
			{ orderItem : 'download_pdf', price : '2.99', description : 'Download'},
			{ orderItem : 'download_rtf', price : '2.99', description : 'Download'},
			{ orderItem : 'download_txt', price : '2.99', description : 'Download'},
			{ orderItem : 'plus', price : '49.00', description : 'Plus account'},
			{ orderItem : 'premium', price : '89.00', description : 'Premium account'},
			{ orderItem : 'comprehensive', price : '149.00', description : 'Comprehensive account'}
		*/
	],

	// list of permissions that given user purchased
	// { permission: { } , module: { } , documentId: {} }
	permissions : [
		
	],

	// list of missing modules
	modulesMissing : [],

	isStudent : function()
	{
		return Permissions.membershipType == "sponsored";
	},

	isAdmin : function()
	{
		// TODO: Update this to correctly handle admin case, right now we simply assume that if content
		// is generated and user is not logged in - its admin accessing page via specially prepared link
		return Permissions.membershipType == "";
	},

	// determines if user is freemium user
	isFreemiumUser : function()
	{
		return Permissions.membershipType == "affiliate" && Permissions.pricingModel == "freemium";
	},

	isAffiliateUser : function()
	{
		return Permissions.membershipType == "affiliate" && Permissions.pricingModel == "school_sponsored";
	},

	// checks if user has general affiliate permission
	hasAffiliatePermission : function(permission)
	{
		var isGeneralAccess = (permission == "onet");
		return (isGeneralAccess && Permissions.hasSchoolPackage);
	},



	// checks if user has membership access -> returns true or false
	checkMembershipAccess : function(membershipRequired, permission, module, call, parameters)
	{
		return true;
		Permissions.lastMembershipCheck = function() {Permissions.checkMembership(membershipRequired, permission, module, call, parameters)};

		if (parameters == null)
			parameters = {accountId: "", module: "", documentId : ""};

		parameters.module = module;

		//var isFreemiumUser = Permissions.membershipType == "free" || Permissions.membershipType == "plus" || Permissions.membershipType == "premium" || Permissions.membershipType == "comprehensive";
		var freemiumUserCanAccess = Permissions.isFreemiumUser() && (Permissions.isMembershipSufficient(membershipRequired) || Permissions.hasPermission(permission, parameters));

		var affiliateUserCanAccess = Permissions.isAffiliateUser() && (Permissions.hasAccessToModule(module) || Permissions.hasPermission(permission, parameters) || Permissions.hasAffiliatePermission());


		// samples shall be free
		return freemiumUserCanAccess ||  affiliateUserCanAccess || Permissions.isStudent() || Permissions.isAdmin() || permission == "samples";
	},

	// checks if given membership is sufficient
	// if yes - consecutive js is called
	// if not - we show upgrade form, after which we call js
	checkMembership : function(membershipRequired, permission, module, call, parameters)
	{
				Permissions.lastMembershipCheck = function() {Permissions.checkMembership(membershipRequired, permission, module, call, parameters)};
				
		if (parameters == null)
			parameters = {accountId: "", module: "", documentId : ""};

		parameters.module = module;

		if (Permissions.checkMembershipAccess(membershipRequired, permission, module, call, parameters))
		{
			if (call != null)
				call();
		}
		else
		{
			
			Permissions.jsCall = call;
			// show upgrade form
			Permissions.showUpgradeModalWindow(membershipRequired, permission, parameters);
		}
	},
	// determines if user has access to given module
	hasAccessToModule : function(module)
	{
		for (var i=0; i < Permissions.modulesMissing.length; i++)
		{
			if (module == Permissions.modulesMissing[i])
				return false;
		}
		return true;
	},
	// Indicates if user has permission to perform given action
	hasPermission : function(permission, parameters)
	{
		if (parameters == null)
			parameters = {accountId: "", documentId : "", module: ""};
		
		for (var i=0; i < Permissions.permissions.length; i++)
		{
			var currentPermission = Permissions.permissions[i];
			if (currentPermission.permission == permission)
			{
				if (currentPermission.module == parameters.module && currentPermission.documentId == parameters.documentId)
					return true;
			}
		}
		return false;
	},

	// indicates if current membership is sufficient
	isMembershipSufficient : function(membershipRequired)
	{
		switch (Permissions.freemiumPackage)
		{
			case "free":
				{
					if (membershipRequired == "plus"||membershipRequired == "premium"||membershipRequired == "comprehensive")
						return false;
						break;
				}
				case "plus":
				{
					if (membershipRequired == "premium"||membershipRequired == "comprehensive")
						return false;
						break;
				}
				case "premium":
				{
					if (membershipRequired == "comprehensive")
						return false;
						break;
				}
		}
		return true;
	},
	showUpgradeModalWindow : function(membershipRequired, permission, parameters)
	{
		if (parameters == null)
			parameters = {accountId: "", module : "",documentId: ""};

		try { Permissions.saveUserAction("Shown Upgrade Form", {parameters: parameters, membershipRequired : membershipRequired, permission : permission}); } catch(e){};

		var width = 955;
		var height = "auto";

		// If this is afiiliate, change width and height
		if (Permissions.pricingModel == "school_sponsored")
		{
			width = 1000;
			height = "auto";
		}

		if (!Permissions.upgradeOptionsDialogCreated)
		{
			$("#divPermissionsUpgradeForm").dialog
			(
				{
					autoShow: false,
					modal : true,
					width: width,
					height:height,
					resizable:false,
					minHeight:600,
					title: '<h3 class="or20_TopModalTitle or20_modalTopIcon" unselectable="on" style="-moz-user-select: none;">Upgrade Your Account</h3>',
					open: function() { Permissions.beforeUpgradeForm(); },
					close: function() {

						try { Permissions.saveUserAction("Closed Upgrade Form", {parameters: parameters}); } catch(e){};

						Permissions.afterUpgradeForm();
					}
				}
			);
			//Permissions.makeDialogTransparent("#divPermissionsUpgradeForm", 978);
			Permissions.upgradeOptionsDialogCreated	= true;
		}

		$("#divPermissionsUpgradeFormLoading").show();
		$("#divPermissionsUpgradeFormContent").hide();
		

		
		$("#divPermissionsUpgradeForm").dialog('open');

		$.ajax(
			{
				async: false,
				cache: false,
				url: 'modules/permissions/upgrade.php',
				data:
				{
					membershipRequired : membershipRequired,
					permission: permission,
					accountId : parameters.accountId,
					module : parameters.module,
					documentId : parameters.documentId
				},
				success:function(data, textStatus)
				{				
					$("#divPermissionsUpgradeFormContent").show();
					$("#divPermissionsUpgradeFormLoading").hide();
					$("#divPermissionsUpgradeFormContent").html(data);

				}
			}
		);

		$("#divPermissionsUpgradeForm").dialog('open');
	},
	


	// shows the order form for 24 Hour access
	order24HourAccess: function(permissionName,  accountId, module, documentId)
	{
		Permissions.showOrderDialog(permissionName,  accountId, module, documentId);
	},


	showAffiliateOrderDialog : function()
	{
		var modulesId = [];
		var modulesLabels = [];
		var modulesNames = [];

		$(".upgradeAffiliate:checked").each(function(i)
		{
			modulesId.push($(this).val());
			modulesLabels.push($(this).attr('label'));
			modulesNames.push($(this).attr('moduleName'));
		})

		var totalPrice = Permissions.affiliateModulePrice * modulesId.length;
		if (!Permissions.hasSchoolPackage)
		{
			totalPrice += Permissions.affiliateSchoolPackagePrice * 1;
			modulesLabels.push("School Package(" + Permissions.schoolPackageLabels + ")");
			modulesId = modulesId.concat(Permissions.schoolPackageIds);
			modulesNames = modulesNames.concat(Permissions.schoolPackageNames);
		}

		Permissions.modulesPurchased = modulesNames;

		if (modulesId.length == 0)
		{
			alert("Please select at least one module");
			return;
		}
		
		if (!Permissions.orderDialogInitialized)
			Permissions.initOrderDialog();
	
		
		//Permissions.makeDialogTransparent("#divPermissionsOrderForm", 877);
		
		//load the order form into the dialog
		$.post(
				'modules/permissions/order_form.php',
			 	  {    
			 	   async: false
			 	  }, 
			     function(msg) { 
			 		 $("#divPermissionsOrderForm").html(msg);
			 		var price = totalPrice;
					var label = (modulesId.length > 1) ? "Access to modules" : "Access to module";
					$("#orderDescription").html(label + ": " + modulesLabels.join(","));
					$("#orderPrice").html("$" + price + '.00');
					$("#orderPriceSummary").html("$" + price + '.00');
					
					//ser order amount as a hidden field. I need this for the paypal form
					$("#orderAmountId").val(price);
					
					Permissions.orderItem = "module";
					Permissions.orderPriceTotal = price;
					//Permissions.accountId = accountId;
					Permissions.module = modulesId.join(",");
					//Permissions.documentId = documentId;
			 		
			 }); 
	},
	setOrderPrice : function(price)
	{
		$('#orderPriceSummary').html('$' + price);
		$("#orderAmountId").val(price);
	},
	/// Shows Order Form
	showOrderDialog : function(orderItem,  accountId, module, documentId)
	{

		try { Permissions.saveUserAction("Shown Order Dialog", {accountId: accountId, module : module, documentId : documentId}); } catch(e){};

		if (!Permissions.orderDialogInitialized)
			Permissions.initOrderDialog();


		
		var item = Permissions.getItem(orderItem);
		//uncomment
		/*
		if (item == null)
		{
			alert("This item is not available for purchase. Please contact OptimalResume.com administrator");
			return;
		}
		*/

		
		//Permissions.makeDialogTransparent("#divPermissionsOrderForm", 877);
		
		//load the order form into the dialog
		$.post(
				'modules/permissions/order_form.php',
			 	  {    
			 	   async: false
			 	  }, 
			     function(msg) { 


					 
					$("#divPermissionsOrderForm").html(msg);
			 		 
//			 		$("#orderDescription").html(item.description);
	//				$("#orderPrice").html("$" + item.price);
//					$("#orderPriceSummary").html("$" + item.price);
					
					//ser order amount as a hidden field. I need this for the paypal form
	//				$("#orderAmountId").val(item.price);

//					Permissions.orderItem = orderItem;
//					Permissions.orderPriceTotal = item.price;
//					Permissions.accountId = accountId;
//					Permissions.module = module;
//					Permissions.documentId = documentId;
			 		
			 }); 
	},

	orderDialogInitialized : false,
	// Initializes Order Dialog Form
	initOrderDialog : function()
	{
		$("body").append('<div id="divPermissionsOrderForm" style="width:848px;  padding:10px"></div>');
		var topDialogTitle = '<h3 class="or20_TopModalTitle or20_modalTopIcon" unselectable="on" style="-moz-user-select: none;">Secure Payment Form</h3>';
		
		$("#divPermissionsOrderForm").html("Loading...");
		
		$("#divPermissionsOrderForm").dialog(
 				{
 					//autoOpen:false,
 					width:910,
 					height:790,
 					close: function() {
						try { Permissions.saveUserAction("Closed Order Dialog", {}); } catch(e){};
						$("#divPermissionsOrderForm").remove();
					},
 					modal:true,
					resizable : false,
 					title: topDialogTitle
 				}
 			);

		//$(".ui-dialog-titlebar-close").hide();
	},

	makeDialogTransparent : function(element, closeLeft)
	{
		$(element).parent().css("background-color", "transparent");

		$(element).parent().css("background-image", "none");
		$(element).parent().css("border", "none");

		var child = $($(element).parent().children("div").get(0));

		child.css('background-image', 'url(/modules/videoconference/transGif.gif)');
		child.css('background-color', 'transparent');
		child.css('position', 'absolute');
		child.css('left', '0px');
		child.css('width', closeLeft + 'px');
		child.css('height', '13px');

	},
	// Gets the item configuration for given item
	getItem: function(orderItem)
	{
		for (var i=0; i < Permissions.items.length; i++)
		{
			if (Permissions.items[i].orderItem == orderItem)
				{
					return Permissions.items[i];
				}
		}
		return null;
	},


	// sends given order
	sendOrder : function()
	{
		var item = $("#orderItem").val();

		if (item == "")
		{
			item = "365";
		}

		var get_str = $("form#upgradeMembershipForm").serialize();
		/*
		var post_fields = $(":input").serializeArray();
		$.each(post_fields, function(i, field){
		       field.name=field.value;
		      });
		*/      
		      
		//replace upgrade button
		$("#upgradeButtonId").html('<a class="or20_BigButton" href="javascript:void(0);">Submiting Order. Please wait..</a>');

		try { Permissions.saveUserAction("Send Order", { item: Permissions.orderItem, price: Permissions.orderPriceTotal,documentId : Permissions.documentId,documentType : Permissions.module,accountId : Permissions.accountId}); } catch(e){};

		
		$.ajax(
			{
				async: false,
				cache: false,
				url: 'modules/permissions/order.php',
				data:
				{
					get_str:get_str,
					//item: Permissions.orderItem,
					item : $('input[name=membershipExtension]:checked').val(),
					price: Permissions.orderPriceTotal,
					documentId : Permissions.documentId,
					documentType : Permissions.module,
					accountId : Permissions.accountId
					
			      
				},
				success:function(data, textStatus)
				{
					if (data.substr(0,7)=="error__") //paypal returns an error
					{
						var errorReturnMessage = data.substr(7);
						$("#upgradeButtonId").html('<a class="or20_BigButton" onclick="Permissions.sendOrder()">Upgrade</a>');
						$("#error_order_top").show();
						$("#error_order_bottom").show();
						$("#error_order_top").html(errorReturnMessage);
						$("#error_order_bottom").html(errorReturnMessage);
					}
					else
					{
						$("#divPermissionsOrderForm").dialog('close');
						Permissions.orderSuccessful(Permissions.orderItem, data);
					}
				}
			}
		);
	},



	// occurs when the order finished successfully
	orderSuccessful : function(orderItem, additionalData)
	{
		alert("Thanks! Your payment was successfully processed.");
		document.location = "/modules/documentcenter.php";
		return;
	
		switch (orderItem)
		{
			case "plus":
			case "premium":
			case "comprehensive":
			{
				Permissions.freemiumPackage = orderItem;
				$("#divPermissionsUpgradeForm").dialog('close');

				if (Permissions.lastMembershipCheck != null)
				{
					Permissions.lastMembershipCheck();
				}
				if (Permissions.jsCall != null)
				{
					try
					{
						Permissions.jsCall();
					}
					catch (exception) {}
				}
				break;
			}
			case "module":
			{
				if (orderItem == "module")
				{
					// modules purchased, remove them from missingModules list
					for (var i=0; i < Permissions.modulesPurchased.length; i++)
						Permissions.modulesMissing.remove(Permissions.modulesPurchased[i]);
				}

				$("#divPermissionsUpgradeForm").dialog('close');

				if (Permissions.jsCall != null)
				{
					try
					{
						Permissions.jsCall();
					}
					catch (exception) {}
				}
				if (Permissions.lastMembershipCheck != null)
				{
					Permissions.lastMembershipCheck();
				}

				break;
			}
		}
		
		switch (orderItem)
		{
			case "examples" :
			case "onet" :
			case "samples" :
			case "save_as_zip" :
			case "download_pdf":
			case "download_rtf":
			case "download_txt":
			case "module":
			{

				$("#divPermissionsUpgradeForm").dialog('close');
				if (Permissions.jsCall != null)
				{
					try
					{
						Permissions.jsCall();
					}
					catch (exception) {}
				}
				break;
			}
		}

	},
	internalSaveUserActionCounter : 0,
	// Saves current user action
	// execute only for 'my'
	saveUserAction : function(action, parameters)
	{
		if (Permissions.namespace != "my")
			return;


		Permissions.internalSaveUserActionCounter++;

		var page = document.location.href;
		
		$.ajax(
			{
				async : true,
				url : "/modules/permissions/saveUserAction.php",
				data :
					{
						userId : Permissions.userId,
						action : action,
						page : page,
						parameters : JSON.stringify(parameters),
						orderView : Permissions.internalSaveUserActionCounter
					}
			}
		);

	}
}



	
Array.prototype.remove = function(s){
	for(var i=0;i<this.length; i++)
	{
		if(s==this[i])
			this.splice(i, 1);
	}
}