*! version 1.2 beta  25Jan2013
*alexander.schmidt@wiso.uni-koeln.de;

version 11.0, missing
capture program drop mltl2scatter
program define mltl2scatter, rclass

*syntax
syntax varlist (min=2 max=2 numeric) [if]  [aweight fweight iweight]  , l2id(varname) [keepvars labels qfit lfit]

* check whether l2id  is numeric or string
capture confirm numeric v `l2id'
if !_rc {
	local l2idn = 1
	}
else {
	local l2idn = 0
}





* get dependent and independent variable
gettoken yvar xvar : varlist , parse(" ")


* weights specified?
capture confirm existence  `weight'
if !_rc {
	local w=1
	}
else {
	local w=0
	}



*Erase variables
capture drop `yvar'_mlt
capture drop `xvar'_mlt
capture drop L2ID_mlt
capture drop mlthelp
capture drop mlthelp1


* remember the ordering of the data when the program starts
qui gen mlthelp = _n
qui bys `l2id': gen mlthelp1 = 1 if _n == 1
sort mlthelp1, stable

* Get values from level two ID
dis as text "Level 2 variable is" as result " `l2id' "
dis " "

* get values of level-2 id
	qui levelsof `l2id' `if', local(l2idvalues)

* generate new Level2ID Variable
local i=0
if `l2idn' == 1 {
	qui gen L2ID_mlt = .
	}
if `l2idn' == 0 {
	qui gen L2ID_mlt  = ""
	}

qui label variable L2ID_mlt "Level-2 ID"
foreach x of local l2idvalues {
	local i=`i'+1
	if `l2idn' == 1 {
		qui replace L2ID = `x' in `i'
		}
	if `l2idn' == 0 {
		qui replace L2ID = "`x'" in `i'
	}
}
	* get labels of original level-2 two ID and use them for the new variable L2ID
	local vl :value label `l2id'
	if `l2idn' == 1 {
		label values L2ID `vl'
		}

* calculate means for each higher-level unit

	* change string of the if - condition
	capture confirm existence `if'
	if !_rc {
	gettoken if rest : if
	*dis "`if'" "`rest'"
	local rest = "`rest' &"
	}
qui gen `yvar'_mlt = .
qui label variable `yvar'_mlt "Level-2 mean of `yvar' "
qui gen `xvar'_mlt = .
qui label variable `xvar'_mlt "Level-2 mean of `xvar' "
local i=0
foreach x of local l2idvalues {
local i=`i'+1
if `l2idn' == 1 {
	if `w'==1 {
		qui sum `yvar' if `rest' `l2id'==`x'  [`weight'`exp']
		qui replace `yvar'_mlt = r(mean) in `i'
		qui sum `xvar' if `rest' `l2id'==`x' [`weight'`exp']
		qui replace `xvar'_mlt = r(mean) in `i'
		}
	if `w'==0 {
		qui sum `yvar' if `rest' `l2id'==`x'
		qui replace `yvar'_mlt = r(mean) in `i'
		qui sum `xvar' if `rest' `l2id'==`x'
		qui replace `xvar'_mlt = r(mean) in `i'
		}
	}



if `l2idn' == 0 {
	if `w'==1 {
		qui sum `yvar' if `rest' `l2id'=="`x'" [`weight'`exp']
		qui replace `yvar'_mlt = r(mean) in `i'
		qui sum `xvar' if `rest' `l2id'=="`x'" [`weight'`exp']
		qui replace `xvar'_mlt = r(mean) in `i'
		}
	if `w'==0 {
		qui sum `yvar' if `rest' `l2id'=="`x'"
		qui replace `yvar'_mlt = r(mean) in `i'
		qui sum `xvar' if  `rest' `l2id'=="`x'"
		qui replace `xvar'_mlt = r(mean) in `i'
		}
	}
}


* get y-axis title
local varl : variable label `yvar'_mlt

if "`lfit'"=="lfit" {
	if "`qfit'"!="qfit" {
		if "`labels'"=="labels" {
			scatter `yvar'_mlt `xvar'_mlt, mlabel(L2ID) || lfit `yvar'_mlt `xvar'_mlt || , legend(off) ytitle(`varl')
			}
		if "`labels'"!="labels" {
			scatter `yvar'_mlt `xvar'_mlt || lfit `yvar'_mlt `xvar'_mlt || , legend(off) ytitle(`varl')
			}
		}
	if "`qfit'"=="qfit" {
		if "`labels'"=="labels" {
			scatter `yvar'_mlt `xvar'_mlt, mlabel(L2ID) || lfit `yvar'_mlt `xvar'_mlt || qfit `yvar'_mlt `xvar'_mlt || , legend(off) ytitle(`varl')
			}
		if "`labels'"!="labels" {
			scatter `yvar'_mlt `xvar'_mlt || lfit `yvar'_mlt `xvar'_mlt || qfit `yvar'_mlt `xvar'_mlt || , legend(off) ytitle(`varl')
			}
		}
	}

if "`lfit'"!="lfit"  {
	if "`qfit'"=="qfit" {
		if "`labels'"=="labels" {
			scatter `yvar'_mlt `xvar'_mlt, mlabel(L2ID) || qfit `yvar'_mlt `xvar'_mlt ||  , legend(off) ytitle(`varl')
			}
		if "`labels'"!="labels" {
			scatter `yvar'_mlt `xvar'_mlt || qfit `yvar'_mlt `xvar'_mlt || , legend(off) ytitle(`varl')
			}
		}
	if "`qfit'"!="qfit" {
		if "`labels'"=="labels" {
			scatter `yvar'_mlt `xvar'_mlt, mlabel(L2ID) || , legend(off) ytitle(`varl')
			}
		if "`labels'"!="labels" {
			scatter `yvar'_mlt `xvar'_mlt || , legend(off) ytitle(`varl')
			}
		}
	}




if "`keepvars'"!="keepvars" {
drop `yvar'_mlt
drop `xvar'_mlt
drop L2ID_mlt
}


sort mlthelp
capture drop mlthelp
capture drop mlthelp1

end