/////////////////////////////////////////////////////////////////
//Copyright (C) 2005 NTT CORPORATION.
//
//	ソート処理用 Velocity Toolクラス
//
//		変更履歴
//			2005.02.19  新規作成  村上 靖征
//
//	機能
//
//	このクラスはソート処理を行うクラスです。
//
////////////////////////////////////////////////////////////////

package jp.co.ntt.lms.xmf.tools.xmo.Base;

import java.util.Date;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

import jp.co.ntt.lms.xmf.tools.ToolBase;
import jp.co.ntt.lms.xmo.XMOException;
import jp.co.ntt.lms.xmo.XMOPropertyDef;
import jp.co.ntt.lms.xmo.Base.XMSBaseClient;
import jp.co.ntt.lms.xmo.Base.Gui.BaseDisplayData;
import jp.co.ntt.lms.xmo.Base.Gui.BaseSort;
import jp.co.ntt.lms.xmo.Groups.GroupsData;
import jp.co.ntt.lms.xmo.Lo.LoData;
import jp.co.ntt.lms.xms.login.base.ShowLoChildrenBean;
import jp.co.ntt.lms.xms.login.base.ShowMethodChildrenBean;
import jp.co.ntt.lms.xms.login.base.ShowMethodChildrenRecordBean;
import jp.co.ntt.lms.xmo.Method.MethodClient;
import jp.co.ntt.lms.xmo.Method.MethodData;

/**
 * ソート処理用 Velocity Toolクラス
 * 
 * このクラスはソート処理を行うクラスです。
 * 
 * @author 村上 靖征
 * @version 1.0
 */
public class SortTool extends ToolBase
{

	/**
	 * BaseSort.NAME_FIELD を返却する。
	 * 
	 * @return
	 */
    public int getNAME_FIELD()
    {
        return BaseSort.NAME_FIELD;
    }

    /**
     * BaseSort.DOWN_TYPE を返却する。
     * 
     * @return
     */
    public int getDOWN_TYPE()
    {
        return BaseSort.DOWN_TYPE;
    }

    /**
     * BaseSort.UP_TYPE を返却する。
     * 
     * @return
     */
    public int getUP_TYPE()
    {
        return BaseSort.UP_TYPE;
    }

    /**
     * BaseSort.COMMENT_FIELD を返却する。
     * 
     * @return
     */
    public int getCOMMENT_FIELD()
    {
        return BaseSort.COMMENT_FIELD;
    }

    /**
     * 指定されたユーザーにアサインされている指定されたコンテナ配下の教材を取得します。
     * これを使用する vm は /view/xmo/Base/common.vm を parse してください。
     * 
     * @param strParentID
     *            コンテナのLOID または、$LO_TREE_ROOT (common.vm で定義)
     * @param strUserID
     *            ユーザID
     * @param intSortField
     *            ソート対象をあらわす数値
     *            0 : LO名でソートを行います。
     *            1 : LOの説明でソートを行います。
     * @param sort
     *            ソートするかどうかのフラグ
     *            falseの場合はソートは行いません
     * @return List
     *            ShowLoChildrenRecordBean からなるリスト
     */
    public List sortLoContainerList(String strParentID, String strUserID,
    		int intSortField, int intSortType, boolean sort) throws Exception
    {

        BaseSort objSort = null;
        if (sort)
        {
            objSort = new BaseSort(intSortField, intSortType);
        }

        // パスに':'が含まれる場合は教材構造を取得する

        // 画面表示データクラス配列
        BaseDisplayData[] objDisplayList = new BaseDisplayData[0];

        String LO_TREE_ROOT = getContextString("LO_TREE_ROOT");
        if (strParentID.equals(LO_TREE_ROOT))
        {
            Vector vecLeanerLo = null;

            try
            {
                String LO_TYPE = getContextString("LO_TYPE");
                vecLeanerLo = GetRootList.getRootList(context, LO_TYPE,
                        strUserID);
            }
            catch (XMOException xe)
            {
                throw xe;
            }

            // 画面表示オブジェクト配列を適切な長さにする
            objDisplayList = new BaseDisplayData[vecLeanerLo.size()];
            for (int i = 0; i < vecLeanerLo.size(); i++)
            {
                LoData objLoData = (LoData) vecLeanerLo.get(i);

                // グループIDの取得
                String strChildID = objLoData.getLoID();

                // 画面表示データオブジェクトをインスタンス化
                BaseDisplayData objDisplay = new BaseDisplayData();

                // タイトル設定
                objDisplay.setTitle(objLoData.getLoTytle());
                // ID設定
                objDisplay.setID(objLoData.getLoID());
                // 説明設定
                objDisplay.setDescription(objLoData.getLoexplanation());
                // タイプ設定
                objDisplay.setType(objLoData.getLoType());
                // 前提条件設定
                objDisplay.setPrere(objLoData.getPrere());

                // 配列のi番目に画面表示オブジェクトを設定
                objDisplayList[i] = objDisplay;
            }
        }
        else
        {

            XMSBaseClient objBase = new XMSBaseClient();

            // 検索処理
            if (objBase.selectLoBaseDisplay(strParentID))
            {
                objDisplayList = objBase.getBaseDisplay();
            }
            else
            {
                // 検索失敗
                throw new Exception(objBase.getMessage());
            }

        }

        // ソート指定ありの場合は、
        // 画面表示オブジェクトのソート処理を行う
        if (objSort != null)
        {
            objDisplayList = objSort.sort(objDisplayList);
        }

        // 画面表示用HTMLの組み立て
        ShowLoChildrenBean showBean = new ShowLoChildrenBean();
        // アサイントップ検索となるのは親IDがLO仮想ルートの場合("lotreeroot")
        boolean assignTop = strParentID.equals(LO_TREE_ROOT);
        showBean.makeRecord(strParentID, strUserID, assignTop, objDisplayList);
        List list = showBean.getRecordList();

        return list;
    }

