/* 
    IntraPMS Project
    전자 우편에서 주소록 기능을 위해 조직도 트리를 보여주는 서블릿

    
*/
import java.io.*;
import java.lang.*;

import java.util.*;

import javax.servlet.*;
import javax.servlet.http.*;

import com.etri.groupware.*;
import com.etri.groupware.organization.*;

public class ShowMailUserServlet extends HttpServlet
{
	GroupwareControllerInterface gc = null ;
	OrganizationManagementControllerInterface  omc = null ;
	Properties myPro = null ;

	public void init ( ServletConfig config ) throws ServletException {
		super.init ( config ) ;
		System.out.println ( "Groupware ShowEDALineServlet init () Call..........." ) ;
				
		// 그룹웨어 컨트롤러를 생성한다.
		// 먼저 프라퍼티를 생성한다.
		myPro = new Properties ( ) ;
		// DB매니저 구현 클래스 이름 설정
		myPro.put ( "OrganizationDBManagerClassName" , "PandaSoftOrganizationDBManager" ) ;
		myPro.put ( "BBSDBManagerClassName" , "PandaSoftBBSDBManager" ) ;
		myPro.put ( "EDADBManagerClassName" , "PandaSoftEDADBManager" ) ;
		myPro.put ( "MailDBManagerClassName" , "PandaSoftMailDBManager" ) ;
		////////////////////////////////////////
		System.out.println ( "조직도 트리를 보여주는 서블릿의 프라퍼티 설정도 무사히 마쳤습니다." ) ;
		
		try {
			gc = GroupwareController.init ( myPro ) ;
			/////////////////////////////////////////////////
			System.out.println ( "조직도 트리를 보여주는 서블릿의 그룹웨어 컨트롤러 생성도 무사히 마쳤습니다." ) ;
			
			// 조직도 관리 컨트롤러를 가져온다.
			omc = gc.createOrganizationManagementController ( ) ;
			///////////////////////////////////////////////////////////
			System.out.println ( "조직도 트리를 보여주는 서블리싀 조직도 관리 컨트롤러 생성도 무사히 마쳤습니다." ) ;
		} catch ( Exception e ) { }
	}
	
	public void destroy ( ) {
		super.destroy();
		DBConnectionManager.instance.release() ;
		System.out.println ( "Groupware ShowOrganizationTreeServlet destroy () Call..........." ) ;
	}

