capture program drop calcscore
program calcscore,rclass
syntax varlist, PARTition(numlist integer >0) [CALCmethod(string) SCOrename(string)]

local y = 1

*di "{bf:Calculs des scores}"

local C = 0
foreach z in `partition' {
	local C = `C' + `z'
}

local nbvars : word count `varlist'
if `C' != `nbvars' {
	di in red "The sum of the numbers in the partition option is different from the number of variables precised in varlist"
	exit
}

if "`scorename'" != "" {
	local P:word count `partition'
	local S:word count `scorename'
	if `P'!=`S' {
		di in red "The number of score names given is different from the number of dimensions in the partition option"
		exit 119
	}
	foreach sco in `scorename' {
		capture confirm variable `sco'
		if !_rc {
			di in red "`sco' is a variable of the dataset. Choose another name"
			exit 119
        }
    }
}

/*
local cpt = 0
if "`sum'" != "" {
	local cpt `cpt' + 1
}
if "`mean'" != "" {
	local cpt `cpt' + 1
}
if "`stand'" != "" {
	local cpt `cpt' + 1
}
if `cpt'>1 {
	di in red "You must choose between mean, sum or stand (the options are exclusive)"
	exit 119
}
*/

local i = 1
foreach x in `partition' {
	tokenize `varlist'
	if `i' == 1 local s = `x'
	else local s = `s' +`x'

	local liste = ""
	forvalues w = `y'/`s' {
		local liste `liste' ``w''
	}

	tempvar nonmiss
	qui egen `nonmiss' = rownonmiss(`liste')

	if "`scorename'" != "" {
		tokenize `scorename'
		local sc = "``i''"
		}
	else local sc = "Dim`i'"

/*	if "`calc_method'" == "" {
		local calc_method = "mean"
	}

	if "`calc_method'" != "sum" & "`calc_method'" != "mean" {
		di in red "The calc_method option is invalid. Choose mean or sum."
		exit 119
	}

	if "`calc_method'" == "sum" {
		qui egen `sc' = rowmean(`liste') if `nonmiss' >= `x'/2
		if "`calc_stand'" != "" {
			local maxs = 0
			foreach var in `liste' {
				qui levelsof `var', local(levels)
				local max = 0
				foreach l in `levels' {
					if `l'>`max' local max = `l'
				}
				local maxs = `maxs' + `max'
			}
			di "`sc' : `maxs'"
		    qui replace `sc' = `sc'*`nonmiss'*100/`maxs'
		}
		else qui replace `sc' = `sc'*`nonmiss'
	}
	else if "`calc_method'" == "mean" {
		qui egen `sc' = rowmean(`liste') if `nonmiss' >= `x'/2
	}
*/
	if "`calcmethod'" == "" local calcmethod = "mean"

	if "`calcmethod'" != "mean" & "`calcmethod'" != "sum" & "`calcmethod'" != "stand" {
		di in red "option calcmethod incorrectly specified (choose among mean, sum and stand)"
		error 198
	}

	if "`calcmethod'" == "sum" {
		qui egen `sc' = rowmean(`liste') if `nonmiss' >= `x'/2
		qui replace `sc' = `sc'*`nonmiss'
	}

	else if "`calcmethod'" == "stand" {

		qui egen `sc' = rowmean(`liste') if `nonmiss' >= `x'/2
		qui replace `sc' = `sc'*`nonmiss'

		tempvar min max
		egen `min' = min(`sc')
		egen `max' = max(`sc')


		/*
		foreach var in `liste' {
			/*qui levelsof `var', local(levels)
			local max = 0
			foreach l in `levels' {
				if `l'>`max' local max = `l'
			}
			local maxs = `maxs' + `max'*/

			local max = max(`levels')
		}

		*/
		*di "max : "`max'
		*di "min : "`min'

		qui replace `sc' = (`sc'-`min')/(`max'-`min')*100
	}

	else {
		qui egen `sc' = rowmean(`liste') if `nonmiss' >= `x'/2
	}

local `i++'
local y = `s'+1
}
end

*calcscore ioc1-ioc37, partition(4 4 7 3 3 4 7 5) scorename(HA PSE W BCC AC AE LI MOC) calcmethod(stand)
*calcscore x1-x40, partition(5 5 5 5 5 5 5 5) calcmethod(stand)
*calcscore sf36_3q_intenses sf36_3q_moderees sf36_3q_soulever sf36_3q_etages sf36_3q_etage sf36_3q_pencher sf36_3q_15km sf36_3q_500m sf36_3q_100m sf36_3q_douche  sf36_4q_limite_temps_travail sf36_4q_moins_choses sf36_4q_type_travail sf36_4q_effort  sf36_7q_intensite_douleurs sf36_8q_douleurs_physiques  sf36_1q sf36_11q_malade sf36_11q_porte_bien sf36_11q_degrade sf36_11q_excellente_sante  sf36_9q_enthousiaste sf36_9q_energie sf36_9q_epuise sf36_9q_fatigue  sf36_6q_vie_sociale sf36_10q_etat_mental  sf36_5q_limite_temps_travail sf36_5q_moins_choses sf36_5q_accomplies_soigneusement  sf36_9q_nerveux sf36_9q_triste sf36_9q_calme sf36_9q_maussade sf36_9q_heureux, partition(10 4 2 5 4 2 3 5) scorename(PF RP BP GH VT SF RE MH) calcmethod(mean)