    /**
     * ソートするメソッドです。
     * 
     * @param strTreePath
     *            ツリーパス
     * @param strParentID
     *            親ID
     * @param strUserID
     *            ユーザID
     * @param strLearner
     *            学習者フラグ
     * @param objSort
     *            ソートオブジェクト nullの場合はソートは行いません
     * @param response
     *            HTTPレスポンス
     * @return
     */
    public List sortLoContainerList(String strTreePath, String strParentID,
            String strUserID, String strLearner, int intSortField,
            int intSortType, boolean sort) throws Exception
			
    {

        BaseSort objSort = null;
        if (sort)
        {
            objSort = new BaseSort(intSortField, intSortType);
        }

        // パスに':'が含まれる場合は教材構造を取得する

        // 画面表示データクラス配列
        BaseDisplayData[] objDisplayList = new BaseDisplayData[0];

        String LO_TREE_ROOT = getContextString("LO_TREE_ROOT");
        if (strParentID.equals(LO_TREE_ROOT))
        {
            Vector vecLeanerLo = null;

            try
            {
                String LO_TYPE = getContextString("LO_TYPE");
                vecLeanerLo = GetRootList.getRootList(context, LO_TYPE,
                        strUserID);
            }
            catch (XMOException xe)
            {
                //response.sendRedirect( xe.getMessageData().getURL() );
                //return null;
                throw xe;
            }

            // 画面表示オブジェクト配列を適切な長さにする
            objDisplayList = new BaseDisplayData[vecLeanerLo.size()];
            for (int i = 0; i < vecLeanerLo.size(); i++)
            {
                LoData objLoData = (LoData) vecLeanerLo.get(i);

                // グループIDの取得
                String strChildID = objLoData.getLoID();

                // 画面表示データオブジェクトをインスタンス化
                BaseDisplayData objDisplay = new BaseDisplayData();

                // タイトル設定
                objDisplay.setTitle(objLoData.getLoTytle());
                // ID設定
                objDisplay.setID(objLoData.getLoID());
                // 説明設定
                objDisplay.setDescription(objLoData.getLoexplanation());
                // タイプ設定
                objDisplay.setType(objLoData.getLoType());
                // 前提条件設定
                objDisplay.setPrere(objLoData.getPrere());

                // 配列のi番目に画面表示オブジェクトを設定
                objDisplayList[i] = objDisplay;
            }
        }
        else
        {

            XMSBaseClient objBase = new XMSBaseClient();

            // 検索処理
            if (objBase.selectLoBaseDisplay(strParentID))
            {
                objDisplayList = objBase.getBaseDisplay();
            }
            else
            {
                // 検索失敗
                throw new Exception(objBase.getMessage());
            }

        }

        // ソート指定ありの場合は、
        // 画面表示オブジェクトのソート処理を行う
        if (objSort != null)
        {
            objDisplayList = objSort.sort(objDisplayList);
        }

        // 画面表示用HTMLの組み立て
        ShowLoChildrenBean showBean = new ShowLoChildrenBean();
        // アサイントップ検索となるのは親IDがLO仮想ルートの場合("lotreeroot")
        boolean assignTop = strParentID.equals(LO_TREE_ROOT);
        showBean.makeRecord(strParentID, strUserID, assignTop, objDisplayList);
        List list = showBean.getRecordList();
        //			for( int i = 0; i < list.size(); i++ ) {
        //				ShowLoChildrenRecordBean record =
        // (ShowLoChildrenRecordBean)list.get(i);
        //				
        //				String strLoId = record.getLoId();
        //				String strTitle = record.getTitle();
        //				String strDescript = record.getDescript();
        //				String strIconSuffix = record.getIconSuffix();
        //				int intStatus = record.getStatus();
        //				
        //				String strIconID = "";
        //				if( record.getLoType().equals( "0" ) ) {
        //					// コンテナの場合
        //					strIconID = "container";
        //				}
        //				else {
        //					// 上記以外の場合
        //					strIconID = "course" + record.getLoType();
        //				}
        //				strBufTemp.append(stringHtml(strTitle, strDescript, strIconID,
        // strLoId, strParentID, strIconSuffix, intStatus));
        //			}

        return list; //strBufTemp.toString();
    }

