var Filter = {
   VERSION:'1.3.0',

   TAG_ENCODE : /(<[^>]+>)/,
   TAG_DECODE : /(<[^>]+>)/,

   URL : /([^\"])((ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?)/,

   Paragraph : function(str) {
      var paras = str.strip().split(/\n\n+/);
      var ret = '';
      $A(paras).each(function(p) {
         ret += '<p>'+p.gsub(/\n/,'<br />')+'</p>';
      });
      return ret;
   },
   Autolink : function(str) {
      str = ' '+str + ' ';
      var ret = str
         .gsub(Filter.TAG_ENCODE,' #{1} ')
         .gsub(Filter.URL, '#{1}<span class="filter-reserved0">#{2}</span>')
         .gsub(Filter.TAG_DECODE,'#{1}');
//       alert(ret);
      return ret;
   },
   Proc : function(str) {
      new Insertion.Bottom(document.body,'<div id="filter-reserved1"></div>');
      var tmp = $('filter-reserved1');
      tmp.innerHTML = str;
      var elems = tmp.getElementsByClassName('filter-reserved0');
      $A(elems).each(function(elem) {
         var param = new Object()
         var url = elem.innerHTML;
         var ext = url.substr(url.lastIndexOf('.')+1);
         var has_param = ext.indexOf('?');
         if(has_param > 0) {
            var paramstr = ext.substr(has_param+1);
            ext = ext.substr(0,has_param);
            param = paramstr.unescapeHTML().toQueryParams();
         }
         var func = Filter[ext.toLowerCase()];
         param.element = elem;
         if(!func) {
            var e = Filter.validateURL(param);
            if(e == null) return;
            new Insertion.After(elem,e);
         }
         else new Insertion.After(elem,func(param));
         elem.remove();
      });
      var ret = tmp.innerHTML;
      tmp.remove();
      return ret;
   },
   
   validateURL:function(p) {
      // youtube
      var changed = false;
      var ret = p.element.innerHTML.gsub(/^.*youtube.*\?(.*)$/, function(m){
         var p = m[1].toQueryParams();
         changed = true;
         return '<object width="472" height="380"><param name="movie" value="http://www.youtube.com/v/'+p.v+'&hl=ja&fs=1&"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/'+p.v+'&hl=ja&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="472" height="380"></embed></object>';
         });
      return changed ? ret : new Template('<a href="#{url}" target="_blank">#{url}</a>').evaluate({url:p.element.innerHTML});
   },

   WITH_VIEWER : function(p) {
      p.url = p.element.innerHTML;
      p.width = p.width||640;
      p.height = p.height||480;
      p.name = (p.element.innerHTML == p.url) ? 'view the movie' : p.element.innerHTML;
      return new Template('<p class="filter-with-viewer"> <a href="javascript:void(0);" onclick="' +
                          'Viewer.open(\'#{url}\',#{width},#{height},\'#{bgcolor}\');">'+
                          '#{name}</a></p>').evaluate(p);
   },
   IMAGE : function(p) {
      p.url = p.element.innerHTML;
      return new Template('<img src="#{url}" />').evaluate(p);
   },
   _mp3_id : 0,
   mp3 : function(p) {
      p.url = p.element.innerHTML;
      p.width = p.width||200;
      p.height = p.height||15;
      var id = 'mp3player-'+Filter._mp3_id++;
      new Insertion.After(p.element, '<div id="'+id+'"></div>');
      swfobject.embedSWF("/ui/mp3.swf", id, p.width, p.height, "9", null, {url:p.url});
      return '';
   },

   flv : function(p) { return Filter.WITH_VIEWER(p); },
   swf : function(p) { return Filter.WITH_VIEWER(p); },
   jpg : function(p) { return Filter.IMAGE(p); },
   jpeg : function(p) { return Filter.IMAGE(p); },
   gif : function(p) { return Filter.IMAGE(p); },
   png : function(p) { return Filter.IMAGE(p); },

   pre : function(p) {
      var url = p.element.innerHTML;
      var areq = new AjaxRequest(url,null,null,true);
      p.element.insert({ after : '<div id="pre-'+areq.id+'"></div>'});
      areq.setHandler('onSuccess',function(res) {
         $('pre-'+areq.id).insert('<pre>'+res.escapeHTML()+'</pre>');
      });
      areq.send(null,'get');
      return '';
   },
   blockquote : function(p) {
      var url = p.element.innerHTML;
      var areq = new AjaxRequest(url,null,null,true);
      p.element.insert({ after : '<div id="blockquote-'+areq.id+'"></div>'});
      areq.setHandler('onSuccess',function(res) {
         $('blockquote-'+areq.id).insert('<blockquote>'+res.escapeHTML()+'</blockquote>');
      });
      areq.send(null,'get');
      return '';
   }

};
