package org.itscool.stylist.io;

import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;

import org.itscool.stylist.tag.HtmlTag;

/**
 * XHTMLに含まれるテキスト情報を応答データに変換します
 * @author kano
 * @version 1.00A 2006/08/09 新規作成
 */
public class HtmlCdataConverter extends HtmlTextConverter {
    
//    /**
//     * インスタンスの初期化を行います
//     * @param context ServletContextインスタンス
//     * @param req HttpServletRequestインスタンス
//     */
//    public HtmlCdataConverter(ServletContext context, HttpServletRequest req) {
//        super(context, req);
//    }
    
    /**
     * 応答用のXHTMLデータの作成を開始します
     * @param node HtmlTagインスタンス
     * @return 応答データ
     */
    public String convert(HtmlTag node, String tab) {
        String data;
        StringBuffer sb = new StringBuffer("//<![CDATA[");
        //EL式とテキストに分解
        ArrayList tagList = parseEl(node.getTagName());
        //EL式の展開を行う
        data = parseText(tagList);
        //パス情報の変換
        data = replacePath(data);
            
        sb.append(LINE).append(data);
        int size = node.size();
        for(int i=0; i<size; i++ ){
            HtmlTag child = (HtmlTag)node.get(i);
//			sb.append(super.convert(child, tab + "  "));
            sb.append(super.convert(child, tab));
        }
        sb.append("]]>");
        sb.append(LINE);
        return sb.toString();
    }
    
    public String replacePath(String dstStr){
        String replace = "\""+req.getContextPath() + "/";
        Pattern pattern;
        Matcher matcher;
        StringBuffer criteria = new StringBuffer();
        criteria.append("open\\s*\\(\\s*\"POST\"\\s*,\\s*\".*\\)\\;");
        criteria.append("|open\\s*\\(\\s*\"GET\"\\s*,\\s*\".*\\)\\;");
//        criteria.append("<a.*href\\s*=\\s*\".*\"");
//        criteria.append("|<img.*src\\s*=\\s*\".*\"");
//        criteria.append("|<link.*src\\s*=\\s*\".*\"");
//        criteria.append("|<link.*href\\s*=\\s*\".*\"");
//        criteria.append("|<script.*src\\s*=\\s*\".*\"");
//        criteria.append("|<.*background\\s*=\\s*\".*\"");
//        criteria.append("|<form.*action\\s*=\\s*\".*\"");
        
        pattern = Pattern.compile(criteria.toString());
        matcher = pattern.matcher(dstStr);
        StringBuffer sb = new StringBuffer();
        while (matcher.find()) {
            StringBuffer sb2 = new StringBuffer();
            String element = matcher.group();
            System.out.println("group:"+element);
            boolean flg = false;
            Pattern pattern2 = Pattern.compile("\"\\./");
            Matcher matcher2 = pattern2.matcher(element);
            while( matcher2.find() ){
                String path = matcher2.group();
//                System.out.println(path);
                
                matcher2.appendReplacement(sb2, replace);
                flg = true;
            }
            matcher2.appendTail(sb2);
            String tag = sb2.toString();
            if( flg == true){
                tag = supressPath(tag);
            }
//            System.out.println("tag:"+tag);
//            System.out.println(sb2.toString());
            matcher.appendReplacement(sb, tag);
        }
        matcher.appendTail(sb);
        return sb.toString();
    }
    
    public static String supressPath(String tag){
        Pattern pattern;
        Matcher matcher;
        
        pattern = Pattern.compile("\\.\\./");
        matcher = pattern.matcher(tag);
        StringBuffer sb = new StringBuffer();
        while (matcher.find()) {
            matcher.appendReplacement(sb, "");
        }
        matcher.appendTail(sb);
        return sb.toString();
    }
}
