*! seeout version 1.2.3 21oct2009 by roywada@hotmail.com
*! (to accompany -outreg2-)

program define seeout
version 7.0

syntax [using] [,LABel LABelA(passthru) ]

if `"`using'"'~="" {
	*** clean up file name, attach .txt if no file type is specified
	local rest "`using'"
	* strip off "using"
	gettoken part rest: rest, parse(" ")
	* strip off quotes
	gettoken first second: rest, parse(" ")
	cap local rest: list clean local(rest)

	local rabbit `"""'
	if index(`"`using'"', ".")==0 {
		local file = `"`rabbit'`first'.txt`rabbit'"'
		local using = `"using `file'"'
	}
	else {
		local file = `"`rabbit'`first'`rabbit'"'
		local using = `"using `file'"'
	}

	*** seeout the output
	*local cl `"{stata `"seeout `pref'"':  seeout `pref'}"'
	*di as txt `"`cl'"'
	seeing `using', `label'
}

else {
	*** read the set preference if not out of date

	* NOTE: `0' is written over below
	cap quietly findfile outreg2.pref
	tempname myfile
	cap file open `myfile' using `"`r(fn)'"', read text
	cap file read `myfile' date
	cap file read `myfile' pref
	cap file read `myfile' options
	cap file close `myfile'

	if "`date'"== "`c(current_date)'" {
		*** seeout the output

		if index(`"`options'"', "label")~=1 & index(`"`options'"', `"label("')==0 {
			tokenize `"`options'"'
			local count: word count `options'
			if `count'~=0 {
				local test 0
				forval num=1/`count' {
					if `"``num''"'=="label" {
						local label label
					}
				}
			}
		}
	} /* ? */
	gettoken first file: pref

	*** codes recycled from outreg2:
	* strip off quotes and extension
	gettoken first second: file, parse(" ")
	local temp = `"`first'"'

	local next_dot = index(`"`temp'"',".")
	local next_strip = substr(`"`temp'"',1,`=`next_dot'-1')
	local strippedname = substr(`"`temp'"',1,`=`next_dot'-1')

	* check for more dots
	local change 0
	while `change'==0 {
		local temp = substr(`"`temp'"',`=`next_dot'+1',.)
		if index(`"`temp'"', ".")~=0 {
			local next_dot = index(`"`temp'"',".")
			local next_strip = substr(`"`temp'"',1,`=`next_dot'-1')
			local strippedname = `"`strippedname'.`next_strip'"'
		}
		else {
			* no change
			local last_strip = `"`temp'"'
			local change 1
		}
	}

	*** check for manual rtf doc xlm xls csv extensions
	if `"`last_strip'"'=="rtf" | `"`last_strip'"'=="doc" {
		local word "word"

		local file = `"`rabbit'`strippedname'.txt`rabbit'"'
		local using = `"using `file'"'
		local wordFile "`last_strip'"
	}
	if `"`last_strip'"'=="xls" | `"`last_strip'"'=="xml" | `"`last_strip'"'=="xlm" | `"`last_strip'"'=="csv" {
		local excel "excel"

		local file = `"`rabbit'`strippedname'.txt`rabbit'"'
		local using = `"using `file'"'
		local excelFile "`last_strip'"
	}
	if `"`last_strip'"'=="tex" {
		if `"`tex1'"'=="" {
			local tex "tex"
		}

		local file = `"`rabbit'`strippedname'.txt`rabbit'"'
		local using = `"using `file'"'
		local texFile "`last_strip'"
	}


	if `"`last_strip'"'=="txt" {
		seeing `pref', `label'
	}
	else {
		if "`using'"=="" {
			di in red "must specify using file"
			exit 198
		}
		seeing using `using', `label'
		* similar to the other one except the clickable text
		*local cl `"{stata `"seeout `pref'"':  seeout `pref'}"'
		*di as txt `"`cl'"'
	}
	else {
		di in red "must specify the filename (the last preference has expired)"
		exit 100
	}
}
end



***********************


program define seeing
version 7.0