    /**
     * ソートするメソッドです。
     * 
     * @param strParentID
     *            親ID
     * @param strUserID
     *            ユーザID
     * @param strLearner
     *            学習者フラグ
     * @param objSort
     *            ソートオブジェクト nullの場合はソートは行いません
     * @param response
     *            HTTPレスポンス
     * @return ソート結果のHTML
     */
    public BaseDisplayData[] sortGroupUserList(String strParentID,
            String strUserID, String strLearner, int intSortField,
            int intSortType, boolean sort) throws Exception
    {

        BaseSort objSort = null;
        if (sort)
        {
            objSort = new BaseSort(intSortField, intSortType);
        }

        StringBuffer strBufTemp = new StringBuffer();

        // 画面表示データクラス配列
        BaseDisplayData[] objDisplayList = new BaseDisplayData[0];

        String GROUP_TREE_ROOT = getContextString("GROUP_TREE_ROOT");
        if (strParentID.equals(GROUP_TREE_ROOT))
        {
            // ルートグループを取得する
            Vector vecRootList = null;
            try
            {
                String GROUP_TYPE = getContextString("GROUP_TYPE");
                vecRootList = GetRootList.getRootList(context, GROUP_TYPE,
                        strUserID);
            }
            catch (XMOException xe)
            {
                //				response.sendRedirect(xe.getMessageData().getURL() );
                //				return null;
                throw xe;
            }

            // 画面表示オブジェクト配列を適切な長さにする
            objDisplayList = new BaseDisplayData[vecRootList.size()];

            for (int i = 0; i < vecRootList.size(); i++)
            {
                GroupsData objGroupData = (GroupsData) vecRootList.get(i);
                // 画面表示データオブジェクトをインスタンス化
                BaseDisplayData objDisplay = new BaseDisplayData();

                // 名前設定
                objDisplay.setTitle(objGroupData.getGroupName());
                // コメント設定
                objDisplay.setDescription(objGroupData.getCustomMsgDir());
                // ID設定
                objDisplay.setID(objGroupData.getGroupID());
                // グループタイプ設定
                objDisplay.setType(objGroupData.getGroupType());

                // 配列のi番目に画面表示オブジェクトを設定
                objDisplayList[i] = objDisplay;
            }
        }
        else
        {

            XMSBaseClient objBase = new XMSBaseClient();

            // 詳細表示データの取得を行います
            // 検索処理
            if (objBase.selectGroupAndPeopleBaseDisplay(strParentID))
            {
                // 検索がうまくいった場合
                objDisplayList = objBase.getBaseDisplay();
            }
            else
            {
                // 検索失敗
                throw new Exception(objBase.getMessage());
            }
        }

        // ソート指定ありの場合は、
        // 画面表示オブジェクトのソート処理を行う
        if (objSort != null)
        {
            objDisplayList = objSort.sort(objDisplayList);
        }

        return objDisplayList;
    }

