package org.itscool.stylist.tag;

import java.util.ArrayList;
import java.util.LinkedList;

/**
 * HTMLのタグ情報を管理するクラス
 * @version 1.00A 2006/04/11 kano
 */
public class HtmlTag extends LinkedList{
    public static final String TEXT="#text";
    public static final String COMMENT="#comment";
    public static final String TAG_TEXTAREA="textarea";
    public static final String TAG_SELECT="select";
    public static final String TAG_HTML="html";
    public static final String TAG_HEAD="head";
    public static final String TAG_TITLE="title";
    public static final String TAG_SCRIPT="script";
    public static final String TAG_STYLE="style";
    public static final String TAG_BODY="body";
    
    public static final String KIND_TAG = "tag";
    public static final String KIND_SIMPLE_TAG = "simple";
    public static final String KIND_COMMENT = "comment";
    public static final String KIND_TEXT = "text";
    public static final String KIND_ITERATE = "iterate";
    public static final String KIND_EQUAL = "equal";
    public static final String KIND_NOTEQUAL = "neq";
    public static final String KIND_MOREEQUAL = "meq";
    public static final String KIND_LESSEQUAL = "leq";
    public static final String KIND_MORETHAN = "mthan";
    public static final String KIND_LESSTHAN = "lthan";
    public static final String KIND_MATCH = "match";
    public static final String KIND_NOMATCH = "nmatch";
    public static final String KIND_ISNULL = "isnull";
    public static final String KIND_ISNOTNULL = "isnotnull";
    public static final String KIND_WRITE = "write";
    public static final String KIND_DISPLAY_ERROR = "error";
    public static final String KIND_INCLUDE = "include";
    public static final String KIND_CDATA="cdata";
    
    /**
     * 親タグ情報
     */
    protected HtmlTag   parent;
    
    /**
     * 属性リスト
     */
    protected ArrayList attributeList = new ArrayList();
    
    /**
     * タグ名
     */
    protected String tagName;
    
    /**
     * タグ種別
     */
    protected String tagKind;
    
    /**
     * HTMLのノード情報をString形式で取得します
     * @param floor ノードの階層
     * @param tab 階層毎のTAB
     * @return HTMLのノード情報
     */
    public String toString(int floor, String tab){
        String line = System.getProperty("line.separator");
        StringBuffer sb = new StringBuffer();
        
        sb.append(floor + " : ");
        if(tagKind.equals(KIND_TAG)){
            sb.append("[B_TAG]   |");
        }else if( tagKind.equals(KIND_SIMPLE_TAG)){
            sb.append("[S_TAG]   |");
        }else if( tagKind.equals(KIND_COMMENT)){
            sb.append("[COMMENT] |");
        }else if( tagKind.equals(KIND_ITERATE)){
            sb.append("[ITERATE] |");
        }else if( tagKind.equals(KIND_EQUAL)){
            sb.append("[EQUAL]   |");
        }else if( tagKind.equals(KIND_MOREEQUAL)){
            sb.append("[MORE_EQ] |");
        }else if( tagKind.equals(KIND_LESSEQUAL)){
            sb.append("[LESS_EQ] |");
        }else if( tagKind.equals(KIND_MORETHAN)){
            sb.append("[M_THAN]  |");
        }else if( tagKind.equals(KIND_LESSTHAN)){
            sb.append("[L_THAN]  |");
        }else if( tagKind.equals(KIND_ISNULL)){
            sb.append("[ISNULL]  |");
        }else if( tagKind.equals(KIND_ISNOTNULL)){
            sb.append("[ISNOTNULL]|");
        }else if( tagKind.equals(KIND_TEXT)){
            sb.append("[TEXT]    |");
        }else if( tagKind.equals(KIND_WRITE)){
            sb.append("[WRITE]   |");
        }else if( tagKind.equals(KIND_DISPLAY_ERROR)){
            sb.append("[ERROR]   |");
        }else if( tagKind.equals(KIND_INCLUDE)){
            sb.append("[INCLUDE] |");
        }else if( tagKind.equals(KIND_CDATA)){
            sb.append("[CDATA]   |");
        }else{
            sb.append("[FAITAL]  |");
        }
        sb.append(tab).append(tagName);
        int attrSize = attributeList.size();
        if( attrSize > 0){
            sb.append(" ( ");
        }
        for( int i=0; i<attrSize; i++ ){
            HtmlAttribute attr = (HtmlAttribute)attributeList.get(i);
            sb.append(attr.getName());
            sb.append("=");
            sb.append(attr.getValue());
            sb.append(" ");
            
        }
        if( attrSize > 0){
            sb.append(")");
        }
        sb.append(line);
        int nodeSize = this.size();
        for( int i=0; i<nodeSize; i++){
            HtmlTag child = (HtmlTag)this.get(i);
            sb.append(child.toString(floor+1, tab+"  "));
        }
        return sb.toString();
    }
    
    /**
     * ノード情報に子ノード情報を追加します
     * @param node 子ノード情報
     */
    public void addHtmlNode(HtmlTag node){
        this.add(node);
    }
    
    /**
     * ノード情報にタグの属性情報を追加します
     * @param attr タグの属性情報
     */
    public void addAttribute(HtmlAttribute attr){
        attributeList.add(attr);
    }
    
    /**
     * 属性情報の一覧を取得します
     * @return ArrayList 属性情報の一覧
     */
    public ArrayList getAttributeList() {
        return attributeList;
    }
    
    /**
     * 属性情報の一覧をセットします
     * @param attributeList 属性情報の一覧
     */
    public void setAttributeList(ArrayList attributeList) {
        this.attributeList = attributeList;
    }
    
    /**
     * タグ種別を取得します
     * @return String タグ種別
     */
    public String getTagKind() {
        return tagKind;
    }
    
    /**
     * タグ種別を設定します
     * @param tagKind タグ種別
     */
    public void setTagKind(String tagKind) {
        this.tagKind = tagKind;
    }
    
    /**
     * タグ名称を取得します
     * @return String タグ名称
     */
    public String getTagName() {
        return tagName;
    }
    
    /**
     * タグ名称を設定します
     * @param tagName タグ名称
     */
    public void setTagName(String tagName) {
        this.tagName = tagName;
    }
    
    /**
     * 指定された名前の属性値を文字列で取得します
     * @param name 属性の名前
     * @return 属性の値
     */
    public String getAttribute(String name){
        int size = attributeList.size();
        for(int i=0; i<size; i++){
            HtmlAttribute attr = (HtmlAttribute)attributeList.get(i);
            if(attr.getName().equals(name)){
                return attr.getValue();
            }
        }
        return null;
    }
    
    /**
     * 指定された名前の属性値を文字列で取得します
     * @param name 属性の名前
     * @return 属性の値
     */
    public HtmlAttribute getHtmlAttribute(String name){
        int size = attributeList.size();
        for(int i=0; i<size; i++){
            HtmlAttribute attr = (HtmlAttribute)attributeList.get(i);
            if(attr.getName().equals(name)){
                return attr;
            }
        }
        return null;
    }
    
    /**
     * 親タグ情報を取得します
     * @return 親タグ情報
     */
    public HtmlTag getParent() {
        return parent;
    }
    
    /**
     * 親タグ情報をセットします
     * @param parent 親タグ情報
     */
    public void setParent(HtmlTag parent) {
        this.parent = parent;
    }
    
}