* invisible to Stata 7
local Version7 ""
cap local Version7 `c(stata_version)'

if "`Version7'"=="" {
	* it is version 7
	*noi di in yel "limited functions under Stata 7"
}
else if `Version7'>=8.2 {
	version 8.2
}

quietly{
	* syntax using/[, Clear]
	syntax using [, LABel LABelA(string) ]

	preserve

	insheet `using', nonames clear
	describe, short


	* number of columns
	local numcol = `r(k)'

	tempvar blanks rowmiss
	count if v1=="EQUATION"
	if `r(N)'~=0 {
		local eqPlace 1
		local varPlace 2
		count if v3=="LABELS"
		if `r(N)'~=0 {
			local labPlace 3
			local num=4
		}
		else {
			local labPlace 0
			local num=3
		}
	}
	else {
		local eqPlace 0
		local varPlace 1

		count if v2=="LABELS"
		if `r(N)'~=0 {
			local labPlace 2
			local num=3
		}
		else {
			local labPlace 0
			local num=2
		}
	}

	gen int `blanks' = (trim(v`num')=="")
	forvalues col = `num'/`numcol' {
		replace `blanks' = `blanks' & (trim(v`col')=="")
	}


	* title rows
	local titleWide = 0
	if v1[1]~="" | v2[1]~="" {
		* there may be a title
		if `labPlace'==0 & `varPlace'==1 {
		      while v1[`=`titleWide'+1']~="" &  v2[`=`titleWide'+1']=="" {
				local titleWide = `titleWide'+1
		}
			}
		if `labPlace'==0 & `varPlace'==2 {
		      while v2[`=`titleWide'+1']~="" &  v3[`=`titleWide'+1']=="" {
				local titleWide = `titleWide'+1
			}
		}
		if `labPlace'~=0 & `varPlace'==1 {
		      while v1[`=`titleWide'+1']~="" &  v3[`=`titleWide'+1']=="" {
				local titleWide = `titleWide'+1
			}
		}
		if `labPlace'~=0 & `varPlace'==2 {
	      while v2[`=`titleWide'+1']~="" &  v4[`=`titleWide'+1']=="" {
				local titleWide = `titleWide'+1
			}
		}
	}

	*local VARIABLES "VARIABLES"
	* first name AFTER titles is the VARIABLES
	local content
	local num=`titleWide'+1
	local N=_N
	while `"`content'"'=="" & `num'<=`N' {
		local content=v`varPlace'[`num']
		local num=`num'+1
	}
	local VARIABLES `"`content'"'

	replace `blanks'=0 if  v1==`"`VARIABLES'"' | v1[_n-1]==`"`VARIABLES'"' | v2==`"`VARIABLES'"' | v2[_n-1]==`"`VARIABLES'"'


	* getting bottomBorder (the bottom border), count up
	gen rowmiss=0
	foreach var of varlist v* {
		replace rowmiss=rowmiss+1 if `var'~=""
	}
	local N=_N
	local content 1
	local num 0
	while `content'==1 & `num'<`N' {
		local content rowmiss[`=`N'-`num'']
		local num=`num'+1
	}
	* do not have to add to titleWide
	local bottomRow = `N'-`num'+1
	local bottomBorder=`bottomRow'

	* getting halfway to headBorder (the top border), count down
	local content
	local num=`titleWide'+1
	local N=_N
	while `"`content'"'=="" & `num'<=`N' {
		local content=v`varPlace'[`num']
		local num=`num'+1
	}
	* do not have to add to titleWide
	local headRow `num'
	local headBorder=`headRow'

	drop rowmiss


	* avoid counting space within each statistics row as missing
	replace `blanks'=0 if `blanks'[_n+1]==0 & `blanks'==1 & _n >`titleWide'


	* statistics rows
	*count if `blanks'==0
	*local bottomBorder = `r(N)'+`titleWide'


	* move the notes and titles to the top of a new column
	gen str5 Notes_Titles=""
	format Notes_Titles %-20s
	count if v1=="EQUATION"
	if `r(N)'==0 {
		* EQUATION column does not exist
		if `titleWide'>0 {
			forval num=1/`titleWide' {
				replace Notes_Titles=v1[`num'] in `num'
				replace v1="" in `num'
			}
		}

		local one = 1
		local legend = v1[`bottomBorder'+`one']


		local place 1
		*while "`legend'"~="" {
		local N=_N
		while `place' <= `N' {
			local place=`bottomBorder'+`one'
			local legend = v1[`place']
			replace Notes_Titles="`legend'" in `=`one'+`titleWide'+1'
			if "`legend'"~="" {
				replace v1="" in `place'
			}
			local one = `one'+1
		}

		* insert label changes here, minus 2 from c(k) for `blanks' & Notes_Titles column
		if "`label'"=="label" {
				*if ("`long'"~="long" & "`onecol'"~="onecol") | ("`long'"=="long" & "`onecol'"=="onecol") {
					replace v2=v1 if v2==""
					drop v1
					describe, short
					forval num=1/`=`r(k)'-2' {
						ren v`=`num'+1' v`num'
					}

					* change LABELS to VARIABLES
					replace v1=`"`VARIABLES'"' if v1=="LABELS"
				*}
				local label_adjust "-1"
		}

		* change the string length
		gen str5 temp=""
		replace temp=v1
		drop v1
		ren temp v1
		order v1
		* format
		foreach var of varlist v1 {
			local _format= "`: format `var''"
			local _widths=substr("`_format'",2,length(trim("`_format'"))-2)
			format `var' %-`_widths's
		}
	}
	else {
		* equation column exists
		if `titleWide'>0 {
			forval num=1/`titleWide' {
				replace Notes_Titles=v2[`num'] in `num'
				replace v2="" in `num'
			}
		}

		local one = 1
		local legend = v2[`bottomBorder'+`one']
		while "`legend'"~="" {
			local place=`bottomBorder'+`one'
			local legend = v2[`place']
			replace Notes_Titles="`legend'" in `=`one'+`titleWide'+1'
			if "`legend'"~="" {
				replace v2="" in `place'
			}
			local one = `one'+1
		}

		* insert label changes here, minus 2 from c(k) for `blanks' & Notes_Titles column
		if "`label'"=="label" {
				*else if "`long'"~="long" & "`onecol'"=="onecol" {
					replace v3=v2 if v3==""
					drop v2
					describe, short
					forval num=2/`=`r(k)'-2' {
						ren v`=`num'+1' v`num'
					}

					* change LABELS to VARIABLES
					replace v2=`"`VARIABLES'"' if v2=="LABELS"
				*}
				local label_adjust "-1"
		}


		* change the string length
		gen str5 temp=""
		replace temp=v2
		drop v2
		ren temp v2
		order v1 v2
		* format
		foreach var of varlist v1 v2 {
			local _format= "`: format `var''"
			local _widths=substr("`_format'",2,length(trim("`_format'"))-2)
			format `var' %-`_widths's
		}
	}

	* clean up
	*egen `rowmiss'=rowmiss(_all)
	* rowmiss option not available in 8.2 or 8.0, do it by hand

	gen `rowmiss'=0
	foreach var of varlist _all {
		if "`var'"~="`rowmiss'" & "`var'"~="`blanks'" {
			replace `rowmiss'=1+`rowmiss' if `var'==""
		}
	}

	*drop if `rowmiss'==`numcol'+1

	* adjust to handle label column droppings
	*drop if `rowmiss'==`numcol'+1 & `blanks'==1

	* fix blanks==1 for groupvar( )
	count if `blanks'==1
	local rN=`r(N)'+1
	forval num=1/`rN' {
		replace `blanks'=0 if `blanks'[_n+1]==0 & `blanks'==1
	}

	drop if `rowmiss'==`numcol'+1 `label_adjust' & `blanks'==1
	drop `blanks' `rowmiss'

	browse

	if "`Version7'"=="" {
		* it is version 7
	}
	else if `Version7'>=11.0 {
		noi di in yel "Hit Enter to continue" _request(junk)
	}

	*restore, preserve
}
end  /* end of seeing */

exit



* versions
1.1	replaced rowmiss option in egen, which is not available in 8.2
1.1.1	disabled -restore, preserve- as redundant waste of time
	fixed seeing/seeout: handles blank space in stat(aster)
	label does not show
	no longer produces a seeout blue text whenever a seeout blue text was clicked
1.1.2	the shorthand form of seeout hides label
1.1.3	the shorthand form of seeout hides label: `label' is actually read from outreg2_pref.ado
1.2.0	down to version 7.0; -describe, short- instead of c(k)
	if `"`using'"'~="": needed the compound quotes
	VARIABLES is flexibly named
1.2.1 Apr2009 handles xls, doc, etc, that was left attached to file names in pref_ado
1.2.2 04Aug2009 a fix for asynchronoous data browser in -seeing- for version 11
1.2.3 21oct2009 outreg2_pref should have been replaced with outreg2.pref earlier