    /**
     * 
     * LOに関連付けられたコンテナリストをソートする。
     * 
     * @param strTreePath
     * @param strHideTreePath
     * @param strParentID
     * @param strUserID
     * @param strLearner
     * @param intSortField
     * @param intSortType
     * @param sort
     * @return
     * @throws Exception
     */
    public List sortSubLoContainerList(String strTreePath,
            String strHideTreePath,
            String strParentID, String strUserID, String strLearner,
            int intSortField, int intSortType, boolean sort) throws Exception
    {
        
        BaseSort objSort = null;
        if (sort)
        {
            objSort = new BaseSort(intSortField, intSortType);
        }

        StringBuffer strBufTemp = new StringBuffer();

        // 画面表示データクラス配列
        BaseDisplayData[] objDisplayList = new BaseDisplayData[0];

        if (!strHideTreePath.equals(""))
        {
            // 配下の検索を行います
            String strLastParentID = ShowCommon.getLastParentID(strHideTreePath);

            XMSBaseClient objBase = new XMSBaseClient();

            // 検索処理
            if (objBase.selectLoBaseDisplay(strParentID))
            {
                objDisplayList = objBase.getBaseDisplay();
            }
            else
            {
                // 検索に失敗した場合は、エラーを投げる
                throw new Exception(objBase.getMessage());
            }
        }
        // ルートユーザの場合はルートLO(LO0) の直下を表示する。
        else if (strUserID.equals(XMOPropertyDef.ROOT_USER))
        {
            // ルートコンテナ(LO0)直下の検索を行います
            XMSBaseClient objBase = new XMSBaseClient();

            // 検索処理
            if (objBase.selectLoBaseDisplay(XMOPropertyDef.ROOT_LOID))
            {
                objDisplayList = objBase.getBaseDisplay();
            }
            else
            {
                // 検索に失敗した場合は、エラーを投げる
                throw new XMOException(objBase.getMessage());
            }
        }
        else
        {
            // スーパユーザ以外は管理アサイントップを表示する
            // アサイントップの検索はXMSBaseClient の searchRootLoList メソッドを使用する。
            // その際管理アサイン指定を行う。(XMSBaseClient.MANAGE_TYPE)
            XMSBaseClient objXms = new XMSBaseClient();

            // ルートLOリスト検索処理(管理アサインされているものを検索)
            if (!objXms.searchRootLoList(strUserID, XMSBaseClient.MANAGE_TYPE)) { throw new XMOException(
                    objXms.getMessageData()); }

            // 検索がうまくいった場合
            LoData[] objLoList = objXms.getRootLoList();

            // 画面表示オブジェクト配列を適切な長さにする
            objDisplayList = new BaseDisplayData[objLoList.length];

            // LO管理XMOを使用して、LOの詳細情報を取得する。
            for (int i = 0; i < objDisplayList.length; i++)
            {

                LoData objLo = objLoList[i];
                // 画面オブジェクトをインスタンス化
                BaseDisplayData objDisplay = new BaseDisplayData();

                // タイトルの設定
                objDisplay.setTitle(objLo.getLoTytle());
                // IDの設定
                objDisplay.setID(objLo.getLoID());
                // 説明の設定
                objDisplay.setDescription(objLo.getLoexplanation());
                // LOタイプの設定
                objDisplay.setType(objLo.getLoType());
                // 前提条件の設定
                objDisplay.setPrere(objLo.getPrere());

                // 配列のi番目に参照を格納する
                objDisplayList[i] = objDisplay;
            }
        }

        // ソート指定ありの場合は、
        // 画面表示オブジェクトのソート処理を行う
        if (objSort != null)
        {
            objDisplayList = objSort.sort(objDisplayList);
        }

        // 画面表示用HTMLの組み立て
        ShowLoChildrenBean showBean = new ShowLoChildrenBean();
        // アサイントップ検索となるの隠しパス(ユーザツリー側のパスではなくLO一覧側の見えないパス)
        // が設定していない場合及び、ログイン者がスーパユーザ以外の場合
        boolean assignTop = strHideTreePath.equals("")
                || !strUserID.equals(XMOPropertyDef.ROOT_USER);
        showBean.makeRecord(strParentID, strUserID, assignTop, objDisplayList);
        List list = showBean.getRecordList();
        
        return list;
        
//        for (int i = 0; i < list.size(); i++)
//        {
//            ShowLoChildrenRecordBean record = (ShowLoChildrenRecordBean) list.get(i);
//
//            String strLoId = record.getLoId();
//            String strTitle = record.getTitle();
//            String strDescript = record.getDescript();
//            String strIconSuffix = record.getIconSuffix();
//            int intStatus = record.getStatus();
//
//            String strIconID = "";
//            if (record.getLoType().equals("0"))
//            {
//                // コンテナの場合
//                strIconID = "container";
//            }
//            else
//            {
//                // 上記以外の場合
//                strIconID = "course" + record.getLoType();
//            }
//            strBufTemp.append(stringHtml(strTitle, strDescript, strIconID,
//                    strLoId, strParentID, strIconSuffix, intStatus));
//        }
//
//        return strBufTemp.toString();
    }

