It seems #2 is the main issue for you here: how to drill up and separate it from the drill down interaction.
The way to do this would be to use a Hierarchy Level Parameter combined with a Hierarchy Value parameter. Drilling up simply by manipulating these parameters, so you can read their values in order to determine the current drilldown state, and then you would need to adjust appropriately to drill up, specifically, you’d have to change the level parameter up a level, and adjust the member parameter to show all members of the item you are looking at on that level.
Here is some documentation regarding modifying parameters in scripts:
http://www.dundas.com/support/support-center/support-articles/scripting/modify-a-filter-/-view-parameter-using-scripting
If you use the method described in the article to obtain references to your member parameter and level parameter, with the names memberParam and levelParam respectively, then a drill-up script would go something like below. The script is placed inside if statement and checks if e.relatedData is null, if it's null it means the users clicked on the empty area on the chart and not the actual data point.
//checks if users clicked on the empty area of the chart
if(e.relatedData==null){
// Adjust members so that current parent member becomes new member
var currentMemberValue = memberParam.parameterValue.values[0];
var parentName = currentMemberValue.parentMemberUniqueName;
if (parentName != null)
{
var parentInfo = parentName.split(".");
var newMemberValue = {
"hierarchyUniqueName" : parentInfo[2],
"levelUniqueName" : parentInfo[1] + "." + parentInfo[2], "memberKind" : "Regular", "uniqueName" : parentName }
}
else
{
var newMemberValue = {
"hierarchyUniqueName" : currentMemberValue.hierarchyUniqueName,
"memberKind" : "All",
"uniqueName" : "\\A."+currentMemberValue.hierarchyUniqueName
}
}
memberParam.parameterValue.clearTokens();
memberParam.parameterValue.clearValues();
memberParam.parameterValue.values.push(newMemberValue);
memberParam.invalidateParameterValueLastModifiedTime();
memberParam.refreshAllAdapters();
// Adjust level go up one higher unless at top already
levelParam.parameterValue.topLevelDepth = 0;
if(levelParam.parameterValue.detailsLevelDepth > 0) {
levelParam.parameterValue.detailsLevelDepth -= 1;
}
levelParam.invalidateParameterValueLastModifiedTime();
levelParam.refreshAllAdapters();
}