	/*----------------------------------------------------------------- */
	/**
	 [메소드이름]: doGet<br>
	 [기능]: 전자 우편에서 주소록을 지정하기 위한 조직도 트리 보여준다.<br>
	 [파라미터]: HttpServletRequest request, HttpServletResponse response<br>
	 [호출자] : 사용자<br>
	 */
	/*--------------------------------------------------------------- */		
	public void doGet ( 
						HttpServletRequest	request , 
						HttpServletResponse	response
																				) throws ServletException, IOException {
		PrintWriter out ;
		String	title = "Group Ware 부서 발령 하기" ;
		// 회사의 이름을 가지는 String 이다.
		String companyName = "팬더 소프트" ; 
		// 데이타베이스에서 얻어들 조직도 트리의 내용으로 String의 2차원 배열형태이다.
		String[][] departmentAndTeam ;
			
		// ContentType을 text/html로 set한다.
		response.setContentType("text/html;charset=euc-kr") ;
														
		// response의 Writer를 얻는다.
		out = new PrintWriter ( new OutputStreamWriter ( response.getOutputStream ( ) , "EUC-KR" ) ) ;
		
		/////////////////////////////////////////////
		// 세션 확인 부분 - 인증되지 않은 사용자의 경우 Login.html 로 되돌려 보낸다.
		String authenKind = null ;
		String authenId = null ;
		String authenName = null ;
		String authenLoginStatus = null;
		
		HttpSession session = request.getSession ();
		authenLoginStatus =  (String)session.getValue("Authentication");
		
		if( (authenLoginStatus == null) || ( !(authenLoginStatus.equals("true")) ) ){
			session.invalidate();
			response.sendRedirect("../Login.html");
		} else {
			authenKind = (String)session.getValue("Kind");
			authenId = (String)session.getValue("Id");
			authenName = (String)session.getValue("Name");   
		}
		/////////////////////////////////////////////

		//////////////////////////////////
		System.out.println ( "조직도 트리를 보여주는 서블릿의 response에 대한 프린트라이터가 생성되었습니다." ) ;
		
		// 데이타 베이스에서 조직도 트리의 내용 즉, 부서와 팀을 가져온다.
		departmentAndTeam = omc.getOrganizationTree ( ) ;
		Official[] comOfficial = omc.getComOfficial ( ) ;
		Official[] depOfficial = omc.getDepOfficial ( ) ;
		
		out.println ( "<HTML><HEAD><TITLE>" ) ;
		out.println ( title ) ;
		out.println ( "</TITLE>" ) ;
		out.println ( "<style type=\"text/css\">" ) ;
		out.println ( "BODY {font-size:10pt; color:\"#000000\"; line-height:12px;}" ) ;
		out.println ( "A:Link {font-size:9pt; color:\"#000033\"; line-height:12px; text-decoration:none}" ) ;
		out.println ( "A:Visited {font-size:9pt; color:\"#330033\"; line-height:12px; text-decoration:none}" ) ;
		out.println ( "A:Hover {font-size:9pt; color:\"#0000ff\"; line-height:12px; text-decoration:underline}" ) ;
		out.println ( "td {font-size:9pt;}" ) ;
		out.println ( "td.red {font-size:9pt; color:\"#ff0000\"}" ) ;
		out.println ( "td.black {font-size:9pt; color:\"#000000\"}" ) ;
		out.println ( "td.navy {font-size:9pt; color:\"#000066\"}" ) ;
		out.println ( "td.space {font-size:1pt;}" ) ;
		out.println ( "</style>  </HEAD>" ) ;
		
		int numImg = 1 ;
		// 우선 회사의 이름을 보여 준다.
		out.println ( "<body bgcolor=lightyellow><form>" ) ;
		out.println ( "<div style=\"position:relative; left:5; top:5; width:90%; height=+10px;\" id=\"DivRule\"></div>" ) ;
		out.println ( "<div id=\"Out0\" style=\"position:relative; left:15; top:+5px; width:90%;\">" ) ;
		if ( departmentAndTeam[0][0].equals("null") ) {
			// 부서가 하나도 없는 경우의 회사 이름 보여 주기...
			out.println ( "<p><img name=img" + (numImg++) + " align=middle src=\"/image/-button-white.jpg\">  " + companyName + "</p>" ) ;
		} else {
			// 부서가 하나라도 있는 경우의 회사 이름 보여 주기...
			out.println ( "<p><span id=\"Out1\" class=\"Outline\" style=\"cursor: hand; \"> <img id=Out1 class=Outline name=img" + (numImg++) + " align=middle src=\"/image/+button-blue.jpg\">  </span>" ) ;
			out.println ( "<u id=\"Out1\" class=\"Outline\" style=\"cursor: hand; \">" + companyName + "</u></p>" ) ;
			out.println ( "<div id=\"Out1details\" style=\"display:None; position:relative; left:12;\">" ) ;
		}

		// 사장이나 이사 전무 등의 사원을 보여 줄때 순서대로 보여 주기 위해서 소트를 다시 해 준다.
		// 사장 -> 전무 -> 상무 -> 이사 순으로 정렬한다.
		int seq = 0 ;
		for ( int s = 0 ; !comOfficial[s].getId().equals("null") ; s++ ) {
			if ( comOfficial[s].getOrders().equals("사장") ) {
				// 사장이 존재하는 경우
				Official temp = comOfficial[seq] ;
				comOfficial[seq] = comOfficial[s] ;
				comOfficial[s] = temp ;
				seq++ ;
			}
		}
		for ( int s = 0 ; !comOfficial[s].getId().equals("null") ; s++ ) {
			if ( comOfficial[s].getOrders().equals("전무") ) {
				// 전무가 존재하는 경우
				Official temp = comOfficial[seq] ;
				comOfficial[seq] = comOfficial[s] ;
				comOfficial[s] = temp ;
				seq++ ;
			}
		}
		for ( int s = 0 ; !comOfficial[s].getId().equals("null") ; s++ ) {
			if ( comOfficial[s].getOrders().equals("상무") ) {
				// 상무가 존재하는 경우
				Official temp = comOfficial[seq] ;
				comOfficial[seq] = comOfficial[s] ;
				comOfficial[s] = temp ;
				seq++ ;
			}
		}
		for ( int s = 0 ; !comOfficial[s].getId().equals("null") ; s++ ) {
			if ( comOfficial[s].getOrders().equals("이사") ) {
				// 이사가 존재하는 경우
				Official temp = comOfficial[seq] ;
				comOfficial[seq] = comOfficial[s] ;
				comOfficial[s] = temp ;
				seq++ ;
			}
		}		
		// 부서를 보여주기 전에 부에 속하지 않는 사원, 예를 들어 사장의 경우의 사원을 보여준다.
		for ( int j = 0 ; !comOfficial[j].getId().equals("null") ; j++ ) {
			String comNO = comOfficial[j].getFamilyName() + comOfficial[j].getFirstName() + "(" + comOfficial[j].getId() + "):" + comOfficial[j].getOrders() + ";" ;
			out.println ( "       <img border=0 width=12 height=12 src=\"/image/triangle_lightblue.jpg\"> <a onClick=\"parent.frames[\'center\'].selOfficial(\'" + comNO + "\')\" style=\"cursor: hand; \">"
				+ comOfficial[j].getOrders() + ":" + comOfficial[j].getFamilyName() + comOfficial[j].getFirstName() + "(" + comOfficial[j].getId() + ")" + "</a><br>" ) ;
		}
		  
		// 다음으로 부서가 없을 때까지 부서를 보여 준다.
		for ( int i = 0 ; !departmentAndTeam[i][0].equals("null") ; i++ ) {
			if ( departmentAndTeam[i][1].equals("null") ) {
				// 부서 이름 클릭시 모든 팀을 보여주는 링크
				out.println ( "<p>       <img name=img" + (numImg++) + " align=middle src=\"/image/-button-yellow.jpg\"> " + departmentAndTeam[i][0] + "<br>" ) ;
			} else {
				out.println ( "<p><span id=\"Out" + (i+2) + "\" class=\"Outline\" style=\"cursor: hand; \">       <img id=Out" + (i+2) + " class=Outline name=img" + (numImg++) + " align=middle src=\"/image/+button-yellow.jpg\"> </span>" ) ;
				// 부서 이름 클릭시 모든 팀을 보여주는 링크
				out.println ( "<u id=\"Out" + (i+2) + "\" class=\"Outline\" style=\"cursor: hand; \">" + departmentAndTeam[i][0] + "</u><br>" ) ;
			}
			
			// 어느 팀에도 존재하지 않는 사원들을 출력해 준다. 예를 들어 부장 같은 경우이다.
			boolean e = true ;
			boolean p = true ;
			boolean pp = false ;
			if ( !departmentAndTeam[i][1].equals("null") ) {
				out.println ( "<div id=\"Out" + (i+2) + "details\" style=\"display:None; position:relative; left:12;\">" ) ;
				for ( int q = 0 ; !depOfficial[q].getId().equals("null") ; q++ ) {					
					if ( depOfficial[q].getDepartment().equals ( departmentAndTeam[i][0] ) ) {
						e = false ;
						if ( p == true ) {
							out.println ( "<br>" ) ;
							p = false ;
							pp = true ;
						}
						// 부장을 보여주는 경우이다.
						String depNO = depOfficial[q].getFamilyName() + depOfficial[q].getFirstName() + "(" + depOfficial[q].getId() + "):" + depOfficial[q].getOrders() + ";" ;
						out.println ( "<img border=0 width=12 height=12 src=\"/image/triangle_yellow.jpg\">  <a onClick=\"parent.frames[\'center\'].selOfficial(\'" + depNO + "\')\" style=\"cursor: hand; \">" 
						+ depOfficial[q].getOrders() + ":" + depOfficial[q].getFamilyName() + depOfficial[q].getFirstName() + "(" + depOfficial[q].getId() + ")" + "</a><br>" ) ;						
					}					
				}
				if ( pp ) out.println ( "<br>" ) ;
			}		
			if ( e ) out.println ( "<br>" ) ;	
			// 다음으로 팀이 없을 때까지 팀을 보여 준다.
			int j = 1 ;
			for ( j = 1 ; !departmentAndTeam[i][j].equals("null") ; j++ ) {
				if ( j == 1 ) {
					//out.println ( "<div id=\"Out" + (i+2) + "details\" style=\"display:None; position:relative; left:12;\">" ) ;
				}
				Team team = new Team ( ) ;
				team.setName ( departmentAndTeam[i][j] ) ;
				team.setUpDepartment ( departmentAndTeam[i][0] ) ;
				Official[] allOfficial = omc.getAllOfficial ( team ) ;
				String nameIdOrders = null ;
				for ( int op = 0 ; !(allOfficial[op].getId().equals("null")) ; op++ ) {
					if ( op == 0 ) {
						nameIdOrders = allOfficial[op].getFamilyName() + allOfficial[op].getFirstName() + "(" + allOfficial[op].getId() + "):" + allOfficial[op].getOrders() + ";" ;
					} else {
						nameIdOrders = nameIdOrders + allOfficial[op].getFamilyName() + allOfficial[op].getFirstName() + "(" + allOfficial[op].getId() + "):" + allOfficial[op].getOrders() + ";" ;
					}
				}
				
				out.println ( "<img border=0 width=12 height=12 src=\"/image/triangle_red.jpg\">  <a onClick=\"parent.frames[\'center\'].selOfficial(\'" + nameIdOrders + "\')\" style=\"cursor: hand; \">" + departmentAndTeam[i][j] + "</a><br>" ) ;
			}
			if ( j != 1 ) 	
			out.println ( "</div>" ) ;
			out.println ( "</p>" ) ;
		}
				
		out.println ( "</div>" ) ;		
		// 자바 스크립트 
		out.println ( "<script language=\"JavaScript\">" ) ;
		out.println ( "function clickHandler() {" ) ;
		out.println ( "var targetId, srcElement, targetElement;" ) ;
		out.println ( "srcElement = window.event.srcElement;" ) ;
		out.println ( "if (srcElement.className == \"Outline\") {" ) ;
		out.println ( "targetId = srcElement.id + \"details\";" ) ;
		out.println ( "targetElement = document.all(targetId);" ) ;
		out.println ( "  imgId = \"img\" + srcElement.id.substring ( 3 , srcElement.id.length ) ; " ) ;
		out.println ( "  imgElement = document.all ( imgId ) ; " ) ;
		out.println ( "if (targetElement.style.display == \"none\") {" ) ;
		out.println ( "       number = srcElement.id.substring(3,srcElement.id.length) ;" ) ;
		out.println ( "      if ( number == 1 ) imgElement.src = \"/image/-button-blue.jpg\" ;" ) ;
		out.println ( "      else imgElement.src = \"/image/-button-yellow.jpg\" ;" ) ;
		out.println ( "targetElement.style.display = \"\";" ) ;
		out.println ( "} else {" ) ;
		out.println ( "	        number = srcElement.id.substring(3,srcElement.id.length) ;" ) ;
		out.println ( "      if ( number == 1 ) imgElement.src = \"/image/+button-blue.jpg\" ;" ) ;
		out.println ( "        else imgElement.src = \"/image/+button-yellow.jpg\" ;" ) ;
		out.println ( "targetElement.style.display = \"none\";" ) ;
		out.println ( "    }" ) ;
		out.println ( "  }" ) ;
		out.println ( "}" ) ;
		out.println ( "document.onclick = clickHandler;" ) ;
		out.println ( "</script> </p>" ) ;
		
		out.println ( "</form></BODY></HTML>" ) ;
		out.close ( ) ;
	}
}