    /**
     * ソートするメソッドです。
     * 
     * @param strTreePath
     *            ツリーパス
     * @param strHideTreePath
     *            隠しパス
     * @param strParentID
     *            親ID
     * @param strUserID
     *            ユーザID
     * @param strLearner
     *            学習者フラグ
     * @param response
     *            HTTPレスポンス
     * @return ソート結果のHTML
     */
    public BaseDisplayData[] sortSubGroupUserList(String strTreePath,
            String strHideTreePath, String strParentID, String strUserID,
            String strLearner, int intSortField, int intSortType, boolean sort)
            throws Exception
    {

        BaseSort objSort = null;
        if (sort)
        {
            objSort = new BaseSort(intSortField, intSortType);
        }

        StringBuffer strBufTemp = new StringBuffer();

        // 画面表示データクラス配列
        BaseDisplayData[] objDisplayList = new BaseDisplayData[0];

        // 隠しツリーパスが設定されている場合はツリーパスの最後尾のIDの
        // 配下を取得する。
        if (!strHideTreePath.equals(""))
        {

            String strLastParentID = ShowCommon
                    .getLastParentID(strHideTreePath);
            XMSBaseClient objBase = new XMSBaseClient();

            // 詳細表示データの取得を行います
            // 検索処理
            if (objBase.selectGroupAndPeopleBaseDisplay(strParentID))
            {
                // 検索がうまくいった場合
                objDisplayList = objBase.getBaseDisplay();
            }
            else
            {
                // 検索失敗
                throw new Exception(objBase.getMessage());
            }
        }
        // ルートユーザの場合はルートグループ(GR000000) の直下を表示する。
        else if (strUserID.equals(XMOPropertyDef.ROOT_USER))
        {
            // ルートコンテナ(GR000000)直下の検索を行います
            XMSBaseClient objBase = new XMSBaseClient();

            // 検索処理
            if (objBase
                    .selectGroupAndPeopleBaseDisplay(XMOPropertyDef.ROOT_GROUPID))
            {
                objDisplayList = objBase.getBaseDisplay();
            }
            else
            {
                // 検索に失敗した場合は、エラーを投げる
                throw new Exception(objBase.getMessage());
            }
        }
        else
        {

            // スーパユーザ以外はロールトップを表示する
            // アサイントップの検索はXMSBaseClient の searchRootGroupList メソッドを使用する。

            XMSBaseClient objXms = new XMSBaseClient();

            // ルートLOリスト検索処理(管理アサインされているものを検索)
            if (!objXms.searchRootGroupList(strUserID)) { throw new XMOException(
                    objXms.getMessageData()); }

            // 検索がうまくいった場合
            GroupsData[] objGroupsList = objXms.getRootGroupList();

            // 画面表示オブジェクト配列を適切な長さにする
            objDisplayList = new BaseDisplayData[objGroupsList.length];

            for (int i = 0; i < objDisplayList.length; i++)
            {
                GroupsData objGroups = objGroupsList[i];

                // 画面表示オブジェクトをインスタンス化する
                BaseDisplayData objDisplay = new BaseDisplayData();

                // グループ名設定
                objDisplay.setTitle(objGroups.getGroupName());
                // コメント設定
                objDisplay.setDescription(objGroups.getCustomMsgDir());
                // ID設定
                objDisplay.setID(objGroups.getGroupID());
                // グループタイプ設定
                objDisplay.setType(objGroups.getGroupType());

                // 画面表示オブジェクトリストのi番目に参照を代入
                objDisplayList[i] = objDisplay;
            }
        }

        // ソート指定ありの場合は、
        // 画面表示オブジェクトのソート処理を行う
        if (objSort != null)
        {
            objDisplayList = objSort.sort(objDisplayList);
        }

        //		// 画面表示用HTMLの組み立て
        //		for( int i = 0; i < objDisplayList.length; i++ ) {
        //			BaseDisplayData objDisplay = objDisplayList[i];
        //			String strTitle = objDisplay.getTitle();
        //			String strDescript = objDisplay.getDescription();
        //			String strId = objDisplay.getID();
        //			String strIconID = objDisplay.getType();
        //
        //			strBufTemp.append(stringHtml(strTitle, strDescript, strIconID, strId,
        // strParentID));
        //		}
        //
        //		return strBufTemp.toString();

        return objDisplayList;
    }

    /**
     * ソートの昇順・降順を入れ替えるメソッドです。
     * 
     * @param strSortName
     *            ｿｰﾄ要求ﾊﾟﾗﾒｰﾀ：名前
     * @param strComment
     *            ｿｰﾄ要求ﾊﾟﾗﾒｰﾀ：コメント
     * @param strSortFlag_Name
     *            昇順/降順判定ﾌﾗｸﾞ(名前)
     * @param strSortFlag_Comm
     *            昇順/降順判定ﾌﾗｸﾞ(ｺﾒﾝﾄ)
     */
    public ArrayList changeSortFlag(String strSortName, String strComment,
            String strSortFlag_Name, String strSortFlag_Comm)
    {
        return ShowCommon.changeSortFlag(strSortName, strComment,
                strSortFlag_Name, strSortFlag_Comm);
    }
    
    //	ADD 2005/03/24 START Koji Umehara [学習ToDo追加]
    //	ADD 2005/03/30 START Nobuyuki Umehara [Status追加]
    //  strStatus (0:未学習＋学習中 1:未学習 2:学習済み 3:すべて)
    public List getToDoList(String strParentID, String strUserID, String strStatus)
    	throws Exception
    {
    		// 検索処理
    		MethodClient objXmo = new MethodClient();
    		objXmo.setUserID( strUserID );	// ユーザーID
    		objXmo.setAssignFlag( true );	// アサインされているものを検索
    		objXmo.setAssignType( MethodClient.LEARN_TYPE );	// 学習権限を持つもののみ
    		objXmo.setWhereString( MethodClient.METHODLOID, "<>", "" );	// LOを持たないメソッドを除く
    		objXmo.setOrderBy( MethodClient.STARTDATE, true );		// 開始予定日付で昇順ソート
    		if( !objXmo.select() ) {
				throw new XMOException( objXmo.getMessageData() );
    		}

			// 検索結果の取得
    		MethodData[] objMethodList = objXmo.getResultList();
    	
            // 情報の付加
            ShowMethodChildrenBean showBean = new ShowMethodChildrenBean();
            showBean.makeRecordWithStatus(strParentID, strUserID, false, objMethodList, strStatus);
            List list = showBean.getRecordList();

            return list;
    }
    //	ADD 2005/03/24 END Koji Umehara [学習ToDo追加]
    //	MOD 2005/03/30 START Nobuyuki Umehara [学習ToDo追加]
    public int getToDoListPositionOfToday(List list, int nMaxRow)
    {
    	int nPos = -1;
    	
    	if (list == null)
    	{
    		return nPos;
    	}

		Date today = new Date( );
		long lToday = today.getTime();
		
    	for (int i=0; i < list.size(); i++)
    	{
    		ShowMethodChildrenRecordBean item = (ShowMethodChildrenRecordBean)list.get(i);
			long lStartDate = Date.parse(item.getStartDate());

			if (lToday >= lStartDate && nPos == -1)
			{
				nPos = i;
			}
    	}
    	
    	if (nPos >= 0)
    	{
	    	if ((nPos + nMaxRow/2) >= list.size())
	    	{
	    		nPos = list.size() - nMaxRow;
	    	}
	    	else if ((nPos - (nMaxRow/2)) > 0)
			{
				nPos = nPos - (nMaxRow/2);
			}
	    	else
	    	{
	    		nPos = 0;
			}
    	}
    	
    	return nPos;    
    }
}