commit 99386c3dff4764b1c5841ba9cf34d43f110b028b Author: unknown Date: Mon May 21 23:31:43 2012 +0800 sdfsd diff --git a/.project b/.project new file mode 100644 index 0000000..175ad28 --- /dev/null +++ b/.project @@ -0,0 +1,11 @@ + + + comet4j + + + + + + + + diff --git a/.svn/entries b/.svn/entries new file mode 100644 index 0000000..48082f7 --- /dev/null +++ b/.svn/entries @@ -0,0 +1 @@ +12 diff --git a/.svn/format b/.svn/format new file mode 100644 index 0000000..48082f7 --- /dev/null +++ b/.svn/format @@ -0,0 +1 @@ +12 diff --git a/.svn/pristine/00/005ada82457aba800fe1950d21dec417960046bf.svn-base b/.svn/pristine/00/005ada82457aba800fe1950d21dec417960046bf.svn-base new file mode 100644 index 0000000..e94d4df --- /dev/null +++ b/.svn/pristine/00/005ada82457aba800fe1950d21dec417960046bf.svn-base @@ -0,0 +1,105 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.event.demo.mic; + +import org.comet4j.event.Event; +import org.comet4j.event.Listener; +import org.comet4j.event.Observable; + +public class Test { + + // 用法展示:微观事件模式 + public class SpeakEvent extends Event { + + public String words = ""; + + public SpeakEvent(Person target, String aWords) { + super(target); + words = aWords; + } + } + + public abstract class SpeakListener extends Listener { + + } + + public class GoEvent extends Event { + + public String where = ""; + + public GoEvent(Person target, String where) { + super(target); + this.where = where; + } + } + + public abstract class GoListener extends Listener { + + } + + @SuppressWarnings({ + "unchecked", "rawtypes" + }) + public class Person extends Observable { + + public Person() { + this.addEvent(SpeakEvent.class); + this.addEvent(GoEvent.class); + } + + public void say(String aWords) { + SpeakEvent e = new SpeakEvent(this, aWords); + if (!this.fireEvent(e)) { + return; + } + System.out.println("say:" + aWords); + } + + public void go(String anPlace) { + GoEvent e = new GoEvent(this, anPlace); + if (!this.fireEvent(e)) { + return; + } + System.out.println("go:" + anPlace); + } + } + + /** + * @param args + */ + public static void main(String[] args) { + new Test().run(); + + } + + @SuppressWarnings("unchecked") + public void run() { + Person person = new Person(); + person.addListener(SpeakEvent.class, new SpeakListener() { + + @Override + public boolean handleEvent(SpeakEvent anEvent) { + // anEvent.stopEvent(); + System.out.println("One person want to say:" + anEvent.words); + return true; + } + + }); + person.addListener(GoEvent.class, new GoListener() { + + @Override + public boolean handleEvent(GoEvent anEvent) { + // anEvent.stopEvent(); + System.out.println("One person want to go:" + anEvent.where); + return true; + } + + }); + person.say("Hello world!"); + person.go("Home!"); + } + +} diff --git a/.svn/pristine/01/0105fc0ee547eb0cf19082dae88cd6443defc26b.svn-base b/.svn/pristine/01/0105fc0ee547eb0cf19082dae88cd6443defc26b.svn-base new file mode 100644 index 0000000..7203f73 --- /dev/null +++ b/.svn/pristine/01/0105fc0ee547eb0cf19082dae88cd6443defc26b.svn-base @@ -0,0 +1,113 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.util; + +import java.io.IOException; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; + +/** + * 过滤器 + */ +public class CharacterEncodingFilter implements Filter { + + /** + * 对 HttpServletRequestWrapper 进行扩充, 不影响原来的功能并能提供所有的 HttpServletRequest + * 接口中的功能. 它可以统一的对 Tomcat 默认设置下的中文问题进行解决而只需要用新的 Request 对象替换页面中的 request + * 对象即可. + */ + protected String encoding = null; + protected FilterConfig filterConfig = null; + + // protected boolean ignore = true; + + public void destroy() { + this.encoding = null; + this.filterConfig = null; + } + + class Request extends HttpServletRequestWrapper { + + public Request(HttpServletRequest request) { + super(request); + } + + /** + * 转换由表单读取的数据的内码. 从 ISO 字符转到 utf-8(或gbk). + */ + public String toChi(String input) { + try { + + byte[] bytes = input.getBytes("ISO-8859-1"); + return new String(bytes, encoding); + } catch (Exception ex) { + } + return null; + } + + /** + * Return the HttpServletRequest holded by this object. + */ + private HttpServletRequest getHttpServletRequest() { + return (HttpServletRequest) super.getRequest(); + } + + /** + * 读取参数 -- 修正了中文问题. + */ + @Override + public String getParameter(String name) { + return toChi(getHttpServletRequest().getParameter(name)); + } + + /** + * 读取参数列表 - 修正了中文问题. + */ + @Override + public String[] getParameterValues(String name) { + String values[] = getHttpServletRequest().getParameterValues(name); + if (values != null) { + for (int i = 0; i < values.length; i++) { + values[i] = toChi(values[i]); + } + } + return values; + } + } + + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, + ServletException { + + HttpServletRequest httpreq = (HttpServletRequest) request; + if (httpreq.getMethod().equals("POST")) { + request.setCharacterEncoding(encoding); + } else { + request = new Request(httpreq); + } + + chain.doFilter(request, response); + + } + + /** + * Place this filter into service. + * @param filterConfig The filter configuration object + */ + public void init(FilterConfig filterConfig) throws ServletException { + + this.filterConfig = filterConfig; + this.encoding = filterConfig.getInitParameter("encoding"); + + } + +} diff --git a/.svn/pristine/01/012efd8f96ee4c40499dd2bfca8304df7467216a.svn-base b/.svn/pristine/01/012efd8f96ee4c40499dd2bfca8304df7467216a.svn-base new file mode 100644 index 0000000..669f3cf Binary files /dev/null and b/.svn/pristine/01/012efd8f96ee4c40499dd2bfca8304df7467216a.svn-base differ diff --git a/.svn/pristine/01/014107a58ed069f8c2bca73fefb706cd0d230564.svn-base b/.svn/pristine/01/014107a58ed069f8c2bca73fefb706cd0d230564.svn-base new file mode 100644 index 0000000..eb1e6b3 --- /dev/null +++ b/.svn/pristine/01/014107a58ed069f8c2bca73fefb706cd0d230564.svn-base @@ -0,0 +1 @@ +服务端事件监视器,监视服务器组件的事件是否正确触发。 \ No newline at end of file diff --git a/.svn/pristine/03/03fe8f5a132948941eaadf3791001c39e03df9e8.svn-base b/.svn/pristine/03/03fe8f5a132948941eaadf3791001c39e03df9e8.svn-base new file mode 100644 index 0000000..0160f97 Binary files /dev/null and b/.svn/pristine/03/03fe8f5a132948941eaadf3791001c39e03df9e8.svn-base differ diff --git a/.svn/pristine/07/07283854c136d50597de8e01db42fc4637f7305b.svn-base b/.svn/pristine/07/07283854c136d50597de8e01db42fc4637f7305b.svn-base new file mode 100644 index 0000000..9497c9e --- /dev/null +++ b/.svn/pristine/07/07283854c136d50597de8e01db42fc4637f7305b.svn-base @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.svn/pristine/07/074eda992155b4411d4d7d1dbde08d678d028248.svn-base b/.svn/pristine/07/074eda992155b4411d4d7d1dbde08d678d028248.svn-base new file mode 100644 index 0000000..09405c7 Binary files /dev/null and b/.svn/pristine/07/074eda992155b4411d4d7d1dbde08d678d028248.svn-base differ diff --git a/.svn/pristine/07/0771341a4722e8644e91120da127fe3781d1294b.svn-base b/.svn/pristine/07/0771341a4722e8644e91120da127fe3781d1294b.svn-base new file mode 100644 index 0000000..2d3a823 Binary files /dev/null and b/.svn/pristine/07/0771341a4722e8644e91120da127fe3781d1294b.svn-base differ diff --git a/.svn/pristine/07/07bb05808cfa5b9c6a8b8577a7d8782ffe8970f1.svn-base b/.svn/pristine/07/07bb05808cfa5b9c6a8b8577a7d8782ffe8970f1.svn-base new file mode 100644 index 0000000..d82c337 Binary files /dev/null and b/.svn/pristine/07/07bb05808cfa5b9c6a8b8577a7d8782ffe8970f1.svn-base differ diff --git a/.svn/pristine/08/0806bc00d5eb3948773c20f9809c66f78bb8352b.svn-base b/.svn/pristine/08/0806bc00d5eb3948773c20f9809c66f78bb8352b.svn-base new file mode 100644 index 0000000..d84f41a Binary files /dev/null and b/.svn/pristine/08/0806bc00d5eb3948773c20f9809c66f78bb8352b.svn-base differ diff --git a/.svn/pristine/08/086031e238836160d5e4d11920e33e453c6b9cbc.svn-base b/.svn/pristine/08/086031e238836160d5e4d11920e33e453c6b9cbc.svn-base new file mode 100644 index 0000000..f8ff7b8 Binary files /dev/null and b/.svn/pristine/08/086031e238836160d5e4d11920e33e453c6b9cbc.svn-base differ diff --git a/.svn/pristine/09/0903b1bd045ffdbe0182fd684558658413e887d6.svn-base b/.svn/pristine/09/0903b1bd045ffdbe0182fd684558658413e887d6.svn-base new file mode 100644 index 0000000..099b90d Binary files /dev/null and b/.svn/pristine/09/0903b1bd045ffdbe0182fd684558658413e887d6.svn-base differ diff --git a/.svn/pristine/09/09302386573c7025657ac25b79ae418a800c657c.svn-base b/.svn/pristine/09/09302386573c7025657ac25b79ae418a800c657c.svn-base new file mode 100644 index 0000000..9810aca Binary files /dev/null and b/.svn/pristine/09/09302386573c7025657ac25b79ae418a800c657c.svn-base differ diff --git a/.svn/pristine/09/09e1679a9db14cab9fe6ed3e184accc05d2a7a2c.svn-base b/.svn/pristine/09/09e1679a9db14cab9fe6ed3e184accc05d2a7a2c.svn-base new file mode 100644 index 0000000..aa0d0ed Binary files /dev/null and b/.svn/pristine/09/09e1679a9db14cab9fe6ed3e184accc05d2a7a2c.svn-base differ diff --git a/.svn/pristine/0a/0a2b0bc935bf653f6b7010eced1e2ca8dbecc799.svn-base b/.svn/pristine/0a/0a2b0bc935bf653f6b7010eced1e2ca8dbecc799.svn-base new file mode 100644 index 0000000..85f66b1 Binary files /dev/null and b/.svn/pristine/0a/0a2b0bc935bf653f6b7010eced1e2ca8dbecc799.svn-base differ diff --git a/.svn/pristine/0b/0b2ccb38837849fe75ce7cee23843d92522b0956.svn-base b/.svn/pristine/0b/0b2ccb38837849fe75ce7cee23843d92522b0956.svn-base new file mode 100644 index 0000000..6ea4c38 Binary files /dev/null and b/.svn/pristine/0b/0b2ccb38837849fe75ce7cee23843d92522b0956.svn-base differ diff --git a/.svn/pristine/0b/0b79d2c11d9ef82afd725c337190bf2fc0ecdbed.svn-base b/.svn/pristine/0b/0b79d2c11d9ef82afd725c337190bf2fc0ecdbed.svn-base new file mode 100644 index 0000000..8134e49 Binary files /dev/null and b/.svn/pristine/0b/0b79d2c11d9ef82afd725c337190bf2fc0ecdbed.svn-base differ diff --git a/.svn/pristine/0b/0b85e5061c456f84b61d425f26e7a7b7e7d62a9f.svn-base b/.svn/pristine/0b/0b85e5061c456f84b61d425f26e7a7b7e7d62a9f.svn-base new file mode 100644 index 0000000..07be08c --- /dev/null +++ b/.svn/pristine/0b/0b85e5061c456f84b61d425f26e7a7b7e7d62a9f.svn-base @@ -0,0 +1,104 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.event; + +import java.util.ArrayList; +import java.util.List; + +/** + * 事件源 一个事件源代一个事件种类,并管理这种事件的侦听。 职责:对于侦听的管理和执行 + * @author xiaojinghai@kedacom.com + */ +@SuppressWarnings("rawtypes") +public class EventSource> { + + protected List listeners = new ArrayList(); + + public EventSource() { + + } + + /** + * 触发所有侦听函数 + * @param anEvent + * @return + */ + public boolean fire(E anEvent) { + synchronized (listeners) { + for (int i = listeners.size() - 1; i >= 0; i--) { + L listener = listeners.get(i); + if (anEvent.hasStoped()) { + return false; + } + if (anEvent.hasPreventDefault()) { + break; + } + if (!listener.handleEvent(anEvent)) { // 等同于hasStoped + return false; + } + } + } + return anEvent.hasStoped() ? false : true; + } + + /** + * 添加侦听函数 + * @param aListener + */ + public void addListener(L aListener) { + synchronized (listeners) { + listeners.add(aListener); + } + + } + + /** + * 删除指定的侦听函数 + * @param aListener + */ + public void removeListener(L aListener) { + synchronized (listeners) { + listeners.remove(aListener); + } + + } + + /** + * 删除所有侦听 + */ + public void removeAllListeners() { + synchronized (listeners) { + listeners.clear(); + } + } + + /** + * 得到某个侦听函数 + * @param aListener + * @return + */ + public L getListener(L aListener) { + for (L l : listeners) { + if (l == aListener) { + return l; + } + } + return null; + } + + /** + * 获取所有侦听函数 + * @return + */ + public List getListeners() { + return listeners; + } + + public void destroy() { + removeAllListeners(); + listeners = null; + } +} diff --git a/.svn/pristine/0b/0be8133c7574d78dbf64adf12349d0189075ca7b.svn-base b/.svn/pristine/0b/0be8133c7574d78dbf64adf12349d0189075ca7b.svn-base new file mode 100644 index 0000000..6fdfd5e --- /dev/null +++ b/.svn/pristine/0b/0be8133c7574d78dbf64adf12349d0189075ca7b.svn-base @@ -0,0 +1,39 @@ + + + + + + +ChatDemo + + + + + + +
+连接状态:; +连接数量:; +已用内存:; +可用内存:; +内存容量:; +最大容量:; +系统已运行: +
+ +
+
+ +
+请输入: + + +
+ +
+ 请输入昵称: + +
+ + + diff --git a/.svn/pristine/0c/0c6c2b2a2894086dab10144b9cfb5cf95af19580.svn-base b/.svn/pristine/0c/0c6c2b2a2894086dab10144b9cfb5cf95af19580.svn-base new file mode 100644 index 0000000..859ab1b --- /dev/null +++ b/.svn/pristine/0c/0c6c2b2a2894086dab10144b9cfb5cf95af19580.svn-base @@ -0,0 +1,73 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core; + +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.catalina.CometEvent; +import org.apache.catalina.CometProcessor; + +/** + * 连接前端Servlet,负责处理连接请求,并转交给引擎处理。 + */ +public class CometServletTomcat6 extends HttpServlet implements CometProcessor { + + private static final long serialVersionUID = 1L; + + public CometServletTomcat6() { + super(); + } + + /* + * @see + * org.apache.catalina.CometProcessor#event(org.apache.catalina.CometEvent) + */ + public void event(CometEvent event) throws IOException, ServletException { + HttpServletRequest request = event.getHttpServletRequest(); + HttpServletResponse response = event.getHttpServletResponse(); + // request.setAttribute("org.apache.tomcat.comet.timeout", + // CometContext.getInstance().getTimeout()); + + if (event.getEventType() == CometEvent.EventType.BEGIN) { + event.setTimeout(CometContext.getInstance().getTimeout()); + String action = request.getParameter(CometProtocol.FLAG_ACTION); + if (CometProtocol.CMD_CONNECT.equals(action)) { + CometContext.getInstance().getEngine().connect(request, response); + event.close(); + } else if (CometProtocol.CMD_REVIVAL.equals(action)) { + CometContext.getInstance().getEngine().revival(request, response); + } else if (CometProtocol.CMD_DROP.equals(action)) { + CometContext.getInstance().getEngine().drop(request, response); + event.close(); + } + } else if (event.getEventType() == CometEvent.EventType.ERROR) { + if (event.getEventSubType() == CometEvent.EventSubType.TIMEOUT) { + CometContext.getInstance().getEngine().dying(request, response); + event.close(); + } else { + CometContext.getInstance().getEngine().drop(request, response); + event.close(); + } + } else if (event.getEventType() == CometEvent.EventType.END) { + CometContext.getInstance().getEngine().dying(request, response); + event.close(); + } else if (event.getEventType() == CometEvent.EventType.READ) { + event.close(); + } + + } + + @Override + public void destroy() { + super.destroy(); + } + +} diff --git a/.svn/pristine/0c/0c725861fceff1a784cd8a900dd7669c84114710.svn-base b/.svn/pristine/0c/0c725861fceff1a784cd8a900dd7669c84114710.svn-base new file mode 100644 index 0000000..8fb3c64 --- /dev/null +++ b/.svn/pristine/0c/0c725861fceff1a784cd8a900dd7669c84114710.svn-base @@ -0,0 +1,83 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core; + +/** + * 用于封装向客户端发送信息的数据格式 + */ + +public class CometMessage { + + /** 应用模块标识 */ + private String channel; + private long time;// 发送时间 + private Object data;// 包含数据 + + public CometMessage(Object anData, String aChannel) { + data = anData; + channel = aChannel; + time = System.currentTimeMillis(); + } + + /** + * 获取发送时间 + * @return + */ + + public long getTime() { + return time; + } + + /** + * 设置发送时间 + * @param time + */ + + public void setTime(long time) { + this.time = time; + } + + /** + * 获取被发送数据 + * @return + */ + + public Object getData() { + return data; + } + + /** + * 设置被发送数据 + * @param data + */ + + public void setData(Object data) { + this.data = data; + } + + /** + * 获取通道标识 + * @return + */ + + public String getChannel() { + return channel; + } + + /** + * 设置通道标识 + * @param channel + */ + + public void setChannel(String channel) { + this.channel = channel; + } + + public void destroy() { + data = null; + } + +} diff --git a/.svn/pristine/0c/0c9a20b7eb1ac789f4f4f2a5bd82b6421d106b8f.svn-base b/.svn/pristine/0c/0c9a20b7eb1ac789f4f4f2a5bd82b6421d106b8f.svn-base new file mode 100644 index 0000000..36bb91d Binary files /dev/null and b/.svn/pristine/0c/0c9a20b7eb1ac789f4f4f2a5bd82b6421d106b8f.svn-base differ diff --git a/.svn/pristine/0d/0d19e9faa860eeb5a61bee4f8aa80ae858e52629.svn-base b/.svn/pristine/0d/0d19e9faa860eeb5a61bee4f8aa80ae858e52629.svn-base new file mode 100644 index 0000000..eae8e54 Binary files /dev/null and b/.svn/pristine/0d/0d19e9faa860eeb5a61bee4f8aa80ae858e52629.svn-base differ diff --git a/.svn/pristine/0d/0ddc84af0d5138e033409571d970a5478f0db09a.svn-base b/.svn/pristine/0d/0ddc84af0d5138e033409571d970a5478f0db09a.svn-base new file mode 100644 index 0000000..f946f21 --- /dev/null +++ b/.svn/pristine/0d/0ddc84af0d5138e033409571d970a5478f0db09a.svn-base @@ -0,0 +1,24 @@ +package org.comet4j.demo.eventmonitor; + +import org.comet4j.core.event.BeforeConnectEvent; +import org.comet4j.core.listener.BeforeConnectListener; + +/** + * (用一句话描述类的主要功能) + * @author xiaojinghai + * @date 2011-3-9 + */ + +public class BeforeConnectEventListener extends BeforeConnectListener { + + /* + * (non-Jsdoc) + * @see org.comet4j.event.Listener#handleEvent(org.comet4j.event.Event) + */ + @Override + public boolean handleEvent(BeforeConnectEvent anEvent) { + System.out.println("[BeforeConnectEvent]:"); + return true; + } + +} diff --git a/.svn/pristine/0f/0f19e23611f3d72c469b75568f1a37eafdda5a49.svn-base b/.svn/pristine/0f/0f19e23611f3d72c469b75568f1a37eafdda5a49.svn-base new file mode 100644 index 0000000..82da71b --- /dev/null +++ b/.svn/pristine/0f/0f19e23611f3d72c469b75568f1a37eafdda5a49.svn-base @@ -0,0 +1,38 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.event; + +import org.comet4j.core.CometConnection; +import org.comet4j.core.CometEngine; +import org.comet4j.event.Event; + +/** + * 连接复活事件对象 + */ + +public class RevivalEvent extends Event { + + private CometConnection conn; + + public RevivalEvent(CometEngine target, CometConnection anConn) { + super(target); + conn = anConn; + } + + public CometConnection getConn() { + return conn; + } + + public void setConn(CometConnection conn) { + this.conn = conn; + } + + @Override + public void destroy() { + super.destroy(); + conn = null; + } +} diff --git a/.svn/pristine/0f/0f887d15b1dd3638f179df3a3b4ae88ad314ee45.svn-base b/.svn/pristine/0f/0f887d15b1dd3638f179df3a3b4ae88ad314ee45.svn-base new file mode 100644 index 0000000..08abd82 Binary files /dev/null and b/.svn/pristine/0f/0f887d15b1dd3638f179df3a3b4ae88ad314ee45.svn-base differ diff --git a/.svn/pristine/0f/0fa08cc1fe9e2c7932ab6b41ce8dd16815852af3.svn-base b/.svn/pristine/0f/0fa08cc1fe9e2c7932ab6b41ce8dd16815852af3.svn-base new file mode 100644 index 0000000..b22cd14 Binary files /dev/null and b/.svn/pristine/0f/0fa08cc1fe9e2c7932ab6b41ce8dd16815852af3.svn-base differ diff --git a/.svn/pristine/10/10005711143ad804bd594b923e9f3d527af10610.svn-base b/.svn/pristine/10/10005711143ad804bd594b923e9f3d527af10610.svn-base new file mode 100644 index 0000000..72a4026 Binary files /dev/null and b/.svn/pristine/10/10005711143ad804bd594b923e9f3d527af10610.svn-base differ diff --git a/.svn/pristine/10/104a974a26584b9082ba02629e1d4faffd3e1d31.svn-base b/.svn/pristine/10/104a974a26584b9082ba02629e1d4faffd3e1d31.svn-base new file mode 100644 index 0000000..5ee373f --- /dev/null +++ b/.svn/pristine/10/104a974a26584b9082ba02629e1d4faffd3e1d31.svn-base @@ -0,0 +1,355 @@ +JS.ns("JS.HTTPStatus","JS.XMLHttpRequest"); +/** + * FC 2616 HTTP1.1规范的HTTP Status状态常量,详见 + * http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10 + * @author jinghai.xiao@gmail.com + */ +JS.HTTPStatus = { + //Informational 1xx + '100' : 'Continue', + '101' : 'Switching Protocols', + //Successful 2xx + '200' : 'OK', + '201' : 'Created', + '202' : 'Accepted', + '203' : 'Non-Authoritative Information', + '204' : 'No Content', + '205' : 'Reset Content', + '206' : 'Partial Content', + //Redirection 3xx + '300' : 'Multiple Choices', + '301' : 'Moved Permanently', + '302' : 'Found', + '303' : 'See Other', + '304' : 'Not Modified', + '305' : 'Use Proxy', + '306' : 'Unused', + '307' : 'Temporary Redirect', + //Client Error 4xx + '400' : 'Bad Request', + '401' : 'Unauthorized', + '402' : 'Payment Required', + '403' : 'Forbidden', + '404' : 'Not Found', + '405' : 'Method Not Allowed', + '406' : 'Not Acceptable', + '407' : 'Proxy Authentication Required', + '408' : 'Request Timeout', + '409' : 'Conflict', + '410' : 'Gone', + '411' : 'Length Required', + '412' : 'Precondition Failed', + '413' : 'Request Entity Too Large', + '414' : 'Request-URI Too Long', + '415' : 'Unsupported Media Type', + '416' : 'Requested Range Not Satisfiable', + '417' : 'Expectation Failed', + //Server Error 5xx + '500' : 'Internal Server Error', + '501' : 'Not Implemented', + '502' : 'Bad Gateway', + '503' : 'Service Unavailable', + '504' : 'Gateway Timeout', + '505' : 'HTTP Version Not Supported' +}; +JS.HTTPStatus.OK = 200; +JS.HTTPStatus.BADREQUEST = 400; +JS.HTTPStatus.FORBIDDEN = 403; +JS.HTTPStatus.NOTFOUND = 404; +JS.HTTPStatus.TIMEOUT = 408; +JS.HTTPStatus.SERVERERROR = 500; + +/** + * @class JS.XMLHttpRequest + * @extends JS.Observable + * 跨浏览器、事件驱动的XMLHTTPRequest对象,此对象完全兼容传统XMLHTTPRequest对象,在遵循 + * http://www.w3.org/TR/XMLHttpRequest/标准的前提下有所扩展。 + * @author jinghai.xiao@gmail.com + */ +JS.XMLHttpRequest = JS.extend(JS.Observable,{ + /** + * @cfg {Boolean} enableCache + * 是否启用缓存,默认为false + */ + enableCache : false, + /** + * @cfg {Number} timeout + * 请求超时毫秒数,默认为30000(30秒),设置为0则永不超时 + */ + timeout : 30000,//default never time out + /** + * 是否调用了abort方法 + * @property + * @type Boolean + */ + isAbort : false, + /** + * @cfg {String} specialXHR + * 指定一个特定的ActiveX对象名称用于取代XMLHTTPRequest对象,默认为空。 + */ + specialXHR : '',//指定使用特殊的xhr对象 + //propoty + _xhr : null, + //--------request propoty-------- + /** + * @property + * @type Number + */ + readyState : 0, + //--------response propoty-------- + /** + * @property + * @type Number + */ + status : 0, + /** + * @property + * @type String + */ + statusText : '', + /** + * @property + * @type String + */ + responseText : '', + /** + * @property + * @type DOM + */ + responseXML : null, + //private method + constructor : function(){ + var self = this; + this.addEvents([ + /** + * @event readyStateChange 当readyState发生变化 + * @param {Number} readyState + * @param {Number} status + * @param {JS.XMLHttpRequest} xhr + * @param {XMLHTTPRequest} realXhr 实际使用的XMLHTTPRequest对象 + */ + 'readyStateChange', + /** + * @event timeout 请求超时 + * @param {JS.XMLHttpRequest} xhr + * @param {XMLHTTPRequest} realXhr 实际使用的XMLHTTPRequest对象 + */ + 'timeout', + /** + * @event abort 主动取消 + * @param {JS.XMLHttpRequest} xhr + * @param {XMLHTTPRequest} realXhr 实际使用的XMLHTTPRequest对象 + */ + 'abort', + /** + * @event error 请求出错 + * @param {JS.XMLHttpRequest} xhr + * @param {XMLHTTPRequest} realXhr 实际使用的XMLHTTPRequest对象 + */ + 'error', + /** + * @event load 接收完毕 + * @param {JS.XMLHttpRequest} xhr + * @param {XMLHTTPRequest} realXhr 实际使用的XMLHTTPRequest对象 + */ + 'load', + /** + * @event progress 正在接收 + * @param {JS.XMLHttpRequest} xhr + * @param {XMLHTTPRequest} realXhr 实际使用的XMLHTTPRequest对象 + */ + 'progress' + ]); + JS.XMLHttpRequest.superclass.constructor.apply(this,arguments); + this._xhr = this.createXmlHttpRequestObject(); + this._xhr.onreadystatechange = function(){ + self.doReadyStateChange(); + }; + }, + //private + //超时任务 + timeoutTask : null, + //延迟执行超时任务(timeoutTask) + delayTimeout : function(){ + if(this.timeout){ + if(!this.timeoutTask){ + this.timeoutTask = new JS.DelayedTask(function(){ + //readyState=4已经停止,由doReadyStateChange来判断为何停止 + if(this._xhr.readyState != 4){ + this.fireEvent('timeout', this, this._xhr); + }else{ + this.cancelTimeout(); + } + },this); + } + this.timeoutTask.delay(this.timeout); + } + }, + //取消超时任务 + cancelTimeout : function(){ + if(this.timeoutTask){ + this.timeoutTask.cancel(); + } + }, + createXmlHttpRequestObject : function(){ + var activeX = [ + 'Msxml2.XMLHTTP.6.0', + 'Msxml2.XMLHTTP.5.0', + 'Msxml2.XMLHTTP.4.0', + 'Msxml2.XMLHTTP.3.0', + 'Msxml2.XMLHTTP', + 'Microsoft.XMLHTTP'], + xhr, + specialXHR = this.specialXHR; + if(specialXHR){//如果指定了xhr对象 + if(JS.isString(specialXHR)){ + return new ActiveXObject(specialXHR); + }else{ + return specialXHR; + } + } + try { + xhr = new XMLHttpRequest(); + } catch(e) { + for (var i = 0; i < activeX.length; ++i) { + try { + xhr = new ActiveXObject(activeX[i]); + break; + } catch(e) {} + } + } finally { + return xhr; + } + }, + //private + doReadyStateChange : function(){ + this.delayTimeout(); + var xhr = this._xhr; + try{ + this.readyState = xhr.readyState; + }catch(e){ + this.readyState = 0; + } + try{ + this.status = xhr.status; + }catch(e){ + this.status = 0; + } + try{ + this.statusText = xhr.statusText; + }catch(e){ + this.statusText = ""; + } + try { + this.responseText = xhr.responseText; + }catch(e){ + this.responseText = ""; + } + try { + this.responseXML = xhr.responseXML; + }catch(e){ + this.responseXML = null; + } + + this.fireEvent('readyStateChange',this.readyState, this.status, this, xhr ); + + if(this.readyState == 3 && (this.status >= 200 && this.status < 300)){ + this.fireEvent('progress', this, xhr); + } + + if(this.readyState == 4){ + this.cancelTimeout(); + var status = this.status ; + if(status == 0 || status == ""){ + this.fireEvent('error', this, xhr); + }else if(status >= 200 && status < 300){ + this.fireEvent('load', this, xhr); + }else if(status >= 400 && status != 408){ + this.fireEvent('error', this, xhr); + }else if(status == 408){ + this.fireEvent('timeout', this, xhr); + } + + } + this.onreadystatechange(); + }, + /** + * 兼容标准的onreadystatechange + * @method + */ + onreadystatechange : function(){ + }, + //--------request-------- + /** + * 兼容标准的open方法 + * @method + */ + open : function(method, url, async, username, password){ + if(!url){ + return; + } + if(!this.enableCache){ + if(url.indexOf('?') != -1){ + url += '&ram='+Math.random(); + }else{ + url += '?ram='+Math.random(); + } + } + this._xhr.open(method, url, async, username, password); + }, + /** + * 兼容标准的send方法 + * @method + */ + send : function(content){ + this.delayTimeout(); + this.isAbort = false; + this._xhr.send(content); + }, + /** + * 兼容标准的abort方法 + * @method + */ + abort : function(){ + this.isAbort = true; + this.cancelTimeout(); + this._xhr.abort(); + if(JS.isIE){//IE在abort后会清空侦听 + var self = this; + self._xhr.onreadystatechange = function(){ + self.doReadyStateChange(); + }; + } + this.fireEvent('abort',this,this._xhr); + }, + /** + * 兼容标准的setRequestHeader方法 + * @method + */ + setRequestHeader : function(header, value){ + this._xhr.setRequestHeader(header,value); + }, + //--------request-------- + /** + * 兼容标准的getResponseHeader方法 + * @method + */ + getResponseHeader : function(header){ + return this._xhr.getResponseHeader(header); + }, + /** + * 兼容标准的getAllResponseHeaders方法 + * @method + */ + getAllResponseHeaders : function(){ + return this._xhr.getAllResponseHeaders(); + }, + /** + * 设置客户端超时时间 + * @method + */ + setTimeout : function(t){ + this.timeout = t; + } + +}); \ No newline at end of file diff --git a/.svn/pristine/11/1107b01255db5fdff2ad5ad89d6da0c2ba72c581.svn-base b/.svn/pristine/11/1107b01255db5fdff2ad5ad89d6da0c2ba72c581.svn-base new file mode 100644 index 0000000..9d99a99 Binary files /dev/null and b/.svn/pristine/11/1107b01255db5fdff2ad5ad89d6da0c2ba72c581.svn-base differ diff --git a/.svn/pristine/11/11c98b99ad538f2f67633afd4d7f4d98ecfbb408.svn-base b/.svn/pristine/11/11c98b99ad538f2f67633afd4d7f4d98ecfbb408.svn-base new file mode 100644 index 0000000..e633afb Binary files /dev/null and b/.svn/pristine/11/11c98b99ad538f2f67633afd4d7f4d98ecfbb408.svn-base differ diff --git a/.svn/pristine/13/131dca28bedc85d776f58800cf15f5811e3df5cf.svn-base b/.svn/pristine/13/131dca28bedc85d776f58800cf15f5811e3df5cf.svn-base new file mode 100644 index 0000000..56ba737 Binary files /dev/null and b/.svn/pristine/13/131dca28bedc85d776f58800cf15f5811e3df5cf.svn-base differ diff --git a/.svn/pristine/14/14ce153d393b3c489f8a4e6b9a9383e7d8f4c911.svn-base b/.svn/pristine/14/14ce153d393b3c489f8a4e6b9a9383e7d8f4c911.svn-base new file mode 100644 index 0000000..4179607 Binary files /dev/null and b/.svn/pristine/14/14ce153d393b3c489f8a4e6b9a9383e7d8f4c911.svn-base differ diff --git a/.svn/pristine/14/14fe821fdc0946c28051559dbda82e1fc12fa2e4.svn-base b/.svn/pristine/14/14fe821fdc0946c28051559dbda82e1fc12fa2e4.svn-base new file mode 100644 index 0000000..98209e6 Binary files /dev/null and b/.svn/pristine/14/14fe821fdc0946c28051559dbda82e1fc12fa2e4.svn-base differ diff --git a/.svn/pristine/15/157dc93f5c5cad8ea619f2bb7026aec2344b0c66.svn-base b/.svn/pristine/15/157dc93f5c5cad8ea619f2bb7026aec2344b0c66.svn-base new file mode 100644 index 0000000..43dfc33 --- /dev/null +++ b/.svn/pristine/15/157dc93f5c5cad8ea619f2bb7026aec2344b0c66.svn-base @@ -0,0 +1,73 @@ +package org.comet4j.demo.requestmonitor; + +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; +import javax.servlet.ServletRequestEvent; +import javax.servlet.ServletRequestListener; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; +import javax.servlet.http.HttpSessionAttributeListener; +import javax.servlet.http.HttpSessionBindingEvent; +import javax.servlet.http.HttpSessionEvent; +import javax.servlet.http.HttpSessionListener; + +import org.comet4j.core.CometContext; +import org.comet4j.core.CometProtocol; + +/** + * 应用初始化 + * @author jinghai.xiao@gmail.com + * @date 2011-2-25 + */ + +public class AppInit implements ServletContextListener, HttpSessionListener, HttpSessionAttributeListener, + ServletRequestListener { + + // ServletContextListener + public void contextInitialized(ServletContextEvent event) { + CometContext cc = CometContext.getInstance(); + cc.registChannel(Constant.AppChannel); + } + + public void contextDestroyed(ServletContextEvent event) { + + } + + // HttpSessionListener + public void sessionCreated(HttpSessionEvent event) { + HttpSession session = event.getSession(); + // System.out.println("Session:" + session.getId() + "创建了"); + } + + public void sessionDestroyed(HttpSessionEvent event) { + HttpSession session = event.getSession(); + // System.out.println("Session:" + session.getId() + "销毁了"); + } + + // HttpSessionAttributeListener + public void attributeAdded(HttpSessionBindingEvent event) { + // System.out.println("Session中增加了:" + event.getName() + "属性"); + } + + public void attributeRemoved(HttpSessionBindingEvent event) { + // System.out.println("Session中删除了:" + event.getName() + "属性"); + } + + public void attributeReplaced(HttpSessionBindingEvent event) { + // System.out.println("Session中修改了:" + event.getName() + "属性"); + } + + // ServletRequestListener + public void requestInitialized(ServletRequestEvent event) { + HttpServletRequest request = (HttpServletRequest) event.getServletRequest(); + System.out.println("请求:" + request.getRequestURI() + ","+CometProtocol.FLAG_ACTION+":" + request.getParameter(CometProtocol.FLAG_ACTION) + ",cId:" + + request.getParameter("cid")); + + } + + public void requestDestroyed(ServletRequestEvent event) { + HttpServletRequest request = (HttpServletRequest) event.getServletRequest(); + // System.out.println("请求完毕:" + request.getRequestURI()); + } + +} diff --git a/.svn/pristine/15/159b847ba7d6820a35c0f02621326b7e02c230f7.svn-base b/.svn/pristine/15/159b847ba7d6820a35c0f02621326b7e02c230f7.svn-base new file mode 100644 index 0000000..59f7584 --- /dev/null +++ b/.svn/pristine/15/159b847ba7d6820a35c0f02621326b7e02c230f7.svn-base @@ -0,0 +1,39 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.event; + +import javax.servlet.http.HttpServletRequest; + +import org.comet4j.core.CometEngine; +import org.comet4j.event.Event; + +/** + * 即将断开前的事件对象 + */ + +public class BeforeDropEvent extends Event { + + private HttpServletRequest request; + + public BeforeDropEvent(CometEngine target, HttpServletRequest aRequest) { + super(target); + request = aRequest; + } + + public HttpServletRequest getRequest() { + return request; + } + + public void setRequest(HttpServletRequest request) { + this.request = request; + } + + @Override + public void destroy() { + super.destroy(); + request = null; + } +} diff --git a/.svn/pristine/15/15a4366490f2c0d8f32f8ce94376810d4319db1f.svn-base b/.svn/pristine/15/15a4366490f2c0d8f32f8ce94376810d4319db1f.svn-base new file mode 100644 index 0000000..0bd244b --- /dev/null +++ b/.svn/pristine/15/15a4366490f2c0d8f32f8ce94376810d4319db1f.svn-base @@ -0,0 +1,52 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.temp; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; + +public class ReadJARResource { + + public static void main(String[] args) throws IOException { + String jarName = "C://VODOSSClient.jar"; + String fileName = "client.properties"; + JarFile jarFile = new JarFile(jarName);// 读入jar文件 + + JarEntry entry = jarFile.getJarEntry(fileName); + InputStream input = jarFile.getInputStream(entry);// 读入需要的文件 + + readFile(input); + + jarFile.close(); + + } + + private static void readFile(InputStream input) + + throws IOException { + + InputStreamReader isr = + + new InputStreamReader(input); + + BufferedReader reader = new BufferedReader(isr); + + String line; + + while ((line = reader.readLine()) != null) { + + System.out.println(line); + + } + + reader.close(); + + } +} diff --git a/.svn/pristine/15/15cd68ebbe9d4bbccce56b82f47faafaef116a34.svn-base b/.svn/pristine/15/15cd68ebbe9d4bbccce56b82f47faafaef116a34.svn-base new file mode 100644 index 0000000..14b5437 Binary files /dev/null and b/.svn/pristine/15/15cd68ebbe9d4bbccce56b82f47faafaef116a34.svn-base differ diff --git a/.svn/pristine/16/160e46c26460402904800c4857848711d643429a.svn-base b/.svn/pristine/16/160e46c26460402904800c4857848711d643429a.svn-base new file mode 100644 index 0000000..b0e24b5 Binary files /dev/null and b/.svn/pristine/16/160e46c26460402904800c4857848711d643429a.svn-base differ diff --git a/.svn/pristine/16/1664b2093acfb8b1a840646bae51399bada33c5d.svn-base b/.svn/pristine/16/1664b2093acfb8b1a840646bae51399bada33c5d.svn-base new file mode 100644 index 0000000..435889b Binary files /dev/null and b/.svn/pristine/16/1664b2093acfb8b1a840646bae51399bada33c5d.svn-base differ diff --git a/.svn/pristine/17/17738c4f5dcc06c969250d4872e1276dfbdebcd1.svn-base b/.svn/pristine/17/17738c4f5dcc06c969250d4872e1276dfbdebcd1.svn-base new file mode 100644 index 0000000..2112607 Binary files /dev/null and b/.svn/pristine/17/17738c4f5dcc06c969250d4872e1276dfbdebcd1.svn-base differ diff --git a/.svn/pristine/17/17914902027f8769b8ec2251d9110c560286398a.svn-base b/.svn/pristine/17/17914902027f8769b8ec2251d9110c560286398a.svn-base new file mode 100644 index 0000000..f8f4f7f --- /dev/null +++ b/.svn/pristine/17/17914902027f8769b8ec2251d9110c560286398a.svn-base @@ -0,0 +1,25 @@ +function _pr_isIE6(){var F=navigator&&navigator.userAgent&&/\bMSIE 6\./.test(navigator.userAgent);_pr_isIE6=function(){return F};return F}var aa="break continue do else for if return while ",ba="auto case char const default double enum extern float goto int long register short signed sizeof static struct switch typedef union unsigned void volatile ",ca="catch class delete false import new operator private protected public this throw true try ",da="alignof align_union asm axiom bool concept concept_map const_cast constexpr decltype dynamic_cast explicit export friend inline late_check mutable namespace nullptr reinterpret_cast static_assert static_cast template typeid typename typeof using virtual wchar_t where ", +ea="boolean byte extends final finally implements import instanceof null native package strictfp super synchronized throws transient ",fa="as base by checked decimal delegate descending event fixed foreach from group implicit in interface internal into is lock object out override orderby params readonly ref sbyte sealed stackalloc string select uint ulong unchecked unsafe ushort var ",ga="debugger eval export function get null set undefined var with Infinity NaN ",ha="caller delete die do dump elsif eval exit foreach for goto if import last local my next no our print package redo require sub undef unless until use wantarray while BEGIN END ", +ia="and as assert class def del elif except exec finally from global import in is lambda nonlocal not or pass print raise try with yield False True None ",ja="alias and begin case class def defined elsif end ensure false in module next nil not or redo rescue retry self super then true undef unless until when yield BEGIN END ",ka="case done elif esac eval fi function in local set then until ",la="a",ma="z",na="A",oa="Z",pa="!",qa="!=",ra="!==",s="#",sa="%",Ha="%=",v="&",Ia="&&",Ja="&&=",Ka="&=",La= +"(",Ma="*",Na="*=",Oa="+=",Pa=",",Qa="-=",Ra="->",w="/",Sa="/=",Ta=":",Ua="::",y=";",z="<",Va="<<",Wa="<<=",Xa="<=",Ya="=",Za="==",$a="===",A=">",ab=">=",bb=">>",cb=">>=",db=">>>",eb=">>>=",fb="?",C="@",gb="[",hb="^",ib="^=",jb="^^",kb="^^=",lb="{",mb="|",nb="|=",ob="||",pb="||=",qb="~",rb="break",sb="case",tb="continue",ub="delete",vb="do",wb="else",xb="finally",yb="instanceof",zb="return",Ab="throw",Bb="try",Cb="typeof",Db="(?:(?:(?:^|[^0-9.])\\.{1,3})|(?:(?:^|[^\\+])\\+)|(?:(?:^|[^\\-])-)",Eb= +"|\\b",Fb="\\$1",Gb="|^)\\s*$",Hb="&",Ib="<",Jb=">",Kb=""",Lb="&#",Mb="x",Nb="'",G='"',Ob=" ",Pb="XMP",Qb="\n',I="",Tb="\t",Ub="\n",Vb="nocode",Wb=' $1="$2$3$4"',J="pln",O="com",Xb="dec",P="src",Q="tag",R="atv",S="pun",Yb="<>/=",X="atn",Zb=" \t\r\n",Y="str",$b="'\"",ac="'\"`",bc="\"'",cc=" \r\n",Z="lit",dc="123456789",ec=".",fc="kwd",gc="typ",$="",hc='',jc="$1 ",kc="
",lc="console",mc= +"cannot override language handler %s",nc="default-code",oc="default-markup",pc="html",qc="htm",rc="xhtml",sc="xml",tc="xsl",uc="c",vc="cc",wc="cpp",xc="cs",yc="cxx",zc="cyc",Ac="java",Bc="bsh",Cc="csh",Dc="sh",Ec="cv",Fc="py",Gc="perl",Hc="pl",Ic="pm",Jc="rb",Kc="js",Lc="pre",Mc="code",Nc="xmp",Oc="prettyprint",Pc="class",Qc="br",Rc="\r\n";(function(){function F(b){b=b.split(/ /g);var a={};for(var c=b.length;--c>=0;){var d=b[c];if(d)a[d]=null}return a}var K=aa,Sc=K+ba,T=Sc+ca,ta=T+da,ua=T+ea,Tc=ua+ +fa,va=T+ga,wa=ha,xa=K+ia,ya=K+ja,za=K+ka,Uc=ta+Tc+va+wa+xa+ya+za;function Vc(b){return b>=la&&b<=ma||b>=na&&b<=oa}function D(b,a,c,d){b.unshift(c,d||0);try{a.splice.apply(a,b)}finally{b.splice(0,2)}}var Wc=(function(){var b=[pa,qa,ra,s,sa,Ha,v,Ia,Ja,Ka,La,Ma,Na,Oa,Pa,Qa,Ra,w,Sa,Ta,Ua,y,z,Va,Wa,Xa,Ya,Za,$a,A,ab,bb,cb,db,eb,fb,C,gb,hb,ib,jb,kb,lb,mb,nb,ob,pb,qb,rb,sb,tb,ub,vb,wb,xb,yb,zb,Ab,Bb,Cb],a=Db;for(var c=0;c:&])/g,Fb)}a+= +Gb;return new RegExp(a)})(),Aa=/&/g,Ba=//g,Xc=/\"/g;function Yc(b){return b.replace(Aa,Hb).replace(Ba,Ib).replace(Ca,Jb).replace(Xc,Kb)}function U(b){return b.replace(Aa,Hb).replace(Ba,Ib).replace(Ca,Jb)}var Zc=/</g,$c=/>/g,ad=/'/g,bd=/"/g,cd=/&/g,dd=/ /g;function ed(b){var a=b.indexOf(v);if(a<0)return b;for(--a;(a=b.indexOf(Lb,a+1))>=0;){var c=b.indexOf(y,a);if(c>=0){var d=b.substring(a+3,c),g=10;if(d&&d.charAt(0)===Mb){d=d.substring(1);g=16}var e=parseInt(d,g); +if(!isNaN(e))b=b.substring(0,a)+String.fromCharCode(e)+b.substring(c+1)}}return b.replace(Zc,z).replace($c,A).replace(ad,Nb).replace(bd,G).replace(cd,v).replace(dd,Ob)}function Da(b){return Pb===b.tagName}function L(b,a){switch(b.nodeType){case 1:var c=b.tagName.toLowerCase();a.push(z,c);for(var d=0;d=0;i-=" ".length)d.push(" ".substring(0,i));g=e+1;break;case Ub:a=0;break;default:++a}}if(!d)return c;d.push(c.substring(g));return d.join(I)}}var hd=/(?:[^<]+| + + + + + + + + + + + + + \ No newline at end of file diff --git a/.svn/pristine/22/22e713a01a3e7861943db96ab837c4e3d2856868.svn-base b/.svn/pristine/22/22e713a01a3e7861943db96ab837c4e3d2856868.svn-base new file mode 100644 index 0000000..cf3fb24 Binary files /dev/null and b/.svn/pristine/22/22e713a01a3e7861943db96ab837c4e3d2856868.svn-base differ diff --git a/.svn/pristine/23/23631eb77516b9d80138a4d1beb6776ba7294c07.svn-base b/.svn/pristine/23/23631eb77516b9d80138a4d1beb6776ba7294c07.svn-base new file mode 100644 index 0000000..972055e Binary files /dev/null and b/.svn/pristine/23/23631eb77516b9d80138a4d1beb6776ba7294c07.svn-base differ diff --git a/.svn/pristine/24/242073cc74da8ae08742d8cd8ddea12efc81073f.svn-base b/.svn/pristine/24/242073cc74da8ae08742d8cd8ddea12efc81073f.svn-base new file mode 100644 index 0000000..3d7f062 Binary files /dev/null and b/.svn/pristine/24/242073cc74da8ae08742d8cd8ddea12efc81073f.svn-base differ diff --git a/.svn/pristine/24/24460a1dc0b3cd69e8093994596a75806236c5a4.svn-base b/.svn/pristine/24/24460a1dc0b3cd69e8093994596a75806236c5a4.svn-base new file mode 100644 index 0000000..eb70cf8 Binary files /dev/null and b/.svn/pristine/24/24460a1dc0b3cd69e8093994596a75806236c5a4.svn-base differ diff --git a/.svn/pristine/24/24522e5bca535a24e9623db71abb5c078834c62f.svn-base b/.svn/pristine/24/24522e5bca535a24e9623db71abb5c078834c62f.svn-base new file mode 100644 index 0000000..d30b3e5 Binary files /dev/null and b/.svn/pristine/24/24522e5bca535a24e9623db71abb5c078834c62f.svn-base differ diff --git a/.svn/pristine/25/250bbdae7886c4c506953e7f84b4de6cd1ae56a2.svn-base b/.svn/pristine/25/250bbdae7886c4c506953e7f84b4de6cd1ae56a2.svn-base new file mode 100644 index 0000000..3a28de0 --- /dev/null +++ b/.svn/pristine/25/250bbdae7886c4c506953e7f84b4de6cd1ae56a2.svn-base @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/.svn/pristine/25/25229424bac0a80f7bb892ee34cec8b050934c93.svn-base b/.svn/pristine/25/25229424bac0a80f7bb892ee34cec8b050934c93.svn-base new file mode 100644 index 0000000..9999194 Binary files /dev/null and b/.svn/pristine/25/25229424bac0a80f7bb892ee34cec8b050934c93.svn-base differ diff --git a/.svn/pristine/26/26989c5a898467b5f7187e2734eb33050864f441.svn-base b/.svn/pristine/26/26989c5a898467b5f7187e2734eb33050864f441.svn-base new file mode 100644 index 0000000..30d1ca7 Binary files /dev/null and b/.svn/pristine/26/26989c5a898467b5f7187e2734eb33050864f441.svn-base differ diff --git a/.svn/pristine/26/26a2ab1b355a7a1f751ad6ecc61e40d3b033be1c.svn-base b/.svn/pristine/26/26a2ab1b355a7a1f751ad6ecc61e40d3b033be1c.svn-base new file mode 100644 index 0000000..28bbe69 Binary files /dev/null and b/.svn/pristine/26/26a2ab1b355a7a1f751ad6ecc61e40d3b033be1c.svn-base differ diff --git a/.svn/pristine/28/2851aa4e87a0b95d5d7add1b557ba2f625fa0733.svn-base b/.svn/pristine/28/2851aa4e87a0b95d5d7add1b557ba2f625fa0733.svn-base new file mode 100644 index 0000000..f26b7c2 Binary files /dev/null and b/.svn/pristine/28/2851aa4e87a0b95d5d7add1b557ba2f625fa0733.svn-base differ diff --git a/.svn/pristine/29/296bb89bfaef25a5189740258b0cd1217daac43b.svn-base b/.svn/pristine/29/296bb89bfaef25a5189740258b0cd1217daac43b.svn-base new file mode 100644 index 0000000..67a2a4c Binary files /dev/null and b/.svn/pristine/29/296bb89bfaef25a5189740258b0cd1217daac43b.svn-base differ diff --git a/.svn/pristine/29/29c03b23895d652aefe684971367024068e3c942.svn-base b/.svn/pristine/29/29c03b23895d652aefe684971367024068e3c942.svn-base new file mode 100644 index 0000000..928779e Binary files /dev/null and b/.svn/pristine/29/29c03b23895d652aefe684971367024068e3c942.svn-base differ diff --git a/.svn/pristine/29/29cf4ac5755c1dff0dafbe4bcba08002828a4959.svn-base b/.svn/pristine/29/29cf4ac5755c1dff0dafbe4bcba08002828a4959.svn-base new file mode 100644 index 0000000..6e49d69 Binary files /dev/null and b/.svn/pristine/29/29cf4ac5755c1dff0dafbe4bcba08002828a4959.svn-base differ diff --git a/.svn/pristine/29/29d847f5636a9d2113b67721c9de12a9ce411c1d.svn-base b/.svn/pristine/29/29d847f5636a9d2113b67721c9de12a9ce411c1d.svn-base new file mode 100644 index 0000000..4f791e1 Binary files /dev/null and b/.svn/pristine/29/29d847f5636a9d2113b67721c9de12a9ce411c1d.svn-base differ diff --git a/.svn/pristine/2a/2a55e3ea60758777e05703a1fe90964a57ec4956.svn-base b/.svn/pristine/2a/2a55e3ea60758777e05703a1fe90964a57ec4956.svn-base new file mode 100644 index 0000000..dd54ac4 --- /dev/null +++ b/.svn/pristine/2a/2a55e3ea60758777e05703a1fe90964a57ec4956.svn-base @@ -0,0 +1,16 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.listener; + +import org.comet4j.core.event.RemovedEvent; +import org.comet4j.event.Listener; + +/** + * 移除连接事件侦听抽象类 + */ +public abstract class RemovedListener extends Listener { + +} diff --git a/.svn/pristine/2b/2b402ce9faaaec89a4f21f24f564bbb3a70daee3.svn-base b/.svn/pristine/2b/2b402ce9faaaec89a4f21f24f564bbb3a70daee3.svn-base new file mode 100644 index 0000000..8c2c83d Binary files /dev/null and b/.svn/pristine/2b/2b402ce9faaaec89a4f21f24f564bbb3a70daee3.svn-base differ diff --git a/.svn/pristine/2b/2bb7d59c94e3ec6d3cac83f57206fdfbe9fee7a5.svn-base b/.svn/pristine/2b/2bb7d59c94e3ec6d3cac83f57206fdfbe9fee7a5.svn-base new file mode 100644 index 0000000..562fecc Binary files /dev/null and b/.svn/pristine/2b/2bb7d59c94e3ec6d3cac83f57206fdfbe9fee7a5.svn-base differ diff --git a/.svn/pristine/2d/2d8c5ac25bc5619b4bdc098c800a228cc85a9222.svn-base b/.svn/pristine/2d/2d8c5ac25bc5619b4bdc098c800a228cc85a9222.svn-base new file mode 100644 index 0000000..24b1ab2 Binary files /dev/null and b/.svn/pristine/2d/2d8c5ac25bc5619b4bdc098c800a228cc85a9222.svn-base differ diff --git a/.svn/pristine/2e/2e99f1e8d5a518c794caa2bec71e6b97c8f68959.svn-base b/.svn/pristine/2e/2e99f1e8d5a518c794caa2bec71e6b97c8f68959.svn-base new file mode 100644 index 0000000..7862cb6 --- /dev/null +++ b/.svn/pristine/2e/2e99f1e8d5a518c794caa2bec71e6b97c8f68959.svn-base @@ -0,0 +1,16 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.listener; + +import org.comet4j.core.event.RevivalEvent; +import org.comet4j.event.Listener; + +/** + * 连接复活事件侦听抽象类 + */ +public abstract class RevivalListener extends Listener { + +} diff --git a/.svn/pristine/2e/2e9b49f5af72b71ace35ba8a4ad213731f3ae324.svn-base b/.svn/pristine/2e/2e9b49f5af72b71ace35ba8a4ad213731f3ae324.svn-base new file mode 100644 index 0000000..fb2e2c0 --- /dev/null +++ b/.svn/pristine/2e/2e9b49f5af72b71ace35ba8a4ad213731f3ae324.svn-base @@ -0,0 +1,16 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.listener; + +import org.comet4j.core.event.BeforeDropEvent; +import org.comet4j.event.Listener; + +/** + * 连接即将断开事件侦听抽象类 + */ +public abstract class BeforeDropListener extends Listener { + +} diff --git a/.svn/pristine/2e/2ed8acd774183d5eb14691f43593374bef2aa052.svn-base b/.svn/pristine/2e/2ed8acd774183d5eb14691f43593374bef2aa052.svn-base new file mode 100644 index 0000000..915db65 --- /dev/null +++ b/.svn/pristine/2e/2ed8acd774183d5eb14691f43593374bef2aa052.svn-base @@ -0,0 +1,29 @@ +/** + * @(#)BeforeDropEventListener.java 2011-3-9 Copyright 2011 it.kedacom.com, Inc. + * All rights reserved. + */ + +package org.comet4j.demo.eventmonitor; + +import org.comet4j.core.event.BeforeDropEvent; +import org.comet4j.core.listener.BeforeDropListener; + +/** + * (用一句话描述类的主要功能) + * @author xiaojinghai + * @date 2011-3-9 + */ + +public class BeforeDropEventListener extends BeforeDropListener { + + /* + * (non-Jsdoc) + * @see org.comet4j.event.Listener#handleEvent(org.comet4j.event.Event) + */ + @Override + public boolean handleEvent(BeforeDropEvent anEvent) { + System.out.println("[BeforeDropEvent]:cId=" + anEvent.getRequest().getParameter("cid")); + return true; + } + +} diff --git a/.svn/pristine/31/31eaebbc77e064473958bdc51a43db1917ee2156.svn-base b/.svn/pristine/31/31eaebbc77e064473958bdc51a43db1917ee2156.svn-base new file mode 100644 index 0000000..23095d7 --- /dev/null +++ b/.svn/pristine/31/31eaebbc77e064473958bdc51a43db1917ee2156.svn-base @@ -0,0 +1,55 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.demo.talker; + +import org.comet4j.core.CometContext; +import org.comet4j.core.CometEngine; +import org.comet4j.demo.talker.dto.HealthDTO; + +/** + * 系统健康信息发送器 + * @author xiaojinghai + * @date 2011-4-7 + */ + +public class HealthSender implements Runnable { + + private static final CometEngine engine = CometContext.getInstance().getEngine(); + private static final HealthDTO healthDto = new HealthDTO(); + private static final long startup = System.currentTimeMillis(); + + @Override + public void run() { + + while (true) { + try { + Thread.sleep(5000); + } catch (Exception ex) { + ex.printStackTrace(); + } + long totalMemory = Runtime.getRuntime().totalMemory(); + long freeMemory = Runtime.getRuntime().freeMemory(); + long maxMemory = Runtime.getRuntime().maxMemory(); + long usedMemory = totalMemory - freeMemory; + Integer connectorCount = engine.getConnections().size(); + healthDto.setConnectorCount(connectorCount.toString()); + healthDto.setFreeMemory(freeMemory); + healthDto.setMaxMemory(maxMemory); + healthDto.setTotalMemory(totalMemory); + healthDto.setUsedMemory(usedMemory); + long dif = System.currentTimeMillis() - startup; + long day_mill = 86400000;// 一天的毫秒数 60*60*1000*24 + long hour_mill = 3600000;// 一小时的毫秒数 60*60*1000 + Long day = dif / day_mill; + Long hour = (dif % day_mill) / hour_mill; + String str = day.toString() + "天 " + hour.toString() + "小时"; + healthDto.setStartup(str); + engine.sendToAll(Constant.APP_CHANNEL, healthDto); + + } + + } +} diff --git a/.svn/pristine/31/31f435f65f63a5ef78c0458fd01649c473f3e181.svn-base b/.svn/pristine/31/31f435f65f63a5ef78c0458fd01649c473f3e181.svn-base new file mode 100644 index 0000000..dde7968 Binary files /dev/null and b/.svn/pristine/31/31f435f65f63a5ef78c0458fd01649c473f3e181.svn-base differ diff --git a/.svn/pristine/32/325e794dc8620be2e31fd88cee44923cab8e5e63.svn-base b/.svn/pristine/32/325e794dc8620be2e31fd88cee44923cab8e5e63.svn-base new file mode 100644 index 0000000..34180c5 --- /dev/null +++ b/.svn/pristine/32/325e794dc8620be2e31fd88cee44923cab8e5e63.svn-base @@ -0,0 +1,65 @@ +/** + * @(#)WalleAPPListenner.java 2011-2-25 Copyright 2011 it.kedacom.com, Inc. All + * rights reserved. + */ + +package org.comet4j.demo.sender; + +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; + +import org.comet4j.core.CometContext; +import org.comet4j.core.CometEngine; + +/** + * (用一句话描述类的主要功能) + * @author xiaojinghai + * @date 2011-2-25 + */ + +public class AppInit implements ServletContextListener { + + /** + * @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent) + */ + + // ServletContextListener + public void contextInitialized(ServletContextEvent arg0) { + CometContext cc = CometContext.getInstance(); + cc.registChannel(Constant.AppChannel); + Thread helloAppModule = new Thread(new HelloAppModule(), "Sender App Module"); + helloAppModule.setDaemon(true); + helloAppModule.start(); + + } + + class HelloAppModule implements Runnable { + + private int inc = 0; + + public void run() { + while (true) { + try { + Thread.sleep(5000); + } catch (Exception ex) { + ex.printStackTrace(); + } + CometEngine engine = CometContext.getInstance().getEngine(); + engine.sendTo(Constant.AppChannel, engine.getConnections(), "This is the SenderAppModule Test,来自Sender" + + inc); + inc++; + } + } + } + + /** + * @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet.ServletContextEvent) + */ + + // ServletContextListener + public void contextDestroyed(ServletContextEvent arg0) { + // TODO 该方法尚未实现 + + } + +} diff --git a/.svn/pristine/32/3276c34c5c4af74e275064d204f300a190103c30.svn-base b/.svn/pristine/32/3276c34c5c4af74e275064d204f300a190103c30.svn-base new file mode 100644 index 0000000..6f4d874 Binary files /dev/null and b/.svn/pristine/32/3276c34c5c4af74e275064d204f300a190103c30.svn-base differ diff --git a/.svn/pristine/32/32dd1aca7a3bbb98539a3b9111a76e98268cdcd3.svn-base b/.svn/pristine/32/32dd1aca7a3bbb98539a3b9111a76e98268cdcd3.svn-base new file mode 100644 index 0000000..51fb5c1 --- /dev/null +++ b/.svn/pristine/32/32dd1aca7a3bbb98539a3b9111a76e98268cdcd3.svn-base @@ -0,0 +1,31 @@ +/** + * @(#)MessageEventListener.java 2011-3-9 Copyright 2011 it.kedacom.com, Inc. + * All rights reserved. + */ + +package org.comet4j.demo.eventmonitor; + +import org.comet4j.core.event.MessageEvent; +import org.comet4j.core.listener.MessageListener; +import org.comet4j.core.util.JSONUtil; + +/** + * (用一句话描述类的主要功能) + * @author xiaojinghai + * @date 2011-3-9 + */ + +public class MessageEventListener extends MessageListener { + + /* + * (non-Jsdoc) + * @see org.comet4j.event.Listener#handleEvent(org.comet4j.event.Event) + */ + @Override + public boolean handleEvent(MessageEvent anEvent) { + System.out.println("[MessageEvent]:cId=" + anEvent.getConn().getId() + "\ndata=" + + JSONUtil.object2json(anEvent.getData())); + return false; + } + +} diff --git a/.svn/pristine/32/32e532b36e0d7a3830904153624c2d967bf5fa54.svn-base b/.svn/pristine/32/32e532b36e0d7a3830904153624c2d967bf5fa54.svn-base new file mode 100644 index 0000000..18e215d Binary files /dev/null and b/.svn/pristine/32/32e532b36e0d7a3830904153624c2d967bf5fa54.svn-base differ diff --git a/.svn/pristine/33/3327ad69de48ba3bcb284d4cbc30534187d7df01.svn-base b/.svn/pristine/33/3327ad69de48ba3bcb284d4cbc30534187d7df01.svn-base new file mode 100644 index 0000000..f3fd297 --- /dev/null +++ b/.svn/pristine/33/3327ad69de48ba3bcb284d4cbc30534187d7df01.svn-base @@ -0,0 +1,10 @@ + + + The source code + + + + +
###SOURCE###
+ + \ No newline at end of file diff --git a/.svn/pristine/33/333e9405b194376d599346420cd4d4c930aebfb6.svn-base b/.svn/pristine/33/333e9405b194376d599346420cd4d4c930aebfb6.svn-base new file mode 100644 index 0000000..a915dfb Binary files /dev/null and b/.svn/pristine/33/333e9405b194376d599346420cd4d4c930aebfb6.svn-base differ diff --git a/.svn/pristine/33/335ef794302cb86f97ae3a083227da5f9e1ee266.svn-base b/.svn/pristine/33/335ef794302cb86f97ae3a083227da5f9e1ee266.svn-base new file mode 100644 index 0000000..3ed5f24 --- /dev/null +++ b/.svn/pristine/33/335ef794302cb86f97ae3a083227da5f9e1ee266.svn-base @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/.svn/pristine/33/335f08289b716d76e423f4f3eeee2503f37ec9cb.svn-base b/.svn/pristine/33/335f08289b716d76e423f4f3eeee2503f37ec9cb.svn-base new file mode 100644 index 0000000..f24ddee Binary files /dev/null and b/.svn/pristine/33/335f08289b716d76e423f4f3eeee2503f37ec9cb.svn-base differ diff --git a/.svn/pristine/33/339b1a4718911af61fcc0ff60cb9bd8aec8d4d2d.svn-base b/.svn/pristine/33/339b1a4718911af61fcc0ff60cb9bd8aec8d4d2d.svn-base new file mode 100644 index 0000000..891d1b7 Binary files /dev/null and b/.svn/pristine/33/339b1a4718911af61fcc0ff60cb9bd8aec8d4d2d.svn-base differ diff --git a/.svn/pristine/34/34446074781ec7c390d18de19ebedca256ec4afc.svn-base b/.svn/pristine/34/34446074781ec7c390d18de19ebedca256ec4afc.svn-base new file mode 100644 index 0000000..6219312 --- /dev/null +++ b/.svn/pristine/34/34446074781ec7c390d18de19ebedca256ec4afc.svn-base @@ -0,0 +1,484 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core; + +import java.io.IOException; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.comet4j.core.dto.ConnectionDTO; +import org.comet4j.core.event.BeforeConnectEvent; +import org.comet4j.core.event.BeforeDropEvent; +import org.comet4j.core.event.BeforeRemoveEvent; +import org.comet4j.core.event.ConnectEvent; +import org.comet4j.core.event.DropEvent; +import org.comet4j.core.event.DyingEvent; +import org.comet4j.core.event.ErrorEvent; +import org.comet4j.core.event.MessageEvent; +import org.comet4j.core.event.RemovedEvent; +import org.comet4j.core.event.RevivalEvent; +import org.comet4j.core.listener.BeforeConnectListener; +import org.comet4j.core.listener.BeforeDropListener; +import org.comet4j.core.listener.BeforeRemoveListener; +import org.comet4j.core.listener.ConnectListener; +import org.comet4j.core.listener.DropListener; +import org.comet4j.core.listener.DyingListener; +import org.comet4j.core.listener.MessageListener; +import org.comet4j.core.listener.RemovedListener; +import org.comet4j.core.listener.RevivalListener; +import org.comet4j.event.Observable; + +/** + * 引擎,负责管理和维持连接,并能够必要的发送服务 + */ + +@SuppressWarnings({ + "unchecked", "rawtypes" +}) +public class CometEngine extends Observable { + + private CometConnector ct; + private CometSender sender; + + public CometEngine() { + this.addEvent(BeforeConnectEvent.class); + this.addEvent(ConnectEvent.class); + this.addEvent(BeforeDropEvent.class); + this.addEvent(DropEvent.class); + this.addEvent(DyingEvent.class); + this.addEvent(RevivalEvent.class); + this.addEvent(MessageEvent.class); + this.addEvent(ErrorEvent.class);// TODO: + CometContext cc = CometContext.getInstance(); + sender = new CometSender(cc.getCacheExpires(), cc.getCacheFrequency()); + ct = new CometConnector(cc.getConnExpires(), cc.getConnFrequency()); + } + + /** + * 建立用户连接 + * @param request + * @param response + * @throws IOException + */ + void connect(HttpServletRequest request, HttpServletResponse response) throws IOException { + String uId = request.getParameter("uid"); + CometContext.getInstance().log("【CometDebug】-->【connect】-->uid:" + uId); + + CometConnection conn = new CometConnection(request, response); + BeforeConnectEvent be = new BeforeConnectEvent(this, request, response); + if (!this.fireEvent(be)) { + conn.getResponse().setStatus(HttpServletResponse.SC_BAD_REQUEST); + conn.getResponse().getWriter().close(); + return; + } + ct.addConnection(conn); + CometContext cc = CometContext.getInstance(); + ConnectionDTO cdto = new ConnectionDTO(conn.getId(), conn.getWorkStyle(), cc.getAppModules(), cc.getTimeout()); + sendTo(CometProtocol.SYS_CHANNEL, conn, cdto); + try {// 强制关闭长连接工作模式下的输出 + conn.getResponse().getWriter().close(); + conn.setState(CometProtocol.STATE_DYING); + conn.setResponse(null); + conn.setDyingTime(System.currentTimeMillis()); + } catch (Exception ex) { + } finally { + ConnectEvent e = new ConnectEvent(this, conn); + this.fireEvent(e); + } + + } + + void dying(HttpServletRequest request, HttpServletResponse response) throws IOException { + // response.setStatus(CometProtocol.HTTPSTATUS_TIMEOUT); + String uId = request.getParameter("uid"); + String cId = request.getParameter("cid"); + CometContext.getInstance().log("【CometDebug】-->【dying】-->cid:" + cId + "," + "uid:" + uId); + + CometConnection conn = ct.getConnection(request); + if (conn != null) { + CometContext.getInstance().getEngine().sendTo(CometProtocol.SYS_CHANNEL, conn, CometProtocol.STATE_DYING); + } + try { + conn.getResponse().getWriter().close(); + } catch (Exception exc) { + try { + response.getWriter().close(); + } catch (Exception excp) { + excp.printStackTrace(); + } + + } + if (conn != null) { + conn.setState(CometProtocol.STATE_DYING); + conn.setResponse(null); + conn.setDyingTime(System.currentTimeMillis()); + DyingEvent e = new DyingEvent(this, conn); + this.fireEvent(e); + } + } + + void revival(HttpServletRequest request, HttpServletResponse response) throws IOException { + String cId = getConnectionId(request); + + String uId = request.getParameter("uid"); + CometContext.getInstance().log("【CometDebug】-->【revival】-->cid:" + cId + "," + "uid:" + uId); + + if (cId == null) { + drop(request, response); + // throw new CometException("无法复活,断开连接。"); + } + CometConnection conn = ct.getConnection(cId); + if (conn != null /* && CometProtocol.STATE_DYING.equals(conn.getState()) */) { + conn.setRequest(request); + conn.setResponse(response); + conn.setDyingTime(System.currentTimeMillis()); + conn.setState(CometProtocol.STATE_ALIVE); + RevivalEvent e = new RevivalEvent(this, conn); + this.fireEvent(e); + sender.sendCacheMessage(conn); + } else { + drop(request, response); + // throw new CometException("非正常复活,断开连接。conn=" + conn); + } + } + + /** + * 断开一个连接 + * @param request + * @param response + * @throws IOException + */ + + public void drop(HttpServletRequest request, HttpServletResponse response) throws IOException { + + BeforeDropEvent be = new BeforeDropEvent(this, request); + if (!this.fireEvent(be)) { + return; + } + String cId = getConnectionId(request); + + String uId = request.getParameter("uid"); + CometContext.getInstance().log("【CometDebug】-->【drop】-->cid:" + cId + "," + "uid:" + uId); + + CometConnection conn = null; + if (cId != null) { + conn = ct.getConnection(cId); + } else { + conn = ct.getConnection(request); + } + if (conn != null) { + remove(conn); + } + // response.setStatus(CometProtocol.HTTPSTATUS_ERROR); + response.getWriter().close(); + } + + void remove(CometConnection aConn) { + + BeforeRemoveEvent be = new BeforeRemoveEvent(this, aConn); + if (!this.fireEvent(be)) { + return; + } + sender.getCacheMessage(aConn); + ct.removeConnection(aConn); + // Fixed nio endpoint exception + /* + * try { aConn.getResponse().getWriter().close(); } catch (Exception + * exc) { // 连接有可能是dying,此时getResponse为空是正常的,这里仅保证对有效的Response做出回应 } + */ + RemovedEvent re = new RemovedEvent(this, aConn); + this.fireEvent(re); + DropEvent de = new DropEvent(this, aConn); + this.fireEvent(de); + + } + + /** + * 按ID获取已有 + * @param id + * @return + */ + + public CometConnection getConnection(String id) { + return ct.getConnection(id); + } + + /** + * 按Request对象获得连接对象 + * @param request + * @return + */ + + public CometConnection getConnection(HttpServletRequest request) { + String cId = getConnectionId(request); + CometConnection conn = null; + if (cId != null) { + conn = ct.getConnection(cId); + } else { + conn = ct.getConnection(request); + } + return conn; + } + + /** + * 获得所有连接对象 + * @return + */ + + public List getConnections() { + return ct.getConnections(); + } + + /** + * 向连接发送消息 + * @param channel 应用通道标识 + * @param c 连接对象 + * @param data 数据 + */ + + public void sendTo(String channel, CometConnection c, Object data) { + CometMessage msg = new CometMessage(data, channel); + sender.sendTo(c, msg); + MessageEvent e = new MessageEvent(this, c, msg); + this.fireEvent(e); + } + + /** + * 向连接发送批量数据 + * @param channel 应用通道标识 + * @param c 连接对象 + * @param data 数据列表 + */ + + public void sendTo(String channel, CometConnection c, List data) { + for (Object o : data) { + sendTo(channel, c, o); + } + } + + /** + * 向多个连接发送数据 + * @param channel 应用通道标识 + * @param list 连接对象列表 + * @param data 数据 + */ + + public void sendTo(String channel, List list, Object data) { + if (list.isEmpty()) { + return; + } + for (CometConnection c : list) { + sendTo(channel, c, data); + } + } + + /** + * 向所有连接发送数据 + * @param channel 应用通道标识 + * @param data 数据 + */ + + public void sendToAll(String channel, Object data) { + List list = this.getConnections(); + if (list == null) { + return; + } + synchronized (list) { + for (CometConnection c : list) { + sendTo(channel, c, data); + } + } + } + + /** + * 从Request对象中获取连接ID + * @param request + * @return + */ + + public String getConnectionId(HttpServletRequest request) { + String id = request.getParameter(CometProtocol.FLAG_ID); + if (id == null || "".equals(id)) { + id = null; + } + return id; + } + + /** + * 增加即将连接事件侦听,此事件动作可以被终止。 + * @param li + */ + + public void addBeforeConnectListener(BeforeConnectListener li) { + this.addListener(BeforeConnectEvent.class, li); + } + + /** + * 移除即将连接事件侦听,此事件动作可以被终止。 + * @param li + */ + + public void removeBeforeConnectListener(BeforeConnectListener li) { + this.removeListener(BeforeConnectEvent.class, li); + } + + /** + * 增加即将断开事件侦听,此事件动作可以被终止。 + * @param li + */ + + public void addBeforeDropListener(BeforeDropListener li) { + this.addListener(BeforeDropEvent.class, li); + } + + /** + * 移除即将断开事件侦听,此事件动作可以被终止。 + * @param li + */ + + public void removeBeforeDropListener(BeforeDropListener li) { + this.removeListener(BeforeDropEvent.class, li); + } + + /** + * 增加连接即将移除事件侦听,此事件动作可以被终止。 + * @param li + */ + + public void addBeforeRemoveListener(BeforeRemoveListener li) { + this.addListener(BeforeRemoveEvent.class, li); + } + + /** + * 移除连接即将移除事件侦听,此事件动作可以被终止。 + * @param li + */ + + public void removeBeforeRemoveListener(BeforeRemoveListener li) { + this.removeListener(BeforeRemoveEvent.class, li); + } + + /** + * 增加连接事件侦听 + * @param li + */ + + public void addConnectListener(ConnectListener li) { + this.addListener(ConnectEvent.class, li); + } + + /** + * 移除连接事件侦听 + * @param li + */ + + public void removeConnectListener(ConnectListener li) { + this.removeListener(ConnectEvent.class, li); + } + + /** + * 增加连接断开事件侦听 + * @param li + */ + + public void addDropListener(DropListener li) { + this.addListener(DropEvent.class, li); + } + + /** + * 移除连接断开事件侦听 + * @param li + */ + + public void removeDropListener(DropListener li) { + this.removeListener(DropEvent.class, li); + } + + /** + * 增加连接变为濒死状态事件侦听 + * @param li + */ + + public void addDyingListener(DyingListener li) { + this.addListener(DyingEvent.class, li); + } + + /** + * 移除连接变为濒死状态事件侦听 + * @param li + */ + + public void removeDyingListener(DyingListener li) { + this.removeListener(DyingEvent.class, li); + } + + /** + * 增加发送消息事件侦听 + * @param li + */ + + public void addMessageListener(MessageListener li) { + this.addListener(MessageEvent.class, li); + } + + /** + * 移除发送消息事件侦听 + * @param li + */ + + public void removeMessageListener(MessageListener li) { + this.removeListener(MessageEvent.class, li); + } + + /** + * 增加连接已删除事件侦听 + * @param li + */ + + public void addRemovedListener(RemovedListener li) { + this.addListener(RemovedEvent.class, li); + } + + /** + * 移除连接已删除事件侦听 + * @param li + */ + + public void removeRemovedListener(RemovedListener li) { + this.removeListener(RemovedEvent.class, li); + } + + /** + * 增加连接变为复活状态事件侦听 + * @param li + */ + + public void addRevivalListener(RevivalListener li) { + this.addListener(RevivalEvent.class, li); + } + + /** + * 移除连接变为复活状态事件侦听 + * @param li + */ + public void removeRevivalListener(RevivalListener li) { + this.removeListener(RevivalEvent.class, li); + } + + @Override + public void destroy() { + super.destroy(); + ct.init = false; + ct.destroy(); + sender.destroy(); + ct = null; + sender = null; + + } + +} diff --git a/.svn/pristine/34/34498a6c896f949410b56f58064b0751546b0b3f.svn-base b/.svn/pristine/34/34498a6c896f949410b56f58064b0751546b0b3f.svn-base new file mode 100644 index 0000000..97dcc71 Binary files /dev/null and b/.svn/pristine/34/34498a6c896f949410b56f58064b0751546b0b3f.svn-base differ diff --git a/.svn/pristine/34/345c92b66afa48d6dfa260a98a5a143eb305308a.svn-base b/.svn/pristine/34/345c92b66afa48d6dfa260a98a5a143eb305308a.svn-base new file mode 100644 index 0000000..8602ed1 --- /dev/null +++ b/.svn/pristine/34/345c92b66afa48d6dfa260a98a5a143eb305308a.svn-base @@ -0,0 +1,29 @@ +/** + * @(#)DyingEventListener.java 2011-3-9 Copyright 2011 it.kedacom.com, Inc. All + * rights reserved. + */ + +package org.comet4j.demo.eventmonitor; + +import org.comet4j.core.event.DyingEvent; +import org.comet4j.core.listener.DyingListener; + +/** + * (用一句话描述类的主要功能) + * @author xiaojinghai + * @date 2011-3-9 + */ + +public class DyingEventListener extends DyingListener { + + /* + * (non-Jsdoc) + * @see org.comet4j.event.Listener#handleEvent(org.comet4j.event.Event) + */ + @Override + public boolean handleEvent(DyingEvent anEvent) { + System.out.println("[DyingEvent]:cId=" + anEvent.getConn().getId()); + return false; + } + +} diff --git a/.svn/pristine/34/34fbf9fef3ca8c1d1fd183eb832b5a1bf497bfd5.svn-base b/.svn/pristine/34/34fbf9fef3ca8c1d1fd183eb832b5a1bf497bfd5.svn-base new file mode 100644 index 0000000..dee63e2 Binary files /dev/null and b/.svn/pristine/34/34fbf9fef3ca8c1d1fd183eb832b5a1bf497bfd5.svn-base differ diff --git a/.svn/pristine/35/35500adada656eb8650ca08353033467ae8b3439.svn-base b/.svn/pristine/35/35500adada656eb8650ca08353033467ae8b3439.svn-base new file mode 100644 index 0000000..3e656c7 --- /dev/null +++ b/.svn/pristine/35/35500adada656eb8650ca08353033467ae8b3439.svn-base @@ -0,0 +1,49 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.demo.talker.dto; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * 用户信息传输对象 + * @author jinghai.xiao@gmail.com + * @date 2011-4-7 + */ +public class UserDTO { + + private final String transtime; + private String id; + private String name; + + public UserDTO(String id, String name) { + this.id = id; + this.name = name; + Date d = new Date(System.currentTimeMillis()); + SimpleDateFormat f = new SimpleDateFormat("HH:mm"); + transtime = f.format(d); + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getTranstime() { + return transtime; + } +} diff --git a/.svn/pristine/39/39eb05e4fb4bc33b976ee897658ce70c3297f9e9.svn-base b/.svn/pristine/39/39eb05e4fb4bc33b976ee897658ce70c3297f9e9.svn-base new file mode 100644 index 0000000..30a2c4b Binary files /dev/null and b/.svn/pristine/39/39eb05e4fb4bc33b976ee897658ce70c3297f9e9.svn-base differ diff --git a/.svn/pristine/3b/3b776004161d64fd956b49cf83ec235ee458271d.svn-base b/.svn/pristine/3b/3b776004161d64fd956b49cf83ec235ee458271d.svn-base new file mode 100644 index 0000000..1e02c41 Binary files /dev/null and b/.svn/pristine/3b/3b776004161d64fd956b49cf83ec235ee458271d.svn-base differ diff --git a/.svn/pristine/3d/3d4a99bad6353f7900195142b17f121727e0b79a.svn-base b/.svn/pristine/3d/3d4a99bad6353f7900195142b17f121727e0b79a.svn-base new file mode 100644 index 0000000..2fcea8a Binary files /dev/null and b/.svn/pristine/3d/3d4a99bad6353f7900195142b17f121727e0b79a.svn-base differ diff --git a/.svn/pristine/3d/3d4f047b9de8f17d18b39fabfc166fb6b1b63d3b.svn-base b/.svn/pristine/3d/3d4f047b9de8f17d18b39fabfc166fb6b1b63d3b.svn-base new file mode 100644 index 0000000..27ff98b Binary files /dev/null and b/.svn/pristine/3d/3d4f047b9de8f17d18b39fabfc166fb6b1b63d3b.svn-base differ diff --git a/.svn/pristine/3e/3e7f56d9b1fdf920cd3ab42f976d274bda5c36b1.svn-base b/.svn/pristine/3e/3e7f56d9b1fdf920cd3ab42f976d274bda5c36b1.svn-base new file mode 100644 index 0000000..fad5893 Binary files /dev/null and b/.svn/pristine/3e/3e7f56d9b1fdf920cd3ab42f976d274bda5c36b1.svn-base differ diff --git a/.svn/pristine/3f/3f3b2c34a281182a0336416f8a1e4ec89aa72a6c.svn-base b/.svn/pristine/3f/3f3b2c34a281182a0336416f8a1e4ec89aa72a6c.svn-base new file mode 100644 index 0000000..54819ad --- /dev/null +++ b/.svn/pristine/3f/3f3b2c34a281182a0336416f8a1e4ec89aa72a6c.svn-base @@ -0,0 +1,182 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ + +package org.comet4j.core.util; + +import java.beans.IntrospectionException; +import java.beans.Introspector; +import java.beans.PropertyDescriptor; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * 用来把对象转换为json串的类,没有反向的操作 + * @author xiaojinghai + * @date 2011-7-18 + */ + +public class JSONUtil { + + public static String object2json(Object obj) { + StringBuilder json = new StringBuilder(); + if (obj == null) { + json.append("\"\""); + } else if (obj instanceof String || obj instanceof Integer || obj instanceof Float || obj instanceof Boolean + || obj instanceof Short || obj instanceof Double || obj instanceof Long || obj instanceof BigDecimal + || obj instanceof BigInteger || obj instanceof Byte) { + json.append("\"").append(string2json(obj.toString())).append("\""); + } else if (obj instanceof Object[]) { + json.append(array2json((Object[]) obj)); + } else if (obj instanceof List) { + json.append(list2json((List) obj)); + } else if (obj instanceof Map) { + json.append(map2json((Map) obj)); + } else if (obj instanceof Set) { + json.append(set2json((Set) obj)); + } else { + json.append(bean2json(obj)); + } + return json.toString(); + } + + public static String bean2json(Object bean) { + StringBuilder json = new StringBuilder(); + json.append("{"); + PropertyDescriptor[] props = null; + try { + props = Introspector.getBeanInfo(bean.getClass(), Object.class).getPropertyDescriptors(); + } catch (IntrospectionException e) { + } + if (props != null) { + for (int i = 0; i < props.length; i++) { + try { + String name = object2json(props[i].getName()); + String value = object2json(props[i].getReadMethod().invoke(bean)); + json.append(name); + json.append(":"); + json.append(value); + json.append(","); + } catch (Exception e) { + } + } + json.setCharAt(json.length() - 1, '}'); + } else { + json.append("}"); + } + return json.toString(); + } + + public static String list2json(List list) { + StringBuilder json = new StringBuilder(); + json.append("["); + if (list != null && list.size() > 0) { + for (Object obj : list) { + json.append(object2json(obj)); + json.append(","); + } + json.setCharAt(json.length() - 1, ']'); + } else { + json.append("]"); + } + return json.toString(); + } + + public static String array2json(Object[] array) { + StringBuilder json = new StringBuilder(); + json.append("["); + if (array != null && array.length > 0) { + for (Object obj : array) { + json.append(object2json(obj)); + json.append(","); + } + json.setCharAt(json.length() - 1, ']'); + } else { + json.append("]"); + } + return json.toString(); + } + + public static String map2json(Map map) { + StringBuilder json = new StringBuilder(); + json.append("{"); + if (map != null && map.size() > 0) { + for (Object key : map.keySet()) { + json.append(object2json(key)); + json.append(":"); + json.append(object2json(map.get(key))); + json.append(","); + } + json.setCharAt(json.length() - 1, '}'); + } else { + json.append("}"); + } + return json.toString(); + } + + public static String set2json(Set set) { + StringBuilder json = new StringBuilder(); + json.append("["); + if (set != null && set.size() > 0) { + for (Object obj : set) { + json.append(object2json(obj)); + json.append(","); + } + json.setCharAt(json.length() - 1, ']'); + } else { + json.append("]"); + } + return json.toString(); + } + + public static String string2json(String s) { + if (s == null) return ""; + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < s.length(); i++) { + char ch = s.charAt(i); + switch (ch) { + case '"': + sb.append("\\\""); + break; + case '\\': + sb.append("\\\\"); + break; + case '\b': + sb.append("\\b"); + break; + case '\f': + sb.append("\\f"); + break; + case '\n': + sb.append("\\n"); + break; + case '\r': + sb.append("\\r"); + break; + case '\t': + sb.append("\\t"); + break; + case '/': + sb.append("\\/"); + break; + default: + if (ch >= '\u0000' && ch <= '\u001F') { + String ss = Integer.toHexString(ch); + sb.append("\\u"); + for (int k = 0; k < 4 - ss.length(); k++) { + sb.append('0'); + } + sb.append(ss.toUpperCase()); + } else { + sb.append(ch); + } + } + } + return sb.toString(); + } +} diff --git a/.svn/pristine/3f/3f738aefacf7cc61c5cb37ed942b6590fdd7fb4f.svn-base b/.svn/pristine/3f/3f738aefacf7cc61c5cb37ed942b6590fdd7fb4f.svn-base new file mode 100644 index 0000000..2064442 Binary files /dev/null and b/.svn/pristine/3f/3f738aefacf7cc61c5cb37ed942b6590fdd7fb4f.svn-base differ diff --git a/.svn/pristine/40/40123cfd618988bda4d702006f3f1ea7921f3a16.svn-base b/.svn/pristine/40/40123cfd618988bda4d702006f3f1ea7921f3a16.svn-base new file mode 100644 index 0000000..188d033 --- /dev/null +++ b/.svn/pristine/40/40123cfd618988bda4d702006f3f1ea7921f3a16.svn-base @@ -0,0 +1,16 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.listener; + +import org.comet4j.core.event.DyingEvent; +import org.comet4j.event.Listener; + +/** + * 连接濒死状态事件侦听抽象类 + */ +public abstract class DyingListener extends Listener { + +} diff --git a/.svn/pristine/40/4041dfdf6fb9f65fab322d3839d6066a543e923b.svn-base b/.svn/pristine/40/4041dfdf6fb9f65fab322d3839d6066a543e923b.svn-base new file mode 100644 index 0000000..3234361 --- /dev/null +++ b/.svn/pristine/40/4041dfdf6fb9f65fab322d3839d6066a543e923b.svn-base @@ -0,0 +1,11 @@ + + \ No newline at end of file diff --git a/.svn/pristine/40/40f05a3f56480c347542d264690726856c9725db.svn-base b/.svn/pristine/40/40f05a3f56480c347542d264690726856c9725db.svn-base new file mode 100644 index 0000000..7f0842d --- /dev/null +++ b/.svn/pristine/40/40f05a3f56480c347542d264690726856c9725db.svn-base @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/.svn/pristine/41/41dfc0a6c92707948578891c51d98c6443be63cc.svn-base b/.svn/pristine/41/41dfc0a6c92707948578891c51d98c6443be63cc.svn-base new file mode 100644 index 0000000..05bd71b --- /dev/null +++ b/.svn/pristine/41/41dfc0a6c92707948578891c51d98c6443be63cc.svn-base @@ -0,0 +1 @@ +Window \ No newline at end of file diff --git a/.svn/pristine/42/422e77206f02745354426d179701cac2d79eb33c.svn-base b/.svn/pristine/42/422e77206f02745354426d179701cac2d79eb33c.svn-base new file mode 100644 index 0000000..34237f6 Binary files /dev/null and b/.svn/pristine/42/422e77206f02745354426d179701cac2d79eb33c.svn-base differ diff --git a/.svn/pristine/43/43072bc291509d6bce7449607160c3807e48417e.svn-base b/.svn/pristine/43/43072bc291509d6bce7449607160c3807e48417e.svn-base new file mode 100644 index 0000000..7da01b0 --- /dev/null +++ b/.svn/pristine/43/43072bc291509d6bce7449607160c3807e48417e.svn-base @@ -0,0 +1,71 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.demo.talker.dto; + +import java.text.SimpleDateFormat; +import java.util.Date; + +import org.comet4j.demo.talker.Constant; + +/** + * 改名通知传输对象 + * @author jinghai.xiao@gmail.com + * @date 2011-3-3 + */ +public class RenameDTO { + + private final String transtime; + private String type; + private String id; + private String newName; + private String oldName; + + public RenameDTO(String id, String oldName, String newName) { + this.type = Constant.RENAME; + this.id = id; + this.oldName = oldName; + this.newName = newName; + Date d = new Date(System.currentTimeMillis()); + SimpleDateFormat f = new SimpleDateFormat("HH:mm"); + transtime = f.format(d); + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getNewName() { + return newName; + } + + public void setNewName(String newName) { + this.newName = newName; + } + + public String getOldName() { + return oldName; + } + + public void setOldName(String oldName) { + this.oldName = oldName; + } + + public String getTranstime() { + return transtime; + } +} diff --git a/.svn/pristine/43/43e7a31874d08e06b5be6230aa54ec5b7aca6a65.svn-base b/.svn/pristine/43/43e7a31874d08e06b5be6230aa54ec5b7aca6a65.svn-base new file mode 100644 index 0000000..387565a --- /dev/null +++ b/.svn/pristine/43/43e7a31874d08e06b5be6230aa54ec5b7aca6a65.svn-base @@ -0,0 +1,16 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.listener; + +import org.comet4j.core.event.DropEvent; +import org.comet4j.event.Listener; + +/** + * 连接断开事件侦听抽象类 + */ +public abstract class DropListener extends Listener { + +} diff --git a/.svn/pristine/44/44ca52d894c504e870ca84b53e2b5c1b1ea12f28.svn-base b/.svn/pristine/44/44ca52d894c504e870ca84b53e2b5c1b1ea12f28.svn-base new file mode 100644 index 0000000..3798498 Binary files /dev/null and b/.svn/pristine/44/44ca52d894c504e870ca84b53e2b5c1b1ea12f28.svn-base differ diff --git a/.svn/pristine/44/44d4718df69f48845c61abf1c1450958cf0479f9.svn-base b/.svn/pristine/44/44d4718df69f48845c61abf1c1450958cf0479f9.svn-base new file mode 100644 index 0000000..a0ddd9e Binary files /dev/null and b/.svn/pristine/44/44d4718df69f48845c61abf1c1450958cf0479f9.svn-base differ diff --git a/.svn/pristine/45/459ef504a2e662cd46873806abebed988db6b75b.svn-base b/.svn/pristine/45/459ef504a2e662cd46873806abebed988db6b75b.svn-base new file mode 100644 index 0000000..4c5862c Binary files /dev/null and b/.svn/pristine/45/459ef504a2e662cd46873806abebed988db6b75b.svn-base differ diff --git a/.svn/pristine/45/45e25058feb8e9e536586a6bfe1a409e1bdf7a1b.svn-base b/.svn/pristine/45/45e25058feb8e9e536586a6bfe1a409e1bdf7a1b.svn-base new file mode 100644 index 0000000..5fc45e3 --- /dev/null +++ b/.svn/pristine/45/45e25058feb8e9e536586a6bfe1a409e1bdf7a1b.svn-base @@ -0,0 +1,61 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.demo.talker.dto; + +import java.text.SimpleDateFormat; +import java.util.Date; + +import org.comet4j.demo.talker.Constant; + +/** + * 下线通知传输对象 + * @author jinghai.xiao@gmail.com + * @date 2011-3-3 + */ +public class LeftDTO { + + private final String transtime; + private String type; + private String id; + private String name; + + public LeftDTO(String id, String name) { + this.type = Constant.DOWN; + this.id = id; + this.name = name; + Date d = new Date(System.currentTimeMillis()); + SimpleDateFormat f = new SimpleDateFormat("HH:mm"); + transtime = f.format(d); + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getTranstime() { + return transtime; + } +} diff --git a/.svn/pristine/45/45e46a216af49ab0c138b2904502915a9200b691.svn-base b/.svn/pristine/45/45e46a216af49ab0c138b2904502915a9200b691.svn-base new file mode 100644 index 0000000..eb8ba79 Binary files /dev/null and b/.svn/pristine/45/45e46a216af49ab0c138b2904502915a9200b691.svn-base differ diff --git a/.svn/pristine/46/4604e3ed860a9ec8e4a3ddc72b7a5751506da57d.svn-base b/.svn/pristine/46/4604e3ed860a9ec8e4a3ddc72b7a5751506da57d.svn-base new file mode 100644 index 0000000..6374104 Binary files /dev/null and b/.svn/pristine/46/4604e3ed860a9ec8e4a3ddc72b7a5751506da57d.svn-base differ diff --git a/.svn/pristine/46/46c3fac6317f2dc0a4fe12fd8273260f1fbfde0e.svn-base b/.svn/pristine/46/46c3fac6317f2dc0a4fe12fd8273260f1fbfde0e.svn-base new file mode 100644 index 0000000..e88e1b1 --- /dev/null +++ b/.svn/pristine/46/46c3fac6317f2dc0a4fe12fd8273260f1fbfde0e.svn-base @@ -0,0 +1,87 @@ +/** + * @(#)DelayTaskEngine.java 2011-7-25 Copyright 2011 it.kedacom.com, Inc. All + * rights reserved. + */ + +package org.comet4j.core.util; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; + +/** + * 延迟任务管理器,用于执行延迟任务,当任务在执行以前可以分配新的任务,原任务将取消执行,不同的任务组使用taskId加以区分。 + * @author xiaojinghai + * @date 2011-7-25 + */ + +public class DelayTask { + + private final int cpuCoreNumber = Runtime.getRuntime().availableProcessors(); + private final ScheduledExecutorService scheduler; + private final Map> taskHandles = new ConcurrentHashMap>(); + + public DelayTask() { + scheduler = Executors.newScheduledThreadPool(cpuCoreNumber); + } + + public DelayTask(int cpuCoreNumber) { + scheduler = Executors.newScheduledThreadPool(cpuCoreNumber); + } + + /** + * 延迟执行某任务,此方法可以多次重复调用,若之前的任务还没有执行,那么会取消原任务的执行,改为执行新任务。 + * @param taskId 任务Id,用于区分不同类别的延迟任务 + * @param task 需要执行的任务 + * @param delay 延迟时间 + * @param unit 延迟的时间单位 + */ + + @SuppressWarnings("unchecked") + public void delay(String taskId, Runnable task, long delay, TimeUnit unit) { + ScheduledFuture taskHandle = taskHandles.get(taskId); + if (taskHandle == null || taskHandle.isDone()) { + taskHandle = (ScheduledFuture) scheduler.schedule(task, delay, unit); + } else { + taskHandle.cancel(true); + taskHandle = (ScheduledFuture) scheduler.schedule(task, delay, unit); + } + taskHandles.put(taskId, taskHandle); + } + + /** + * 取消指定延迟任务的执行 + * @param taskId 任务Id + */ + + public void cancel(String taskId) { + ScheduledFuture taskHandle = taskHandles.get(taskId); + if (taskHandle != null && !taskHandle.isDone()) { + taskHandle.cancel(true); + } + } + + /** + * 取消所有延迟任务的执行 + */ + + public void cancelAllTask() { + for (String taskId : taskHandles.keySet()) { + ScheduledFuture taskHandle = taskHandles.get(taskId); + if (taskHandle != null && !taskHandle.isDone()) { + taskHandle.cancel(true); + } + } + } + + /** + * 在所有已安排的任务都执行完毕后结束并清除线程池。 + */ + public void shutdown() { + scheduler.shutdown(); + } + +} diff --git a/.svn/pristine/47/47c4fbb849668da8b1ee8a94dc69b0495d791d0c.svn-base b/.svn/pristine/47/47c4fbb849668da8b1ee8a94dc69b0495d791d0c.svn-base new file mode 100644 index 0000000..bf7b088 --- /dev/null +++ b/.svn/pristine/47/47c4fbb849668da8b1ee8a94dc69b0495d791d0c.svn-base @@ -0,0 +1,37 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core; + +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; + +/** + * WEB容器启动侦听,负责框架的启动 + */ + +public class CometAppListener implements ServletContextListener { + + /* + * 容器初始化 + * @see + * javax.servlet.ServletContextListener#contextInitialized(javax.servlet + * .ServletContextEvent) + */ + public void contextInitialized(ServletContextEvent event) { + CometContext cct = CometContext.getInstance(); + cct.init(event); + } + + /* + * 容器销毁 + * @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet. + * ServletContextEvent) + */ + public void contextDestroyed(ServletContextEvent event) { + CometContext.getInstance().destroy(); + } + +} diff --git a/.svn/pristine/48/489a89194c470d46e8b12281346317a8e3060725.svn-base b/.svn/pristine/48/489a89194c470d46e8b12281346317a8e3060725.svn-base new file mode 100644 index 0000000..9835150 --- /dev/null +++ b/.svn/pristine/48/489a89194c470d46e8b12281346317a8e3060725.svn-base @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/.svn/pristine/4a/4a00ecceb9251d9a97c38d344997e29ebc8b1c8b.svn-base b/.svn/pristine/4a/4a00ecceb9251d9a97c38d344997e29ebc8b1c8b.svn-base new file mode 100644 index 0000000..86d5095 Binary files /dev/null and b/.svn/pristine/4a/4a00ecceb9251d9a97c38d344997e29ebc8b1c8b.svn-base differ diff --git a/.svn/pristine/4a/4a1da81042b989e387204cd24e703e8485c01374.svn-base b/.svn/pristine/4a/4a1da81042b989e387204cd24e703e8485c01374.svn-base new file mode 100644 index 0000000..bf069c2 Binary files /dev/null and b/.svn/pristine/4a/4a1da81042b989e387204cd24e703e8485c01374.svn-base differ diff --git a/.svn/pristine/4b/4b06b48fe4c4d9c15f57745d3646526daccae32b.svn-base b/.svn/pristine/4b/4b06b48fe4c4d9c15f57745d3646526daccae32b.svn-base new file mode 100644 index 0000000..b7465b4 --- /dev/null +++ b/.svn/pristine/4b/4b06b48fe4c4d9c15f57745d3646526daccae32b.svn-base @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/.svn/pristine/4b/4b555a816385a16ace1af5a73a4cea3aa082ddb5.svn-base b/.svn/pristine/4b/4b555a816385a16ace1af5a73a4cea3aa082ddb5.svn-base new file mode 100644 index 0000000..aeb9af9 --- /dev/null +++ b/.svn/pristine/4b/4b555a816385a16ace1af5a73a4cea3aa082ddb5.svn-base @@ -0,0 +1,60 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.util; + +import javax.servlet.http.HttpServletRequest; + +/** + * 浏览器工具类 + */ + +public class ExplorerUtil { + + public static Boolean isIE(HttpServletRequest request) { + String regEx = "msie"; + String userAgent = request.getHeader("User-Agent").toLowerCase(); + return userAgent.indexOf(regEx) == -1 ? false : true; + } + + public static Boolean isFirefox(HttpServletRequest request) { + String regEx = "firefox"; + String userAgent = request.getHeader("User-Agent").toLowerCase(); + return userAgent.indexOf(regEx) == -1 ? false : true; + } + + public static Boolean isOpera(HttpServletRequest request) { + String regEx = "opera"; + String userAgent = request.getHeader("User-Agent").toLowerCase(); + return userAgent.indexOf(regEx) == -1 ? false : true; + } + + public static Boolean isChrome(HttpServletRequest request) { + String regEx = "\bchrome\b"; + String userAgent = request.getHeader("User-Agent").toLowerCase(); + return userAgent.indexOf(regEx) == -1 ? false : true; + } + + public static Boolean isAir(HttpServletRequest request) { + String regEx = "adobeair"; + String userAgent = request.getHeader("User-Agent").toLowerCase(); + return userAgent.indexOf(regEx) == -1 ? false : true; + } + + public static Boolean isSafari(HttpServletRequest request) { + String regEx = "safari"; + String userAgent = request.getHeader("User-Agent").toLowerCase(); + if (userAgent.indexOf(regEx) != -1 && !isChrome(request)) { + return true; + } else { + return false; + } + } + + // 是否可以进行HTTP长连接 + public static Boolean canStreamingXHR(HttpServletRequest request) { + return (isSafari(request) || isAir(request) || isChrome(request) || isFirefox(request)) ? true : false; + } +} diff --git a/.svn/pristine/4b/4ba89d70b68a39db3aca584d077779e3e744259c.svn-base b/.svn/pristine/4b/4ba89d70b68a39db3aca584d077779e3e744259c.svn-base new file mode 100644 index 0000000..f3e13a4 --- /dev/null +++ b/.svn/pristine/4b/4ba89d70b68a39db3aca584d077779e3e744259c.svn-base @@ -0,0 +1,7 @@ +set extDocJarFile="ext-doc.jar" +set extDocXMLFile="comet4j-js-doc.xml" +set extDocTemplate="template/ext/template.xml" +set outputFolder="../docs" +java -jar %extDocJarFile% -p %extDocXMLFile% -o %outputFolder% -t %extDocTemplate% -verbose + +echo. & pause \ No newline at end of file diff --git a/.svn/pristine/4e/4e1eaf1e18687f3a6b88bdc1414af80b27df666f.svn-base b/.svn/pristine/4e/4e1eaf1e18687f3a6b88bdc1414af80b27df666f.svn-base new file mode 100644 index 0000000..8846b0f Binary files /dev/null and b/.svn/pristine/4e/4e1eaf1e18687f3a6b88bdc1414af80b27df666f.svn-base differ diff --git a/.svn/pristine/4e/4e37a3465f9086bdb499bb5c27bf3805848146d3.svn-base b/.svn/pristine/4e/4e37a3465f9086bdb499bb5c27bf3805848146d3.svn-base new file mode 100644 index 0000000..fa8ab3f Binary files /dev/null and b/.svn/pristine/4e/4e37a3465f9086bdb499bb5c27bf3805848146d3.svn-base differ diff --git a/.svn/pristine/4e/4ef589c7a2bc9c2381038e6afadd256961bbd007.svn-base b/.svn/pristine/4e/4ef589c7a2bc9c2381038e6afadd256961bbd007.svn-base new file mode 100644 index 0000000..176f9f4 --- /dev/null +++ b/.svn/pristine/4e/4ef589c7a2bc9c2381038e6afadd256961bbd007.svn-base @@ -0,0 +1,120 @@ + + + + +JS.XMLHttpRequest测试 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
连接器测试 
  +
XMLHttpRequest onReadyStateChange Event :
+
+
Connector Events :
测试指导:
+ + + diff --git a/.svn/pristine/4f/4f5bdda24a3e4274b92ff391e5341f7ee328a7d7.svn-base b/.svn/pristine/4f/4f5bdda24a3e4274b92ff391e5341f7ee328a7d7.svn-base new file mode 100644 index 0000000..5ed7f00 Binary files /dev/null and b/.svn/pristine/4f/4f5bdda24a3e4274b92ff391e5341f7ee328a7d7.svn-base differ diff --git a/.svn/pristine/4f/4f610dba832d60efe25b0d6e7d54143fe7ff2572.svn-base b/.svn/pristine/4f/4f610dba832d60efe25b0d6e7d54143fe7ff2572.svn-base new file mode 100644 index 0000000..4d3c5e9 --- /dev/null +++ b/.svn/pristine/4f/4f610dba832d60efe25b0d6e7d54143fe7ff2572.svn-base @@ -0,0 +1,346 @@ +body { + font: normal 12px verdana,arial,tahoma; +} +html, body { + margin:0; + padding:0; + border:0 none; + overflow:hidden; + height:100%; + width:100%; +} +#class .loading-indicator{ + font-size:12px; + height:18px; +} + + +#docs .top-toolbar{ + border:0 none; + border-top:1px solid #d0d0d0; + background:transparent; +} +#docs .top-toolbar button { + +} +.x-panel-noborder { + border: 0 none; +} +#header{ + border:0 none; + background:#1E4176 url(hd-bg.gif) repeat-x 0 0; + padding-top:3px; + padding-left:3px; +} +.docs-header .x-panel-body { + background:transparent; +} + +#header { + +} + +#header .api-title { + font:normal 16px tahoma, arial, sans-serif; + color:white; + margin:5px; +} + +.loading-indicator { + font-size:11px; + background-image:url('../resources/images/default/grid/loading.gif'); + background-repeat: no-repeat; + background-position:top left; + padding-left:20px; + height:18px; + text-align:left; +} + +#doc-body .loading-indicator { + font:bold 13px Tahoma, Verdana, Arial, Helvetica, sans-serif; + position:absolute; + top:35%; + left:43%; + color:#444; + background-image:url(../resources/images/default/shared/large-loading.gif); + background-repeat: no-repeat; + background-position:left 5px; + padding:10px 10px 10px 38px; + text-align:left; +} +a#welcome-link{ + background:#fff url(docs.gif) no-repeat 0px 0px; + padding-left:18px; +} +a#help-forums{ + background:#fff url(forum.gif) no-repeat 16px 0px; + padding-left:34px; + display:block +} +#loading-mask{ + position:absolute; + left:0; + top:0; + width:100%; + height:100%; + z-index:20000; + background-color:white; +} +#loading{ + position:absolute; + left:45%; + top:40%; + padding:2px; + z-index:20001; + height:auto; +} +#loading img { + margin-bottom:5px; +} +#loading .loading-indicator{ + background:white; + color:#555; + font:bold 13px tahoma,arial,helvetica; + padding:10px; + margin:0; + text-align:center; + height:auto; +} +#api-tree a span { + font-family:verdana,arial,tahoma,sans-serif; + font-size:11px; +} +#api-tree .cls a:hover span { + text-decoration:underline; +} +#api-tree .x-panel-body { + background-color:white; + position:relative; + padding:3px; +} +#api-tree .cls{ + border:1px solid #fff; +} + +#api-tree .x-tree-selected { + border:1px dotted #a3bae9; + background:#DFE8F6; +} +#api-tree .x-tree-node .x-tree-selected a span{ + background:transparent; + color:#1E4176; + font-weight:bold; +} + +a { + color: #1E4176; +} +a:link { + color: #1E4176; + text-decoration: none; +} + +a:visited { + color: #555; + text-decoration: none; +} + +a:hover { + text-decoration: underline; + color: #15428b; +} + +#welcome { + position:relative; + top:0; + left: 0; + zoom:1; +} +.col{ + margin:0 250px 0 10px; + zoom:1; + padding: 10px 0; +} + +.col-last { + width: 220px; + position:absolute; + right:10px; + top:10px; +} + +.block{ + margin-bottom:10px; +} +.block-title{ + color: #1E4176; + font:normal 18px tahoma,verdana,sans-serif; + letter-spacing:-1px; + padding: 4px; + padding-left: 8px; +} +.block-body{ + padding:8px; + padding-top:2px; +} +.block-body b{ + color:#333333; + font-size:11px; +} +.block-body em { + display:block; + margin-top:5px; + font-size:11px; + color:gray; + text-align:right; +} +.list{ + list-style: square; + padding-left:20px; + margin-top:5px; +} + +.res-block { + padding-top:5px; + background:transparent url(block-top.gif) no-repeat; + width:210px; + margin-bottom:15px; +} +.res-block-inner { + padding:6px 11px; + background:transparent url(block-bottom.gif) no-repeat left bottom; +} + +.res-block h3 { + font: bold 12px tahoma,arial,sans-serif; + color:#555; + margin-bottom:8px; +} + +.res-block ul { + list-style-type: disc; + margin-left:15px; + font: normal 12px tahoma,arial,sans-serif; + color:#555; +} + +.res-block ul li { + margin:0 0 5px 3px; +} + +.hide-inherited .inherited { + display:none; +} + +#doc-body .x-tab-panel-body { + background:#fff url(../resources/images/default/form/text-bg.gif) repeat-x 0 0; +} +#doc-body .x-panel-body, #doc-body .body-wrap { + background:transparent !important; +} +.icon-cls { + background-image: url(class.gif) !important; +} +.icon-event { + background-image: url(event.gif) !important; +} +.icon-config { + background-image: url(config.gif) !important; +} +.icon-prop { + background-image: url(prop.gif) !important; +} +.icon-method { + background-image: url(method.gif) !important; +} +.icon-cmp { + background-image: url(cmp.gif) !important; +} +.icon-pkg { + background-image: url(pkg.gif) !important; +} +.icon-fav { + background-image: url(fav.gif) !important; +} +.icon-static { + background-image: url(static.gif) !important; +} +.icon-docs { + background-image: url(docs.gif) !important; +} +.icon-expand-all { + background-image: url(expand-all.gif) !important; +} +.icon-collapse-all { + background-image: url(collapse-all.gif) !important; +} +.icon-expand-members { + background-image: url(expand-members.gif) !important; +} +.icon-hide-inherited { + background-image: url(hide-inherited.gif) !important; +} + +#legend li { + line-height:16px; +} +.item-icon { + vertical-align:top; + width:16px; + height:16px; + margin-right:6px; +} +.ext-ie .item-icon { + vertical-align:middle; +} +h3.home-title { + margin:5px 0; + font:bold 13px tahoma,arial,sans-serif; + color:#444; +} + +.search-item { + margin:5px 5px 9px; + padding:0 5px 10px 0; +} + +.search-item .member { + font:bold 12px tahoma,arial,sans-serif; + color:#444; + margin:5px; + overflow:hidden; + white-space:nowrap; + zoom:1; +} + +.search-item .cls { + font:normal 12px tahoma,arial,sans-serif; + color:#444; + margin:5px; + overflow:hidden; + text-align:left; + white-space:nowrap; + zoom:1; +} +.search-item p { + font:normal 11px tahoma,arial,sans-serif; + clear:both; + margin: 0 5px 5px 28px; + color:#444; + zoom:1; +} +#search .loading-indicator { + position:static !important; +} +#search h3 { + font:normal 12px tahoma,arial,sans-serif; + color:#444; + margin:10px; +} +.inner-link .item-icon, .bookmark .item-icon{ + margin-right:3px; +} +.inner-link, .bookmark { + margin-left:10px; +} + diff --git a/.svn/pristine/4f/4fd89c108f4f8e9fff89b28cc248e5719437b8c5.svn-base b/.svn/pristine/4f/4fd89c108f4f8e9fff89b28cc248e5719437b8c5.svn-base new file mode 100644 index 0000000..c12caa9 --- /dev/null +++ b/.svn/pristine/4f/4fd89c108f4f8e9fff89b28cc248e5719437b8c5.svn-base @@ -0,0 +1,16 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.listener; + +import org.comet4j.core.event.BeforeRemoveEvent; +import org.comet4j.event.Listener; + +/** + * 连接即将移除事件侦听抽象类 + */ +public abstract class BeforeRemoveListener extends Listener { + +} diff --git a/.svn/pristine/50/5066e486306dfaa0e0c3a6b979f57d4d9149ce0f.svn-base b/.svn/pristine/50/5066e486306dfaa0e0c3a6b979f57d4d9149ce0f.svn-base new file mode 100644 index 0000000..9b53390 Binary files /dev/null and b/.svn/pristine/50/5066e486306dfaa0e0c3a6b979f57d4d9149ce0f.svn-base differ diff --git a/.svn/pristine/52/527f403fb298a21124eaff23475d40c19cfa8065.svn-base b/.svn/pristine/52/527f403fb298a21124eaff23475d40c19cfa8065.svn-base new file mode 100644 index 0000000..1ea5296 --- /dev/null +++ b/.svn/pristine/52/527f403fb298a21124eaff23475d40c19cfa8065.svn-base @@ -0,0 +1,9 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.event.demo.mac; + +public class SubEventType { +} diff --git a/.svn/pristine/53/5300faed209b08bf91d8cfe36ce1e1b0d9674182.svn-base b/.svn/pristine/53/5300faed209b08bf91d8cfe36ce1e1b0d9674182.svn-base new file mode 100644 index 0000000..907bc33 --- /dev/null +++ b/.svn/pristine/53/5300faed209b08bf91d8cfe36ce1e1b0d9674182.svn-base @@ -0,0 +1,186 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.temp; + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.Date; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.catalina.CometEvent; +import org.apache.catalina.CometProcessor; + +/** + * + */ +public class StreamingXHRServlet extends HttpServlet implements CometProcessor { + + private static final long serialVersionUID = 1L; + protected ArrayList connections = new ArrayList(); + protected MessageSender messageSender = null; + protected Boolean debug = false; + + /** + * @see HttpServlet#HttpServlet() + */ + public StreamingXHRServlet() { + super(); + } + + /* + * (non-Javadoc) + * @see javax.servlet.GenericServlet#init(javax.servlet.ServletConfig) + */ + @Override + public void init() throws ServletException { + + messageSender = new MessageSender(); + Thread messageSenderThread = new Thread(messageSender, "MessageSender[" + getServletContext().getContextPath() + + "]"); + messageSenderThread.setDaemon(true); + messageSenderThread.start(); + + Thread timeSenderThread = new Thread(new TimeSender()); + timeSenderThread.setDaemon(true); + timeSenderThread.start(); + + } + + /* + * (non-Javadoc) + * @see javax.servlet.GenericServlet#destroy() + */ + @Override + public void destroy() { + connections.clear(); + messageSender.stop(); + messageSender = null; + debug = null; + } + + /* + * (non-Javadoc) + * @see + * org.apache.catalina.CometProcessor#event(org.apache.catalina.CometEvent) + */ + @SuppressWarnings("unused") + public void event(CometEvent event) throws IOException, ServletException { + HttpServletRequest request = event.getHttpServletRequest(); + HttpServletResponse response = event.getHttpServletResponse(); + + if (event.getEventType() == CometEvent.EventType.BEGIN) { + // event.setTimeout(0); + log("-->begin"); + synchronized (connections) { + connections.add(response); + } + event.setTimeout(6000); + } else if (event.getEventType() == CometEvent.EventType.ERROR) { + log("-->error"); + synchronized (connections) { + connections.remove(response); + } + if (event.getEventSubType() == CometEvent.EventSubType.TIMEOUT) { + response.setStatus(408); + } + response.getWriter().close(); + event.close(); + + } else if (event.getEventType() == CometEvent.EventType.END) { + log("-->end"); + synchronized (connections) { + connections.remove(response); + } + response.getWriter().close(); + event.close(); + } else if (event.getEventType() == CometEvent.EventType.READ) { + log("-->read"); + } + + } + + class TimeSender implements Runnable { + + @SuppressWarnings("deprecation") + public void run() { + while (true) { + messageSender.send("System", new Date().toLocaleString()); + log("send" + new Date().toLocaleString()); + try { + Thread.sleep(5000); + } catch (InterruptedException ignore) { + } + } + } + } + + public class MessageSender implements Runnable { + + protected boolean running = true; + protected ArrayList messages = new ArrayList(); + + public MessageSender() { + } + + public void stop() { + running = false; + } + + public void send(String user, String message) { + synchronized (messages) { + messages.add("[" + user + "]: " + message); + messages.notify(); + } + } + + public void run() { + + while (running) { + + if (messages.size() == 0) { + try { + synchronized (messages) { + messages.wait(); + } + } catch (InterruptedException e) { + // Ignore + } + } + + synchronized (connections) { + String[] pendingMessages = null; + synchronized (messages) { + pendingMessages = messages.toArray(new String[0]); + messages.clear(); + } + // Send any pending message on all the open connections + for (int i = 0; i < connections.size(); i++) { + try { + PrintWriter writer = connections.get(i).getWriter(); + for (int j = 0; j < pendingMessages.length; j++) { + writer.println(pendingMessages[j] + "
"); + // writer.print("<{a:'aa',b:'bb'}>"); + } + writer.flush(); + // log("Message Out:..."); + } catch (IOException e) { + // log("IOExeption sending message", e); + } + } + } + + } + + } + + } + +} diff --git a/.svn/pristine/53/53940d46707092cdf5d309b010352f2465b08a44.svn-base b/.svn/pristine/53/53940d46707092cdf5d309b010352f2465b08a44.svn-base new file mode 100644 index 0000000..24724bc --- /dev/null +++ b/.svn/pristine/53/53940d46707092cdf5d309b010352f2465b08a44.svn-base @@ -0,0 +1,925 @@ +/* + * Ext JS Library 2.2 + * Copyright(c) 2006-2008, Ext JS, LLC. + * licensing@extjs.com + * + * http://extjs.com/license + */ + +html,body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquote,th,td{margin:0;padding:0;} +img,body,html{border:0;} +address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;} +ol,ul{list-style:none;} +caption,th{text-align:left;} +h1,h2,h3,h4,h5,h6{font-size:100%;} +q:before,q:after{content:'';} + +.ext-el-mask{z-index:20000;position:absolute;top:0;left:0;-moz-opacity:0.5;opacity:.50;filter:alpha(opacity=50);background-color:#CCC;width:100%;height:100%;zoom:1;} +.ext-el-mask-msg{z-index:20001;position:absolute;top:0;left:0;border:1px solid #6593cf;background:#c3daf9 url(../images/default/box/tb-blue.gif) repeat-x 0 -16px;padding:2px;} +.ext-el-mask-msg div{padding:5px 10px 5px 10px;background:#eee;border:1px solid #a3bad9;color:#222;font:normal 11px tahoma,arial,helvetica,sans-serif;cursor:wait;} +.ext-shim{position:absolute;visibility:hidden;left:0;top:0;overflow:hidden;} +.ext-ie .ext-shim{filter:alpha(opacity=0);} +.ext-ie6 .ext-shim{margin-left:5px;margin-top:3px;} +.x-mask-loading div{padding:5px 10px 5px 25px;background:#fbfbfb url( '../images/default/grid/loading.gif' ) no-repeat 5px 5px;line-height:16px;} +.x-hidden,.x-hide-offsets{position:absolute;left:-10000px;top:-10000px;visibility:hidden;} +.x-hide-display{display:none!important;} +.x-hide-visibility{visibility:hidden!important;} +.x-masked{overflow:hidden!important;} +.x-masked select,.x-masked object,.x-masked embed{visibility:hidden;} +.x-layer{visibility:hidden;} +.x-unselectable,.x-unselectable *{-moz-user-select:none;-khtml-user-select:none;} +.x-repaint{zoom:1;background-color:transparent;-moz-outline:none;} +.x-item-disabled{color:gray;cursor:default;opacity:.6;-moz-opacity:.6;filter:alpha(opacity=60);} +.x-item-disabled *{color:gray!important;cursor:default!important;} +.x-splitbar-proxy{position:absolute;visibility:hidden;z-index:20001;background:#aaa;zoom:1;line-height:1px;font-size:1px;overflow:hidden;} +.x-splitbar-h,.x-splitbar-proxy-h{cursor:e-resize;cursor:col-resize;} +.x-splitbar-v,.x-splitbar-proxy-v{cursor:s-resize;cursor:row-resize;} +.x-color-palette{width:150px;height:92px;cursor:pointer;} +.x-color-palette a{border:1px solid #fff;float:left;padding:2px;text-decoration:none;-moz-outline:0 none;outline:0 none;cursor:pointer;} +.x-color-palette a:hover,.x-color-palette a.x-color-palette-sel{border:1px solid #8BB8F3;background:#deecfd;} +.x-color-palette em{display:block;border:1px solid #ACA899;} +.x-color-palette em span{cursor:pointer;display:block;height:10px;line-height:10px;width:10px;} +.x-ie-shadow{display:none;position:absolute;overflow:hidden;left:0;top:0;background:#777;zoom:1;} +.x-shadow{display:none;position:absolute;overflow:hidden;left:0;top:0;} +.x-shadow *{overflow:hidden;} +.x-shadow *{padding:0;border:0;margin:0;clear:none;zoom:1;} +.x-shadow .xstc,.x-shadow .xsbc{height:6px;float:left;} +.x-shadow .xstl,.x-shadow .xstr,.x-shadow .xsbl,.x-shadow .xsbr{width:6px;height:6px;float:left;} +.x-shadow .xsc{width:100%;} +.x-shadow .xsml,.x-shadow .xsmr{width:6px;float:left;height:100%;} +.x-shadow .xsmc{float:left;height:100%;background:transparent url( ../images/default/shadow-c.png );} +.x-shadow .xst,.x-shadow .xsb{height:6px;overflow:hidden;width:100%;} +.x-shadow .xsml{background:transparent url( ../images/default/shadow-lr.png ) repeat-y 0 0;} +.x-shadow .xsmr{background:transparent url( ../images/default/shadow-lr.png ) repeat-y -6px 0;} +.x-shadow .xstl{background:transparent url( ../images/default/shadow.png ) no-repeat 0 0;} +.x-shadow .xstc{background:transparent url( ../images/default/shadow.png ) repeat-x 0 -30px;} +.x-shadow .xstr{background:transparent url( ../images/default/shadow.png ) repeat-x 0 -18px;} +.x-shadow .xsbl{background:transparent url( ../images/default/shadow.png ) no-repeat 0 -12px;} +.x-shadow .xsbc{background:transparent url( ../images/default/shadow.png ) repeat-x 0 -36px;} +.x-shadow .xsbr{background:transparent url( ../images/default/shadow.png ) repeat-x 0 -6px;} +.loading-indicator{font-size:11px;background-image:url(../images/default/grid/loading.gif);background-repeat:no-repeat;background-position:left;padding-left:20px;line-height:16px;margin:3px;} +.x-text-resize{position:absolute;left:-1000px;top:-1000px;visibility:hidden;zoom:1;} +.x-drag-overlay{width:100%;height:100%;display:none;position:absolute;left:0;top:0;background-image:url(../images/default/s.gif);z-index:20000;} +.x-clear{clear:both;height:0;overflow:hidden;line-height:0;font-size:0;} +.x-spotlight{z-index:8999;position:absolute;top:0;left:0;-moz-opacity:0.5;opacity:.50;filter:alpha(opacity=50);background-color:#CCC;width:0;height:0;zoom:1;} + +.x-tab-panel{overflow:hidden;} +.x-tab-panel-header,.x-tab-panel-footer{background:#deecfd;border:1px solid #8db2e3;overflow:hidden;zoom:1;} +.x-tab-panel-header{border:1px solid #8db2e3;padding-bottom:2px;} +.x-tab-panel-footer{border:1px solid #8db2e3;padding-top:2px;} +.x-tab-strip-wrap{width:100%;overflow:hidden;position:relative;zoom:1;} +ul.x-tab-strip{display:block;width:5000px;zoom:1;} +ul.x-tab-strip-top{padding-top:1px;background:url(../images/default/tabs/tab-strip-bg.gif) #cedff5 repeat-x bottom;border-bottom:1px solid #8db2e3;} +ul.x-tab-strip-bottom{padding-bottom:1px;background:url(../images/default/tabs/tab-strip-btm-bg.gif) #cedff5 repeat-x top;border-top:1px solid #8db2e3;border-bottom:0 none;} +.x-tab-panel-header-plain .x-tab-strip-top{background:transparent!important;padding-top:0!important;} +.x-tab-panel-header-plain{background:transparent!important;border-width:0!important;padding-bottom:0!important;} +.x-tab-panel-header-plain .x-tab-strip-spacer,.x-tab-panel-footer-plain .x-tab-strip-spacer{border:1px solid #8db2e3;height:2px;background:#deecfd;font-size:1px;line-height:1px;} +.x-tab-panel-header-plain .x-tab-strip-spacer{border-top:0 none;} +.x-tab-panel-footer-plain .x-tab-strip-spacer{border-bottom:0 none;} +.x-tab-panel-footer-plain .x-tab-strip-bottom{background:transparent!important;padding-bottom:0!important;} +.x-tab-panel-footer-plain{background:transparent!important;border-width:0!important;padding-top:0!important;} +.ext-border-box .x-tab-panel-header-plain .x-tab-strip-spacer,.ext-border-box .x-tab-panel-footer-plain .x-tab-strip-spacer{height:3px;} +ul.x-tab-strip li{float:left;margin-left:2px;} +ul.x-tab-strip li.x-tab-edge{float:left;margin:0!important;padding:0!important;border:0 none!important;font-size:1px!important;line-height:1px!important;overflow:hidden;zoom:1;background:transparent!important;width:1px;} +.x-tab-strip a,.x-tab-strip span,.x-tab-strip em{display:block;} +.x-tab-strip a{text-decoration:none!important;-moz-outline:none;outline:none;cursor:pointer;} +.x-tab-strip-inner{overflow:hidden;text-overflow:ellipsis;} +.x-tab-strip span.x-tab-strip-text{font:normal 11px tahoma,arial,helvetica;color:#416aa3;white-space:nowrap;cursor:pointer;padding:4px 0;} +.x-tab-strip-top .x-tab-with-icon .x-tab-right{padding-left:6px;} +.x-tab-strip .x-tab-with-icon span.x-tab-strip-text{padding-left:20px;background-position:0 3px;background-repeat:no-repeat;} +.x-tab-strip-over span.x-tab-strip-text{color:#15428b;} +.x-tab-strip-active,.x-tab-strip-active a.x-tab-right{cursor:default;} +.x-tab-strip-active span.x-tab-strip-text{cursor:default;color:#15428b;font-weight:bold;} +.x-tab-strip-disabled .x-tabs-text{cursor:default;color:#aaa;} +.x-tab-panel-body{overflow:hidden;} +.x-tab-panel-bwrap{overflow:hidden;} +.ext-ie .x-tab-strip .x-tab-right{position:relative;} +.x-tab-strip-top .x-tab-strip-active .x-tab-right{margin-bottom:-1px;} +.x-tab-strip-top .x-tab-strip-active .x-tab-right span.x-tab-strip-text{padding-bottom:5px;} +.x-tab-strip-bottom .x-tab-strip-active .x-tab-right{margin-top:-1px;} +.x-tab-strip-bottom .x-tab-strip-active .x-tab-right span.x-tab-strip-text{padding-top:5px;} +.x-tab-strip-top .x-tab-right{background:transparent url(../images/default/tabs/tabs-sprite.gif) no-repeat 0 -51px;padding-left:10px;} +.x-tab-strip-top .x-tab-left{background:transparent url(../images/default/tabs/tabs-sprite.gif) no-repeat right -351px;padding-right:10px;} +.x-tab-strip-top .x-tab-strip-inner{background:transparent url(../images/default/tabs/tabs-sprite.gif) repeat-x 0 -201px;} +.x-tab-strip-top .x-tab-strip-over .x-tab-right{background-position:0 -101px;} +.x-tab-strip-top .x-tab-strip-over .x-tab-left{background-position:right -401px;} +.x-tab-strip-top .x-tab-strip-over .x-tab-strip-inner{background-position:0 -251px;} +.x-tab-strip-top .x-tab-strip-active .x-tab-right{background-position:0 0;} +.x-tab-strip-top .x-tab-strip-active .x-tab-left{background-position:right -301px;} +.x-tab-strip-top .x-tab-strip-active .x-tab-strip-inner{background-position:0 -151px;} +.x-tab-strip-bottom .x-tab-right{background:url(../images/default/tabs/tab-btm-inactive-right-bg.gif) no-repeat bottom right;} +.x-tab-strip-bottom .x-tab-left{background:url(../images/default/tabs/tab-btm-inactive-left-bg.gif) no-repeat bottom left;} +.x-tab-strip-bottom .x-tab-strip-active .x-tab-right{background:url(../images/default/tabs/tab-btm-right-bg.gif) no-repeat bottom left;} +.x-tab-strip-bottom .x-tab-strip-active .x-tab-left{background:url(../images/default/tabs/tab-btm-left-bg.gif) no-repeat bottom right;} +.x-tab-strip-bottom .x-tab-left{padding:0 10px;} +.x-tab-strip-bottom .x-tab-right{padding:0;} +.x-tab-strip .x-tab-strip-close{display:none;} +.x-tab-strip-closable{position:relative;} +.x-tab-strip-closable .x-tab-left{padding-right:19px;} +.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close{background-image:url(../images/default/tabs/tab-close.gif);opacity:.6;-moz-opacity:.6;background-repeat:no-repeat;display:block;width:11px;height:11px;position:absolute;top:3px;right:3px;cursor:pointer;z-index:2;} +.x-tab-strip .x-tab-strip-active a.x-tab-strip-close{opacity:.8;-moz-opacity:.8;} +.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close:hover{background-image:url(../images/default/tabs/tab-close.gif);opacity:1;-moz-opacity:1;} +.x-tab-panel-body{border:1px solid #8db2e3;background:#fff;} +.x-tab-panel-body-top{border-top:0 none;} +.x-tab-panel-body-bottom{border-bottom:0 none;} +.x-tab-scroller-left{background:transparent url(../images/default/tabs/scroll-left.gif) no-repeat -18px 0;border-bottom:1px solid #8db2e3;width:18px;position:absolute;left:0;top:0;z-index:10;cursor:pointer;} +.x-tab-scroller-left-over{background-position:0 0;} +.x-tab-scroller-left-disabled{background-position:-18px 0;opacity:.5;-moz-opacity:.5;filter:alpha(opacity=50);cursor:default;} +.x-tab-scroller-right{background:transparent url(../images/default/tabs/scroll-right.gif) no-repeat 0 0;border-bottom:1px solid #8db2e3;width:18px;position:absolute;right:0;top:0;z-index:10;cursor:pointer;} +.x-tab-scroller-right-over{background-position:-18px 0;} +.x-tab-scroller-right-disabled{background-position:0 0;opacity:.5;-moz-opacity:.5;filter:alpha(opacity=50);cursor:default;} +.x-tab-scrolling .x-tab-strip-wrap{margin-left:18px;margin-right:18px;} +.x-tab-scrolling{position:relative;} +.x-tab-panel-bbar .x-toolbar{border:1px solid #99bbe8;border-top:0 none;overflow:hidden;padding:2px;} +.x-tab-panel-tbar .x-toolbar{border:1px solid #99bbe8;border-top:0 none;overflow:hidden;padding:2px;} + + .x-form-field{margin:0;font:normal 12px tahoma,arial,helvetica,sans-serif;} +.x-form-text,textarea.x-form-field{padding:1px 3px;background:#fff url(../images/default/form/text-bg.gif) repeat-x 0 0;border:1px solid #B5B8C8;} +textarea.x-form-field{padding:2px 3px;} +.x-form-text{height:22px;line-height:18px;vertical-align:middle;} +.ext-ie .x-form-text{margin:-1px 0;height:22px;line-height:18px;} +.ext-ie textarea.x-form-field{margin:-1px 0;} +.ext-strict .x-form-text{height:18px;} +.ext-safari .x-form-text{height:20px;padding:0 3px;} +.ext-safari.ext-mac textarea.x-form-field{margin-bottom:-2px;} +.ext-gecko .x-form-text{padding-top:2px;padding-bottom:0;} +textarea{resize:none;} +.x-form-select-one{height:20px;line-height:18px;vertical-align:middle;background-color:#fff;border:1px solid #B5B8C8;} +.x-form-check-group,.x-form-radio-group{margin-bottom:0;} +.x-form-check-group .x-form-invalid .x-panel-body,.x-form-radio-group .x-form-invalid .x-panel-body{background-color:transparent;} +.x-form-check-wrap,.x-form-radio-wrap{padding:3px 0 0 0;line-height:18px;} +.x-form-check-group .x-form-check-wrap,.x-form-radio-group .x-form-radio-wrap{height:18px;} +.ext-ie .x-form-check-group .x-form-check-wrap,.ext-ie .x-form-radio-group .x-form-radio-wrap{height:21px;} +.ext-ie .x-form-check-wrap input,.ext-ie .x-form-radio-wrap input{width:15px;height:15px;} +.x-form-check,.x-form-radio{height:13px;width:13px;vertical-align:bottom;} +.x-form-radio{margin-bottom:3px;} +.x-form-check,.ext-ie .x-form-radio{margin-bottom:2px;} +.x-form-check-wrap-inner,.x-form-radio-wrap-inner{display:inline;padding:3px 0 0 0;} +.x-form-check{background:url('../images/default/form/checkbox.gif') no-repeat 0 0;} +.x-form-radio{background:url('../images/default/form/radio.gif') no-repeat 0 0;} +.x-form-check-focus .x-form-check,.x-form-check-over .x-form-check,.x-form-check-focus .x-form-radio,.x-form-check-over .x-form-radio{background-position:-13px 0;} +.x-form-check-down .x-form-check,.x-form-check-down .x-form-radio{background-position:-26px 0;} +.x-form-check-checked .x-form-check-focus .x-form-check,.x-form-check-checked .x-form-check-over .x-form-check{background-position:-13px -13px;} +.x-form-check-checked .x-form-check-down .x-form-check{background-position:-26px -13px;} +.x-form-check-checked .x-form-check,.x-form-check-checked .x-form-radio{background-position:0 -13px;} +.x-form-check-group-label{border-bottom:1px solid #99BBE8;color:#15428B;margin-bottom:5px;padding-left:3px!important;float:none!important;} +.x-form-field-wrap{position:relative;zoom:1;white-space:nowrap;} +.x-form-field-wrap .x-form-trigger{width:17px;height:21px;border:0;background:transparent url(../images/default/form/trigger.gif) no-repeat 0 0;cursor:pointer;border-bottom:1px solid #B5B8C8;position:absolute;top:0;} +.ext-safari .x-form-field-wrap .x-form-trigger{height:21px;} +.x-form-field-wrap .x-form-date-trigger{background-image:url(../images/default/form/date-trigger.gif);cursor:pointer;} +.x-form-field-wrap .x-form-clear-trigger{background-image:url(../images/default/form/clear-trigger.gif);cursor:pointer;} +.x-form-field-wrap .x-form-search-trigger{background-image:url(../images/default/form/search-trigger.gif);cursor:pointer;} +.ext-safari .x-form-field-wrap .x-form-trigger{right:0;} +.x-form-field-wrap .x-form-twin-triggers .x-form-trigger{position:static;top:auto;vertical-align:top;} +.x-form-field-wrap .x-form-trigger-over{background-position:-17px 0;} +.x-form-field-wrap .x-form-trigger-click{background-position:-34px 0;} +.x-trigger-wrap-focus .x-form-trigger{background-position:-51px 0;} +.x-trigger-wrap-focus .x-form-trigger-over{background-position:-68px 0;} +.x-trigger-wrap-focus .x-form-trigger-click{background-position:-85px 0;} +.x-trigger-wrap-focus .x-form-trigger{border-bottom:1px solid #7eadd9;} +.x-item-disabled .x-form-trigger-over{background-position:0 0!important;border-bottom:1px solid #B5B8C8;} +.x-item-disabled .x-form-trigger-click{background-position:0 0!important;border-bottom:1px solid #B5B8C8;} +.x-form-focus,textarea.x-form-focus{border:1px solid #7eadd9;} +.x-form-invalid,textarea.x-form-invalid{background:#fff url(../images/default/grid/invalid_line.gif) repeat-x bottom;border:1px solid #dd7870;} +.ext-safari .x-form-invalid{background-color:#fee;border:1px solid #ff7870;} +.x-editor{visibility:hidden;padding:0;margin:0;} +.x-editor .x-form-check-wrap,.x-editor .x-form-radio-wrap{background:#fff;padding:3px;} +.x-editor .x-form-checkbox{height:13px;} +.x-form-grow-sizer{font:normal 12px tahoma,arial,helvetica,sans-serif;left:-10000px;padding:8px 3px;position:absolute;visibility:hidden;top:-10000px;white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word;zoom:1;} +.x-form-grow-sizer p{margin:0!important;border:0 none!important;padding:0!important;} +.x-form-item{font:normal 12px tahoma,arial,helvetica,sans-serif;display:block;margin-bottom:4px;zoom:1;} +.x-form-item label{display:block;float:left;width:100px;padding:3px;padding-left:0;clear:left;z-index:2;position:relative;} +.x-form-element{padding-left:105px;position:relative;} +.x-form-invalid-msg{color:#e00;padding:2px;padding-left:18px;font:normal 11px tahoma,arial,helvetica,sans-serif;background:transparent url(../images/default/shared/warning.gif) no-repeat 0 2px;line-height:16px;width:200px;} +.x-form-label-right label{text-align:right;} +.x-form-label-left label{text-align:left;} +.x-form-label-top .x-form-item label{width:auto;float:none;clear:none;display:inline;margin-bottom:4px;position:static;} +.x-form-label-top .x-form-element{padding-left:0;padding-top:4px;} +.x-form-label-top .x-form-item{padding-bottom:4px;} +.x-form-empty-field{color:gray;} +.x-small-editor .x-form-field{font:normal 11px arial,tahoma,helvetica,sans-serif;} +.x-small-editor .x-form-text{height:20px;line-height:16px;vertical-align:middle;} +.ext-ie .x-small-editor .x-form-text{margin-top:-1px!important;margin-bottom:-1px!important;height:20px!important;line-height:16px!important;} +.ext-strict .x-small-editor .x-form-text{height:16px!important;} +.ext-safari .x-small-editor .x-form-field{font:normal 12px arial,tahoma,helvetica,sans-serif;} +.ext-ie .x-small-editor .x-form-text{height:20px;line-height:16px;} +.ext-border-box .x-small-editor .x-form-text{height:20px;} +.x-small-editor .x-form-select-one{height:20px;line-height:16px;vertical-align:middle;} +.x-small-editor .x-form-num-field{text-align:right;} +.x-small-editor .x-form-field-wrap .x-form-trigger{height:19px;} +.x-form-clear{clear:both;height:0;overflow:hidden;line-height:0;font-size:0;} +.x-form-clear-left{clear:left;height:0;overflow:hidden;line-height:0;font-size:0;} +.x-form-cb-label{width:'auto'!important;float:none!important;clear:none!important;display:inline!important;margin-left:4px;} +.x-form-column{float:left;padding:0;margin:0;width:48%;overflow:hidden;zoom:1;} +.x-form .x-form-btns-ct .x-btn{float:right;clear:none;} +.x-form .x-form-btns-ct .x-form-btns td{border:0;padding:0;} +.x-form .x-form-btns-ct .x-form-btns-right table{float:right;clear:none;} +.x-form .x-form-btns-ct .x-form-btns-left table{float:left;clear:none;} +.x-form .x-form-btns-ct .x-form-btns-center{text-align:center;} +.x-form .x-form-btns-ct .x-form-btns-center table{margin:0 auto;} +.x-form .x-form-btns-ct table td.x-form-btn-td{padding:3px;} +.x-form .x-form-btns-ct .x-btn-focus .x-btn-left{background-position:0 -147px;} +.x-form .x-form-btns-ct .x-btn-focus .x-btn-right{background-position:0 -168px;} +.x-form .x-form-btns-ct .x-btn-focus .x-btn-center{background-position:0 -189px;} +.x-form .x-form-btns-ct .x-btn-click .x-btn-center{background-position:0 -126px;} +.x-form .x-form-btns-ct .x-btn-click .x-btn-right{background-position:0 -84px;} +.x-form .x-form-btns-ct .x-btn-click .x-btn-left{background-position:0 -63px;} +.x-form-invalid-icon{width:16px;height:18px;visibility:hidden;position:absolute;left:0;top:0;display:block;background:transparent url(../images/default/form/exclamation.gif) no-repeat 0 2px;} +.x-fieldset{border:1px solid #B5B8C8;padding:10px;margin-bottom:10px;display:block;} +.x-fieldset legend{font:bold 11px tahoma,arial,helvetica,sans-serif;color:#15428b;} +.ext-ie .x-fieldset legend{margin-bottom:10px;} +.ext-ie .x-fieldset{padding-top:0;padding-bottom:10px;} +.x-fieldset legend .x-tool-toggle{margin-right:3px;margin-left:0;float:left!important;} +.x-fieldset legend input{margin-right:3px;float:left!important;height:13px;width:13px;} +fieldset.x-panel-collapsed{padding-bottom:0!important;border-width:1px 0 0 0!important;} +fieldset.x-panel-collapsed .x-fieldset-bwrap{visibility:hidden;position:absolute;left:-1000px;top:-1000px;} +.ext-ie .x-fieldset-bwrap{zoom:1;} +.ext-ie td .x-form-text{position:relative;top:-1px;} +.x-fieldset-noborder{border:0 none transparent;} +.x-fieldset-noborder legend{margin-left:-3px;} +.ext-ie .x-fieldset-noborder legend{position:relative;margin-bottom:23px;} +.ext-ie .x-fieldset-noborder legend span{position:absolute;left:-5px;} +.ext-gecko .x-window-body .x-form-item{-moz-outline:none;overflow:auto;} +.ext-gecko .x-form-item{-moz-outline:none;} +.x-hide-label label.x-form-item-label{display:none;} +.x-hide-label .x-form-element{padding-left:0!important;} +.x-fieldset{overflow:hidden;} +.x-fieldset-bwrap{overflow:hidden;zoom:1;} +.x-fieldset-body{overflow:hidden;} + +.x-btn{font:normal 11px tahoma,verdana,helvetica;cursor:pointer;white-space:nowrap;} +.x-btn button{border:0 none;background:transparent;font:normal 11px tahoma,verdana,helvetica;padding-left:3px;padding-right:3px;cursor:pointer;margin:0;overflow:visible;width:auto;-moz-outline:0 none;outline:0 none;} +* html .ext-ie .x-btn button{width:1px;} +.ext-gecko .x-btn button{padding-left:0;padding-right:0;} +.ext-ie .x-btn button{padding-top:2px;} +.x-btn-icon .x-btn-center .x-btn-text{background-position:center;background-repeat:no-repeat;height:16px;width:16px;cursor:pointer;white-space:nowrap;padding:0;} +.x-btn-icon .x-btn-center{padding:1px;} +.x-btn em{font-style:normal;font-weight:normal;} +.x-btn-text-icon .x-btn-center .x-btn-text{background-position:0 2px;background-repeat:no-repeat;padding-left:18px;padding-top:3px;padding-bottom:2px;padding-right:0;} +.ext-gecko3 .x-btn-text-icon .x-btn-center .x-btn-text{padding-top:2px;} +.x-btn-left,.x-btn-right{font-size:1px;line-height:1px;} +.x-btn-left{width:3px;height:21px;background:url(../images/default/button/btn-sprite.gif) no-repeat 0 0;} +.x-btn-right{width:3px;height:21px;background:url(../images/default/button/btn-sprite.gif) no-repeat 0 -21px;} +.x-btn-left i,.x-btn-right i{display:block;width:3px;overflow:hidden;font-size:1px;line-height:1px;} +.x-btn-center{background:url(../images/default/button/btn-sprite.gif) repeat-x 0 -42px;vertical-align:middle;text-align:center;padding:0 5px;cursor:pointer;white-space:nowrap;} +.x-btn-over .x-btn-left{background-position:0 -63px;} +.x-btn-over .x-btn-right{background-position:0 -84px;} +.x-btn-over .x-btn-center{background-position:0 -105px;} +.x-btn-click .x-btn-center,.x-btn-menu-active .x-btn-center{background-position:0 -126px;} +.x-btn-disabled *{color:gray!important;cursor:default!important;} +.x-btn-menu-text-wrap .x-btn-center{padding:0 3px;} +.ext-gecko .x-btn-menu-text-wrap .x-btn-center{padding:0 1px;} +.x-btn-menu-arrow-wrap .x-btn-center{padding:0;} +.x-btn-menu-arrow-wrap .x-btn-center button{width:12px!important;height:21px;padding:0!important;display:block;background:transparent url(../images/default/button/btn-arrow.gif) no-repeat left 3px;} +.x-btn-with-menu .x-btn-center{padding-right:2px!important;} +.x-btn-with-menu .x-btn-center em{display:block;background:transparent url(../images/default/toolbar/btn-arrow.gif) no-repeat right 0;padding-right:10px;} +.x-btn-text-icon .x-btn-with-menu .x-btn-center em{display:block;background:transparent url(../images/default/toolbar/btn-arrow.gif) no-repeat right 3px;padding-right:10px;} +.x-btn-pressed .x-btn-left{background:url(../images/default/button/btn-sprite.gif) no-repeat 0 -63px;} +.x-btn-pressed .x-btn-right{background:url(../images/default/button/btn-sprite.gif) no-repeat 0 -84px;} +.x-btn-pressed .x-btn-center{background:url(../images/default/button/btn-sprite.gif) repeat-x 0 -126px;} + +.x-toolbar{border-color:#a9bfd3;border-style:solid;border-width:0 0 1px 0;display:block;padding:2px;background:#d0def0 url(../images/default/toolbar/bg.gif) repeat-x top left;position:relative;zoom:1;} +.x-toolbar .x-item-disabled .x-btn-icon{opacity:.35;-moz-opacity:.35;filter:alpha(opacity=35);} +.x-toolbar td{vertical-align:middle;} +.mso .x-toolbar,.x-grid-mso .x-toolbar{border:0 none;background:url(../images/default/grid/mso-hd.gif);} +.x-toolbar td,.x-toolbar span,.x-toolbar input,.x-toolbar div,.x-toolbar select,.x-toolbar label{white-space:nowrap;font:normal 11px tahoma,arial,helvetica,sans-serif;} +.x-toolbar .x-item-disabled{color:gray;cursor:default;opacity:.6;-moz-opacity:.6;filter:alpha(opacity=60);} +.x-toolbar .x-item-disabled *{color:gray;cursor:default;} +.x-toolbar .x-btn-left{background:none;} +.x-toolbar .x-btn-right{background:none;} +.x-toolbar .x-btn-center{background:none;padding:0;} +.x-toolbar .x-btn-menu-text-wrap .x-btn-center button{padding-right:2px;} +.ext-gecko .x-toolbar .x-btn-menu-text-wrap .x-btn-center button{padding-right:0;} +.x-toolbar .x-btn-menu-arrow-wrap .x-btn-center button{padding:0 2px;} +.x-toolbar .x-btn-menu-arrow-wrap .x-btn-center button{width:12px;background:transparent url(../images/default/toolbar/btn-arrow.gif) no-repeat 0 3px;} +.x-toolbar .x-btn-text-icon .x-btn-menu-arrow-wrap .x-btn-center button{width:12px;background:transparent url(../images/default/toolbar/btn-arrow.gif) no-repeat 0 3px;} +.x-toolbar .x-btn-over .x-btn-menu-arrow-wrap .x-btn-center button{background-position:0 -47px;} +.x-toolbar .x-btn-over .x-btn-left{background:url(../images/default/toolbar/tb-btn-sprite.gif) no-repeat 0 0;} +.x-toolbar .x-btn-over .x-btn-right{background:url(../images/default/toolbar/tb-btn-sprite.gif) no-repeat 0 -21px;} +.x-toolbar .x-btn-over .x-btn-center{background:url(../images/default/toolbar/tb-btn-sprite.gif) repeat-x 0 -42px;} +.x-toolbar .x-btn-click .x-btn-left,.x-toolbar .x-btn-pressed .x-btn-left,.x-toolbar .x-btn-menu-active .x-btn-left{background:url(../images/default/toolbar/tb-btn-sprite.gif) no-repeat 0 -63px;} +.x-toolbar .x-btn-click .x-btn-right,.x-toolbar .x-btn-pressed .x-btn-right,.x-toolbar .x-btn-menu-active .x-btn-right{background:url(../images/default/toolbar/tb-btn-sprite.gif) no-repeat 0 -84px;} +.x-toolbar .x-btn-click .x-btn-center,.x-toolbar .x-btn-pressed .x-btn-center,.x-toolbar .x-btn-menu-active .x-btn-center{background:url(../images/default/toolbar/tb-btn-sprite.gif) repeat-x 0 -105px;} +.x-toolbar .x-btn-with-menu .x-btn-center em{padding-right:8px;} +.x-toolbar .ytb-text{padding:2px;} +.x-toolbar .ytb-sep{background-image:url(../images/default/grid/grid-blue-split.gif);background-position:center;background-repeat:no-repeat;display:block;font-size:1px;height:16px;width:4px;overflow:hidden;cursor:default;margin:0 2px 0;border:0;} +.x-toolbar .ytb-spacer{width:2px;} +.x-tbar-page-number{width:24px;height:14px;} +.x-tbar-page-first{background-image:url(../images/default/grid/page-first.gif)!important;} +.x-tbar-loading{background-image:url(../images/default/grid/refresh.gif)!important;} +.x-tbar-page-last{background-image:url(../images/default/grid/page-last.gif)!important;} +.x-tbar-page-next{background-image:url(../images/default/grid/page-next.gif)!important;} +.x-tbar-page-prev{background-image:url(../images/default/grid/page-prev.gif)!important;} +.x-item-disabled .x-tbar-loading{background-image:url(../images/default/grid/loading.gif)!important;} +.x-item-disabled .x-tbar-page-first{background-image:url(../images/default/grid/page-first-disabled.gif)!important;} +.x-item-disabled .x-tbar-page-last{background-image:url(../images/default/grid/page-last-disabled.gif)!important;} +.x-item-disabled .x-tbar-page-next{background-image:url(../images/default/grid/page-next-disabled.gif)!important;} +.x-item-disabled .x-tbar-page-prev{background-image:url(../images/default/grid/page-prev-disabled.gif)!important;} +.x-paging-info{position:absolute;top:5px;right:8px;color:#444;} +.x-statusbar .x-status-text{height:21px;line-height:21px;padding:0 4px;cursor:default;} +.x-statusbar .x-status-busy{padding-left:25px;background:transparent url(../images/default/grid/loading.gif) no-repeat 3px 3px;} +.x-statusbar .x-status-text-panel{border-top:1px solid #99BBE8;border-right:1px solid #fff;border-bottom:1px solid #fff;border-left:1px solid #99BBE8;padding:2px 8px 2px 5px;} + +.x-resizable-handle{position:absolute;z-index:100;font-size:1px;line-height:6px;overflow:hidden;background:white;filter:alpha(opacity=0);opacity:0;zoom:1;} +.x-resizable-handle-east{width:6px;cursor:e-resize;right:0;top:0;height:100%;} +.ext-ie .x-resizable-handle-east{margin-right:-1px;} +.x-resizable-handle-south{width:100%;cursor:s-resize;left:0;bottom:0;height:6px;} +.ext-ie .x-resizable-handle-south{margin-bottom:-1px;} +.x-resizable-handle-west{width:6px;cursor:w-resize;left:0;top:0;height:100%;} +.x-resizable-handle-north{width:100%;cursor:n-resize;left:0;top:0;height:6px;} +.x-resizable-handle-southeast{width:6px;cursor:se-resize;right:0;bottom:0;height:6px;z-index:101;} +.x-resizable-handle-northwest{width:6px;cursor:nw-resize;left:0;top:0;height:6px;z-index:101;} +.x-resizable-handle-northeast{width:6px;cursor:ne-resize;right:0;top:0;height:6px;z-index:101;} +.x-resizable-handle-southwest{width:6px;cursor:sw-resize;left:0;bottom:0;height:6px;z-index:101;} +.x-resizable-over .x-resizable-handle,.x-resizable-pinned .x-resizable-handle{filter:alpha(opacity=100);opacity:1;} +.x-resizable-over .x-resizable-handle-east,.x-resizable-pinned .x-resizable-handle-east{background:url(../images/default/sizer/e-handle.gif);background-position:left;} +.x-resizable-over .x-resizable-handle-west,.x-resizable-pinned .x-resizable-handle-west{background:url(../images/default/sizer/e-handle.gif);background-position:left;} +.x-resizable-over .x-resizable-handle-south,.x-resizable-pinned .x-resizable-handle-south{background:url(../images/default/sizer/s-handle.gif);background-position:top;} +.x-resizable-over .x-resizable-handle-north,.x-resizable-pinned .x-resizable-handle-north{background:url(../images/default/sizer/s-handle.gif);background-position:top;} +.x-resizable-over .x-resizable-handle-southeast,.x-resizable-pinned .x-resizable-handle-southeast{background:url(../images/default/sizer/se-handle.gif);background-position:top left;} +.x-resizable-over .x-resizable-handle-northwest,.x-resizable-pinned .x-resizable-handle-northwest{background:url(../images/default/sizer/nw-handle.gif);background-position:bottom right;} +.x-resizable-over .x-resizable-handle-northeast,.x-resizable-pinned .x-resizable-handle-northeast{background:url(../images/default/sizer/ne-handle.gif);background-position:bottom left;} +.x-resizable-over .x-resizable-handle-southwest,.x-resizable-pinned .x-resizable-handle-southwest{background:url(../images/default/sizer/sw-handle.gif);background-position:top right;} +.x-resizable-proxy{border:1px dashed #3b5a82;position:absolute;overflow:hidden;display:none;left:0;top:0;z-index:50000;} +.x-resizable-overlay{width:100%;height:100%;display:none;position:absolute;left:0;top:0;background:white;z-index:200000;-moz-opacity:0;opacity:0;filter:alpha(opacity=0);} + + .x-grid3{position:relative;overflow:hidden;background-color:#fff;} +.x-grid-panel .x-panel-body{overflow:hidden!important;} +.x-grid-panel .x-panel-mc .x-panel-body{border:1px solid #99bbe8;} +.x-grid3 table{table-layout:fixed;} +.x-grid3-viewport{overflow:hidden;} +.x-grid3-hd-row td,.x-grid3-row td,.x-grid3-summary-row td{font:normal 11px arial,tahoma,helvetica,sans-serif;-moz-outline:none;-moz-user-focus:normal;} +.x-grid3-row td,.x-grid3-summary-row td{line-height:13px;vertical-align:top;padding-left:1px;padding-right:1px;-moz-user-select:none;} +.x-grid3-hd-row td{line-height:15px;vertical-align:middle;border-left:1px solid #eee;border-right:1px solid #d0d0d0;} +.x-grid3-hd-row .x-grid3-marker-hd{padding:3px;} +.x-grid3-row .x-grid3-marker{padding:3px;} +.x-grid3-cell-inner,.x-grid3-hd-inner{overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis;padding:3px 3px 3px 5px;white-space:nowrap;} +.x-grid3-hd-inner{position:relative;cursor:inherit;padding:4px 3px 4px 5px;} +.x-grid3-row-body{white-space:normal;} +.x-grid3-body-cell{-moz-outline:0 none;outline:0 none;} +.ext-ie .x-grid3-cell-inner,.ext-ie .x-grid3-hd-inner{width:100%;} +.ext-strict .x-grid3-cell-inner,.ext-strict .x-grid3-hd-inner{width:auto;} +.x-grid-row-loading{background:#fff url(../images/default/shared/loading-balls.gif) no-repeat center center;} +.x-grid-page{overflow:hidden;} +.x-grid3-row{cursor:default;border:1px solid #ededed;border-top-color:#fff;width:100%;} +.x-grid3-row-alt{background-color:#fafafa;} +.x-grid3-row-over{border:1px solid #ddd;background:#efefef url(../images/default/grid/row-over.gif) repeat-x left top;} +.x-grid3-resize-proxy{width:1px;left:0;background-color:#777;cursor:e-resize;cursor:col-resize;position:absolute;top:0;height:100px;overflow:hidden;visibility:hidden;border:0 none;z-index:7;} +.x-grid3-resize-marker{width:1px;left:0;background-color:#777;position:absolute;top:0;height:100px;overflow:hidden;visibility:hidden;border:0 none;z-index:7;} +.x-grid3-focus{position:absolute;left:0;top:0;width:1px;height:1px;line-height:1px;font-size:1px;-moz-outline:0 none;outline:0 none;-moz-user-select:text;-khtml-user-select:text;} +.x-grid3-header{background:#f9f9f9 url(../images/default/grid/grid3-hrow.gif) repeat-x 0 bottom;cursor:default;zoom:1;padding:1px 0 0 0;} +.x-grid3-header-pop{border-left:1px solid #d0d0d0;float:right;clear:none;} +.x-grid3-header-pop-inner{border-left:1px solid #eee;width:14px;height:19px;background:transparent url(../images/default/grid/hd-pop.gif) no-repeat center center;} +.ext-ie .x-grid3-header-pop-inner{width:15px;} +.ext-strict .x-grid3-header-pop-inner{width:14px;} +.x-grid3-header-inner{overflow:hidden;zoom:1;float:left;} +.x-grid3-header-offset{padding-left:1px;width:10000px;} +td.x-grid3-hd-over,td.sort-desc,td.sort-asc,td.x-grid3-hd-menu-open{border-left:1px solid #aaccf6;border-right:1px solid #aaccf6;} +td.x-grid3-hd-over .x-grid3-hd-inner,td.sort-desc .x-grid3-hd-inner,td.sort-asc .x-grid3-hd-inner,td.x-grid3-hd-menu-open .x-grid3-hd-inner{background:#ebf3fd url(../images/default/grid/grid3-hrow-over.gif) repeat-x left bottom;} +.x-grid3-sort-icon{background-repeat:no-repeat;display:none;height:4px;width:13px;margin-left:3px;vertical-align:middle;} +.sort-asc .x-grid3-sort-icon{background-image:url(../images/default/grid/sort_asc.gif);display:inline;} +.sort-desc .x-grid3-sort-icon{background-image:url(../images/default/grid/sort_desc.gif);display:inline;} +.ext-strict .ext-ie .x-grid3-header-inner{position:relative;} +.ext-strict .ext-ie6 .x-grid3-hd{position:relative;} +.ext-strict .ext-ie6 .x-grid3-hd-inner{position:static;} +.x-grid3-body{zoom:1;} +.x-grid3-scroller{overflow:auto;zoom:1;position:relative;} +.x-grid3-cell-text,.x-grid3-hd-text{display:block;padding:3px 5px 3px 5px;-moz-user-select:none;-khtml-user-select:none;color:black;} +.x-grid3-split{background-image:url(../images/default/grid/grid-split.gif);background-position:center;background-repeat:no-repeat;cursor:e-resize;cursor:col-resize;display:block;font-size:1px;height:16px;overflow:hidden;position:absolute;top:2px;width:6px;z-index:3;} +.x-grid3-hd-text{color:#15428b;} +.x-dd-drag-proxy .x-grid3-hd-inner{background:#ebf3fd url(../images/default/grid/grid3-hrow-over.gif) repeat-x left bottom;width:120px;padding:3px;border:1px solid #aaccf6;overflow:hidden;} +.col-move-top,.col-move-bottom{width:9px;height:9px;position:absolute;top:0;line-height:1px;font-size:1px;overflow:hidden;visibility:hidden;z-index:20000;} +.col-move-top{background:transparent url(../images/default/grid/col-move-top.gif) no-repeat left top;} +.col-move-bottom{background:transparent url(../images/default/grid/col-move-bottom.gif) no-repeat left top;} +.x-grid3-row-selected{background:#DFE8F6!important;border:1px dotted #a3bae9;} +.x-grid3-cell-selected{background-color:#B8CFEE!important;color:black;} +.x-grid3-cell-selected span{color:black!important;} +.x-grid3-cell-selected .x-grid3-cell-text{color:black;} +.x-grid3-locked td.x-grid3-row-marker,.x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker{background:#ebeadb url(../images/default/grid/grid-hrow.gif) repeat-x 0 bottom!important;vertical-align:middle!important;color:black;padding:0;border-top:1px solid white;border-bottom:none!important;border-right:1px solid #6fa0df!important;text-align:center;} +.x-grid3-locked td.x-grid3-row-marker div,.x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker div{padding:0 4px;color:#15428b!important;text-align:center;} +.x-grid3-dirty-cell{background:transparent url(../images/default/grid/dirty.gif) no-repeat 0 0;} +.x-grid3-topbar,.x-grid3-bottombar{font:normal 11px arial,tahoma,helvetica,sans-serif;overflow:hidden;display:none;zoom:1;position:relative;} +.x-grid3-topbar .x-toolbar{border-right:0 none;} +.x-grid3-bottombar .x-toolbar{border-right:0 none;border-bottom:0 none;border-top:1px solid #a9bfd3;} +.x-props-grid .x-grid3-cell{padding:1px;} +.x-props-grid .x-grid3-td-name .x-grid3-cell-inner{background:transparent url(../images/default/grid/grid3-special-col-bg.gif) repeat-y -16px!important;padding-left:12px;color:black!important;} +.x-props-grid .x-grid3-body .x-grid3-td-name{padding:1px;padding-right:0;background:white!important;border:0 none;border-right:1px solid #eee;} +.xg-hmenu-sort-asc .x-menu-item-icon{background-image:url(../images/default/grid/hmenu-asc.gif);} +.xg-hmenu-sort-desc .x-menu-item-icon{background-image:url(../images/default/grid/hmenu-desc.gif);} +.xg-hmenu-lock .x-menu-item-icon{background-image:url(../images/default/grid/hmenu-lock.gif);} +.xg-hmenu-unlock .x-menu-item-icon{background-image:url(../images/default/grid/hmenu-unlock.gif);} +.x-grid3-col-dd{border:0 none;padding:0;background:transparent;} +.x-dd-drag-ghost .x-grid3-dd-wrap{padding:1px 3px 3px 1px;} +.x-grid3-hd{-moz-user-select:none;} +.x-grid3-hd-btn{display:none;position:absolute;width:14px;background:#c3daf9 url(../images/default/grid/grid3-hd-btn.gif) no-repeat left center;right:0;top:0;z-index:2;cursor:pointer;} +.x-grid3-hd-over .x-grid3-hd-btn,.x-grid3-hd-menu-open .x-grid3-hd-btn{display:block;} +a.x-grid3-hd-btn:hover{background-position:-14px center;} +.x-grid3-body .x-grid3-td-expander{background:transparent url(../images/default/grid/grid3-special-col-bg.gif) repeat-y right;} +.x-grid3-body .x-grid3-td-expander .x-grid3-cell-inner{padding:0!important;height:100%;} +.x-grid3-row-expander{width:100%;height:18px;background-position:4px 2px;background-repeat:no-repeat;background-color:transparent;background-image:url(../images/default/grid/row-expand-sprite.gif);} +.x-grid3-row-collapsed .x-grid3-row-expander{background-position:4px 2px;} +.x-grid3-row-expanded .x-grid3-row-expander{background-position:-21px 2px;} +.x-grid3-row-collapsed .x-grid3-row-body{display:none!important;} +.x-grid3-row-expanded .x-grid3-row-body{display:block!important;} +.x-grid3-body .x-grid3-td-checker{background:transparent url(../images/default/grid/grid3-special-col-bg.gif) repeat-y right;} +.x-grid3-body .x-grid3-td-checker .x-grid3-cell-inner,.x-grid3-header .x-grid3-td-checker .x-grid3-hd-inner{padding:0!important;height:100%;} +.x-grid3-row-checker,.x-grid3-hd-checker{width:100%;height:18px;background-position:2px 2px;background-repeat:no-repeat;background-color:transparent;background-image:url(../images/default/grid/row-check-sprite.gif);} +.x-grid3-row .x-grid3-row-checker{background-position:2px 2px;} +.x-grid3-row-selected .x-grid3-row-checker,.x-grid3-hd-checker-on .x-grid3-hd-checker{background-position:-23px 2px;} +.x-grid3-hd-checker{background-position:2px 3px;} +.x-grid3-hd-checker-on .x-grid3-hd-checker{background-position:-23px 3px;} +.x-grid3-body .x-grid3-td-numberer{background:transparent url(../images/default/grid/grid3-special-col-bg.gif) repeat-y right;} +.x-grid3-body .x-grid3-td-numberer .x-grid3-cell-inner{padding:3px 5px 0 0!important;text-align:right;color:#444;} +.x-grid3-body .x-grid3-row-selected .x-grid3-td-numberer,.x-grid3-body .x-grid3-row-selected .x-grid3-td-checker,.x-grid3-body .x-grid3-row-selected .x-grid3-td-expander{background:transparent url(../images/default/grid/grid3-special-col-sel-bg.gif) repeat-y right;} +.x-grid3-body .x-grid3-check-col-td .x-grid3-cell-inner{padding:1px 0 0 0!important;} +.x-grid3-check-col{width:100%;height:16px;background-position:center center;background-repeat:no-repeat;background-color:transparent;background-image:url(../images/default/menu/unchecked.gif);} +.x-grid3-check-col-on{width:100%;height:16px;background-position:center center;background-repeat:no-repeat;background-color:transparent;background-image:url(../images/default/menu/checked.gif);} +.x-grid-group,.x-grid-group-body,.x-grid-group-hd{zoom:1;} +.x-grid-group-hd{border-bottom:2px solid #99bbe8;cursor:pointer;padding-top:6px;} +.x-grid-group-hd div{background:transparent url(../images/default/grid/group-expand-sprite.gif) no-repeat 3px -47px;padding:4px 4px 4px 17px;color:#3764a0;font:bold 11px tahoma,arial,helvetica,sans-serif;} +.x-grid-group-collapsed .x-grid-group-hd div{background-position:3px 3px;} +.x-grid-group-collapsed .x-grid-group-body{display:none;} +.x-group-by-icon{background-image:url(../images/default/grid/group-by.gif);} +.x-cols-icon{background-image:url(../images/default/grid/columns.gif);} +.x-show-groups-icon{background-image:url(../images/default/grid/group-by.gif);} +.ext-ie .x-grid3 .x-editor .x-form-text{position:relative;top:-1px;} +.ext-ie .x-props-grid .x-editor .x-form-text{position:static;top:0;} +.x-grid-empty{padding:10px;color:gray;font:normal 11px tahoma,arial,helvetica,sans-serif;} +.ext-ie7 .x-grid-panel .x-panel-bbar{position:relative;} + +.x-dd-drag-proxy{position:absolute;left:0;top:0;visibility:hidden;z-index:15000;} +.x-dd-drag-ghost{color:black;font:normal 11px arial,helvetica,sans-serif;-moz-opacity:0.85;opacity:.85;filter:alpha(opacity=85);border-top:1px solid #ddd;border-left:1px solid #ddd;border-right:1px solid #bbb;border-bottom:1px solid #bbb;padding:3px;padding-left:20px;background-color:white;white-space:nowrap;} +.x-dd-drag-repair .x-dd-drag-ghost{-moz-opacity:0.4;opacity:.4;filter:alpha(opacity=40);border:0 none;padding:0;background-color:transparent;} +.x-dd-drag-repair .x-dd-drop-icon{visibility:hidden;} +.x-dd-drop-icon{position:absolute;top:3px;left:3px;display:block;width:16px;height:16px;background-color:transparent;background-position:center;background-repeat:no-repeat;z-index:1;} +.x-dd-drop-nodrop .x-dd-drop-icon{background-image:url(../images/default/dd/drop-no.gif);} +.x-dd-drop-ok .x-dd-drop-icon{background-image:url(../images/default/dd/drop-yes.gif);} +.x-dd-drop-ok-add .x-dd-drop-icon{background-image:url(../images/default/dd/drop-add.gif);} +.x-view-selector{position:absolute;left:0;top:0;width:0;background:#c3daf9;border:1px dotted #39b;opacity:.5;-moz-opacity:.5;filter:alpha(opacity=50);zoom:1;} + +.x-tree .x-panel-body{background-color:#fff;} +.ext-strict .ext-ie .x-tree .x-panel-bwrap{position:relative;overflow:hidden;} +.x-tree-icon,.x-tree-ec-icon,.x-tree-elbow-line,.x-tree-elbow,.x-tree-elbow-end,.x-tree-elbow-plus,.x-tree-elbow-minus,.x-tree-elbow-end-plus,.x-tree-elbow-end-minus{border:0 none;height:18px;margin:0;padding:0;vertical-align:top;width:16px;background-repeat:no-repeat;} +.x-tree-node-collapsed .x-tree-node-icon,.x-tree-node-expanded .x-tree-node-icon,.x-tree-node-leaf .x-tree-node-icon{border:0 none;height:18px;margin:0;padding:0;vertical-align:top;width:16px;background-position:center;background-repeat:no-repeat;} +.ext-ie .x-tree-node-indent img,.ext-ie .x-tree-node-icon,.ext-ie .x-tree-ec-icon{vertical-align:middle!important;} +.x-tree-node-expanded .x-tree-node-icon{background-image:url(../images/default/tree/folder-open.gif);} +.x-tree-node-leaf .x-tree-node-icon{background-image:url(../images/default/tree/leaf.gif);} +.x-tree-node-collapsed .x-tree-node-icon{background-image:url(../images/default/tree/folder.gif);} +.ext-ie input.x-tree-node-cb{width:15px;height:15px;} +input.x-tree-node-cb{margin-left:1px;} +.ext-ie input.x-tree-node-cb{margin-left:0;} +.x-tree-noicon .x-tree-node-icon{width:0;height:0;} +.x-tree-node-loading .x-tree-node-icon{background-image:url(../images/default/tree/loading.gif)!important;} +.x-tree-node-loading a span{font-style:italic;color:#444;} +.ext-ie .x-tree-node-el input{width:15px;height:15px;} +.x-tree-lines .x-tree-elbow{background-image:url(../images/default/tree/elbow.gif);} +.x-tree-lines .x-tree-elbow-plus{background-image:url(../images/default/tree/elbow-plus.gif);} +.x-tree-lines .x-tree-elbow-minus{background-image:url(../images/default/tree/elbow-minus.gif);} +.x-tree-lines .x-tree-elbow-end{background-image:url(../images/default/tree/elbow-end.gif);} +.x-tree-lines .x-tree-elbow-end-plus{background-image:url(../images/default/tree/elbow-end-plus.gif);} +.x-tree-lines .x-tree-elbow-end-minus{background-image:url(../images/default/tree/elbow-end-minus.gif);} +.x-tree-lines .x-tree-elbow-line{background-image:url(../images/default/tree/elbow-line.gif);} +.x-tree-no-lines .x-tree-elbow{background:transparent;} +.x-tree-no-lines .x-tree-elbow-plus{background-image:url(../images/default/tree/elbow-plus-nl.gif);} +.x-tree-no-lines .x-tree-elbow-minus{background-image:url(../images/default/tree/elbow-minus-nl.gif);} +.x-tree-no-lines .x-tree-elbow-end{background:transparent;} +.x-tree-no-lines .x-tree-elbow-end-plus{background-image:url(../images/default/tree/elbow-end-plus-nl.gif);} +.x-tree-no-lines .x-tree-elbow-end-minus{background-image:url(../images/default/tree/elbow-end-minus-nl.gif);} +.x-tree-no-lines .x-tree-elbow-line{background:transparent;} +.x-tree-arrows .x-tree-elbow{background:transparent;} +.x-tree-arrows .x-tree-elbow-plus{background:transparent url(../images/default/tree/arrows.gif) no-repeat 0 0;} +.x-tree-arrows .x-tree-elbow-minus{background:transparent url(../images/default/tree/arrows.gif) no-repeat -16px 0;} +.x-tree-arrows .x-tree-elbow-end{background:transparent;} +.x-tree-arrows .x-tree-elbow-end-plus{background:transparent url(../images/default/tree/arrows.gif) no-repeat 0 0;} +.x-tree-arrows .x-tree-elbow-end-minus{background:transparent url(../images/default/tree/arrows.gif) no-repeat -16px 0;} +.x-tree-arrows .x-tree-elbow-line{background:transparent;} +.x-tree-arrows .x-tree-ec-over .x-tree-elbow-plus{background-position:-32px 0;} +.x-tree-arrows .x-tree-ec-over .x-tree-elbow-minus{background-position:-48px 0;} +.x-tree-arrows .x-tree-ec-over .x-tree-elbow-end-plus{background-position:-32px 0;} +.x-tree-arrows .x-tree-ec-over .x-tree-elbow-end-minus{background-position:-48px 0;} +.x-tree-elbow-plus,.x-tree-elbow-minus,.x-tree-elbow-end-plus,.x-tree-elbow-end-minus{cursor:pointer;} +.ext-ie ul.x-tree-node-ct{font-size:0;line-height:0;zoom:1;} +.x-tree-node{color:black;font:normal 11px arial,tahoma,helvetica,sans-serif;white-space:nowrap;} +.x-tree-node-el{line-height:18px;cursor:pointer;} +.x-tree-node a,.x-dd-drag-ghost a{text-decoration:none;color:black;-khtml-user-select:none;-moz-user-select:none;-kthml-user-focus:normal;-moz-user-focus:normal;-moz-outline:0 none;outline:0 none;} +.x-tree-node a span,.x-dd-drag-ghost a span{text-decoration:none;color:black;padding:1px 3px 1px 2px;} +.x-tree-node .x-tree-node-disabled a span{color:gray!important;} +.x-tree-node .x-tree-node-disabled .x-tree-node-icon{-moz-opacity:0.5;opacity:.5;filter:alpha(opacity=50);} +.x-tree-node .x-tree-node-inline-icon{background:transparent;} +.x-tree-node a:hover,.x-dd-drag-ghost a:hover{text-decoration:none;} +.x-tree-node div.x-tree-drag-insert-below{border-bottom:1px dotted #36c;} +.x-tree-node div.x-tree-drag-insert-above{border-top:1px dotted #36c;} +.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-below{border-bottom:0 none;} +.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-above{border-top:0 none;} +.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-below a{border-bottom:2px solid #36c;} +.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-above a{border-top:2px solid #36c;} +.x-tree-node .x-tree-drag-append a span{background:#ddd;border:1px dotted gray;} +.x-tree-node .x-tree-node-over{background-color:#eee;} +.x-tree-node .x-tree-selected{background-color:#d9e8fb;} +.x-dd-drag-ghost .x-tree-node-indent,.x-dd-drag-ghost .x-tree-ec-icon{display:none!important;} +.x-tree-drop-ok-append .x-dd-drop-icon{background-image:url(../images/default/tree/drop-add.gif);} +.x-tree-drop-ok-above .x-dd-drop-icon{background-image:url(../images/default/tree/drop-over.gif);} +.x-tree-drop-ok-below .x-dd-drop-icon{background-image:url(../images/default/tree/drop-under.gif);} +.x-tree-drop-ok-between .x-dd-drop-icon{background-image:url(../images/default/tree/drop-between.gif);} +.x-tree-root-ct{zoom:1;} + +.x-date-picker{border:1px solid #1b376c;border-top:0 none;background:#fff;position:relative;} +.x-date-picker a{-moz-outline:0 none;outline:0 none;} +.x-date-inner,.x-date-inner td,.x-date-inner th{border-collapse:separate;} +.x-date-middle,.x-date-left,.x-date-right{background:url(../images/default/shared/hd-sprite.gif) repeat-x 0 -83px;color:#FFF;font:bold 11px "sans serif",tahoma,verdana,helvetica;overflow:hidden;} +.x-date-middle .x-btn-left,.x-date-middle .x-btn-center,.x-date-middle .x-btn-right{background:transparent!important;vertical-align:middle;} +.x-date-middle .x-btn .x-btn-text{color:#fff;} +.x-date-middle .x-btn-with-menu .x-btn-center em{background:transparent url(../images/default/toolbar/btn-arrow-light.gif) no-repeat right 0;} +.x-date-right,.x-date-left{width:18px;} +.x-date-right{text-align:right;} +.x-date-middle{padding-top:2px;padding-bottom:2px;width:130px;} +.x-date-right a,.x-date-left a{display:block;width:16px;height:16px;background-position:center;background-repeat:no-repeat;cursor:pointer;-moz-opacity:0.6;opacity:.6;filter:alpha(opacity=60);} +.x-date-right a:hover,.x-date-left a:hover{-moz-opacity:1;opacity:1;filter:alpha(opacity=100);} +.x-date-right a{background-image:url(../images/default/shared/right-btn.gif);margin-right:2px;text-decoration:none!important;} +.x-date-left a{background-image:url(../images/default/shared/left-btn.gif);margin-left:2px;text-decoration:none!important;} +table.x-date-inner{width:100%;table-layout:fixed;} +.x-date-inner th{width:25px;} +.x-date-inner th{background:#dfecfb url(../images/default/shared/glass-bg.gif) repeat-x left top;text-align:right!important;border-bottom:1px solid #a3bad9;font:normal 10px arial,helvetica,tahoma,sans-serif;color:#233d6d;cursor:default;padding:0;border-collapse:separate;} +.x-date-inner th span{display:block;padding:2px;padding-right:7px;} +.x-date-inner td{border:1px solid #fff;text-align:right;padding:0;} +.x-date-inner a{padding:2px 5px;display:block;font:normal 11px arial,helvetica,tahoma,sans-serif;text-decoration:none;color:black;text-align:right;zoom:1;} +.x-date-inner .x-date-active{cursor:pointer;color:black;} +.x-date-inner .x-date-selected a{background:#dfecfb url(../images/default/shared/glass-bg.gif) repeat-x left top;border:1px solid #8db2e3;padding:1px 4px;} +.x-date-inner .x-date-today a{border:1px solid darkred;padding:1px 4px;} +.x-date-inner .x-date-selected span{font-weight:bold;} +.x-date-inner .x-date-prevday a,.x-date-inner .x-date-nextday a{color:#aaa;text-decoration:none!important;} +.x-date-bottom{padding:4px;border-top:1px solid #a3bad9;background:#dfecfb url(../images/default/shared/glass-bg.gif) repeat-x left top;} +.x-date-inner a:hover,.x-date-inner .x-date-disabled a:hover{text-decoration:none!important;color:black;background:#ddecfe;} +.x-date-inner .x-date-disabled a{cursor:default;background:#eee;color:#bbb;} +.x-date-mmenu{background:#eee!important;} +.x-date-mmenu .x-menu-item{font-size:10px;padding:1px 24px 1px 4px;white-space:nowrap;color:#000;} +.x-date-mmenu .x-menu-item .x-menu-item-icon{width:10px;height:10px;margin-right:5px;background-position:center -4px!important;} +.x-date-mp{position:absolute;left:0;top:0;background:white;display:none;} +.x-date-mp td{padding:2px;font:normal 11px arial,helvetica,tahoma,sans-serif;} +td.x-date-mp-month,td.x-date-mp-year,td.x-date-mp-ybtn{border:0 none;text-align:center;vertical-align:middle;width:25%;} +.x-date-mp-ok{margin-right:3px;} +.x-date-mp-btns button{text-decoration:none;text-align:center;text-decoration:none!important;background:#083772;color:white;border:1px solid;border-color:#36c #005 #005 #36c;padding:1px 3px 1px;font:normal 11px arial,helvetica,tahoma,sans-serif;cursor:pointer;} +.x-date-mp-btns{background:#dfecfb url(../images/default/shared/glass-bg.gif) repeat-x left top;} +.x-date-mp-btns td{border-top:1px solid #c5d2df;text-align:center;} +td.x-date-mp-month a,td.x-date-mp-year a{display:block;padding:2px 4px;text-decoration:none;text-align:center;color:#15428b;} +td.x-date-mp-month a:hover,td.x-date-mp-year a:hover{color:#15428b;text-decoration:none;cursor:pointer;background:#ddecfe;} +td.x-date-mp-sel a{padding:1px 3px;background:#dfecfb url(../images/default/shared/glass-bg.gif) repeat-x left top;border:1px solid #8db2e3;} +.x-date-mp-ybtn a{overflow:hidden;width:15px;height:15px;cursor:pointer;background:transparent url(../images/default/panel/tool-sprites.gif) no-repeat;display:block;margin:0 auto;} +.x-date-mp-ybtn a.x-date-mp-next{background-position:0 -120px;} +.x-date-mp-ybtn a.x-date-mp-next:hover{background-position:-15px -120px;} +.x-date-mp-ybtn a.x-date-mp-prev{background-position:0 -105px;} +.x-date-mp-ybtn a.x-date-mp-prev:hover{background-position:-15px -105px;} +.x-date-mp-ybtn{text-align:center;} +td.x-date-mp-sep{border-right:1px solid #c5d2df;} + +.x-tip{position:absolute;top:0;left:0;visibility:hidden;z-index:20000;border:0 none;} +.x-tip .x-tip-close{background-image:url(../images/default/qtip/close.gif);height:15px;float:right;width:15px;margin:0 0 2px 2px;cursor:pointer;display:none;} +.x-tip .x-tip-tc{background:transparent url(../images/default/qtip/tip-sprite.gif) no-repeat 0 -62px;padding-top:3px;overflow:hidden;zoom:1;} +.x-tip .x-tip-tl{background:transparent url(../images/default/qtip/tip-sprite.gif) no-repeat 0 0;padding-left:6px;overflow:hidden;zoom:1;} +.x-tip .x-tip-tr{background:transparent url(../images/default/qtip/tip-sprite.gif) no-repeat right 0;padding-right:6px;overflow:hidden;zoom:1;} +.x-tip .x-tip-bc{background:transparent url(../images/default/qtip/tip-sprite.gif) no-repeat 0 -121px;height:3px;overflow:hidden;} +.x-tip .x-tip-bl{background:transparent url(../images/default/qtip/tip-sprite.gif) no-repeat 0 -59px;padding-left:6px;zoom:1;} +.x-tip .x-tip-br{background:transparent url(../images/default/qtip/tip-sprite.gif) no-repeat right -59px;padding-right:6px;zoom:1;} +.x-tip .x-tip-mc{border:0 none;font:normal 11px tahoma,arial,helvetica,sans-serif;} +.x-tip .x-tip-ml{background:#fff url(../images/default/qtip/tip-sprite.gif) no-repeat 0 -124px;padding-left:6px;zoom:1;} +.x-tip .x-tip-mr{background:transparent url(../images/default/qtip/tip-sprite.gif) no-repeat right -124px;padding-right:6px;zoom:1;} +.ext-ie .x-tip .x-tip-header,.ext-ie .x-tip .x-tip-tc{font-size:0;line-height:0;} +.x-tip .x-tip-header-text{font:bold 11px tahoma,arial,helvetica,sans-serif;padding:0;margin:0 0 2px 0;color:#444;} +.x-tip .x-tip-body{font:normal 11px tahoma,arial,helvetica,sans-serif;margin:0!important;line-height:14px;color:#444;padding:0;} +.x-tip .x-tip-body .loading-indicator{margin:0;} +.x-tip-draggable .x-tip-header,.x-tip-draggable .x-tip-header-text{cursor:move;} +.x-form-invalid-tip .x-tip-tc{background:url(../images/default/form/error-tip-corners.gif) repeat-x 0 -12px;padding-top:6px;} +.x-form-invalid-tip .x-tip-tl{background-image:url(../images/default/form/error-tip-corners.gif);} +.x-form-invalid-tip .x-tip-tr{background-image:url(../images/default/form/error-tip-corners.gif);} +.x-form-invalid-tip .x-tip-bc{background:url(../images/default/form/error-tip-corners.gif) repeat-x 0 -18px;height:6px;} +.x-form-invalid-tip .x-tip-bl{background:url(../images/default/form/error-tip-corners.gif) no-repeat 0 -6px;} +.x-form-invalid-tip .x-tip-br{background:url(../images/default/form/error-tip-corners.gif) no-repeat right -6px;} +.x-form-invalid-tip .x-tip-ml{background-image:url(../images/default/form/error-tip-corners.gif);} +.x-form-invalid-tip .x-tip-mr{background-image:url(../images/default/form/error-tip-corners.gif);} +.x-form-invalid-tip .x-tip-body{padding:2px;} +.x-form-invalid-tip .x-tip-body{padding-left:24px;background:transparent url(../images/default/form/exclamation.gif) no-repeat 2px 2px;} + +.x-menu{border:1px solid #718bb7;z-index:15000;zoom:1;background:#f0f0f0 url(../images/default/menu/menu.gif) repeat-y;padding:2px;} +.x-menu a{text-decoration:none!important;} +.ext-ie .x-menu{zoom:1;overflow:hidden;} +.x-menu-list{background:transparent;border:0 none;} +.x-menu li{line-height:100%;} +.x-menu li.x-menu-sep-li{font-size:1px;line-height:1px;} +.x-menu-list-item{font:normal 11px tahoma,arial,sans-serif;white-space:nowrap;-moz-user-select:none;-khtml-user-select:none;display:block;padding:1px;} +.x-menu-item-arrow{background:transparent url(../images/default/menu/menu-parent.gif) no-repeat right;} +.x-menu-sep{display:block;font-size:1px;line-height:1px;margin:2px 3px;background-color:#e0e0e0;border-bottom:1px solid #fff;overflow:hidden;} +.x-menu-focus{position:absolute;left:-1px;top:-1px;width:1px;height:1px;line-height:1px;font-size:1px;-moz-outline:0 none;outline:0 none;-moz-user-select:text;-khtml-user-select:text;overflow:hidden;display:block;} +.x-menu a.x-menu-item{display:block;line-height:16px;padding:3px 21px 3px 3px;white-space:nowrap;text-decoration:none;color:#222;-moz-outline:0 none;outline:0 none;cursor:pointer;} +.x-menu-item-active{background:#ebf3fd url(../images/default/menu/item-over.gif) repeat-x left bottom;border:1px solid #aaccf6;padding:0;} +.x-menu-item-active a.x-menu-item{color:#233d6d;} +.x-menu-item-icon{border:0 none;height:16px;padding:0;vertical-align:top;width:16px;margin:0 8px 0 0;background-position:center;} +.x-menu-check-item .x-menu-item-icon{background:transparent url(../images/default/menu/unchecked.gif) no-repeat center;} +.x-menu-item-checked .x-menu-item-icon{background-image:url(../images/default/menu/checked.gif);} +.x-menu-group-item .x-menu-item-icon{background:transparent;} +.x-menu-item-checked .x-menu-group-item .x-menu-item-icon{background:transparent url(../images/default/menu/group-checked.gif) no-repeat center;} +.x-menu-plain{background:#fff!important;} +.x-menu-date-item{padding:0;} +.x-menu .x-color-palette,.x-menu .x-date-picker{margin-left:26px;margin-right:4px;} +.x-menu .x-date-picker{border:1px solid #a3bad9;margin-top:2px;margin-bottom:2px;} +.x-menu-plain .x-color-palette,.x-menu-plain .x-date-picker{margin:0;border:0 none;} +.x-date-menu{padding:0!important;} +.x-cycle-menu .x-menu-item-checked{border:1px dotted #a3bae9!important;background:#DFE8F6;padding:0;} + + .x-box-tl{background:transparent url(../images/default/box/corners.gif) no-repeat 0 0;zoom:1;} +.x-box-tc{height:8px;background:transparent url(../images/default/box/tb.gif) repeat-x 0 0;overflow:hidden;} +.x-box-tr{background:transparent url(../images/default/box/corners.gif) no-repeat right -8px;} +.x-box-ml{background:transparent url(../images/default/box/l.gif) repeat-y 0;padding-left:4px;overflow:hidden;zoom:1;} +.x-box-mc{background:#eee url(../images/default/box/tb.gif) repeat-x 0 -16px;padding:4px 10px;font-family:"Myriad Pro","Myriad Web","Tahoma","Helvetica","Arial",sans-serif;color:#393939;font-size:12px;} +.x-box-mc h3{font-size:14px;font-weight:bold;margin:0 0 4px 0;zoom:1;} +.x-box-mr{background:transparent url(../images/default/box/r.gif) repeat-y right;padding-right:4px;overflow:hidden;} +.x-box-bl{background:transparent url(../images/default/box/corners.gif) no-repeat 0 -16px;zoom:1;} +.x-box-bc{background:transparent url(../images/default/box/tb.gif) repeat-x 0 -8px;height:8px;overflow:hidden;} +.x-box-br{background:transparent url(../images/default/box/corners.gif) no-repeat right -24px;} +.x-box-tl,.x-box-bl{padding-left:8px;overflow:hidden;} +.x-box-tr,.x-box-br{padding-right:8px;overflow:hidden;} +.x-box-blue .x-box-bl,.x-box-blue .x-box-br,.x-box-blue .x-box-tl,.x-box-blue .x-box-tr{background-image:url(../images/default/box/corners-blue.gif);} +.x-box-blue .x-box-bc,.x-box-blue .x-box-mc,.x-box-blue .x-box-tc{background-image:url(../images/default/box/tb-blue.gif);} +.x-box-blue .x-box-mc{background-color:#c3daf9;} +.x-box-blue .x-box-mc h3{color:#17385b;} +.x-box-blue .x-box-ml{background-image:url(../images/default/box/l-blue.gif);} +.x-box-blue .x-box-mr{background-image:url(../images/default/box/r-blue.gif);} + +#x-debug-browser .x-tree .x-tree-node a span{color:#222297;font-size:11px;padding-top:2px;font-family:"monotype","courier new",sans-serif;line-height:18px;} +#x-debug-browser .x-tree a i{color:#FF4545;font-style:normal;} +#x-debug-browser .x-tree a em{color:#999;} +#x-debug-browser .x-tree .x-tree-node .x-tree-selected a span{background:#c3daf9;} +#x-debug-browser .x-tool-toggle{background-position:0 -75px;} +#x-debug-browser .x-tool-toggle-over{background-position:-15px -75px;} +#x-debug-browser.x-panel-collapsed .x-tool-toggle{background-position:0 -60px;} +#x-debug-browser.x-panel-collapsed .x-tool-toggle-over{background-position:-15px -60px;} + +.x-combo-list{border:1px solid #98c0f4;background:#ddecfe;zoom:1;overflow:hidden;} +.x-combo-list-inner{overflow:auto;background:white;position:relative;zoom:1;overflow-x:hidden;} +.x-combo-list-hd{font:bold 11px tahoma,arial,helvetica,sans-serif;color:#15428b;background-image:url(../images/default/layout/panel-title-light-bg.gif);border-bottom:1px solid #98c0f4;padding:3px;} +.x-resizable-pinned .x-combo-list-inner{border-bottom:1px solid #98c0f4;} +.x-combo-list-item{font:normal 12px tahoma,arial,helvetica,sans-serif;padding:2px;border:1px solid #fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;} +.x-combo-list .x-combo-selected{border:1px dotted #a3bae9!important;background:#DFE8F6;cursor:pointer;} +.x-combo-noedit{cursor:pointer;} +.x-combo-list .x-toolbar{border-top:1px solid #98c0f4;border-bottom:0 none;} +.x-combo-list-small .x-combo-list-item{font:normal 11px tahoma,arial,helvetica,sans-serif;} + +.x-panel{border-style:solid;border-color:#99bbe8;border-width:0;} +.x-panel-header{overflow:hidden;zoom:1;color:#15428b;font:bold 11px tahoma,arial,verdana,sans-serif;padding:5px 3px 4px 5px;border:1px solid #99bbe8;line-height:15px;background:transparent url(../images/default/panel/white-top-bottom.gif) repeat-x 0 -1px;} +.x-panel-body{border:1px solid #99bbe8;border-top:0 none;overflow:hidden;background:white;position:relative;} +.x-panel-bbar .x-toolbar{border:1px solid #99bbe8;border-top:0 none;overflow:hidden;padding:2px;} +.x-panel-tbar .x-toolbar{border:1px solid #99bbe8;border-top:0 none;overflow:hidden;padding:2px;} +.x-panel-tbar-noheader .x-toolbar,.x-panel-mc .x-panel-tbar .x-toolbar{border-top:1px solid #99bbe8;border-bottom:0 none;} +.x-panel-body-noheader,.x-panel-mc .x-panel-body{border-top:1px solid #99bbe8;} +.x-panel-header{overflow:hidden;zoom:1;} +.x-panel-tl .x-panel-header{color:#15428b;font:bold 11px tahoma,arial,verdana,sans-serif;padding:5px 0 4px 0;border:0 none;background:transparent;} +.x-panel-tl .x-panel-icon,.x-window-tl .x-panel-icon{padding-left:20px!important;background-repeat:no-repeat;background-position:0 4px;zoom:1;} +.x-panel-inline-icon{width:16px;height:16px;background-repeat:no-repeat;background-position:0 0;vertical-align:middle;margin-right:4px;margin-top:-1px;margin-bottom:-1px;} +.x-panel-tc{background:transparent url(../images/default/panel/top-bottom.gif) repeat-x 0 0;overflow:hidden;} +.ext-strict .ext-ie7 .x-panel-tc{overflow:visible;} +.x-panel-tl{background:transparent url(../images/default/panel/corners-sprite.gif) no-repeat 0 0;padding-left:6px;zoom:1;border-bottom:1px solid #99bbe8;} +.x-panel-tr{background:transparent url(../images/default/panel/corners-sprite.gif) no-repeat right 0;zoom:1;padding-right:6px;} +.x-panel-bc{background:transparent url(../images/default/panel/top-bottom.gif) repeat-x 0 bottom;zoom:1;} +.x-panel-bc .x-panel-footer{zoom:1;} +.x-panel-bl{background:transparent url(../images/default/panel/corners-sprite.gif) no-repeat 0 bottom;padding-left:6px;zoom:1;} +.x-panel-br{background:transparent url(../images/default/panel/corners-sprite.gif) no-repeat right bottom;padding-right:6px;zoom:1;} +.x-panel-mc{border:0 none;padding:0;margin:0;font:normal 11px tahoma,arial,helvetica,sans-serif;padding-top:6px;background:#dfe8f6;} +.x-panel-mc .x-panel-body{background:transparent;border:0 none;} +.x-panel-ml{background:#fff url(../images/default/panel/left-right.gif) repeat-y 0 0;padding-left:6px;zoom:1;} +.x-panel-mr{background:transparent url(../images/default/panel/left-right.gif) repeat-y right 0;padding-right:6px;zoom:1;} +.x-panel-bc .x-panel-footer{padding-bottom:6px;} +.x-panel-nofooter .x-panel-bc,.x-panel-nofooter .x-window-bc{height:6px;font-size:0;line-height:0;} +.x-panel-bwrap{overflow:hidden;zoom:1;left:0;top:0;} +.x-panel-body{overflow:hidden;zoom:1;} +.x-panel-collapsed .x-resizable-handle{display:none;} +.ext-gecko .x-panel-animated div{overflow:hidden!important;} +.x-plain-body{overflow:hidden;} +.x-plain-bbar .x-toolbar{overflow:hidden;padding:2px;} +.x-plain-tbar .x-toolbar{overflow:hidden;padding:2px;} +.x-plain-bwrap{overflow:hidden;zoom:1;} +.x-plain{overflow:hidden;} +.x-tool{overflow:hidden;width:15px;height:15px;float:right;cursor:pointer;background:transparent url(../images/default/panel/tool-sprites.gif) no-repeat;margin-left:2px;} +.x-tool-toggle{background-position:0 -60px;} +.x-tool-toggle-over{background-position:-15px -60px;} +.x-panel-collapsed .x-tool-toggle{background-position:0 -75px;} +.x-panel-collapsed .x-tool-toggle-over{background-position:-15px -75px;} +.x-tool-close{background-position:0 -0;} +.x-tool-close-over{background-position:-15px 0;} +.x-tool-minimize{background-position:0 -15px;} +.x-tool-minimize-over{background-position:-15px -15px;} +.x-tool-maximize{background-position:0 -30px;} +.x-tool-maximize-over{background-position:-15px -30px;} +.x-tool-restore{background-position:0 -45px;} +.x-tool-restore-over{background-position:-15px -45px;} +.x-tool-gear{background-position:0 -90px;} +.x-tool-gear-over{background-position:-15px -90px;} +.x-tool-pin{background-position:0 -135px;} +.x-tool-pin-over{background-position:-15px -135px;} +.x-tool-unpin{background-position:0 -150px;} +.x-tool-unpin-over{background-position:-15px -150px;} +.x-tool-right{background-position:0 -165px;} +.x-tool-right-over{background-position:-15px -165px;} +.x-tool-left{background-position:0 -180px;} +.x-tool-left-over{background-position:-15px -180px;} +.x-tool-up{background-position:0 -210px;} +.x-tool-up-over{background-position:-15px -210px;} +.x-tool-down{background-position:0 -195px;} +.x-tool-down-over{background-position:-15px -195px;} +.x-tool-refresh{background-position:0 -225px;} +.x-tool-refresh-over{background-position:-15px -225px;} +.x-tool-minus{background-position:0 -255px;} +.x-tool-minus-over{background-position:-15px -255px;} +.x-tool-plus{background-position:0 -240px;} +.x-tool-plus-over{background-position:-15px -240px;} +.x-tool-search{background-position:0 -270px;} +.x-tool-search-over{background-position:-15px -270px;} +.x-tool-save{background-position:0 -285px;} +.x-tool-save-over{background-position:-15px -285px;} +.x-tool-help{background-position:0 -300px;} +.x-tool-help-over{background-position:-15px -300px;} +.x-tool-print{background-position:0 -315px;} +.x-tool-print-over{background-position:-15px -315px;} +.x-panel-ghost{background:#cbddf3;z-index:12000;overflow:hidden;position:absolute;left:0;top:0;opacity:.65;-moz-opacity:.65;filter:alpha(opacity=65);} +.x-panel-ghost ul{margin:0;padding:0;overflow:hidden;font-size:0;line-height:0;border:1px solid #99bbe8;border-top:0 none;display:block;} +.x-panel-ghost *{cursor:move!important;} +.x-panel-dd-spacer{border:2px dashed #99bbe8;} +.x-panel-btns-ct{padding:5px;} +.x-panel-btns-ct .x-btn{float:right;clear:none;} +.x-panel-btns-ct .x-panel-btns td{border:0;padding:0;} +.x-panel-btns-ct .x-panel-btns-right table{float:right;clear:none;} +.x-panel-btns-ct .x-panel-btns-left table{float:left;clear:none;} +.x-panel-btns-ct .x-panel-btns-center{text-align:center;} +.x-panel-btns-ct .x-panel-btns-center table{margin:0 auto;} +.x-panel-btns-ct table td.x-panel-btn-td{padding:3px;} +.x-panel-btns-ct .x-btn-focus .x-btn-left{background-position:0 -147px;} +.x-panel-btns-ct .x-btn-focus .x-btn-right{background-position:0 -168px;} +.x-panel-btns-ct .x-btn-focus .x-btn-center{background-position:0 -189px;} +.x-panel-btns-ct .x-btn-over .x-btn-left{background-position:0 -63px;} +.x-panel-btns-ct .x-btn-over .x-btn-right{background-position:0 -84px;} +.x-panel-btns-ct .x-btn-over .x-btn-center{background-position:0 -105px;} +.x-panel-btns-ct .x-btn-click .x-btn-center{background-position:0 -126px;} +.x-panel-btns-ct .x-btn-click .x-btn-right{background-position:0 -84px;} +.x-panel-btns-ct .x-btn-click .x-btn-left{background-position:0 -63px;} + +.x-window{zoom:1;} +.x-window .x-resizable-handle{opacity:0;-moz-opacity:0;filter:alpha(opacity=0);} +.x-window-proxy{background:#C7DFFC;border:1px solid #99bbe8;z-index:12000;overflow:hidden;position:absolute;left:0;top:0;display:none;opacity:.5;-moz-opacity:.5;filter:alpha(opacity=50);} +.x-window-header{overflow:hidden;zoom:1;} +.x-window-bwrap{z-index:1;position:relative;zoom:1;left:0;top:0;} +.x-window-tl .x-window-header{color:#15428b;font:bold 11px tahoma,arial,verdana,sans-serif;padding:5px 0 4px 0;} +.x-window-header-text{cursor:pointer;} +.x-window-tc{background:transparent url(../images/default/window/top-bottom.png) repeat-x 0 0;overflow:hidden;zoom:1;} +.x-window-tl{background:transparent url(../images/default/window/left-corners.png) no-repeat 0 0;padding-left:6px;zoom:1;z-index:1;position:relative;} +.x-window-tr{background:transparent url(../images/default/window/right-corners.png) no-repeat right 0;padding-right:6px;} +.x-window-bc{background:transparent url(../images/default/window/top-bottom.png) repeat-x 0 bottom;zoom:1;} +.x-window-bc .x-window-footer{padding-bottom:6px;zoom:1;font-size:0;line-height:0;} +.x-window-bl{background:transparent url(../images/default/window/left-corners.png) no-repeat 0 bottom;padding-left:6px;zoom:1;} +.x-window-br{background:transparent url(../images/default/window/right-corners.png) no-repeat right bottom;padding-right:6px;zoom:1;} +.x-window-mc{border:1px solid #99bbe8;padding:0;margin:0;font:normal 11px tahoma,arial,helvetica,sans-serif;background:#dfe8f6;} +.x-window-ml{background:transparent url(../images/default/window/left-right.png) repeat-y 0 0;padding-left:6px;zoom:1;} +.x-window-mr{background:transparent url(../images/default/window/left-right.png) repeat-y right 0;padding-right:6px;zoom:1;} +.x-window-body{overflow:hidden;} +.x-window-bwrap{overflow:hidden;} +.x-window-maximized .x-window-bl,.x-window-maximized .x-window-br,.x-window-maximized .x-window-ml,.x-window-maximized .x-window-mr,.x-window-maximized .x-window-tl,.x-window-maximized .x-window-tr{padding:0;} +.x-window-maximized .x-window-footer{padding-bottom:0;} +.x-window-maximized .x-window-tc{padding-left:3px;padding-right:3px;background-color:white;} +.x-window-maximized .x-window-mc{border-left:0 none;border-right:0 none;} +.x-window-tbar .x-toolbar,.x-window-bbar .x-toolbar{border-left:0 none;border-right:0 none;} +.x-window-bbar .x-toolbar{border-top:1px solid #99bbe8;border-bottom:0 none;} +.x-window-draggable,.x-window-draggable .x-window-header-text{cursor:move;} +.x-window-maximized .x-window-draggable,.x-window-maximized .x-window-draggable .x-window-header-text{cursor:default;} +.x-window-body{background:transparent;} +.x-panel-ghost .x-window-tl{border-bottom:1px solid #99bbe8;} +.x-panel-collapsed .x-window-tl{border-bottom:1px solid #84a0c4;} +.x-window-maximized-ct{overflow:hidden;} +.x-window-maximized .x-resizable-handle{display:none;} +.x-window-sizing-ghost ul{border:0 none!important;} +.x-dlg-focus{-moz-outline:0 none;outline:0 none;width:0;height:0;overflow:hidden;position:absolute;top:0;left:0;} +.x-dlg-mask{z-index:10000;display:none;position:absolute;top:0;left:0;-moz-opacity:0.5;opacity:.50;filter:alpha(opacity=50);background-color:#CCC;} +body.ext-ie6.x-body-masked select{visibility:hidden;} +body.ext-ie6.x-body-masked .x-window select{visibility:visible;} +.x-window-plain .x-window-mc{background:#CAD9EC;border-right:1px solid #DFE8F6;border-bottom:1px solid #DFE8F6;border-top:1px solid #a3bae9;border-left:1px solid #a3bae9;} +.x-window-plain .x-window-body{border-left:1px solid #DFE8F6;border-top:1px solid #DFE8F6;border-bottom:1px solid #a3bae9;border-right:1px solid #a3bae9;background:transparent!important;} +body.x-body-masked .x-window-plain .x-window-mc{background:#C7D6E9;} + +.x-html-editor-wrap{border:1px solid #a9bfd3;background:white;} +.x-html-editor-tb .x-btn-text{background:transparent url(../images/default/editor/tb-sprite.gif) no-repeat;} +.x-html-editor-tb .x-edit-bold .x-btn-text{background-position:0 0;} +.x-html-editor-tb .x-edit-italic .x-btn-text{background-position:-16px 0;} +.x-html-editor-tb .x-edit-underline .x-btn-text{background-position:-32px 0;} +.x-html-editor-tb .x-edit-forecolor .x-btn-text{background-position:-160px 0;} +.x-html-editor-tb .x-edit-backcolor .x-btn-text{background-position:-176px 0;} +.x-html-editor-tb .x-edit-justifyleft .x-btn-text{background-position:-112px 0;} +.x-html-editor-tb .x-edit-justifycenter .x-btn-text{background-position:-128px 0;} +.x-html-editor-tb .x-edit-justifyright .x-btn-text{background-position:-144px 0;} +.x-html-editor-tb .x-edit-insertorderedlist .x-btn-text{background-position:-80px 0;} +.x-html-editor-tb .x-edit-insertunorderedlist .x-btn-text{background-position:-96px 0;} +.x-html-editor-tb .x-edit-increasefontsize .x-btn-text{background-position:-48px 0;} +.x-html-editor-tb .x-edit-decreasefontsize .x-btn-text{background-position:-64px 0;} +.x-html-editor-tb .x-edit-sourceedit .x-btn-text{background-position:-192px 0;} +.x-html-editor-tb .x-edit-createlink .x-btn-text{background-position:-208px 0;} +.x-html-editor-tip .x-tip-bd .x-tip-bd-inner{padding:5px;padding-bottom:1px;} +.x-html-editor-tb .x-toolbar{position:static!important;} + +.x-panel-noborder .x-panel-body-noborder{border-width:0;} +.x-panel-noborder .x-panel-header-noborder{border-width:0;border-bottom:1px solid #99bbe8;} +.x-panel-noborder .x-panel-tbar-noborder .x-toolbar{border-width:0;border-bottom:1px solid #99bbe8;} +.x-panel-noborder .x-panel-bbar-noborder .x-toolbar{border-width:0;border-top:1px solid #99bbe8;} +.x-window-noborder .x-window-mc{border-width:0;} +.x-window-plain .x-window-body-noborder{border-width:0;} +.x-tab-panel-noborder .x-tab-panel-body-noborder{border-width:0;} +.x-tab-panel-noborder .x-tab-panel-header-noborder{border-top-width:0;border-left-width:0;border-right-width:0;} +.x-tab-panel-noborder .x-tab-panel-footer-noborder{border-bottom-width:0;border-left-width:0;border-right-width:0;} +.x-tab-panel-bbar-noborder .x-toolbar{border-width:0;border-top:1px solid #99bbe8;} +.x-tab-panel-tbar-noborder .x-toolbar{border-width:0;border-bottom:1px solid #99bbe8;} + +.x-border-layout-ct{background:#dfe8f6;} +.x-border-panel{position:absolute;left:0;top:0;} +.x-tool-collapse-south{background-position:0 -195px;} +.x-tool-collapse-south-over{background-position:-15px -195px;} +.x-tool-collapse-north{background-position:0 -210px;} +.x-tool-collapse-north-over{background-position:-15px -210px;} +.x-tool-collapse-west{background-position:0 -180px;} +.x-tool-collapse-west-over{background-position:-15px -180px;} +.x-tool-collapse-east{background-position:0 -165px;} +.x-tool-collapse-east-over{background-position:-15px -165px;} +.x-tool-expand-south{background-position:0 -210px;} +.x-tool-expand-south-over{background-position:-15px -210px;} +.x-tool-expand-north{background-position:0 -195px;} +.x-tool-expand-north-over{background-position:-15px -195px;} +.x-tool-expand-west{background-position:0 -165px;} +.x-tool-expand-west-over{background-position:-15px -165px;} +.x-tool-expand-east{background-position:0 -180px;} +.x-tool-expand-east-over{background-position:-15px -180px;} +.x-tool-expand-north,.x-tool-expand-south{float:right;margin:3px;} +.x-tool-expand-east,.x-tool-expand-west{float:none;margin:3px auto;} +.x-accordion-hd .x-tool-toggle{background-position:0 -255px;} +.x-accordion-hd .x-tool-toggle-over{background-position:-15px -255px;} +.x-panel-collapsed .x-accordion-hd .x-tool-toggle{background-position:0 -240px;} +.x-panel-collapsed .x-accordion-hd .x-tool-toggle-over{background-position:-15px -240px;} +.x-accordion-hd{color:#222;padding-top:4px;padding-bottom:3px;border-top:0 none;font-weight:normal;background:transparent url(../images/default/panel/light-hd.gif) repeat-x 0 -9px;} +.x-layout-collapsed{position:absolute;left:-10000px;top:-10000px;visibility:hidden;background-color:#d2e0f2;width:20px;height:20px;overflow:hidden;border:1px solid #98c0f4;z-index:20;} +.ext-border-box .x-layout-collapsed{width:22px;height:22px;} +.x-layout-collapsed-over{cursor:pointer;background-color:#d9e8fb;} +.x-layout-collapsed-west .x-layout-collapsed-tools,.x-layout-collapsed-east .x-layout-collapsed-tools{position:absolute;top:0;left:0;width:20px;height:20px;} +.x-layout-split{position:absolute;height:5px;width:5px;line-height:1px;font-size:1px;z-index:3;background-color:transparent;} +.ext-strict .ext-ie6 .x-layout-split{background-color:#fff!important;filter:alpha(opacity=1);} +.x-layout-split-h{background-image:url(../images/default/s.gif);background-position:left;} +.x-layout-split-v{background-image:url(../images/default/s.gif);background-position:top;} +.x-column-layout-ct{overflow:hidden;zoom:1;} +.x-column{float:left;padding:0;margin:0;overflow:hidden;zoom:1;} +.x-layout-mini{position:absolute;top:0;left:0;display:block;width:5px;height:35px;cursor:pointer;opacity:.5;-moz-opacity:.5;filter:alpha(opacity=50);} +.x-layout-mini-over,.x-layout-collapsed-over .x-layout-mini{opacity:1;-moz-opacity:1;filter:none;} +.x-layout-split-west .x-layout-mini{top:48%;background-image:url(../images/default/layout/mini-left.gif);} +.x-layout-split-east .x-layout-mini{top:48%;background-image:url(../images/default/layout/mini-right.gif);} +.x-layout-split-north .x-layout-mini{left:48%;height:5px;width:35px;background-image:url(../images/default/layout/mini-top.gif);} +.x-layout-split-south .x-layout-mini{left:48%;height:5px;width:35px;background-image:url(../images/default/layout/mini-bottom.gif);} +.x-layout-cmini-west .x-layout-mini{top:48%;background-image:url(../images/default/layout/mini-right.gif);} +.x-layout-cmini-east .x-layout-mini{top:48%;background-image:url(../images/default/layout/mini-left.gif);} +.x-layout-cmini-north .x-layout-mini{left:48%;height:5px;width:35px;background-image:url(../images/default/layout/mini-bottom.gif);} +.x-layout-cmini-south .x-layout-mini{left:48%;height:5px;width:35px;background-image:url(../images/default/layout/mini-top.gif);} +.x-layout-cmini-west,.x-layout-cmini-east{border:0 none;width:5px!important;padding:0;background:transparent;} +.x-layout-cmini-north,.x-layout-cmini-south{border:0 none;height:5px!important;padding:0;background:transparent;} +.x-viewport,.x-viewport body{margin:0;padding:0;border:0 none;overflow:hidden;height:100%;} +.x-abs-layout-item{position:absolute;left:0;top:0;} +.ext-ie input.x-abs-layout-item,.ext-ie textarea.x-abs-layout-item{margin:0;} + +.x-progress-wrap{border:1px solid #6593cf;overflow:hidden;} +.x-progress-inner{height:18px;background:#e0e8f3 url(../images/default/qtip/bg.gif) repeat-x;position:relative;} +.x-progress-bar{height:18px;float:left;width:0;background:#9CBFEE url( ../images/default/progress/progress-bg.gif ) repeat-x left center;border-top:1px solid #D1E4FD;border-bottom:1px solid #7FA9E4;border-right:1px solid #7FA9E4;} +.x-progress-text{font-size:11px;font-weight:bold;color:#fff;padding:1px 5px;overflow:hidden;position:absolute;left:0;text-align:center;} +.x-progress-text-back{color:#396095;line-height:16px;} +.ext-ie .x-progress-text-back{line-height:15px;} + +.x-window-dlg .x-window-body{border:0 none!important;padding:5px 10px;overflow:hidden!important;} +.x-window-dlg .x-window-mc{border:0 none!important;} +.x-window-dlg .ext-mb-text,.x-window-dlg .x-window-header-text{font-size:12px;} +.x-window-dlg .ext-mb-input{margin-top:4px;width:95%;} +.x-window-dlg .ext-mb-textarea{margin-top:4px;font:normal 12px tahoma,arial,helvetica,sans-serif;} +.x-window-dlg .x-progress-wrap{margin-top:4px;} +.ext-ie .x-window-dlg .x-progress-wrap{margin-top:6px;} +.x-window-dlg .x-msg-box-wait{background:transparent url(../images/default/grid/loading.gif) no-repeat left;display:block;width:300px;padding-left:18px;line-height:18px;} +.x-window-dlg .ext-mb-icon{float:left;width:47px;height:32px;} +.x-window-dlg .ext-mb-icon{float:left;width:47px;height:32px;} +.ext-ie .x-window-dlg .ext-mb-icon{width:44px;} +.x-window-dlg .ext-mb-info{background:transparent url(../images/default/window/icon-info.gif) no-repeat top left;} +.x-window-dlg .ext-mb-warning{background:transparent url(../images/default/window/icon-warning.gif) no-repeat top left;} +.x-window-dlg .ext-mb-question{background:transparent url(../images/default/window/icon-question.gif) no-repeat top left;} +.x-window-dlg .ext-mb-error{background:transparent url(../images/default/window/icon-error.gif) no-repeat top left;} +.ext-gecko2 .ext-mb-fix-cursor{overflow:auto;} + + .x-slider{zoom:1;} +.x-slider-inner{position:relative;left:0;top:0;overflow:visible;zoom:1;} +.x-slider-focus{position:absolute;left:0;top:0;width:1px;height:1px;line-height:1px;font-size:1px;-moz-outline:0 none;outline:0 none;-moz-user-select:text;-khtml-user-select:text;} +.x-slider-horz{padding-left:7px;background:transparent url(../images/default/slider/slider-bg.png) no-repeat 0 -22px;} +.x-slider-horz .x-slider-end{padding-right:7px;zoom:1;background:transparent url(../images/default/slider/slider-bg.png) no-repeat right -44px;} +.x-slider-horz .x-slider-inner{background:transparent url(../images/default/slider/slider-bg.png) repeat-x 0 0;height:22px;} +.x-slider-horz .x-slider-thumb{width:14px;height:15px;position:absolute;left:0;top:3px;background:transparent url(../images/default/slider/slider-thumb.png) no-repeat 0 0;} +.x-slider-horz .x-slider-thumb-over{background-position:-14px -15px;} +.x-slider-horz .x-slider-thumb-drag{background-position:-28px -30px;} +.x-slider-vert{padding-top:7px;background:transparent url(../images/default/slider/slider-v-bg.png) no-repeat -44px 0;width:22px;} +.x-slider-vert .x-slider-end{padding-bottom:7px;zoom:1;background:transparent url(../images/default/slider/slider-v-bg.png) no-repeat -22px bottom;} +.x-slider-vert .x-slider-inner{background:transparent url(../images/default/slider/slider-v-bg.png) repeat-y 0 0;} +.x-slider-vert .x-slider-thumb{width:15px;height:14px;position:absolute;left:3px;bottom:0;background:transparent url(../images/default/slider/slider-v-thumb.png) no-repeat 0 0;} +.x-slider-vert .x-slider-thumb-over{background-position:-15px -14px;} +.x-slider-vert .x-slider-thumb-drag{background-position:-30px -28px;} + diff --git a/.svn/pristine/53/53e1d4979c643f379b2a12067f65e547ec093dfb.svn-base b/.svn/pristine/53/53e1d4979c643f379b2a12067f65e547ec093dfb.svn-base new file mode 100644 index 0000000..6101164 Binary files /dev/null and b/.svn/pristine/53/53e1d4979c643f379b2a12067f65e547ec093dfb.svn-base differ diff --git a/.svn/pristine/54/5486e515684b5b3a839c765e770a25583ffc4e16.svn-base b/.svn/pristine/54/5486e515684b5b3a839c765e770a25583ffc4e16.svn-base new file mode 100644 index 0000000..7b6e1c1 Binary files /dev/null and b/.svn/pristine/54/5486e515684b5b3a839c765e770a25583ffc4e16.svn-base differ diff --git a/.svn/pristine/54/5488bbf3ee8a87f3a81e1813841800d162c471f7.svn-base b/.svn/pristine/54/5488bbf3ee8a87f3a81e1813841800d162c471f7.svn-base new file mode 100644 index 0000000..5286f58 Binary files /dev/null and b/.svn/pristine/54/5488bbf3ee8a87f3a81e1813841800d162c471f7.svn-base differ diff --git a/.svn/pristine/55/556e0e0f071afd336fe882ee966a87bce759ec86.svn-base b/.svn/pristine/55/556e0e0f071afd336fe882ee966a87bce759ec86.svn-base new file mode 100644 index 0000000..563c904 --- /dev/null +++ b/.svn/pristine/55/556e0e0f071afd336fe882ee966a87bce759ec86.svn-base @@ -0,0 +1,309 @@ + +Ext.apply( Ext.lib.Ajax , +{ forceActiveX:false, + createXhrObject:function(transactionId) + { + var obj={ status:{isError:false} + , tId:transactionId}, http; + try + { + + if(Ext.isIE7 && !!this.forceActiveX){throw("IE7forceActiveX");} + + obj.conn= new XMLHttpRequest(); + + } + catch(e) + { + for (var i = 0; i < this.activeX.length; ++i) { + try + { + obj.conn= new ActiveXObject(this.activeX[i]); + + break; + } + catch(e) { + } + } + } + finally + { + obj.status.isError = typeof(obj.conn) === undefined; + } + return obj; + + }, + + getHttpStatus: function(reqObj){ + + var statObj = { status:0 + ,statusText:'' + ,isError:false + ,isLocal:false + ,isOK:false + ,error:null}; + + try { + if(!reqObj)throw('noobj'); + statObj.status = reqObj.status; + + statObj.isLocal = !reqObj.status && location.protocol == "file:" || + Ext.isSafari && reqObj.status === undefined; + + statObj.isOK = (statObj.isLocal || (statObj.status > 199 && statObj.status < 300)); + statObj.statusText = reqObj.statusText || ''; + } catch(e){ //status may not avail/valid yet (or called too early). + } + + return statObj; + + }, + handleTransactionResponse:function(o, callback, isAbort) + { + + + callback = callback || {}; + var responseObject=null; + + if(!o.status.isError){ + o.status = this.getHttpStatus(o.conn); + /* create and enhance the response with proper status and XMLDOM if necessary */ + responseObject = this.createResponseObject(o, callback.argument); + } + + if(o.status.isError){ /* checked again in case exception was raised - ActiveX was disabled during XML-DOM creation? */ + // And mixin everything the XHR object had to offer as well + responseObject = Ext.applyIf(responseObject||{},this.createExceptionObject(o.tId, callback.argument, (isAbort ? isAbort : false))); + + } + + responseObject.options = o.options; + responseObject.stat = o.status; + + if (o.status.isOK && !o.status.isError) { + if (callback.success) { + if (!callback.scope) { + callback.success(responseObject); + } + else { + callback.success.apply(callback.scope, [responseObject]); + } + } + } else { + + if (callback.failure) { + if (!callback.scope) { + callback.failure(responseObject); + } + else { + callback.failure.apply(callback.scope, [responseObject]); + } + } + + } + + if(o.options.async){ + this.releaseObject(o); + responseObject = null; + }else{ + this.releaseObject(o); + return responseObject; + } + + }, + createResponseObject:function(o, callbackArg) + { + var obj = {}; + var headerObj = {},headerStr=''; + + try{ //to catch bad encoding problems here + obj.responseText = o.conn.responseText; + }catch(e){obj.responseText ='';} + + obj.responseXML = o.conn.responseXML; + + try{ + headerStr = o.conn.getAllResponseHeaders()||''; + } catch(e){} + + if(o.status.isLocal){ + + o.status.isOK = ((o.status.status = (!!obj.responseText.length)?200:404) == 200); + + if(o.status.isOK && (!obj.responseXML || obj.responseXML.childNodes.length == 0)){ + + var xdoc=null; + try{ //ActiveX may be disabled + if(typeof(DOMParser) == 'undefined'){ + xdoc=new ActiveXObject("Microsoft.XMLDOM"); + xdoc.async="false"; + xdoc.loadXML(obj.responseText); + + }else{ + try{ //Opera 9 will fail parsing non-XML content, so trap here. + var domParser = new DOMParser(); + xdoc = domParser.parseFromString(obj.responseText, 'application\/xml'); + }catch(ex){} + finally{domParser = null;} + + } + } catch(ex){ + o.status.isError = true; + o.status.error = ex; + + } + + obj.responseXML = xdoc; + } + + if(obj.responseXML){ + + var parseBad = (obj.responseXML.parseError || 0) != 0 || obj.responseXML.childNodes.length == 0; + if(!parseBad){ + headerStr = 'Content-Type: ' + (obj.responseXML.contentType || 'text\/xml') + '\n' + headerStr ; + } + } + + + } + + var header = headerStr.split('\n'); + for (var i = 0; i < header.length; i++) { + var delimitPos = header[i].indexOf(':'); + if (delimitPos != -1) { + headerObj[header[i].substring(0, delimitPos)] = header[i].substring(delimitPos + 2); + } + } + + obj.tId = o.tId; + obj.status = o.status.status; + obj.statusText = o.status.statusText; + obj.getResponseHeader = headerObj; + obj.getAllResponseHeaders = headerStr; + obj.stat = o.status + + if (typeof callbackArg !== undefined) { + obj.argument = callbackArg; + } + + return obj; + }, + + request : function(method, uri, cb, data, options) { + + options = Ext.apply({async:true, + headers:false, + userId:null, + password:null, + xmlData:null }, options||{}); + + var hs = options.headers; + if(hs){ + for(var h in hs){ + if(hs.hasOwnProperty(h)){ + this.initHeader(h, hs[h], false); + } + } + } + if(options.xmlData){ + this.initHeader('Content-Type', 'text/xml', false); + method = 'POST'; + data = options.xmlData; + } + + return this.makeRequest(method, uri, cb, data, options); + + }, + asyncRequest:function(method, uri, callback, postData) + { + var o = this.getConnectionObject(); + + if (!o || o.status.isError) { + return null; + } + else { + o.options = options; + try{ + o.conn.open(method, uri, true); + } catch(ex){ + o.status.isError = true; + o.status.error = ex; + return Ext.apply(o,this.handleTransactionResponse(o, callback)); + + } + + + if (this.useDefaultXhrHeader) { + if (!this.defaultHeaders['X-Requested-With']) { + this.initHeader('X-Requested-With', this.defaultXhrHeader, true); + } + } + + if(postData && this.useDefaultHeader){ + this.initHeader('Content-Type', this.defaultPostHeader); + } + + if (this.hasDefaultHeaders || this.hasHeaders) { + this.setHeader(o); + } + + this.handleReadyState(o, callback); + + try{ o.conn.send(postData || null); + } catch(ex){ + o.status.isError=true; + o.status.error = ex; + return Ext.apply(o,this.handleTransactionResponse(o, callback)); + } + + + return o; + } + }, + + makeRequest:function(method, uri, callback, postData, options) + { + var o = this.getConnectionObject(); + + if (!o || o.status.isError) { + return null; + } + else { + o.options = options; + try{ + o.conn.open(method, uri, options.async, options.userId, options.password); + } catch(ex){ + o.status.isError = true; + o.status.error = ex; + var r=this.handleTransactionResponse(o, callback); + return Ext.apply(o,r); + } + + if (this.useDefaultXhrHeader) { + if (!this.defaultHeaders['X-Requested-With']) { + this.initHeader('X-Requested-With', this.defaultXhrHeader, true); + } + } + + if(postData && this.useDefaultHeader){ + this.initHeader('Content-Type', this.defaultPostHeader); + } + + if (this.hasDefaultHeaders || this.hasHeaders) { + this.setHeader(o); + } + + if(o.options.async){ //Timers won't work here as it's a blocking call + this.handleReadyState(o, callback); + } + + try{ o.conn.send(postData || null); + } catch(ex){ + //Ext.apply(o,this.handleTransactionResponse(o, callback)); + } + + return options.async?o:Ext.apply(o,this.handleTransactionResponse(o, callback)); + } + }}); + +Ext.lib.Ajax.forceActiveX = (document.location.protocol == 'file:');/* or other true/false mechanism */ \ No newline at end of file diff --git a/.svn/pristine/56/56d45f8a17f5078a20af9962c992ca4678450765.svn-base b/.svn/pristine/56/56d45f8a17f5078a20af9962c992ca4678450765.svn-base new file mode 100644 index 0000000..1d11fa9 Binary files /dev/null and b/.svn/pristine/56/56d45f8a17f5078a20af9962c992ca4678450765.svn-base differ diff --git a/.svn/pristine/57/573de9d267d26ddc1505198374981d669ccace19.svn-base b/.svn/pristine/57/573de9d267d26ddc1505198374981d669ccace19.svn-base new file mode 100644 index 0000000..ad599cf Binary files /dev/null and b/.svn/pristine/57/573de9d267d26ddc1505198374981d669ccace19.svn-base differ diff --git a/.svn/pristine/58/587efd117c281e8a039b9c28c5b8311acb442047.svn-base b/.svn/pristine/58/587efd117c281e8a039b9c28c5b8311acb442047.svn-base new file mode 100644 index 0000000..445769d Binary files /dev/null and b/.svn/pristine/58/587efd117c281e8a039b9c28c5b8311acb442047.svn-base differ diff --git a/.svn/pristine/59/5903e82e67bf43b2ebe1166794426ca3982b1650.svn-base b/.svn/pristine/59/5903e82e67bf43b2ebe1166794426ca3982b1650.svn-base new file mode 100644 index 0000000..813e84c --- /dev/null +++ b/.svn/pristine/59/5903e82e67bf43b2ebe1166794426ca3982b1650.svn-base @@ -0,0 +1,9 @@ +#Tue Jul 26 19:43:14 GMT+08:00 2011 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/.svn/pristine/59/599eba7cade314599f77a4c854fd03b90ee7cabe.svn-base b/.svn/pristine/59/599eba7cade314599f77a4c854fd03b90ee7cabe.svn-base new file mode 100644 index 0000000..e647867 Binary files /dev/null and b/.svn/pristine/59/599eba7cade314599f77a4c854fd03b90ee7cabe.svn-base differ diff --git a/.svn/pristine/5a/5a563c0399030a84867cce69ef5fd5d8c52c0c2d.svn-base b/.svn/pristine/5a/5a563c0399030a84867cce69ef5fd5d8c52c0c2d.svn-base new file mode 100644 index 0000000..ffd18a3 Binary files /dev/null and b/.svn/pristine/5a/5a563c0399030a84867cce69ef5fd5d8c52c0c2d.svn-base differ diff --git a/.svn/pristine/5b/5b064977d6283ca469fa1bb6b3b896e74ff04409.svn-base b/.svn/pristine/5b/5b064977d6283ca469fa1bb6b3b896e74ff04409.svn-base new file mode 100644 index 0000000..7baadc9 --- /dev/null +++ b/.svn/pristine/5b/5b064977d6283ca469fa1bb6b3b896e74ff04409.svn-base @@ -0,0 +1,632 @@ +Ext.BLANK_IMAGE_URL = 'resources/s.gif'; + +Docs = {}; + +ApiPanel = function() { + ApiPanel.superclass.constructor.call(this, { + id:'api-tree', + region:'west', + split:true, + width: 280, + minSize: 175, + maxSize: 500, + collapsible: true, + margins:'0 0 5 5', + cmargins:'0 0 0 0', + rootVisible:false, + lines:false, + autoScroll:true, + animCollapse:false, + animate: false, + collapseMode:'mini', + loader: new Ext.tree.TreeLoader({ + preloadChildren: true, + clearOnLoad: false + }), + root: new Ext.tree.AsyncTreeNode({ + text:'Ext JS', + id:'root', + expanded:true, + children:[Docs.classData] + }), + collapseFirst:false + }); + // no longer needed! + //new Ext.tree.TreeSorter(this, {folderSort:true,leafAttr:'isClass'}); + + this.getSelectionModel().on('beforeselect', function(sm, node){ + return node.isLeaf(); + }); +}; + +Ext.extend(ApiPanel, Ext.tree.TreePanel, { + selectClass : function(cls){ + if(cls){ + var parts = cls.split('.'); + var last = parts.length-1; + var res = []; + var pkg = []; + for(var i = 0; i < last; i++){ // things get nasty - static classes can have . + var p = parts[i]; + var fc = p.charAt(0); + var staticCls = fc.toUpperCase() == fc; + if(p == 'Ext' || !staticCls){ + pkg.push(p); + res[i] = 'pkg-'+pkg.join('.'); + }else if(staticCls){ + --last; + res.splice(i, 1); + } + } + res[last] = cls; + + this.selectPath('/root/apidocs/'+res.join('/')); + } + } +}); + + +DocPanel = Ext.extend(Ext.Panel, { + closable: true, + autoScroll:true, + + initComponent : function(){ + var ps = this.cclass.split('.'); + this.title = ps[ps.length-1]; + + DocPanel.superclass.initComponent.call(this); + }, + + scrollToMember : function(member){ + var el = Ext.fly(this.cclass + '-' + member); + if(el){ + var top = (el.getOffsetsTo(this.body)[1]) + this.body.dom.scrollTop; + this.body.scrollTo('top', top-25, {duration:.75, callback: this.hlMember.createDelegate(this, [member])}); + } + }, + + scrollToSection : function(id){ + var el = Ext.getDom(id); + if(el){ + var top = (Ext.fly(el).getOffsetsTo(this.body)[1]) + this.body.dom.scrollTop; + this.body.scrollTo('top', top-25, {duration:.5, callback: function(){ + Ext.fly(el).next('h2').pause(.2).highlight('#8DB2E3', {attr:'color'}); + }}); + } + }, + + hlMember : function(member){ + var el = Ext.fly(this.cclass + '-' + member); + if(el){ + el.up('tr').highlight('#cadaf9'); + } + } +}); + + +MainPanel = function(){ + + this.searchStore = new Ext.data.Store({ + proxy: new Ext.data.ScriptTagProxy({ + url: 'http://extjs.com/playpen/api.php' + }), + reader: new Ext.data.JsonReader({ + root: 'data' + }, + ['cls', 'member', 'type', 'doc'] + ), + baseParams: {}, + listeners: { + 'beforeload' : function(){ + this.baseParams.qt = Ext.getCmp('search-type').getValue(); + } + } + }); + + MainPanel.superclass.constructor.call(this, { + id:'doc-body', + region:'center', + margins:'0 5 5 0', + resizeTabs: true, + minTabWidth: 135, + tabWidth: 135, + plugins: new Ext.ux.TabCloseMenu(), + enableTabScroll: true, + activeTab: 0, + + items: { + id:'welcome-panel', + title: 'API Home', + autoLoad: {url: 'welcome.html', callback: this.initSearch, scope: this}, + iconCls:'icon-docs', + autoScroll: true, + tbar: [ + 'Search: ', ' ', + new Ext.ux.SelectBox({ + listClass:'x-combo-list-small', + width:90, + value:'Starts with', + id:'search-type', + store: new Ext.data.SimpleStore({ + fields: ['text'], + expandData: true, + data : ['Starts with', 'Ends with', 'Any match'] + }), + displayField: 'text' + }), ' ', + new Ext.app.SearchField({ + width:240, + store: this.searchStore, + paramName: 'q' + }) + ] + } + }); +}; + +Ext.extend(MainPanel, Ext.TabPanel, { + + initEvents : function(){ + MainPanel.superclass.initEvents.call(this); + this.body.on('click', this.onClick, this); + }, + + onClick: function(e, target){ + if(target = e.getTarget('a:not(.exi)', 3)){ + var cls = Ext.fly(target).getAttributeNS('ext', 'cls'); + e.stopEvent(); + if(cls){ + var member = Ext.fly(target).getAttributeNS('ext', 'member'); + this.loadClass(target.href, cls, member); + }else if(target.className == 'inner-link'){ + this.getActiveTab().scrollToSection(target.href.split('#')[1]); + }else{ + window.open(target.href); + } + }else if(target = e.getTarget('.micon', 2)){ + e.stopEvent(); + var tr = Ext.fly(target.parentNode); + if(tr.hasClass('expandable')){ + tr.toggleClass('expanded'); + } + } + }, + + loadClass : function(href, cls, member){ + var id = 'docs-' + cls; + var tab = this.getComponent(id); + if(tab){ + this.setActiveTab(tab); + if(member){ + tab.scrollToMember(member); + } + }else{ + var autoLoad = {url: href}; + if(member){ + autoLoad.callback = function(){ + Ext.getCmp(id).scrollToMember(member); + } + } + var p = this.add(new DocPanel({ + id: id, + cclass : cls, + autoLoad: autoLoad, + iconCls: Docs.icons[cls] + })); + this.setActiveTab(p); + } + }, + + initSearch : function(){ + // Custom rendering Template for the View + var resultTpl = new Ext.XTemplate( + '', + '
', + '', + '{member}', + ' ', + '{cls}', + '

{doc}

', + '
' + ); + + var p = new Ext.DataView({ + applyTo: 'search', + tpl: resultTpl, + loadingText:'Searching...', + store: this.searchStore, + itemSelector: 'div.search-item', + emptyText: '

Use the search field above to search the Ext API for classes, properties, config options, methods and events.

' + }); + }, + + doSearch : function(e){ + var k = e.getKey(); + if(!e.isSpecialKey()){ + var text = e.target.value; + if(!text){ + this.searchStore.baseParams.q = ''; + this.searchStore.removeAll(); + }else{ + this.searchStore.baseParams.q = text; + this.searchStore.reload(); + } + } + } +}); + + +Ext.onReady(function(){ + + Ext.QuickTips.init(); + + var api = new ApiPanel(); + var mainPanel = new MainPanel(); + + api.on('click', function(node, e){ + if(node.isLeaf()){ + e.stopEvent(); + mainPanel.loadClass(node.attributes.href, node.id); + } + }); + + mainPanel.on('tabchange', function(tp, tab){ + api.selectClass(tab.cclass); + }); + + var hd = new Ext.Panel({ + border: false, + layout:'anchor', + region:'north', + cls: 'docs-header', + height:60, + items: [{ + xtype:'box', + el:'header', + border:false, + anchor: 'none -25' + }, + new Ext.Toolbar({ + cls:'top-toolbar', + items:[ ' ', + new Ext.form.TextField({ + width: 200, + emptyText:'Find a Class', + listeners:{ + render: function(f){ + f.el.on('keydown', filterTree, f, {buffer: 350}); + } + } + }), ' ', ' ', + { + iconCls: 'icon-expand-all', + tooltip: 'Expand All', + handler: function(){ api.root.expand(true); } + }, '-', { + iconCls: 'icon-collapse-all', + tooltip: 'Collapse All', + handler: function(){ api.root.collapse(true); } + }, '->', { + tooltip:'Hide Inherited Members', + iconCls: 'icon-hide-inherited', + enableToggle: true, + toggleHandler : function(b, pressed){ + mainPanel[pressed ? 'addClass' : 'removeClass']('hide-inherited'); + } + }, '-', { + tooltip:'Expand All Members', + iconCls: 'icon-expand-members', + enableToggle: true, + toggleHandler : function(b, pressed){ + mainPanel[pressed ? 'addClass' : 'removeClass']('full-details'); + } + }] + })] + }) + + var viewport = new Ext.Viewport({ + layout:'border', + items:[ hd, api, mainPanel ] + }); + + api.expandPath('/root/apidocs'); + + // allow for link in + var page = window.location.href.split('?')[1]; + if(page){ + var ps = Ext.urlDecode(page); + var cls = ps['class']; + mainPanel.loadClass('output/' + cls + '.html', cls, ps.member); + } + + viewport.doLayout(); + + setTimeout(function(){ + Ext.get('loading').remove(); + Ext.get('loading-mask').fadeOut({remove:true}); + }, 250); + + var filter = new Ext.tree.TreeFilter(api, { + clearBlank: true, + autoClear: true + }); + var hiddenPkgs = []; + function filterTree(e){ + var text = e.target.value; + Ext.each(hiddenPkgs, function(n){ + n.ui.show(); + }); + if(!text){ + filter.clear(); + return; + } + api.expandAll(); + + var re = new RegExp('^' + Ext.escapeRe(text), 'i'); + filter.filterBy(function(n){ + return !n.attributes.isClass || re.test(n.text); + }); + + // hide empty packages that weren't filtered + hiddenPkgs = []; + api.root.cascade(function(n){ + if(!n.attributes.isClass && n.ui.ctNode.offsetHeight < 3){ + n.ui.hide(); + hiddenPkgs.push(n); + } + }); + } + +}); + + +Ext.app.SearchField = Ext.extend(Ext.form.TwinTriggerField, { + initComponent : function(){ + if(!this.store.baseParams){ + this.store.baseParams = {}; + } + Ext.app.SearchField.superclass.initComponent.call(this); + this.on('specialkey', function(f, e){ + if(e.getKey() == e.ENTER){ + this.onTrigger2Click(); + } + }, this); + }, + + validationEvent:false, + validateOnBlur:false, + trigger1Class:'x-form-clear-trigger', + trigger2Class:'x-form-search-trigger', + hideTrigger1:true, + width:180, + hasSearch : false, + paramName : 'query', + + onTrigger1Click : function(){ + if(this.hasSearch){ + this.store.baseParams[this.paramName] = ''; + this.store.removeAll(); + this.el.dom.value = ''; + this.triggers[0].hide(); + this.hasSearch = false; + this.focus(); + } + }, + + onTrigger2Click : function(){ + var v = this.getRawValue(); + if(v.length < 1){ + this.onTrigger1Click(); + return; + } + if(v.length < 2){ + Ext.Msg.alert('Invalid Search', 'You must enter a minimum of 2 characters to search the API'); + return; + } + this.store.baseParams[this.paramName] = v; + var o = {start: 0}; + this.store.reload({params:o}); + this.hasSearch = true; + this.triggers[0].show(); + this.focus(); + } +}); + + +/** + * Makes a ComboBox more closely mimic an HTML SELECT. Supports clicking and dragging + * through the list, with item selection occurring when the mouse button is released. + * When used will automatically set {@link #editable} to false and call {@link Ext.Element#unselectable} + * on inner elements. Re-enabling editable after calling this will NOT work. + * + * @author Corey Gilmore + * http://extjs.com/forum/showthread.php?t=6392 + * + * @history 2007-07-08 jvs + * Slight mods for Ext 2.0 + */ +Ext.ux.SelectBox = function(config){ + this.searchResetDelay = 1000; + config = config || {}; + config = Ext.apply(config || {}, { + editable: false, + forceSelection: true, + rowHeight: false, + lastSearchTerm: false, + triggerAction: 'all', + mode: 'local' + }); + + Ext.ux.SelectBox.superclass.constructor.apply(this, arguments); + + this.lastSelectedIndex = this.selectedIndex || 0; +}; + +Ext.extend(Ext.ux.SelectBox, Ext.form.ComboBox, { + lazyInit: false, + initEvents : function(){ + Ext.ux.SelectBox.superclass.initEvents.apply(this, arguments); + // you need to use keypress to capture upper/lower case and shift+key, but it doesn't work in IE + this.el.on('keydown', this.keySearch, this, true); + this.cshTask = new Ext.util.DelayedTask(this.clearSearchHistory, this); + }, + + keySearch : function(e, target, options) { + var raw = e.getKey(); + var key = String.fromCharCode(raw); + var startIndex = 0; + + if( !this.store.getCount() ) { + return; + } + + switch(raw) { + case Ext.EventObject.HOME: + e.stopEvent(); + this.selectFirst(); + return; + + case Ext.EventObject.END: + e.stopEvent(); + this.selectLast(); + return; + + case Ext.EventObject.PAGEDOWN: + this.selectNextPage(); + e.stopEvent(); + return; + + case Ext.EventObject.PAGEUP: + this.selectPrevPage(); + e.stopEvent(); + return; + } + + // skip special keys other than the shift key + if( (e.hasModifier() && !e.shiftKey) || e.isNavKeyPress() || e.isSpecialKey() ) { + return; + } + if( this.lastSearchTerm == key ) { + startIndex = this.lastSelectedIndex; + } + this.search(this.displayField, key, startIndex); + this.cshTask.delay(this.searchResetDelay); + }, + + onRender : function(ct, position) { + this.store.on('load', this.calcRowsPerPage, this); + Ext.ux.SelectBox.superclass.onRender.apply(this, arguments); + if( this.mode == 'local' ) { + this.calcRowsPerPage(); + } + }, + + onSelect : function(record, index, skipCollapse){ + if(this.fireEvent('beforeselect', this, record, index) !== false){ + this.setValue(record.data[this.valueField || this.displayField]); + if( !skipCollapse ) { + this.collapse(); + } + this.lastSelectedIndex = index + 1; + this.fireEvent('select', this, record, index); + } + }, + + render : function(ct) { + Ext.ux.SelectBox.superclass.render.apply(this, arguments); + if( Ext.isSafari ) { + this.el.swallowEvent('mousedown', true); + } + this.el.unselectable(); + this.innerList.unselectable(); + this.trigger.unselectable(); + this.innerList.on('mouseup', function(e, target, options) { + if( target.id && target.id == this.innerList.id ) { + return; + } + this.onViewClick(); + }, this); + + this.innerList.on('mouseover', function(e, target, options) { + if( target.id && target.id == this.innerList.id ) { + return; + } + this.lastSelectedIndex = this.view.getSelectedIndexes()[0] + 1; + this.cshTask.delay(this.searchResetDelay); + }, this); + + this.trigger.un('click', this.onTriggerClick, this); + this.trigger.on('mousedown', function(e, target, options) { + e.preventDefault(); + this.onTriggerClick(); + }, this); + + this.on('collapse', function(e, target, options) { + Ext.getDoc().un('mouseup', this.collapseIf, this); + }, this, true); + + this.on('expand', function(e, target, options) { + Ext.getDoc().on('mouseup', this.collapseIf, this); + }, this, true); + }, + + clearSearchHistory : function() { + this.lastSelectedIndex = 0; + this.lastSearchTerm = false; + }, + + selectFirst : function() { + this.focusAndSelect(this.store.data.first()); + }, + + selectLast : function() { + this.focusAndSelect(this.store.data.last()); + }, + + selectPrevPage : function() { + if( !this.rowHeight ) { + return; + } + var index = Math.max(this.selectedIndex-this.rowsPerPage, 0); + this.focusAndSelect(this.store.getAt(index)); + }, + + selectNextPage : function() { + if( !this.rowHeight ) { + return; + } + var index = Math.min(this.selectedIndex+this.rowsPerPage, this.store.getCount() - 1); + this.focusAndSelect(this.store.getAt(index)); + }, + + search : function(field, value, startIndex) { + field = field || this.displayField; + this.lastSearchTerm = value; + var index = this.store.find.apply(this.store, arguments); + if( index !== -1 ) { + this.focusAndSelect(index); + } + }, + + focusAndSelect : function(record) { + var index = typeof record === 'number' ? record : this.store.indexOf(record); + this.select(index, this.isExpanded()); + this.onSelect(this.store.getAt(record), index, this.isExpanded()); + }, + + calcRowsPerPage : function() { + if( this.store.getCount() ) { + this.rowHeight = Ext.fly(this.view.getNode(0)).getHeight(); + this.rowsPerPage = this.maxHeight / this.rowHeight; + } else { + this.rowHeight = false; + } + } + +}); + +Ext.Ajax.on('requestcomplete', function(ajax, xhr, o){ + if(typeof urchinTracker == 'function' && o && o.url){ + urchinTracker(o.url); + } +}); \ No newline at end of file diff --git a/.svn/pristine/5b/5ba96a6d53a4e9f5e868e64eb800e51080c86c94.svn-base b/.svn/pristine/5b/5ba96a6d53a4e9f5e868e64eb800e51080c86c94.svn-base new file mode 100644 index 0000000..f637fa5 Binary files /dev/null and b/.svn/pristine/5b/5ba96a6d53a4e9f5e868e64eb800e51080c86c94.svn-base differ diff --git a/.svn/pristine/5c/5c89b09a00ddcd17f3d7a9fe1a880aa04cebeedc.svn-base b/.svn/pristine/5c/5c89b09a00ddcd17f3d7a9fe1a880aa04cebeedc.svn-base new file mode 100644 index 0000000..bb88b6f Binary files /dev/null and b/.svn/pristine/5c/5c89b09a00ddcd17f3d7a9fe1a880aa04cebeedc.svn-base differ diff --git a/.svn/pristine/5d/5d287483a8be494e43953bdd82578746a10cb41c.svn-base b/.svn/pristine/5d/5d287483a8be494e43953bdd82578746a10cb41c.svn-base new file mode 100644 index 0000000..97a2cb9 --- /dev/null +++ b/.svn/pristine/5d/5d287483a8be494e43953bdd82578746a10cb41c.svn-base @@ -0,0 +1,84 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.demo.talker.dto; + +import org.comet4j.demo.talker.Constant; + +/** + * 系统健康传输对象 + * @author jinghai.xiao@gmail.com + * @date 2011-4-7 + */ + +public class HealthDTO { + + private final String type = Constant.HEALTH; + private String totalMemory; + private String freeMemory; + private String maxMemory; + private String usedMemory; + private String connectorCount; + private String startup; + private final long divider = 1024 * 1024; + + public String getTotalMemory() { + return totalMemory; + } + + public void setTotalMemory(long totalMemory) { + Long result = totalMemory / divider; + this.totalMemory = result.toString(); + } + + public String getFreeMemory() { + return freeMemory; + } + + public void setFreeMemory(long freeMemory) { + Long result = freeMemory / divider; + this.freeMemory = result.toString(); + } + + public String getMaxMemory() { + return maxMemory; + } + + public void setMaxMemory(long maxMemory) { + Long result = maxMemory / divider; + this.maxMemory = result.toString(); + } + + public String getUsedMemory() { + return usedMemory; + } + + public void setUsedMemory(long usedMemory) { + Long result = usedMemory / divider; + this.usedMemory = result.toString(); + } + + public String getConnectorCount() { + return connectorCount; + } + + public void setConnectorCount(String connectorCount) { + this.connectorCount = connectorCount; + } + + public String getType() { + return type; + } + + public String getStartup() { + + return startup; + } + + public void setStartup(String startup) { + this.startup = startup; + } + +} diff --git a/.svn/pristine/5d/5d3d4f3b1d11f277b9fb36b0962d881a2a6dc63b.svn-base b/.svn/pristine/5d/5d3d4f3b1d11f277b9fb36b0962d881a2a6dc63b.svn-base new file mode 100644 index 0000000..5c6c09d Binary files /dev/null and b/.svn/pristine/5d/5d3d4f3b1d11f277b9fb36b0962d881a2a6dc63b.svn-base differ diff --git a/.svn/pristine/5d/5d647aba7a3f91dc073d50a595bd2b7f46b3e9f8.svn-base b/.svn/pristine/5d/5d647aba7a3f91dc073d50a595bd2b7f46b3e9f8.svn-base new file mode 100644 index 0000000..e232a10 --- /dev/null +++ b/.svn/pristine/5d/5d647aba7a3f91dc073d50a595bd2b7f46b3e9f8.svn-base @@ -0,0 +1 @@ +用于模拟用户使用框架发送信息 \ No newline at end of file diff --git a/.svn/pristine/5e/5e2a0ab8299bda9a3fa67169379f3d2c04b2f78e.svn-base b/.svn/pristine/5e/5e2a0ab8299bda9a3fa67169379f3d2c04b2f78e.svn-base new file mode 100644 index 0000000..7a343d8 --- /dev/null +++ b/.svn/pristine/5e/5e2a0ab8299bda9a3fa67169379f3d2c04b2f78e.svn-base @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.svn/pristine/5e/5e7be9c6011b7e6d8e4be4f3b358e8d58c612d39.svn-base b/.svn/pristine/5e/5e7be9c6011b7e6d8e4be4f3b358e8d58c612d39.svn-base new file mode 100644 index 0000000..e1a8c0a --- /dev/null +++ b/.svn/pristine/5e/5e7be9c6011b7e6d8e4be4f3b358e8d58c612d39.svn-base @@ -0,0 +1,49 @@ +package org.comet4j.demo.eventmonitor; + +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; + +import org.comet4j.core.CometContext; +import org.comet4j.core.CometEngine; +import org.comet4j.core.event.BeforeConnectEvent; +import org.comet4j.core.event.BeforeDropEvent; +import org.comet4j.core.event.BeforeRemoveEvent; +import org.comet4j.core.event.CometContextEvent; +import org.comet4j.core.event.ConnectEvent; +import org.comet4j.core.event.DropEvent; +import org.comet4j.core.event.DyingEvent; +import org.comet4j.core.event.MessageEvent; +import org.comet4j.core.event.RemovedEvent; +import org.comet4j.core.event.RevivalEvent; + +/** + * 应用初始化 + * @author jinghai.xiao@gmail.com + * @date 2011-2-25 + */ + +public class AppInit implements ServletContextListener { + + // ServletContextListener + @SuppressWarnings("unchecked") + public void contextInitialized(ServletContextEvent event) { + CometContext cc = CometContext.getInstance(); + cc.registChannel(Constant.AppChannel); + cc.addListener(CometContextEvent.class, new CometContextEventListener()); + CometEngine engine = cc.getEngine(); + engine.addListener(BeforeConnectEvent.class, new BeforeConnectEventListener()); + engine.addListener(ConnectEvent.class, new ConnectEventListener()); + engine.addListener(DyingEvent.class, new DyingEventListener()); + engine.addListener(RevivalEvent.class, new RevivalEventListener()); + engine.addListener(MessageEvent.class, new MessageEventListener()); + engine.addListener(BeforeDropEvent.class, new BeforeDropEventListener()); + engine.addListener(BeforeRemoveEvent.class, new BeforeRemoveEventListener()); + engine.addListener(RemovedEvent.class, new RemovedEventListener()); + engine.addListener(DropEvent.class, new DropEventListener()); + } + + public void contextDestroyed(ServletContextEvent event) { + + } + +} diff --git a/.svn/pristine/5f/5f7ca7f7e3ed340979413039196b0cfbb8d7640a.svn-base b/.svn/pristine/5f/5f7ca7f7e3ed340979413039196b0cfbb8d7640a.svn-base new file mode 100644 index 0000000..dc36899 --- /dev/null +++ b/.svn/pristine/5f/5f7ca7f7e3ed340979413039196b0cfbb8d7640a.svn-base @@ -0,0 +1,662 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.temp; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.Proxy; +import java.net.URL; +import java.net.URLConnection; +import java.net.URLEncoder; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.StringTokenizer; +import java.util.logging.Level; + +/** + * AjaxHttpRequest ,用java 模拟 浏览器的 XMLHttpRequest 对象. 目的是 用 操作浏览器中的XHR对象的 + * 方式来处理java端的 http请求. + * @author fins 本类的实现借鉴了 cobra 组件的 org.lobobrowser.html.test.SimpleHttpRequest + * 类. 可以看作是对 SimpleHttpRequest 类的一个完善和补充. cobra 组件是一个 Java HTML Renderer + * & Parser, 官方网站 : http://lobobrowser.org/cobra.jsp + */ + +public class AjaxHttpRequest { + + // 对应 XMLHttpRequest 的5种状态. + public static final int STATE_UNINITIALIZED = 0; + public static final int STATE_LOADING = 1; + public static final int STATE_LOADED = 2; + public static final int STATE_INTERACTIVE = 3; + public static final int STATE_COMPLETE = 4; + + // 默认的 userAgent + public static final String DEFAULT_USERAGENT = "Mozilla/4.0 (compatible; MSIE 6.0;) JavaAjax/1.0"; + + // 默认的 编码 + public static final String DEFAULT_AJAX_CHARSET = "UTF-8"; + public static final String DEFAULT_HTTP_CHARSET = "ISO-8859-1"; + + // 默认的 HTTP method + public static final String DEFAULT_REQUEST_METHOD = "POST"; + + private int readyState; + private int status; + private String statusText; + private String responseHeaders; + private byte[] responseBytes; + @SuppressWarnings("rawtypes") + private Map responseHeadersMap; + @SuppressWarnings("rawtypes") + private final Map requestHeadersMap; + private ReadyStateChangeListener readyStateChangeListener; + + private boolean async; + private boolean sent; + private URLConnection connection; + private String userAgent = DEFAULT_USERAGENT; + private String postCharset = DEFAULT_AJAX_CHARSET; + private Proxy proxy; + + private URL requestURL; + protected String requestMethod; + protected String requestUserName; + protected String requestPassword; + + // /////////////////////////////// + // /////////////////////////////// + + /** + * 构造方法. 自动添加 XMLHttpRequest 的一些缺省头信息. 如果不需要这些头信息,可在创建 AjaxHttpRequest 实例后, + * 通过 setRequestHeader/removeRequestHeader/removeAllRequestHeaders 方法 + * 进行修改或移除. + */ + @SuppressWarnings("rawtypes") + public AjaxHttpRequest() { + requestHeadersMap = new LinkedHashMap(); + setRequestHeader("X-Requested-With", "XMLHttpRequest"); + setRequestHeader("Accept", "text/javascript, text/html, application/xml, application/json, text/xml, */*"); + } + + /** + * 类似 XMLHttpRequest 中的 readyState 属性. + */ + public synchronized int getReadyState() { + return this.readyState; + } + + /** + * 类似 XMLHttpRequest 中的 status 属性. + */ + public synchronized int getStatus() { + return this.status; + } + + /** + * 类似 XMLHttpRequest 中的 statusText 属性. + */ + public synchronized String getStatusText() { + return this.statusText; + } + + /** + * 类似 XMLHttpRequest 中的 setRequestHeader 方法. + */ + @SuppressWarnings("unchecked") + public void setRequestHeader(String key, String value) { + this.requestHeadersMap.put(key, value); + } + + /** + * 类似 XMLHttpRequest 中的 open 方法. + */ + public void open(String method, String url, boolean async, String userName, String password) throws IOException { + URL urlObj = createURL(null, url); + open(method, urlObj, async, userName, password); + } + + /** + * 类似 XMLHttpRequest 中的 open 方法. + */ + public void open(final String method, final URL url, boolean async, final String userName, final String password) + throws IOException { + this.abort(); + Proxy proxy = this.proxy; + URLConnection c = proxy == null || proxy == Proxy.NO_PROXY ? url.openConnection() : url.openConnection(proxy); + synchronized (this) { + this.connection = c; + this.async = async; + this.requestMethod = method; + this.requestURL = url; + this.requestUserName = userName; + this.requestPassword = password; + } + this.changeState(AjaxHttpRequest.STATE_LOADING, 0, null, null); + } + + /** + * 类似 XMLHttpRequest 中的 open 方法. 省略部分参数的形式. + */ + public void open(String url, boolean async) throws IOException { + open(DEFAULT_REQUEST_METHOD, url, async, null, null); + } + + /** + * 类似 XMLHttpRequest 中的 open 方法. 省略部分参数的形式. + */ + public void open(String method, String url, boolean async) throws IOException { + open(method, url, async, null, null); + } + + /** + * 类似 XMLHttpRequest 中的 send 方法. 支持发送 key-value 形式的数据集合(Map). 传入map参数, + * 自动转换成string形式 并调用 send(String) 方法发送. + */ + @SuppressWarnings("rawtypes") + public void send(Map parameters) throws IOException { + Iterator keyItr = parameters.keySet().iterator(); + StringBuffer strb = new StringBuffer(); + while (keyItr.hasNext()) { + Object key = keyItr.next(); + String keyStr = encode(key); + String valueStr = encode(parameters.get(key)); + strb.append(keyStr).append("=").append(valueStr); + strb.append("&"); + } + send(strb.toString()); + } + + /** + * 类似 XMLHttpRequest 中的 send 方法. + */ + public void send(final String content) throws IOException { + final URL url = this.requestURL; + if (url == null) { + throw new IOException("No URL has been provided."); + } + if (this.isAsync()) { + new Thread("AjaxHttpRequest-" + url.getHost()) { + + @Override + public void run() { + try { + sendSync(content); + } catch (Throwable thrown) { + log(Level.WARNING, "send(): Error in asynchronous request on " + url, thrown); + } + } + }.start(); + } else { + sendSync(content); + } + } + + /** + * 类似 XMLHttpRequest 中的 getResponseHeader 方法. + */ + public synchronized String getResponseHeader(String headerName) { + return this.responseHeadersMap == null ? null : (String) this.responseHeadersMap.get(headerName); + } + + /** + * 类似 XMLHttpRequest 中的 getAllResponseHeaders 方法. + */ + public synchronized String getAllResponseHeaders() { + return this.responseHeaders; + } + + /** + * 类似 XMLHttpRequest 中的 responseText 属性. + */ + public synchronized String getResponseText() { + byte[] bytes = this.responseBytes; + String encoding = getCharset(this.connection); + if (encoding == null) { + encoding = getPostCharset(); + } + if (encoding == null) { + encoding = DEFAULT_HTTP_CHARSET; + } + try { + return bytes == null ? null : new String(bytes, encoding); + } catch (UnsupportedEncodingException uee) { + log(Level.WARNING, "getResponseText(): Charset '" + encoding + "' did not work. Retrying with " + + DEFAULT_HTTP_CHARSET + ".", uee); + try { + return new String(bytes, DEFAULT_HTTP_CHARSET); + } catch (UnsupportedEncodingException uee2) { + // Ignore this time + return null; + } + } + } + + /** + * 类似 XMLHttpRequest 中的 responseXML 属性. TODO : 此方法在java中 并不常使用, + * 而且需要两个额外的包,两个包不是所有的java环境都有的. 所以我(fins)把此方法注释条了. 如果确实需要此方法 + * 请自行取消该方法的注释,并引入下面列出的类/接口. javax.xml.parsers.DocumentBuilderFactory; + * org.w3c.dom.Document; + */ + // public synchronized Document getResponseXML() { + // byte[] bytes = this.responseBytes; + // if (bytes == null) { + // return null; + // } + // InputStream in = new ByteArrayInputStream(bytes); + // try { + // return DocumentBuilderFactory.newInstance().newDocumentBuilder() + // .parse(in); + // }catch (Exception err) { + // log(Level.WARNING, "Unable to parse response as XML.", err); return null; + // } + // } + + /** + * 类似 XMLHttpRequest 中的 responseBody 属性. + * @deprecated 这个方法命名源自XMLHttpRequest中的responseBody属性. 不过这个名字并不是好名字.建议使用 + * getResponseBytes 方法代替之. + */ + @Deprecated + public synchronized byte[] getResponseBody() { + return this.getResponseBytes(); + } + + /** + * 类似 XMLHttpRequest 中的 responseBody 属性. 建议使用此方法代替 getResponseBody 方法. + */ + public synchronized byte[] getResponseBytes() { + return this.responseBytes; + } + + /** + * 与 XMLHttpRequest 中的 responseStream 属性对应的方法 暂不提供. 因为1 不常用 2 通常可用 + * getResponseBytes 方法代替 + */ + + /** + * 类似 XMLHttpRequest 中的 onreadystatechange 属性. 设置一个监听器,用来跟踪HttpRequest状态变化. + * 参数是一个 ReadyStateChangeListener 对象. ReadyStateChangeListener 是一个抽象类. 只需 实现 + * onReadyStateChange方法即可. + */ + + public void setReadyStateChangeListener(ReadyStateChangeListener listener) { + this.readyStateChangeListener = listener; + } + + /** + * 中断 Request 请求. 类似 XMLHttpRequest 中的 abort. + */ + public void abort() { + URLConnection c = null; + synchronized (this) { + c = this.getConnection(); + } + if (c instanceof HttpURLConnection) { + ((HttpURLConnection) c).disconnect(); + } else if (c != null) { + try { + c.getInputStream().close(); + } catch (IOException ioe) { + ioe.printStackTrace(); + } + } + } + + // ///////////////////////////////////////////// + // // 以上 为 模拟 XMLHttpRequest 对象 相关的方法 //// + // ///////////////////////////////////////////// + // ///////////////////////////////////////////// + + /** + * 返回 此次HttpRequest是否是"异步"的. + */ + public boolean isAsync() { + return async; + } + + /** + * 返回 此次HttpRequest是否已经发送. 已经发送 且还没有完全处理完此次发送的返回信息时,是不能再次发送的. 如果需要联系发送请求, + * 请再另行创建一个 AjaxHttpRequest对象. + */ + public boolean hasSent() { + return sent; + } + + protected void setSent(boolean sent) { + this.sent = sent; + } + + /** + * 设置/取得 伪造的 userAgent 信息.通常不用理会. 很少有http服务会对此做严格的判断. + */ + public void setUserAgent(String userAgent) { + this.userAgent = userAgent; + } + + public String getUserAgent() { + return this.userAgent; + } + + /** + * 取得/设置 默认的 AJAX编码.AJAX请求都是UTF-8编码 此属性通常无需改变. + */ + public String getPostCharset() { + return this.postCharset; + } + + public void setPostCharset(String postCharset) { + this.postCharset = postCharset; + } + + /** + * 实现发送数据功能的方法,是整个类的核心. 我(fins)借鉴了 cobra 组件的 + * org.lobobrowser.html.test.SimpleHttpRequest 类中的同名方法. 略作改动. + */ + protected void sendSync(String content) throws IOException { + if (hasSent()) { + log(Level.WARNING, "This AjaxHttpRequest Object has sent", null); + return; + } + try { + URLConnection c; + synchronized (this) { + c = this.connection; + } + if (c == null) { + log(Level.WARNING, "Please open AjaxHttpRequest first.", null); + return; + } + setSent(true); + initConnectionRequestHeader(c); + int istatus; + String istatusText; + InputStream err; + if (c instanceof HttpURLConnection) { + HttpURLConnection hc = (HttpURLConnection) c; + String method = this.requestMethod == null ? DEFAULT_REQUEST_METHOD : this.requestMethod; + + method = method.toUpperCase(); + hc.setRequestMethod(method); + if ("POST".equals(method) && content != null) { + hc.setDoOutput(true); + byte[] contentBytes = content.getBytes(this.getPostCharset()); + hc.setFixedLengthStreamingMode(contentBytes.length); + OutputStream out = hc.getOutputStream(); + try { + out.write(contentBytes); + } finally { + out.flush(); + } + } + istatus = hc.getResponseCode(); + istatusText = hc.getResponseMessage(); + err = hc.getErrorStream(); + } else { + istatus = 0; + istatusText = ""; + err = null; + } + synchronized (this) { + this.responseHeaders = getConnectionResponseHeaders(c); + this.responseHeadersMap = c.getHeaderFields(); + } + this.changeState(AjaxHttpRequest.STATE_LOADED, istatus, istatusText, null); + InputStream in = err == null ? c.getInputStream() : err; + int contentLength = c.getContentLength(); + + this.changeState(AjaxHttpRequest.STATE_INTERACTIVE, istatus, istatusText, null); + byte[] bytes = loadStream(in, contentLength == -1 ? 4096 : contentLength); + this.changeState(AjaxHttpRequest.STATE_COMPLETE, istatus, istatusText, bytes); + } finally { + synchronized (this) { + this.connection = null; + setSent(false); + } + } + } + + /** + * 当状态变化时 重新设置各种状态值,并触发状态变化监听器. + */ + protected void changeState(int readyState, int status, String statusMessage, byte[] bytes) { + synchronized (this) { + this.readyState = readyState; + this.status = status; + this.statusText = statusMessage; + this.responseBytes = bytes; + } + if (this.readyStateChangeListener != null) { + this.readyStateChangeListener.onReadyStateChange(); + } + } + + /** + * 对字符串进行 URLEncoder 编码. + */ + protected String encode(Object str) { + try { + return URLEncoder.encode(String.valueOf(str), getPostCharset()); + } catch (UnsupportedEncodingException e) { + return String.valueOf(str); + } + } + + /** + * 将设置的 RequestHeader 真正的设置到链接请求中. + */ + @SuppressWarnings("rawtypes") + protected void initConnectionRequestHeader(URLConnection c) { + c.setRequestProperty("User-Agent", this.getUserAgent()); + Iterator keyItor = this.requestHeadersMap.keySet().iterator(); + while (keyItor.hasNext()) { + String key = (String) keyItor.next(); + String value = (String) this.requestHeadersMap.get(key); + c.setRequestProperty(key, value); + } + } + + /** + * 以下 4个 方法 负责处理 requestHeader信息. + */ + public String getRequestHeader(String key) { + return (String) this.requestHeadersMap.get(key); + } + + public String removeRequestHeader(String key) { + return (String) this.requestHeadersMap.remove(key); + } + + public void removeAllRequestHeaders() { + this.requestHeadersMap.clear(); + } + + @SuppressWarnings("rawtypes") + public Map getAllRequestHeaders() { + return this.requestHeadersMap; + } + + public URLConnection getConnection() { + return connection; + } + + public void setConnection(URLConnection connection) { + this.connection = connection; + } + + public Proxy getProxy() { + return proxy; + } + + public void setProxy(Proxy proxy) { + this.proxy = proxy; + } + + // /////////////////////////////////////////////////////////////////// + // 以下是 Static Method ////////////////////////////////////////////// + // 这些静态方法其实可以(应该)单独提取出去的, /////////////////////////////// + // 不过为了让这个程序结构简单些 , 我(fins)就全部 all in one 了./////////////////// + // 这些方法也不都是我(fins)自己写的 很多是copy 借鉴来的 功能都挺简单的 就不详细说明了 // + // /////////////////////////////////////////////////////////////////// + + public static void log(Level level, String msg, Throwable thrown) { + System.out.println(level.getName() + " : " + thrown.getMessage() + " ----- " + msg); + } + + public static String getConnectionResponseHeaders(URLConnection c) { + int idx = 0; + String value; + StringBuffer buf = new StringBuffer(); + while ((value = c.getHeaderField(idx)) != null) { + String key = c.getHeaderFieldKey(idx); + buf.append(key); + buf.append(": "); + buf.append(value); + idx++; + } + return buf.toString(); + } + + public static String getCharset(URLConnection connection) { + String contentType = connection == null ? null : connection.getContentType(); + if (contentType != null) { + StringTokenizer tok = new StringTokenizer(contentType, ";"); + if (tok.hasMoreTokens()) { + tok.nextToken(); + while (tok.hasMoreTokens()) { + String assignment = tok.nextToken().trim(); + int eqIdx = assignment.indexOf('='); + if (eqIdx != -1) { + String varName = assignment.substring(0, eqIdx).trim(); + if ("charset".equalsIgnoreCase(varName)) { + String varValue = assignment.substring(eqIdx + 1); + return unquote(varValue.trim()); + } + } + } + } + } + return null; + } + + public static String unquote(String text) { + if (text.startsWith("\"") && text.endsWith("\"")) { + return text.substring(1, text.length() - 2); + } + return text; + } + + protected static URL createURL(URL baseUrl, String relativeUrl) throws MalformedURLException { + return new URL(baseUrl, relativeUrl); + } + + protected static byte[] loadStream(InputStream in, int initialBufferSize) throws IOException { + if (initialBufferSize == 0) { + initialBufferSize = 1; + } + byte[] buffer = new byte[initialBufferSize]; + int offset = 0; + for (;;) { + int remain = buffer.length - offset; + if (remain <= 0) { + int newSize = buffer.length * 2; + byte[] newBuffer = new byte[newSize]; + System.arraycopy(buffer, 0, newBuffer, 0, offset); + buffer = newBuffer; + remain = buffer.length - offset; + } + int numRead = in.read(buffer, offset, remain); + if (numRead == -1) { + break; + } + offset += numRead; + } + if (offset < buffer.length) { + byte[] newBuffer = new byte[offset]; + System.arraycopy(buffer, 0, newBuffer, 0, offset); + buffer = newBuffer; + } + return buffer; + } + + // ///////////////////////////////////////////////////////// + // Listener Class ///////////////////////////////////////// + // ///////////////////////////////////////////////////////// + + /** + * 一个用来监听 HttpRequest状态 的监听器. 是一个内部静态抽象类. 可以根据实际情况来自行重构(如 增加方法、变为独立的外部类等). + */ + public static abstract class ReadyStateChangeListener { + + public abstract void onReadyStateChange(); + } + + // ///////////////////////////////////////////////////////// + // Test Method //////////////////////////////////////////// + // ///////////////////////////////////////////////////////// + + /** + * 利用这个AjaxHttpReuqest类来实现 对google translate服务的访问 . 只演示了 "英-->汉"的翻译. + * 返回的是JSON字符串,需要使用Json工具类进行转换,这个不难 就不详细举例了. + */ + @SuppressWarnings("rawtypes") + public static void testGoogleTranslate(String words, boolean async) throws IOException { + Map params = new HashMap(); + /* + * params.put("q",words); params.put("v","1.0"); + * params.put("langpair","en|zh-CN"); String + * url="http://ajax.googleapis.com/ajax/services/language/translate"; + */ + String url = "http://localhost:8080/long"; + + // 以上为 调用google翻译服务所需要的参数. + // 下面 是用java 来调用这个 翻译服务. + // 在 AjaxHttpRequest 类的 帮助下 我们可以使用 类似操作浏览器XHR对象的方式来 实现该功能. + + // 创建 AjaxHttpRequest对象 相当于 创建 XHR对象. + // 这里的final 主要是为了"使监听器内部能够调用ajax对象"而加的. + final AjaxHttpRequest ajax = new AjaxHttpRequest(); + + // 设置状态监听器,类似 XHR对象的 onreadystatechange 属性. + // 由于js 和java的本质区别 导致这里可能和 xhr有点不一样,但是应该不难理解. + ajax.setReadyStateChangeListener( + // 监听器, 根据需求 实现onReadyStateChange方法即可. + new AjaxHttpRequest.ReadyStateChangeListener() { + + @Override + public void onReadyStateChange() { + int readyState = ajax.getReadyState(); + System.out.println(ajax.getStatus()); + System.out.println(ajax.getReadyState()); + // System.out.println( ajax.getResponseText() ); + // 判断状态 然后做出相应处理. + if (// readyState==AjaxHttpRequest.STATE_INTERACTIVE || + readyState == AjaxHttpRequest.STATE_COMPLETE) { + System.out.println(ajax.getResponseText()); + } + } + }); + + // 这里就和 xhr 几乎完全一样了 + ajax.open("POST", url, true); + + // 这里这个send方法接受的参数是一个map ,当然AjaxHttpRequest类也提供了string的方法 + ajax.send(params); + + } + + public static void main(String[] args) throws IOException { + + testGoogleTranslate("Hello world!", false); + + } + +} diff --git a/.svn/pristine/60/60967f21e729ee73720ad77a67d765160062b376.svn-base b/.svn/pristine/60/60967f21e729ee73720ad77a67d765160062b376.svn-base new file mode 100644 index 0000000..ac07eab --- /dev/null +++ b/.svn/pristine/60/60967f21e729ee73720ad77a67d765160062b376.svn-base @@ -0,0 +1,45 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.temp; + +import java.lang.management.ManagementFactory; +import java.lang.management.MemoryMXBean; +import java.lang.management.MemoryUsage; + +/** + * @author jinghai.xiao@gmail.com + * @date 2011-3-24 + */ + +public class ShowMemory { + + static String x; + + public static void main(String[] args) { + ShowMemory sm = new ShowMemory(); + sm.show(); + x = ""; + for (int i = 0; i < 1000; i++) + x += " string number " + i; + sm.show(); + x = null; + sm.show(); + MemoryMXBean mem = ManagementFactory.getMemoryMXBean(); + mem.gc(); + sm.show(); + } + + void show() { + MemoryMXBean mem = ManagementFactory.getMemoryMXBean(); + MemoryUsage heap = mem.getHeapMemoryUsage(); + System.out.print("Heap committed=" + heap.getCommitted() + " init=" + heap.getInit() + " max=" + heap.getMax() + + " used=" + heap.getUsed()); + System.out.print(",total:" + Runtime.getRuntime().totalMemory()); + System.out.print(",free" + Runtime.getRuntime().freeMemory()); + System.out.println(",max" + Runtime.getRuntime().maxMemory() / 1024); + } + +} diff --git a/.svn/pristine/60/6097aab4f63090847a821caae7d30ab5a614ef14.svn-base b/.svn/pristine/60/6097aab4f63090847a821caae7d30ab5a614ef14.svn-base new file mode 100644 index 0000000..8c74dbc Binary files /dev/null and b/.svn/pristine/60/6097aab4f63090847a821caae7d30ab5a614ef14.svn-base differ diff --git a/.svn/pristine/60/60deb1f7ca78aadcb8ed2a825e6b6ba07684a33d.svn-base b/.svn/pristine/60/60deb1f7ca78aadcb8ed2a825e6b6ba07684a33d.svn-base new file mode 100644 index 0000000..58ff32c Binary files /dev/null and b/.svn/pristine/60/60deb1f7ca78aadcb8ed2a825e6b6ba07684a33d.svn-base differ diff --git a/.svn/pristine/60/60f1a73ba9d952f5c4823e3206792b14c380b00d.svn-base b/.svn/pristine/60/60f1a73ba9d952f5c4823e3206792b14c380b00d.svn-base new file mode 100644 index 0000000..5943a01 Binary files /dev/null and b/.svn/pristine/60/60f1a73ba9d952f5c4823e3206792b14c380b00d.svn-base differ diff --git a/.svn/pristine/61/61eb6f198c0a0960bc8a871d31efe2c6e7f4fca4.svn-base b/.svn/pristine/61/61eb6f198c0a0960bc8a871d31efe2c6e7f4fca4.svn-base new file mode 100644 index 0000000..0b4d6ca Binary files /dev/null and b/.svn/pristine/61/61eb6f198c0a0960bc8a871d31efe2c6e7f4fca4.svn-base differ diff --git a/.svn/pristine/64/644b2c320cb27b9a48f9b248a244f4d0379bfe38.svn-base b/.svn/pristine/64/644b2c320cb27b9a48f9b248a244f4d0379bfe38.svn-base new file mode 100644 index 0000000..e228aa5 --- /dev/null +++ b/.svn/pristine/64/644b2c320cb27b9a48f9b248a244f4d0379bfe38.svn-base @@ -0,0 +1,52 @@ +div{ +scrollbar-3dlight-color:aqua; +scrollbar-highlight-color:aqua; +scrollbar-face-color:black; +scrollbar-arrow-color:aqua; +scrollbar-shadow-color:aqua; +scrollbar-darkshadow-color:black; +scrollbar-base-color:black; +scrollbar-track-color:black; +} +body{ +color: aqua; background-color: #000000;margin:0px;padding:0px;overflow:hidden;height:100%;overflow-x:hidden; overflow-y:hidden; +} +a { +color:orange; +} +blockquote{ +line-height:20px; +} +#logbox{ +width:100%;overflow:auto;overflow-x: hidden; overflow-y: auto;word-break: break-all; +} +#statebar{ +border-bottom:1px aqua solid;vertical-align:middle;line-height:30px;color:aqua;text-align:center; +} +#toolbar{ +position:absolute;z-index:2;width:100%;padding-top:4px;padding-bottom:4px;bottom:0px; border-top:1px aqua solid;background:black;color:#00FFFF; +} +#login{ +display:none;position:absolute;left:0px;top:0px;width:100%;z-index:100;background:black; +} +.user{ +color:aqua; +} +.sysmessage{ +color: #666666; +} +.usermessage{ +color:silver; +} +.usermessage blockquote{ +margin:0px;margin-left:50px;padding:0px; +} +.inputbox{ +margin-bottom:4px;color:white;background:transparent;font-size:25px;vertical-align:middle;line-height:25px;height:30px;width:80%;left:1px;right:50px;top:0px;border:0px;border-bottom:1px aqua solid; +} +.button{ +margin-top:20px;border:1px aqua solid;color:white;background:transparent;vertical-align:middle;line-height:25px;height:30px; +} +.warning { +color:red; +} \ No newline at end of file diff --git a/.svn/pristine/64/6481371769cf6291b4e78e49b16603e3105c93c4.svn-base b/.svn/pristine/64/6481371769cf6291b4e78e49b16603e3105c93c4.svn-base new file mode 100644 index 0000000..133cf23 Binary files /dev/null and b/.svn/pristine/64/6481371769cf6291b4e78e49b16603e3105c93c4.svn-base differ diff --git a/.svn/pristine/65/65ade49bf6f042134eb245d19c26d1471d2d279f.svn-base b/.svn/pristine/65/65ade49bf6f042134eb245d19c26d1471d2d279f.svn-base new file mode 100644 index 0000000..b11f273 Binary files /dev/null and b/.svn/pristine/65/65ade49bf6f042134eb245d19c26d1471d2d279f.svn-base differ diff --git a/.svn/pristine/65/65b77a90ecdf2e922d02a34e9796da07daae6648.svn-base b/.svn/pristine/65/65b77a90ecdf2e922d02a34e9796da07daae6648.svn-base new file mode 100644 index 0000000..9601635 Binary files /dev/null and b/.svn/pristine/65/65b77a90ecdf2e922d02a34e9796da07daae6648.svn-base differ diff --git a/.svn/pristine/65/65dc5935da801fd23fe637cfb26cdd3450746bcb.svn-base b/.svn/pristine/65/65dc5935da801fd23fe637cfb26cdd3450746bcb.svn-base new file mode 100644 index 0000000..d3d3448 Binary files /dev/null and b/.svn/pristine/65/65dc5935da801fd23fe637cfb26cdd3450746bcb.svn-base differ diff --git a/.svn/pristine/66/6605bf7e1f1e976fb42ba228d8ac949c7c8eb6b5.svn-base b/.svn/pristine/66/6605bf7e1f1e976fb42ba228d8ac949c7c8eb6b5.svn-base new file mode 100644 index 0000000..21d7268 Binary files /dev/null and b/.svn/pristine/66/6605bf7e1f1e976fb42ba228d8ac949c7c8eb6b5.svn-base differ diff --git a/.svn/pristine/66/665ce85cedd46fe2ef16d4c9354b3787fdafb806.svn-base b/.svn/pristine/66/665ce85cedd46fe2ef16d4c9354b3787fdafb806.svn-base new file mode 100644 index 0000000..16180f7 --- /dev/null +++ b/.svn/pristine/66/665ce85cedd46fe2ef16d4c9354b3787fdafb806.svn-base @@ -0,0 +1,7 @@ +/* +Copyright (c) 2006, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 0.11.0 +*/ +body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquote,th,td{margin:0;padding:0;}fieldset,img{border:0;}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;}ol,ul {list-style:none;}caption,th {text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;}q:before,q:after{content:'';} \ No newline at end of file diff --git a/.svn/pristine/66/66e26de4d0e951479d0d6e912d75d17b1b62f1e3.svn-base b/.svn/pristine/66/66e26de4d0e951479d0d6e912d75d17b1b62f1e3.svn-base new file mode 100644 index 0000000..76ea611 --- /dev/null +++ b/.svn/pristine/66/66e26de4d0e951479d0d6e912d75d17b1b62f1e3.svn-base @@ -0,0 +1,72 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.demo.talker.dto; + +import java.text.SimpleDateFormat; +import java.util.Date; + +import org.comet4j.demo.talker.Constant; + +/** + * 聊天信息传输对象 + * @author jinghai.xiao@gmail.com + * @date 2011-4-7 + */ + +public class TalkDTO { + + private final String transtime; + private String type; + private String id; + private String name; + private String text; + + public TalkDTO(String id, String name, String text) { + this.type = Constant.TALK; + this.id = id; + this.name = name; + this.text = text; + Date d = new Date(System.currentTimeMillis()); + SimpleDateFormat f = new SimpleDateFormat("HH:mm"); + transtime = f.format(d); + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getTranstime() { + return transtime; + } +} diff --git a/.svn/pristine/66/66e5bedc3a53a866809f02cb2a8ae9a45048b9c4.svn-base b/.svn/pristine/66/66e5bedc3a53a866809f02cb2a8ae9a45048b9c4.svn-base new file mode 100644 index 0000000..135aa89 Binary files /dev/null and b/.svn/pristine/66/66e5bedc3a53a866809f02cb2a8ae9a45048b9c4.svn-base differ diff --git a/.svn/pristine/67/673ffac1a25a19b05c37ce4776e38ed03ee9a97e.svn-base b/.svn/pristine/67/673ffac1a25a19b05c37ce4776e38ed03ee9a97e.svn-base new file mode 100644 index 0000000..eacea39 Binary files /dev/null and b/.svn/pristine/67/673ffac1a25a19b05c37ce4776e38ed03ee9a97e.svn-base differ diff --git a/.svn/pristine/67/677cfdf1a7a3777652bfa9e90fbe8607b1b558bd.svn-base b/.svn/pristine/67/677cfdf1a7a3777652bfa9e90fbe8607b1b558bd.svn-base new file mode 100644 index 0000000..9fae2d5 Binary files /dev/null and b/.svn/pristine/67/677cfdf1a7a3777652bfa9e90fbe8607b1b558bd.svn-base differ diff --git a/.svn/pristine/67/678e329a946d217e31289b73d4ea94779801042f.svn-base b/.svn/pristine/67/678e329a946d217e31289b73d4ea94779801042f.svn-base new file mode 100644 index 0000000..86fe20b --- /dev/null +++ b/.svn/pristine/67/678e329a946d217e31289b73d4ea94779801042f.svn-base @@ -0,0 +1,29 @@ +/** + * @(#)RemovedEventListener.java 2011-3-9 Copyright 2011 it.kedacom.com, Inc. + * All rights reserved. + */ + +package org.comet4j.demo.eventmonitor; + +import org.comet4j.core.event.RemovedEvent; +import org.comet4j.core.listener.RemovedListener; + +/** + * (用一句话描述类的主要功能) + * @author xiaojinghai + * @date 2011-3-9 + */ + +public class RemovedEventListener extends RemovedListener { + + /* + * (non-Jsdoc) + * @see org.comet4j.event.Listener#handleEvent(org.comet4j.event.Event) + */ + @Override + public boolean handleEvent(RemovedEvent anEvent) { + System.out.println("[RemovedEvent]:cId=" + anEvent.getConn().getId()); + return false; + } + +} diff --git a/.svn/pristine/69/691c4b891370706632e8e72dbe8566d6556f31a6.svn-base b/.svn/pristine/69/691c4b891370706632e8e72dbe8566d6556f31a6.svn-base new file mode 100644 index 0000000..2bdd623 Binary files /dev/null and b/.svn/pristine/69/691c4b891370706632e8e72dbe8566d6556f31a6.svn-base differ diff --git a/.svn/pristine/69/69c56c200055ac78a5fa2e906178b1f5b6b47d99.svn-base b/.svn/pristine/69/69c56c200055ac78a5fa2e906178b1f5b6b47d99.svn-base new file mode 100644 index 0000000..e699878 Binary files /dev/null and b/.svn/pristine/69/69c56c200055ac78a5fa2e906178b1f5b6b47d99.svn-base differ diff --git a/.svn/pristine/6a/6a026a1b1457081f5958c9b2c237a6b0638a93f6.svn-base b/.svn/pristine/6a/6a026a1b1457081f5958c9b2c237a6b0638a93f6.svn-base new file mode 100644 index 0000000..9a8d727 Binary files /dev/null and b/.svn/pristine/6a/6a026a1b1457081f5958c9b2c237a6b0638a93f6.svn-base differ diff --git a/.svn/pristine/6a/6a629898a4a47d61baec1d67ac335ba706fb40e8.svn-base b/.svn/pristine/6a/6a629898a4a47d61baec1d67ac335ba706fb40e8.svn-base new file mode 100644 index 0000000..0a8de4d Binary files /dev/null and b/.svn/pristine/6a/6a629898a4a47d61baec1d67ac335ba706fb40e8.svn-base differ diff --git a/.svn/pristine/6b/6bb19dee3e503856d537c750c76db8fc874fe142.svn-base b/.svn/pristine/6b/6bb19dee3e503856d537c750c76db8fc874fe142.svn-base new file mode 100644 index 0000000..42da1ea Binary files /dev/null and b/.svn/pristine/6b/6bb19dee3e503856d537c750c76db8fc874fe142.svn-base differ diff --git a/.svn/pristine/6c/6c6483256a045d39c5fbdbbf04c13f987e55c8bb.svn-base b/.svn/pristine/6c/6c6483256a045d39c5fbdbbf04c13f987e55c8bb.svn-base new file mode 100644 index 0000000..58d6747 Binary files /dev/null and b/.svn/pristine/6c/6c6483256a045d39c5fbdbbf04c13f987e55c8bb.svn-base differ diff --git a/.svn/pristine/6c/6ccb37f6b4b157720cbfcdc3d998eed8035aecfe.svn-base b/.svn/pristine/6c/6ccb37f6b4b157720cbfcdc3d998eed8035aecfe.svn-base new file mode 100644 index 0000000..c0570c5 Binary files /dev/null and b/.svn/pristine/6c/6ccb37f6b4b157720cbfcdc3d998eed8035aecfe.svn-base differ diff --git a/.svn/pristine/6d/6d20137a80a8e1f9d7fe6d5c41fbc06ac98cc914.svn-base b/.svn/pristine/6d/6d20137a80a8e1f9d7fe6d5c41fbc06ac98cc914.svn-base new file mode 100644 index 0000000..471c1a4 Binary files /dev/null and b/.svn/pristine/6d/6d20137a80a8e1f9d7fe6d5c41fbc06ac98cc914.svn-base differ diff --git a/.svn/pristine/6d/6d2ec8a24c1d559eb27c30e8914b7970344a8c34.svn-base b/.svn/pristine/6d/6d2ec8a24c1d559eb27c30e8914b7970344a8c34.svn-base new file mode 100644 index 0000000..df2a77e Binary files /dev/null and b/.svn/pristine/6d/6d2ec8a24c1d559eb27c30e8914b7970344a8c34.svn-base differ diff --git a/.svn/pristine/6e/6e4344c977fe71819c7b642ec22d6dac6f4e8f46.svn-base b/.svn/pristine/6e/6e4344c977fe71819c7b642ec22d6dac6f4e8f46.svn-base new file mode 100644 index 0000000..ec2fb5e --- /dev/null +++ b/.svn/pristine/6e/6e4344c977fe71819c7b642ec22d6dac6f4e8f46.svn-base @@ -0,0 +1,38 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.event; + +import org.comet4j.core.CometConnection; +import org.comet4j.core.CometEngine; +import org.comet4j.event.Event; + +/** + * 连接断开事件对象 + */ + +public class DropEvent extends Event { + + private CometConnection conn; + + public DropEvent(CometEngine target, CometConnection aConn) { + super(target); + conn = aConn; + } + + public CometConnection getConn() { + return conn; + } + + public void setConn(CometConnection conn) { + this.conn = conn; + } + + @Override + public void destroy() { + super.destroy(); + conn = null; + } +} diff --git a/.svn/pristine/6e/6e9f5ab590c45d9213ea73864d0aa4a44377f1e7.svn-base b/.svn/pristine/6e/6e9f5ab590c45d9213ea73864d0aa4a44377f1e7.svn-base new file mode 100644 index 0000000..e58bf20 Binary files /dev/null and b/.svn/pristine/6e/6e9f5ab590c45d9213ea73864d0aa4a44377f1e7.svn-base differ diff --git a/.svn/pristine/6f/6f1398d975c7328f578e6945b787165b9b4d37ea.svn-base b/.svn/pristine/6f/6f1398d975c7328f578e6945b787165b9b4d37ea.svn-base new file mode 100644 index 0000000..3cdf754 --- /dev/null +++ b/.svn/pristine/6f/6f1398d975c7328f578e6945b787165b9b4d37ea.svn-base @@ -0,0 +1,61 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.demo.talker.dto; + +import java.text.SimpleDateFormat; +import java.util.Date; + +import org.comet4j.demo.talker.Constant; + +/** + * 上线通知传输对象 + * @author jinghai.xiao@gmail.com + * @date 2011-4-7 + */ +public class JoinDTO { + + private final String transtime; + private String type; + private String id; + private String name; + + public JoinDTO(String id, String name) { + this.type = Constant.UP; + this.id = id; + this.name = name; + Date d = new Date(System.currentTimeMillis()); + SimpleDateFormat f = new SimpleDateFormat("HH:mm"); + transtime = f.format(d); + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getTranstime() { + return transtime; + } +} diff --git a/.svn/pristine/6f/6f3172242ebd53cb8e0ad2e7a42fbae8f063e27a.svn-base b/.svn/pristine/6f/6f3172242ebd53cb8e0ad2e7a42fbae8f063e27a.svn-base new file mode 100644 index 0000000..126120f Binary files /dev/null and b/.svn/pristine/6f/6f3172242ebd53cb8e0ad2e7a42fbae8f063e27a.svn-base differ diff --git a/.svn/pristine/70/7000ab6a88f6bb5c2374d81b98f232c02686973d.svn-base b/.svn/pristine/70/7000ab6a88f6bb5c2374d81b98f232c02686973d.svn-base new file mode 100644 index 0000000..b38282f --- /dev/null +++ b/.svn/pristine/70/7000ab6a88f6bb5c2374d81b98f232c02686973d.svn-base @@ -0,0 +1,29 @@ +/** + * @(#)ConnectEventListener.java 2011-3-9 Copyright 2011 it.kedacom.com, Inc. + * All rights reserved. + */ + +package org.comet4j.demo.eventmonitor; + +import org.comet4j.core.event.ConnectEvent; +import org.comet4j.core.listener.ConnectListener; + +/** + * (用一句话描述类的主要功能) + * @author xiaojinghai + * @date 2011-3-9 + */ + +public class ConnectEventListener extends ConnectListener { + + /* + * (non-Jsdoc) + * @see org.comet4j.event.Listener#handleEvent(org.comet4j.event.Event) + */ + @Override + public boolean handleEvent(ConnectEvent anEvent) { + System.out.println("[ConnectEvent]:cId=" + anEvent.getConn().getId()); + return false; + } + +} diff --git a/.svn/pristine/71/710295e3b83a9c28ce754a17242e89f4ebaaa0fd.svn-base b/.svn/pristine/71/710295e3b83a9c28ce754a17242e89f4ebaaa0fd.svn-base new file mode 100644 index 0000000..66b74a2 --- /dev/null +++ b/.svn/pristine/71/710295e3b83a9c28ce754a17242e89f4ebaaa0fd.svn-base @@ -0,0 +1,29 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.temp; + +/** + * 模拟发送信息的测试类 + * @author xiaojinghai + * @date 2011-2-24 + */ + +public class SendMessageTest implements Runnable { + + public void run() { + while (true) { + try { + Thread.sleep(5000); + } catch (Exception ex) { + ex.printStackTrace(); + } + /* + * CometContext.getInstance().getEngine().sendTo(CometContext. + * getInstance ().getEngine().getConnections(), "Test Data"); + */ + } + } +} diff --git a/.svn/pristine/71/710d75c3f4774c85e1814a74ca75ede675350440.svn-base b/.svn/pristine/71/710d75c3f4774c85e1814a74ca75ede675350440.svn-base new file mode 100644 index 0000000..aa7a1dd --- /dev/null +++ b/.svn/pristine/71/710d75c3f4774c85e1814a74ca75ede675350440.svn-base @@ -0,0 +1,29 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.temp; + +import java.lang.management.ManagementFactory; +import java.lang.management.OperatingSystemMXBean; + +/** + * @author jinghai.xiao@gmail.com + * @date 2011-3-24 + */ + +public class ShowSystem { + + static String x; + + public static void main(String[] args) { + OperatingSystemMXBean op = ManagementFactory.getOperatingSystemMXBean(); + System.out.println("Architecture: " + op.getArch()); + System.out.println("Processors: " + op.getAvailableProcessors()); + System.out.println("System name: " + op.getName()); + System.out.println("System version: " + op.getVersion()); + System.out.println("Last minute load: " + op.getSystemLoadAverage()); + } + +} diff --git a/.svn/pristine/72/7202cf00a47a812cc139dcd9d119e00227a9242b.svn-base b/.svn/pristine/72/7202cf00a47a812cc139dcd9d119e00227a9242b.svn-base new file mode 100644 index 0000000..08d0833 Binary files /dev/null and b/.svn/pristine/72/7202cf00a47a812cc139dcd9d119e00227a9242b.svn-base differ diff --git a/.svn/pristine/72/72291cbbfe29a2472d95fe1d36f63a01867d1453.svn-base b/.svn/pristine/72/72291cbbfe29a2472d95fe1d36f63a01867d1453.svn-base new file mode 100644 index 0000000..1ee8ea1 --- /dev/null +++ b/.svn/pristine/72/72291cbbfe29a2472d95fe1d36f63a01867d1453.svn-base @@ -0,0 +1,27 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.event; + +/** + * + */ + +/** + * 侦听抽象类 职责:规范事件侦听的执行方法 + * @author xiaojinghai@kedacom.com + */ + +@SuppressWarnings("rawtypes") +public abstract class Listener implements ListenerInterface { + + /** + * 事件处理 + * @param anEvent + * @return 对于可终止的事件(一般事件名称以before开头)返回false则终被终止被终止执行此动作,避免动作的发生(如before类事件, + * 一般为动作发生之前的事件才可以被终止执行,避免动作的发生),对于非可终止事件请设置为true + */ + public abstract boolean handleEvent(E anEvent); +} diff --git a/.svn/pristine/72/729e06bdd1bfcc59006ef719ac5be48dcf9112fd.svn-base b/.svn/pristine/72/729e06bdd1bfcc59006ef719ac5be48dcf9112fd.svn-base new file mode 100644 index 0000000..fedb877 --- /dev/null +++ b/.svn/pristine/72/729e06bdd1bfcc59006ef719ac5be48dcf9112fd.svn-base @@ -0,0 +1,10 @@ +/* + * Ext JS Library 2.2 + * Copyright(c) 2006-2008, Ext JS, LLC. + * licensing@extjs.com + * + * http://extjs.com/license + */ + +Ext={version:"2.2"};window["undefined"]=window["undefined"];Ext.apply=function(C,D,B){if(B){Ext.apply(C,B)}if(C&&D&&typeof D=="object"){for(var A in D){C[A]=D[A]}}return C};(function(){var idSeed=0;var ua=navigator.userAgent.toLowerCase();var isStrict=document.compatMode=="CSS1Compat",isOpera=ua.indexOf("opera")>-1,isSafari=(/webkit|khtml/).test(ua),isSafari3=isSafari&&ua.indexOf("webkit/5")!=-1,isIE=!isOpera&&ua.indexOf("msie")>-1,isIE7=!isOpera&&ua.indexOf("msie 7")>-1,isGecko=!isSafari&&ua.indexOf("gecko")>-1,isGecko3=!isSafari&&ua.indexOf("rv:1.9")>-1,isBorderBox=isIE&&!isStrict,isWindows=(ua.indexOf("windows")!=-1||ua.indexOf("win32")!=-1),isMac=(ua.indexOf("macintosh")!=-1||ua.indexOf("mac os x")!=-1),isAir=(ua.indexOf("adobeair")!=-1),isLinux=(ua.indexOf("linux")!=-1),isSecure=window.location.href.toLowerCase().indexOf("https")===0;if(isIE&&!isIE7){try{document.execCommand("BackgroundImageCache",false,true)}catch(e){}}Ext.apply(Ext,{isStrict:isStrict,isSecure:isSecure,isReady:false,enableGarbageCollector:true,enableListenerCollection:false,SSL_SECURE_URL:"javascript:false",BLANK_IMAGE_URL:"http:/"+"/extjs.com/s.gif",emptyFn:function(){},applyIf:function(o,c){if(o&&c){for(var p in c){if(typeof o[p]=="undefined"){o[p]=c[p]}}}return o},addBehaviors:function(o){if(!Ext.isReady){Ext.onReady(function(){Ext.addBehaviors(o)});return }var cache={};for(var b in o){var parts=b.split("@");if(parts[1]){var s=parts[0];if(!cache[s]){cache[s]=Ext.select(s)}cache[s].on(parts[1],o[b])}}cache=null},id:function(el,prefix){prefix=prefix||"ext-gen";el=Ext.getDom(el);var id=prefix+(++idSeed);return el?(el.id?el.id:(el.id=id)):id},extend:function(){var io=function(o){for(var m in o){this[m]=o[m]}};var oc=Object.prototype.constructor;return function(sb,sp,overrides){if(typeof sp=="object"){overrides=sp;sp=sb;sb=overrides.constructor!=oc?overrides.constructor:function(){sp.apply(this,arguments)}}var F=function(){},sbp,spp=sp.prototype;F.prototype=spp;sbp=sb.prototype=new F();sbp.constructor=sb;sb.superclass=spp;if(spp.constructor==oc){spp.constructor=sp}sb.override=function(o){Ext.override(sb,o)};sbp.override=io;Ext.override(sb,overrides);sb.extend=function(o){Ext.extend(sb,o)};return sb}}(),override:function(origclass,overrides){if(overrides){var p=origclass.prototype;for(var method in overrides){p[method]=overrides[method]}}},namespace:function(){var a=arguments,o=null,i,j,d,rt;for(i=0;i=0){L=G[P]}if(!S||!L){return false}this.doRemove(S,O,L[this.WFN],false);delete G[P][this.WFN];delete G[P][this.FN];G.splice(P,1);return true},getTarget:function(N,M){N=N.browserEvent||N;var L=N.target||N.srcElement;return this.resolveTextNode(L)},resolveTextNode:function(L){if(Ext.isSafari&&L&&3==L.nodeType){return L.parentNode}else{return L}},getPageX:function(M){M=M.browserEvent||M;var L=M.pageX;if(!L&&0!==L){L=M.clientX||0;if(Ext.isIE){L+=this.getScroll()[1]}}return L},getPageY:function(L){L=L.browserEvent||L;var M=L.pageY;if(!M&&0!==M){M=L.clientY||0;if(Ext.isIE){M+=this.getScroll()[0]}}return M},getXY:function(L){L=L.browserEvent||L;return[this.getPageX(L),this.getPageY(L)]},getRelatedTarget:function(M){M=M.browserEvent||M;var L=M.relatedTarget;if(!L){if(M.type=="mouseout"){L=M.toElement}else{if(M.type=="mouseover"){L=M.fromElement}}}return this.resolveTextNode(L)},getTime:function(N){N=N.browserEvent||N;if(!N.time){var M=new Date().getTime();try{N.time=M}catch(L){this.lastError=L;return M}}return N.time},stopEvent:function(L){this.stopPropagation(L);this.preventDefault(L)},stopPropagation:function(L){L=L.browserEvent||L;if(L.stopPropagation){L.stopPropagation()}else{L.cancelBubble=true}},preventDefault:function(L){L=L.browserEvent||L;if(L.preventDefault){L.preventDefault()}else{L.returnValue=false}},getEvent:function(M){var L=M||window.event;if(!L){var N=this.getEvent.caller;while(N){L=N.arguments[0];if(L&&Event==L.constructor){break}N=N.caller}}return L},getCharCode:function(L){L=L.browserEvent||L;return L.charCode||L.keyCode||0},_getCacheIndex:function(Q,N,P){for(var O=0,M=G.length;O0)}var Q=[];for(var M=0,L=H.length;M0){for(var Q=0,S=T.length;Q0){O=G.length;while(O){N=O-1;M=G[N];if(M){R.removeListener(M[R.EL],M[R.TYPE],M[R.FN],N)}O=O-1}M=null;R.clearCache()}R.doRemove(window,"unload",R._unload)},getScroll:function(){var L=document.documentElement,M=document.body;if(L&&(L.scrollTop||L.scrollLeft)){return[L.scrollTop,L.scrollLeft]}else{if(M){return[M.scrollTop,M.scrollLeft]}else{return[0,0]}}},doAdd:function(){if(window.addEventListener){return function(O,M,N,L){O.addEventListener(M,N,(L))}}else{if(window.attachEvent){return function(O,M,N,L){O.attachEvent("on"+M,N)}}else{return function(){}}}}(),doRemove:function(){if(window.removeEventListener){return function(O,M,N,L){O.removeEventListener(M,N,(L))}}else{if(window.detachEvent){return function(N,L,M){N.detachEvent("on"+L,M)}}else{return function(){}}}}()}}();var D=Ext.lib.Event;D.on=D.addListener;D.un=D.removeListener;if(document&&document.body){D._load()}else{D.doAdd(window,"load",D._load)}D.doAdd(window,"unload",D._unload);D._tryPreloadAttach();Ext.lib.Ajax={request:function(K,I,E,J,F){if(F){var G=F.headers;if(G){for(var H in G){if(G.hasOwnProperty(H)){this.initHeader(H,G[H],false)}}}if(F.xmlData){if(!G||!G["Content-Type"]){this.initHeader("Content-Type","text/xml",false)}K=(K?K:(F.method?F.method:"POST"));J=F.xmlData}else{if(F.jsonData){if(!G||!G["Content-Type"]){this.initHeader("Content-Type","application/json",false)}K=(K?K:(F.method?F.method:"POST"));J=typeof F.jsonData=="object"?Ext.encode(F.jsonData):F.jsonData}}}return this.asyncRequest(K,I,E,J)},serializeForm:function(F){if(typeof F=="string"){F=(document.getElementById(F)||document.forms[F])}var G,E,H,J,K="",M=false;for(var L=0;L=200&&G<300){F=this.createResponseObject(I,J.argument);if(J.success){if(!J.scope){J.success(F)}else{J.success.apply(J.scope,[F])}}}else{switch(G){case 12002:case 12029:case 12030:case 12031:case 12152:case 13030:F=this.createExceptionObject(I.tId,J.argument,(E?E:false));if(J.failure){if(!J.scope){J.failure(F)}else{J.failure.apply(J.scope,[F])}}break;default:F=this.createResponseObject(I,J.argument);if(J.failure){if(!J.scope){J.failure(F)}else{J.failure.apply(J.scope,[F])}}}}this.releaseObject(I);F=null},createResponseObject:function(E,K){var H={};var M={};try{var G=E.conn.getAllResponseHeaders();var J=G.split("\n");for(var I=0;I=this.left&&E.right<=this.right&&E.top>=this.top&&E.bottom<=this.bottom)},getArea:function(){return((this.bottom-this.top)*(this.right-this.left))},intersect:function(I){var G=Math.max(this.top,I.top);var H=Math.min(this.right,I.right);var E=Math.min(this.bottom,I.bottom);var F=Math.max(this.left,I.left);if(E>=G&&H>=F){return new Ext.lib.Region(G,H,E,F)}else{return null}},union:function(I){var G=Math.min(this.top,I.top);var H=Math.max(this.right,I.right);var E=Math.max(this.bottom,I.bottom);var F=Math.min(this.left,I.left);return new Ext.lib.Region(G,H,E,F)},constrainTo:function(E){this.top=this.top.constrain(E.top,E.bottom);this.bottom=this.bottom.constrain(E.top,E.bottom);this.left=this.left.constrain(E.left,E.right);this.right=this.right.constrain(E.left,E.right);return this},adjust:function(G,F,E,H){this.top+=G;this.left+=F;this.right+=H;this.bottom+=E;return this}};Ext.lib.Region.getRegion=function(H){var J=Ext.lib.Dom.getXY(H);var G=J[1];var I=J[0]+H.offsetWidth;var E=J[1]+H.offsetHeight;var F=J[0];return new Ext.lib.Region(G,I,E,F)};Ext.lib.Point=function(E,F){if(Ext.isArray(E)){F=E[1];E=E[0]}this.x=this.right=this.left=this[0]=E;this.y=this.top=this.bottom=this[1]=F};Ext.lib.Point.prototype=new Ext.lib.Region();Ext.lib.Anim={scroll:function(H,F,I,J,E,G){return this.run(H,F,I,J,E,G,Ext.lib.Scroll)},motion:function(H,F,I,J,E,G){return this.run(H,F,I,J,E,G,Ext.lib.Motion)},color:function(H,F,I,J,E,G){return this.run(H,F,I,J,E,G,Ext.lib.ColorAnim)},run:function(I,F,K,L,E,H,G){G=G||Ext.lib.AnimBase;if(typeof L=="string"){L=Ext.lib.Easing[L]}var J=new G(I,F,K,L);J.animateX(function(){Ext.callback(E,H)});return J}};function C(E){if(!B){B=new Ext.Element.Flyweight()}B.dom=E;return B}if(Ext.isIE){function A(){var E=Function.prototype;delete E.createSequence;delete E.defer;delete E.createDelegate;delete E.createCallback;delete E.createInterceptor;window.detachEvent("onunload",A)}window.attachEvent("onunload",A)}Ext.lib.AnimBase=function(F,E,G,H){if(F){this.init(F,E,G,H)}};Ext.lib.AnimBase.prototype={toString:function(){var E=this.getEl();var F=E.id||E.tagName;return("Anim "+F)},patterns:{noNegatives:/width|height|opacity|padding/i,offsetAttribute:/^((width|height)|(top|left))$/,defaultUnit:/width|height|top$|bottom$|left$|right$/i,offsetUnit:/\d+(em|%|en|ex|pt|in|cm|mm|pc)$/i},doMethod:function(E,G,F){return this.method(this.currentFrame,G,F-G,this.totalFrames)},setAttribute:function(E,G,F){if(this.patterns.noNegatives.test(E)){G=(G>0)?G:0}Ext.fly(this.getEl(),"_anim").setStyle(E,G+F)},getAttribute:function(E){var G=this.getEl();var I=C(G).getStyle(E);if(I!=="auto"&&!this.patterns.offsetUnit.test(I)){return parseFloat(I)}var F=this.patterns.offsetAttribute.exec(E)||[];var J=!!(F[3]);var H=!!(F[2]);if(H||(C(G).getStyle("position")=="absolute"&&J)){I=G["offset"+F[0].charAt(0).toUpperCase()+F[0].substr(1)]}else{I=0}return I},getDefaultUnit:function(E){if(this.patterns.defaultUnit.test(E)){return"px"}return""},animateX:function(G,E){var F=function(){this.onComplete.removeListener(F);if(typeof G=="function"){G.call(E||this,this)}};this.onComplete.addListener(F,this);this.animate()},setRuntimeAttribute:function(F){var K;var G;var H=this.attributes;this.runtimeAttributes[F]={};var J=function(L){return(typeof L!=="undefined")};if(!J(H[F]["to"])&&!J(H[F]["by"])){return false}K=(J(H[F]["from"]))?H[F]["from"]:this.getAttribute(F);if(J(H[F]["to"])){G=H[F]["to"]}else{if(J(H[F]["by"])){if(K.constructor==Array){G=[];for(var I=0,E=K.length;I0&&isFinite(O)){if(K.currentFrame+O>=N){O=N-(M+1)}K.currentFrame+=O}}};Ext.lib.Bezier=new function(){this.getPosition=function(I,H){var J=I.length;var G=[];for(var F=0;F0&&!Ext.isArray(O[0])){O=[O]}else{var N=[];for(P=0,R=O.length;P0){this.runtimeAttributes[S]=this.runtimeAttributes[S].concat(O)}this.runtimeAttributes[S][this.runtimeAttributes[S].length]=L}else{I.setRuntimeAttribute.call(this,S)}};var E=function(J,L){var K=Ext.lib.Dom.getXY(this.getEl());J=[J[0]-K[0]+L[0],J[1]-K[1]+L[1]];return J};var G=function(J){return(typeof J!=="undefined")}})();(function(){Ext.lib.Scroll=function(I,H,J,K){if(I){Ext.lib.Scroll.superclass.constructor.call(this,I,H,J,K)}};Ext.extend(Ext.lib.Scroll,Ext.lib.ColorAnim);var F=Ext.lib;var G=F.Scroll.superclass;var E=F.Scroll.prototype;E.toString=function(){var H=this.getEl();var I=H.id||H.tagName;return("Scroll "+I)};E.doMethod=function(H,K,I){var J=null;if(H=="scroll"){J=[this.method(this.currentFrame,K[0],I[0]-K[0],this.totalFrames),this.method(this.currentFrame,K[1],I[1]-K[1],this.totalFrames)]}else{J=G.doMethod.call(this,H,K,I)}return J};E.getAttribute=function(H){var J=null;var I=this.getEl();if(H=="scroll"){J=[I.scrollLeft,I.scrollTop]}else{J=G.getAttribute.call(this,H)}return J};E.setAttribute=function(H,K,J){var I=this.getEl();if(H=="scroll"){I.scrollLeft=K[0];I.scrollTop=K[1]}else{G.setAttribute.call(this,H,K,J)}}})()})(); diff --git a/.svn/pristine/72/72e70ce228baba0d79ac75c98ebb1a5d2f1f0b51.svn-base b/.svn/pristine/72/72e70ce228baba0d79ac75c98ebb1a5d2f1f0b51.svn-base new file mode 100644 index 0000000..1f1ed64 Binary files /dev/null and b/.svn/pristine/72/72e70ce228baba0d79ac75c98ebb1a5d2f1f0b51.svn-base differ diff --git a/.svn/pristine/74/74d49e57135117e1681798de9ea49640c0004c31.svn-base b/.svn/pristine/74/74d49e57135117e1681798de9ea49640c0004c31.svn-base new file mode 100644 index 0000000..3ca0ed9 Binary files /dev/null and b/.svn/pristine/74/74d49e57135117e1681798de9ea49640c0004c31.svn-base differ diff --git a/.svn/pristine/76/768e9f6bac34d4af6550d8234ceb37bb4d15f36d.svn-base b/.svn/pristine/76/768e9f6bac34d4af6550d8234ceb37bb4d15f36d.svn-base new file mode 100644 index 0000000..c4c1087 Binary files /dev/null and b/.svn/pristine/76/768e9f6bac34d4af6550d8234ceb37bb4d15f36d.svn-base differ diff --git a/.svn/pristine/76/76f2b5bb45b6c727d659f7b9b6f721357b4aeadf.svn-base b/.svn/pristine/76/76f2b5bb45b6c727d659f7b9b6f721357b4aeadf.svn-base new file mode 100644 index 0000000..a4ca2bb Binary files /dev/null and b/.svn/pristine/76/76f2b5bb45b6c727d659f7b9b6f721357b4aeadf.svn-base differ diff --git a/.svn/pristine/77/7746b6f24308b76a08dff00ff9cb66ad3776d90a.svn-base b/.svn/pristine/77/7746b6f24308b76a08dff00ff9cb66ad3776d90a.svn-base new file mode 100644 index 0000000..6957924 Binary files /dev/null and b/.svn/pristine/77/7746b6f24308b76a08dff00ff9cb66ad3776d90a.svn-base differ diff --git a/.svn/pristine/78/78d6a24b5c9bfca60f69d0c042f9bcea30cb84bc.svn-base b/.svn/pristine/78/78d6a24b5c9bfca60f69d0c042f9bcea30cb84bc.svn-base new file mode 100644 index 0000000..daf3564 --- /dev/null +++ b/.svn/pristine/78/78d6a24b5c9bfca60f69d0c042f9bcea30cb84bc.svn-base @@ -0,0 +1,279 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.temp; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.LineNumberReader; +import java.lang.management.ManagementFactory; +import java.lang.management.OperatingSystemMXBean; +import java.util.StringTokenizer; + +/** + * @author jinghai.xiao@gmail.com + * @date 2011-3-24 + */ + +public class MonitorServiceImpl implements IMonitorService { + + private static final int CPUTIME = 30; + + private static final int PERCENT = 100; + + private static final int FAULTLENGTH = 10; + + // private static final File versionFile = new File("/proc/version"); + private static String linuxVersion = null; + + /** + * 获得当前的监控对象. + * @return 返回构造好的监控对象 + * @throws Exception + * @author GuoHuang + */ + @SuppressWarnings({ + "unused", "static-access" + }) + public MonitorInfoBean getMonitorInfoBean() throws Exception { + int kb = 1024; + + // 可使用内存 + long totalMemory = Runtime.getRuntime().totalMemory() / kb; + // 剩余内存 + long freeMemory = Runtime.getRuntime().freeMemory() / kb; + // 最大可使用内存 + long maxMemory = Runtime.getRuntime().maxMemory() / kb; + + OperatingSystemMXBean osmxb = ManagementFactory.getOperatingSystemMXBean(); + + // 操作系统 + String osName = System.getProperty("os.name"); + // 总的物理内存 + // long totalMemorySize = osmxb.getTotalPhysicalMemorySize() / kb; + // 剩余的物理内存 + // long freePhysicalMemorySize = osmxb.getFreePhysicalMemorySize() / kb; + // 已使用的物理内存 + // long usedMemory = (osmxb.getTotalPhysicalMemorySize() - + // osmxb.getFreePhysicalMemorySize()) / kb; + + // 获得线程总数 + ThreadGroup parentThread; + for (parentThread = Thread.currentThread().getThreadGroup(); parentThread.getParent() != null; parentThread = parentThread + .getParent()) + ; + int totalThread = parentThread.activeCount(); + + double cpuRatio = 0; + if (osName.toLowerCase().startsWith("windows")) { + cpuRatio = this.getCpuRatioForWindows(); + } else { + cpuRatio = this.getCpuRateForLinux(); + } + + // 构造返回对象 + MonitorInfoBean infoBean = new MonitorInfoBean(); + infoBean.setFreeMemory(freeMemory); + // infoBean.setFreePhysicalMemorySize(freePhysicalMemorySize); + infoBean.setMaxMemory(maxMemory); + infoBean.setOsName(osName); + infoBean.setTotalMemory(totalMemory); + // infoBean.setTotalMemorySize(totalMemorySize); + infoBean.setTotalThread(totalThread); + // infoBean.setUsedMemory(usedMemory); + infoBean.setCpuRatio(cpuRatio); + return infoBean; + } + + private static double getCpuRateForLinux() { + InputStream is = null; + InputStreamReader isr = null; + BufferedReader brStat = null; + StringTokenizer tokenStat = null; + try { + System.out.println("Get usage rate of CUP , linux version: " + linuxVersion); + + Process process = Runtime.getRuntime().exec("top -b -n 1"); + is = process.getInputStream(); + isr = new InputStreamReader(is); + brStat = new BufferedReader(isr); + + if (linuxVersion.equals("2.4")) { + brStat.readLine(); + brStat.readLine(); + brStat.readLine(); + brStat.readLine(); + + tokenStat = new StringTokenizer(brStat.readLine()); + tokenStat.nextToken(); + tokenStat.nextToken(); + String user = tokenStat.nextToken(); + tokenStat.nextToken(); + String system = tokenStat.nextToken(); + tokenStat.nextToken(); + String nice = tokenStat.nextToken(); + + System.out.println(user + " , " + system + " , " + nice); + + user = user.substring(0, user.indexOf("%")); + system = system.substring(0, system.indexOf("%")); + nice = nice.substring(0, nice.indexOf("%")); + + float userUsage = new Float(user).floatValue(); + float systemUsage = new Float(system).floatValue(); + float niceUsage = new Float(nice).floatValue(); + + return (userUsage + systemUsage + niceUsage) / 100; + } else { + brStat.readLine(); + brStat.readLine(); + + tokenStat = new StringTokenizer(brStat.readLine()); + tokenStat.nextToken(); + tokenStat.nextToken(); + tokenStat.nextToken(); + tokenStat.nextToken(); + tokenStat.nextToken(); + tokenStat.nextToken(); + tokenStat.nextToken(); + String cpuUsage = tokenStat.nextToken(); + + System.out.println("CPU idle : " + cpuUsage); + Float usage = new Float(cpuUsage.substring(0, cpuUsage.indexOf("%"))); + + return (1 - usage.floatValue() / 100); + } + + } catch (IOException ioe) { + System.out.println(ioe.getMessage()); + freeResource(is, isr, brStat); + return 1; + } finally { + freeResource(is, isr, brStat); + } + + } + + private static void freeResource(InputStream is, InputStreamReader isr, BufferedReader br) { + try { + if (is != null) is.close(); + if (isr != null) isr.close(); + if (br != null) br.close(); + } catch (IOException ioe) { + System.out.println(ioe.getMessage()); + } + } + + /** + * 获得CPU使用率. + * @return 返回cpu使用率 + * @author GuoHuang + */ + private double getCpuRatioForWindows() { + try { + String procCmd = System.getenv("windir") + "\\system32\\wbem\\wmic.exe process get Caption,CommandLine," + + "KernelModeTime,ReadOperationCount,ThreadCount,UserModeTime,WriteOperationCount"; + // 取进程信息 + long[] c0 = readCpu(Runtime.getRuntime().exec(procCmd)); + Thread.sleep(CPUTIME); + long[] c1 = readCpu(Runtime.getRuntime().exec(procCmd)); + if (c0 != null && c1 != null) { + long idletime = c1[0] - c0[0]; + long busytime = c1[1] - c0[1]; + return Double.valueOf(PERCENT * (busytime) / (busytime + idletime)).doubleValue(); + } else { + return 0.0; + } + } catch (Exception ex) { + ex.printStackTrace(); + return 0.0; + } + } + + /** + * 读取CPU信息. + * @param proc + * @return + * @author GuoHuang + */ + private long[] readCpu(final Process proc) { + long[] retn = new long[2]; + try { + proc.getOutputStream().close(); + InputStreamReader ir = new InputStreamReader(proc.getInputStream()); + LineNumberReader input = new LineNumberReader(ir); + String line = input.readLine(); + if (line == null || line.length() < FAULTLENGTH) { + return null; + } + int capidx = line.indexOf("Caption"); + int cmdidx = line.indexOf("CommandLine"); + int rocidx = line.indexOf("ReadOperationCount"); + int umtidx = line.indexOf("UserModeTime"); + int kmtidx = line.indexOf("KernelModeTime"); + int wocidx = line.indexOf("WriteOperationCount"); + long idletime = 0; + long kneltime = 0; + long usertime = 0; + while ((line = input.readLine()) != null) { + if (line.length() < wocidx) { + continue; + } + // 字段出现顺序:Caption,CommandLine,KernelModeTime,ReadOperationCount, + // ThreadCount,UserModeTime,WriteOperation + String caption = Bytes.substring(line, capidx, cmdidx - 1).trim(); + String cmd = Bytes.substring(line, cmdidx, kmtidx - 1).trim(); + if (cmd.indexOf("wmic.exe") >= 0) { + continue; + } + // log.info("line="+line); + if (caption.equals("System Idle Process") || caption.equals("System")) { + idletime += Long.valueOf(Bytes.substring(line, kmtidx, rocidx - 1).trim()).longValue(); + idletime += Long.valueOf(Bytes.substring(line, umtidx, wocidx - 1).trim()).longValue(); + continue; + } + + kneltime += Long.valueOf(Bytes.substring(line, kmtidx, rocidx - 1).trim()).longValue(); + usertime += Long.valueOf(Bytes.substring(line, umtidx, wocidx - 1).trim()).longValue(); + } + retn[0] = idletime; + retn[1] = kneltime + usertime; + return retn; + } catch (Exception ex) { + ex.printStackTrace(); + } finally { + try { + proc.getInputStream().close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + return null; + } + + /** + * 测试方法. + * @param args + * @throws Exception + * @author GuoHuang + */ + public static void main(String[] args) throws Exception { + IMonitorService service = new MonitorServiceImpl(); + MonitorInfoBean monitorInfo = service.getMonitorInfoBean(); + System.out.println("cpu占有率=" + monitorInfo.getCpuRatio()); + + System.out.println("可使用内存=" + monitorInfo.getTotalMemory()); + System.out.println("剩余内存=" + monitorInfo.getFreeMemory()); + System.out.println("最大可使用内存=" + monitorInfo.getMaxMemory()); + + System.out.println("操作系统=" + monitorInfo.getOsName()); + System.out.println("总的物理内存=" + monitorInfo.getTotalMemorySize() + "kb"); + System.out.println("剩余的物理内存=" + monitorInfo.getFreeMemory() + "kb"); + System.out.println("已使用的物理内存=" + monitorInfo.getUsedMemory() + "kb"); + System.out.println("线程总数=" + monitorInfo.getTotalThread() + "kb"); + } +} diff --git a/.svn/pristine/79/798541ae62cc29766d345e85e19abcb9a59a587f.svn-base b/.svn/pristine/79/798541ae62cc29766d345e85e19abcb9a59a587f.svn-base new file mode 100644 index 0000000..cfa51f1 --- /dev/null +++ b/.svn/pristine/79/798541ae62cc29766d345e85e19abcb9a59a587f.svn-base @@ -0,0 +1,81 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core; + +import java.io.InputStream; +import java.util.Locale; +import java.util.Properties; + +/** + * 负责初始化和读取本地化字符串 + */ + +public class Language { + + private static String cnLanguageFile = "/language-cn.xml"; + private static String enLanguageFile = "/language-en.xml"; + + private static Properties prop; + + private static void beforeGet() { + if (prop == null) { + Locale locale = CometContext.getInstance().getLocale(); + if (Locale.ENGLISH == locale) { + InputStream in = Language.class.getResourceAsStream(enLanguageFile); + prop = new Properties(); + try { + prop.loadFromXML(in); + } catch (Exception e) { + e.printStackTrace(); + } + } + if (Locale.CHINESE == locale) { + InputStream in = Language.class.getResourceAsStream(cnLanguageFile); + prop = new Properties(); + try { + prop.loadFromXML(in); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + /** + * 按Key获取本地化字符串 + * @param key + * @return + */ + + public static String get(String key) { + beforeGet(); + return prop.getProperty(key); + } + + /** + * 获取连接成功本地化字符串 + * @return + */ + + public static String getConnectSuccess() { + beforeGet(); + return prop.getProperty("ConnectSuccess"); + } + + /** + * 获取连接失败本地化字符串 + * @return + */ + + public static String getConnectFailure() { + beforeGet(); + return prop.getProperty("ConnectFailure"); + } + + public void destroy() { + prop = null; + } +} diff --git a/.svn/pristine/79/79bdca9888c42513a56c0568712cef7be9e5fa35.svn-base b/.svn/pristine/79/79bdca9888c42513a56c0568712cef7be9e5fa35.svn-base new file mode 100644 index 0000000..188bf94 Binary files /dev/null and b/.svn/pristine/79/79bdca9888c42513a56c0568712cef7be9e5fa35.svn-base differ diff --git a/.svn/pristine/79/79eab8c559072522df4dd032cab86e9f7762e4b6.svn-base b/.svn/pristine/79/79eab8c559072522df4dd032cab86e9f7762e4b6.svn-base new file mode 100644 index 0000000..759de0f Binary files /dev/null and b/.svn/pristine/79/79eab8c559072522df4dd032cab86e9f7762e4b6.svn-base differ diff --git a/.svn/pristine/79/79eec40481b12a8de079c690296d67d8c9b3f7b4.svn-base b/.svn/pristine/79/79eec40481b12a8de079c690296d67d8c9b3f7b4.svn-base new file mode 100644 index 0000000..f3cf86d Binary files /dev/null and b/.svn/pristine/79/79eec40481b12a8de079c690296d67d8c9b3f7b4.svn-base differ diff --git a/.svn/pristine/7b/7b6737b307bd72fec6debf1284e30295f27db164.svn-base b/.svn/pristine/7b/7b6737b307bd72fec6debf1284e30295f27db164.svn-base new file mode 100644 index 0000000..3c99cb1 --- /dev/null +++ b/.svn/pristine/7b/7b6737b307bd72fec6debf1284e30295f27db164.svn-base @@ -0,0 +1,41 @@ + + + Comet4J-JavaScript - API Documentation + + + + + + + + + + +
+
+
Loading...
+
+ + + + + + + + + + +
+ +
+ + + \ No newline at end of file diff --git a/.svn/pristine/7b/7bbb12b24e55cb4974def90dee5f85833b33c963.svn-base b/.svn/pristine/7b/7bbb12b24e55cb4974def90dee5f85833b33c963.svn-base new file mode 100644 index 0000000..90a7756 Binary files /dev/null and b/.svn/pristine/7b/7bbb12b24e55cb4974def90dee5f85833b33c963.svn-base differ diff --git a/.svn/pristine/7c/7c55d8debcb70cd2d439e1bcd971b6e661e23b9d.svn-base b/.svn/pristine/7c/7c55d8debcb70cd2d439e1bcd971b6e661e23b9d.svn-base new file mode 100644 index 0000000..bafa953 --- /dev/null +++ b/.svn/pristine/7c/7c55d8debcb70cd2d439e1bcd971b6e661e23b9d.svn-base @@ -0,0 +1,17 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.listener; + +import org.comet4j.core.event.BeforeConnectEvent; +import org.comet4j.event.Listener; + +/** + * 即将连接事件侦听抽象类 + */ + +public abstract class BeforeConnectListener extends Listener { + +} diff --git a/.svn/pristine/7d/7d423a64aaf956ff1e68d727e09af1ae6e77ecf6.svn-base b/.svn/pristine/7d/7d423a64aaf956ff1e68d727e09af1ae6e77ecf6.svn-base new file mode 100644 index 0000000..856eff8 --- /dev/null +++ b/.svn/pristine/7d/7d423a64aaf956ff1e68d727e09af1ae6e77ecf6.svn-base @@ -0,0 +1,29 @@ +/** + * @(#)RevivalEventListener.java 2011-3-9 Copyright 2011 it.kedacom.com, Inc. + * All rights reserved. + */ + +package org.comet4j.demo.eventmonitor; + +import org.comet4j.core.event.RevivalEvent; +import org.comet4j.core.listener.RevivalListener; + +/** + * (用一句话描述类的主要功能) + * @author xiaojinghai + * @date 2011-3-9 + */ + +public class RevivalEventListener extends RevivalListener { + + /* + * (non-Jsdoc) + * @see org.comet4j.event.Listener#handleEvent(org.comet4j.event.Event) + */ + @Override + public boolean handleEvent(RevivalEvent anEvent) { + System.out.println("[RevivalEvent]:cId=" + anEvent.getConn().getId()); + return false; + } + +} diff --git a/.svn/pristine/7d/7d8e9e6feba420a912f381a701fa2f22d0510d1f.svn-base b/.svn/pristine/7d/7d8e9e6feba420a912f381a701fa2f22d0510d1f.svn-base new file mode 100644 index 0000000..93e1ee6 --- /dev/null +++ b/.svn/pristine/7d/7d8e9e6feba420a912f381a701fa2f22d0510d1f.svn-base @@ -0,0 +1,29 @@ +/** + * @(#)DropEventListener.java 2011-3-9 Copyright 2011 it.kedacom.com, Inc. All + * rights reserved. + */ + +package org.comet4j.demo.eventmonitor; + +import org.comet4j.core.event.DropEvent; +import org.comet4j.core.listener.DropListener; + +/** + * (用一句话描述类的主要功能) + * @author xiaojinghai + * @date 2011-3-9 + */ + +public class DropEventListener extends DropListener { + + /* + * (non-Jsdoc) + * @see org.comet4j.event.Listener#handleEvent(org.comet4j.event.Event) + */ + @Override + public boolean handleEvent(DropEvent anEvent) { + System.out.println("[DropEvent]:cId=" + anEvent.getConn().getId()); + return false; + } + +} diff --git a/.svn/pristine/7d/7dec30822b90b0567beb889f1c6affaa0a74bbf1.svn-base b/.svn/pristine/7d/7dec30822b90b0567beb889f1c6affaa0a74bbf1.svn-base new file mode 100644 index 0000000..bb076d8 --- /dev/null +++ b/.svn/pristine/7d/7dec30822b90b0567beb889f1c6affaa0a74bbf1.svn-base @@ -0,0 +1,140 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core; + +import java.io.UnsupportedEncodingException; + +import org.comet4j.core.util.JSONUtil; + +/** + * 协议类,定义了与客户端通讯的一些约定标识 + */ + +public class CometProtocol { + + /** + * 系统模块标识 + */ + public static final String SYS_CHANNEL = "c4j"; + /** + * 客户端连接器版本标识 + */ + public static final String FLAG_CLIENTVERSION = "cv"; + /** + * 客户端连接ID标识 + */ + public static final String FLAG_ID = "cid"; + /** + * 客户端连接器动作标识 + */ + public static final String FLAG_ACTION = "cmd"; + /** + * 数据开始标识 + */ + public static final String FLAG_DataStart = "<"; + /** + * 数据结束结识 + */ + public static final String FLAG_DataEnd = ">"; + /** + * 连接动作 + */ + public static final String CMD_CONNECT = "conn"; + /** + * 复活动作 + */ + public static final String CMD_REVIVAL = "revival"; + /** + * 断开连接 + */ + public static final String CMD_DROP = "drop"; + /** + * 长轮询工作状态 + */ + public static final String WORKSTYLE_LLOOP = "lpool"; + /** + * 长连接工作状态(HTTP Streaming) + */ + public static final String WORKSTYLE_STREAM = "stream"; + /** + * 智能工作状态 + */ + public static final String WORKSTYLE_AUTO = "auto"; + /** + * 连接可用状态 + */ + public static final String STATE_ALIVE = "alive"; + /** + * 连接濒死状态 + */ + public static final String STATE_DYING = "dying"; + /** + * HTTP超时状态值 + */ + public static final int HTTPSTATUS_TIMEOUT = 408; + /** + * HTTP异常状态 + */ + public static final int HTTPSTATUS_ERROR = 500; + /** + * 语言配置 + */ + public static final String CONFIG_LANGUAGE = "Comet.Language"; + /** + * 工作方式配置 + */ + public static final String CONFIG_WORKSTYLE = "Comet.WorkStyle"; + /** + * 引擎配置 + */ + public static final String CONFIG_ENGINE = "Comet.CometEngine"; + /** + * 请求超时时间 + */ + public static final String CONFIG_TIMEOUT = "Comet.Timeout"; + /** + * 缓存过期时间 + */ + public static final String CONFIG_CACHEEXPIRES = "Comet.CacheExpires"; + /** + * 缓存过期检查频率 + */ + public static final String CONFIG_CACHEFREQUENCY = "Comet.CacheFrequency"; + /** + * 连接过期时间 + */ + public static final String CONFIG_CONNEXPIRES = "Comet.ConnExpires"; + /** + * 连接过期查频率 + */ + public static final String CONFIG_CONNFREQUENCY = "Comet.ConnFrequency"; + /** + * 调试 + */ + public static final String CONFIG_DEBUG = "Comet.Debug"; + + /** + * 将被发送数据使用协议进行编码 + * @param data + * @return + */ + + public static String encode(Object data) { + StringBuffer sb = new StringBuffer(); + String code = ""; + try { + code = java.net.URLEncoder.encode(JSONUtil.object2json(data).toString(), "utf-8"); + code = code.replace("+", "%20"); + } catch (UnsupportedEncodingException e) { + // TODO 尚未处理异常 + e.printStackTrace(); + } + sb.append(FLAG_DataStart); + sb.append(code); + sb.append(FLAG_DataEnd); + return sb.toString(); + } +} diff --git a/.svn/pristine/7e/7e40f04a4c19bc974b4d8cf89268282211147aa8.svn-base b/.svn/pristine/7e/7e40f04a4c19bc974b4d8cf89268282211147aa8.svn-base new file mode 100644 index 0000000..39ef3c6 --- /dev/null +++ b/.svn/pristine/7e/7e40f04a4c19bc974b4d8cf89268282211147aa8.svn-base @@ -0,0 +1,117 @@ + + + Comet4J Test + + talk.html + + + air + application/air + + + 编码过滤 + encodingfilter + org.comet4j.core.util.CharacterEncodingFilter + + encoding + utf-8 + + + + encodingfilter + /* + + + + + + monitoring + net.bull.javamelody.MonitoringFilter + + + monitoring + /* + + + net.bull.javamelody.SessionListener + + + + + + 应用程序事件监听 + org.comet4j.core.CometAppListener + + + Comet连接[默认:org.comet4j.core.CometServletTomcat7] + CometServlet + CometServlet + org.comet4j.core.CometServletTomcat7 + + + CometServlet + /conn + + + + 语言[目前只支持:zh,en两种,默认:zh,详细http://www.loc.gov/standards/iso639-2/php/English_list.php] + Comet.Language + zh + + + 请求超时时间/微妙[默认:60000,1分钟,建议最小设置3秒] + Comet.Timeout + 5000 + + + 连接空闲过期时间/微妙[默认:60000,1分钟] + Comet.ConnExpires + 5000 + + + 连接检查频率/微妙[默认:60000,1分钟] + Comet.ConnFrequency + 5000 + + + 缓存信息过期时间/微妙[默认:3600000,1小时] + Comet.CacheExpires + 3600000 + + + 缓存信息过期检查频率/微妙[默认:3600000,1小时] + Comet.CacheFrequency + 5000 + + + 连接模式[auto(默认)/stream/lpool] + Comet.WorkStyle + auto + + + 开启调试[false(默认)/true] + Comet.Debug + true + + + + + + 信息发送器 + org.comet4j.demo.sender.AppInit + + + + 请求监视 + org.comet4j.demo.requestmonitor.AppInit + + + 事件监视 + org.comet4j.demo.eventmonitor.AppInit + + + + \ No newline at end of file diff --git a/.svn/pristine/7e/7e9e5fe5b5b1dad562b3a455776e3ee4d3ceeda6.svn-base b/.svn/pristine/7e/7e9e5fe5b5b1dad562b3a455776e3ee4d3ceeda6.svn-base new file mode 100644 index 0000000..d5b9a21 --- /dev/null +++ b/.svn/pristine/7e/7e9e5fe5b5b1dad562b3a455776e3ee4d3ceeda6.svn-base @@ -0,0 +1,25 @@ +body{ + background:url(welcome-bg.gif) top left; + font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; + color: #000000; + margin: 0px; + font-size:13px; + padding-bottom:15px; +} +a { + color: #083772; +} +a:link { + color: #083772; + text-decoration: none; +} + +a:visited { + color: #1e4e8f; + text-decoration: none; +} + +a:hover { + text-decoration: underline; + color: #0000CC; +} \ No newline at end of file diff --git a/.svn/pristine/7e/7ef67fd2481bb3fbee9667d21dc74441871544e3.svn-base b/.svn/pristine/7e/7ef67fd2481bb3fbee9667d21dc74441871544e3.svn-base new file mode 100644 index 0000000..8acb460 Binary files /dev/null and b/.svn/pristine/7e/7ef67fd2481bb3fbee9667d21dc74441871544e3.svn-base differ diff --git a/.svn/pristine/7f/7f9332b60e1d7e68b4db26d8d7ce5a6568350794.svn-base b/.svn/pristine/7f/7f9332b60e1d7e68b4db26d8d7ce5a6568350794.svn-base new file mode 100644 index 0000000..698de47 Binary files /dev/null and b/.svn/pristine/7f/7f9332b60e1d7e68b4db26d8d7ce5a6568350794.svn-base differ diff --git a/.svn/pristine/81/81b53e21789907a1276d330837e6f075a931d831.svn-base b/.svn/pristine/81/81b53e21789907a1276d330837e6f075a931d831.svn-base new file mode 100644 index 0000000..1a7609d --- /dev/null +++ b/.svn/pristine/81/81b53e21789907a1276d330837e6f075a931d831.svn-base @@ -0,0 +1,44 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.temp; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; + +/** + * + */ +public class ServletLoadOnStart extends HttpServlet { + + private static final long serialVersionUID = 1L; + + /** + * @see HttpServlet#HttpServlet() + */ + public ServletLoadOnStart() { + super(); + } + + /* + * (non-Javadoc) + * @see javax.servlet.GenericServlet#init(javax.servlet.ServletConfig) + */ + @Override + public void init() throws ServletException { + super.init(); + log("---------------------------------Loaded!---------------------------------"); + } + + /* + * (non-Javadoc) + * @see javax.servlet.GenericServlet#destroy() + */ + @Override + public void destroy() { + + } + +} diff --git a/.svn/pristine/82/82ef2e378481e16a4008bf9f9802817a58acef76.svn-base b/.svn/pristine/82/82ef2e378481e16a4008bf9f9802817a58acef76.svn-base new file mode 100644 index 0000000..9f7f698 Binary files /dev/null and b/.svn/pristine/82/82ef2e378481e16a4008bf9f9802817a58acef76.svn-base differ diff --git a/.svn/pristine/83/83767bdb2130a4b3e3371450fa138a4a6ae3f9cc.svn-base b/.svn/pristine/83/83767bdb2130a4b3e3371450fa138a4a6ae3f9cc.svn-base new file mode 100644 index 0000000..31a332b Binary files /dev/null and b/.svn/pristine/83/83767bdb2130a4b3e3371450fa138a4a6ae3f9cc.svn-base differ diff --git a/.svn/pristine/83/83ffaa92efa9cf6d1892fac6a3fd2be0c6f21e53.svn-base b/.svn/pristine/83/83ffaa92efa9cf6d1892fac6a3fd2be0c6f21e53.svn-base new file mode 100644 index 0000000..98e0c18 --- /dev/null +++ b/.svn/pristine/83/83ffaa92efa9cf6d1892fac6a3fd2be0c6f21e53.svn-base @@ -0,0 +1,138 @@ +/** + * 消息引擎, + * 负责将服务器推送的通道数据,以事件的方式触发,事件名称与通道名称相同。 + * @class JS.Engine + * @singleton + * @extends JS.Observable + * @author jinghai.xiao@gmail.com + */ +JS.ns("JS.Engine"); +JS.Engine = (function(){ + var Engine = JS.extend(JS.Observable,{ + lStore : [],//用于存放没启动状态下用户增加的侦听 + /** + * 引擎是否处于工作状态 + * @property + * @type Boolean + */ + running : false, + /** + * 引擎所使用的连接器 + * @property + * @type JS.Connector + */ + connector : null, + constructor:function(){ + this.addEvents([ + /** + * @event start 开始事件 + * @param {String} cId 连接ID + * @param {Array} channels 通道列表 + * @param {JS.Engine} engine 事件引擎 + */ + 'start', + /*** + * @event stop 停止事件 + * @param {String} cause 停止原因 + * @param {String} cId 连接ID + * @param {String} url 连接地址 + * @param {JS.Engine} engine 事件引擎 + */ + 'stop' + ]); + Engine.superclass.constructor.apply(this,arguments); + this.connector = new JS.Connector(); + this.initEvent(); + }, + /** + * 注册通道侦听 + * @method on + * @param {String | Map} channelName 通道名称或多个通道名称和侦听函数的键值对 + * @param {Function} fn 侦听函数 + * @param {Object} scope 侦听函数作用域 + */ + //重载addListener函数 + addListener : function(eventName, fn, scope, o){ + if(this.running){ + Engine.superclass.addListener.apply(this,arguments); + }else{ + this.lStore.push({ + eventName : eventName, + fn : fn, + scope : scope, + o : o + }); + } + }, + //private + initEvent : function(){ + var self = this; + this.connector.on({ + connect : function(cId, aml, conn){ + //self.running = true; + self.addEvents(aml); + for(var i=0,len=self.lStore.length; i { + + /** + * 事件处理 + * @param anEvent + * @return + * 如果返回值为false则终被终止被终止执行此动作,避免动作的发生(如before类事件,一般为动作发生之前的事件才可以被终止执行,避免动作的发生 + * ), 否则继续执行其它侦听函数。 + */ + public abstract boolean handleEvent(E anEvent); +} diff --git a/.svn/pristine/85/8594935eef8eb329b6d615d927028fec82e18385.svn-base b/.svn/pristine/85/8594935eef8eb329b6d615d927028fec82e18385.svn-base new file mode 100644 index 0000000..9f2f6d1 Binary files /dev/null and b/.svn/pristine/85/8594935eef8eb329b6d615d927028fec82e18385.svn-base differ diff --git a/.svn/pristine/86/865c01b9240faf535adad40772243ff61a496aac.svn-base b/.svn/pristine/86/865c01b9240faf535adad40772243ff61a496aac.svn-base new file mode 100644 index 0000000..175ad28 --- /dev/null +++ b/.svn/pristine/86/865c01b9240faf535adad40772243ff61a496aac.svn-base @@ -0,0 +1,11 @@ + + + comet4j + + + + + + + + diff --git a/.svn/pristine/86/86f68626fe3f8e2c41c5a52396bdb0b111212bfc.svn-base b/.svn/pristine/86/86f68626fe3f8e2c41c5a52396bdb0b111212bfc.svn-base new file mode 100644 index 0000000..7577dd5 --- /dev/null +++ b/.svn/pristine/86/86f68626fe3f8e2c41c5a52396bdb0b111212bfc.svn-base @@ -0,0 +1,42 @@ +Ext JS - JavaScript Library +Copyright (c) 2006-2008, Ext JS, LLC +All rights reserved. +licensing@extjs.com + +http://extjs.com/license + +Open Source License +------------------------------------------------------------------------------------------ +Ext is licensed under the terms of the Open Source GPL 3.0 license. + +http://www.gnu.org/licenses/gpl.html + +There are several FLOSS exceptions available for use with this release for +open source applications that are distributed under a license other than the GPL. + +* Open Source License Exception for Applications + + http://extjs.com/products/floss-exception.php + +* Open Source License Exception for Development + + http://extjs.com/products/ux-exception.php + + +Commercial License +------------------------------------------------------------------------------------------ +This is the appropriate option if you are creating proprietary applications and you are +not prepared to distribute and share the source code of your application under the +GPL v3 license. Please visit http://extjs.com/license for more details. + + +OEM / Reseller License +------------------------------------------------------------------------------------------ +For more details, please visit: http://extjs.com/license. + +-- + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. \ No newline at end of file diff --git a/.svn/pristine/87/873d445b3ef97536b4fcc13763dbceff1b3e4c30.svn-base b/.svn/pristine/87/873d445b3ef97536b4fcc13763dbceff1b3e4c30.svn-base new file mode 100644 index 0000000..ec3a546 Binary files /dev/null and b/.svn/pristine/87/873d445b3ef97536b4fcc13763dbceff1b3e4c30.svn-base differ diff --git a/.svn/pristine/87/8767ad4cd3c770eb566fa10e88dd974a2d020c5c.svn-base b/.svn/pristine/87/8767ad4cd3c770eb566fa10e88dd974a2d020c5c.svn-base new file mode 100644 index 0000000..f1a4f51 --- /dev/null +++ b/.svn/pristine/87/8767ad4cd3c770eb566fa10e88dd974a2d020c5c.svn-base @@ -0,0 +1,113 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.temp; + +/** + * @author jinghai.xiao@gmail.com + * @date 2011-3-24 + */ + +public class MonitorInfoBean { + + /** 可使用内存. */ + private long totalMemory; + + /** 剩余内存. */ + private long freeMemory; + + /** 最大可使用内存. */ + private long maxMemory; + + /** 操作系统. */ + private String osName; + + /** 总的物理内存. */ + private long totalMemorySize; + + /** 剩余的物理内存. */ + private long freePhysicalMemorySize; + + /** 已使用的物理内存. */ + private long usedMemory; + + /** 线程总数. */ + private int totalThread; + + /** cpu使用率. */ + private double cpuRatio; + + public long getFreeMemory() { + return freeMemory; + } + + public void setFreeMemory(long freeMemory) { + this.freeMemory = freeMemory; + } + + public long getFreePhysicalMemorySize() { + return freePhysicalMemorySize; + } + + public void setFreePhysicalMemorySize(long freePhysicalMemorySize) { + this.freePhysicalMemorySize = freePhysicalMemorySize; + } + + public long getMaxMemory() { + return maxMemory; + } + + public void setMaxMemory(long maxMemory) { + this.maxMemory = maxMemory; + } + + public String getOsName() { + return osName; + } + + public void setOsName(String osName) { + this.osName = osName; + } + + public long getTotalMemory() { + return totalMemory; + } + + public void setTotalMemory(long totalMemory) { + this.totalMemory = totalMemory; + } + + public long getTotalMemorySize() { + return totalMemorySize; + } + + public void setTotalMemorySize(long totalMemorySize) { + this.totalMemorySize = totalMemorySize; + } + + public int getTotalThread() { + return totalThread; + } + + public void setTotalThread(int totalThread) { + this.totalThread = totalThread; + } + + public long getUsedMemory() { + return usedMemory; + } + + public void setUsedMemory(long usedMemory) { + this.usedMemory = usedMemory; + } + + public double getCpuRatio() { + return cpuRatio; + } + + public void setCpuRatio(double cpuRatio) { + this.cpuRatio = cpuRatio; + } +} diff --git a/.svn/pristine/87/87ab9531e1222351568346cf9057a0cae36112b8.svn-base b/.svn/pristine/87/87ab9531e1222351568346cf9057a0cae36112b8.svn-base new file mode 100644 index 0000000..3bd5d0a --- /dev/null +++ b/.svn/pristine/87/87ab9531e1222351568346cf9057a0cae36112b8.svn-base @@ -0,0 +1 @@ +org.eclipse.wst.jsdt.launching.baseBrowserLibrary \ No newline at end of file diff --git a/.svn/pristine/89/8902fd710322b58e887f411b4465eb1249f00624.svn-base b/.svn/pristine/89/8902fd710322b58e887f411b4465eb1249f00624.svn-base new file mode 100644 index 0000000..64697c7 --- /dev/null +++ b/.svn/pristine/89/8902fd710322b58e887f411b4465eb1249f00624.svn-base @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.svn/pristine/89/89b35d12a0c7d398a525081fc9ed7a22a2392017.svn-base b/.svn/pristine/89/89b35d12a0c7d398a525081fc9ed7a22a2392017.svn-base new file mode 100644 index 0000000..da14f55 --- /dev/null +++ b/.svn/pristine/89/89b35d12a0c7d398a525081fc9ed7a22a2392017.svn-base @@ -0,0 +1,360 @@ +.body-wrap { + font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; + color: #222; + background-color:#FFFFFF; + margin: 0px; + padding: 10px; + position:relative; +} +.body-wrap { + width:95%; +} + +.body-wrap ul.list { + margin-left:20px; + margin-bottom:10px; +} +.body-wrap ul.list li { + list-style:inside square; + padding:2px; +} +.body-wrap .description p { + margin:8px 3px !important; +} +.body-wrap .description h4{ + color:#083772; + border-bottom:1px dashed #ccc; + margin:8px 0; + padding-bottom:3px; +} +.body-wrap, .body-wrap td, .body-wrap th { + font-size: 13px; +} +.body-wrap code { + font-family: "Lucida Console", "Courier New", Courier, monospace; + font-size: 12px; +} +.body-wrap pre { + font-family: "Lucida Console", "Courier New", Courier, monospace; + font-size: 12px; +} +.body-wrap th { + text-align: left; + vertical-align:middle; + border-right:1px solid #d0d0d0; + border-top:1px solid #eee; + border-left:1px solid #eee; + background: #f9f9f9 url(../resources/images/default/grid/grid3-hrow.gif) repeat-x 0 top; + padding:3px; +} +.body-wrap .msource-header { + border-right: 0 none; +} +.body-wrap .top-tools{ + font-size:11px; + text-align:right; +} +.body-wrap table { + background-color: white; +} +.body-wrap a { + color: #083772; +} +.body-wrap a:link { + color: #083772; + text-decoration: none; +} + +.body-wrap a:visited { + color: #1e4e8f; + text-decoration: none; +} + +.body-wrap a:hover { + text-decoration: underline; + color: #0000CC; +} + +.body-wrap a:active { + text-decoration: none; + color: #1e4e8f; +} + +/* Headings */ +.body-wrap h1, .body-wrap h2, .body-wrap h3, .body-wrap h4, .body-wrap h5, .body-wrap h6 { + font-family: "Trebuchet MS", "Bitstream Vera Sans", verdana, lucida, arial, helvetica, sans-serif; + font-weight: bold; + margin:3px 300px 3px 0; + letter-spacing: 1px; + width: 90%; +} + +.body-wrap h1 { + font-size: 18px; +} + +.body-wrap h2 { + font-weight: bold; + font-size: 15px; + padding-top: 20px; + padding-bottom: 5px; +} + +.body-wrap h3 { + font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; + font-weight: bold; + font-size: 16px; +} + +.body-wrap h4 { + font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; + font-weight: bold; + font-size: 14px; +} + +.body-wrap h5 { + font-size: 11px; +} + +.body-wrap .label { + font-weight: bold; + padding:3px 15px 3px 0; + color:#333; +} + +.body-wrap .hd-info { + color:#333; + padding:3px; +} +.body-wrap .hd-info a { + +} +.body-wrap .description{ + margin: 10px 0px; +} +.body-wrap .member-table{ + width:100%; + margin-bottom:10px; +} +.body-wrap .member-table td{ + padding:4px; + vertical-align:top; + padding-right:15px; +} +.body-wrap .member-table td.sig { + padding-left:7px; +} +.body-wrap .alt{ + /*background:#f1f1f1;*/ +} +.body-wrap .member-table td.micon{ + width:16px; + padding:0px; + background: #f9f9f9 url(expand-bg.gif) repeat-y top right; + border-right:1px solid #d0d0d0; +} +.body-wrap .member-table td.micon a { + display:block; + height:1px; + width:1px; + overflow:hidden; + cursor:default; +} +.body-wrap .member-table .expandable td.micon a { + display:block; + width:98%; + height:30px; + text-decoration:none !important; + -moz-outline:none; + outline:none; +} + +.body-wrap .member-table td.msource{ + width:100px; +} +.mlink{ + font-weight:bold; +} + +.member-table { + border:1px solid #d0d0d0; +} +.member-table tr.inherited td.msource{ + background-image: url(inherited.gif); + background-position:2px 4px; + background-repeat: no-repeat; + padding-left:18px; +} +.member-table .mdesc{ + padding:5px 0; + color:#444; +} +.member-table td.micon,.member-table td.sig,.member-table td.msource{ + border-top:1px solid #d0d0d0; +} +.body-wrap .optional{ + color:#444 !important; +} + +.body-wrap pre { + background: #F8F8F8; + border: 1px dotted #ccc; + margin: 1em ; + margin-right: 0; + font-size: 12px; + line-height:14px; + padding:7px; + margin-left:0; +} +.detail-wrap{ + +} +.mdetail-head{ + margin-top:10px; +} +.mdetail{ + padding:7px; + border-top:1px dotted #ccc; +} +.mdetail h3{ + margin: 5px 0px; + font-size:14px; + color:#083772; +} +.mdetail-desc{ + margin:8px; +} +.mdetail-def{ + font-style: italic; + font-size: 12px; + margin-top:10px; + margin-left:8px; + display:block; +} +.sub-desc{ + margin:5px; + margin-left:16px; +} +.mdetail-params{ + margin-top:10px; +} +.mdetail-params strong{ + display: block; + margin-bottom:3px; + font-size:11px; + font-weight:bold; + color:#555; +} + +.mdetail-params ul{ + list-style: inside; + list-style-type: circle; + margin:12px; +} +.mdetail-params li{ + list-style: inside; + list-style-type: circle; +} +pre code{ + font-size:12px !important; + color:#000; + line-height:16px !important; +} +pre code b{ + font-weight: normal; + color: #800080; +} +pre code em{ + font-weight: normal; + color: #008080; + background-color:#eee; +} +pre code i,pre code i b,pre code i em{ + font-weight: normal; + font-style: normal; + color: #999; +} + +.body-wrap .inheritance { + margin-top:20px; + float:right; + width:210px; +} +.body-wrap .inheritance pre { + text-align:left; + border: 0 none; + margin: 0; + font-size: 11px; + line-height:18px !important; + background:transparent url(block-bottom.gif) no-repeat left bottom; + padding:0 8px 5px!important; +} + +.body-wrap .inheritance pre img { + vertical-align:middle; + margin-right:3px; +} + +.expandable .micon a { + background: transparent url(member-collapsed.gif) no-repeat 5px 6px; + cursor:pointer; +} + +.expandable td.micon:hover a { + background: transparent url(member-hover.gif) no-repeat 5px 6px; + cursor:pointer; +} +.body-wrap .member-table .expanded td.micon{ + background: #f9f9f9 url(expand-bg-over.gif) repeat-y top right; +} +.body-wrap .member-table .expanded td.micon a { + background: transparent url(member-expanded.gif) no-repeat 5px 6px; + cursor:pointer; +} + +.mdesc .long { + display:none; +} +.mdesc .long .mdetail-params { + font-size:12px; + padding-left:12px; +} +.expanded .mdesc .short { + display:none; +} + +.expanded .mdesc .long { + display: block; +} + +.full-details .expandable .micon a { + height:1px !important; + width:1px !important; + overflow:hidden; + cursor:default; +} + +.full-details .mdesc .short { + display:none !important; +} + +.full-details .mdesc .long { + display: block !important; +} + +.full-details .body-wrap .member-table .expanded td.micon{ + background: #f9f9f9 url(expand-bg.gif) repeat-y top right; +} + +div.hr { + height:1px; + background:#ccc; + margin: 5px 0; + overflow:hidden; + line-height:1px; +} + + +.expanded .mdesc .long { + line-height:18px; +} diff --git a/.svn/pristine/8a/8a2af370aa78ef204281723ab1a1164113e4b11b.svn-base b/.svn/pristine/8a/8a2af370aa78ef204281723ab1a1164113e4b11b.svn-base new file mode 100644 index 0000000..882336c --- /dev/null +++ b/.svn/pristine/8a/8a2af370aa78ef204281723ab1a1164113e4b11b.svn-base @@ -0,0 +1,38 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.event; + +import org.comet4j.core.CometConnection; +import org.comet4j.core.CometEngine; +import org.comet4j.event.Event; + +/** + * 移除连接事件对象 + */ + +public class RemovedEvent extends Event { + + private CometConnection conn; + + public RemovedEvent(CometEngine target, CometConnection aConn) { + super(target); + conn = aConn; + } + + public CometConnection getConn() { + return conn; + } + + public void setConn(CometConnection conn) { + this.conn = conn; + } + + @Override + public void destroy() { + super.destroy(); + conn = null; + } +} diff --git a/.svn/pristine/8a/8ada94cac70cccadd9db2528a12497e56211c24e.svn-base b/.svn/pristine/8a/8ada94cac70cccadd9db2528a12497e56211c24e.svn-base new file mode 100644 index 0000000..c09f82e Binary files /dev/null and b/.svn/pristine/8a/8ada94cac70cccadd9db2528a12497e56211c24e.svn-base differ diff --git a/.svn/pristine/8b/8b3d0bb4c9695d4477beccf0de117a075349fb42.svn-base b/.svn/pristine/8b/8b3d0bb4c9695d4477beccf0de117a075349fb42.svn-base new file mode 100644 index 0000000..2c63585 Binary files /dev/null and b/.svn/pristine/8b/8b3d0bb4c9695d4477beccf0de117a075349fb42.svn-base differ diff --git a/.svn/pristine/8b/8b502fb30e8b3be3866789533165a1dfd671cfef.svn-base b/.svn/pristine/8b/8b502fb30e8b3be3866789533165a1dfd671cfef.svn-base new file mode 100644 index 0000000..45db61e Binary files /dev/null and b/.svn/pristine/8b/8b502fb30e8b3be3866789533165a1dfd671cfef.svn-base differ diff --git a/.svn/pristine/8c/8c4a83d6f0f7b75fb7c8a30821e871d246ba8568.svn-base b/.svn/pristine/8c/8c4a83d6f0f7b75fb7c8a30821e871d246ba8568.svn-base new file mode 100644 index 0000000..8aa8cae Binary files /dev/null and b/.svn/pristine/8c/8c4a83d6f0f7b75fb7c8a30821e871d246ba8568.svn-base differ diff --git a/.svn/pristine/8c/8c746a1cdbd05b5fd56fbff8c6c28aa106f2d320.svn-base b/.svn/pristine/8c/8c746a1cdbd05b5fd56fbff8c6c28aa106f2d320.svn-base new file mode 100644 index 0000000..b44a820 --- /dev/null +++ b/.svn/pristine/8c/8c746a1cdbd05b5fd56fbff8c6c28aa106f2d320.svn-base @@ -0,0 +1,22 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.event; + +/** + * 拦截器接口 此接口用于向Observable中加入拦截器 (通过使用Observable的addEventInterceptor方法) + * @author xiaojinghai@kedacom.com + */ + +@SuppressWarnings("rawtypes") +public interface InterceptorInterface { + + /** + * 拦截器方法,供Observable对象addEventInterceptor方法使用。 + * @param anEvent + * @return 返回false则停止事件广播、终止动作的发生并不再执行其它拦截器方法,否则继续执行。 + */ + public boolean intercept(E anEvent); +} diff --git a/.svn/pristine/8d/8d52a128d450f77c4fae8761ebf590ec3f727ef4.svn-base b/.svn/pristine/8d/8d52a128d450f77c4fae8761ebf590ec3f727ef4.svn-base new file mode 100644 index 0000000..2aeeca1 --- /dev/null +++ b/.svn/pristine/8d/8d52a128d450f77c4fae8761ebf590ec3f727ef4.svn-base @@ -0,0 +1,25 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.exception; + +/** + * 重复的应用通道标识 + */ + +public class DoubleAppModuleKeyException extends CometException { + + /** serialVersionUID */ + private static final long serialVersionUID = -679462669681889902L; + + /** + * @param message + */ + + public DoubleAppModuleKeyException(String message) { + super(message); + } + +} diff --git a/.svn/pristine/8e/8e608f32477f2c41ff5ed90bd387edf51f855f20.svn-base b/.svn/pristine/8e/8e608f32477f2c41ff5ed90bd387edf51f855f20.svn-base new file mode 100644 index 0000000..ab8b382 --- /dev/null +++ b/.svn/pristine/8e/8e608f32477f2c41ff5ed90bd387edf51f855f20.svn-base @@ -0,0 +1,12 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.event.demo.mac; + +public class PersonEventSubType { + + public static final SubEventType BEFORESAY = new SubEventType(); + public static final SubEventType BEFOREGO = new SubEventType(); +} diff --git a/.svn/pristine/8e/8e80a8315d871189cf869d9972e290dd8eaa5b3d.svn-base b/.svn/pristine/8e/8e80a8315d871189cf869d9972e290dd8eaa5b3d.svn-base new file mode 100644 index 0000000..3657734 --- /dev/null +++ b/.svn/pristine/8e/8e80a8315d871189cf869d9972e290dd8eaa5b3d.svn-base @@ -0,0 +1,29 @@ +/** + * @(#)BeforeRemoveEventListener.java 2011-3-9 Copyright 2011 it.kedacom.com, + * Inc. All rights reserved. + */ + +package org.comet4j.demo.eventmonitor; + +import org.comet4j.core.event.BeforeRemoveEvent; +import org.comet4j.core.listener.BeforeRemoveListener; + +/** + * (用一句话描述类的主要功能) + * @author xiaojinghai + * @date 2011-3-9 + */ + +public class BeforeRemoveEventListener extends BeforeRemoveListener { + + /* + * (non-Jsdoc) + * @see org.comet4j.event.Listener#handleEvent(org.comet4j.event.Event) + */ + @Override + public boolean handleEvent(BeforeRemoveEvent anEvent) { + System.out.println("[BeforeRemoveEvent]:cId=" + anEvent.getConn().getId()); + return true; + } + +} diff --git a/.svn/pristine/8e/8eab16098db589a852c01ce13b32b136e727ab10.svn-base b/.svn/pristine/8e/8eab16098db589a852c01ce13b32b136e727ab10.svn-base new file mode 100644 index 0000000..22d4bba Binary files /dev/null and b/.svn/pristine/8e/8eab16098db589a852c01ce13b32b136e727ab10.svn-base differ diff --git a/.svn/pristine/8e/8ece0b42fe616325ec3910ca346b6663f9f37ef0.svn-base b/.svn/pristine/8e/8ece0b42fe616325ec3910ca346b6663f9f37ef0.svn-base new file mode 100644 index 0000000..e695186 Binary files /dev/null and b/.svn/pristine/8e/8ece0b42fe616325ec3910ca346b6663f9f37ef0.svn-base differ diff --git a/.svn/pristine/8f/8f0626925774c7861cd55ed76dd5e69594977bbe.svn-base b/.svn/pristine/8f/8f0626925774c7861cd55ed76dd5e69594977bbe.svn-base new file mode 100644 index 0000000..3ea5cae Binary files /dev/null and b/.svn/pristine/8f/8f0626925774c7861cd55ed76dd5e69594977bbe.svn-base differ diff --git a/.svn/pristine/8f/8f2720f00b778e3a20eb08af012dda8c95dd3e51.svn-base b/.svn/pristine/8f/8f2720f00b778e3a20eb08af012dda8c95dd3e51.svn-base new file mode 100644 index 0000000..e6b8da2 Binary files /dev/null and b/.svn/pristine/8f/8f2720f00b778e3a20eb08af012dda8c95dd3e51.svn-base differ diff --git a/.svn/pristine/8f/8f4e58a05096a57cdd53024fbcdd423488cfd736.svn-base b/.svn/pristine/8f/8f4e58a05096a57cdd53024fbcdd423488cfd736.svn-base new file mode 100644 index 0000000..8e6c14c --- /dev/null +++ b/.svn/pristine/8f/8f4e58a05096a57cdd53024fbcdd423488cfd736.svn-base @@ -0,0 +1,37 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.demo.talker; + +import org.comet4j.core.CometConnection; +import org.comet4j.core.event.DropEvent; +import org.comet4j.core.listener.DropListener; +import org.comet4j.demo.talker.dto.LeftDTO; + +/** + * 下线侦听 + * @author jinghai.xiao@gmail.com + * @date 2011-3-3 + */ + +public class LeftListener extends DropListener { + + /* + * (non-Jsdoc) + * @see org.comet4j.event.Listener#handleEvent(org.comet4j.event.Event) + */ + @Override + public boolean handleEvent(DropEvent anEvent) { + CometConnection conn = anEvent.getConn(); + if (conn != null) { + String userName = AppStore.getInstance().get(conn.getId()); + LeftDTO dto = new LeftDTO(conn.getId(), userName); + AppStore.getInstance().getMap().remove(conn.getId()); + anEvent.getTarget().sendToAll(Constant.APP_CHANNEL, dto); + } + return true; + } + +} diff --git a/.svn/pristine/91/91c9911efaf268ddf1beb2266e4c3e65eb823846.svn-base b/.svn/pristine/91/91c9911efaf268ddf1beb2266e4c3e65eb823846.svn-base new file mode 100644 index 0000000..af74265 Binary files /dev/null and b/.svn/pristine/91/91c9911efaf268ddf1beb2266e4c3e65eb823846.svn-base differ diff --git a/.svn/pristine/91/91ced1b380221363ab54eb0ab3dd0460cef94bca.svn-base b/.svn/pristine/91/91ced1b380221363ab54eb0ab3dd0460cef94bca.svn-base new file mode 100644 index 0000000..4e4f60c --- /dev/null +++ b/.svn/pristine/91/91ced1b380221363ab54eb0ab3dd0460cef94bca.svn-base @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/.svn/pristine/91/91ef4f23d1e780b65808e6c1df8f3cbe01e9730d.svn-base b/.svn/pristine/91/91ef4f23d1e780b65808e6c1df8f3cbe01e9730d.svn-base new file mode 100644 index 0000000..acf68fc --- /dev/null +++ b/.svn/pristine/91/91ef4f23d1e780b65808e6c1df8f3cbe01e9730d.svn-base @@ -0,0 +1,326 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +import javax.servlet.ServletContext; +import javax.servlet.ServletContextEvent; + +import org.comet4j.core.event.CometContextEvent; +import org.comet4j.core.exception.DoubleAppModuleKeyException; +import org.comet4j.core.listener.CometContextListener; +import org.comet4j.event.Observable; + +/** + * Comet4J上下文,负责初始化配置、引擎对象、连接器对象、消息缓存等。 + */ + +public class CometContext extends Observable { + + public final String version = "0.1.1"; + + /** + * 语言参数是一个有效的 ISO 语言代码。这些代码是由 ISO-639 定义的小写两字母代码。在许多网站上都可以找到这些代码的完整列表,如: + * http://www.loc.gov/standards/iso639-2/englangn.html。 目前可设置zh和en两种 + */ + private Locale locale = Locale.CHINESE; + + private String workStyle = CometProtocol.WORKSTYLE_AUTO; + + private CometEngine engine; + + private List appModules = new ArrayList(); + + private int timeout = 60000; + + private int cacheExpires = 60000; + + private int cacheFrequency = 60000; + + private int connExpires = 5000; + + private int connFrequency = 5000; + + private boolean debug = false; + + private boolean init = false; + + private ServletContext servletContext; + + private static CometContext instance; + + public void init(ServletContextEvent event) { + if (init) { + return; + } + servletContext = event.getServletContext(); + loadConfig(servletContext); + init = true; + CometContextEvent e = new CometContextEvent(this, CometContextEvent.INITIALIZED); + e.setCometContext(this); + e.setServletContext(event.getServletContext()); + this.fireEvent(e); + log("Comet4J v" + version + " " + Language.get("InitComplete")); + } + + public static CometContext getInstance() { + if (instance == null) { + instance = new CometContext(); + } + return instance; + } + + public void log(String str) { + if (debug) { + instance.servletContext.log(str); + } + } + + public void log(String str, Throwable trb) { + if (debug) { + instance.servletContext.log(str, trb); + } + } + + public Object createInstance(String className) throws InstantiationException, IllegalAccessException, + ClassNotFoundException { + Object obj; + obj = Class.forName(className).newInstance(); + return obj; + } + + // Singleton + private CometContext() { + super(); + this.addEvent(CometContextEvent.class); + } + + private void loadConfig(ServletContext ct) { + + String workStyleStr = ct.getInitParameter(CometProtocol.CONFIG_WORKSTYLE); + if (workStyleStr != null && !"".equals(workStyleStr.trim())) { + if (CometProtocol.WORKSTYLE_AUTO.equals(workStyleStr) || CometProtocol.WORKSTYLE_LLOOP.equals(workStyleStr) + || CometProtocol.WORKSTYLE_STREAM.equals(workStyleStr)) { + workStyle = workStyleStr; + } + } + String timeoutStr = ct.getInitParameter(CometProtocol.CONFIG_TIMEOUT); + if (timeoutStr != null && !"".equals(timeoutStr.trim())) { + try { + timeout = Integer.valueOf(timeoutStr); + } catch (Exception e) { + log("配置错误", e); + // 忽略非法数值 + } + } + String cacheExpiresStr = ct.getInitParameter(CometProtocol.CONFIG_CACHEEXPIRES); + if (cacheExpiresStr != null && !"".equals(cacheExpiresStr.trim())) { + try { + cacheExpires = Integer.valueOf(cacheExpiresStr); + } catch (Exception e) { + log("配置错误", e); + // 忽略非法数值 + } + } + String cacheFrequencyStr = ct.getInitParameter(CometProtocol.CONFIG_CACHEFREQUENCY); + if (cacheFrequencyStr != null && !"".equals(cacheFrequencyStr.trim())) { + try { + cacheFrequency = Integer.valueOf(cacheFrequencyStr); + } catch (Exception e) { + log("配置错误", e); + // 忽略非法数值 + } + } + String connExpiresStr = ct.getInitParameter(CometProtocol.CONFIG_CONNEXPIRES); + if (connExpiresStr != null && !"".equals(connExpiresStr.trim())) { + try { + connExpires = Integer.valueOf(connExpiresStr); + } catch (Exception e) { + log("配置错误", e); + // 忽略非法数值 + } + } + String connFrequencyStr = ct.getInitParameter(CometProtocol.CONFIG_CONNFREQUENCY); + if (connFrequencyStr != null && !"".equals(connFrequencyStr.trim())) { + try { + connFrequency = Integer.valueOf(connFrequencyStr); + } catch (Exception e) { + log("配置错误", e); + // 忽略非法数值 + } + } + String debugStr = ct.getInitParameter(CometProtocol.CONFIG_DEBUG); + if (debugStr != null && "true".equals(debugStr.trim())) { + debug = true; + } + + String languageStr = ct.getInitParameter(CometProtocol.CONFIG_LANGUAGE); + if (languageStr != null && !"".equals(languageStr.trim())) { + if (Locale.ENGLISH.getLanguage().equals(languageStr)) { + locale = Locale.ENGLISH; + } + } + + String engineStr = ct.getInitParameter(CometProtocol.CONFIG_ENGINE); + if (engineStr != null && !"".equals(engineStr.trim())) { + try { + engine = (CometEngine) createInstance(engineStr); + } catch (Exception e) { + log("配置错误", e); + engine = new CometEngine(); + } + + } else { + engine = new CometEngine(); + } + + } + + /** + * 获得Comet4J 服务器端版 + * @return + */ + + public String getVersion() { + return version; + } + + /** + * 工作方式 loop,stream,auto(在前两者间自动选择) + * @return + */ + public String getWorkStyle() { + return workStyle; + } + + /** + * 获得引擎对象 + * @return + */ + + public CometEngine getEngine() { + return engine; + } + + /** + * 连接超时时间(连接一次请求所能在服务器端保持的最大时间,默认1分钟) + * @return + */ + public int getTimeout() { + return timeout; + } + + /** + * 缓存信息过期时间(默认1小时) + * @return + */ + public int getCacheExpires() { + return cacheExpires; + } + + /** + * 连接过期时间(连接由于异常状况处于濒死状态到宣布死亡的时间段,默认5秒) + * @return + */ + public int getConnExpires() { + return connExpires; + } + + /** + * 是否运行在调试模式 + * @return + */ + + public boolean isDebug() { + return debug; + } + + /** + * Comet4J是否已初始化完毕 + * @return + */ + + public boolean isInit() { + return init; + } + + /** + * 获得本地化标识 + * @return + */ + + public Locale getLocale() { + return locale; + } + + /** + * 获得上下文容器实例 + * @return + */ + + public ServletContext getServletContext() { + return servletContext; + } + + /** + * 缓存信息过期检查频率/微妙[默认:60000,1分种] + * @return + */ + + public int getCacheFrequency() { + return cacheFrequency; + } + + /** + * 连接检查频率/微妙[默认:5000,5秒] + * @return + */ + + public int getConnFrequency() { + return connFrequency; + } + + /** + * 得到已注册的通道列表 + * @return List + */ + public List getAppModules() { + List list = new ArrayList(); + for (int i = 0; i < appModules.size(); i++) { + String key = appModules.get(i); + list.add(key); + } + return list; + } + + /** + * 注册一个应用模块标识 + * @param anAppModule 模块标识 + */ + + public void registChannel(String anAppModule) { + if (appModules.contains(anAppModule)) { + throw new DoubleAppModuleKeyException(Language.get("DoubleAppModuleKey")); + } + appModules.add(anAppModule); + } + + @Override + public void destroy() { + appModules.clear(); + appModules = null; + engine.destroy(); + engine = null; + servletContext = null; + instance = null; + CometContextEvent e = new CometContextEvent(this, CometContextEvent.DESTROYED); + this.fireEvent(e); + } + +} diff --git a/.svn/pristine/92/925d0bc83a1af9fb25687cb6e2f9782692a0d5fe.svn-base b/.svn/pristine/92/925d0bc83a1af9fb25687cb6e2f9782692a0d5fe.svn-base new file mode 100644 index 0000000..a5db8b0 --- /dev/null +++ b/.svn/pristine/92/925d0bc83a1af9fb25687cb6e2f9782692a0d5fe.svn-base @@ -0,0 +1,32 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.interfaces; + +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.comet4j.core.CometConnection; + +public interface CometEngineInterfaces { + + // public ServerInfoDTO getServerInfo(HttpServletRequest request, + // HttpServletResponse response); + public void connect(HttpServletRequest request, HttpServletResponse response); + + public void revival(HttpServletRequest request, HttpServletResponse response); + + public void drop(HttpServletRequest request, HttpServletResponse response); + + public void timeout(HttpServletRequest request, HttpServletResponse response); + + public List getConnections(); + + public void send(String id); + + public void publish(String id); +} diff --git a/.svn/pristine/92/92c599046e33bdbc0cf235237a67b7ea243ab00e.svn-base b/.svn/pristine/92/92c599046e33bdbc0cf235237a67b7ea243ab00e.svn-base new file mode 100644 index 0000000..f9c07af Binary files /dev/null and b/.svn/pristine/92/92c599046e33bdbc0cf235237a67b7ea243ab00e.svn-base differ diff --git a/.svn/pristine/93/93220bdb74961f63f866382c78498d5a943988cf.svn-base b/.svn/pristine/93/93220bdb74961f63f866382c78498d5a943988cf.svn-base new file mode 100644 index 0000000..e3701a3 Binary files /dev/null and b/.svn/pristine/93/93220bdb74961f63f866382c78498d5a943988cf.svn-base differ diff --git a/.svn/pristine/93/935adb5889ea0082be8f8cd5122b930c957f7c2b.svn-base b/.svn/pristine/93/935adb5889ea0082be8f8cd5122b930c957f7c2b.svn-base new file mode 100644 index 0000000..d1daef5 Binary files /dev/null and b/.svn/pristine/93/935adb5889ea0082be8f8cd5122b930c957f7c2b.svn-base differ diff --git a/.svn/pristine/94/942d8fe092c1c473af19906751c2bee5322a9b55.svn-base b/.svn/pristine/94/942d8fe092c1c473af19906751c2bee5322a9b55.svn-base new file mode 100644 index 0000000..e846e1d Binary files /dev/null and b/.svn/pristine/94/942d8fe092c1c473af19906751c2bee5322a9b55.svn-base differ diff --git a/.svn/pristine/95/95917df9e2d62bb21d7d290576bfdef8fc177d90.svn-base b/.svn/pristine/95/95917df9e2d62bb21d7d290576bfdef8fc177d90.svn-base new file mode 100644 index 0000000..4969e4e Binary files /dev/null and b/.svn/pristine/95/95917df9e2d62bb21d7d290576bfdef8fc177d90.svn-base differ diff --git a/.svn/pristine/96/9660f927924cd47a6a1a571ef4e73ddeb29c2a74.svn-base b/.svn/pristine/96/9660f927924cd47a6a1a571ef4e73ddeb29c2a74.svn-base new file mode 100644 index 0000000..58281c3 Binary files /dev/null and b/.svn/pristine/96/9660f927924cd47a6a1a571ef4e73ddeb29c2a74.svn-base differ diff --git a/.svn/pristine/97/97a9220a6840a10bc9ff7c9e402db61b7edde581.svn-base b/.svn/pristine/97/97a9220a6840a10bc9ff7c9e402db61b7edde581.svn-base new file mode 100644 index 0000000..a739234 Binary files /dev/null and b/.svn/pristine/97/97a9220a6840a10bc9ff7c9e402db61b7edde581.svn-base differ diff --git a/.svn/pristine/97/97f802a5f05e56e5816db837570496ee2eaa6294.svn-base b/.svn/pristine/97/97f802a5f05e56e5816db837570496ee2eaa6294.svn-base new file mode 100644 index 0000000..0f1ed75 --- /dev/null +++ b/.svn/pristine/97/97f802a5f05e56e5816db837570496ee2eaa6294.svn-base @@ -0,0 +1 @@ +.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun{color:#660}.pln{color:#000}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec{color:#606}pre.prettyprint{padding:2px;border:1px solid #888}@media print{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun{color:#440}.pln{color:#000}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}} \ No newline at end of file diff --git a/.svn/pristine/98/98f5eda7d7bc35542b3f08a3ed242c77159ba133.svn-base b/.svn/pristine/98/98f5eda7d7bc35542b3f08a3ed242c77159ba133.svn-base new file mode 100644 index 0000000..07a6862 Binary files /dev/null and b/.svn/pristine/98/98f5eda7d7bc35542b3f08a3ed242c77159ba133.svn-base differ diff --git a/.svn/pristine/99/9916f7ee5e9991197592bd7bdf020c9c16ce77f6.svn-base b/.svn/pristine/99/9916f7ee5e9991197592bd7bdf020c9c16ce77f6.svn-base new file mode 100644 index 0000000..3bbf639 Binary files /dev/null and b/.svn/pristine/99/9916f7ee5e9991197592bd7bdf020c9c16ce77f6.svn-base differ diff --git a/.svn/pristine/99/99ba522f4122493e1ec09b5d64d7d54118b2aeea.svn-base b/.svn/pristine/99/99ba522f4122493e1ec09b5d64d7d54118b2aeea.svn-base new file mode 100644 index 0000000..16bce1d Binary files /dev/null and b/.svn/pristine/99/99ba522f4122493e1ec09b5d64d7d54118b2aeea.svn-base differ diff --git a/.svn/pristine/9a/9a7cf4398478adf41c73bb7e7f71cf459c00943a.svn-base b/.svn/pristine/9a/9a7cf4398478adf41c73bb7e7f71cf459c00943a.svn-base new file mode 100644 index 0000000..141b0c0 --- /dev/null +++ b/.svn/pristine/9a/9a7cf4398478adf41c73bb7e7f71cf459c00943a.svn-base @@ -0,0 +1,189 @@ + + + + +连接器测试 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
连接器测试 
 
XMLHttpRequest onReadyStateChange Event :
+
+
Connector Events :
+
+
测试指导:
[1].测试无信息接收连接的状态是否稳定。
+ [2].测试有信息接收连接的状态是否稳定。
[3].正在连接时断开连接,尝试是否可以再次连接。
+ [4].正在连接时服务器突然停止,连接是否会自动停止。
+ + + diff --git a/.svn/pristine/9a/9aea9de63edcd8fada6de9a1121331d8bbc75233.svn-base b/.svn/pristine/9a/9aea9de63edcd8fada6de9a1121331d8bbc75233.svn-base new file mode 100644 index 0000000..77ab9da Binary files /dev/null and b/.svn/pristine/9a/9aea9de63edcd8fada6de9a1121331d8bbc75233.svn-base differ diff --git a/.svn/pristine/9b/9b1611918e00eeb2f4ac2d945dfad31109806c7e.svn-base b/.svn/pristine/9b/9b1611918e00eeb2f4ac2d945dfad31109806c7e.svn-base new file mode 100644 index 0000000..8697067 Binary files /dev/null and b/.svn/pristine/9b/9b1611918e00eeb2f4ac2d945dfad31109806c7e.svn-base differ diff --git a/.svn/pristine/9b/9b38a4682b7c101845ebbab3c739e665d7d61219.svn-base b/.svn/pristine/9b/9b38a4682b7c101845ebbab3c739e665d7d61219.svn-base new file mode 100644 index 0000000..d7be8dc --- /dev/null +++ b/.svn/pristine/9b/9b38a4682b7c101845ebbab3c739e665d7d61219.svn-base @@ -0,0 +1,28 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.event; + +import org.comet4j.core.CometEngine; +import org.comet4j.event.Event; + +public class ErrorEvent extends Event { + + private Exception err; + + public ErrorEvent(CometEngine target, Exception anErr) { + super(target); + err = anErr; + } + + public Exception getErr() { + return err; + } + + public void setErr(Exception err) { + this.err = err; + } + +} diff --git a/.svn/pristine/9b/9b4efec454ee62fee9c5bfcc716123cbd1f339f6.svn-base b/.svn/pristine/9b/9b4efec454ee62fee9c5bfcc716123cbd1f339f6.svn-base new file mode 100644 index 0000000..397b655 Binary files /dev/null and b/.svn/pristine/9b/9b4efec454ee62fee9c5bfcc716123cbd1f339f6.svn-base differ diff --git a/.svn/pristine/9e/9e6f5821e9ecfeb7a1a299fff48ca3107a4beab0.svn-base b/.svn/pristine/9e/9e6f5821e9ecfeb7a1a299fff48ca3107a4beab0.svn-base new file mode 100644 index 0000000..63039d9 Binary files /dev/null and b/.svn/pristine/9e/9e6f5821e9ecfeb7a1a299fff48ca3107a4beab0.svn-base differ diff --git a/.svn/pristine/9f/9f03e5fc6b1bea67d8017fb5c17056318c938389.svn-base b/.svn/pristine/9f/9f03e5fc6b1bea67d8017fb5c17056318c938389.svn-base new file mode 100644 index 0000000..15b901a --- /dev/null +++ b/.svn/pristine/9f/9f03e5fc6b1bea67d8017fb5c17056318c938389.svn-base @@ -0,0 +1,6 @@ +package org.comet4j.demo.requestmonitor; + +public class Constant { + + public static final String AppChannel = "rmonitor"; +} diff --git a/.svn/pristine/9f/9f8e529ab913563a27dd3389fec1dfd072fe0433.svn-base b/.svn/pristine/9f/9f8e529ab913563a27dd3389fec1dfd072fe0433.svn-base new file mode 100644 index 0000000..75c0eba Binary files /dev/null and b/.svn/pristine/9f/9f8e529ab913563a27dd3389fec1dfd072fe0433.svn-base differ diff --git a/.svn/pristine/a0/a0b665293a475ed562cdc6dca689da7d30ee9366.svn-base b/.svn/pristine/a0/a0b665293a475ed562cdc6dca689da7d30ee9366.svn-base new file mode 100644 index 0000000..d1c7b46 --- /dev/null +++ b/.svn/pristine/a0/a0b665293a475ed562cdc6dca689da7d30ee9366.svn-base @@ -0,0 +1,34 @@ +.pkg h3 { + padding-left:34px; + font:normal 11px verdana,helvetica,tahoma,sans-serif; + height:18px; + cursor:pointer; +} +h3.collapser-expanded{ + background: #fff url(pkg-open.gif) no-repeat 0px -1px; +} +h3.collapser-collapsed { + background: #fff url(pkg-closed.gif) no-repeat 0px -1px; +} +.pkg-body{ + margin-left:16px; + font:normal 11px verdana,helvetica,tahoma,sans-serif; +} +#classes a{ + font:normal 11px verdana,helvetica,tahoma,sans-serif; + display:block; + text-decoration:none; + height:18px; + color:black; + background: #fff url(class.gif) no-repeat 16px -1px; + padding-left:34px; + -moz-outline:none; + outline:none; + white-space: nowrap; +} +#classes a:hover{ + text-decoration: underline; +} +#classes a.ex{ + background: #fff url(example.gif) no-repeat 16px -1px; +} \ No newline at end of file diff --git a/.svn/pristine/a1/a1d1b55ea970f033dcfc54861d307ef163839cb9.svn-base b/.svn/pristine/a1/a1d1b55ea970f033dcfc54861d307ef163839cb9.svn-base new file mode 100644 index 0000000..f490c5e Binary files /dev/null and b/.svn/pristine/a1/a1d1b55ea970f033dcfc54861d307ef163839cb9.svn-base differ diff --git a/.svn/pristine/a2/a2a8aef85c948f240b2af7f22ccd844d03ba6765.svn-base b/.svn/pristine/a2/a2a8aef85c948f240b2af7f22ccd844d03ba6765.svn-base new file mode 100644 index 0000000..3df5c2b Binary files /dev/null and b/.svn/pristine/a2/a2a8aef85c948f240b2af7f22ccd844d03ba6765.svn-base differ diff --git a/.svn/pristine/a3/a3be76926208ebcca00f0e749706e8e16753aed3.svn-base b/.svn/pristine/a3/a3be76926208ebcca00f0e749706e8e16753aed3.svn-base new file mode 100644 index 0000000..78a6d08 --- /dev/null +++ b/.svn/pristine/a3/a3be76926208ebcca00f0e749706e8e16753aed3.svn-base @@ -0,0 +1,110 @@ + + + + +消息引擎测试 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
消息引擎 
  +
JS.Engine Events :
+
+
测试指导:
+
+ + + diff --git a/.svn/pristine/a3/a3c02269fb79ef8085bbbb8e5b675618757e447d.svn-base b/.svn/pristine/a3/a3c02269fb79ef8085bbbb8e5b675618757e447d.svn-base new file mode 100644 index 0000000..c9eed13 --- /dev/null +++ b/.svn/pristine/a3/a3c02269fb79ef8085bbbb8e5b675618757e447d.svn-base @@ -0,0 +1,120 @@ + + + + + Comet4J-Demo + + index.html + + + air + application/air + + + 编码过滤 + encodingfilter + org.comet4j.core.util.CharacterEncodingFilter + true + + encoding + utf-8 + + + + encodingfilter + /* + + + + + monitoring + net.bull.javamelody.MonitoringFilter + true + + + monitoring + /* + + + net.bull.javamelody.SessionListener + + + + + Comet4J容器侦听 + org.comet4j.core.CometAppListener + + + Comet连接 + CometServlet + CometServlet + org.comet4j.core.CometServletTomcat7 + true + + + CometServlet + /conn + + + + 语言[支持:zh,en,默认:zh,详细http://www.loc.gov/standards/iso639-2/php/English_list.php] + Comet.Language + zh + + + 请求超时时间/微妙[默认:60000,1分钟,建议至少设置3秒以上] + Comet.Timeout + 5000 + + + 连接空闲过期时间/微妙[默认:5000,5秒] + Comet.ConnExpires + 5000 + + + 连接检查频率/微妙[默认:5000,5秒] + Comet.ConnFrequency + 5000 + + + 缓存信息过期时间/微妙[默认:60000,1分种] + Comet.CacheExpires + 600000 + + + 缓存信息过期检查频率/微妙[默认:60000,1分种] + Comet.CacheFrequency + 60000 + + + 连接模式[auto(默认)/stream/lpool] + Comet.WorkStyle + auto + + + 开启调试[false(默认)/true] + Comet.Debug + false + + + + + + 简易聊天 + org.comet4j.demo.talker.AppInit + + + 简易聊天 + talk + talk + org.comet4j.demo.talker.WebServlet + + + talk + /talk.do + + + \ No newline at end of file diff --git a/.svn/pristine/a4/a477c32c263cb95f74af484c271dc408d9abfc65.svn-base b/.svn/pristine/a4/a477c32c263cb95f74af484c271dc408d9abfc65.svn-base new file mode 100644 index 0000000..7de30a5 --- /dev/null +++ b/.svn/pristine/a4/a477c32c263cb95f74af484c271dc408d9abfc65.svn-base @@ -0,0 +1,42 @@ + + + comet4j-demo + + + + + + org.eclipse.wst.jsdt.core.javascriptValidator + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + org.maven.ide.eclipse.maven2Builder + + + + + + org.maven.ide.eclipse.maven2Nature + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.wst.common.project.facet.core.nature + org.eclipse.jdt.core.javanature + org.eclipse.wst.jsdt.core.jsNature + + diff --git a/.svn/pristine/a4/a4dc8f677a6abebd7c0c4db0953d062a7bfaf189.svn-base b/.svn/pristine/a4/a4dc8f677a6abebd7c0c4db0953d062a7bfaf189.svn-base new file mode 100644 index 0000000..4eb5f0f Binary files /dev/null and b/.svn/pristine/a4/a4dc8f677a6abebd7c0c4db0953d062a7bfaf189.svn-base differ diff --git a/.svn/pristine/a6/a616889b06253218ab005d68b6ab594ccbdc3ba2.svn-base b/.svn/pristine/a6/a616889b06253218ab005d68b6ab594ccbdc3ba2.svn-base new file mode 100644 index 0000000..da78d45 Binary files /dev/null and b/.svn/pristine/a6/a616889b06253218ab005d68b6ab594ccbdc3ba2.svn-base differ diff --git a/.svn/pristine/a6/a62484058357624c7c15bc4c63a9e5beb4f9a285.svn-base b/.svn/pristine/a6/a62484058357624c7c15bc4c63a9e5beb4f9a285.svn-base new file mode 100644 index 0000000..862094e Binary files /dev/null and b/.svn/pristine/a6/a62484058357624c7c15bc4c63a9e5beb4f9a285.svn-base differ diff --git a/.svn/pristine/a6/a6de8593107dc6bafbec091798bb0645a7d9a094.svn-base b/.svn/pristine/a6/a6de8593107dc6bafbec091798bb0645a7d9a094.svn-base new file mode 100644 index 0000000..5adc4f8 --- /dev/null +++ b/.svn/pristine/a6/a6de8593107dc6bafbec091798bb0645a7d9a094.svn-base @@ -0,0 +1,55 @@ + + + 4.0.0 + + comet4j + org.comet4j + comet4j + + 0.1.8-SNAPSHOT + jar + + + true + + + + src + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.6 + 1.6 + UTF-8 + + + + + + + + javax.servlet + servlet-api + 2.5 + provided + + + org.apache.tomcat + catalina + 6.0.35 + provided + + + + + + mvnrepository + mvnrepository + http://mvnrepository.com/artifact + + + + diff --git a/.svn/pristine/a7/a762d375660eb903de307efe0ee2244cfcbdf45e.svn-base b/.svn/pristine/a7/a762d375660eb903de307efe0ee2244cfcbdf45e.svn-base new file mode 100644 index 0000000..9dd5df3 Binary files /dev/null and b/.svn/pristine/a7/a762d375660eb903de307efe0ee2244cfcbdf45e.svn-base differ diff --git a/.svn/pristine/a7/a797e5a37285e8a5df5fc155bd86b1bafc2f713a.svn-base b/.svn/pristine/a7/a797e5a37285e8a5df5fc155bd86b1bafc2f713a.svn-base new file mode 100644 index 0000000..8917e0e Binary files /dev/null and b/.svn/pristine/a7/a797e5a37285e8a5df5fc155bd86b1bafc2f713a.svn-base differ diff --git a/.svn/pristine/a8/a83f08b232bc764f759b739236656e144ed99410.svn-base b/.svn/pristine/a8/a83f08b232bc764f759b739236656e144ed99410.svn-base new file mode 100644 index 0000000..5eaba1e Binary files /dev/null and b/.svn/pristine/a8/a83f08b232bc764f759b739236656e144ed99410.svn-base differ diff --git a/.svn/pristine/a8/a857b4ee92a8c41ceebe5f43f1e26ffe67e09c50.svn-base b/.svn/pristine/a8/a857b4ee92a8c41ceebe5f43f1e26ffe67e09c50.svn-base new file mode 100644 index 0000000..c54c9b5 --- /dev/null +++ b/.svn/pristine/a8/a857b4ee92a8c41ceebe5f43f1e26ffe67e09c50.svn-base @@ -0,0 +1,29 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.util; + +import javax.servlet.http.HttpServletRequest; + +/** + * 网络工具类 + */ + +public class NetUtil { + + public static String getIpAddr(HttpServletRequest request) { + String ip = request.getHeader("x-forwarded-for"); + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("WL-Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + } + return ip; + } +} diff --git a/.svn/pristine/a9/a9f42de5b1f735b0c3787e07555ad9d9c0bbe85e.svn-base b/.svn/pristine/a9/a9f42de5b1f735b0c3787e07555ad9d9c0bbe85e.svn-base new file mode 100644 index 0000000..65ba0a8 --- /dev/null +++ b/.svn/pristine/a9/a9f42de5b1f735b0c3787e07555ad9d9c0bbe85e.svn-base @@ -0,0 +1,13 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.event; + +/** + * 子事件 + */ + +public class SubEvent { +} diff --git a/.svn/pristine/aa/aa094a335beed3f65ee720c608df0227f5dda00d.svn-base b/.svn/pristine/aa/aa094a335beed3f65ee720c608df0227f5dda00d.svn-base new file mode 100644 index 0000000..a6b95a6 --- /dev/null +++ b/.svn/pristine/aa/aa094a335beed3f65ee720c608df0227f5dda00d.svn-base @@ -0,0 +1,23 @@ + + + comet4j-jar + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.maven.ide.eclipse.maven2Builder + + + + + + org.maven.ide.eclipse.maven2Nature + org.eclipse.jdt.core.javanature + + diff --git a/.svn/pristine/aa/aa24a1f36b4fe7069ae97bd9c42db5f3310dd7f6.svn-base b/.svn/pristine/aa/aa24a1f36b4fe7069ae97bd9c42db5f3310dd7f6.svn-base new file mode 100644 index 0000000..c76a16e Binary files /dev/null and b/.svn/pristine/aa/aa24a1f36b4fe7069ae97bd9c42db5f3310dd7f6.svn-base differ diff --git a/.svn/pristine/ab/ab81c82d7030f5c3b403428a19024fee9f920225.svn-base b/.svn/pristine/ab/ab81c82d7030f5c3b403428a19024fee9f920225.svn-base new file mode 100644 index 0000000..99aa326 --- /dev/null +++ b/.svn/pristine/ab/ab81c82d7030f5c3b403428a19024fee9f920225.svn-base @@ -0,0 +1,42 @@ +// Very simple plugin for adding a close context menu to tabs +Ext.ux.TabCloseMenu = function(){ + var tabs, menu, ctxItem; + this.init = function(tp){ + tabs = tp; + tabs.on('contextmenu', onContextMenu); + } + + function onContextMenu(ts, item, e){ + if(!menu){ // create context menu on first right click + menu = new Ext.menu.Menu([{ + id: tabs.id + '-close', + text: 'Close Tab', + handler : function(){ + tabs.remove(ctxItem); + } + },{ + id: tabs.id + '-close-others', + text: 'Close Other Tabs', + handler : function(){ + tabs.items.each(function(item){ + if(item.closable && item != ctxItem){ + tabs.remove(item); + } + }); + } + }]); + } + ctxItem = item; + var items = menu.items; + items.get(tabs.id + '-close').setDisabled(!item.closable); + var disableOthers = true; + tabs.items.each(function(){ + if(this != item && this.closable){ + disableOthers = false; + return false; + } + }); + items.get(tabs.id + '-close-others').setDisabled(disableOthers); + menu.showAt(e.getPoint()); + } +}; \ No newline at end of file diff --git a/.svn/pristine/ab/ab855c96778a3212858089baacda447759a95292.svn-base b/.svn/pristine/ab/ab855c96778a3212858089baacda447759a95292.svn-base new file mode 100644 index 0000000..1e37562 Binary files /dev/null and b/.svn/pristine/ab/ab855c96778a3212858089baacda447759a95292.svn-base differ diff --git a/.svn/pristine/ab/aba1d46d177bd54bbbf3a51a5b06075a75273b6e.svn-base b/.svn/pristine/ab/aba1d46d177bd54bbbf3a51a5b06075a75273b6e.svn-base new file mode 100644 index 0000000..b36b555 Binary files /dev/null and b/.svn/pristine/ab/aba1d46d177bd54bbbf3a51a5b06075a75273b6e.svn-base differ diff --git a/.svn/pristine/ae/aeb5fbaa988900672baf4d38325197212b2fe168.svn-base b/.svn/pristine/ae/aeb5fbaa988900672baf4d38325197212b2fe168.svn-base new file mode 100644 index 0000000..04e5ecf Binary files /dev/null and b/.svn/pristine/ae/aeb5fbaa988900672baf4d38325197212b2fe168.svn-base differ diff --git a/.svn/pristine/b0/b0c2cc0034a3fda3697b37f0e491b9a8deee54dd.svn-base b/.svn/pristine/b0/b0c2cc0034a3fda3697b37f0e491b9a8deee54dd.svn-base new file mode 100644 index 0000000..fb7e0f3 Binary files /dev/null and b/.svn/pristine/b0/b0c2cc0034a3fda3697b37f0e491b9a8deee54dd.svn-base differ diff --git a/.svn/pristine/b0/b0d06b0963ce73bed3d84a72518cd6535c73f418.svn-base b/.svn/pristine/b0/b0d06b0963ce73bed3d84a72518cd6535c73f418.svn-base new file mode 100644 index 0000000..9036602 Binary files /dev/null and b/.svn/pristine/b0/b0d06b0963ce73bed3d84a72518cd6535c73f418.svn-base differ diff --git a/.svn/pristine/b2/b2f4d43f704dfe5f157570075293ba719cb9343c.svn-base b/.svn/pristine/b2/b2f4d43f704dfe5f157570075293ba719cb9343c.svn-base new file mode 100644 index 0000000..43488af Binary files /dev/null and b/.svn/pristine/b2/b2f4d43f704dfe5f157570075293ba719cb9343c.svn-base differ diff --git a/.svn/pristine/b3/b332805cf1ce2918d66777860817a0fda07dae91.svn-base b/.svn/pristine/b3/b332805cf1ce2918d66777860817a0fda07dae91.svn-base new file mode 100644 index 0000000..f9b7c61 --- /dev/null +++ b/.svn/pristine/b3/b332805cf1ce2918d66777860817a0fda07dae91.svn-base @@ -0,0 +1,85 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.demo.talker; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.comet4j.core.CometContext; +import org.comet4j.core.CometEngine; +import org.comet4j.core.util.JSONUtil; +import org.comet4j.demo.talker.dto.RenameDTO; +import org.comet4j.demo.talker.dto.TalkDTO; +import org.comet4j.demo.talker.dto.UserDTO; + +/** + * web交互 + * @author jinghai.xiao@gmail.com + * @date 2011-3-3 + */ + +public class WebServlet extends HttpServlet { + + /** serialVersionUID */ + private static final long serialVersionUID = -1311176251844328163L; + private static final String CMD_FLAG = "cmd"; + private static final String RENAME_CMD = "rename"; + private static final String TALK_CMD = "talk"; + private static final String LIST_CMD = "list"; + private static final CometContext context = CometContext.getInstance(); + private static final CometEngine engine = context.getEngine(); + private static final AppStore appStore = AppStore.getInstance(); + + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, + IOException { + response.setCharacterEncoding("UTF-8"); + response.setContentType("text/html;charset=UTF-8"); + String cmd = request.getParameter(CMD_FLAG); + // 改名 + if (RENAME_CMD.equals(cmd)) { + String id = request.getParameter("id"); + if (id == null) return; + String newName = request.getParameter("newName"); + String oldName = request.getParameter("oldName"); + appStore.put(id, newName); + RenameDTO dto = new RenameDTO(id, oldName, newName); + engine.sendToAll(Constant.APP_CHANNEL, dto); + return; + } + // 发送信息 + if (TALK_CMD.equals(cmd)) { + String id = request.getParameter("id"); + String name = appStore.get(id); + String text = request.getParameter("text"); + TalkDTO dto = new TalkDTO(id, name, text); + engine.sendToAll(Constant.APP_CHANNEL, dto); + return; + } + // 在线列表 + if (LIST_CMD.equals(cmd)) { + List userList = new ArrayList(); + Map map = AppStore.getInstance().getMap(); + Iterator> iter = map.entrySet().iterator(); + while (iter.hasNext()) { + Map.Entry entry = iter.next(); + String id = entry.getKey(); + String name = entry.getValue(); + userList.add(new UserDTO(id, name)); + } + String json = JSONUtil.object2json(userList); + response.getWriter().print(json); + } + } +} diff --git a/.svn/pristine/b3/b35cfa12458f396e702fc0534115a26da96ffe8e.svn-base b/.svn/pristine/b3/b35cfa12458f396e702fc0534115a26da96ffe8e.svn-base new file mode 100644 index 0000000..fd2674e --- /dev/null +++ b/.svn/pristine/b3/b35cfa12458f396e702fc0534115a26da96ffe8e.svn-base @@ -0,0 +1,13 @@ +V0.1.1 +新增: +窗体失去焦点下的新信息数量提示功能。 +与Google、sina、163等OpenId集成 +AirChat客户端Demo +文件上传插件 + +文档: +相关已有文档的更新wiki,cdoc,sdoc +Comet4J介绍(WEB即时通讯) +Comet4J Chat实例解析 +Comet4J与Spring应用整合 +Comet4J分布式架构建议 \ No newline at end of file diff --git a/.svn/pristine/b3/b3c658d803d8d18f561742c3e84e38533a59c002.svn-base b/.svn/pristine/b3/b3c658d803d8d18f561742c3e84e38533a59c002.svn-base new file mode 100644 index 0000000..b24e6b6 --- /dev/null +++ b/.svn/pristine/b3/b3c658d803d8d18f561742c3e84e38533a59c002.svn-base @@ -0,0 +1,50 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.event; + +import org.comet4j.core.CometConnection; +import org.comet4j.core.CometEngine; +import org.comet4j.core.CometMessage; +import org.comet4j.event.Event; + +/** + * 发送消息事件对象 + */ + +public class MessageEvent extends Event { + + private CometConnection conn; + private CometMessage data; + + public MessageEvent(CometEngine target, CometConnection aConn, CometMessage aData) { + super(target); + conn = aConn; + data = aData; + } + + public CometConnection getConn() { + return conn; + } + + public void setConn(CometConnection conn) { + this.conn = conn; + } + + public CometMessage getData() { + return data; + } + + public void setData(CometMessage data) { + this.data = data; + } + + @Override + public void destroy() { + super.destroy(); + conn = null; + data = null; + } +} diff --git a/.svn/pristine/b4/b481f4cd118792883952ebadff89c2535e0c4558.svn-base b/.svn/pristine/b4/b481f4cd118792883952ebadff89c2535e0c4558.svn-base new file mode 100644 index 0000000..faa2759 --- /dev/null +++ b/.svn/pristine/b4/b481f4cd118792883952ebadff89c2535e0c4558.svn-base @@ -0,0 +1,38 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.event; + +import org.comet4j.core.CometConnection; +import org.comet4j.core.CometEngine; +import org.comet4j.event.Event; + +/** + * 连接濒死状态事件对象 + */ + +public class DyingEvent extends Event { + + private CometConnection conn; + + public DyingEvent(CometEngine target, CometConnection aConn) { + super(target); + conn = aConn; + } + + public CometConnection getConn() { + return conn; + } + + public void setConn(CometConnection conn) { + this.conn = conn; + } + + @Override + public void destroy() { + super.destroy(); + conn = null; + } +} diff --git a/.svn/pristine/b4/b4a3387e57c8bc60d405dfb1b2c1b85b650002dd.svn-base b/.svn/pristine/b4/b4a3387e57c8bc60d405dfb1b2c1b85b650002dd.svn-base new file mode 100644 index 0000000..9c266c9 --- /dev/null +++ b/.svn/pristine/b4/b4a3387e57c8bc60d405dfb1b2c1b85b650002dd.svn-base @@ -0,0 +1,38 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.event; + +import org.comet4j.core.CometConnection; +import org.comet4j.core.CometEngine; +import org.comet4j.event.Event; + +/** + * 连接被移除前的事件对象 + */ + +public class BeforeRemoveEvent extends Event { + + private CometConnection conn; + + public BeforeRemoveEvent(CometEngine target, CometConnection aConn) { + super(target); + conn = aConn; + } + + public CometConnection getConn() { + return conn; + } + + public void setConn(CometConnection conn) { + this.conn = conn; + } + + @Override + public void destroy() { + super.destroy(); + conn = null; + } +} diff --git a/.svn/pristine/b5/b558467da7691a3ce5d90de1e7e061120b76478c.svn-base b/.svn/pristine/b5/b558467da7691a3ce5d90de1e7e061120b76478c.svn-base new file mode 100644 index 0000000..74883b2 Binary files /dev/null and b/.svn/pristine/b5/b558467da7691a3ce5d90de1e7e061120b76478c.svn-base differ diff --git a/.svn/pristine/b5/b58894f8544eb7db29353fd7d5c6a53efca2a0f0.svn-base b/.svn/pristine/b5/b58894f8544eb7db29353fd7d5c6a53efca2a0f0.svn-base new file mode 100644 index 0000000..bd49438 Binary files /dev/null and b/.svn/pristine/b5/b58894f8544eb7db29353fd7d5c6a53efca2a0f0.svn-base differ diff --git a/.svn/pristine/b5/b5e4a75933a1677f5887996b60a37e8083aede4d.svn-base b/.svn/pristine/b5/b5e4a75933a1677f5887996b60a37e8083aede4d.svn-base new file mode 100644 index 0000000..1c1abeb Binary files /dev/null and b/.svn/pristine/b5/b5e4a75933a1677f5887996b60a37e8083aede4d.svn-base differ diff --git a/.svn/pristine/b6/b608bdb318b3b626914251fb4be4fa8b188ea7b2.svn-base b/.svn/pristine/b6/b608bdb318b3b626914251fb4be4fa8b188ea7b2.svn-base new file mode 100644 index 0000000..8402dab --- /dev/null +++ b/.svn/pristine/b6/b608bdb318b3b626914251fb4be4fa8b188ea7b2.svn-base @@ -0,0 +1,29 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.listener; + +import org.comet4j.core.event.CometContextEvent; +import org.comet4j.event.Listener; + +/** + * 上下文事件侦听抽象类 + */ +public abstract class CometContextListener extends Listener { + + @Override + public boolean handleEvent(CometContextEvent event) { + if (CometContextEvent.INITIALIZED == event.getSubType()) { + return onInitialized(event); + } else if (CometContextEvent.DESTROYED == event.getSubType()) { + return onDestroyed(event); + } + return true; + } + + public abstract boolean onInitialized(CometContextEvent event); + + public abstract boolean onDestroyed(CometContextEvent event); +} diff --git a/.svn/pristine/b6/b688d46b8133e573b8cbc0f8a3ea3b9924877b85.svn-base b/.svn/pristine/b6/b688d46b8133e573b8cbc0f8a3ea3b9924877b85.svn-base new file mode 100644 index 0000000..be6c50e Binary files /dev/null and b/.svn/pristine/b6/b688d46b8133e573b8cbc0f8a3ea3b9924877b85.svn-base differ diff --git a/.svn/pristine/b6/b6dacf60ca0e8cc35793239c0037d4a7ce5ac1bf.svn-base b/.svn/pristine/b6/b6dacf60ca0e8cc35793239c0037d4a7ce5ac1bf.svn-base new file mode 100644 index 0000000..b080a4d --- /dev/null +++ b/.svn/pristine/b6/b6dacf60ca0e8cc35793239c0037d4a7ce5ac1bf.svn-base @@ -0,0 +1,19 @@ +Opera下beforeunload没起作用 +Engine增加beforeStart事件? +Engine增加beforeStop事件? +ToFix:长连接不能正常接收 +断开原因改为编码表示 +增加异常事件,对异常可以统一处理 +v0.1.7 +修改了在长连接下的重连问题,OK +解决了Engine在Kiss框架下不触发通道事件问题 +v0.1.6 +修复了引擎无法触发通道事件的问题,OK +V0.1.5 +修复引擎在连接失败时不能正确触发stop事件的问题,OK +修复建立连接永不超时问题。OK +修复IE9,Opera连接断开后无限重连问题,OK +Engine.start方法增加param参数,OK +Connector增加错误重试特性,增强网络环境较差情况下的稳定性,OK +Connector对param的处理bug ,OK +Connector停止时对未传递参数的bug,OK \ No newline at end of file diff --git a/.svn/pristine/b6/b6de420fa915cbc456bb210efbde93d35c0886d9.svn-base b/.svn/pristine/b6/b6de420fa915cbc456bb210efbde93d35c0886d9.svn-base new file mode 100644 index 0000000..3b0023d --- /dev/null +++ b/.svn/pristine/b6/b6de420fa915cbc456bb210efbde93d35c0886d9.svn-base @@ -0,0 +1,495 @@ +/** + * @class JS + * JS命名空间以及一些快捷方法引用 + * @singleton + * @author jinghai.xiao@gmail.com + */ +var JS = { + version : '0.1.7' +}; + +JS.Runtime = (function(){ + var ua = navigator.userAgent.toLowerCase(), + check = function(r){ + return r.test(ua); + }, + /** + * @property + * @type Boolean + */ + isOpera = check(/opera/), + /** + * @property + * @type Boolean + */ + isFirefox = check(/firefox/), + /** + * @property + * @type Boolean + */ + isChrome = check(/chrome/), + /** + * @property + * @type Boolean + */ + isWebKit = check(/webkit/), + /** + * @property + * @type Boolean + */ + isSafari = !isChrome && check(/safari/), + /** + * @property + * @type Boolean + */ + isSafari2 = isSafari && check(/applewebkit\/4/), + /** + * @property + * @type Boolean + */ + isSafari3 = isSafari && check(/version\/3/), + /** + * @property + * @type Boolean + */ + isSafari4 = isSafari && check(/version\/4/), + /** + * @property + * @type Boolean + */ + isIE = !isOpera && check(/msie/), + /** + * @property + * @type Boolean + */ + isIE7 = isIE && check(/msie 7/), + /** + * @property + * @type Boolean + */ + isIE8 = isIE && check(/msie 8/), + /** + * @property + * @type Boolean + */ + isIE6 = isIE && !isIE7 && !isIE8, + /** + * @property + * @type Boolean + */ + isGecko = !isWebKit && check(/gecko/), + /** + * @property + * @type Boolean + */ + isGecko2 = isGecko && check(/rv:1\.8/), + /** + * @property + * @type Boolean + */ + isGecko3 = isGecko && check(/rv:1\.9/), + /** + * @property + * @type Boolean + */ + isWindows = check(/windows|win32/), + /** + * @property + * @type Boolean + */ + isMac = check(/macintosh|mac os x/), + /** + * @property + * @type Boolean + */ + isAir = check(/adobeair/), + /** + * @property + * @type Boolean + */ + isLinux = check(/linux/); + return { + isOpera : isOpera, + isFirefox : isFirefox, + isChrome : isChrome, + isWebKit : isWebKit, + isSafari : isSafari, + isSafari2 : isSafari2, + isSafari3 : isSafari3, + isSafari4 : isSafari4, + isIE : isIE, + isIE7 : isIE7, + isIE8 : isIE8, + isIE6 : isIE6, + isGecko : isGecko, + isGecko2 : isGecko2, + isGecko3 : isGecko3, + isWindows :isWindows, + isMac : isMac, + isAir : isAir, + isLinux : isLinux + }; +}()); +JS.isOpera = JS.Runtime.isOpera; +JS.isFirefox = JS.Runtime.isFirefox; +JS.isChrome = JS.Runtime.isChrome; +JS.isWebKit = JS.Runtime.isWebKit; +JS.isSafari = JS.Runtime.isSafari; +JS.isSafari2 = JS.Runtime.isSafari2; +JS.isSafari3 = JS.Runtime.isSafari3; +JS.isSafari4 = JS.Runtime.isSafari4; +JS.isIE = JS.Runtime.isIE; +JS.isIE7 = JS.Runtime.isIE7; +JS.isIE8 = JS.Runtime.isIE8; +JS.isIE6 = JS.Runtime.isIE6; +JS.isGecko = JS.Runtime.isGecko; +JS.isGecko2 = JS.Runtime.isGecko2; +JS.isGecko3 = JS.Runtime.isGecko3; +JS.isWindows =JS.Runtime.isWindows; +JS.isMac = JS.Runtime.isMac; +JS.isAir = JS.Runtime.isAir; +JS.isLinux = JS.Runtime.isLinux; + +JS.Syntax = { + log : function(str){ + if(typeof console!="undefined"){ + console.log(str); + } + }, + nameSpace : function(){ + if(arguments.length){ + var o, d, v; + for(var i=0,len=arguments.length; iReturns true if the passed value is empty.

+ *

The value is deemed to be empty if it is

    + *
  • null
  • + *
  • undefined
  • + *
  • an empty array
  • + *
  • a zero length string (Unless the allowBlank parameter is true)
  • + *
+ * @param {Mixed} value The value to test + * @param {Boolean} allowBlank (optional) true to allow empty strings (defaults to false) + * @return {Boolean} + */ + isEmpty : function(v, allowBlank){ + return v === null || v === undefined || ((Ext.isArray(v) && !v.length)) || (!allowBlank ? v === '' : false); + }, + + /** + * Returns true if the passed value is a JavaScript array, otherwise false. + * @param {Mixed} value The value to test + * @return {Boolean} + */ + isArray : function(v){ + return Object.prototype.toString.apply(v) === '[object Array]'; + }, + + /** + * Returns true if the passed object is a JavaScript date object, otherwise false. + * @param {Object} object The object to test + * @return {Boolean} + */ + isDate : function(v){ + return Object.prototype.toString.apply(v) === '[object Date]'; + }, + + /** + * Returns true if the passed value is a JavaScript Object, otherwise false. + * @param {Mixed} value The value to test + * @return {Boolean} + */ + isObject : function(v){ + return !!v && Object.prototype.toString.call(v) === '[object Object]'; + }, + + /** + * Returns true if the passed value is a JavaScript 'primitive', a string, number or boolean. + * @param {Mixed} value The value to test + * @return {Boolean} + */ + isPrimitive : function(v){ + return Ext.isString(v) || Ext.isNumber(v) || Ext.isBoolean(v); + }, + + /** + * Returns true if the passed value is a JavaScript Function, otherwise false. + * @param {Mixed} value The value to test + * @return {Boolean} + */ + isFunction : function(v){ + return Object.prototype.toString.apply(v) === '[object Function]'; + }, + + /** + * Returns true if the passed value is a number. Returns false for non-finite numbers. + * @param {Mixed} value The value to test + * @return {Boolean} + */ + isNumber : function(v){ + return typeof v === 'number' && isFinite(v); + }, + + /** + * Returns true if the passed value is a string. + * @param {Mixed} value The value to test + * @return {Boolean} + */ + isString : function(v){ + return typeof v === 'string'; + }, + + /** + * Returns true if the passed value is a boolean. + * @param {Mixed} value The value to test + * @return {Boolean} + */ + isBoolean : function(v){ + return typeof v === 'boolean'; + }, + + /** + * Returns true if the passed value is an HTMLElement + * @param {Mixed} value The value to test + * @return {Boolean} + */ + isElement : function(v) { + return !!v && v.tagName; + }, + + /** + * Returns true if the passed value is not undefined. + * @param {Mixed} value The value to test + * @return {Boolean} + */ + isDefined : function(v){ + return typeof v !== 'undefined'; + }, + /** + * 将任何可迭代(带有length属性)的对象转换成Array对象 + * 不要用它转换字符串.IE doesn't support "abc"[0] which this implementation depends on. + * For strings, use this instead: "abc".match(/./g) => [a,b,c]; + * @param {Iterable} the iterable object to be turned into a true Array. + * @return (Array) array + */ + toArray : function(){ + return JS.isIE ? + function(a, i, j, res){ + res = []; + for(var x = 0, len = a.length; x < len; x++) { + res.push(a[x]); + } + return res.slice(i || 0, j || res.length); + } : + function(a, i, j){ + return Array.prototype.slice.call(a, i || 0, j || a.length); + }; + }() +}; +JS.log = JS.Syntax.log; +JS.ns = JS.Syntax.nameSpace; +JS.apply = JS.Syntax.apply; +JS.override = JS.Syntax.override; +JS.extend = JS.Syntax.extend; +JS.callBack = JS.Syntax.callBack; +JS.isEmpty = JS.Syntax.isEmpty; +JS.isArray = JS.Syntax.isArray; +JS.isDate = JS.Syntax.isDate; +JS.isObject = JS.Syntax.isObject; +JS.isPrimitive = JS.Syntax.isPrimitive; +JS.isFunction = JS.Syntax.isFunction; +JS.isNumber = JS.Syntax.isNumber; +JS.isString = JS.Syntax.isString; +JS.isBoolean = JS.Syntax.isBoolean; +JS.isElement = JS.Syntax.isElement; +JS.isDefined = JS.Syntax.isDefined; +JS.toArray = JS.Syntax.toArray; + +JS.DomEvent = { + /** + * @method + * @param {DOM} el + * @param {String} name + * @param {Function} fun + * @param {Object} scope + */ + on: function(el, name, fun, scope){ + if (el.addEventListener) { + //el.addEventListener(name, fun, false); + //TODO:若封闭成带有作用域的功能,如何删除事件,是否自己要记一下on的函数,然后在un下删除它 + + el.addEventListener(name, function(){ + JS.callBack(fun,scope,arguments); + }, false); + + } else { + //el.attachEvent('on' + name, fun); + + el.attachEvent('on' + name, function(){ + JS.callBack(fun,scope,arguments); + }); + + } + }, + /** + * @method + * @param {DOM} el + * @param {String} name + * @param {Function} fun + * @param {Object} scope + */ + un: function(el, name, fun,scope){ + if (el.removeEventListener){ + el.removeEventListener(name, fun, false); + } else { + el.detachEvent('on' + name, fun); + } + }, + /** + * @method + * @param {DOMEvent} e + */ + stop: function(e){ + e.returnValue = false; + if (e.preventDefault) { + e.preventDefault(); + } + JS.DomEvent.stopPropagation(e); + }, + /** + * @method + * @param {DOMEvent} e + */ + stopPropagation: function(e){ + e.cancelBubble = true; + if (e.stopPropagation) { + e.stopPropagation(); + } + } +}; +JS.on = JS.DomEvent.on; +JS.un = JS.DomEvent.un; +/** + *

+	var task = new Ext.util.DelayedTask(function(){
+	    alert(Ext.getDom('myInputField').value.length);
+	});
+	Ext.get('myInputField').on('keypress', function(){
+	    task.delay(500); 
+	});
+ * 
+ */ +JS.DelayedTask = function(fn, scope, args){ + var me = this, + id, + call = function(){ + clearInterval(id); + id = null; + fn.apply(scope, args || []); + }; + + /** + * Cancels any pending timeout and queues a new one + * @param {Number} delay The milliseconds to delay + * @param {Function} newFn (optional) Overrides function passed to constructor + * @param {Object} newScope (optional) Overrides scope passed to constructor. Remember that if no scope + * is specified, this will refer to the browser window. + * @param {Array} newArgs (optional) Overrides args passed to constructor + */ + me.delay = function(delay, newFn, newScope, newArgs){ + me.cancel(); + fn = newFn || fn; + scope = newScope || scope; + args = newArgs || args; + id = setInterval(call, delay); + }; + + /** + * Cancel the last queued timeout + */ + me.cancel = function(){ + if(id){ + clearInterval(id); + id = null; + } + }; +}; diff --git a/.svn/pristine/b8/b80159993a0efd33592b79750230a838857a3e6e.svn-base b/.svn/pristine/b8/b80159993a0efd33592b79750230a838857a3e6e.svn-base new file mode 100644 index 0000000..e4362e8 --- /dev/null +++ b/.svn/pristine/b8/b80159993a0efd33592b79750230a838857a3e6e.svn-base @@ -0,0 +1,13 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.listener; + +import org.comet4j.core.event.ErrorEvent; +import org.comet4j.event.Listener; + +public abstract class ErrorListener extends Listener { + +} diff --git a/.svn/pristine/b8/b8b2a73365f842ef9682b1356d1870da8612b14a.svn-base b/.svn/pristine/b8/b8b2a73365f842ef9682b1356d1870da8612b14a.svn-base new file mode 100644 index 0000000..110f684 Binary files /dev/null and b/.svn/pristine/b8/b8b2a73365f842ef9682b1356d1870da8612b14a.svn-base differ diff --git a/.svn/pristine/b8/b8ce4b8f9cd6ea9291a1c5fed07caa1735c19f15.svn-base b/.svn/pristine/b8/b8ce4b8f9cd6ea9291a1c5fed07caa1735c19f15.svn-base new file mode 100644 index 0000000..9c1653b Binary files /dev/null and b/.svn/pristine/b8/b8ce4b8f9cd6ea9291a1c5fed07caa1735c19f15.svn-base differ diff --git a/.svn/pristine/b9/b9339da2c49154aa2b4d197e46e7c2f80bad7703.svn-base b/.svn/pristine/b9/b9339da2c49154aa2b4d197e46e7c2f80bad7703.svn-base new file mode 100644 index 0000000..9834745 --- /dev/null +++ b/.svn/pristine/b9/b9339da2c49154aa2b4d197e46e7c2f80bad7703.svn-base @@ -0,0 +1,162 @@ +/* + * Ext JS Library 2.2 + * Copyright(c) 2006-2008, Ext JS, LLC. + * licensing@extjs.com + * + * http://extjs.com/license + */ + +Ext.DomHelper=function(){var L=null;var F=/^(?:br|frame|hr|img|input|link|meta|range|spacer|wbr|area|param|col)$/i;var B=/^table|tbody|tr|td$/i;var A=function(T){if(typeof T=="string"){return T}var O="";if(Ext.isArray(T)){for(var R=0,P=T.length;R"}else{O+=">";var U=T.children||T.cn;if(U){O+=A(U)}else{if(T.html){O+=T.html}}O+=""}return O};var M=function(T,O){var S;if(Ext.isArray(T)){S=document.createDocumentFragment();for(var R=0,P=T.length;R",K=""+E,H=C+"",D=""+K;var G=function(N,O,Q,P){if(!L){L=document.createElement("div")}var R;var S=null;if(N=="td"){if(O=="afterbegin"||O=="beforeend"){return }if(O=="beforebegin"){S=Q;Q=Q.parentNode}else{S=Q.nextSibling;Q=Q.parentNode}R=I(4,H,P,D)}else{if(N=="tr"){if(O=="beforebegin"){S=Q;Q=Q.parentNode;R=I(3,C,P,K)}else{if(O=="afterend"){S=Q.nextSibling;Q=Q.parentNode;R=I(3,C,P,K)}else{if(O=="afterbegin"){S=Q.firstChild}R=I(4,H,P,D)}}}else{if(N=="tbody"){if(O=="beforebegin"){S=Q;Q=Q.parentNode;R=I(2,J,P,E)}else{if(O=="afterend"){S=Q.nextSibling;Q=Q.parentNode;R=I(2,J,P,E)}else{if(O=="afterbegin"){S=Q.firstChild}R=I(3,C,P,K)}}}else{if(O=="beforebegin"||O=="afterend"){return }if(O=="afterbegin"){S=Q.firstChild}R=I(2,J,P,E)}}}Q.insertBefore(R,S);return R};return{useDom:false,markup:function(N){return A(N)},applyStyles:function(P,Q){if(Q){P=Ext.fly(P);if(typeof Q=="string"){var O=/\s?([a-z\-]*)\:\s?([^;]*);?/gi;var R;while((R=O.exec(Q))!=null){P.setStyle(R[1],R[2])}}else{if(typeof Q=="object"){for(var N in Q){P.setStyle(N,Q[N])}}else{if(typeof Q=="function"){Ext.DomHelper.applyStyles(P,Q.call())}}}}},insertHtml:function(P,R,Q){P=P.toLowerCase();if(R.insertAdjacentHTML){if(B.test(R.tagName)){var O;if(O=G(R.tagName.toLowerCase(),P,R,Q)){return O}}switch(P){case"beforebegin":R.insertAdjacentHTML("BeforeBegin",Q);return R.previousSibling;case"afterbegin":R.insertAdjacentHTML("AfterBegin",Q);return R.firstChild;case"beforeend":R.insertAdjacentHTML("BeforeEnd",Q);return R.lastChild;case"afterend":R.insertAdjacentHTML("AfterEnd",Q);return R.nextSibling}throw"Illegal insertion point -> \""+P+"\""}var N=R.ownerDocument.createRange();var S;switch(P){case"beforebegin":N.setStartBefore(R);S=N.createContextualFragment(Q);R.parentNode.insertBefore(S,R);return R.previousSibling;case"afterbegin":if(R.firstChild){N.setStartBefore(R.firstChild);S=N.createContextualFragment(Q);R.insertBefore(S,R.firstChild);return R.firstChild}else{R.innerHTML=Q;return R.firstChild}case"beforeend":if(R.lastChild){N.setStartAfter(R.lastChild);S=N.createContextualFragment(Q);R.appendChild(S);return R.lastChild}else{R.innerHTML=Q;return R.lastChild}case"afterend":N.setStartAfter(R);S=N.createContextualFragment(Q);R.parentNode.insertBefore(S,R.nextSibling);return R.nextSibling}throw"Illegal insertion point -> \""+P+"\""},insertBefore:function(N,P,O){return this.doInsert(N,P,O,"beforeBegin")},insertAfter:function(N,P,O){return this.doInsert(N,P,O,"afterEnd","nextSibling")},insertFirst:function(N,P,O){return this.doInsert(N,P,O,"afterBegin","firstChild")},doInsert:function(Q,S,R,T,P){Q=Ext.getDom(Q);var O;if(this.useDom){O=M(S,null);(P==="firstChild"?Q:Q.parentNode).insertBefore(O,P?Q[P]:Q)}else{var N=A(S);O=this.insertHtml(T,Q,N)}return R?Ext.get(O,true):O},append:function(P,R,Q){P=Ext.getDom(P);var O;if(this.useDom){O=M(R,null);P.appendChild(O)}else{var N=A(R);O=this.insertHtml("beforeEnd",P,N)}return Q?Ext.get(O,true):O},overwrite:function(N,P,O){N=Ext.getDom(N);N.innerHTML=A(P);return O?Ext.get(N.firstChild,true):N.firstChild},createTemplate:function(O){var N=A(O);return new Ext.Template(N)}}}(); +Ext.Template=function(E){var B=arguments;if(Ext.isArray(E)){E=E.join("")}else{if(B.length>1){var C=[];for(var D=0,A=B.length;D+~]\s?|\s|$)/;var tagTokenRe=/^(#)?([\w-\*]+)/;var nthRe=/(\d*)n\+?(\d*)/,nthRe2=/\D/;function child(p,index){var i=0;var n=p.firstChild;while(n){if(n.nodeType==1){if(++i==index){return n}}n=n.nextSibling}return null}function next(n){while((n=n.nextSibling)&&n.nodeType!=1){}return n}function prev(n){while((n=n.previousSibling)&&n.nodeType!=1){}return n}function children(d){var n=d.firstChild,ni=-1;while(n){var nx=n.nextSibling;if(n.nodeType==3&&!nonSpace.test(n.nodeValue)){d.removeChild(n)}else{n.nodeIndex=++ni}n=nx}return this}function byClassName(c,a,v){if(!v){return c}var r=[],ri=-1,cn;for(var i=0,ci;ci=c[i];i++){if((" "+ci.className+" ").indexOf(v)!=-1){r[++ri]=ci}}return r}function attrValue(n,attr){if(!n.tagName&&typeof n.length!="undefined"){n=n[0]}if(!n){return null}if(attr=="for"){return n.htmlFor}if(attr=="class"||attr=="className"){return n.className}return n.getAttribute(attr)||n[attr]}function getNodes(ns,mode,tagName){var result=[],ri=-1,cs;if(!ns){return result}tagName=tagName||"*";if(typeof ns.getElementsByTagName!="undefined"){ns=[ns]}if(!mode){for(var i=0,ni;ni=ns[i];i++){cs=ni.getElementsByTagName(tagName);for(var j=0,ci;ci=cs[j];j++){result[++ri]=ci}}}else{if(mode=="/"||mode==">"){var utag=tagName.toUpperCase();for(var i=0,ni,cn;ni=ns[i];i++){cn=ni.children||ni.childNodes;for(var j=0,cj;cj=cn[j];j++){if(cj.nodeName==utag||cj.nodeName==tagName||tagName=="*"){result[++ri]=cj}}}}else{if(mode=="+"){var utag=tagName.toUpperCase();for(var i=0,n;n=ns[i];i++){while((n=n.nextSibling)&&n.nodeType!=1){}if(n&&(n.nodeName==utag||n.nodeName==tagName||tagName=="*")){result[++ri]=n}}}else{if(mode=="~"){for(var i=0,n;n=ns[i];i++){while((n=n.nextSibling)&&(n.nodeType!=1||(tagName=="*"||n.tagName.toLowerCase()!=tagName))){}if(n){result[++ri]=n}}}}}}return result}function concat(a,b){if(b.slice){return a.concat(b)}for(var i=0,l=b.length;i1){return nodup(results)}return results},selectNode:function(path,root){return Ext.DomQuery.select(path,root)[0]},selectValue:function(path,root,defaultValue){path=path.replace(trimRe,"");if(!valueCache[path]){valueCache[path]=Ext.DomQuery.compile(path,"select")}var n=valueCache[path](root);n=n[0]?n[0]:n;var v=(n&&n.firstChild?n.firstChild.nodeValue:null);return((v===null||v===undefined||v==="")?defaultValue:v)},selectNumber:function(path,root,defaultValue){var v=Ext.DomQuery.selectValue(path,root,defaultValue||0);return parseFloat(v)},is:function(el,ss){if(typeof el=="string"){el=document.getElementById(el)}var isArray=Ext.isArray(el);var result=Ext.DomQuery.filter(isArray?el:[el],ss);return isArray?(result.length==el.length):(result.length>0)},filter:function(els,ss,nonMatches){ss=ss.replace(trimRe,"");if(!simpleCache[ss]){simpleCache[ss]=Ext.DomQuery.compile(ss,"simple")}var result=simpleCache[ss](els);return nonMatches?quickDiff(result,els):result},matchers:[{re:/^\.([\w-]+)/,select:"n = byClassName(n, null, \" {1} \");"},{re:/^\:([\w-]+)(?:\(((?:[^\s>\/]*|.*?))\))?/,select:"n = byPseudo(n, \"{1}\", \"{2}\");"},{re:/^(?:([\[\{])(?:@)?([\w-]+)\s?(?:(=|.=)\s?['"]?(.*?)["']?)?[\]\}])/,select:"n = byAttribute(n, \"{2}\", \"{4}\", \"{3}\", \"{1}\");"},{re:/^#([\w-]+)/,select:"n = byId(n, null, \"{1}\");"},{re:/^@([\w-]+)/,select:"return {firstChild:{nodeValue:attrValue(n, \"{1}\")}};"}],operators:{"=":function(a,v){return a==v},"!=":function(a,v){return a!=v},"^=":function(a,v){return a&&a.substr(0,v.length)==v},"$=":function(a,v){return a&&a.substr(a.length-v.length)==v},"*=":function(a,v){return a&&a.indexOf(v)!==-1},"%=":function(a,v){return(a%v)==0},"|=":function(a,v){return a&&(a==v||a.substr(0,v.length+1)==v+"-")},"~=":function(a,v){return a&&(" "+a+" ").indexOf(" "+v+" ")!=-1}},pseudos:{"first-child":function(c){var r=[],ri=-1,n;for(var i=0,ci;ci=n=c[i];i++){while((n=n.previousSibling)&&n.nodeType!=1){}if(!n){r[++ri]=ci}}return r},"last-child":function(c){var r=[],ri=-1,n;for(var i=0,ci;ci=n=c[i];i++){while((n=n.nextSibling)&&n.nodeType!=1){}if(!n){r[++ri]=ci}}return r},"nth-child":function(c,a){var r=[],ri=-1;var m=nthRe.exec(a=="even"&&"2n"||a=="odd"&&"2n+1"||!nthRe2.test(a)&&"n+"+a||a);var f=(m[1]||1)-0,l=m[2]-0;for(var i=0,n;n=c[i];i++){var pn=n.parentNode;if(batch!=pn._batch){var j=0;for(var cn=pn.firstChild;cn;cn=cn.nextSibling){if(cn.nodeType==1){cn.nodeIndex=++j}}pn._batch=batch}if(f==1){if(l==0||n.nodeIndex==l){r[++ri]=n}}else{if((n.nodeIndex+l)%f==0){r[++ri]=n}}}return r},"only-child":function(c){var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){if(!prev(ci)&&!next(ci)){r[++ri]=ci}}return r},"empty":function(c){var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){var cns=ci.childNodes,j=0,cn,empty=true;while(cn=cns[j]){++j;if(cn.nodeType==1||cn.nodeType==3){empty=false;break}}if(empty){r[++ri]=ci}}return r},"contains":function(c,v){var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){if((ci.textContent||ci.innerText||"").indexOf(v)!=-1){r[++ri]=ci}}return r},"nodeValue":function(c,v){var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){if(ci.firstChild&&ci.firstChild.nodeValue==v){r[++ri]=ci}}return r},"checked":function(c){var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){if(ci.checked==true){r[++ri]=ci}}return r},"not":function(c,ss){return Ext.DomQuery.filter(c,ss,true)},"any":function(c,selectors){var ss=selectors.split("|");var r=[],ri=-1,s;for(var i=0,ci;ci=c[i];i++){for(var j=0;s=ss[j];j++){if(Ext.DomQuery.is(ci,s)){r[++ri]=ci;break}}}return r},"odd":function(c){return this["nth-child"](c,"odd")},"even":function(c){return this["nth-child"](c,"even")},"nth":function(c,a){return c[a-1]||[]},"first":function(c){return c[0]||[]},"last":function(c){return c[c.length-1]||[]},"has":function(c,ss){var s=Ext.DomQuery.select;var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){if(s(ss,ci).length>0){r[++ri]=ci}}return r},"next":function(c,ss){var is=Ext.DomQuery.is;var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){var n=next(ci);if(n&&is(n,ss)){r[++ri]=ci}}return r},"prev":function(c,ss){var is=Ext.DomQuery.is;var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){var n=prev(ci);if(n&&is(n,ss)){r[++ri]=ci}}return r}}}}();Ext.query=Ext.DomQuery.select; +Ext.util.Observable=function(){if(this.listeners){this.on(this.listeners);delete this.listeners}};Ext.util.Observable.prototype={fireEvent:function(){if(this.eventsSuspended!==true){var A=this.events[arguments[0].toLowerCase()];if(typeof A=="object"){return A.fire.apply(A,Array.prototype.slice.call(arguments,1))}}return true},filterOptRe:/^(?:scope|delay|buffer|single)$/,addListener:function(A,C,B,F){if(typeof A=="object"){F=A;for(var E in F){if(this.filterOptRe.test(E)){continue}if(typeof F[E]=="function"){this.addListener(E,F[E],F.scope,F)}else{this.addListener(E,F[E].fn,F[E].scope,F[E])}}return }F=(!F||typeof F=="boolean")?{}:F;A=A.toLowerCase();var D=this.events[A]||true;if(typeof D=="boolean"){D=new Ext.util.Event(this,A);this.events[A]=D}D.addListener(C,B,F)},removeListener:function(A,C,B){var D=this.events[A.toLowerCase()];if(typeof D=="object"){D.removeListener(C,B)}},purgeListeners:function(){for(var A in this.events){if(typeof this.events[A]=="object"){this.events[A].clearListeners()}}},relayEvents:function(F,D){var E=function(G){return function(){return this.fireEvent.apply(this,Ext.combine(G,Array.prototype.slice.call(arguments,0)))}};for(var C=0,A=D.length;C0},suspendEvents:function(){this.eventsSuspended=true},resumeEvents:function(){this.eventsSuspended=false},getMethodEvent:function(G){if(!this.methodEvents){this.methodEvents={}}var F=this.methodEvents[G];if(!F){F={};this.methodEvents[G]=F;F.originalFn=this[G];F.methodName=G;F.before=[];F.after=[];var C,B,D;var E=this;var A=function(J,I,H){if((B=J.apply(I||E,H))!==undefined){if(typeof B==="object"){if(B.returnValue!==undefined){C=B.returnValue}else{C=B}if(B.cancel===true){D=true}}else{if(B===false){D=true}else{C=B}}}};this[G]=function(){C=B=undefined;D=false;var I=Array.prototype.slice.call(arguments,0);for(var J=0,H=F.before.length;J0){this.firing=true;var G=Array.prototype.slice.call(arguments,0);for(var H=0;H=33&&D<=40)||D==this.RETURN||D==this.TAB||D==this.ESC},isSpecialKey:function(){var D=this.keyCode;return(this.type=="keypress"&&this.ctrlKey)||D==9||D==13||D==40||D==27||(D==16)||(D==17)||(D>=18&&D<=20)||(D>=33&&D<=35)||(D>=36&&D<=39)||(D>=44&&D<=45)},stopPropagation:function(){if(this.browserEvent){if(this.browserEvent.type=="mousedown"){Ext.EventManager.stoppedMouseDownEvent.fire(this)}B.stopPropagation(this.browserEvent)}},getCharCode:function(){return this.charCode||this.keyCode},getKey:function(){var D=this.keyCode||this.charCode;return Ext.isSafari?(A[D]||D):D},getPageX:function(){return this.xy[0]},getPageY:function(){return this.xy[1]},getTime:function(){if(this.browserEvent){return B.getTime(this.browserEvent)}return null},getXY:function(){return this.xy},getTarget:function(E,F,D){return E?Ext.fly(this.target).findParent(E,F,D):(D?Ext.get(this.target):this.target)},getRelatedTarget:function(){if(this.browserEvent){return B.getRelatedTarget(this.browserEvent)}return null},getWheelDelta:function(){var D=this.browserEvent;var E=0;if(D.wheelDelta){E=D.wheelDelta/120}else{if(D.detail){E=-D.detail/3}}return E},hasModifier:function(){return((this.ctrlKey||this.altKey)||this.shiftKey)?true:false},within:function(E,F){var D=this[F?"getRelatedTarget":"getTarget"]();return D&&Ext.fly(E).contains(D)},getPoint:function(){return new Ext.lib.Point(this.xy[0],this.xy[1])}};return new Ext.EventObjectImpl()}(); +(function(){var D=Ext.lib.Dom;var E=Ext.lib.Event;var A=Ext.lib.Anim;var propCache={};var camelRe=/(-[a-z])/gi;var camelFn=function(m,a){return a.charAt(1).toUpperCase()};var view=document.defaultView;Ext.Element=function(element,forceNew){var dom=typeof element=="string"?document.getElementById(element):element;if(!dom){return null}var id=dom.id;if(forceNew!==true&&id&&Ext.Element.cache[id]){return Ext.Element.cache[id]}this.dom=dom;this.id=id||Ext.id(dom)};var El=Ext.Element;El.prototype={originalDisplay:"",visibilityMode:1,defaultUnit:"px",setVisibilityMode:function(visMode){this.visibilityMode=visMode;return this},enableDisplayMode:function(display){this.setVisibilityMode(El.DISPLAY);if(typeof display!="undefined"){this.originalDisplay=display}return this},findParent:function(simpleSelector,maxDepth,returnEl){var p=this.dom,b=document.body,depth=0,dq=Ext.DomQuery,stopEl;maxDepth=maxDepth||50;if(typeof maxDepth!="number"){stopEl=Ext.getDom(maxDepth);maxDepth=10}while(p&&p.nodeType==1&&depthch||tcb){c.scrollTop=b-ch}}c.scrollTop=c.scrollTop;if(hscroll!==false){if(el.offsetWidth>c.clientWidth||lcr){c.scrollLeft=r-c.clientWidth}}c.scrollLeft=c.scrollLeft}return this},scrollChildIntoView:function(child,hscroll){Ext.fly(child,"_scrollChildIntoView").scrollIntoView(this,hscroll)},autoHeight:function(animate,duration,onComplete,easing){var oldHeight=this.getHeight();this.clip();this.setHeight(1);setTimeout(function(){var height=parseInt(this.dom.scrollHeight,10);if(!animate){this.setHeight(height);this.unclip();if(typeof onComplete=="function"){onComplete()}}else{this.setHeight(oldHeight);this.setHeight(height,animate,duration,function(){this.unclip();if(typeof onComplete=="function"){onComplete()}}.createDelegate(this),easing)}}.createDelegate(this),0);return this},contains:function(el){if(!el){return false}return D.isAncestor(this.dom,el.dom?el.dom:el)},isVisible:function(deep){var vis=!(this.getStyle("visibility")=="hidden"||this.getStyle("display")=="none");if(deep!==true||!vis){return vis}var p=this.dom.parentNode;while(p&&p.tagName.toLowerCase()!="body"){if(!Ext.fly(p,"_isVisible").isVisible()){return false}p=p.parentNode}return true},select:function(selector,unique){return El.select(selector,unique,this.dom)},query:function(selector){return Ext.DomQuery.select(selector,this.dom)},child:function(selector,returnDom){var n=Ext.DomQuery.selectNode(selector,this.dom);return returnDom?n:Ext.get(n)},down:function(selector,returnDom){var n=Ext.DomQuery.selectNode(" > "+selector,this.dom);return returnDom?n:Ext.get(n)},initDD:function(group,config,overrides){var dd=new Ext.dd.DD(Ext.id(this.dom),group,config);return Ext.apply(dd,overrides)},initDDProxy:function(group,config,overrides){var dd=new Ext.dd.DDProxy(Ext.id(this.dom),group,config);return Ext.apply(dd,overrides)},initDDTarget:function(group,config,overrides){var dd=new Ext.dd.DDTarget(Ext.id(this.dom),group,config);return Ext.apply(dd,overrides)},setVisible:function(visible,animate){if(!animate||!A){if(this.visibilityMode==El.DISPLAY){this.setDisplayed(visible)}else{this.fixDisplay();this.dom.style.visibility=visible?"visible":"hidden"}}else{var dom=this.dom;var visMode=this.visibilityMode;if(visible){this.setOpacity(0.01);this.setVisible(true)}this.anim({opacity:{to:(visible?1:0)}},this.preanim(arguments,1),null,0.35,"easeIn",function(){if(!visible){if(visMode==El.DISPLAY){dom.style.display="none"}else{dom.style.visibility="hidden"}Ext.get(dom).setOpacity(1)}})}return this},isDisplayed:function(){return this.getStyle("display")!="none"},toggle:function(animate){this.setVisible(!this.isVisible(),this.preanim(arguments,0));return this},setDisplayed:function(value){if(typeof value=="boolean"){value=value?this.originalDisplay:"none"}this.setStyle("display",value);return this},focus:function(){try{this.dom.focus()}catch(e){}return this},blur:function(){try{this.dom.blur()}catch(e){}return this},addClass:function(className){if(Ext.isArray(className)){for(var i=0,len=className.length;idw+scrollX){x=swapX?r.left-w:dw+scrollX-w}if(xdh+scrollY){y=swapY?r.top-h:dh+scrollY-h}if(yvr){x=vr-w;moved=true}if((y+h)>vb){y=vb-h;moved=true}if(x";E.onAvailable(id,function(){var hd=document.getElementsByTagName("head")[0];var re=/(?:]*)?>)((\n|\r|.)*?)(?:<\/script>)/ig;var srcRe=/\ssrc=([\'\"])(.*?)\1/i;var typeRe=/\stype=([\'\"])(.*?)\1/i;var match;while(match=re.exec(html)){var attrs=match[1];var srcMatch=attrs?attrs.match(srcRe):false;if(srcMatch&&srcMatch[2]){var s=document.createElement("script");s.src=srcMatch[2];var typeMatch=attrs.match(typeRe);if(typeMatch&&typeMatch[2]){s.type=typeMatch[2]}hd.appendChild(s)}else{if(match[2]&&match[2].length>0){if(window.execScript){window.execScript(match[2])}else{window.eval(match[2])}}}}var el=document.getElementById(id);if(el){Ext.removeNode(el)}if(typeof callback=="function"){callback()}});dom.innerHTML=html.replace(/(?:)((\n|\r|.)*?)(?:<\/script>)/ig,"");return this},load:function(){var um=this.getUpdater();um.update.apply(um,arguments);return this},getUpdater:function(){if(!this.updateManager){this.updateManager=new Ext.Updater(this)}return this.updateManager},unselectable:function(){this.dom.unselectable="on";this.swallowEvent("selectstart",true);this.applyStyles("-moz-user-select:none;-khtml-user-select:none;");this.addClass("x-unselectable");return this},getCenterXY:function(){return this.getAlignToXY(document,"c-c")},center:function(centerIn){this.alignTo(centerIn||document,"c-c");return this},isBorderBox:function(){return noBoxAdjust[this.dom.tagName.toLowerCase()]||Ext.isBorderBox},getBox:function(contentBox,local){var xy;if(!local){xy=this.getXY()}else{var left=parseInt(this.getStyle("left"),10)||0;var top=parseInt(this.getStyle("top"),10)||0;xy=[left,top]}var el=this.dom,w=el.offsetWidth,h=el.offsetHeight,bx;if(!contentBox){bx={x:xy[0],y:xy[1],0:xy[0],1:xy[1],width:w,height:h}}else{var l=this.getBorderWidth("l")+this.getPadding("l");var r=this.getBorderWidth("r")+this.getPadding("r");var t=this.getBorderWidth("t")+this.getPadding("t");var b=this.getBorderWidth("b")+this.getPadding("b");bx={x:xy[0]+l,y:xy[1]+t,0:xy[0]+l,1:xy[1]+t,width:w-(l+r),height:h-(t+b)}}bx.right=bx.x+bx.width;bx.bottom=bx.y+bx.height;return bx},getFrameWidth:function(sides,onlyContentBox){return onlyContentBox&&Ext.isBorderBox?0:(this.getPadding(sides)+this.getBorderWidth(sides))},setBox:function(box,adjust,animate){var w=box.width,h=box.height;if((adjust&&!this.autoBoxAdjust)&&!this.isBorderBox()){w-=(this.getBorderWidth("lr")+this.getPadding("lr"));h-=(this.getBorderWidth("tb")+this.getPadding("tb"))}this.setBounds(box.x,box.y,w,h,this.preanim(arguments,2));return this},repaint:function(){var dom=this.dom;this.addClass("x-repaint");setTimeout(function(){Ext.get(dom).removeClass("x-repaint")},1);return this},getMargins:function(side){if(!side){return{top:parseInt(this.getStyle("margin-top"),10)||0,left:parseInt(this.getStyle("margin-left"),10)||0,bottom:parseInt(this.getStyle("margin-bottom"),10)||0,right:parseInt(this.getStyle("margin-right"),10)||0}}else{return this.addStyles(side,El.margins)}},addStyles:function(sides,styles){var val=0,v,w;for(var i=0,len=sides.length;i=0?w:-1*w)}}}return val},createProxy:function(config,renderTo,matchBox){config=typeof config=="object"?config:{tag:"div",cls:config};var proxy;if(renderTo){proxy=Ext.DomHelper.append(renderTo,config,true)}else{proxy=Ext.DomHelper.insertBefore(this.dom,config,true)}if(matchBox){proxy.setBox(this.getBox())}return proxy},mask:function(msg,msgCls){if(this.getStyle("position")=="static"){this.setStyle("position","relative")}if(this._maskMsg){this._maskMsg.remove()}if(this._mask){this._mask.remove()}this._mask=Ext.DomHelper.append(this.dom,{cls:"ext-el-mask"},true);this.addClass("x-masked");this._mask.setDisplayed(true);if(typeof msg=="string"){this._maskMsg=Ext.DomHelper.append(this.dom,{cls:"ext-el-mask-msg",cn:{tag:"div"}},true);var mm=this._maskMsg;mm.dom.className=msgCls?"ext-el-mask-msg "+msgCls:"ext-el-mask-msg";mm.dom.firstChild.innerHTML=msg;mm.setDisplayed(true);mm.center(this)}if(Ext.isIE&&!(Ext.isIE7&&Ext.isStrict)&&this.getStyle("height")=="auto"){this._mask.setSize(this.dom.clientWidth,this.getHeight())}return this._mask},unmask:function(){if(this._mask){if(this._maskMsg){this._maskMsg.remove();delete this._maskMsg}this._mask.remove();delete this._mask}this.removeClass("x-masked")},isMasked:function(){return this._mask&&this._mask.isVisible()},createShim:function(){var el=document.createElement("iframe");el.frameBorder="0";el.className="ext-shim";if(Ext.isIE&&Ext.isSecure){el.src=Ext.SSL_SECURE_URL}var shim=Ext.get(this.dom.parentNode.insertBefore(el,this.dom));shim.autoBoxAdjust=false;return shim},remove:function(){Ext.removeNode(this.dom);delete El.cache[this.dom.id]},hover:function(overFn,outFn,scope){var preOverFn=function(e){if(!e.within(this,true)){overFn.apply(scope||this,arguments)}};var preOutFn=function(e){if(!e.within(this,true)){outFn.apply(scope||this,arguments)}};this.on("mouseover",preOverFn,this.dom);this.on("mouseout",preOutFn,this.dom);return this},addClassOnOver:function(className){this.hover(function(){Ext.fly(this,"_internal").addClass(className)},function(){Ext.fly(this,"_internal").removeClass(className)});return this},addClassOnFocus:function(className){this.on("focus",function(){Ext.fly(this,"_internal").addClass(className)},this.dom);this.on("blur",function(){Ext.fly(this,"_internal").removeClass(className)},this.dom);return this},addClassOnClick:function(className){var dom=this.dom;this.on("mousedown",function(){Ext.fly(dom,"_internal").addClass(className);var d=Ext.getDoc();var fn=function(){Ext.fly(dom,"_internal").removeClass(className);d.removeListener("mouseup",fn)};d.on("mouseup",fn)});return this},swallowEvent:function(eventName,preventDefault){var fn=function(e){e.stopPropagation();if(preventDefault){e.preventDefault()}};if(Ext.isArray(eventName)){for(var i=0,len=eventName.length;idom.clientHeight||dom.scrollWidth>dom.clientWidth},scrollTo:function(side,value,animate){var prop=side.toLowerCase()=="left"?"scrollLeft":"scrollTop";if(!animate||!A){this.dom[prop]=value}else{var to=prop=="scrollLeft"?[value,this.dom.scrollTop]:[this.dom.scrollLeft,value];this.anim({scroll:{"to":to}},this.preanim(arguments,2),"scroll")}return this},scroll:function(direction,distance,animate){if(!this.isScrollable()){return }var el=this.dom;var l=el.scrollLeft,t=el.scrollTop;var w=el.scrollWidth,h=el.scrollHeight;var cw=el.clientWidth,ch=el.clientHeight;direction=direction.toLowerCase();var scrolled=false;var a=this.preanim(arguments,2);switch(direction){case"l":case"left":if(w-l>cw){var v=Math.min(l+distance,w-cw);this.scrollTo("left",v,a);scrolled=true}break;case"r":case"right":if(l>0){var v=Math.max(l-distance,0);this.scrollTo("left",v,a);scrolled=true}break;case"t":case"top":case"up":if(t>0){var v=Math.max(t-distance,0);this.scrollTo("top",v,a);scrolled=true}break;case"b":case"bottom":case"down":if(h-t>ch){var v=Math.min(t+distance,h-ch);this.scrollTo("top",v,a);scrolled=true}break}return scrolled},translatePoints:function(x,y){if(typeof x=="object"||Ext.isArray(x)){y=x[1];x=x[0]}var p=this.getStyle("position");var o=this.getXY();var l=parseInt(this.getStyle("left"),10);var t=parseInt(this.getStyle("top"),10);if(isNaN(l)){l=(p=="relative")?0:this.dom.offsetLeft}if(isNaN(t)){t=(p=="relative")?0:this.dom.offsetTop}return{left:(x-o[0]+l),top:(y-o[1]+t)}},getScroll:function(){var d=this.dom,doc=document;if(d==doc||d==doc.body){var l,t;if(Ext.isIE&&Ext.isStrict){l=doc.documentElement.scrollLeft||(doc.body.scrollLeft||0);t=doc.documentElement.scrollTop||(doc.body.scrollTop||0)}else{l=window.pageXOffset||(doc.body.scrollLeft||0);t=window.pageYOffset||(doc.body.scrollTop||0)}return{left:l,top:t}}else{return{left:d.scrollLeft,top:d.scrollTop}}},getColor:function(attr,defaultValue,prefix){var v=this.getStyle(attr);if(!v||v=="transparent"||v=="inherit"){return defaultValue}var color=typeof prefix=="undefined"?"#":prefix;if(v.substr(0,4)=="rgb("){var rvs=v.slice(4,v.length-1).split(",");for(var i=0;i<3;i++){var h=parseInt(rvs[i]);var s=h.toString(16);if(h<16){s="0"+s}color+=s}}else{if(v.substr(0,1)=="#"){if(v.length==4){for(var i=1;i<4;i++){var c=v.charAt(i);color+=c+c}}else{if(v.length==7){color+=v.substr(1)}}}}return(color.length>5?color.toLowerCase():defaultValue)},boxWrap:function(cls){cls=cls||"x-box";var el=Ext.get(this.insertHtml("beforeBegin",String.format("
"+El.boxMarkup+"
",cls)));el.child("."+cls+"-mc").dom.appendChild(this.dom);return el},getAttributeNS:Ext.isIE?function(ns,name){var d=this.dom;var type=typeof d[ns+":"+name];if(type!="undefined"&&type!="unknown"){return d[ns+":"+name]}return d[name]}:function(ns,name){var d=this.dom;return d.getAttributeNS(ns,name)||d.getAttribute(ns+":"+name)||d.getAttribute(name)||d[name]},getTextWidth:function(text,min,max){return(Ext.util.TextMetrics.measure(this.dom,Ext.value(text,this.dom.innerHTML,true)).width).constrain(min||0,max||1000000)}};var ep=El.prototype;ep.on=ep.addListener;ep.mon=ep.addListener;ep.getUpdateManager=ep.getUpdater;ep.un=ep.removeListener;ep.autoBoxAdjust=true;El.unitPattern=/\d+(px|em|%|en|ex|pt|in|cm|mm|pc)$/i;El.addUnits=function(v,defaultUnit){if(v===""||v=="auto"){return v}if(v===undefined){return""}if(typeof v=="number"||!El.unitPattern.test(v)){return v+(defaultUnit||"px")}return v};El.boxMarkup="
";El.VISIBILITY=1;El.DISPLAY=2;El.borders={l:"border-left-width",r:"border-right-width",t:"border-top-width",b:"border-bottom-width"};El.paddings={l:"padding-left",r:"padding-right",t:"padding-top",b:"padding-bottom"};El.margins={l:"margin-left",r:"margin-right",t:"margin-top",b:"margin-bottom"};El.cache={};var docEl;El.get=function(el){var ex,elm,id;if(!el){return null}if(typeof el=="string"){if(!(elm=document.getElementById(el))){return null}if(ex=El.cache[el]){ex.dom=elm}else{ex=El.cache[el]=new El(elm)}return ex}else{if(el.tagName){if(!(id=el.id)){id=Ext.id(el)}if(ex=El.cache[id]){ex.dom=el}else{ex=El.cache[id]=new El(el)}return ex}else{if(el instanceof El){if(el!=docEl){el.dom=document.getElementById(el.id)||el.dom;El.cache[el.id]=el}return el}else{if(el.isComposite){return el}else{if(Ext.isArray(el)){return El.select(el)}else{if(el==document){if(!docEl){var f=function(){};f.prototype=El.prototype;docEl=new f();docEl.dom=document}return docEl}}}}}}return null};El.uncache=function(el){for(var i=0,a=arguments,len=a.length;i0){F()}else{B.afterFx(D)}})};F.call(this)});return this},pause:function(C){var A=this.getFxEl();var B={};A.queueFx(B,function(){setTimeout(function(){A.afterFx(B)},C*1000)});return this},fadeIn:function(B){var A=this.getFxEl();B=B||{};A.queueFx(B,function(){this.setOpacity(0);this.fixDisplay();this.dom.style.visibility="visible";var C=B.endOpacity||1;arguments.callee.anim=this.fxanim({opacity:{to:C}},B,null,0.5,"easeOut",function(){if(C==1){this.clearOpacity()}A.afterFx(B)})});return this},fadeOut:function(B){var A=this.getFxEl();B=B||{};A.queueFx(B,function(){arguments.callee.anim=this.fxanim({opacity:{to:B.endOpacity||0}},B,null,0.5,"easeOut",function(){if(this.visibilityMode==Ext.Element.DISPLAY||B.useDisplay){this.dom.style.display="none"}else{this.dom.style.visibility="hidden"}this.clearOpacity();A.afterFx(B)})});return this},scale:function(A,B,C){this.shift(Ext.apply({},C,{width:A,height:B}));return this},shift:function(B){var A=this.getFxEl();B=B||{};A.queueFx(B,function(){var E={},D=B.width,F=B.height,C=B.x,H=B.y,G=B.opacity;if(D!==undefined){E.width={to:this.adjustWidth(D)}}if(F!==undefined){E.height={to:this.adjustHeight(F)}}if(B.left!==undefined){E.left={to:B.left}}if(B.top!==undefined){E.top={to:B.top}}if(B.right!==undefined){E.right={to:B.right}}if(B.bottom!==undefined){E.bottom={to:B.bottom}}if(C!==undefined||H!==undefined){E.points={to:[C!==undefined?C:this.getX(),H!==undefined?H:this.getY()]}}if(G!==undefined){E.opacity={to:G}}if(B.xy!==undefined){E.points={to:B.xy}}arguments.callee.anim=this.fxanim(E,B,"motion",0.35,"easeOut",function(){A.afterFx(B)})});return this},ghost:function(A,C){var B=this.getFxEl();C=C||{};B.queueFx(C,function(){A=A||"b";var H=this.getFxRestore();var E=this.getWidth(),G=this.getHeight();var F=this.dom.style;var J=function(){if(C.useDisplay){B.setDisplayed(false)}else{B.hide()}B.clearOpacity();B.setPositioning(H.pos);F.width=H.width;F.height=H.height;B.afterFx(C)};var D={opacity:{to:0},points:{}},I=D.points;switch(A.toLowerCase()){case"t":I.by=[0,-G];break;case"l":I.by=[-E,0];break;case"r":I.by=[E,0];break;case"b":I.by=[0,G];break;case"tl":I.by=[-E,-G];break;case"bl":I.by=[-E,G];break;case"br":I.by=[E,G];break;case"tr":I.by=[E,-G];break}arguments.callee.anim=this.fxanim(D,C,"motion",0.5,"easeOut",J)});return this},syncFx:function(){this.fxDefaults=Ext.apply(this.fxDefaults||{},{block:false,concurrent:true,stopFx:false});return this},sequenceFx:function(){this.fxDefaults=Ext.apply(this.fxDefaults||{},{block:false,concurrent:false,stopFx:false});return this},nextFx:function(){var A=this.fxQueue[0];if(A){A.call(this)}},hasActiveFx:function(){return this.fxQueue&&this.fxQueue[0]},stopFx:function(){if(this.hasActiveFx()){var A=this.fxQueue[0];if(A&&A.anim&&A.anim.isAnimated()){this.fxQueue=[A];A.anim.stop(true)}}return this},beforeFx:function(A){if(this.hasActiveFx()&&!A.concurrent){if(A.stopFx){this.stopFx();return true}return false}return true},hasFxBlock:function(){var A=this.fxQueue;return A&&A[0]&&A[0].block},queueFx:function(C,A){if(!this.fxQueue){this.fxQueue=[]}if(!this.hasFxBlock()){Ext.applyIf(C,this.fxDefaults);if(!C.concurrent){var B=this.beforeFx(C);A.block=C.block;this.fxQueue.push(A);if(B){this.nextFx()}}else{A.call(this)}}return this},fxWrap:function(F,D,C){var B;if(!D.wrap||!(B=Ext.get(D.wrap))){var A;if(D.fixPosition){A=this.getXY()}var E=document.createElement("div");E.style.visibility=C;B=Ext.get(this.dom.parentNode.insertBefore(E,this.dom));B.setPositioning(F);if(B.getStyle("position")=="static"){B.position("relative")}this.clearPositioning("auto");B.clip();B.dom.appendChild(this.dom);if(A){B.setXY(A)}}return B},fxUnwrap:function(A,C,B){this.clearPositioning();this.setPositioning(C);if(!B.wrap){A.dom.parentNode.insertBefore(this.dom,A.dom);A.remove()}},getFxRestore:function(){var A=this.dom.style;return{pos:this.getPositioning(),width:A.width,height:A.height}},afterFx:function(A){if(A.afterStyle){this.applyStyles(A.afterStyle)}if(A.afterCls){this.addClass(A.afterCls)}if(A.remove===true){this.remove()}Ext.callback(A.callback,A.scope,[this]);if(!A.concurrent){this.fxQueue.shift();this.nextFx()}},getFxEl:function(){return Ext.get(this.dom)},fxanim:function(D,E,B,F,C,A){B=B||"run";E=E||{};var G=Ext.lib.Anim[B](this.dom,D,(E.duration||F)||0.35,(E.easing||C)||"easeOut",function(){Ext.callback(A,this)},this);E.anim=G;return G}};Ext.Fx.resize=Ext.Fx.scale;Ext.apply(Ext.Element.prototype,Ext.Fx); +Ext.CompositeElement=function(A){this.elements=[];this.addElements(A)};Ext.CompositeElement.prototype={isComposite:true,addElements:function(E){if(!E){return this}if(typeof E=="string"){E=Ext.Element.selectorFunction(E)}var D=this.elements;var B=D.length-1;for(var C=0,A=E.length;C"+A.text+""}if(typeof A.scripts!="undefined"){this.loadScripts=A.scripts}if(typeof A.timeout!="undefined"){this.timeout=A.timeout}}this.showLoading();if(!D){this.defaultUrl=B}if(typeof B=="function"){B=B.call(this)}var E=Ext.apply({},{url:B,params:(typeof F=="function"&&C)?F.createDelegate(C):F,success:this.processSuccess,failure:this.processFailure,scope:this,callback:undefined,timeout:(this.timeout*1000),disableCaching:this.disableCaching,argument:{"options":A,"url":B,"form":null,"callback":G,"scope":C||window,"params":F}},A);this.transaction=Ext.Ajax.request(E)}},formUpdate:function(C,A,B,D){if(this.fireEvent("beforeupdate",this.el,C,A)!==false){if(typeof A=="function"){A=A.call(this)}C=Ext.getDom(C);this.transaction=Ext.Ajax.request({form:C,url:A,success:this.processSuccess,failure:this.processFailure,scope:this,timeout:(this.timeout*1000),argument:{"url":A,"form":C,"callback":D,"reset":B}});this.showLoading.defer(1,this)}},refresh:function(A){if(this.defaultUrl==null){return }this.update(this.defaultUrl,null,A,true)},startAutoRefresh:function(B,C,D,E,A){if(A){this.update(C||this.defaultUrl,D,E,true)}if(this.autoRefreshProcId){clearInterval(this.autoRefreshProcId)}this.autoRefreshProcId=setInterval(this.update.createDelegate(this,[C||this.defaultUrl,D,E,true]),B*1000)},stopAutoRefresh:function(){if(this.autoRefreshProcId){clearInterval(this.autoRefreshProcId);delete this.autoRefreshProcId}},isAutoRefreshing:function(){return this.autoRefreshProcId?true:false},showLoading:function(){if(this.showLoadIndicator){this.el.update(this.indicatorText)}},processSuccess:function(A){this.transaction=null;if(A.argument.form&&A.argument.reset){try{A.argument.form.reset()}catch(B){}}if(this.loadScripts){this.renderer.render(this.el,A,this,this.updateComplete.createDelegate(this,[A]))}else{this.renderer.render(this.el,A,this);this.updateComplete(A)}},updateComplete:function(A){this.fireEvent("update",this.el,A);if(typeof A.argument.callback=="function"){A.argument.callback.call(A.argument.scope,this.el,true,A,A.argument.options)}},processFailure:function(A){this.transaction=null;this.fireEvent("failure",this.el,A);if(typeof A.argument.callback=="function"){A.argument.callback.call(A.argument.scope,this.el,false,A,A.argument.options)}},setRenderer:function(A){this.renderer=A},getRenderer:function(){return this.renderer},setDefaultUrl:function(A){this.defaultUrl=A},abort:function(){if(this.transaction){Ext.Ajax.abort(this.transaction)}},isUpdating:function(){if(this.transaction){return Ext.Ajax.isLoading(this.transaction)}return false}});Ext.Updater.defaults={timeout:30,loadScripts:false,sslBlankUrl:(Ext.SSL_SECURE_URL||"javascript:false"),disableCaching:false,showLoadIndicator:true,indicatorText:"
Loading...
"};Ext.Updater.updateElement=function(D,C,E,B){var A=Ext.get(D).getUpdater();Ext.apply(A,B);A.update(C,E,B?B.callback:null)};Ext.Updater.BasicRenderer=function(){};Ext.Updater.BasicRenderer.prototype={render:function(C,A,B,D){C.update(A.responseText,B.loadScripts,D)}};Ext.UpdateManager=Ext.Updater; +(function(){Date.formatCodeToRegex=function(character,currentGroup){var p=Date.parseCodes[character];if(p){p=Ext.type(p)=="function"?p():p;Date.parseCodes[character]=p}return p?Ext.applyIf({c:p.c?String.format(p.c,currentGroup||"{0}"):p.c},p):{g:0,c:null,s:Ext.escapeRe(character)}};var $f=Date.formatCodeToRegex;Ext.apply(Date,{parseFunctions:{count:0},parseRegexes:[],formatFunctions:{count:0},daysInMonth:[31,28,31,30,31,30,31,31,30,31,30,31],y2kYear:50,MILLI:"ms",SECOND:"s",MINUTE:"mi",HOUR:"h",DAY:"d",MONTH:"mo",YEAR:"y",dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNumbers:{Jan:0,Feb:1,Mar:2,Apr:3,May:4,Jun:5,Jul:6,Aug:7,Sep:8,Oct:9,Nov:10,Dec:11},getShortMonthName:function(month){return Date.monthNames[month].substring(0,3)},getShortDayName:function(day){return Date.dayNames[day].substring(0,3)},getMonthNumber:function(name){return Date.monthNumbers[name.substring(0,1).toUpperCase()+name.substring(1,3).toLowerCase()]},formatCodes:{d:"String.leftPad(this.getDate(), 2, '0')",D:"Date.getShortDayName(this.getDay())",j:"this.getDate()",l:"Date.dayNames[this.getDay()]",N:"(this.getDay() ? this.getDay() : 7)",S:"this.getSuffix()",w:"this.getDay()",z:"this.getDayOfYear()",W:"String.leftPad(this.getWeekOfYear(), 2, '0')",F:"Date.monthNames[this.getMonth()]",m:"String.leftPad(this.getMonth() + 1, 2, '0')",M:"Date.getShortMonthName(this.getMonth())",n:"(this.getMonth() + 1)",t:"this.getDaysInMonth()",L:"(this.isLeapYear() ? 1 : 0)",o:"(this.getFullYear() + (this.getWeekOfYear() == 1 && this.getMonth() > 0 ? +1 : (this.getWeekOfYear() >= 52 && this.getMonth() < 11 ? -1 : 0)))",Y:"this.getFullYear()",y:"('' + this.getFullYear()).substring(2, 4)",a:"(this.getHours() < 12 ? 'am' : 'pm')",A:"(this.getHours() < 12 ? 'AM' : 'PM')",g:"((this.getHours() % 12) ? this.getHours() % 12 : 12)",G:"this.getHours()",h:"String.leftPad((this.getHours() % 12) ? this.getHours() % 12 : 12, 2, '0')",H:"String.leftPad(this.getHours(), 2, '0')",i:"String.leftPad(this.getMinutes(), 2, '0')",s:"String.leftPad(this.getSeconds(), 2, '0')",u:"String.leftPad(this.getMilliseconds(), 3, '0')",O:"this.getGMTOffset()",P:"this.getGMTOffset(true)",T:"this.getTimezone()",Z:"(this.getTimezoneOffset() * -60)",c:function(){for(var c="Y-m-dTH:i:sP",code=[],i=0,l=c.length;i 0) {";var regex="";var special=false;var ch="";for(var i=0;i= 0 && m >= 0 && d > 0 && h >= 0 && i >= 0 && s >= 0 && ms >= 0){\n"+"v = new Date(y, m, d, h, i, s, ms);\n"+"}else if (y >= 0 && m >= 0 && d > 0 && h >= 0 && i >= 0 && s >= 0){\n"+"v = new Date(y, m, d, h, i, s);\n"+"}else if (y >= 0 && m >= 0 && d > 0 && h >= 0 && i >= 0){\n"+"v = new Date(y, m, d, h, i);\n"+"}else if (y >= 0 && m >= 0 && d > 0 && h >= 0){\n"+"v = new Date(y, m, d, h);\n"+"}else if (y >= 0 && m >= 0 && d > 0){\n"+"v = new Date(y, m, d);\n"+"}else if (y >= 0 && m >= 0){\n"+"v = new Date(y, m);\n"+"}else if (y >= 0){\n"+"v = new Date(y);\n"+"}\n}\nreturn (v && (z || o))?"+" (Ext.type(z) == 'number' ? v.add(Date.SECOND, -v.getTimezoneOffset() * 60 - z) :"+" v.add(Date.MINUTE, -v.getTimezoneOffset() + (sn == '+'? -1 : 1) * (hr * 60 + mn))) : v;\n"+"}";Date.parseRegexes[regexNum]=new RegExp("^"+regex+"$","i");eval(code)},parseCodes:{d:{g:1,c:"d = parseInt(results[{0}], 10);\n",s:"(\\d{2})"},j:{g:1,c:"d = parseInt(results[{0}], 10);\n",s:"(\\d{1,2})"},D:function(){for(var a=[],i=0;i<7;a.push(Date.getShortDayName(i)),++i){}return{g:0,c:null,s:"(?:"+a.join("|")+")"}},l:function(){return{g:0,c:null,s:"(?:"+Date.dayNames.join("|")+")"}},N:{g:0,c:null,s:"[1-7]"},S:{g:0,c:null,s:"(?:st|nd|rd|th)"},w:{g:0,c:null,s:"[0-6]"},z:{g:0,c:null,s:"(?:\\d{1,3}"},W:{g:0,c:null,s:"(?:\\d{2})"},F:function(){return{g:1,c:"m = parseInt(Date.getMonthNumber(results[{0}]), 10);\n",s:"("+Date.monthNames.join("|")+")"}},M:function(){for(var a=[],i=0;i<12;a.push(Date.getShortMonthName(i)),++i){}return Ext.applyIf({s:"("+a.join("|")+")"},$f("F"))},m:{g:1,c:"m = parseInt(results[{0}], 10) - 1;\n",s:"(\\d{2})"},n:{g:1,c:"m = parseInt(results[{0}], 10) - 1;\n",s:"(\\d{1,2})"},t:{g:0,c:null,s:"(?:\\d{2})"},L:{g:0,c:null,s:"(?:1|0)"},o:function(){return $f("Y")},Y:{g:1,c:"y = parseInt(results[{0}], 10);\n",s:"(\\d{4})"},y:{g:1,c:"var ty = parseInt(results[{0}], 10);\n"+"y = ty > Date.y2kYear ? 1900 + ty : 2000 + ty;\n",s:"(\\d{1,2})"},a:{g:1,c:"if (results[{0}] == 'am') {\n"+"if (h == 12) { h = 0; }\n"+"} else { if (h < 12) { h += 12; }}",s:"(am|pm)"},A:{g:1,c:"if (results[{0}] == 'AM') {\n"+"if (h == 12) { h = 0; }\n"+"} else { if (h < 12) { h += 12; }}",s:"(AM|PM)"},g:function(){return $f("G")},G:{g:1,c:"h = parseInt(results[{0}], 10);\n",s:"(\\d{1,2})"},h:function(){return $f("H")},H:{g:1,c:"h = parseInt(results[{0}], 10);\n",s:"(\\d{2})"},i:{g:1,c:"i = parseInt(results[{0}], 10);\n",s:"(\\d{2})"},s:{g:1,c:"s = parseInt(results[{0}], 10);\n",s:"(\\d{2})"},u:{g:1,c:"ms = results[{0}]; ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n",s:"(\\d+)"},O:{g:1,c:["o = results[{0}];","var sn = o.substring(0,1);","var hr = o.substring(1,3)*1 + Math.floor(o.substring(3,5) / 60);","var mn = o.substring(3,5) % 60;","o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + String.leftPad(hr, 2, '0') + String.leftPad(mn, 2, '0')) : null;\n"].join("\n"),s:"([+-]\\d{4})"},P:{g:1,c:["o = results[{0}];","var sn = o.substring(0,1);","var hr = o.substring(1,3)*1 + Math.floor(o.substring(4,6) / 60);","var mn = o.substring(4,6) % 60;","o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + String.leftPad(hr, 2, '0') + String.leftPad(mn, 2, '0')) : null;\n"].join("\n"),s:"([+-]\\d{2}:\\d{2})"},T:{g:0,c:null,s:"[A-Z]{1,4}"},Z:{g:1,c:"z = results[{0}] * 1;\n"+"z = (-43200 <= z && z <= 50400)? z : null;\n",s:"([+-]?\\d{1,5})"},c:function(){var calc=[];var arr=[$f("Y",1),$f("m",2),$f("d",3),$f("h",4),$f("i",5),$f("s",6),{c:"ms = (results[7] || '.0').substring(1); ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n"},{c:"if(results[9] == 'Z'){\no = 0;\n}else{\n"+$f("P",9).c+"\n}"}];for(var i=0,l=arr.length;i0?"-":"+")+String.leftPad(Math.abs(Math.floor(this.getTimezoneOffset()/60)),2,"0")+(A?":":"")+String.leftPad(Math.abs(this.getTimezoneOffset()%60),2,"0")},getDayOfYear:function(){var A=0;Date.daysInMonth[1]=this.isLeapYear()?29:28;for(var B=0;B28){A=Math.min(A,this.getFirstDateOfMonth().add("mo",C).getLastDateOfMonth().getDate())}D.setDate(A);D.setMonth(this.getMonth()+C);break;case Date.YEAR:D.setFullYear(this.getFullYear()+C);break}return D},between:function(C,A){var B=this.getTime();return C.getTime()<=B&&B<=A.getTime()}});Date.prototype.format=Date.prototype.dateFormat;if(Ext.isSafari){Date.brokenSetMonth=Date.prototype.setMonth;Date.prototype.setMonth=function(A){if(A<=-1){var D=Math.ceil(-A);var C=Math.ceil(D/12);var B=(D%12)?12-D%12:0;this.setFullYear(this.getFullYear()-C);return Date.brokenSetMonth.call(this,B)}else{return Date.brokenSetMonth.apply(this,arguments)}}}; +Ext.util.DelayedTask=function(E,D,A){var G=null,F,B;var C=function(){var H=new Date().getTime();if(H-B>=F){clearInterval(G);G=null;E.apply(D,A||[])}};this.delay=function(I,K,J,H){if(G&&I!=F){this.cancel()}F=I;B=new Date().getTime();E=K||E;D=J||D;A=H||A;if(!G){G=setInterval(C,F)}};this.cancel=function(){if(G){clearInterval(G);G=null}}}; +Ext.util.TaskRunner=function(E){E=E||10;var F=[],A=[];var B=0;var G=false;var D=function(){G=false;clearInterval(B);B=0};var H=function(){if(!G){G=true;B=setInterval(I,E)}};var C=function(J){A.push(J);if(J.onStop){J.onStop.apply(J.scope||J)}};var I=function(){if(A.length>0){for(var O=0,K=A.length;O1||Ext.isArray(E)){var B=arguments.length>1?arguments:E;for(var D=0,A=B.length;D=this.length){return this.add(B,C)}this.length++;this.items.splice(A,0,C);if(typeof B!="undefined"&&B!=null){this.map[B]=C}this.keys.splice(A,0,B);this.fireEvent("add",A,C,B);return C},remove:function(A){return this.removeAt(this.indexOf(A))},removeAt:function(A){if(A=0){this.length--;var C=this.items[A];this.items.splice(A,1);var B=this.keys[A];if(typeof B!="undefined"){delete this.map[B]}this.keys.splice(A,1);this.fireEvent("remove",C,B);return C}return false},removeKey:function(A){return this.removeAt(this.indexOfKey(A))},getCount:function(){return this.length},indexOf:function(A){return this.items.indexOf(A)},indexOfKey:function(A){return this.keys.indexOf(A)},item:function(A){var B=typeof this.map[A]!="undefined"?this.map[A]:this.items[A];return typeof B!="function"||this.allowFunctions?B:null},itemAt:function(A){return this.items[A]},key:function(A){return this.map[A]},contains:function(A){return this.indexOf(A)!=-1},containsKey:function(A){return typeof this.map[A]!="undefined"},clear:function(){this.length=0;this.items=[];this.keys=[];this.map={};this.fireEvent("clear")},first:function(){return this.items[0]},last:function(){return this.items[this.length-1]},_sort:function(I,A,H){var C=String(A).toUpperCase()=="DESC"?-1:1;H=H||function(K,J){return K-J};var G=[],B=this.keys,F=this.items;for(var D=0,E=F.length;D=A;C--){D[D.length]=B[C]}}return D},filter:function(C,B,D,A){if(Ext.isEmpty(B,false)){return this.clone()}B=this.createValueMatcher(B,D,A);return this.filterBy(function(E){return E&&B.test(E[C])})},filterBy:function(F,E){var G=new Ext.util.MixedCollection();G.getKey=this.getKey;var B=this.keys,D=this.items;for(var C=0,A=D.length;C0){for(var C=0;Clen){return value.substr(0,len-3)+"..."}return value},undef:function(value){return value!==undefined?value:""},defaultValue:function(value,defaultValue){return value!==undefined&&value!==""?value:defaultValue},htmlEncode:function(value){return !value?value:String(value).replace(/&/g,"&").replace(/>/g,">").replace(/").replace(/</g,"<").replace(/"/g,"\"").replace(/&/g,"&")},trim:function(value){return String(value).replace(trimRe,"")},substr:function(value,start,length){return String(value).substr(start,length)},lowercase:function(value){return String(value).toLowerCase()},uppercase:function(value){return String(value).toUpperCase()},capitalize:function(value){return !value?value:value.charAt(0).toUpperCase()+value.substr(1).toLowerCase()},call:function(value,fn){if(arguments.length>2){var args=Array.prototype.slice.call(arguments,2);args.unshift(value);return eval(fn).apply(window,args)}else{return eval(fn).call(window,value)}},usMoney:function(v){v=(Math.round((v-0)*100))/100;v=(v==Math.floor(v))?v+".00":((v*10==Math.floor(v*10))?v+"0":v);v=String(v);var ps=v.split(".");var whole=ps[0];var sub=ps[1]?"."+ps[1]:".00";var r=/(\d+)(\d{3})/;while(r.test(whole)){whole=whole.replace(r,"$1"+","+"$2")}v=whole+sub;if(v.charAt(0)=="-"){return"-$"+v.substr(1)}return"$"+v},date:function(v,format){if(!v){return""}if(!Ext.isDate(v)){v=new Date(Date.parse(v))}return v.dateFormat(format||"m/d/Y")},dateRenderer:function(format){return function(v){return Ext.util.Format.date(v,format)}},stripTagsRE:/<\/?[^>]+>/gi,stripTags:function(v){return !v?v:String(v).replace(this.stripTagsRE,"")},stripScriptsRe:/(?:)((\n|\r|.)*?)(?:<\/script>)/ig,stripScripts:function(v){return !v?v:String(v).replace(this.stripScriptsRe,"")},fileSize:function(size){if(size<1024){return size+" bytes"}else{if(size<1048576){return(Math.round(((size*10)/1024))/10)+" KB"}else{return(Math.round(((size*10)/1048576))/10)+" MB"}}},math:function(){var fns={};return function(v,a){if(!fns[a]){fns[a]=new Function("v","return v "+a+";")}return fns[a](v)}}(),nl2br:function(v){return v===undefined||v===null?"":v.replace(/\n/g,"
")}}}(); +Ext.XTemplate=function(){Ext.XTemplate.superclass.constructor.apply(this,arguments);var P=this.html;P=["",P,""].join("");var O=/]*>((?:(?=([^<]+))\2|<(?!tpl\b[^>]*>))*?)<\/tpl>/;var N=/^]*?for="(.*?)"/;var L=/^]*?if="(.*?)"/;var J=/^]*?exec="(.*?)"/;var C,B=0;var G=[];while(C=P.match(O)){var M=C[0].match(N);var K=C[0].match(L);var I=C[0].match(J);var E=null,H=null,D=null;var A=M&&M[1]?M[1]:"";if(K){E=K&&K[1]?K[1]:null;if(E){H=new Function("values","parent","xindex","xcount","with(values){ return "+(Ext.util.Format.htmlDecode(E))+"; }")}}if(I){E=I&&I[1]?I[1]:null;if(E){D=new Function("values","parent","xindex","xcount","with(values){ "+(Ext.util.Format.htmlDecode(E))+"; }")}}if(A){switch(A){case".":A=new Function("values","parent","with(values){ return values; }");break;case"..":A=new Function("values","parent","with(values){ return parent; }");break;default:A=new Function("values","parent","with(values){ return "+A+"; }")}}G.push({id:B,target:A,exec:D,test:H,body:C[1]||""});P=P.replace(C[0],"{xtpl"+B+"}");++B}for(var F=G.length-1;F>=0;--F){this.compileTpl(G[F])}this.master=G[G.length-1];this.tpls=G};Ext.extend(Ext.XTemplate,Ext.Template,{re:/\{([\w-\.\#]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?(\s?[\+\-\*\\]\s?[\d\.\+\-\*\\\(\)]+)?\}/g,codeRe:/\{\[((?:\\\]|.|\n)*?)\]\}/g,applySubTemplate:function(A,H,G,D,C){var J=this.tpls[A];if(J.test&&!J.test.call(this,H,G,D,C)){return""}if(J.exec&&J.exec.call(this,H,G,D,C)){return""}var I=J.target?J.target.call(this,H,G):H;G=J.target?H:G;if(J.target&&Ext.isArray(I)){var B=[];for(var E=0,F=I.length;E=0;--E){D[H[E].selectorText]=H[E]}}catch(G){}},getRules:function(F){if(D==null||F){D={};var H=C.styleSheets;for(var G=0,E=H.length;G=37&&A<=40){C.stopEvent()}},relay:function(C){var A=C.getKey();var B=this.keyToHandler[A];if(B&&this[B]){if(this.doRelay(C,this[B],B)!==true){C[this.defaultEventAction]()}}},doRelay:function(C,B,A){return B.call(this.scope||this,C)},enter:false,left:false,right:false,up:false,down:false,tab:false,esc:false,pageUp:false,pageDown:false,del:false,home:false,end:false,keyToHandler:{37:"left",39:"right",38:"up",40:"down",33:"pageUp",34:"pageDown",46:"del",36:"home",35:"end",13:"enter",27:"esc",9:"tab"},enable:function(){if(this.disabled){if(this.forceKeyDown||Ext.isIE||Ext.isSafari3||Ext.isAir){this.el.on("keydown",this.relay,this)}else{this.el.on("keydown",this.prepareEvent,this);this.el.on("keypress",this.relay,this)}this.disabled=false}},disable:function(){if(!this.disabled){if(this.forceKeyDown||Ext.isIE||Ext.isSafari3||Ext.isAir){this.el.un("keydown",this.relay)}else{this.el.un("keydown",this.prepareEvent);this.el.un("keypress",this.relay)}this.disabled=true}}}; +Ext.KeyMap=function(C,B,A){this.el=Ext.get(C);this.eventName=A||"keydown";this.bindings=[];if(B){this.addBinding(B)}this.enable()};Ext.KeyMap.prototype={stopEvent:false,addBinding:function(D){if(Ext.isArray(D)){for(var F=0,H=D.length;F=this.minX;D=D-C){if(!E[D]){this.xTicks[this.xTicks.length]=D;E[D]=true}}for(D=this.initPageX;D<=this.maxX;D=D+C){if(!E[D]){this.xTicks[this.xTicks.length]=D;E[D]=true}}this.xTicks.sort(this.DDM.numericSort)},setYTicks:function(F,C){this.yTicks=[];this.yTickSize=C;var E={};for(var D=this.initPageY;D>=this.minY;D=D-C){if(!E[D]){this.yTicks[this.yTicks.length]=D;E[D]=true}}for(D=this.initPageY;D<=this.maxY;D=D+C){if(!E[D]){this.yTicks[this.yTicks.length]=D;E[D]=true}}this.yTicks.sort(this.DDM.numericSort)},setXConstraint:function(E,D,C){this.leftConstraint=E;this.rightConstraint=D;this.minX=this.initPageX-E;this.maxX=this.initPageX+D;if(C){this.setXTicks(this.initPageX,C)}this.constrainX=true},clearConstraints:function(){this.constrainX=false;this.constrainY=false;this.clearTicks()},clearTicks:function(){this.xTicks=null;this.yTicks=null;this.xTickSize=0;this.yTickSize=0},setYConstraint:function(C,E,D){this.topConstraint=C;this.bottomConstraint=E;this.minY=this.initPageY-C;this.maxY=this.initPageY+E;if(D){this.setYTicks(this.initPageY,D)}this.constrainY=true},resetConstraints:function(){if(this.initPageX||this.initPageX===0){var D=(this.maintainOffset)?this.lastPageX-this.initPageX:0;var C=(this.maintainOffset)?this.lastPageY-this.initPageY:0;this.setInitPosition(D,C)}else{this.setInitPosition()}if(this.constrainX){this.setXConstraint(this.leftConstraint,this.rightConstraint,this.xTickSize)}if(this.constrainY){this.setYConstraint(this.topConstraint,this.bottomConstraint,this.yTickSize)}},getTick:function(I,F){if(!F){return I}else{if(F[0]>=I){return F[0]}else{for(var D=0,C=F.length;D=I){var H=I-F[D];var G=F[E]-I;return(G>H)?F[D]:F[E]}}return F[F.length-1]}}},toString:function(){return("DragDrop "+this.id)}}})();if(!Ext.dd.DragDropMgr){Ext.dd.DragDropMgr=function(){var A=Ext.EventManager;return{ids:{},handleIds:{},dragCurrent:null,dragOvers:{},deltaX:0,deltaY:0,preventDefault:true,stopPropagation:true,initialized:false,locked:false,init:function(){this.initialized=true},POINT:0,INTERSECT:1,mode:0,_execOnAll:function(D,C){for(var E in this.ids){for(var B in this.ids[E]){var F=this.ids[E][B];if(!this.isTypeOfDD(F)){continue}F[D].apply(F,C)}}},_onLoad:function(){this.init();A.on(document,"mouseup",this.handleMouseUp,this,true);A.on(document,"mousemove",this.handleMouseMove,this,true);A.on(window,"unload",this._onUnload,this,true);A.on(window,"resize",this._onResize,this,true)},_onResize:function(B){this._execOnAll("resetConstraints",[])},lock:function(){this.locked=true},unlock:function(){this.locked=false},isLocked:function(){return this.locked},locationCache:{},useCache:true,clickPixelThresh:3,clickTimeThresh:350,dragThreshMet:false,clickTimeout:null,startX:0,startY:0,regDragDrop:function(C,B){if(!this.initialized){this.init()}if(!this.ids[B]){this.ids[B]={}}this.ids[B][C.id]=C},removeDDFromGroup:function(D,B){if(!this.ids[B]){this.ids[B]={}}var C=this.ids[B];if(C&&C[D.id]){delete C[D.id]}},_remove:function(C){for(var B in C.groups){if(B&&this.ids[B][C.id]){delete this.ids[B][C.id]}}delete this.handleIds[C.id]},regHandle:function(C,B){if(!this.handleIds[C]){this.handleIds[C]={}}this.handleIds[C][B]=B},isDragDrop:function(B){return(this.getDDById(B))?true:false},getRelated:function(F,C){var E=[];for(var D in F.groups){for(j in this.ids[D]){var B=this.ids[D][j];if(!this.isTypeOfDD(B)){continue}if(!C||B.isTarget){E[E.length]=B}}}return E},isLegalTarget:function(F,E){var C=this.getRelated(F,true);for(var D=0,B=C.length;Dthis.clickPixelThresh||B>this.clickPixelThresh){this.startDrag(this.startX,this.startY)}}if(this.dragThreshMet){this.dragCurrent.b4Drag(D);this.dragCurrent.onDrag(D);if(!this.dragCurrent.moveOnly){this.fireEvents(D,false)}}this.stopEvent(D);return true},fireEvents:function(K,L){var N=this.dragCurrent;if(!N||N.isLocked()){return }var O=K.getPoint();var B=[];var E=[];var I=[];var G=[];var D=[];for(var F in this.dragOvers){var C=this.dragOvers[F];if(!this.isTypeOfDD(C)){continue}if(!this.isOverTarget(O,C,this.mode)){E.push(C)}B[F]=true;delete this.dragOvers[F]}for(var M in N.groups){if("string"!=typeof M){continue}for(F in this.ids[M]){var H=this.ids[M][F];if(!this.isTypeOfDD(H)){continue}if(H.isTarget&&!H.isLocked()&&H!=N){if(this.isOverTarget(O,H,this.mode)){if(L){G.push(H)}else{if(!B[H.id]){D.push(H)}else{I.push(H)}this.dragOvers[H.id]=H}}}}}if(this.mode){if(E.length){N.b4DragOut(K,E);N.onDragOut(K,E)}if(D.length){N.onDragEnter(K,D)}if(I.length){N.b4DragOver(K,I);N.onDragOver(K,I)}if(G.length){N.b4DragDrop(K,G);N.onDragDrop(K,G)}}else{var J=0;for(F=0,J=E.length;F2000){}else{setTimeout(B._addListeners,10);if(document&&document.body){B._timeoutCount+=1}}}},handleWasClicked:function(B,D){if(this.isHandle(D,B.id)){return true}else{var C=B.parentNode;while(C){if(this.isHandle(D,C.id)){return true}else{C=C.parentNode}}}return false}}}();Ext.dd.DDM=Ext.dd.DragDropMgr;Ext.dd.DDM._addListeners()}Ext.dd.DD=function(C,A,B){if(C){this.init(C,A,B)}};Ext.extend(Ext.dd.DD,Ext.dd.DragDrop,{scroll:true,autoOffset:function(C,B){var A=C-this.startPageX;var D=B-this.startPageY;this.setDelta(A,D)},setDelta:function(B,A){this.deltaX=B;this.deltaY=A},setDragElPos:function(C,B){var A=this.getDragEl();this.alignElWithMouse(A,C,B)},alignElWithMouse:function(C,G,F){var E=this.getTargetCoord(G,F);var B=C.dom?C:Ext.fly(C,"_dd");if(!this.deltaSetXY){var H=[E.x,E.y];B.setXY(H);var D=B.getLeft(true);var A=B.getTop(true);this.deltaSetXY=[D-E.x,A-E.y]}else{B.setLeftTop(E.x+this.deltaSetXY[0],E.y+this.deltaSetXY[1])}this.cachePosition(E.x,E.y);this.autoScroll(E.x,E.y,C.offsetHeight,C.offsetWidth);return E},cachePosition:function(B,A){if(B){this.lastPageX=B;this.lastPageY=A}else{var C=Ext.lib.Dom.getXY(this.getEl());this.lastPageX=C[0];this.lastPageY=C[1]}},autoScroll:function(J,I,E,K){if(this.scroll){var L=Ext.lib.Dom.getViewHeight();var B=Ext.lib.Dom.getViewWidth();var N=this.DDM.getScrollTop();var D=this.DDM.getScrollLeft();var H=E+I;var M=K+J;var G=(L+N-I-this.deltaY);var F=(B+D-J-this.deltaX);var C=40;var A=(document.all)?80:30;if(H>L&&G0&&I-NB&&F0&&J-Dthis.maxX){A=this.maxX}}if(this.constrainY){if(Dthis.maxY){D=this.maxY}}A=this.getTick(A,this.xTicks);D=this.getTick(D,this.yTicks);return{x:A,y:D}},applyConfig:function(){Ext.dd.DD.superclass.applyConfig.call(this);this.scroll=(this.config.scroll!==false)},b4MouseDown:function(A){this.autoOffset(A.getPageX(),A.getPageY())},b4Drag:function(A){this.setDragElPos(A.getPageX(),A.getPageY())},toString:function(){return("DD "+this.id)}});Ext.dd.DDProxy=function(C,A,B){if(C){this.init(C,A,B);this.initFrame()}};Ext.dd.DDProxy.dragElId="ygddfdiv";Ext.extend(Ext.dd.DDProxy,Ext.dd.DD,{resizeFrame:true,centerFrame:false,createFrame:function(){var B=this;var A=document.body;if(!A||!A.firstChild){setTimeout(function(){B.createFrame()},50);return }var D=this.getDragEl();if(!D){D=document.createElement("div");D.id=this.dragElId;var C=D.style;C.position="absolute";C.visibility="hidden";C.cursor="move";C.border="2px solid #aaa";C.zIndex=999;A.insertBefore(D,A.firstChild)}},initFrame:function(){this.createFrame()},applyConfig:function(){Ext.dd.DDProxy.superclass.applyConfig.call(this);this.resizeFrame=(this.config.resizeFrame!==false);this.centerFrame=(this.config.centerFrame);this.setDragElId(this.config.dragElId||Ext.dd.DDProxy.dragElId)},showFrame:function(E,D){var C=this.getEl();var A=this.getDragEl();var B=A.style;this._resizeProxy();if(this.centerFrame){this.setDelta(Math.round(parseInt(B.width,10)/2),Math.round(parseInt(B.height,10)/2))}this.setDragElPos(E,D);Ext.fly(A).show()},_resizeProxy:function(){if(this.resizeFrame){var A=this.getEl();Ext.fly(this.getDragEl()).setSize(A.offsetWidth,A.offsetHeight)}},b4MouseDown:function(B){var A=B.getPageX();var C=B.getPageY();this.autoOffset(A,C);this.setDragElPos(A,C)},b4StartDrag:function(A,B){this.showFrame(A,B)},b4EndDrag:function(A){Ext.fly(this.getDragEl()).hide()},endDrag:function(C){var B=this.getEl();var A=this.getDragEl();A.style.visibility="";this.beforeMove();B.style.visibility="hidden";Ext.dd.DDM.moveToEl(B,A);A.style.visibility="hidden";B.style.visibility="";this.afterDrag()},beforeMove:function(){},afterDrag:function(){},toString:function(){return("DDProxy "+this.id)}});Ext.dd.DDTarget=function(C,A,B){if(C){this.initTarget(C,A,B)}};Ext.extend(Ext.dd.DDTarget,Ext.dd.DragDrop,{toString:function(){return("DDTarget "+this.id)}}); +Ext.dd.DragTracker=function(A){Ext.apply(this,A);this.addEvents("mousedown","mouseup","mousemove","dragstart","dragend","drag");this.dragRegion=new Ext.lib.Region(0,0,0,0);if(this.el){this.initEl(this.el)}};Ext.extend(Ext.dd.DragTracker,Ext.util.Observable,{active:false,tolerance:5,autoStart:false,initEl:function(A){this.el=Ext.get(A);A.on("mousedown",this.onMouseDown,this,this.delegate?{delegate:this.delegate}:undefined)},destroy:function(){this.el.un("mousedown",this.onMouseDown,this)},onMouseDown:function(C,B){if(this.fireEvent("mousedown",this,C)!==false&&this.onBeforeStart(C)!==false){this.startXY=this.lastXY=C.getXY();this.dragTarget=this.delegate?B:this.el.dom;C.preventDefault();var A=Ext.getDoc();A.on("mouseup",this.onMouseUp,this);A.on("mousemove",this.onMouseMove,this);A.on("selectstart",this.stopSelect,this);if(this.autoStart){this.timer=this.triggerStart.defer(this.autoStart===true?1000:this.autoStart,this)}}},onMouseMove:function(D,C){D.preventDefault();var B=D.getXY(),A=this.startXY;this.lastXY=B;if(!this.active){if(Math.abs(A[0]-B[0])>this.tolerance||Math.abs(A[1]-B[1])>this.tolerance){this.triggerStart()}else{return }}this.fireEvent("mousemove",this,D);this.onDrag(D);this.fireEvent("drag",this,D)},onMouseUp:function(B){var A=Ext.getDoc();A.un("mousemove",this.onMouseMove,this);A.un("mouseup",this.onMouseUp,this);A.un("selectstart",this.stopSelect,this);B.preventDefault();this.clearStart();this.active=false;delete this.elRegion;this.fireEvent("mouseup",this,B);this.onEnd(B);this.fireEvent("dragend",this,B)},triggerStart:function(A){this.clearStart();this.active=true;this.onStart(this.startXY);this.fireEvent("dragstart",this,this.startXY)},clearStart:function(){if(this.timer){clearTimeout(this.timer);delete this.timer}},stopSelect:function(A){A.stopEvent();return false},onBeforeStart:function(A){},onStart:function(A){},onDrag:function(A){},onEnd:function(A){},getDragTarget:function(){return this.dragTarget},getDragCt:function(){return this.el},getXY:function(A){return A?this.constrainModes[A].call(this,this.lastXY):this.lastXY},getOffset:function(C){var B=this.getXY(C);var A=this.startXY;return[A[0]-B[0],A[1]-B[1]]},constrainModes:{"point":function(B){if(!this.elRegion){this.elRegion=this.getDragCt().getRegion()}var A=this.dragRegion;A.left=B[0];A.top=B[1];A.right=B[0];A.bottom=B[1];A.constrainTo(this.elRegion);return[A.left,A.top]}}}); +Ext.dd.ScrollManager=function(){var C=Ext.dd.DragDropMgr;var E={};var B=null;var H={};var G=function(K){B=null;A()};var I=function(){if(C.dragCurrent){C.refreshCache(C.dragCurrent.groups)}};var D=function(){if(C.dragCurrent){var K=Ext.dd.ScrollManager;var L=H.el.ddScrollConfig?H.el.ddScrollConfig.increment:K.increment;if(!K.animate){if(H.el.scroll(H.dir,L)){I()}}else{H.el.scroll(H.dir,L,true,K.animDuration,I)}}};var A=function(){if(H.id){clearInterval(H.id)}H.id=0;H.el=null;H.dir=""};var F=function(L,K){A();H.el=L;H.dir=K;var M=(L.ddScrollConfig&&L.ddScrollConfig.frequency)?L.ddScrollConfig.frequency:Ext.dd.ScrollManager.frequency;H.id=setInterval(D,M)};var J=function(N,P){if(P||!C.dragCurrent){return }var Q=Ext.dd.ScrollManager;if(!B||B!=C.dragCurrent){B=C.dragCurrent;Q.refreshCache()}var R=Ext.lib.Event.getXY(N);var S=new Ext.lib.Point(R[0],R[1]);for(var L in E){var M=E[L],K=M._region;var O=M.ddScrollConfig?M.ddScrollConfig:Q;if(K&&K.contains(S)&&M.isScrollable()){if(K.bottom-S.y<=O.vthresh){if(H.el!=M){F(M,"down")}return }else{if(K.right-S.x<=O.hthresh){if(H.el!=M){F(M,"left")}return }else{if(S.y-K.top<=O.vthresh){if(H.el!=M){F(M,"up")}return }else{if(S.x-K.left<=O.hthresh){if(H.el!=M){F(M,"right")}return }}}}}}A()};C.fireEvents=C.fireEvents.createSequence(J,C);C.stopDrag=C.stopDrag.createSequence(G,C);return{register:function(M){if(Ext.isArray(M)){for(var L=0,K=M.length;L]+>/gi,asText:function(A){return String(A).replace(this.stripTagsRE,"")},asUCText:function(A){return String(A).toUpperCase().replace(this.stripTagsRE,"")},asUCString:function(A){return String(A).toUpperCase()},asDate:function(A){if(!A){return 0}if(Ext.isDate(A)){return A.getTime()}return Date.parse(String(A))},asFloat:function(A){var B=parseFloat(String(A).replace(/,/g,""));if(isNaN(B)){B=0}return B},asInt:function(A){var B=parseInt(String(A).replace(/,/g,""));if(isNaN(B)){B=0}return B}}; +Ext.data.Record=function(A,B){this.id=(B||B===0)?B:++Ext.data.Record.AUTO_ID;this.data=A};Ext.data.Record.create=function(E){var C=Ext.extend(Ext.data.Record,{});var D=C.prototype;D.fields=new Ext.util.MixedCollection(false,function(F){return F.name});for(var B=0,A=E.length;BG?1:(H0},isExpandable:function(){return this.attributes.expandable||this.hasChildNodes()},appendChild:function(E){var F=false;if(Ext.isArray(E)){F=E}else{if(arguments.length>1){F=arguments}}if(F){for(var D=0,A=F.length;D0){var F=D?function(){E.apply(D,arguments)}:E;C.sort(F);for(var B=0;BG+L.left){H=G-I-this.shadowOffset;E=true}if((F+D)>C+L.top){F=C-D-this.shadowOffset;E=true}if(H=J){F=J-D-5}}K=[H,F];this.storeXY(K);A.setXY.call(this,K);this.sync()}}},isVisible:function(){return this.visible},showAction:function(){this.visible=true;if(this.useDisplay===true){this.setDisplayed("")}else{if(this.lastXY){A.setXY.call(this,this.lastXY)}else{if(this.lastLT){A.setLeftTop.call(this,this.lastLT[0],this.lastLT[1])}}}},hideAction:function(){this.visible=false;if(this.useDisplay===true){this.setDisplayed(false)}else{this.setLeftTop(-10000,-10000)}},setVisible:function(E,D,G,H,F){if(E){this.showAction()}if(D&&E){var C=function(){this.sync(true);if(H){H()}}.createDelegate(this);A.setVisible.call(this,true,true,G,C,F)}else{if(!E){this.hideUnders(true)}var C=H;if(D){C=function(){this.hideAction();if(H){H()}}.createDelegate(this)}A.setVisible.call(this,E,D,G,C,F);if(E){this.sync(true)}else{if(!D){this.hideAction()}}}},storeXY:function(C){delete this.lastLT;this.lastXY=C},storeLeftTop:function(D,C){delete this.lastXY;this.lastLT=[D,C]},beforeFx:function(){this.beforeAction();return Ext.Layer.superclass.beforeFx.apply(this,arguments)},afterFx:function(){Ext.Layer.superclass.afterFx.apply(this,arguments);this.sync(this.isVisible())},beforeAction:function(){if(!this.updating&&this.shadow){this.shadow.hide()}},setLeft:function(C){this.storeLeftTop(C,this.getTop(true));A.setLeft.apply(this,arguments);this.sync()},setTop:function(C){this.storeLeftTop(this.getLeft(true),C);A.setTop.apply(this,arguments);this.sync()},setLeftTop:function(D,C){this.storeLeftTop(D,C);A.setLeftTop.apply(this,arguments);this.sync()},setXY:function(F,D,G,H,E){this.fixDisplay();this.beforeAction();this.storeXY(F);var C=this.createCB(H);A.setXY.call(this,F,D,G,C,E);if(!D){C()}},createCB:function(D){var C=this;return function(){C.constrainXY();C.sync(true);if(D){D()}}},setX:function(C,D,F,G,E){this.setXY([C,this.getY()],D,F,G,E)},setY:function(G,C,E,F,D){this.setXY([this.getX(),G],C,E,F,D)},setSize:function(E,F,D,H,I,G){this.beforeAction();var C=this.createCB(I);A.setSize.call(this,E,F,D,H,C,G);if(!D){C()}},setWidth:function(E,D,G,H,F){this.beforeAction();var C=this.createCB(H);A.setWidth.call(this,E,D,G,C,F);if(!D){C()}},setHeight:function(E,D,G,H,F){this.beforeAction();var C=this.createCB(H);A.setHeight.call(this,E,D,G,C,F);if(!D){C()}},setBounds:function(J,H,K,D,I,F,G,E){this.beforeAction();var C=this.createCB(G);if(!I){this.storeXY([J,H]);A.setXY.call(this,[J,H]);A.setSize.call(this,K,D,I,F,C,E);C()}else{A.setBounds.call(this,J,H,K,D,I,F,C,E)}return this},setZIndex:function(C){this.zindex=C;this.setStyle("z-index",C+2);if(this.shadow){this.shadow.setZIndex(C+1)}if(this.shim){this.shim.setStyle("z-index",C)}}})})(); +Ext.Shadow=function(C){Ext.apply(this,C);if(typeof this.mode!="string"){this.mode=this.defaultMode}var D=this.offset,B={h:0};var A=Math.floor(this.offset/2);switch(this.mode.toLowerCase()){case"drop":B.w=0;B.l=B.t=D;B.t-=1;if(Ext.isIE){B.l-=this.offset+A;B.t-=this.offset+A;B.w-=A;B.h-=A;B.t+=1}break;case"sides":B.w=(D*2);B.l=-D;B.t=D-1;if(Ext.isIE){B.l-=(this.offset-A);B.t-=this.offset+A;B.l+=1;B.w-=(this.offset-A)*2;B.w-=A+1;B.h-=1}break;case"frame":B.w=B.h=(D*2);B.l=B.t=-D;B.t+=1;B.h-=2;if(Ext.isIE){B.l-=(this.offset-A);B.t-=(this.offset-A);B.l+=1;B.w-=(this.offset+A+1);B.h-=(this.offset+A);B.h+=1}break}this.adjusts=B};Ext.Shadow.prototype={offset:4,defaultMode:"drop",show:function(A){A=Ext.get(A);if(!this.el){this.el=Ext.Shadow.Pool.pull();if(this.el.dom.nextSibling!=A.dom){this.el.insertBefore(A)}}this.el.setStyle("z-index",this.zIndex||parseInt(A.getStyle("z-index"),10)-1);if(Ext.isIE){this.el.dom.style.filter="progid:DXImageTransform.Microsoft.alpha(opacity=50) progid:DXImageTransform.Microsoft.Blur(pixelradius="+(this.offset)+")"}this.realign(A.getLeft(true),A.getTop(true),A.getWidth(),A.getHeight());this.el.dom.style.display="block"},isVisible:function(){return this.el?true:false},realign:function(A,M,L,D){if(!this.el){return }var I=this.adjusts,G=this.el.dom,N=G.style;var E=0;N.left=(A+I.l)+"px";N.top=(M+I.t)+"px";var K=(L+I.w),C=(D+I.h),F=K+"px",J=C+"px";if(N.width!=F||N.height!=J){N.width=F;N.height=J;if(!Ext.isIE){var H=G.childNodes;var B=Math.max(0,(K-12))+"px";H[0].childNodes[1].style.width=B;H[1].childNodes[1].style.width=B;H[2].childNodes[1].style.width=B;H[1].style.height=Math.max(0,(C-12))+"px"}}},hide:function(){if(this.el){this.el.dom.style.display="none";Ext.Shadow.Pool.push(this.el);delete this.el}},setZIndex:function(A){this.zIndex=A;if(this.el){this.el.setStyle("z-index",A)}}};Ext.Shadow.Pool=function(){var B=[];var A=Ext.isIE?"
":"
";return{pull:function(){var C=B.shift();if(!C){C=Ext.get(Ext.DomHelper.insertHtml("beforeBegin",document.body.firstChild,A));C.autoBoxAdjust=false}return C},push:function(C){B.push(C)}}}(); +Ext.BoxComponent=Ext.extend(Ext.Component,{initComponent:function(){Ext.BoxComponent.superclass.initComponent.call(this);this.addEvents("resize","move")},boxReady:false,deferHeight:false,setSize:function(B,D){if(typeof B=="object"){D=B.height;B=B.width}if(!this.boxReady){this.width=B;this.height=D;return this}if(this.lastSize&&this.lastSize.width==B&&this.lastSize.height==D){return this}this.lastSize={width:B,height:D};var C=this.adjustSize(B,D);var F=C.width,A=C.height;if(F!==undefined||A!==undefined){var E=this.getResizeEl();if(!this.deferHeight&&F!==undefined&&A!==undefined){E.setSize(F,A)}else{if(!this.deferHeight&&A!==undefined){E.setHeight(A)}else{if(F!==undefined){E.setWidth(F)}}}this.onResize(F,A,B,D);this.fireEvent("resize",this,F,A,B,D)}return this},setWidth:function(A){return this.setSize(A)},setHeight:function(A){return this.setSize(undefined,A)},getSize:function(){return this.el.getSize()},getPosition:function(A){if(A===true){return[this.el.getLeft(true),this.el.getTop(true)]}return this.xy||this.el.getXY()},getBox:function(A){var B=this.el.getSize();if(A===true){B.x=this.el.getLeft(true);B.y=this.el.getTop(true)}else{var C=this.xy||this.el.getXY();B.x=C[0];B.y=C[1]}return B},updateBox:function(A){this.setSize(A.width,A.height);this.setPagePosition(A.x,A.y);return this},getResizeEl:function(){return this.resizeEl||this.el},getPositionEl:function(){return this.positionEl||this.el},setPosition:function(A,F){if(A&&typeof A[1]=="number"){F=A[1];A=A[0]}this.x=A;this.y=F;if(!this.boxReady){return this}var B=this.adjustPosition(A,F);var E=B.x,D=B.y;var C=this.getPositionEl();if(E!==undefined||D!==undefined){if(E!==undefined&&D!==undefined){C.setLeftTop(E,D)}else{if(E!==undefined){C.setLeft(E)}else{if(D!==undefined){C.setTop(D)}}}this.onPosition(E,D);this.fireEvent("move",this,E,D)}return this},setPagePosition:function(A,C){if(A&&typeof A[1]=="number"){C=A[1];A=A[0]}this.pageX=A;this.pageY=C;if(!this.boxReady){return }if(A===undefined||C===undefined){return }var B=this.el.translatePoints(A,C);this.setPosition(B.left,B.top);return this},onRender:function(B,A){Ext.BoxComponent.superclass.onRender.call(this,B,A);if(this.resizeEl){this.resizeEl=Ext.get(this.resizeEl)}if(this.positionEl){this.positionEl=Ext.get(this.positionEl)}},afterRender:function(){Ext.BoxComponent.superclass.afterRender.call(this);this.boxReady=true;this.setSize(this.width,this.height);if(this.x||this.y){this.setPosition(this.x,this.y)}else{if(this.pageX||this.pageY){this.setPagePosition(this.pageX,this.pageY)}}},syncSize:function(){delete this.lastSize;this.setSize(this.autoWidth?undefined:this.el.getWidth(),this.autoHeight?undefined:this.el.getHeight());return this},onResize:function(D,B,A,C){},onPosition:function(A,B){},adjustSize:function(A,B){if(this.autoWidth){A="auto"}if(this.autoHeight){B="auto"}return{width:A,height:B}},adjustPosition:function(A,B){return{x:A,y:B}}});Ext.reg("box",Ext.BoxComponent); +Ext.SplitBar=function(C,E,B,D,A){this.el=Ext.get(C,true);this.el.dom.unselectable="on";this.resizingEl=Ext.get(E,true);this.orientation=B||Ext.SplitBar.HORIZONTAL;this.minSize=0;this.maxSize=2000;this.animate=false;this.useShim=false;this.shim=null;if(!A){this.proxy=Ext.SplitBar.createProxy(this.orientation)}else{this.proxy=Ext.get(A).dom}this.dd=new Ext.dd.DDProxy(this.el.dom.id,"XSplitBars",{dragElId:this.proxy.id});this.dd.b4StartDrag=this.onStartProxyDrag.createDelegate(this);this.dd.endDrag=this.onEndProxyDrag.createDelegate(this);this.dragSpecs={};this.adapter=new Ext.SplitBar.BasicLayoutAdapter();this.adapter.init(this);if(this.orientation==Ext.SplitBar.HORIZONTAL){this.placement=D||(this.el.getX()>this.resizingEl.getX()?Ext.SplitBar.LEFT:Ext.SplitBar.RIGHT);this.el.addClass("x-splitbar-h")}else{this.placement=D||(this.el.getY()>this.resizingEl.getY()?Ext.SplitBar.TOP:Ext.SplitBar.BOTTOM);this.el.addClass("x-splitbar-v")}this.addEvents("resize","moved","beforeresize","beforeapply");Ext.SplitBar.superclass.constructor.call(this)};Ext.extend(Ext.SplitBar,Ext.util.Observable,{onStartProxyDrag:function(A,E){this.fireEvent("beforeresize",this);this.overlay=Ext.DomHelper.append(document.body,{cls:"x-drag-overlay",html:" "},true);this.overlay.unselectable();this.overlay.setSize(Ext.lib.Dom.getViewWidth(true),Ext.lib.Dom.getViewHeight(true));this.overlay.show();Ext.get(this.proxy).setDisplayed("block");var C=this.adapter.getElementSize(this);this.activeMinSize=this.getMinimumSize();this.activeMaxSize=this.getMaximumSize();var D=C-this.activeMinSize;var B=Math.max(this.activeMaxSize-C,0);if(this.orientation==Ext.SplitBar.HORIZONTAL){this.dd.resetConstraints();this.dd.setXConstraint(this.placement==Ext.SplitBar.LEFT?D:B,this.placement==Ext.SplitBar.LEFT?B:D);this.dd.setYConstraint(0,0)}else{this.dd.resetConstraints();this.dd.setXConstraint(0,0);this.dd.setYConstraint(this.placement==Ext.SplitBar.TOP?D:B,this.placement==Ext.SplitBar.TOP?B:D)}this.dragSpecs.startSize=C;this.dragSpecs.startPoint=[A,E];Ext.dd.DDProxy.prototype.b4StartDrag.call(this.dd,A,E)},onEndProxyDrag:function(C){Ext.get(this.proxy).setDisplayed(false);var B=Ext.lib.Event.getXY(C);if(this.overlay){this.overlay.remove();delete this.overlay}var A;if(this.orientation==Ext.SplitBar.HORIZONTAL){A=this.dragSpecs.startSize+(this.placement==Ext.SplitBar.LEFT?B[0]-this.dragSpecs.startPoint[0]:this.dragSpecs.startPoint[0]-B[0])}else{A=this.dragSpecs.startSize+(this.placement==Ext.SplitBar.TOP?B[1]-this.dragSpecs.startPoint[1]:this.dragSpecs.startPoint[1]-B[1])}A=Math.min(Math.max(A,this.activeMinSize),this.activeMaxSize);if(A!=this.dragSpecs.startSize){if(this.fireEvent("beforeapply",this,A)!==false){this.adapter.setElementSize(this,A);this.fireEvent("moved",this,A);this.fireEvent("resize",this,A)}}},getAdapter:function(){return this.adapter},setAdapter:function(A){this.adapter=A;this.adapter.init(this)},getMinimumSize:function(){return this.minSize},setMinimumSize:function(A){this.minSize=A},getMaximumSize:function(){return this.maxSize},setMaximumSize:function(A){this.maxSize=A},setCurrentSize:function(B){var A=this.animate;this.animate=false;this.adapter.setElementSize(this,B);this.animate=A},destroy:function(A){if(this.shim){this.shim.remove()}this.dd.unreg();Ext.removeNode(this.proxy);if(A){this.el.remove()}}});Ext.SplitBar.createProxy=function(B){var C=new Ext.Element(document.createElement("div"));C.unselectable();var A="x-splitbar-proxy";C.addClass(A+" "+(B==Ext.SplitBar.HORIZONTAL?A+"-h":A+"-v"));document.body.appendChild(C.dom);return C.dom};Ext.SplitBar.BasicLayoutAdapter=function(){};Ext.SplitBar.BasicLayoutAdapter.prototype={init:function(A){},getElementSize:function(A){if(A.orientation==Ext.SplitBar.HORIZONTAL){return A.resizingEl.getWidth()}else{return A.resizingEl.getHeight()}},setElementSize:function(B,A,C){if(B.orientation==Ext.SplitBar.HORIZONTAL){if(!B.animate){B.resizingEl.setWidth(A);if(C){C(B,A)}}else{B.resizingEl.setWidth(A,true,0.1,C,"easeOut")}}else{if(!B.animate){B.resizingEl.setHeight(A);if(C){C(B,A)}}else{B.resizingEl.setHeight(A,true,0.1,C,"easeOut")}}}};Ext.SplitBar.AbsoluteLayoutAdapter=function(A){this.basic=new Ext.SplitBar.BasicLayoutAdapter();this.container=Ext.get(A)};Ext.SplitBar.AbsoluteLayoutAdapter.prototype={init:function(A){this.basic.init(A)},getElementSize:function(A){return this.basic.getElementSize(A)},setElementSize:function(B,A,C){this.basic.setElementSize(B,A,this.moveSplitter.createDelegate(this,[B]))},moveSplitter:function(A){var B=Ext.SplitBar;switch(A.placement){case B.LEFT:A.el.setX(A.resizingEl.getRight());break;case B.RIGHT:A.el.setStyle("right",(this.container.getWidth()-A.resizingEl.getLeft())+"px");break;case B.TOP:A.el.setY(A.resizingEl.getBottom());break;case B.BOTTOM:A.el.setY(A.resizingEl.getTop()-A.el.getHeight());break}}};Ext.SplitBar.VERTICAL=1;Ext.SplitBar.HORIZONTAL=2;Ext.SplitBar.LEFT=1;Ext.SplitBar.RIGHT=2;Ext.SplitBar.TOP=3;Ext.SplitBar.BOTTOM=4; +Ext.Container=Ext.extend(Ext.BoxComponent,{autoDestroy:true,defaultType:"panel",initComponent:function(){Ext.Container.superclass.initComponent.call(this);this.addEvents("afterlayout","beforeadd","beforeremove","add","remove");var A=this.items;if(A){delete this.items;if(Ext.isArray(A)){this.add.apply(this,A)}else{this.add(A)}}},initItems:function(){if(!this.items){this.items=new Ext.util.MixedCollection(false,this.getComponentId);this.getLayout()}},setLayout:function(A){if(this.layout&&this.layout!=A){this.layout.setContainer(null)}this.initItems();this.layout=A;A.setContainer(this)},render:function(){Ext.Container.superclass.render.apply(this,arguments);if(this.layout){if(typeof this.layout=="string"){this.layout=new Ext.Container.LAYOUTS[this.layout.toLowerCase()](this.layoutConfig)}this.setLayout(this.layout);if(this.activeItem!==undefined){var A=this.activeItem;delete this.activeItem;this.layout.setActiveItem(A);return }}if(!this.ownerCt){this.doLayout()}if(this.monitorResize===true){Ext.EventManager.onWindowResize(this.doLayout,this,[false])}},getLayoutTarget:function(){return this.el},getComponentId:function(A){return A.itemId||A.id},add:function(C){if(!this.items){this.initItems()}var B=arguments,A=B.length;if(A>1){for(var D=0;D2){for(var E=A-1;E>=1;--E){this.insert(D,B[E])}return }var F=this.lookupComponent(this.applyDefaults(C));if(F.ownerCt==this&&this.items.indexOf(F)0){B.setSize(A)}}});Ext.Container.LAYOUTS["fit"]=Ext.layout.FitLayout; +Ext.layout.CardLayout=Ext.extend(Ext.layout.FitLayout,{deferredRender:false,renderHidden:true,setActiveItem:function(A){A=this.container.getComponent(A);if(this.activeItem!=A){if(this.activeItem){this.activeItem.hide()}this.activeItem=A;A.show();this.layout()}},renderAll:function(A,B){if(this.deferredRender){this.renderItem(this.activeItem,undefined,B)}else{Ext.layout.CardLayout.superclass.renderAll.call(this,A,B)}}});Ext.Container.LAYOUTS["card"]=Ext.layout.CardLayout; +Ext.layout.AnchorLayout=Ext.extend(Ext.layout.ContainerLayout,{monitorResize:true,getAnchorViewSize:function(A,B){return B.dom==document.body?B.getViewSize():B.getStyleSize()},onLayout:function(F,I){Ext.layout.AnchorLayout.superclass.onLayout.call(this,F,I);var O=this.getAnchorViewSize(F,I);var M=O.width,E=O.height;if(M<20||E<20){return }var B,K;if(F.anchorSize){if(typeof F.anchorSize=="number"){B=F.anchorSize}else{B=F.anchorSize.width;K=F.anchorSize.height}}else{B=F.initialConfig.width;K=F.initialConfig.height}var H=F.items.items,G=H.length,D,J,L,C,A;for(D=0;D ");B.disableFormats=true;B.compile();Ext.layout.BorderLayout.Region.prototype.toolTemplate=B}this.collapsedEl=this.targetEl.createChild({cls:"x-layout-collapsed x-layout-collapsed-"+this.position,id:this.panel.id+"-xcollapsed"});this.collapsedEl.enableDisplayMode("block");if(this.collapseMode=="mini"){this.collapsedEl.addClass("x-layout-cmini-"+this.position);this.miniCollapsedEl=this.collapsedEl.createChild({cls:"x-layout-mini x-layout-mini-"+this.position,html:" "});this.miniCollapsedEl.addClassOnOver("x-layout-mini-over");this.collapsedEl.addClassOnOver("x-layout-collapsed-over");this.collapsedEl.on("click",this.onExpandClick,this,{stopEvent:true})}else{var A=this.toolTemplate.append(this.collapsedEl.dom,{id:"expand-"+this.position},true);A.addClassOnOver("x-tool-expand-"+this.position+"-over");A.on("click",this.onExpandClick,this,{stopEvent:true});if(this.floatable!==false){this.collapsedEl.addClassOnOver("x-layout-collapsed-over");this.collapsedEl.on("click",this.collapseClick,this)}}}return this.collapsedEl},onExpandClick:function(A){if(this.isSlid){this.afterSlideIn();this.panel.expand(false)}else{this.panel.expand()}},onCollapseClick:function(A){this.panel.collapse()},beforeCollapse:function(B,A){this.lastAnim=A;if(this.splitEl){this.splitEl.hide()}this.getCollapsedEl().show();this.panel.el.setStyle("z-index",100);this.isCollapsed=true;this.layout.layout()},onCollapse:function(A){this.panel.el.setStyle("z-index",1);if(this.lastAnim===false||this.panel.animCollapse===false){this.getCollapsedEl().dom.style.visibility="visible"}else{this.getCollapsedEl().slideIn(this.panel.slideAnchor,{duration:0.2})}this.state.collapsed=true;this.panel.saveState()},beforeExpand:function(A){var B=this.getCollapsedEl();this.el.show();if(this.position=="east"||this.position=="west"){this.panel.setSize(undefined,B.getHeight())}else{this.panel.setSize(B.getWidth(),undefined)}B.hide();B.dom.style.visibility="hidden";this.panel.el.setStyle("z-index",100)},onExpand:function(){this.isCollapsed=false;if(this.splitEl){this.splitEl.show()}this.layout.layout();this.panel.el.setStyle("z-index",1);this.state.collapsed=false;this.panel.saveState()},collapseClick:function(A){if(this.isSlid){A.stopPropagation();this.slideIn()}else{A.stopPropagation();this.slideOut()}},onHide:function(){if(this.isCollapsed){this.getCollapsedEl().hide()}else{if(this.splitEl){this.splitEl.hide()}}},onShow:function(){if(this.isCollapsed){this.getCollapsedEl().show()}else{if(this.splitEl){this.splitEl.show()}}},isVisible:function(){return !this.panel.hidden},getMargins:function(){return this.isCollapsed&&this.cmargins?this.cmargins:this.margins},getSize:function(){return this.isCollapsed?this.getCollapsedEl().getSize():this.panel.getSize()},setPanel:function(A){this.panel=A},getMinWidth:function(){return this.minWidth},getMinHeight:function(){return this.minHeight},applyLayoutCollapsed:function(A){var B=this.getCollapsedEl();B.setLeftTop(A.x,A.y);B.setSize(A.width,A.height)},applyLayout:function(A){if(this.isCollapsed){this.applyLayoutCollapsed(A)}else{this.panel.setPosition(A.x,A.y);this.panel.setSize(A.width,A.height)}},beforeSlide:function(){this.panel.beforeEffect()},afterSlide:function(){this.panel.afterEffect()},initAutoHide:function(){if(this.autoHide!==false){if(!this.autoHideHd){var A=new Ext.util.DelayedTask(this.slideIn,this);this.autoHideHd={"mouseout":function(B){if(!B.within(this.el,true)){A.delay(500)}},"mouseover":function(B){A.cancel()},scope:this}}this.el.on(this.autoHideHd)}},clearAutoHide:function(){if(this.autoHide!==false){this.el.un("mouseout",this.autoHideHd.mouseout);this.el.un("mouseover",this.autoHideHd.mouseover)}},clearMonitor:function(){Ext.getDoc().un("click",this.slideInIf,this)},slideOut:function(){if(this.isSlid||this.el.hasActiveFx()){return }this.isSlid=true;var A=this.panel.tools;if(A&&A.toggle){A.toggle.hide()}this.el.show();if(this.position=="east"||this.position=="west"){this.panel.setSize(undefined,this.collapsedEl.getHeight())}else{this.panel.setSize(this.collapsedEl.getWidth(),undefined)}this.restoreLT=[this.el.dom.style.left,this.el.dom.style.top];this.el.alignTo(this.collapsedEl,this.getCollapseAnchor());this.el.setStyle("z-index",102);if(this.animFloat!==false){this.beforeSlide();this.el.slideIn(this.getSlideAnchor(),{callback:function(){this.afterSlide();this.initAutoHide();Ext.getDoc().on("click",this.slideInIf,this)},scope:this,block:true})}else{this.initAutoHide();Ext.getDoc().on("click",this.slideInIf,this)}},afterSlideIn:function(){this.clearAutoHide();this.isSlid=false;this.clearMonitor();this.el.setStyle("z-index","");this.el.dom.style.left=this.restoreLT[0];this.el.dom.style.top=this.restoreLT[1];var A=this.panel.tools;if(A&&A.toggle){A.toggle.show()}},slideIn:function(A){if(!this.isSlid||this.el.hasActiveFx()){Ext.callback(A);return }this.isSlid=false;if(this.animFloat!==false){this.beforeSlide();this.el.slideOut(this.getSlideAnchor(),{callback:function(){this.el.hide();this.afterSlide();this.afterSlideIn();Ext.callback(A)},scope:this,block:true})}else{this.el.hide();this.afterSlideIn()}},slideInIf:function(A){if(!A.within(this.el)){this.slideIn()}},anchors:{"west":"left","east":"right","north":"top","south":"bottom"},sanchors:{"west":"l","east":"r","north":"t","south":"b"},canchors:{"west":"tl-tr","east":"tr-tl","north":"tl-bl","south":"bl-tl"},getAnchor:function(){return this.anchors[this.position]},getCollapseAnchor:function(){return this.canchors[this.position]},getSlideAnchor:function(){return this.sanchors[this.position]},getAlignAdj:function(){var A=this.cmargins;switch(this.position){case"west":return[0,0];break;case"east":return[0,0];break;case"north":return[0,0];break;case"south":return[0,0];break}},getExpandAdj:function(){var B=this.collapsedEl,A=this.cmargins;switch(this.position){case"west":return[-(A.right+B.getWidth()+A.left),0];break;case"east":return[A.right+B.getWidth()+A.left,0];break;case"north":return[0,-(A.top+A.bottom+B.getHeight())];break;case"south":return[0,A.top+A.bottom+B.getHeight()];break}}};Ext.layout.BorderLayout.SplitRegion=function(B,A,C){Ext.layout.BorderLayout.SplitRegion.superclass.constructor.call(this,B,A,C);this.applyLayout=this.applyFns[C]};Ext.extend(Ext.layout.BorderLayout.SplitRegion,Ext.layout.BorderLayout.Region,{splitTip:"Drag to resize.",collapsibleSplitTip:"Drag to resize. Double click to hide.",useSplitTips:false,splitSettings:{north:{orientation:Ext.SplitBar.VERTICAL,placement:Ext.SplitBar.TOP,maxFn:"getVMaxSize",minProp:"minHeight",maxProp:"maxHeight"},south:{orientation:Ext.SplitBar.VERTICAL,placement:Ext.SplitBar.BOTTOM,maxFn:"getVMaxSize",minProp:"minHeight",maxProp:"maxHeight"},east:{orientation:Ext.SplitBar.HORIZONTAL,placement:Ext.SplitBar.RIGHT,maxFn:"getHMaxSize",minProp:"minWidth",maxProp:"maxWidth"},west:{orientation:Ext.SplitBar.HORIZONTAL,placement:Ext.SplitBar.LEFT,maxFn:"getHMaxSize",minProp:"minWidth",maxProp:"maxWidth"}},applyFns:{west:function(C){if(this.isCollapsed){return this.applyLayoutCollapsed(C)}var D=this.splitEl.dom,B=D.style;this.panel.setPosition(C.x,C.y);var A=D.offsetWidth;B.left=(C.x+C.width-A)+"px";B.top=(C.y)+"px";B.height=Math.max(0,C.height)+"px";this.panel.setSize(C.width-A,C.height)},east:function(C){if(this.isCollapsed){return this.applyLayoutCollapsed(C)}var D=this.splitEl.dom,B=D.style;var A=D.offsetWidth;this.panel.setPosition(C.x+A,C.y);B.left=(C.x)+"px";B.top=(C.y)+"px";B.height=Math.max(0,C.height)+"px";this.panel.setSize(C.width-A,C.height)},north:function(C){if(this.isCollapsed){return this.applyLayoutCollapsed(C)}var D=this.splitEl.dom,B=D.style;var A=D.offsetHeight;this.panel.setPosition(C.x,C.y);B.left=(C.x)+"px";B.top=(C.y+C.height-A)+"px";B.width=Math.max(0,C.width)+"px";this.panel.setSize(C.width,C.height-A)},south:function(C){if(this.isCollapsed){return this.applyLayoutCollapsed(C)}var D=this.splitEl.dom,B=D.style;var A=D.offsetHeight;this.panel.setPosition(C.x,C.y+A);B.left=(C.x)+"px";B.top=(C.y)+"px";B.width=Math.max(0,C.width)+"px";this.panel.setSize(C.width,C.height-A)}},render:function(A,C){Ext.layout.BorderLayout.SplitRegion.superclass.render.call(this,A,C);var D=this.position;this.splitEl=A.createChild({cls:"x-layout-split x-layout-split-"+D,html:" ",id:this.panel.id+"-xsplit"});if(this.collapseMode=="mini"){this.miniSplitEl=this.splitEl.createChild({cls:"x-layout-mini x-layout-mini-"+D,html:" "});this.miniSplitEl.addClassOnOver("x-layout-mini-over");this.miniSplitEl.on("click",this.onCollapseClick,this,{stopEvent:true})}var B=this.splitSettings[D];this.split=new Ext.SplitBar(this.splitEl.dom,C.el,B.orientation);this.split.placement=B.placement;this.split.getMaximumSize=this[B.maxFn].createDelegate(this);this.split.minSize=this.minSize||this[B.minProp];this.split.on("beforeapply",this.onSplitMove,this);this.split.useShim=this.useShim===true;this.maxSize=this.maxSize||this[B.maxProp];if(C.hidden){this.splitEl.hide()}if(this.useSplitTips){this.splitEl.dom.title=this.collapsible?this.collapsibleSplitTip:this.splitTip}if(this.collapsible){this.splitEl.on("dblclick",this.onCollapseClick,this)}},getSize:function(){if(this.isCollapsed){return this.collapsedEl.getSize()}var A=this.panel.getSize();if(this.position=="north"||this.position=="south"){A.height+=this.splitEl.dom.offsetHeight}else{A.width+=this.splitEl.dom.offsetWidth}return A},getHMaxSize:function(){var B=this.maxSize||10000;var A=this.layout.center;return Math.min(B,(this.el.getWidth()+A.el.getWidth())-A.getMinWidth())},getVMaxSize:function(){var B=this.maxSize||10000;var A=this.layout.center;return Math.min(B,(this.el.getHeight()+A.el.getHeight())-A.getMinHeight())},onSplitMove:function(B,A){var C=this.panel.getSize();this.lastSplitSize=A;if(this.position=="north"||this.position=="south"){this.panel.setSize(C.width,A);this.state.height=A}else{this.panel.setSize(A,C.height);this.state.width=A}this.layout.layout();this.panel.saveState();return false},getSplitBar:function(){return this.split}});Ext.Container.LAYOUTS["border"]=Ext.layout.BorderLayout; +Ext.layout.FormLayout=Ext.extend(Ext.layout.AnchorLayout,{labelSeparator:":",getAnchorViewSize:function(A,B){return A.body.getStyleSize()},setContainer:function(B){Ext.layout.FormLayout.superclass.setContainer.call(this,B);if(B.labelAlign){B.addClass("x-form-label-"+B.labelAlign)}if(B.hideLabels){this.labelStyle="display:none";this.elementStyle="padding-left:0;";this.labelAdjust=0}else{this.labelSeparator=B.labelSeparator||this.labelSeparator;B.labelWidth=B.labelWidth||100;if(typeof B.labelWidth=="number"){var C=(typeof B.labelPad=="number"?B.labelPad:5);this.labelAdjust=B.labelWidth+C;this.labelStyle="width:"+B.labelWidth+"px;";this.elementStyle="padding-left:"+(B.labelWidth+C)+"px"}if(B.labelAlign=="top"){this.labelStyle="width:auto;";this.labelAdjust=0;this.elementStyle="padding-left:0;"}}if(!this.fieldTpl){var A=new Ext.Template("
","","
","
","
");A.disableFormats=true;A.compile();Ext.layout.FormLayout.prototype.fieldTpl=A}},renderItem:function(D,A,C){if(D&&!D.rendered&&D.isFormField&&D.inputType!="hidden"){var B=[D.id,D.fieldLabel,D.labelStyle||this.labelStyle||"",this.elementStyle||"",typeof D.labelSeparator=="undefined"?this.labelSeparator:D.labelSeparator,(D.itemCls||this.container.itemCls||"")+(D.hideLabel?" x-hide-label":""),D.clearCls||"x-form-clear-left"];if(typeof A=="number"){A=C.dom.childNodes[A]||null}if(A){this.fieldTpl.insertBefore(A,B)}else{this.fieldTpl.append(C,B)}D.render("x-form-el-"+D.id)}else{Ext.layout.FormLayout.superclass.renderItem.apply(this,arguments)}},adjustWidthAnchor:function(B,A){return B-(A.isFormField?(A.hideLabel?0:this.labelAdjust):0)},isValidParent:function(B,A){return true}});Ext.Container.LAYOUTS["form"]=Ext.layout.FormLayout; +Ext.layout.Accordion=Ext.extend(Ext.layout.FitLayout,{fill:true,autoWidth:true,titleCollapse:true,hideCollapseTool:false,collapseFirst:false,animate:false,sequence:false,activeOnTop:false,renderItem:function(A){if(this.animate===false){A.animCollapse=false}A.collapsible=true;if(this.autoWidth){A.autoWidth=true}if(this.titleCollapse){A.titleCollapse=true}if(this.hideCollapseTool){A.hideCollapseTool=true}if(this.collapseFirst!==undefined){A.collapseFirst=this.collapseFirst}if(!this.activeItem&&!A.collapsed){this.activeItem=A}else{if(this.activeItem){A.collapsed=true}}Ext.layout.Accordion.superclass.renderItem.apply(this,arguments);A.header.addClass("x-accordion-hd");A.on("beforeexpand",this.beforeExpand,this)},beforeExpand:function(C,B){var A=this.activeItem;if(A){if(this.sequence){delete this.activeItem;if(!A.collapsed){A.collapse({callback:function(){C.expand(B||true)},scope:this});return false}}else{A.collapse(this.animate)}}this.activeItem=C;if(this.activeOnTop){C.el.dom.parentNode.insertBefore(C.el.dom,C.el.dom.parentNode.firstChild)}this.layout()},setItemSize:function(F,E){if(this.fill&&F){var B=this.container.items.items;var D=0;for(var C=0,A=B.length;C=B)||(this.cells[C]&&this.cells[C][A])){if(B&&A>=B){C++;A=0}else{A++}}return[A,C]},renderItem:function(C,A,B){if(C&&!C.rendered){C.render(this.getNextCell(C))}},isValidParent:function(B,A){return true}});Ext.Container.LAYOUTS["table"]=Ext.layout.TableLayout; +Ext.layout.AbsoluteLayout=Ext.extend(Ext.layout.AnchorLayout,{extraCls:"x-abs-layout-item",isForm:false,setContainer:function(A){Ext.layout.AbsoluteLayout.superclass.setContainer.call(this,A);if(A.isXType("form")){this.isForm=true}},onLayout:function(A,B){if(this.isForm){A.body.position()}else{B.position()}Ext.layout.AbsoluteLayout.superclass.onLayout.call(this,A,B)},getAnchorViewSize:function(A,B){return this.isForm?A.body.getStyleSize():Ext.layout.AbsoluteLayout.superclass.getAnchorViewSize.call(this,A,B)},isValidParent:function(B,A){return this.isForm?true:Ext.layout.AbsoluteLayout.superclass.isValidParent.call(this,B,A)},adjustWidthAnchor:function(B,A){return B?B-A.getPosition(true)[0]:B},adjustHeightAnchor:function(B,A){return B?B-A.getPosition(true)[1]:B}});Ext.Container.LAYOUTS["absolute"]=Ext.layout.AbsoluteLayout; +Ext.Viewport=Ext.extend(Ext.Container,{initComponent:function(){Ext.Viewport.superclass.initComponent.call(this);document.getElementsByTagName("html")[0].className+=" x-viewport";this.el=Ext.getBody();this.el.setHeight=Ext.emptyFn;this.el.setWidth=Ext.emptyFn;this.el.setSize=Ext.emptyFn;this.el.dom.scroll="no";this.allowDomMove=false;this.autoWidth=true;this.autoHeight=true;Ext.EventManager.onWindowResize(this.fireResize,this);this.renderTo=this.el},fireResize:function(A,B){this.fireEvent("resize",this,A,B,A,B)}});Ext.reg("viewport",Ext.Viewport); +Ext.Panel=Ext.extend(Ext.Container,{baseCls:"x-panel",collapsedCls:"x-panel-collapsed",maskDisabled:true,animCollapse:Ext.enableFx,headerAsText:true,buttonAlign:"right",collapsed:false,collapseFirst:true,minButtonWidth:75,elements:"body",toolTarget:"header",collapseEl:"bwrap",slideAnchor:"t",disabledClass:"",deferHeight:true,expandDefaults:{duration:0.25},collapseDefaults:{duration:0.25},initComponent:function(){Ext.Panel.superclass.initComponent.call(this);this.addEvents("bodyresize","titlechange","collapse","expand","beforecollapse","beforeexpand","beforeclose","close","activate","deactivate");if(this.tbar){this.elements+=",tbar";if(typeof this.tbar=="object"){this.topToolbar=this.tbar}delete this.tbar}if(this.bbar){this.elements+=",bbar";if(typeof this.bbar=="object"){this.bottomToolbar=this.bbar}delete this.bbar}if(this.header===true){this.elements+=",header";delete this.header}else{if(this.title&&this.header!==false){this.elements+=",header"}}if(this.footer===true){this.elements+=",footer";delete this.footer}if(this.buttons){var C=this.buttons;this.buttons=[];for(var B=0,A=C.length;B"+this.header.dom.innerHTML+"";if(this.iconCls){this.setIconClass(this.iconCls)}}}if(this.floating){this.makeFloating(this.floating)}if(this.collapsible){this.tools=this.tools?this.tools.slice(0):[];if(!this.hideCollapseTool){this.tools[this.collapseFirst?"unshift":"push"]({id:"toggle",handler:this.toggleCollapse,scope:this})}if(this.titleCollapse&&this.header){this.header.on("click",this.toggleCollapse,this);this.header.setStyle("cursor","pointer")}}if(this.tools){var J=this.tools;this.tools={};this.addTool.apply(this,J)}else{this.tools={}}if(this.buttons&&this.buttons.length>0){var D=this.footer.createChild({cls:"x-panel-btns-ct",cn:{cls:"x-panel-btns x-panel-btns-"+this.buttonAlign,html:"
"}},null,true);var L=D.getElementsByTagName("tr")[0];for(var F=0,I=this.buttons.length;F ");F.disableFormats=true;F.compile();Ext.Panel.prototype.toolTemplate=F}for(var E=0,C=arguments,B=C.length;E0){J.sort(C);var I=J[0].manager.zseed;for(var K=0;K=0;--H){if(!D[H].hidden){B(D[H]);return }}B(null)};return{zseed:9000,register:function(H){F[H.id]=H;D.push(H);H.on("hide",A)},unregister:function(H){delete F[H.id];H.un("hide",A);D.remove(H)},get:function(H){return typeof H=="object"?H:F[H]},bringToFront:function(H){H=this.get(H);if(H!=E){H._lastAccess=new Date().getTime();G();return true}return false},sendToBack:function(H){H=this.get(H);H._lastAccess=-(new Date().getTime());G();return H},hideAll:function(){for(var H in F){if(F[H]&&typeof F[H]!="function"&&F[H].isVisible()){F[H].hide()}}},getActive:function(){return E},getBy:function(J,I){var K=[];for(var H=D.length-1;H>=0;--H){var L=D[H];if(J.call(I||L,L)!==false){K.push(L)}}return K},each:function(I,H){for(var J in F){if(F[J]&&typeof F[J]!="function"){if(I.call(H||F[J],F[J])===false){return }}}}}};Ext.WindowMgr=new Ext.WindowGroup(); +Ext.dd.PanelProxy=function(A,B){this.panel=A;this.id=this.panel.id+"-ddproxy";Ext.apply(this,B)};Ext.dd.PanelProxy.prototype={insertProxy:true,setStatus:Ext.emptyFn,reset:Ext.emptyFn,update:Ext.emptyFn,stop:Ext.emptyFn,sync:Ext.emptyFn,getEl:function(){return this.ghost},getGhost:function(){return this.ghost},getProxy:function(){return this.proxy},hide:function(){if(this.ghost){if(this.proxy){this.proxy.remove();delete this.proxy}this.panel.el.dom.style.display="";this.ghost.remove();delete this.ghost}},show:function(){if(!this.ghost){this.ghost=this.panel.createGhost(undefined,undefined,Ext.getBody());this.ghost.setXY(this.panel.el.getXY());if(this.insertProxy){this.proxy=this.panel.el.insertSibling({cls:"x-panel-dd-spacer"});this.proxy.setSize(this.panel.getSize())}this.panel.el.dom.style.display="none"}},repair:function(B,C,A){this.hide();if(typeof C=="function"){C.call(A||this)}},moveProxy:function(A,B){if(this.proxy){A.insertBefore(this.proxy.dom,B)}}};Ext.Panel.DD=function(B,A){this.panel=B;this.dragData={panel:B};this.proxy=new Ext.dd.PanelProxy(B,A);Ext.Panel.DD.superclass.constructor.call(this,B.el,A);var C=B.header;if(C){this.setHandleElId(C.id)}(C?C:this.panel.body).setStyle("cursor","move");this.scroll=false};Ext.extend(Ext.Panel.DD,Ext.dd.DragSource,{showFrame:Ext.emptyFn,startDrag:Ext.emptyFn,b4StartDrag:function(A,B){this.proxy.show()},b4MouseDown:function(B){var A=B.getPageX();var C=B.getPageY();this.autoOffset(A,C)},onInitDrag:function(A,B){this.onStartDrag(A,B);return true},createFrame:Ext.emptyFn,getDragEl:function(A){return this.proxy.ghost.dom},endDrag:function(A){this.proxy.hide();this.panel.saveState()},autoOffset:function(A,B){A-=this.startPageX;B-=this.startPageY;this.setDelta(A,B)}}); +Ext.state.Provider=function(){this.addEvents("statechange");this.state={};Ext.state.Provider.superclass.constructor.call(this)};Ext.extend(Ext.state.Provider,Ext.util.Observable,{get:function(B,A){return typeof this.state[B]=="undefined"?A:this.state[B]},clear:function(A){delete this.state[A];this.fireEvent("statechange",this,A,null)},set:function(A,B){this.state[A]=B;this.fireEvent("statechange",this,A,B)},decodeValue:function(A){var J=/^(a|n|d|b|s|o)\:(.*)$/;var C=J.exec(unescape(A));if(!C||!C[1]){return }var F=C[1];var H=C[2];switch(F){case"n":return parseFloat(H);case"d":return new Date(Date.parse(H));case"b":return(H=="1");case"a":var G=[];var I=H.split("^");for(var B=0,D=I.length;B0){if(!B){this.selected.removeClass(this.selectedClass)}this.selected.clear();this.last=false;if(!A){this.fireEvent("selectionchange",this,this.selected.elements)}}},isSelected:function(A){return this.selected.contains(this.getNode(A))},deselect:function(A){if(this.isSelected(A)){A=this.getNode(A);this.selected.removeElement(A);if(this.last==A.viewIndex){this.last=false}Ext.fly(A).removeClass(this.selectedClass);this.fireEvent("selectionchange",this,this.selected.elements)}},select:function(D,F,B){if(Ext.isArray(D)){if(!F){this.clearSelections(true)}for(var C=0,A=D.length;C=A&&D[C];C--){B.push(D[C])}}return B},indexOf:function(A){A=this.getNode(A);if(typeof A.viewIndex=="number"){return A.viewIndex}return this.all.indexOf(A)},onBeforeLoad:function(){if(this.loadingText){this.clearSelections(false,true);this.el.update("
"+this.loadingText+"
");this.all.clear()}},onDestroy:function(){Ext.DataView.superclass.onDestroy.call(this);this.setStore(null)}});Ext.reg("dataview",Ext.DataView); +Ext.ColorPalette=function(A){Ext.ColorPalette.superclass.constructor.call(this,A);this.addEvents("select");if(this.handler){this.on("select",this.handler,this.scope,true)}};Ext.extend(Ext.ColorPalette,Ext.Component,{itemCls:"x-color-palette",value:null,clickEvent:"click",ctype:"Ext.ColorPalette",allowReselect:false,colors:["000000","993300","333300","003300","003366","000080","333399","333333","800000","FF6600","808000","008000","008080","0000FF","666699","808080","FF0000","FF9900","99CC00","339966","33CCCC","3366FF","800080","969696","FF00FF","FFCC00","FFFF00","00FF00","00FFFF","00CCFF","993366","C0C0C0","FF99CC","FFCC99","FFFF99","CCFFCC","CCFFFF","99CCFF","CC99FF","FFFFFF"],onRender:function(B,A){var C=this.tpl||new Ext.XTemplate(" ");var D=document.createElement("div");D.className=this.itemCls;C.overwrite(D,this.colors);B.dom.insertBefore(D,A);this.el=Ext.get(D);this.el.on(this.clickEvent,this.handleClick,this,{delegate:"a"});if(this.clickEvent!="click"){this.el.on("click",Ext.emptyFn,this,{delegate:"a",preventDefault:true})}},afterRender:function(){Ext.ColorPalette.superclass.afterRender.call(this);if(this.value){var A=this.value;this.value=null;this.select(A)}},handleClick:function(B,A){B.preventDefault();if(!this.disabled){var C=A.className.match(/(?:^|\s)color-(.{6})(?:\s|$)/)[1];this.select(C.toUpperCase())}},select:function(A){A=A.replace("#","");if(A!=this.value||this.allowReselect){var B=this.el;if(this.value){B.child("a.color-"+this.value).removeClass("x-color-palette-sel")}B.child("a.color-"+A).addClass("x-color-palette-sel");this.value=A;this.fireEvent("select",this,A)}}});Ext.reg("colorpalette",Ext.ColorPalette); +Ext.DatePicker=Ext.extend(Ext.Component,{todayText:"Today",okText:" OK ",cancelText:"Cancel",todayTip:"{0} (Spacebar)",minText:"This date is before the minimum date",maxText:"This date is after the maximum date",format:"m/d/y",disabledDaysText:"Disabled",disabledDatesText:"Disabled",constrainToViewport:true,monthNames:Date.monthNames,dayNames:Date.dayNames,nextText:"Next Month (Control+Right)",prevText:"Previous Month (Control+Left)",monthYearText:"Choose a month (Control+Up/Down to move years)",startDay:0,showToday:true,initComponent:function(){Ext.DatePicker.superclass.initComponent.call(this);this.value=this.value?this.value.clearTime():new Date().clearTime();this.addEvents("select");if(this.handler){this.on("select",this.handler,this.scope||this)}this.initDisabledDays()},initDisabledDays:function(){if(!this.disabledDatesRE&&this.disabledDates){var A=this.disabledDates;var C="(?:";for(var B=0;B","  ",""];var E=this.dayNames;for(var D=0;D<7;D++){var G=this.startDay+D;if(G>6){G=G-7}C.push("")}C[C.length]="";for(var D=0;D<42;D++){if(D%7==0&&D!=0){C[C.length]=""}C[C.length]=""}C.push("
",E[G].substr(0,1),"
",this.showToday?"":"","
");var B=document.createElement("div");B.className="x-date-picker";B.innerHTML=C.join("");A.dom.insertBefore(B,F);this.el=Ext.get(B);this.eventEl=Ext.get(B.firstChild);new Ext.util.ClickRepeater(this.el.child("td.x-date-left a"),{handler:this.showPrevMonth,scope:this,preventDefault:true,stopDefault:true});new Ext.util.ClickRepeater(this.el.child("td.x-date-right a"),{handler:this.showNextMonth,scope:this,preventDefault:true,stopDefault:true});this.eventEl.on("mousewheel",this.handleMouseWheel,this);this.monthPicker=this.el.down("div.x-date-mp");this.monthPicker.enableDisplayMode("block");var I=new Ext.KeyNav(this.eventEl,{"left":function(J){J.ctrlKey?this.showPrevMonth():this.update(this.activeDate.add("d",-1))},"right":function(J){J.ctrlKey?this.showNextMonth():this.update(this.activeDate.add("d",1))},"up":function(J){J.ctrlKey?this.showNextYear():this.update(this.activeDate.add("d",-7))},"down":function(J){J.ctrlKey?this.showPrevYear():this.update(this.activeDate.add("d",7))},"pageUp":function(J){this.showNextMonth()},"pageDown":function(J){this.showPrevMonth()},"enter":function(J){J.stopPropagation();return true},scope:this});this.eventEl.on("click",this.handleDateClick,this,{delegate:"a.x-date-date"});this.el.unselectable();this.cells=this.el.select("table.x-date-inner tbody td");this.textNodes=this.el.query("table.x-date-inner tbody span");this.mbtn=new Ext.Button({text:" ",tooltip:this.monthYearText,renderTo:this.el.child("td.x-date-middle",true)});this.mbtn.on("click",this.showMonthPicker,this);this.mbtn.el.child(this.mbtn.menuClassTarget).addClass("x-btn-with-menu");if(this.showToday){this.todayKeyListener=this.eventEl.addKeyListener(Ext.EventObject.SPACE,this.selectToday,this);var H=(new Date()).dateFormat(this.format);this.todayBtn=new Ext.Button({renderTo:this.el.child("td.x-date-bottom",true),text:String.format(this.todayText,H),tooltip:String.format(this.todayTip,H),handler:this.selectToday,scope:this})}if(Ext.isIE){this.el.repaint()}this.update(this.value)},createMonthPicker:function(){if(!this.monthPicker.dom.firstChild){var A=[""];for(var B=0;B<6;B++){A.push("","",B==0?"":"")}A.push("","
",this.monthNames[B].substr(0,3),"",this.monthNames[B+6].substr(0,3),"
");this.monthPicker.update(A.join(""));this.monthPicker.on("click",this.onMonthClick,this);this.monthPicker.on("dblclick",this.onMonthDblClick,this);this.mpMonths=this.monthPicker.select("td.x-date-mp-month");this.mpYears=this.monthPicker.select("td.x-date-mp-year");this.mpMonths.each(function(C,D,E){E+=1;if((E%2)==0){C.dom.xmonth=5+Math.round(E*0.5)}else{C.dom.xmonth=Math.round((E-1)*0.5)}})}},showMonthPicker:function(){this.createMonthPicker();var A=this.el.getSize();this.monthPicker.setSize(A);this.monthPicker.child("table").setSize(A);this.mpSelMonth=(this.activeDate||this.value).getMonth();this.updateMPMonth(this.mpSelMonth);this.mpSelYear=(this.activeDate||this.value).getFullYear();this.updateMPYear(this.mpSelYear);this.monthPicker.slideIn("t",{duration:0.2})},updateMPYear:function(E){this.mpyear=E;var C=this.mpYears.elements;for(var B=1;B<=10;B++){var D=C[B-1],A;if((B%2)==0){A=E+Math.round(B*0.5);D.firstChild.innerHTML=A;D.xyear=A}else{A=E-(5-Math.round(B*0.5));D.firstChild.innerHTML=A;D.xyear=A}this.mpYears.item(B-1)[A==this.mpSelYear?"addClass":"removeClass"]("x-date-mp-sel")}},updateMPMonth:function(A){this.mpMonths.each(function(B,C,D){B[B.dom.xmonth==A?"addClass":"removeClass"]("x-date-mp-sel")})},selectMPMonth:function(A){},onMonthClick:function(D,B){D.stopEvent();var C=new Ext.Element(B),A;if(C.is("button.x-date-mp-cancel")){this.hideMonthPicker()}else{if(C.is("button.x-date-mp-ok")){var E=new Date(this.mpSelYear,this.mpSelMonth,(this.activeDate||this.value).getDate());if(E.getMonth()!=this.mpSelMonth){E=new Date(this.mpSelYear,this.mpSelMonth,1).getLastDateOfMonth()}this.update(E);this.hideMonthPicker()}else{if(A=C.up("td.x-date-mp-month",2)){this.mpMonths.removeClass("x-date-mp-sel");A.addClass("x-date-mp-sel");this.mpSelMonth=A.dom.xmonth}else{if(A=C.up("td.x-date-mp-year",2)){this.mpYears.removeClass("x-date-mp-sel");A.addClass("x-date-mp-sel");this.mpSelYear=A.dom.xyear}else{if(C.is("a.x-date-mp-prev")){this.updateMPYear(this.mpyear-10)}else{if(C.is("a.x-date-mp-next")){this.updateMPYear(this.mpyear+10)}}}}}}},onMonthDblClick:function(D,B){D.stopEvent();var C=new Ext.Element(B),A;if(A=C.up("td.x-date-mp-month",2)){this.update(new Date(this.mpSelYear,A.dom.xmonth,(this.activeDate||this.value).getDate()));this.hideMonthPicker()}else{if(A=C.up("td.x-date-mp-year",2)){this.update(new Date(A.dom.xyear,this.mpSelMonth,(this.activeDate||this.value).getDate()));this.hideMonthPicker()}}},hideMonthPicker:function(A){if(this.monthPicker){if(A===true){this.monthPicker.hide()}else{this.monthPicker.slideOut("t",{duration:0.2})}}},showPrevMonth:function(A){this.update(this.activeDate.add("mo",-1))},showNextMonth:function(A){this.update(this.activeDate.add("mo",1))},showPrevYear:function(){this.update(this.activeDate.add("y",-1))},showNextYear:function(){this.update(this.activeDate.add("y",1))},handleMouseWheel:function(A){var B=A.getWheelDelta();if(B>0){this.showPrevMonth();A.stopEvent()}else{if(B<0){this.showNextMonth();A.stopEvent()}}},handleDateClick:function(B,A){B.stopEvent();if(A.dateValue&&!Ext.fly(A.parentNode).hasClass("x-date-disabled")){this.setValue(new Date(A.dateValue));this.fireEvent("select",this,this.value)}},selectToday:function(){if(this.todayBtn&&!this.todayBtn.disabled){this.setValue(new Date().clearTime());this.fireEvent("select",this,this.value)}},update:function(a,U){var A=this.activeDate;this.activeDate=a;if(!U&&A&&this.el){var K=a.getTime();if(A.getMonth()==a.getMonth()&&A.getFullYear()==a.getFullYear()){this.cells.removeClass("x-date-selected");this.cells.each(function(d){if(d.dom.firstChild.dateValue==K){d.addClass("x-date-selected");setTimeout(function(){try{d.dom.firstChild.focus()}catch(f){}},50);return false}});return }}var G=a.getDaysInMonth();var L=a.getFirstDateOfMonth();var D=L.getDay()-this.startDay;if(D<=this.startDay){D+=7}var V=a.add("mo",-1);var E=V.getDaysInMonth()-D;var C=this.cells.elements;var M=this.textNodes;G+=D;var R=86400000;var X=(new Date(V.getFullYear(),V.getMonth(),E)).clearTime();var W=new Date().clearTime().getTime();var P=a.clearTime().getTime();var O=this.minDate?this.minDate.clearTime():Number.NEGATIVE_INFINITY;var S=this.maxDate?this.maxDate.clearTime():Number.POSITIVE_INFINITY;var Z=this.disabledDatesRE;var N=this.disabledDatesText;var c=this.disabledDays?this.disabledDays.join(""):false;var Y=this.disabledDaysText;var T=this.format;if(this.showToday){var I=new Date().clearTime();var B=(IS||(Z&&T&&Z.test(I.dateFormat(T)))||(c&&c.indexOf(I.getDay())!=-1));this.todayBtn.setDisabled(B);this.todayKeyListener[B?"disable":"enable"]()}var H=function(g,d){d.title="";var e=X.getTime();d.firstChild.dateValue=e;if(e==W){d.className+=" x-date-today";d.title=g.todayText}if(e==P){d.className+=" x-date-selected";setTimeout(function(){try{d.firstChild.focus()}catch(h){}},50)}if(eS){d.className=" x-date-disabled";d.title=g.maxText;return }if(c){if(c.indexOf(X.getDay())!=-1){d.title=Y;d.className=" x-date-disabled"}}if(Z&&T){var f=X.dateFormat(T);if(Z.test(f)){d.title=N.replace("%0",f);d.className=" x-date-disabled"}}};var Q=0;for(;Q","","{text}","");D.disableFormats=true;D.compile();Ext.TabPanel.prototype.itemTpl=D}this.items.each(this.initTab,this)},afterRender:function(){Ext.TabPanel.superclass.afterRender.call(this);if(this.autoTabs){this.readTabs(false)}},initEvents:function(){Ext.TabPanel.superclass.initEvents.call(this);this.on("add",this.onAdd,this);this.on("remove",this.onRemove,this);this.strip.on("mousedown",this.onStripMouseDown,this);this.strip.on("contextmenu",this.onStripContextMenu,this);if(this.enableTabScroll){this.strip.on("mousewheel",this.onWheel,this)}},findTargets:function(C){var B=null;var A=C.getTarget("li",this.strip);if(A){B=this.getComponent(A.id.split(this.idDelimiter)[1]);if(B.disabled){return{close:null,item:null,el:null}}}return{close:C.getTarget(".x-tab-strip-close",this.strip),item:B,el:A}},onStripMouseDown:function(B){if(B.button!=0){return }B.preventDefault();var A=this.findTargets(B);if(A.close){this.remove(A.item);return }if(A.item&&A.item!=this.activeTab){this.setActiveTab(A.item)}},onStripContextMenu:function(B){B.preventDefault();var A=this.findTargets(B);if(A.item){this.fireEvent("contextmenu",this,A.item,B)}},readTabs:function(D){if(D===true){this.items.each(function(G){this.remove(G)},this)}var C=this.el.query(this.autoTabSelector);for(var B=0,A=C.length;B20?C:20);if(!this.scrolling){if(!this.scrollLeft){this.createScrollers()}else{this.scrollLeft.show();this.scrollRight.show()}}this.scrolling=true;if(H>(A-C)){E.scrollLeft=A-C}else{this.scrollToTab(this.activeTab,false)}this.updateScrollButtons()}},createScrollers:function(){var C=this.stripWrap.dom.offsetHeight;var A=this.header.insertFirst({cls:"x-tab-scroller-left"});A.setHeight(C);A.addClassOnOver("x-tab-scroller-left-over");this.leftRepeater=new Ext.util.ClickRepeater(A,{interval:this.scrollRepeatInterval,handler:this.onScrollLeft,scope:this});this.scrollLeft=A;var B=this.header.insertFirst({cls:"x-tab-scroller-right"});B.setHeight(C);B.addClassOnOver("x-tab-scroller-right-over");this.rightRepeater=new Ext.util.ClickRepeater(B,{interval:this.scrollRepeatInterval,handler:this.onScrollRight,scope:this});this.scrollRight=B},getScrollWidth:function(){return this.edge.getOffsetsTo(this.stripWrap)[0]+this.getScrollPos()},getScrollPos:function(){return parseInt(this.stripWrap.dom.scrollLeft,10)||0},getScrollArea:function(){return parseInt(this.stripWrap.dom.clientWidth,10)||0},getScrollAnim:function(){return{duration:this.scrollDuration,callback:this.updateScrollButtons,scope:this}},getScrollIncrement:function(){return this.scrollIncrement||(this.resizeTabs?this.lastTabWidth+2:100)},scrollToTab:function(E,A){if(!E){return }var C=this.getTabEl(E);var G=this.getScrollPos(),D=this.getScrollArea();var F=Ext.fly(C).getOffsetsTo(this.stripWrap)[0]+G;var B=F+C.offsetWidth;if(F(G+D)){this.scrollTo(B-D,A)}}},scrollTo:function(B,A){this.stripWrap.scrollTo("left",B,A?this.getScrollAnim():false);if(!A){this.updateScrollButtons()}},onWheel:function(D){var E=D.getWheelDelta()*this.wheelIncrement*-1;D.stopEvent();var F=this.getScrollPos();var C=F+E;var A=this.getScrollWidth()-this.getScrollArea();var B=Math.max(0,Math.min(A,C));if(B!=F){this.scrollTo(B,false)}},onScrollRight:function(){var A=this.getScrollWidth()-this.getScrollArea();var C=this.getScrollPos();var B=Math.min(A,C+this.getScrollIncrement());if(B!=C){this.scrollTo(B,this.animScroll)}},onScrollLeft:function(){var B=this.getScrollPos();var A=Math.max(0,B-this.getScrollIncrement());if(A!=B){this.scrollTo(A,this.animScroll)}},updateScrollButtons:function(){var A=this.getScrollPos();this.scrollLeft[A==0?"addClass":"removeClass"]("x-tab-scroller-left-disabled");this.scrollRight[A>=(this.getScrollWidth()-this.getScrollArea())?"addClass":"removeClass"]("x-tab-scroller-right-disabled")}});Ext.reg("tabpanel",Ext.TabPanel);Ext.TabPanel.prototype.activate=Ext.TabPanel.prototype.setActiveTab;Ext.TabPanel.AccessStack=function(){var A=[];return{add:function(B){A.push(B);if(A.length>10){A.shift()}},remove:function(E){var D=[];for(var C=0,B=A.length;C","  ","")}this.template=Ext.Button.buttonTemplate}var B,E=[this.text||" ",this.type];if(A){B=this.template.insertBefore(A,E,true)}else{B=this.template.append(C,E,true)}var D=B.child(this.buttonSelector);D.on("focus",this.onFocus,this);D.on("blur",this.onBlur,this);this.initButtonEl(B,D);if(this.menu){this.el.child(this.menuClassTarget).addClass("x-btn-with-menu")}Ext.ButtonToggleMgr.register(this)},initButtonEl:function(B,C){this.el=B;B.addClass("x-btn");if(this.icon){C.setStyle("background-image","url("+this.icon+")")}if(this.iconCls){C.addClass(this.iconCls);if(!this.cls){B.addClass(this.text?"x-btn-text-icon":"x-btn-icon")}}if(this.tabIndex!==undefined){C.dom.tabIndex=this.tabIndex}if(this.tooltip){if(typeof this.tooltip=="object"){Ext.QuickTips.register(Ext.apply({target:C.id},this.tooltip))}else{C.dom[this.tooltipType]=this.tooltip}}if(this.pressed){this.el.addClass("x-btn-pressed")}if(this.handleMouseEvents){B.on("mouseover",this.onMouseOver,this);B.on("mousedown",this.onMouseDown,this)}if(this.menu){this.menu.on("show",this.onMenuShow,this);this.menu.on("hide",this.onMenuHide,this)}if(this.id){this.el.dom.id=this.el.id=this.id}if(this.repeat){var A=new Ext.util.ClickRepeater(B,typeof this.repeat=="object"?this.repeat:{});A.on("click",this.onClick,this)}B.on(this.clickEvent,this.onClick,this)},afterRender:function(){Ext.Button.superclass.afterRender.call(this);if(Ext.isIE6){this.autoWidth.defer(1,this)}else{this.autoWidth()}},setIconClass:function(A){if(this.el){this.el.child(this.buttonSelector).replaceClass(this.iconCls,A)}this.iconCls=A},beforeDestroy:function(){if(this.rendered){var A=this.el.child(this.buttonSelector);if(A){A.removeAllListeners()}}if(this.menu){Ext.destroy(this.menu)}},onDestroy:function(){if(this.rendered){Ext.ButtonToggleMgr.unregister(this)}},autoWidth:function(){if(this.el){this.el.setWidth("auto");if(Ext.isIE7&&Ext.isStrict){var A=this.el.child(this.buttonSelector);if(A&&A.getWidth()>20){A.clip();A.setWidth(Ext.util.TextMetrics.measure(A,this.text).width+A.getFrameWidth("lr"))}}if(this.minWidth){if(this.el.getWidth()","","","
 
","","","
 
");var C,F=[this.text||" ",this.type];if(A){C=B.insertBefore(A,F,true)}else{C=B.append(D,F,true)}var E=C.child(this.buttonSelector);this.initButtonEl(C,E);this.arrowBtnTable=C.child("table:last");if(this.arrowTooltip){C.child(this.arrowSelector).dom[this.tooltipType]=this.arrowTooltip}},autoWidth:function(){if(this.el){var C=this.el.child("table:first");var B=this.el.child("table:last");this.el.setWidth("auto");C.setWidth("auto");if(Ext.isIE7&&Ext.isStrict){var A=this.el.child(this.buttonSelector);if(A&&A.getWidth()>20){A.clip();A.setWidth(Ext.util.TextMetrics.measure(A,this.text).width+A.getFrameWidth("lr"))}}if(this.minWidth){if((C.getWidth()+B.getWidth())"},onRender:function(C,B){this.el=C.createChild(Ext.apply({id:this.id},this.autoCreate),B);this.tr=this.el.child("tr",true)},afterRender:function(){A.superclass.afterRender.call(this);if(this.buttons){this.add.apply(this,this.buttons);delete this.buttons}},add:function(){var C=arguments,B=C.length;for(var D=0;D"){this.addFill()}else{this.addText(E)}}}}else{if(E.tagName){this.addElement(E)}else{if(typeof E=="object"){if(E.xtype){this.addField(Ext.ComponentMgr.create(E,"button"))}else{this.addButton(E)}}}}}}}},addSeparator:function(){return this.addItem(new A.Separator())},addSpacer:function(){return this.addItem(new A.Spacer())},addFill:function(){return this.addItem(new A.Fill())},addElement:function(B){return this.addItem(new A.Item(B))},addItem:function(B){var C=this.nextBlock();this.initMenuTracking(B);B.render(C);this.items.add(B);return B},addButton:function(D){if(Ext.isArray(D)){var F=[];for(var E=0,C=D.length;E=1&C<=E.pages){this.field.dom.value=C}}}}}},beforeLoad:function(){if(this.rendered&&this.loading){this.loading.disable()}},doLoad:function(C){var B={},A=this.paramNames;B[A.start]=C;B[A.limit]=this.pageSize;if(this.fireEvent("beforechange",this,B)!==false){this.store.load({params:B})}},changePage:function(A){this.doLoad(((A-1)*this.pageSize).constrain(0,this.store.getTotalCount()))},onClick:function(E){var B=this.store;switch(E){case"first":this.doLoad(0);break;case"prev":this.doLoad(Math.max(0,this.cursor-this.pageSize));break;case"next":this.doLoad(this.cursor+this.pageSize);break;case"last":var D=B.getTotalCount();var A=D%this.pageSize;var C=A?(D-A):D-this.pageSize;this.doLoad(C);break;case"refresh":this.doLoad(this.cursor);break}},unbind:function(A){A=Ext.StoreMgr.lookup(A);A.un("beforeload",this.beforeLoad,this);A.un("load",this.onLoad,this);A.un("loadexception",this.onLoadError,this);this.store=undefined},bind:function(A){A=Ext.StoreMgr.lookup(A);A.on("beforeload",this.beforeLoad,this);A.on("load",this.onLoad,this);A.on("loadexception",this.onLoadError,this);this.store=A}});Ext.reg("paging",Ext.PagingToolbar); +Ext.Resizable=function(D,E){this.el=Ext.get(D);if(E&&E.wrap){E.resizeChild=this.el;this.el=this.el.wrap(typeof E.wrap=="object"?E.wrap:{cls:"xresizable-wrap"});this.el.id=this.el.dom.id=E.resizeChild.id+"-rzwrap";this.el.setStyle("overflow","hidden");this.el.setPositioning(E.resizeChild.getPositioning());E.resizeChild.clearPositioning();if(!E.width||!E.height){var F=E.resizeChild.getSize();this.el.setSize(F.width,F.height)}if(E.pinned&&!E.adjustments){E.adjustments="auto"}}this.proxy=this.el.createProxy({tag:"div",cls:"x-resizable-proxy",id:this.el.id+"-rzproxy"},Ext.getBody());this.proxy.unselectable();this.proxy.enableDisplayMode("block");Ext.apply(this,E);if(this.pinned){this.disableTrackOver=true;this.el.addClass("x-resizable-pinned")}var I=this.el.getStyle("position");if(I!="absolute"&&I!="fixed"){this.el.setStyle("position","relative")}if(!this.handles){this.handles="s,e,se";if(this.multiDirectional){this.handles+=",n,w"}}if(this.handles=="all"){this.handles="n s e w ne nw se sw"}var M=this.handles.split(/\s*?[,;]\s*?| /);var C=Ext.Resizable.positions;for(var H=0,J=M.length;H0){if(A>(E/2)){D=C+(E-A)}else{D=C-A}}return Math.max(B,D)},resizeElement:function(){var A=this.proxy.getBox();if(this.updateBox){this.el.setBox(A,false,this.animate,this.duration,null,this.easing)}else{this.el.setSize(A.width,A.height,this.animate,this.duration,null,this.easing)}this.updateChildSize();if(!this.dynamic){this.proxy.hide()}return A},constrain:function(B,C,A,D){if(B-CD){C=D-B}}return C},onMouseMove:function(S){if(this.enabled){try{if(this.resizeRegion&&!this.resizeRegion.contains(S.getPoint())){return }var Q=this.curSize||this.startBox;var I=this.startBox.x,H=this.startBox.y;var C=I,B=H;var J=Q.width,R=Q.height;var D=J,L=R;var K=this.minWidth,T=this.minHeight;var P=this.maxWidth,W=this.maxHeight;var F=this.widthIncrement;var A=this.heightIncrement;var U=S.getXY();var O=-(this.startPoint[0]-Math.max(this.minX,U[0]));var M=-(this.startPoint[1]-Math.max(this.minY,U[1]));var G=this.activeHandle.position;switch(G){case"east":J+=O;J=Math.min(Math.max(K,J),P);break;case"south":R+=M;R=Math.min(Math.max(T,R),W);break;case"southeast":J+=O;R+=M;J=Math.min(Math.max(K,J),P);R=Math.min(Math.max(T,R),W);break;case"north":M=this.constrain(R,M,T,W);H+=M;R-=M;break;case"west":O=this.constrain(J,O,K,P);I+=O;J-=O;break;case"northeast":J+=O;J=Math.min(Math.max(K,J),P);M=this.constrain(R,M,T,W);H+=M;R-=M;break;case"northwest":O=this.constrain(J,O,K,P);M=this.constrain(R,M,T,W);H+=M;R-=M;I+=O;J-=O;break;case"southwest":O=this.constrain(J,O,K,P);R+=M;R=Math.min(Math.max(T,R),W);I+=O;J-=O;break}var N=this.snap(J,F,K);var V=this.snap(R,A,T);if(N!=J||V!=R){switch(G){case"northeast":H-=V-R;break;case"north":H-=V-R;break;case"southwest":I-=N-J;break;case"west":I-=N-J;break;case"northwest":I-=N-J;H-=V-R;break}J=N;R=V}if(this.preserveRatio){switch(G){case"southeast":case"east":R=L*(J/D);R=Math.min(Math.max(T,R),W);J=D*(R/L);break;case"south":J=D*(R/L);J=Math.min(Math.max(K,J),P);R=L*(J/D);break;case"northeast":J=D*(R/L);J=Math.min(Math.max(K,J),P);R=L*(J/D);break;case"north":var X=J;J=D*(R/L);J=Math.min(Math.max(K,J),P);R=L*(J/D);I+=(X-J)/2;break;case"southwest":R=L*(J/D);R=Math.min(Math.max(T,R),W);var X=J;J=D*(R/L);I+=X-J;break;case"west":var E=R;R=L*(J/D);R=Math.min(Math.max(T,R),W);H+=(E-R)/2;var X=J;J=D*(R/L);I+=X-J;break;case"northwest":var X=J;var E=R;R=L*(J/D);R=Math.min(Math.max(T,R),W);J=D*(R/L);H+=E-R;I+=X-J;break}}this.proxy.setBounds(I,H,J,R);if(this.dynamic){this.resizeElement()}}catch(S){}}},handleOver:function(){if(this.enabled){this.el.addClass("x-resizable-over")}},handleOut:function(){if(!this.resizing){this.el.removeClass("x-resizable-over")}},getEl:function(){return this.el},getResizeChild:function(){return this.resizeChild},destroy:function(C){this.proxy.remove();if(this.overlay){this.overlay.removeAllListeners();this.overlay.remove()}var D=Ext.Resizable.positions;for(var A in D){if(typeof D[A]!="function"&&this[D[A]]){var B=this[D[A]];B.el.removeAllListeners();B.el.remove()}}if(C){this.el.update("");this.el.remove()}},syncHandleHeight:function(){var A=this.el.getHeight(true);if(this.west){this.west.el.setHeight(A)}if(this.east){this.east.el.setHeight(A)}}});Ext.Resizable.positions={n:"north",s:"south",e:"east",w:"west",se:"southeast",sw:"southwest",nw:"northwest",ne:"northeast"};Ext.Resizable.Handle=function(C,E,B,D){if(!this.tpl){var A=Ext.DomHelper.createTemplate({tag:"div",cls:"x-resizable-handle x-resizable-handle-{0}"});A.compile();Ext.Resizable.Handle.prototype.tpl=A}this.position=E;this.rz=C;this.el=this.tpl.append(C.el.dom,[this.position],true);this.el.unselectable();if(D){this.el.setOpacity(0)}this.el.on("mousedown",this.onMouseDown,this);if(!B){this.el.on("mouseover",this.onMouseOver,this);this.el.on("mouseout",this.onMouseOut,this)}};Ext.Resizable.Handle.prototype={afterResize:function(A){},onMouseDown:function(A){this.rz.onMouseDown(this,A)},onMouseOver:function(A){this.rz.handleOver(this,A)},onMouseOut:function(A){this.rz.handleOut(this,A)}}; +Ext.Editor=function(B,A){this.field=B;Ext.Editor.superclass.constructor.call(this,A)};Ext.extend(Ext.Editor,Ext.Component,{value:"",alignment:"c-c?",shadow:"frame",constrain:false,swallowKeys:true,completeOnEnter:false,cancelOnEsc:false,updateEl:false,initComponent:function(){Ext.Editor.superclass.initComponent.call(this);this.addEvents("beforestartedit","startedit","beforecomplete","complete","canceledit","specialkey")},onRender:function(B,A){this.el=new Ext.Layer({shadow:this.shadow,cls:"x-editor",parentEl:B,shim:this.shim,shadowOffset:4,id:this.id,constrain:this.constrain});this.el.setStyle("overflow",Ext.isGecko?"auto":"hidden");if(this.field.msgTarget!="title"){this.field.msgTarget="qtip"}this.field.inEditor=true;this.field.render(this.el);if(Ext.isGecko){this.field.el.dom.setAttribute("autocomplete","off")}this.field.on("specialkey",this.onSpecialKey,this);if(this.swallowKeys){this.field.el.swallowEvent(["keydown","keypress"])}this.field.show();this.field.on("blur",this.onBlur,this);if(this.field.grow){this.field.on("autosize",this.el.sync,this.el,{delay:1})}},onSpecialKey:function(C,B){var A=B.getKey();if(this.completeOnEnter&&A==B.ENTER){B.stopEvent();this.completeEdit()}else{if(this.cancelOnEsc&&A==B.ESC){this.cancelEdit()}else{this.fireEvent("specialkey",C,B)}}if(this.field.triggerBlur&&(A==B.ENTER||A==B.ESC||A==B.TAB)){this.field.triggerBlur()}},startEdit:function(B,C){if(this.editing){this.completeEdit()}this.boundEl=Ext.get(B);var A=C!==undefined?C:this.boundEl.dom.innerHTML;if(!this.rendered){this.render(this.parentEl||document.body)}if(this.fireEvent("beforestartedit",this,this.boundEl,A)===false){return }this.startValue=A;this.field.setValue(A);this.doAutoSize();this.el.alignTo(this.boundEl,this.alignment);this.editing=true;this.show()},doAutoSize:function(){if(this.autoSize){var A=this.boundEl.getSize();switch(this.autoSize){case"width":this.setSize(A.width,"");break;case"height":this.setSize("",A.height);break;default:this.setSize(A.width,A.height)}}},setSize:function(A,B){delete this.field.lastSize;this.field.setSize(A,B);if(this.el){if(Ext.isGecko2||Ext.isOpera){this.el.setSize(A,B)}this.el.sync()}},realign:function(){this.el.alignTo(this.boundEl,this.alignment)},completeEdit:function(A){if(!this.editing){return }var B=this.getValue();if(this.revertInvalid!==false&&!this.field.isValid()){B=this.startValue;this.cancelEdit(true)}if(String(B)===String(this.startValue)&&this.ignoreNoChange){this.editing=false;this.hide();return }if(this.fireEvent("beforecomplete",this,B,this.startValue)!==false){this.editing=false;if(this.updateEl&&this.boundEl){this.boundEl.update(B)}if(A!==true){this.hide()}this.fireEvent("complete",this,B,this.startValue)}},onShow:function(){this.el.show();if(this.hideEl!==false){this.boundEl.hide()}this.field.show();if(Ext.isIE&&!this.fixIEFocus){this.fixIEFocus=true;this.deferredFocus.defer(50,this)}else{this.field.focus()}this.fireEvent("startedit",this.boundEl,this.startValue)},deferredFocus:function(){if(this.editing){this.field.focus()}},cancelEdit:function(A){if(this.editing){var B=this.getValue();this.setValue(this.startValue);if(A!==true){this.hide()}this.fireEvent("canceledit",this,B,this.startValue)}},onBlur:function(){if(this.allowBlur!==true&&this.editing){this.completeEdit()}},onHide:function(){if(this.editing){this.completeEdit();return }this.field.blur();if(this.field.collapse){this.field.collapse()}this.el.hide();if(this.hideEl!==false){this.boundEl.show()}},setValue:function(A){this.field.setValue(A)},getValue:function(){return this.field.getValue()},beforeDestroy:function(){this.field.destroy();this.field=null}});Ext.reg("editor",Ext.Editor); +Ext.MessageBox=function(){var R,B,N,Q;var G,J,P,A,K,M,H,F;var O,S,L,C="";var D=function(U){if(R.isVisible()){R.hide();Ext.callback(B.fn,B.scope||window,[U,S.dom.value],1)}};var T=function(){if(B&&B.cls){R.el.removeClass(B.cls)}K.reset()};var E=function(W,U,V){if(B&&B.closable!==false){R.hide()}if(V){V.stopEvent()}};var I=function(U){var W=0;if(!U){O["ok"].hide();O["cancel"].hide();O["yes"].hide();O["no"].hide();return W}R.footer.dom.style.display="";for(var V in O){if(typeof O[V]!="function"){if(U[V]){O[V].show();O[V].setText(typeof U[V]=="string"?U[V]:Ext.MessageBox.buttonText[V]);W+=O[V].el.getWidth()+15}else{O[V].hide()}}}return W};return{getDialog:function(U){if(!R){R=new Ext.Window({autoCreate:true,title:U,resizable:false,constrain:true,constrainHeader:true,minimizable:false,maximizable:false,stateful:false,modal:true,shim:true,buttonAlign:"center",width:400,height:100,minHeight:80,plain:true,footer:true,closable:true,close:function(){if(B&&B.buttons&&B.buttons.no&&!B.buttons.cancel){D("no")}else{D("cancel")}}});O={};var V=this.buttonText;O["ok"]=R.addButton(V["ok"],D.createCallback("ok"));O["yes"]=R.addButton(V["yes"],D.createCallback("yes"));O["no"]=R.addButton(V["no"],D.createCallback("no"));O["cancel"]=R.addButton(V["cancel"],D.createCallback("cancel"));O["ok"].hideMode=O["yes"].hideMode=O["no"].hideMode=O["cancel"].hideMode="offsets";R.render(document.body);R.getEl().addClass("x-window-dlg");N=R.mask;G=R.body.createChild({html:"

"});H=Ext.get(G.dom.firstChild);var W=G.dom.childNodes[1];J=Ext.get(W.firstChild);P=Ext.get(W.childNodes[2].firstChild);P.enableDisplayMode();P.addKeyListener([10,13],function(){if(R.isVisible()&&B&&B.buttons){if(B.buttons.ok){D("ok")}else{if(B.buttons.yes){D("yes")}}}});A=Ext.get(W.childNodes[2].childNodes[1]);A.enableDisplayMode();K=new Ext.ProgressBar({renderTo:G});G.createChild({cls:"x-clear"})}return R},updateText:function(X){if(!R.isVisible()&&!B.width){R.setSize(this.maxWidth,100)}J.update(X||" ");var V=C!=""?(H.getWidth()+H.getMargins("lr")):0;var Z=J.getWidth()+J.getMargins("lr");var W=R.getFrameWidth("lr");var Y=R.body.getFrameWidth("lr");if(Ext.isIE&&V>0){V+=3}var U=Math.max(Math.min(B.width||V+Z+W+Y,this.maxWidth),Math.max(B.minWidth||this.minWidth,L||0));if(B.prompt===true){S.setWidth(U-V-W-Y)}if(B.progress===true||B.wait===true){K.setSize(U-V-W-Y)}R.setSize(U,"auto").center();return this},updateProgress:function(V,U,W){K.updateProgress(V,U);if(W){this.updateText(W)}return this},isVisible:function(){return R&&R.isVisible()},hide:function(){if(this.isVisible()){R.hide();T()}return this},show:function(X){if(this.isVisible()){this.hide()}B=X;var Y=this.getDialog(B.title||" ");Y.setTitle(B.title||" ");var U=(B.closable!==false&&B.progress!==true&&B.wait!==true);Y.tools.close.setDisplayed(U);S=P;B.prompt=B.prompt||(B.multiline?true:false);if(B.prompt){if(B.multiline){P.hide();A.show();A.setHeight(typeof B.multiline=="number"?B.multiline:this.defaultTextHeight);S=A}else{P.show();A.hide()}}else{P.hide();A.hide()}S.dom.value=B.value||"";if(B.prompt){Y.focusEl=S}else{var W=B.buttons;var V=null;if(W&&W.ok){V=O["ok"]}else{if(W&&W.yes){V=O["yes"]}}if(V){Y.focusEl=V}}if(B.iconCls){Y.setIconClass(B.iconCls)}this.setIcon(B.icon);L=I(B.buttons);K.setVisible(B.progress===true||B.wait===true);this.updateProgress(0,B.progressText);this.updateText(B.msg);if(B.cls){Y.el.addClass(B.cls)}Y.proxyDrag=B.proxyDrag===true;Y.modal=B.modal!==false;Y.mask=B.modal!==false?N:false;if(!Y.isVisible()){document.body.appendChild(R.el.dom);Y.setAnimateTarget(B.animEl);Y.show(B.animEl)}Y.on("show",function(){if(U===true){Y.keyMap.enable()}else{Y.keyMap.disable()}},this,{single:true});if(B.wait===true){K.wait(B.waitConfig)}return this},setIcon:function(U){if(U&&U!=""){H.removeClass("x-hidden");H.replaceClass(C,U);C=U}else{H.replaceClass(C,"x-hidden");C=""}return this},progress:function(W,V,U){this.show({title:W,msg:V,buttons:false,progress:true,closable:false,minWidth:this.minProgressWidth,progressText:U});return this},wait:function(W,V,U){this.show({title:V,msg:W,buttons:false,closable:false,wait:true,modal:true,minWidth:this.minProgressWidth,waitConfig:U});return this},alert:function(X,W,V,U){this.show({title:X,msg:W,buttons:this.OK,fn:V,scope:U});return this},confirm:function(X,W,V,U){this.show({title:X,msg:W,buttons:this.YESNO,fn:V,scope:U,icon:this.QUESTION});return this},prompt:function(Z,Y,W,V,U,X){this.show({title:Z,msg:Y,buttons:this.OKCANCEL,fn:W,minWidth:250,scope:V,prompt:true,multiline:U,value:X});return this},OK:{ok:true},CANCEL:{cancel:true},OKCANCEL:{ok:true,cancel:true},YESNO:{yes:true,no:true},YESNOCANCEL:{yes:true,no:true,cancel:true},INFO:"ext-mb-info",WARNING:"ext-mb-warning",QUESTION:"ext-mb-question",ERROR:"ext-mb-error",defaultTextHeight:75,maxWidth:600,minWidth:100,minProgressWidth:250,buttonText:{ok:"OK",cancel:"Cancel",yes:"Yes",no:"No"}}}();Ext.Msg=Ext.MessageBox; +Ext.Tip=Ext.extend(Ext.Panel,{minWidth:40,maxWidth:300,shadow:"sides",defaultAlign:"tl-bl?",autoRender:true,quickShowInterval:250,frame:true,hidden:true,baseCls:"x-tip",floating:{shadow:true,shim:true,useDisplay:true,constrain:false},autoHeight:true,initComponent:function(){Ext.Tip.superclass.initComponent.call(this);if(this.closable&&!this.title){this.elements+=",header"}},afterRender:function(){Ext.Tip.superclass.afterRender.call(this);if(this.closable){this.addTool({id:"close",handler:this.hide,scope:this})}},showAt:function(A){Ext.Tip.superclass.show.call(this);if(this.measureWidth!==false&&(!this.initialConfig||typeof this.initialConfig.width!="number")){this.doAutoWidth()}if(this.constrainPosition){A=this.el.adjustForConstraints(A)}this.setPagePosition(A[0],A[1])},doAutoWidth:function(){var A=this.body.getTextWidth();if(this.title){A=Math.max(A,this.header.child("span").getTextWidth(this.title))}A+=this.getFrameWidth()+(this.closable?20:0)+this.body.getPadding("lr");this.setWidth(A.constrain(this.minWidth,this.maxWidth));if(Ext.isIE7&&!this.repainted){this.el.repaint();this.repainted=true}},showBy:function(A,B){if(!this.rendered){this.render(Ext.getBody())}this.showAt(this.el.getAlignToXY(A,B||this.defaultAlign))},initDraggable:function(){this.dd=new Ext.Tip.DD(this,typeof this.draggable=="boolean"?null:this.draggable);this.header.addClass("x-tip-draggable")}});Ext.Tip.DD=function(B,A){Ext.apply(this,A);this.tip=B;Ext.Tip.DD.superclass.constructor.call(this,B.el.id,"WindowDD-"+B.id);this.setHandleElId(B.header.id);this.scroll=false};Ext.extend(Ext.Tip.DD,Ext.dd.DD,{moveOnly:true,scroll:false,headerOffsets:[100,25],startDrag:function(){this.tip.el.disableShadow()},endDrag:function(A){this.tip.el.enableShadow(true)}}); +Ext.ToolTip=Ext.extend(Ext.Tip,{showDelay:500,hideDelay:200,dismissDelay:5000,mouseOffset:[15,18],trackMouse:false,constrainPosition:true,initComponent:function(){Ext.ToolTip.superclass.initComponent.call(this);this.lastActive=new Date();this.initTarget()},initTarget:function(){if(this.target){this.target=Ext.get(this.target);this.target.on("mouseover",this.onTargetOver,this);this.target.on("mouseout",this.onTargetOut,this);this.target.on("mousemove",this.onMouseMove,this)}},onMouseMove:function(A){this.targetXY=A.getXY();if(!this.hidden&&this.trackMouse){this.setPagePosition(this.getTargetXY())}},getTargetXY:function(){return[this.targetXY[0]+this.mouseOffset[0],this.targetXY[1]+this.mouseOffset[1]]},onTargetOver:function(A){if(this.disabled||A.within(this.target.dom,true)){return }this.clearTimer("hide");this.targetXY=A.getXY();this.delayShow()},delayShow:function(){if(this.hidden&&!this.showTimer){if(this.lastActive.getElapsed()=C){D=C-B-5}return{x:A,y:D}},onDestroy:function(){Ext.ToolTip.superclass.onDestroy.call(this);if(this.target){this.target.un("mouseover",this.onTargetOver,this);this.target.un("mouseout",this.onTargetOut,this);this.target.un("mousemove",this.onMouseMove,this)}}}); +Ext.QuickTip=Ext.extend(Ext.ToolTip,{interceptTitles:false,tagConfig:{namespace:"ext",attribute:"qtip",width:"qwidth",target:"target",title:"qtitle",hide:"hide",cls:"qclass",align:"qalign"},initComponent:function(){this.target=this.target||Ext.getDoc();this.targets=this.targets||{};Ext.QuickTip.superclass.initComponent.call(this)},register:function(D){var F=Ext.isArray(D)?D:arguments;for(var E=0,A=F.length;E0){var D=function(H,G){if(H&&G){var I=G.findChild(A,B);if(I){I.select();if(F){F(true,I)}}else{if(F){F(false,I)}}}else{if(F){F(false,I)}}};this.expandPath(C.join(this.pathSeparator),A,D)}else{this.root.select();if(F){F(true,this.root)}}},getTreeEl:function(){return this.body},onRender:function(B,A){Ext.tree.TreePanel.superclass.onRender.call(this,B,A);this.el.addClass("x-tree");this.innerCt=this.body.createChild({tag:"ul",cls:"x-tree-root-ct "+(this.useArrows?"x-tree-arrows":this.lines?"x-tree-lines":"x-tree-no-lines")})},initEvents:function(){Ext.tree.TreePanel.superclass.initEvents.call(this);if(this.containerScroll){Ext.dd.ScrollManager.register(this.body)}if((this.enableDD||this.enableDrop)&&!this.dropZone){this.dropZone=new Ext.tree.TreeDropZone(this,this.dropConfig||{ddGroup:this.ddGroup||"TreeDD",appendOnly:this.ddAppendOnly===true})}if((this.enableDD||this.enableDrag)&&!this.dragZone){this.dragZone=new Ext.tree.TreeDragZone(this,this.dragConfig||{ddGroup:this.ddGroup||"TreeDD",scroll:this.ddScroll})}this.getSelectionModel().init(this)},afterRender:function(){Ext.tree.TreePanel.superclass.afterRender.call(this);this.root.render();if(!this.rootVisible){this.root.renderChildren()}},onDestroy:function(){if(this.rendered){this.body.removeAllListeners();Ext.dd.ScrollManager.unregister(this.body);if(this.dropZone){this.dropZone.unreg()}if(this.dragZone){this.dragZone.unreg()}}this.root.destroy();this.nodeHash=null;Ext.tree.TreePanel.superclass.onDestroy.call(this)}});Ext.tree.TreePanel.nodeTypes={};Ext.reg("treepanel",Ext.tree.TreePanel); +Ext.tree.TreeEventModel=function(A){this.tree=A;this.tree.on("render",this.initEvents,this)};Ext.tree.TreeEventModel.prototype={initEvents:function(){var A=this.tree.getTreeEl();A.on("click",this.delegateClick,this);if(this.tree.trackMouseOver!==false){A.on("mouseover",this.delegateOver,this);A.on("mouseout",this.delegateOut,this)}A.on("dblclick",this.delegateDblClick,this);A.on("contextmenu",this.delegateContextMenu,this)},getNode:function(B){var A;if(A=B.getTarget(".x-tree-node-el",10)){var C=Ext.fly(A,"_treeEvents").getAttributeNS("ext","tree-node-id");if(C){return this.tree.getNodeById(C)}}return null},getNodeTarget:function(B){var A=B.getTarget(".x-tree-node-icon",1);if(!A){A=B.getTarget(".x-tree-node-el",6)}return A},delegateOut:function(B,A){if(!this.beforeEvent(B)){return }if(B.getTarget(".x-tree-ec-icon",1)){var C=this.getNode(B);this.onIconOut(B,C);if(C==this.lastEcOver){delete this.lastEcOver}}if((A=this.getNodeTarget(B))&&!B.within(A,true)){this.onNodeOut(B,this.getNode(B))}},delegateOver:function(B,A){if(!this.beforeEvent(B)){return }if(this.lastEcOver){this.onIconOut(B,this.lastEcOver);delete this.lastEcOver}if(B.getTarget(".x-tree-ec-icon",1)){this.lastEcOver=this.getNode(B);this.onIconOver(B,this.lastEcOver)}if(A=this.getNodeTarget(B)){this.onNodeOver(B,this.getNode(B))}},delegateClick:function(B,A){if(!this.beforeEvent(B)){return }if(B.getTarget("input[type=checkbox]",1)){this.onCheckboxClick(B,this.getNode(B))}else{if(B.getTarget(".x-tree-ec-icon",1)){this.onIconClick(B,this.getNode(B))}else{if(this.getNodeTarget(B)){this.onNodeClick(B,this.getNode(B))}}}},delegateDblClick:function(B,A){if(this.beforeEvent(B)&&this.getNodeTarget(B)){this.onNodeDblClick(B,this.getNode(B))}},delegateContextMenu:function(B,A){if(this.beforeEvent(B)&&this.getNodeTarget(B)){this.onNodeContextMenu(B,this.getNode(B))}},onNodeClick:function(B,A){A.ui.onClick(B)},onNodeOver:function(B,A){A.ui.onOver(B)},onNodeOut:function(B,A){A.ui.onOut(B)},onIconOver:function(B,A){A.ui.addClass("x-tree-ec-over")},onIconOut:function(B,A){A.ui.removeClass("x-tree-ec-over")},onIconClick:function(B,A){A.ui.ecClick(B)},onCheckboxClick:function(B,A){A.ui.onCheckChange(B)},onNodeDblClick:function(B,A){A.ui.onDblClick(B)},onNodeContextMenu:function(B,A){A.ui.onContextMenu(B)},beforeEvent:function(A){if(this.disabled){A.stopEvent();return false}return true},disable:function(){this.disabled=true},enable:function(){this.disabled=false}}; +Ext.tree.DefaultSelectionModel=function(A){this.selNode=null;this.addEvents("selectionchange","beforeselect");Ext.apply(this,A);Ext.tree.DefaultSelectionModel.superclass.constructor.call(this)};Ext.extend(Ext.tree.DefaultSelectionModel,Ext.util.Observable,{init:function(A){this.tree=A;A.getTreeEl().on("keydown",this.onKeyDown,this);A.on("click",this.onNodeClick,this)},onNodeClick:function(A,B){this.select(A)},select:function(B){var A=this.selNode;if(A!=B&&this.fireEvent("beforeselect",this,B,A)!==false){if(A){A.ui.onSelectedChange(false)}this.selNode=B;B.ui.onSelectedChange(true);this.fireEvent("selectionchange",this,B,A)}return B},unselect:function(A){if(this.selNode==A){this.clearSelections()}},clearSelections:function(){var A=this.selNode;if(A){A.ui.onSelectedChange(false);this.selNode=null;this.fireEvent("selectionchange",this,null)}return A},getSelectedNode:function(){return this.selNode},isSelected:function(A){return this.selNode==A},selectPrevious:function(){var A=this.selNode||this.lastSelNode;if(!A){return null}var C=A.previousSibling;if(C){if(!C.isExpanded()||C.childNodes.length<1){return this.select(C)}else{var B=C.lastChild;while(B&&B.isExpanded()&&B.childNodes.length>0){B=B.lastChild}return this.select(B)}}else{if(A.parentNode&&(this.tree.rootVisible||!A.parentNode.isRoot)){return this.select(A.parentNode)}}return null},selectNext:function(){var B=this.selNode||this.lastSelNode;if(!B){return null}if(B.firstChild&&B.isExpanded()){return this.select(B.firstChild)}else{if(B.nextSibling){return this.select(B.nextSibling)}else{if(B.parentNode){var A=null;B.parentNode.bubble(function(){if(this.nextSibling){A=this.getOwnerTree().selModel.select(this.nextSibling);return false}});return A}}}return null},onKeyDown:function(C){var B=this.selNode||this.lastSelNode;var D=this;if(!B){return }var A=C.getKey();switch(A){case C.DOWN:C.stopEvent();this.selectNext();break;case C.UP:C.stopEvent();this.selectPrevious();break;case C.RIGHT:C.preventDefault();if(B.hasChildNodes()){if(!B.isExpanded()){B.expand()}else{if(B.firstChild){this.select(B.firstChild,C)}}}break;case C.LEFT:C.preventDefault();if(B.hasChildNodes()&&B.isExpanded()){B.collapse()}else{if(B.parentNode&&(this.tree.rootVisible||B.parentNode!=this.tree.getRootNode())){this.select(B.parentNode,C)}}break}}});Ext.tree.MultiSelectionModel=function(A){this.selNodes=[];this.selMap={};this.addEvents("selectionchange");Ext.apply(this,A);Ext.tree.MultiSelectionModel.superclass.constructor.call(this)};Ext.extend(Ext.tree.MultiSelectionModel,Ext.util.Observable,{init:function(A){this.tree=A;A.getTreeEl().on("keydown",this.onKeyDown,this);A.on("click",this.onNodeClick,this)},onNodeClick:function(A,B){this.select(A,B,B.ctrlKey)},select:function(A,C,B){if(B!==true){this.clearSelections(true)}if(this.isSelected(A)){this.lastSelNode=A;return A}this.selNodes.push(A);this.selMap[A.id]=A;this.lastSelNode=A;A.ui.onSelectedChange(true);this.fireEvent("selectionchange",this,this.selNodes);return A},unselect:function(B){if(this.selMap[B.id]){B.ui.onSelectedChange(false);var C=this.selNodes;var A=C.indexOf(B);if(A!=-1){this.selNodes.splice(A,1)}delete this.selMap[B.id];this.fireEvent("selectionchange",this,this.selNodes)}},clearSelections:function(B){var D=this.selNodes;if(D.length>0){for(var C=0,A=D.length;C
","",this.indentMarkup,"","","",E?("":"/>")):"","",D.text,"
","
    ",""].join("");var A;if(J!==true&&D.nextSibling&&(A=D.nextSibling.ui.getEl())){this.wrap=Ext.DomHelper.insertHtml("beforeBegin",A,C)}else{this.wrap=Ext.DomHelper.insertHtml("beforeEnd",H,C)}this.elNode=this.wrap.childNodes[0];this.ctNode=this.wrap.childNodes[1];var G=this.elNode.childNodes;this.indentNode=G[0];this.ecNode=G[1];this.iconNode=G[2];var F=3;if(E){this.checkbox=G[3];this.checkbox.defaultChecked=this.checkbox.checked;F++}this.anchor=G[F];this.textNode=G[F].firstChild},getAnchor:function(){return this.anchor},getTextEl:function(){return this.textNode},getIconEl:function(){return this.iconNode},isChecked:function(){return this.checkbox?this.checkbox.checked:false},updateExpandIcon:function(){if(this.rendered){var E=this.node,D,C;var A=E.isLast()?"x-tree-elbow-end":"x-tree-elbow";if(E.isExpandable()){if(E.expanded){A+="-minus";D="x-tree-node-collapsed";C="x-tree-node-expanded"}else{A+="-plus";D="x-tree-node-expanded";C="x-tree-node-collapsed"}if(this.wasLeaf){this.removeClass("x-tree-node-leaf");this.wasLeaf=false}if(this.c1!=D||this.c2!=C){Ext.fly(this.elNode).replaceClass(D,C);this.c1=D;this.c2=C}}else{if(!this.wasLeaf){Ext.fly(this.elNode).replaceClass("x-tree-node-expanded","x-tree-node-leaf");delete this.c1;delete this.c2;this.wasLeaf=true}}var B="x-tree-ec-icon "+A;if(this.ecc!=B){this.ecNode.className=B;this.ecc=B}}},getChildIndent:function(){if(!this.childIndent){var A=[];var B=this.node;while(B){if(!B.isRoot||(B.isRoot&&B.ownerTree.rootVisible)){if(!B.isLast()){A.unshift("")}else{A.unshift("")}}B=B.parentNode}this.childIndent=A.join("")}return this.childIndent},renderIndent:function(){if(this.rendered){var A="";var B=this.node.parentNode;if(B){A=B.ui.getChildIndent()}if(this.indentMarkup!=A){this.indentNode.innerHTML=A;this.indentMarkup=A}this.updateExpandIcon()}},destroy:function(){if(this.elNode){Ext.dd.Registry.unregister(this.elNode.id)}delete this.elNode;delete this.ctNode;delete this.indentNode;delete this.ecNode;delete this.iconNode;delete this.checkbox;delete this.anchor;delete this.textNode;Ext.removeNode(this.ctNode)}};Ext.tree.RootTreeNodeUI=Ext.extend(Ext.tree.TreeNodeUI,{render:function(){if(!this.rendered){var A=this.node.ownerTree.innerCt.dom;this.node.expanded=true;A.innerHTML="
    ";this.wrap=this.ctNode=A.firstChild}},collapse:Ext.emptyFn,expand:Ext.emptyFn}); +Ext.tree.TreeLoader=function(A){this.baseParams={};Ext.apply(this,A);this.addEvents("beforeload","load","loadexception");Ext.tree.TreeLoader.superclass.constructor.call(this)};Ext.extend(Ext.tree.TreeLoader,Ext.util.Observable,{uiProviders:{},clearOnLoad:true,load:function(A,B){if(this.clearOnLoad){while(A.firstChild){A.removeChild(A.firstChild)}}if(this.doPreload(A)){if(typeof B=="function"){B()}}else{if(this.dataUrl||this.url){this.requestData(A,B)}}},doPreload:function(D){if(D.attributes.children){if(D.childNodes.length<1){var C=D.attributes.children;D.beginUpdate();for(var B=0,A=C.length;BK){return E?-1:+1}else{return 0}}}};Ext.tree.TreeSorter.prototype={doSort:function(A){A.sort(this.sortFn)},compareNodes:function(B,A){return(B.text.toUpperCase()>A.text.toUpperCase()?1:-1)},updateSort:function(A,B){if(B.childrenRendered){this.doSort.defer(1,this,[B])}},updateSortParent:function(A){var B=A.parentNode;if(B&&B.childrenRendered){this.doSort.defer(1,this,[B])}}}; +if(Ext.dd.DropZone){Ext.tree.TreeDropZone=function(A,B){this.allowParentInsert=false;this.allowContainerDrop=false;this.appendOnly=false;Ext.tree.TreeDropZone.superclass.constructor.call(this,A.innerCt,B);this.tree=A;this.dragOverData={};this.lastInsertClass="x-tree-no-status"};Ext.extend(Ext.tree.TreeDropZone,Ext.dd.DropZone,{ddGroup:"TreeDD",expandDelay:1000,expandNode:function(A){if(A.hasChildNodes()&&!A.isExpanded()){A.expand(false,null,this.triggerCacheRefresh.createDelegate(this))}},queueExpand:function(A){this.expandProcId=this.expandNode.defer(this.expandDelay,this,[A])},cancelExpand:function(){if(this.expandProcId){clearTimeout(this.expandProcId);this.expandProcId=false}},isValidDropPoint:function(A,I,G,D,C){if(!A||!C){return false}var E=A.node;var F=C.node;if(!(E&&E.isTarget&&I)){return false}if(I=="append"&&E.allowChildren===false){return false}if((I=="above"||I=="below")&&(E.parentNode&&E.parentNode.allowChildren===false)){return false}if(F&&(E==F||F.contains(E))){return false}var B=this.dragOverData;B.tree=this.tree;B.target=E;B.data=C;B.point=I;B.source=G;B.rawEvent=D;B.dropNode=F;B.cancel=false;var H=this.tree.fireEvent("nodedragover",B);return B.cancel===false&&H!==false},getDropPoint:function(E,D,I){var J=D.node;if(J.isRoot){return J.allowChildren!==false?"append":false}var B=D.ddel;var K=Ext.lib.Dom.getY(B),G=K+B.offsetHeight;var F=Ext.lib.Event.getPageY(E);var H=J.allowChildren===false||J.isLeaf();if(this.appendOnly||J.parentNode.allowChildren===false){return H?false:"append"}var C=false;if(!this.allowParentInsert){C=J.hasChildNodes()&&J.isExpanded()}var A=(G-K)/(H?2:3);if(F>=K&&F<(K+A)){return"above"}else{if(!C&&(H||F>=G-A&&F<=G)){return"below"}else{return"append"}}},onNodeEnter:function(D,A,C,B){this.cancelExpand()},onNodeOver:function(B,G,F,E){var I=this.getDropPoint(F,B,G);var C=B.node;if(!this.expandProcId&&I=="append"&&C.hasChildNodes()&&!B.node.isExpanded()){this.queueExpand(C)}else{if(I!="append"){this.cancelExpand()}}var D=this.dropNotAllowed;if(this.isValidDropPoint(B,I,G,F,E)){if(I){var A=B.ddel;var H;if(I=="above"){D=B.node.isFirst()?"x-tree-drop-ok-above":"x-tree-drop-ok-between";H="x-tree-drag-insert-above"}else{if(I=="below"){D=B.node.isLast()?"x-tree-drop-ok-below":"x-tree-drop-ok-between";H="x-tree-drag-insert-below"}else{D="x-tree-drop-ok-append";H="x-tree-drag-append"}}if(this.lastInsertClass!=H){Ext.fly(A).replaceClass(this.lastInsertClass,H);this.lastInsertClass=H}}}return D},onNodeOut:function(D,A,C,B){this.cancelExpand();this.removeDropIndicators(D)},onNodeDrop:function(C,I,E,D){var H=this.getDropPoint(E,C,I);var F=C.node;F.ui.startDrop();if(!this.isValidDropPoint(C,H,I,E,D)){F.ui.endDrop();return false}var G=D.node||(I.getTreeNode?I.getTreeNode(D,F,H,E):null);var B={tree:this.tree,target:F,data:D,point:H,source:I,rawEvent:E,dropNode:G,cancel:!G,dropStatus:false};var A=this.tree.fireEvent("beforenodedrop",B);if(A===false||B.cancel===true||!B.dropNode){F.ui.endDrop();return B.dropStatus}F=B.target;if(H=="append"&&!F.isExpanded()){F.expand(false,null,function(){this.completeDrop(B)}.createDelegate(this))}else{this.completeDrop(B)}return true},completeDrop:function(G){var D=G.dropNode,E=G.point,C=G.target;if(!Ext.isArray(D)){D=[D]}var F;for(var B=0,A=D.length;BD.offsetLeft){E.scrollLeft=D.offsetLeft}var A=Math.min(this.maxWidth,(E.clientWidth>20?E.clientWidth:E.offsetWidth)-Math.max(0,D.offsetLeft-E.scrollLeft)-5);this.setSize(A,"")},triggerEdit:function(A,B){this.completeEdit();if(A.attributes.editable!==false){this.editNode=A;if(this.tree.autoScroll){A.ui.getEl().scrollIntoView(this.tree.body)}this.autoEditTimer=this.startEdit.defer(this.editDelay,this,[A.ui.textNode,A.text]);return false}},bindScroll:function(){this.tree.getTreeEl().on("scroll",this.cancelEdit,this)},beforeNodeClick:function(A,B){clearTimeout(this.autoEditTimer);if(this.tree.getSelectionModel().isSelected(A)){B.stopEvent();return this.triggerEdit(A)}},onNodeDblClick:function(A,B){clearTimeout(this.autoEditTimer)},updateNode:function(A,B){this.tree.getTreeEl().un("scroll",this.cancelEdit,this);this.editNode.setText(B)},onHide:function(){Ext.tree.TreeEditor.superclass.onHide.call(this);if(this.editNode){this.editNode.ui.focus.defer(50,this.editNode.ui)}},onSpecialKey:function(C,B){var A=B.getKey();if(A==B.ESC){B.stopEvent();this.cancelEdit()}else{if(A==B.ENTER&&!B.hasModifier()){B.stopEvent();this.completeEdit()}}}}); +Ext.menu.Menu=function(A){if(Ext.isArray(A)){A={items:A}}Ext.apply(this,A);this.id=this.id||Ext.id();this.addEvents("beforeshow","beforehide","show","hide","click","mouseover","mouseout","itemclick");Ext.menu.MenuMgr.register(this);Ext.menu.Menu.superclass.constructor.call(this);var B=this.items;this.items=new Ext.util.MixedCollection();if(B){this.add.apply(this,B)}};Ext.extend(Ext.menu.Menu,Ext.util.Observable,{minWidth:120,shadow:"sides",subMenuAlign:"tl-tr?",defaultAlign:"tl-bl?",allowOtherMenus:false,ignoreParentClicks:false,hidden:true,createEl:function(){return new Ext.Layer({cls:"x-menu",shadow:this.shadow,constrain:false,parentEl:this.parentEl||document.body,zindex:15000})},render:function(){if(this.el){return }var B=this.el=this.createEl();if(!this.keyNav){this.keyNav=new Ext.menu.MenuNav(this)}if(this.plain){B.addClass("x-menu-plain")}if(this.cls){B.addClass(this.cls)}this.focusEl=B.createChild({tag:"a",cls:"x-menu-focus",href:"#",onclick:"return false;",tabIndex:"-1"});var A=B.createChild({tag:"ul",cls:"x-menu-list"});A.on("click",this.onClick,this);A.on("mouseover",this.onMouseOver,this);A.on("mouseout",this.onMouseOut,this);this.items.each(function(D){var C=document.createElement("li");C.className="x-menu-list-item";A.dom.appendChild(C);D.render(C,this)},this);this.ul=A;this.autoWidth()},autoWidth:function(){var D=this.el,C=this.ul;if(!D){return }var A=this.width;if(A){D.setWidth(A)}else{if(Ext.isIE){D.setWidth(this.minWidth);var B=D.dom.offsetWidth;D.setWidth(C.getWidth()+D.getFrameWidth("lr"))}}},delayAutoWidth:function(){if(this.el){if(!this.awTask){this.awTask=new Ext.util.DelayedTask(this.autoWidth,this)}this.awTask.delay(20)}},findTargetItem:function(B){var A=B.getTarget(".x-menu-list-item",this.ul,true);if(A&&A.menuItemId){return this.items.get(A.menuItemId)}},onClick:function(B){var A;if(A=this.findTargetItem(B)){if(A.menu&&this.ignoreParentClicks){A.expandMenu()}else{A.onClick(B);this.fireEvent("click",this,A,B)}}},setActiveItem:function(A,B){if(A!=this.activeItem){if(this.activeItem){this.activeItem.deactivate()}this.activeItem=A;A.activate(B)}else{if(B){A.expandMenu()}}},tryActivate:function(F,E){var B=this.items;for(var C=F,A=B.length;C>=0&&C0){H()}})}function H(){if(D&&D.length>0){var N=D.clone();N.each(function(O){O.hide()})}}function E(N){D.remove(N);if(D.length<1){Ext.getDoc().un("mousedown",L);A=false}}function J(N){var O=D.last();K=new Date();D.add(N);if(!A){Ext.getDoc().on("mousedown",L);A=true}if(N.parentMenu){N.getEl().setZIndex(parseInt(N.parentMenu.getEl().getStyle("z-index"),10)+3);N.parentMenu.activeChild=N}else{if(O&&O.isVisible()){N.getEl().setZIndex(parseInt(O.getEl().getStyle("z-index"),10)+3)}}}function B(N){if(N.activeChild){N.activeChild.hide()}if(N.autoHideTimer){clearTimeout(N.autoHideTimer);delete N.autoHideTimer}}function G(N){var O=N.parentMenu;if(!O&&!N.allowOtherMenus){H()}else{if(O&&O.activeChild){O.activeChild.hide()}}}function L(N){if(K.getElapsed()>50&&D.length>0&&!N.getTarget(".x-menu")){H()}}function I(O,R){if(R){var Q=C[O.group];for(var P=0,N=Q.length;P{1}",this.icon||Ext.BLANK_IMAGE_URL,this.itemText||this.text,this.iconCls||"");this.el=C;Ext.menu.Item.superclass.onRender.call(this,B,A)},setText:function(A){this.text=A;if(this.rendered){this.el.update(String.format("{1}",this.icon||Ext.BLANK_IMAGE_URL,this.text,this.iconCls||""));this.parentMenu.autoWidth()}},setIconClass:function(A){var B=this.iconCls;this.iconCls=A;if(this.rendered){this.el.child("img.x-menu-item-icon").replaceClass(B,this.iconCls)}},handleClick:function(A){if(!this.href){A.stopEvent()}Ext.menu.Item.superclass.handleClick.apply(this,arguments)},activate:function(A){if(Ext.menu.Item.superclass.activate.apply(this,arguments)){this.focus();if(A){this.expandMenu()}}return true},shouldDeactivate:function(A){if(Ext.menu.Item.superclass.shouldDeactivate.call(this,A)){if(this.menu&&this.menu.isVisible()){return !this.menu.getEl().getRegion().contains(A.getPoint())}return true}return false},deactivate:function(){Ext.menu.Item.superclass.deactivate.apply(this,arguments);this.hideMenu()},expandMenu:function(A){if(!this.disabled&&this.menu){clearTimeout(this.hideTimer);delete this.hideTimer;if(!this.menu.isVisible()&&!this.showTimer){this.showTimer=this.deferExpand.defer(this.showDelay,this,[A])}else{if(this.menu.isVisible()&&A){this.menu.tryActivate(0,1)}}}},deferExpand:function(A){delete this.showTimer;this.menu.show(this.container,this.parentMenu.subMenuAlign||"tl-tr?",this.parentMenu);if(A){this.menu.tryActivate(0,1)}},hideMenu:function(){clearTimeout(this.showTimer);delete this.showTimer;if(!this.hideTimer&&this.menu&&this.menu.isVisible()){this.hideTimer=this.deferHide.defer(this.hideDelay,this)}},deferHide:function(){delete this.hideTimer;if(this.menu.over){this.parentMenu.setActiveItem(this,false)}else{this.menu.hide()}}}); +Ext.menu.CheckItem=function(A){Ext.menu.CheckItem.superclass.constructor.call(this,A);this.addEvents("beforecheckchange","checkchange");if(this.checkHandler){this.on("checkchange",this.checkHandler,this.scope)}Ext.menu.MenuMgr.registerCheckable(this)};Ext.extend(Ext.menu.CheckItem,Ext.menu.Item,{itemCls:"x-menu-item x-menu-check-item",groupClass:"x-menu-group-item",checked:false,ctype:"Ext.menu.CheckItem",onRender:function(A){Ext.menu.CheckItem.superclass.onRender.apply(this,arguments);if(this.group){this.el.addClass(this.groupClass)}if(this.checked){this.checked=false;this.setChecked(true,true)}},destroy:function(){Ext.menu.MenuMgr.unregisterCheckable(this);Ext.menu.CheckItem.superclass.destroy.apply(this,arguments)},setChecked:function(B,A){if(this.checked!=B&&this.fireEvent("beforecheckchange",this,B)!==false){if(this.container){this.container[B?"addClass":"removeClass"]("x-menu-item-checked")}this.checked=B;if(A!==true){this.fireEvent("checkchange",this,B)}}},handleClick:function(A){if(!this.disabled&&!(this.checked&&this.group)){this.setChecked(!this.checked)}Ext.menu.CheckItem.superclass.handleClick.apply(this,arguments)}}); +Ext.menu.Adapter=function(B,A){Ext.menu.Adapter.superclass.constructor.call(this,A);this.component=B};Ext.extend(Ext.menu.Adapter,Ext.menu.BaseItem,{canActivate:true,onRender:function(B,A){this.component.render(B);this.el=this.component.getEl()},activate:function(){if(this.disabled){return false}this.component.focus();this.fireEvent("activate",this);return true},deactivate:function(){this.fireEvent("deactivate",this)},disable:function(){this.component.disable();Ext.menu.Adapter.superclass.disable.call(this)},enable:function(){this.component.enable();Ext.menu.Adapter.superclass.enable.call(this)}}); +Ext.menu.DateItem=function(A){Ext.menu.DateItem.superclass.constructor.call(this,new Ext.DatePicker(A),A);this.picker=this.component;this.addEvents("select");this.picker.on("render",function(B){B.getEl().swallowEvent("click");B.container.addClass("x-menu-date-item")});this.picker.on("select",this.onSelect,this)};Ext.extend(Ext.menu.DateItem,Ext.menu.Adapter,{onSelect:function(B,A){this.fireEvent("select",this,A,B);Ext.menu.DateItem.superclass.handleClick.call(this)}}); +Ext.menu.ColorItem=function(A){Ext.menu.ColorItem.superclass.constructor.call(this,new Ext.ColorPalette(A),A);this.palette=this.component;this.relayEvents(this.palette,["select"]);if(this.selectHandler){this.on("select",this.selectHandler,this.scope)}};Ext.extend(Ext.menu.ColorItem,Ext.menu.Adapter); +Ext.menu.DateMenu=function(A){Ext.menu.DateMenu.superclass.constructor.call(this,A);this.plain=true;var B=new Ext.menu.DateItem(A);this.add(B);this.picker=B.picker;this.relayEvents(B,["select"]);this.on("beforeshow",function(){if(this.picker){this.picker.hideMonthPicker(true)}},this)};Ext.extend(Ext.menu.DateMenu,Ext.menu.Menu,{cls:"x-date-menu",beforeDestroy:function(){this.picker.destroy()}}); +Ext.menu.ColorMenu=function(A){Ext.menu.ColorMenu.superclass.constructor.call(this,A);this.plain=true;var B=new Ext.menu.ColorItem(A);this.add(B);this.palette=B.palette;this.relayEvents(B,["select"])};Ext.extend(Ext.menu.ColorMenu,Ext.menu.Menu); +Ext.form.Field=Ext.extend(Ext.BoxComponent,{invalidClass:"x-form-invalid",invalidText:"The value in this field is invalid",focusClass:"x-form-focus",validationEvent:"keyup",validateOnBlur:true,validationDelay:250,defaultAutoCreate:{tag:"input",type:"text",size:"20",autocomplete:"off"},fieldClass:"x-form-field",msgTarget:"qtip",msgFx:"normal",readOnly:false,disabled:false,isFormField:true,hasFocus:false,initComponent:function(){Ext.form.Field.superclass.initComponent.call(this);this.addEvents("focus","blur","specialkey","change","invalid","valid")},getName:function(){return this.rendered&&this.el.dom.name?this.el.dom.name:(this.hiddenName||"")},onRender:function(C,A){Ext.form.Field.superclass.onRender.call(this,C,A);if(!this.el){var B=this.getAutoCreate();if(!B.name){B.name=this.name||this.id}if(this.inputType){B.type=this.inputType}this.el=C.createChild(B,A)}var D=this.el.dom.type;if(D){if(D=="password"){D="text"}this.el.addClass("x-form-"+D)}if(this.readOnly){this.el.dom.readOnly=true}if(this.tabIndex!==undefined){this.el.dom.setAttribute("tabIndex",this.tabIndex)}this.el.addClass([this.fieldClass,this.cls])},initValue:function(){if(this.value!==undefined){this.setValue(this.value)}else{if(this.el.dom.value.length>0&&this.el.dom.value!=this.emptyText){this.setValue(this.el.dom.value)}}this.originalValue=this.getValue()},isDirty:function(){if(this.disabled){return false}return String(this.getValue())!==String(this.originalValue)},afterRender:function(){Ext.form.Field.superclass.afterRender.call(this);this.initEvents();this.initValue()},fireKey:function(A){if(A.isSpecialKey()){this.fireEvent("specialkey",this,A)}},reset:function(){this.setValue(this.originalValue);this.clearInvalid()},initEvents:function(){this.el.on(Ext.isIE||Ext.isSafari3?"keydown":"keypress",this.fireKey,this);this.el.on("focus",this.onFocus,this);var A=this.inEditor&&Ext.isWindows&&Ext.isGecko?{buffer:10}:null;this.el.on("blur",this.onBlur,this,A);this.originalValue=this.getValue()},onFocus:function(){if(!Ext.isOpera&&this.focusClass){this.el.addClass(this.focusClass)}if(!this.hasFocus){this.hasFocus=true;this.startValue=this.getValue();this.fireEvent("focus",this)}},beforeBlur:Ext.emptyFn,onBlur:function(){this.beforeBlur();if(!Ext.isOpera&&this.focusClass){this.el.removeClass(this.focusClass)}this.hasFocus=false;if(this.validationEvent!==false&&this.validateOnBlur&&this.validationEvent!="blur"){this.validate()}var A=this.getValue();if(String(A)!==String(this.startValue)){this.fireEvent("change",this,A,this.startValue)}this.fireEvent("blur",this)},isValid:function(A){if(this.disabled){return true}var C=this.preventMark;this.preventMark=A===true;var B=this.validateValue(this.processValue(this.getRawValue()));this.preventMark=C;return B},validate:function(){if(this.disabled||this.validateValue(this.processValue(this.getRawValue()))){this.clearInvalid();return true}return false},processValue:function(A){return A},validateValue:function(A){return true},markInvalid:function(C){if(!this.rendered||this.preventMark){return }this.el.addClass(this.invalidClass);C=C||this.invalidText;switch(this.msgTarget){case"qtip":this.el.dom.qtip=C;this.el.dom.qclass="x-form-invalid-tip";if(Ext.QuickTips){Ext.QuickTips.enable()}break;case"title":this.el.dom.title=C;break;case"under":if(!this.errorEl){var B=this.getErrorCt();if(!B){this.el.dom.title=C;break}this.errorEl=B.createChild({cls:"x-form-invalid-msg"});this.errorEl.setWidth(B.getWidth(true)-20)}this.errorEl.update(C);Ext.form.Field.msgFx[this.msgFx].show(this.errorEl,this);break;case"side":if(!this.errorIcon){var B=this.getErrorCt();if(!B){this.el.dom.title=C;break}this.errorIcon=B.createChild({cls:"x-form-invalid-icon"})}this.alignErrorIcon();this.errorIcon.dom.qtip=C;this.errorIcon.dom.qclass="x-form-invalid-tip";this.errorIcon.show();this.on("resize",this.alignErrorIcon,this);break;default:var A=Ext.getDom(this.msgTarget);A.innerHTML=C;A.style.display=this.msgDisplay;break}this.fireEvent("invalid",this,C)},getErrorCt:function(){return this.el.findParent(".x-form-element",5,true)||this.el.findParent(".x-form-field-wrap",5,true)},alignErrorIcon:function(){this.errorIcon.alignTo(this.el,"tl-tr",[2,0])},clearInvalid:function(){if(!this.rendered||this.preventMark){return }this.el.removeClass(this.invalidClass);switch(this.msgTarget){case"qtip":this.el.dom.qtip="";break;case"title":this.el.dom.title="";break;case"under":if(this.errorEl){Ext.form.Field.msgFx[this.msgFx].hide(this.errorEl,this)}break;case"side":if(this.errorIcon){this.errorIcon.dom.qtip="";this.errorIcon.hide();this.un("resize",this.alignErrorIcon,this)}break;default:var A=Ext.getDom(this.msgTarget);A.innerHTML="";A.style.display="none";break}this.fireEvent("valid",this)},getRawValue:function(){var A=this.rendered?this.el.getValue():Ext.value(this.value,"");if(A===this.emptyText){A=""}return A},getValue:function(){if(!this.rendered){return this.value}var A=this.el.getValue();if(A===this.emptyText||A===undefined){A=""}return A},setRawValue:function(A){return this.el.dom.value=(A===null||A===undefined?"":A)},setValue:function(A){this.value=A;if(this.rendered){this.el.dom.value=(A===null||A===undefined?"":A);this.validate()}},adjustSize:function(A,C){var B=Ext.form.Field.superclass.adjustSize.call(this,A,C);B.width=this.adjustWidth(this.el.dom.tagName,B.width);return B},adjustWidth:function(A,B){A=A.toLowerCase();if(typeof B=="number"&&!Ext.isSafari){if(Ext.isIE&&(A=="input"||A=="textarea")){if(A=="input"&&!Ext.isStrict){return this.inEditor?B:B-3}if(A=="input"&&Ext.isStrict){return B-(Ext.isIE6?4:1)}if(A=="textarea"&&Ext.isStrict){return B-2}}else{if(Ext.isOpera&&Ext.isStrict){if(A=="input"){return B+2}if(A=="textarea"){return B-2}}}}return B}});Ext.form.MessageTargets={"qtip":{mark:function(A){this.el.dom.qtip=msg;this.el.dom.qclass="x-form-invalid-tip";if(Ext.QuickTips){Ext.QuickTips.enable()}},clear:function(A){this.el.dom.qtip=""}},"title":{mark:function(A){this.el.dom.title=msg},clear:function(A){this.el.dom.title=""}},"under":{mark:function(B){if(!this.errorEl){var A=this.getErrorCt();if(!A){this.el.dom.title=msg;return }this.errorEl=A.createChild({cls:"x-form-invalid-msg"});this.errorEl.setWidth(A.getWidth(true)-20)}this.errorEl.update(msg);Ext.form.Field.msgFx[this.msgFx].show(this.errorEl,this)},clear:function(A){if(this.errorEl){Ext.form.Field.msgFx[this.msgFx].hide(this.errorEl,this)}else{this.el.dom.title=""}}},"side":{mark:function(B){if(!this.errorIcon){var A=this.getErrorCt();if(!A){this.el.dom.title=msg;return }this.errorIcon=A.createChild({cls:"x-form-invalid-icon"})}this.alignErrorIcon();this.errorIcon.dom.qtip=msg;this.errorIcon.dom.qclass="x-form-invalid-tip";this.errorIcon.show();this.on("resize",this.alignErrorIcon,this)},clear:function(A){if(this.errorIcon){this.errorIcon.dom.qtip="";this.errorIcon.hide();this.un("resize",this.alignErrorIcon,this)}else{this.el.dom.title=""}}},"around":{mark:function(A){},clear:function(A){}}};Ext.form.Field.msgFx={normal:{show:function(A,B){A.setDisplayed("block")},hide:function(A,B){A.setDisplayed(false).update("")}},slide:{show:function(A,B){A.slideIn("t",{stopFx:true})},hide:function(A,B){A.slideOut("t",{stopFx:true,useDisplay:true})}},slideRight:{show:function(A,B){A.fixDisplay();A.alignTo(B.el,"tl-tr");A.slideIn("l",{stopFx:true})},hide:function(A,B){A.slideOut("l",{stopFx:true,useDisplay:true})}}};Ext.reg("field",Ext.form.Field); +Ext.form.TextField=Ext.extend(Ext.form.Field,{grow:false,growMin:30,growMax:800,vtype:null,maskRe:null,disableKeyFilter:false,allowBlank:true,minLength:0,maxLength:Number.MAX_VALUE,minLengthText:"The minimum length for this field is {0}",maxLengthText:"The maximum length for this field is {0}",selectOnFocus:false,blankText:"This field is required",validator:null,regex:null,regexText:"",emptyText:null,emptyClass:"x-form-empty-field",initComponent:function(){Ext.form.TextField.superclass.initComponent.call(this);this.addEvents("autosize","keydown","keyup","keypress")},initEvents:function(){Ext.form.TextField.superclass.initEvents.call(this);if(this.validationEvent=="keyup"){this.validationTask=new Ext.util.DelayedTask(this.validate,this);this.el.on("keyup",this.filterValidation,this)}else{if(this.validationEvent!==false){this.el.on(this.validationEvent,this.validate,this,{buffer:this.validationDelay})}}if(this.selectOnFocus||this.emptyText){this.on("focus",this.preFocus,this);this.el.on("mousedown",function(){if(!this.hasFocus){this.el.on("mouseup",function(A){A.preventDefault()},this,{single:true})}},this);if(this.emptyText){this.on("blur",this.postBlur,this);this.applyEmptyText()}}if(this.maskRe||(this.vtype&&this.disableKeyFilter!==true&&(this.maskRe=Ext.form.VTypes[this.vtype+"Mask"]))){this.el.on("keypress",this.filterKeys,this)}if(this.grow){this.el.on("keyup",this.onKeyUpBuffered,this,{buffer:50});this.el.on("click",this.autoSize,this)}if(this.enableKeyEvents){this.el.on("keyup",this.onKeyUp,this);this.el.on("keydown",this.onKeyDown,this);this.el.on("keypress",this.onKeyPress,this)}},processValue:function(A){if(this.stripCharsRe){var B=A.replace(this.stripCharsRe,"");if(B!==A){this.setRawValue(B);return B}}return A},filterValidation:function(A){if(!A.isNavKeyPress()){this.validationTask.delay(this.validationDelay)}},onKeyUpBuffered:function(A){if(!A.isNavKeyPress()){this.autoSize()}},onKeyUp:function(A){this.fireEvent("keyup",this,A)},onKeyDown:function(A){this.fireEvent("keydown",this,A)},onKeyPress:function(A){this.fireEvent("keypress",this,A)},reset:function(){Ext.form.TextField.superclass.reset.call(this);this.applyEmptyText()},applyEmptyText:function(){if(this.rendered&&this.emptyText&&this.getRawValue().length<1){this.setRawValue(this.emptyText);this.el.addClass(this.emptyClass)}},preFocus:function(){if(this.emptyText){if(this.el.dom.value==this.emptyText){this.setRawValue("")}this.el.removeClass(this.emptyClass)}if(this.selectOnFocus){this.el.dom.select()}},postBlur:function(){this.applyEmptyText()},filterKeys:function(B){if(B.ctrlKey){return }var A=B.getKey();if(Ext.isGecko&&(B.isNavKeyPress()||A==B.BACKSPACE||(A==B.DELETE&&B.button==-1))){return }var D=B.getCharCode(),C=String.fromCharCode(D);if(!Ext.isGecko&&B.isSpecialKey()&&!C){return }if(!this.maskRe.test(C)){B.stopEvent()}},setValue:function(A){if(this.emptyText&&this.el&&A!==undefined&&A!==null&&A!==""){this.el.removeClass(this.emptyClass)}Ext.form.TextField.superclass.setValue.apply(this,arguments);this.applyEmptyText();this.autoSize()},validateValue:function(A){if(A.length<1||A===this.emptyText){if(this.allowBlank){this.clearInvalid();return true}else{this.markInvalid(this.blankText);return false}}if(A.lengththis.maxLength){this.markInvalid(String.format(this.maxLengthText,this.maxLength));return false}if(this.vtype){var C=Ext.form.VTypes;if(!C[this.vtype](A,this)){this.markInvalid(this.vtypeText||C[this.vtype+"Text"]);return false}}if(typeof this.validator=="function"){var B=this.validator(A);if(B!==true){this.markInvalid(B);return false}}if(this.regex&&!this.regex.test(A)){this.markInvalid(this.regexText);return false}return true},selectText:function(E,A){var C=this.getRawValue();if(C.length>0){E=E===undefined?0:E;A=A===undefined?C.length:A;var D=this.el.dom;if(D.setSelectionRange){D.setSelectionRange(E,A)}else{if(D.createTextRange){var B=D.createTextRange();B.moveStart("character",E);B.moveEnd("character",A-C.length);B.select()}}}},autoSize:function(){if(!this.grow||!this.rendered){return }if(!this.metrics){this.metrics=Ext.util.TextMetrics.createInstance(this.el)}var C=this.el;var B=C.dom.value;var D=document.createElement("div");D.appendChild(document.createTextNode(B));B=D.innerHTML;D=null;B+=" ";var A=Math.min(this.growMax,Math.max(this.metrics.getWidth(B)+10,this.growMin));this.el.setWidth(A);this.fireEvent("autosize",this,A)}});Ext.reg("textfield",Ext.form.TextField); +Ext.form.TriggerField=Ext.extend(Ext.form.TextField,{defaultAutoCreate:{tag:"input",type:"text",size:"16",autocomplete:"off"},hideTrigger:false,autoSize:Ext.emptyFn,monitorTab:true,deferHeight:true,mimicing:false,onResize:function(A,B){Ext.form.TriggerField.superclass.onResize.call(this,A,B);if(typeof A=="number"){this.el.setWidth(this.adjustWidth("input",A-this.trigger.getWidth()))}this.wrap.setWidth(this.el.getWidth()+this.trigger.getWidth())},adjustSize:Ext.BoxComponent.prototype.adjustSize,getResizeEl:function(){return this.wrap},getPositionEl:function(){return this.wrap},alignErrorIcon:function(){if(this.wrap){this.errorIcon.alignTo(this.wrap,"tl-tr",[2,0])}},onRender:function(B,A){Ext.form.TriggerField.superclass.onRender.call(this,B,A);this.wrap=this.el.wrap({cls:"x-form-field-wrap"});this.trigger=this.wrap.createChild(this.triggerConfig||{tag:"img",src:Ext.BLANK_IMAGE_URL,cls:"x-form-trigger "+this.triggerClass});if(this.hideTrigger){this.trigger.setDisplayed(false)}this.initTrigger();if(!this.width){this.wrap.setWidth(this.el.getWidth()+this.trigger.getWidth())}},afterRender:function(){Ext.form.TriggerField.superclass.afterRender.call(this);var A;if(Ext.isIE&&this.el.getY()!=(A=this.trigger.getY())){this.el.position();this.el.setY(A)}},initTrigger:function(){this.trigger.on("click",this.onTriggerClick,this,{preventDefault:true});this.trigger.addClassOnOver("x-form-trigger-over");this.trigger.addClassOnClick("x-form-trigger-click")},onDestroy:function(){if(this.trigger){this.trigger.removeAllListeners();this.trigger.remove()}if(this.wrap){this.wrap.remove()}Ext.form.TriggerField.superclass.onDestroy.call(this)},onFocus:function(){Ext.form.TriggerField.superclass.onFocus.call(this);if(!this.mimicing){this.wrap.addClass("x-trigger-wrap-focus");this.mimicing=true;Ext.get(Ext.isIE?document.body:document).on("mousedown",this.mimicBlur,this,{delay:10});if(this.monitorTab){this.el.on("keydown",this.checkTab,this)}}},checkTab:function(A){if(A.getKey()==A.TAB){this.triggerBlur()}},onBlur:function(){},mimicBlur:function(A){if(!this.wrap.contains(A.target)&&this.validateBlur(A)){this.triggerBlur()}},triggerBlur:function(){this.mimicing=false;Ext.get(Ext.isIE?document.body:document).un("mousedown",this.mimicBlur,this);if(this.monitorTab){this.el.un("keydown",this.checkTab,this)}this.beforeBlur();this.wrap.removeClass("x-trigger-wrap-focus");Ext.form.TriggerField.superclass.onBlur.call(this)},beforeBlur:Ext.emptyFn,validateBlur:function(A){return true},onDisable:function(){Ext.form.TriggerField.superclass.onDisable.call(this);if(this.wrap){this.wrap.addClass(this.disabledClass);this.el.removeClass(this.disabledClass)}},onEnable:function(){Ext.form.TriggerField.superclass.onEnable.call(this);if(this.wrap){this.wrap.removeClass(this.disabledClass)}},onShow:function(){if(this.wrap){this.wrap.dom.style.display="";this.wrap.dom.style.visibility="visible"}},onHide:function(){this.wrap.dom.style.display="none"},onTriggerClick:Ext.emptyFn});Ext.form.TwinTriggerField=Ext.extend(Ext.form.TriggerField,{initComponent:function(){Ext.form.TwinTriggerField.superclass.initComponent.call(this);this.triggerConfig={tag:"span",cls:"x-form-twin-triggers",cn:[{tag:"img",src:Ext.BLANK_IMAGE_URL,cls:"x-form-trigger "+this.trigger1Class},{tag:"img",src:Ext.BLANK_IMAGE_URL,cls:"x-form-trigger "+this.trigger2Class}]}},getTrigger:function(A){return this.triggers[A]},initTrigger:function(){var A=this.trigger.select(".x-form-trigger",true);this.wrap.setStyle("overflow","hidden");var B=this;A.each(function(D,F,C){D.hide=function(){var G=B.wrap.getWidth();this.dom.style.display="none";B.el.setWidth(G-B.trigger.getWidth())};D.show=function(){var G=B.wrap.getWidth();this.dom.style.display="";B.el.setWidth(G-B.trigger.getWidth())};var E="Trigger"+(C+1);if(this["hide"+E]){D.dom.style.display="none"}D.on("click",this["on"+E+"Click"],this,{preventDefault:true});D.addClassOnOver("x-form-trigger-over");D.addClassOnClick("x-form-trigger-click")},this);this.triggers=A.elements},onTrigger1Click:Ext.emptyFn,onTrigger2Click:Ext.emptyFn});Ext.reg("trigger",Ext.form.TriggerField); +Ext.form.TextArea=Ext.extend(Ext.form.TextField,{growMin:60,growMax:1000,growAppend:" \n ",growPad:0,enterIsSpecial:false,preventScrollbars:false,onRender:function(B,A){if(!this.el){this.defaultAutoCreate={tag:"textarea",style:"width:100px;height:60px;",autocomplete:"off"}}Ext.form.TextArea.superclass.onRender.call(this,B,A);if(this.grow){this.textSizeEl=Ext.DomHelper.append(document.body,{tag:"pre",cls:"x-form-grow-sizer"});if(this.preventScrollbars){this.el.setStyle("overflow","hidden")}this.el.setHeight(this.growMin)}},onDestroy:function(){if(this.textSizeEl){Ext.removeNode(this.textSizeEl)}Ext.form.TextArea.superclass.onDestroy.call(this)},fireKey:function(A){if(A.isSpecialKey()&&(this.enterIsSpecial||(A.getKey()!=A.ENTER||A.hasModifier()))){this.fireEvent("specialkey",this,A)}},onKeyUp:function(A){if(!A.isNavKeyPress()||A.getKey()==A.ENTER){this.autoSize()}Ext.form.TextArea.superclass.onKeyUp.call(this,A)},autoSize:function(){if(!this.grow||!this.textSizeEl){return }var C=this.el;var A=C.dom.value;var D=this.textSizeEl;D.innerHTML="";D.appendChild(document.createTextNode(A));A=D.innerHTML;Ext.fly(D).setWidth(this.el.getWidth());if(A.length<1){A="  "}else{if(Ext.isIE){A=A.replace(/\n/g,"

     

    ")}A+=this.growAppend}D.innerHTML=A;var B=Math.min(this.growMax,Math.max(D.offsetHeight,this.growMin)+this.growPad);if(B!=this.lastHeight){this.lastHeight=B;this.el.setHeight(B);this.fireEvent("autosize",this,B)}}});Ext.reg("textarea",Ext.form.TextArea); +Ext.form.NumberField=Ext.extend(Ext.form.TextField,{fieldClass:"x-form-field x-form-num-field",allowDecimals:true,decimalSeparator:".",decimalPrecision:2,allowNegative:true,minValue:Number.NEGATIVE_INFINITY,maxValue:Number.MAX_VALUE,minText:"The minimum value for this field is {0}",maxText:"The maximum value for this field is {0}",nanText:"{0} is not a valid number",baseChars:"0123456789",initEvents:function(){Ext.form.NumberField.superclass.initEvents.call(this);var B=this.baseChars+"";if(this.allowDecimals){B+=this.decimalSeparator}if(this.allowNegative){B+="-"}this.stripCharsRe=new RegExp("[^"+B+"]","gi");var A=function(D){var C=D.getKey();if(!Ext.isIE&&(D.isSpecialKey()||C==D.BACKSPACE||C==D.DELETE)){return }var E=D.getCharCode();if(B.indexOf(String.fromCharCode(E))===-1){D.stopEvent()}};this.el.on("keypress",A,this)},validateValue:function(B){if(!Ext.form.NumberField.superclass.validateValue.call(this,B)){return false}if(B.length<1){return true}B=String(B).replace(this.decimalSeparator,".");if(isNaN(B)){this.markInvalid(String.format(this.nanText,B));return false}var A=this.parseValue(B);if(Athis.maxValue){this.markInvalid(String.format(this.maxText,this.maxValue));return false}return true},getValue:function(){return this.fixPrecision(this.parseValue(Ext.form.NumberField.superclass.getValue.call(this)))},setValue:function(A){A=typeof A=="number"?A:parseFloat(String(A).replace(this.decimalSeparator,"."));A=isNaN(A)?"":String(A).replace(".",this.decimalSeparator);Ext.form.NumberField.superclass.setValue.call(this,A)},parseValue:function(A){A=parseFloat(String(A).replace(this.decimalSeparator,"."));return isNaN(A)?"":A},fixPrecision:function(B){var A=isNaN(B);if(!this.allowDecimals||this.decimalPrecision==-1||A||!B){return A?"":B}return parseFloat(parseFloat(B).toFixed(this.decimalPrecision))},beforeBlur:function(){var A=this.parseValue(this.getRawValue());if(A){this.setValue(this.fixPrecision(A))}}});Ext.reg("numberfield",Ext.form.NumberField); +Ext.form.DateField=Ext.extend(Ext.form.TriggerField,{format:"m/d/Y",altFormats:"m/d/Y|n/j/Y|n/j/y|m/j/y|n/d/y|m/j/Y|n/d/Y|m-d-y|m-d-Y|m/d|m-d|md|mdy|mdY|d|Y-m-d",disabledDaysText:"Disabled",disabledDatesText:"Disabled",minText:"The date in this field must be equal to or after {0}",maxText:"The date in this field must be equal to or before {0}",invalidText:"{0} is not a valid date - it must be in the format {1}",triggerClass:"x-form-date-trigger",showToday:true,defaultAutoCreate:{tag:"input",type:"text",size:"10",autocomplete:"off"},initComponent:function(){Ext.form.DateField.superclass.initComponent.call(this);if(typeof this.minValue=="string"){this.minValue=this.parseDate(this.minValue)}if(typeof this.maxValue=="string"){this.maxValue=this.parseDate(this.maxValue)}this.ddMatch=null;this.initDisabledDays()},initDisabledDays:function(){if(this.disabledDates){var A=this.disabledDates;var C="(?:";for(var B=0;Bthis.maxValue.getTime()){this.markInvalid(String.format(this.maxText,this.formatDate(this.maxValue)));return false}if(this.disabledDays){var A=E.getDay();for(var B=0;B
    {"+this.displayField+"}
    "}this.view=new Ext.DataView({applyTo:this.innerList,tpl:this.tpl,singleSelect:true,selectedClass:this.selectedClass,itemSelector:this.itemSelector||"."+A+"-item"});this.view.on("click",this.onViewClick,this);this.bindStore(this.store,true);if(this.resizable){this.resizer=new Ext.Resizable(this.list,{pinned:true,handles:"se"});this.resizer.on("resize",function(E,C,D){this.maxHeight=D-this.handleHeight-this.list.getFrameWidth("tb")-this.assetHeight;this.listWidth=C;this.innerList.setWidth(C-this.list.getFrameWidth("lr"));this.restrictHeight()},this);this[this.pageSize?"footer":"innerList"].setStyle("margin-bottom",this.handleHeight+"px")}}},bindStore:function(A,B){if(this.store&&!B){this.store.un("beforeload",this.onBeforeLoad,this);this.store.un("load",this.onLoad,this);this.store.un("loadexception",this.collapse,this);if(!A){this.store=null;if(this.view){this.view.setStore(null)}}}if(A){this.store=Ext.StoreMgr.lookup(A);this.store.on("beforeload",this.onBeforeLoad,this);this.store.on("load",this.onLoad,this);this.store.on("loadexception",this.collapse,this);if(this.view){this.view.setStore(A)}}},initEvents:function(){Ext.form.ComboBox.superclass.initEvents.call(this);this.keyNav=new Ext.KeyNav(this.el,{"up":function(A){this.inKeyMode=true;this.selectPrev()},"down":function(A){if(!this.isExpanded()){this.onTriggerClick()}else{this.inKeyMode=true;this.selectNext()}},"enter":function(A){this.onViewClick();this.delayedCheck=true;this.unsetDelayCheck.defer(10,this)},"esc":function(A){this.collapse()},"tab":function(A){this.onViewClick(false);return true},scope:this,doRelay:function(C,B,A){if(A=="down"||this.scope.isExpanded()){return Ext.KeyNav.prototype.doRelay.apply(this,arguments)}return true},forceKeyDown:true});this.queryDelay=Math.max(this.queryDelay||10,this.mode=="local"?10:250);this.dqTask=new Ext.util.DelayedTask(this.initQuery,this);if(this.typeAhead){this.taTask=new Ext.util.DelayedTask(this.onTypeAhead,this)}if(this.editable!==false){this.el.on("keyup",this.onKeyUp,this)}if(this.forceSelection){this.on("blur",this.doForce,this)}},onDestroy:function(){if(this.view){this.view.el.removeAllListeners();this.view.el.remove();this.view.purgeListeners()}if(this.list){this.list.destroy()}this.bindStore(null);Ext.form.ComboBox.superclass.onDestroy.call(this)},unsetDelayCheck:function(){delete this.delayedCheck},fireKey:function(A){if(A.isNavKeyPress()&&!this.isExpanded()&&!this.delayedCheck){this.fireEvent("specialkey",this,A)}},onResize:function(A,B){Ext.form.ComboBox.superclass.onResize.apply(this,arguments);if(this.list&&this.listWidth===undefined){var C=Math.max(A,this.minListWidth);this.list.setWidth(C);this.innerList.setWidth(C-this.list.getFrameWidth("lr"))}},onEnable:function(){Ext.form.ComboBox.superclass.onEnable.apply(this,arguments);if(this.hiddenField){this.hiddenField.disabled=false}},onDisable:function(){Ext.form.ComboBox.superclass.onDisable.apply(this,arguments);if(this.hiddenField){this.hiddenField.disabled=true}},setEditable:function(A){if(A==this.editable){return }this.editable=A;if(!A){this.el.dom.setAttribute("readOnly",true);this.el.on("mousedown",this.onTriggerClick,this);this.el.addClass("x-combo-noedit")}else{this.el.dom.setAttribute("readOnly",false);this.el.un("mousedown",this.onTriggerClick,this);this.el.removeClass("x-combo-noedit")}},onBeforeLoad:function(){if(!this.hasFocus){return }this.innerList.update(this.loadingText?"
    "+this.loadingText+"
    ":"");this.restrictHeight();this.selectedIndex=-1},onLoad:function(){if(!this.hasFocus){return }if(this.store.getCount()>0){this.expand();this.restrictHeight();if(this.lastQuery==this.allQuery){if(this.editable){this.el.dom.select()}if(!this.selectByValue(this.value,true)){this.select(0,true)}}else{this.selectNext();if(this.typeAhead&&this.lastKey!=Ext.EventObject.BACKSPACE&&this.lastKey!=Ext.EventObject.DELETE){this.taTask.delay(this.typeAheadDelay)}}}else{this.onEmptyResults()}},onTypeAhead:function(){if(this.store.getCount()>0){var B=this.store.getAt(0);var C=B.data[this.displayField];var A=C.length;var D=this.getRawValue().length;if(D!=A){this.setRawValue(C);this.selectText(D,C.length)}}},onSelect:function(A,B){if(this.fireEvent("beforeselect",this,A,B)!==false){this.setValue(A.data[this.valueField||this.displayField]);this.collapse();this.fireEvent("select",this,A,B)}},getValue:function(){if(this.valueField){return typeof this.value!="undefined"?this.value:""}else{return Ext.form.ComboBox.superclass.getValue.call(this)}},clearValue:function(){if(this.hiddenField){this.hiddenField.value=""}this.setRawValue("");this.lastSelectionText="";this.applyEmptyText();this.value=""},setValue:function(A){var C=A;if(this.valueField){var B=this.findRecord(this.valueField,A);if(B){C=B.data[this.displayField]}else{if(this.valueNotFoundText!==undefined){C=this.valueNotFoundText}}}this.lastSelectionText=C;if(this.hiddenField){this.hiddenField.value=A}Ext.form.ComboBox.superclass.setValue.call(this,C);this.value=A},findRecord:function(C,B){var A;if(this.store.getCount()>0){this.store.each(function(D){if(D.data[C]==B){A=D;return false}})}return A},onViewMove:function(B,A){this.inKeyMode=false},onViewOver:function(D,B){if(this.inKeyMode){return }var C=this.view.findItemFromChild(B);if(C){var A=this.view.indexOf(C);this.select(A,false)}},onViewClick:function(B){var A=this.view.getSelectedIndexes()[0];var C=this.store.getAt(A);if(C){this.onSelect(C,A)}if(B!==false){this.el.focus()}},restrictHeight:function(){this.innerList.dom.style.height="";var B=this.innerList.dom;var E=this.list.getFrameWidth("tb")+(this.resizable?this.handleHeight:0)+this.assetHeight;var C=Math.max(B.clientHeight,B.offsetHeight,B.scrollHeight);var A=this.getPosition()[1]-Ext.getBody().getScroll().top;var F=Ext.lib.Dom.getViewHeight()-A-this.getSize().height;var D=Math.max(A,F,this.minHeight||0)-this.list.shadowOffset-E-5;C=Math.min(C,D,this.maxHeight);this.innerList.setHeight(C);this.list.beginUpdate();this.list.setHeight(C+E);this.list.alignTo(this.wrap,this.listAlign);this.list.endUpdate()},onEmptyResults:function(){this.collapse()},isExpanded:function(){return this.list&&this.list.isVisible()},selectByValue:function(A,C){if(A!==undefined&&A!==null){var B=this.findRecord(this.valueField||this.displayField,A);if(B){this.select(this.store.indexOf(B),C);return true}}return false},select:function(A,C){this.selectedIndex=A;this.view.select(A);if(C!==false){var B=this.view.getNode(A);if(B){this.innerList.scrollChildIntoView(B,false)}}},selectNext:function(){var A=this.store.getCount();if(A>0){if(this.selectedIndex==-1){this.select(0)}else{if(this.selectedIndex0){if(this.selectedIndex==-1){this.select(0)}else{if(this.selectedIndex!=0){this.select(this.selectedIndex-1)}}}},onKeyUp:function(A){if(this.editable!==false&&!A.isSpecialKey()){this.lastKey=A.getKey();this.dqTask.delay(this.queryDelay)}},validateBlur:function(){return !this.list||!this.list.isVisible()},initQuery:function(){this.doQuery(this.getRawValue())},doForce:function(){if(this.el.dom.value.length>0){this.el.dom.value=this.lastSelectionText===undefined?"":this.lastSelectionText;this.applyEmptyText()}},doQuery:function(C,B){if(C===undefined||C===null){C=""}var A={query:C,forceAll:B,combo:this,cancel:false};if(this.fireEvent("beforequery",A)===false||A.cancel){return false}C=A.query;B=A.forceAll;if(B===true||(C.length>=this.minChars)){if(this.lastQuery!==C){this.lastQuery=C;if(this.mode=="local"){this.selectedIndex=-1;if(B){this.store.clearFilter()}else{this.store.filter(this.displayField,C)}this.onLoad()}else{this.store.baseParams[this.queryParam]=C;this.store.load({params:this.getParams(C)});this.expand()}}else{this.selectedIndex=-1;this.onLoad()}}},getParams:function(A){var B={};if(this.pageSize){B.start=0;B.limit=this.pageSize}return B},collapse:function(){if(!this.isExpanded()){return }this.list.hide();Ext.getDoc().un("mousewheel",this.collapseIf,this);Ext.getDoc().un("mousedown",this.collapseIf,this);this.fireEvent("collapse",this)},collapseIf:function(A){if(!A.within(this.wrap)&&!A.within(this.list)){this.collapse()}},expand:function(){if(this.isExpanded()||!this.hasFocus){return }this.list.alignTo(this.wrap,this.listAlign);this.list.show();this.innerList.setOverflow("auto");Ext.getDoc().on("mousewheel",this.collapseIf,this);Ext.getDoc().on("mousedown",this.collapseIf,this);this.fireEvent("expand",this)},onTriggerClick:function(){if(this.disabled){return }if(this.isExpanded()){this.collapse();this.el.focus()}else{this.onFocus({});if(this.triggerAction=="all"){this.doQuery(this.allQuery,true)}else{this.doQuery(this.getRawValue())}this.el.focus()}}});Ext.reg("combo",Ext.form.ComboBox); +Ext.form.Checkbox=Ext.extend(Ext.form.Field,{checkedCls:"x-form-check-checked",focusCls:"x-form-check-focus",overCls:"x-form-check-over",mouseDownCls:"x-form-check-down",tabIndex:0,checked:false,defaultAutoCreate:{tag:"input",type:"checkbox",autocomplete:"off"},baseCls:"x-form-check",initComponent:function(){Ext.form.Checkbox.superclass.initComponent.call(this);this.addEvents("check")},initEvents:function(){Ext.form.Checkbox.superclass.initEvents.call(this);this.initCheckEvents()},initCheckEvents:function(){this.innerWrap.removeAllListeners();this.innerWrap.addClassOnOver(this.overCls);this.innerWrap.addClassOnClick(this.mouseDownCls);this.innerWrap.on("click",this.onClick,this);this.innerWrap.on("keyup",this.onKeyUp,this)},onRender:function(B,A){Ext.form.Checkbox.superclass.onRender.call(this,B,A);if(this.inputValue!==undefined){this.el.dom.value=this.inputValue}this.el.addClass("x-hidden");this.innerWrap=this.el.wrap({tabIndex:this.tabIndex,cls:this.baseCls+"-wrap-inner"});this.wrap=this.innerWrap.wrap({cls:this.baseCls+"-wrap"});if(this.boxLabel){this.labelEl=this.innerWrap.createChild({tag:"label",htmlFor:this.el.id,cls:"x-form-cb-label",html:this.boxLabel})}this.imageEl=this.innerWrap.createChild({tag:"img",src:Ext.BLANK_IMAGE_URL,cls:this.baseCls},this.el);if(this.checked){this.setValue(true)}else{this.checked=this.el.dom.checked}this.originalValue=this.checked},onDestroy:function(){if(this.rendered){Ext.destroy(this.imageEl,this.labelEl,this.innerWrap,this.wrap)}Ext.form.Checkbox.superclass.onDestroy.call(this)},onFocus:function(A){Ext.form.Checkbox.superclass.onFocus.call(this,A);this.el.addClass(this.focusCls)},onBlur:function(A){Ext.form.Checkbox.superclass.onBlur.call(this,A);this.el.removeClass(this.focusCls)},onResize:function(){Ext.form.Checkbox.superclass.onResize.apply(this,arguments);if(!this.boxLabel&&!this.fieldLabel){this.el.alignTo(this.wrap,"c-c")}},onKeyUp:function(A){if(A.getKey()==Ext.EventObject.SPACE){this.onClick(A)}},onClick:function(A){if(!this.disabled&&!this.readOnly){this.toggleValue()}A.stopEvent()},onEnable:function(){Ext.form.Checkbox.superclass.onEnable.call(this);this.initCheckEvents()},onDisable:function(){Ext.form.Checkbox.superclass.onDisable.call(this);this.innerWrap.removeAllListeners()},toggleValue:function(){this.setValue(!this.checked)},getResizeEl:function(){if(!this.resizeEl){this.resizeEl=Ext.isSafari?this.wrap:(this.wrap.up(".x-form-element",5)||this.wrap)}return this.resizeEl},getPositionEl:function(){return this.wrap},getActionEl:function(){return this.wrap},markInvalid:Ext.emptyFn,clearInvalid:Ext.emptyFn,initValue:Ext.emptyFn,getValue:function(){if(this.rendered){return this.el.dom.checked}return false},setValue:function(A){var B=this.checked;this.checked=(A===true||A==="true"||A=="1"||String(A).toLowerCase()=="on");if(this.el&&this.el.dom){this.el.dom.checked=this.checked;this.el.dom.defaultChecked=this.checked}this.wrap[this.checked?"addClass":"removeClass"](this.checkedCls);if(B!=this.checked){this.fireEvent("check",this,this.checked);if(this.handler){this.handler.call(this.scope||this,this,this.checked)}}}});Ext.reg("checkbox",Ext.form.Checkbox); +Ext.form.CheckboxGroup=Ext.extend(Ext.form.Field,{columns:"auto",vertical:false,allowBlank:true,blankText:"You must select at least one item in this group",defaultType:"checkbox",groupCls:"x-form-check-group",onRender:function(H,F){if(!this.el){var M={cls:this.groupCls,layout:"column",border:false,renderTo:H};var A={defaultType:this.defaultType,layout:"form",border:false,defaults:{hideLabel:true,anchor:"100%"}};if(this.items[0].items){Ext.apply(M,{layoutConfig:{columns:this.items.length},defaults:this.defaults,items:this.items});for(var E=0,J=this.items.length;E0&&E%O==0){L++}if(this.items[E].fieldLabel){this.items[E].hideLabel=false}K[L].items.push(this.items[E])}}else{for(var E=0,J=this.items.length;E":">"),C,"")}return D.join("")},createToolbar:function(D){var A=Ext.QuickTips&&Ext.QuickTips.isEnabled();function C(G,E,F){return{itemId:G,cls:"x-btn-icon x-edit-"+G,enableToggle:E!==false,scope:D,handler:F||D.relayBtnCmd,clickEvent:"mousedown",tooltip:A?D.buttonTips[G]||undefined:undefined,tabIndex:-1}}var B=new Ext.Toolbar({renderTo:this.wrap.dom.firstChild});B.el.on("click",function(E){E.preventDefault()});if(this.enableFont&&!Ext.isSafari2){this.fontSelect=B.el.createChild({tag:"select",cls:"x-font-select",html:this.createFontOptions()});this.fontSelect.on("change",function(){var E=this.fontSelect.dom.value;this.relayCmd("fontname",E);this.deferFocus()},this);B.add(this.fontSelect.dom,"-")}if(this.enableFormat){B.add(C("bold"),C("italic"),C("underline"))}if(this.enableFontSize){B.add("-",C("increasefontsize",false,this.adjustFont),C("decreasefontsize",false,this.adjustFont))}if(this.enableColors){B.add("-",{itemId:"forecolor",cls:"x-btn-icon x-edit-forecolor",clickEvent:"mousedown",tooltip:A?D.buttonTips["forecolor"]||undefined:undefined,tabIndex:-1,menu:new Ext.menu.ColorMenu({allowReselect:true,focus:Ext.emptyFn,value:"000000",plain:true,selectHandler:function(F,E){this.execCmd("forecolor",Ext.isSafari||Ext.isIE?"#"+E:E);this.deferFocus()},scope:this,clickEvent:"mousedown"})},{itemId:"backcolor",cls:"x-btn-icon x-edit-backcolor",clickEvent:"mousedown",tooltip:A?D.buttonTips["backcolor"]||undefined:undefined,tabIndex:-1,menu:new Ext.menu.ColorMenu({focus:Ext.emptyFn,value:"FFFFFF",plain:true,allowReselect:true,selectHandler:function(F,E){if(Ext.isGecko){this.execCmd("useCSS",false);this.execCmd("hilitecolor",E);this.execCmd("useCSS",true);this.deferFocus()}else{this.execCmd(Ext.isOpera?"hilitecolor":"backcolor",Ext.isSafari||Ext.isIE?"#"+E:E);this.deferFocus()}},scope:this,clickEvent:"mousedown"})})}if(this.enableAlignments){B.add("-",C("justifyleft"),C("justifycenter"),C("justifyright"))}if(!Ext.isSafari2){if(this.enableLinks){B.add("-",C("createlink",false,this.createLink))}if(this.enableLists){B.add("-",C("insertorderedlist"),C("insertunorderedlist"))}if(this.enableSourceEdit){B.add("-",C("sourceedit",true,function(E){this.toggleSourceEdit(E.pressed)}))}}this.tb=B},getDocMarkup:function(){return""},getEditorBody:function(){return this.doc.body||this.doc.documentElement},getDoc:function(){return Ext.isIE?this.getWin().document:(this.iframe.contentDocument||this.getWin().document)},getWin:function(){return Ext.isIE?this.iframe.contentWindow:window.frames[this.iframe.name]},onRender:function(B,A){Ext.form.HtmlEditor.superclass.onRender.call(this,B,A);this.el.dom.style.border="0 none";this.el.dom.setAttribute("tabIndex",-1);this.el.addClass("x-hidden");if(Ext.isIE){this.el.applyStyles("margin-top:-1px;margin-bottom:-1px;")}this.wrap=this.el.wrap({cls:"x-html-editor-wrap",cn:{cls:"x-html-editor-tb"}});this.createToolbar(this);this.tb.items.each(function(E){if(E.itemId!="sourceedit"){E.disable()}});var C=document.createElement("iframe");C.name=Ext.id();C.frameBorder="0";C.src=Ext.isIE?Ext.SSL_SECURE_URL:"javascript:;";this.wrap.dom.appendChild(C);this.iframe=C;this.initFrame();if(this.autoMonitorDesignMode!==false){this.monitorTask=Ext.TaskMgr.start({run:this.checkDesignMode,scope:this,interval:100})}if(!this.width){var D=this.el.getSize();this.setSize(D.width,this.height||D.height)}},initFrame:function(){this.doc=this.getDoc();this.win=this.getWin();this.doc.open();this.doc.write(this.getDocMarkup());this.doc.close();var A={run:function(){if(this.doc.body||this.doc.readyState=="complete"){Ext.TaskMgr.stop(A);this.doc.designMode="on";this.initEditor.defer(10,this)}},interval:10,duration:10000,scope:this};Ext.TaskMgr.start(A)},checkDesignMode:function(){if(this.wrap&&this.wrap.dom.offsetWidth){var A=this.getDoc();if(!A){return }if(!A.editorInitialized||String(A.designMode).toLowerCase()!="on"){this.initFrame()}}},onResize:function(B,C){Ext.form.HtmlEditor.superclass.onResize.apply(this,arguments);if(this.el&&this.iframe){if(typeof B=="number"){var D=B-this.wrap.getFrameWidth("lr");this.el.setWidth(this.adjustWidth("textarea",D));this.iframe.style.width=D+"px"}if(typeof C=="number"){var A=C-this.wrap.getFrameWidth("tb")-this.tb.el.getHeight();this.el.setHeight(this.adjustWidth("textarea",A));this.iframe.style.height=A+"px";if(this.doc){this.getEditorBody().style.height=(A-(this.iframePad*2))+"px"}}}},toggleSourceEdit:function(A){if(A===undefined){A=!this.sourceEditMode}this.sourceEditMode=A===true;var C=this.tb.items.get("sourceedit");if(C.pressed!==this.sourceEditMode){C.toggle(this.sourceEditMode);return }if(this.sourceEditMode){this.tb.items.each(function(D){if(D.itemId!="sourceedit"){D.disable()}});this.syncValue();this.iframe.className="x-hidden";this.el.removeClass("x-hidden");this.el.dom.removeAttribute("tabIndex");this.el.focus()}else{if(this.initialized){this.tb.items.each(function(D){D.enable()})}this.pushValue();this.iframe.className="";this.el.addClass("x-hidden");this.el.dom.setAttribute("tabIndex",-1);this.deferFocus()}var B=this.lastSize;if(B){delete this.lastSize;this.setSize(B)}this.fireEvent("editmodechange",this,this.sourceEditMode)},createLink:function(){var A=prompt(this.createLinkText,this.defaultLinkValue);if(A&&A!="http:/"+"/"){this.relayCmd("createlink",A)}},adjustSize:Ext.BoxComponent.prototype.adjustSize,getResizeEl:function(){return this.wrap},getPositionEl:function(){return this.wrap},initEvents:function(){this.originalValue=this.getValue()},markInvalid:Ext.emptyFn,clearInvalid:Ext.emptyFn,setValue:function(A){Ext.form.HtmlEditor.superclass.setValue.call(this,A);this.pushValue()},cleanHtml:function(A){A=String(A);if(A.length>5){if(Ext.isSafari){A=A.replace(/\sclass="(?:Apple-style-span|khtml-block-placeholder)"/gi,"")}}if(A==" "){A=""}return A},syncValue:function(){if(this.initialized){var D=this.getEditorBody();var C=D.innerHTML;if(Ext.isSafari){var B=D.getAttribute("style");var A=B.match(/text-align:(.*?);/i);if(A&&A[1]){C="
    "+C+"
    "}}C=this.cleanHtml(C);if(this.fireEvent("beforesync",this,C)!==false){this.el.dom.value=C;this.fireEvent("sync",this,C)}}},pushValue:function(){if(this.initialized){var A=this.el.dom.value;if(!this.activated&&A.length<1){A=" "}if(this.fireEvent("beforepush",this,A)!==false){this.getEditorBody().innerHTML=A;this.fireEvent("push",this,A)}}},deferFocus:function(){this.focus.defer(10,this)},focus:function(){if(this.win&&!this.sourceEditMode){this.win.focus()}else{this.el.focus()}},initEditor:function(){var B=this.getEditorBody();var A=this.el.getStyles("font-size","font-family","background-image","background-repeat");A["background-attachment"]="fixed";B.bgProperties="fixed";Ext.DomHelper.applyStyles(B,A);if(this.doc){try{Ext.EventManager.removeAll(this.doc)}catch(C){}}this.doc=this.getDoc();Ext.EventManager.on(this.doc,{"mousedown":this.onEditorEvent,"dblclick":this.onEditorEvent,"click":this.onEditorEvent,"keyup":this.onEditorEvent,buffer:100,scope:this});if(Ext.isGecko){Ext.EventManager.on(this.doc,"keypress",this.applyCommand,this)}if(Ext.isIE||Ext.isSafari||Ext.isOpera){Ext.EventManager.on(this.doc,"keydown",this.fixKeys,this)}this.initialized=true;this.fireEvent("initialize",this);this.doc.editorInitialized=true;this.pushValue()},onDestroy:function(){if(this.monitorTask){Ext.TaskMgr.stop(this.monitorTask)}if(this.rendered){this.tb.items.each(function(A){if(A.menu){A.menu.removeAll();if(A.menu.el){A.menu.el.destroy()}}A.destroy()});this.wrap.dom.innerHTML="";this.wrap.remove()}},onFirstFocus:function(){this.activated=true;this.tb.items.each(function(D){D.enable()});if(Ext.isGecko){this.win.focus();var A=this.win.getSelection();if(!A.focusNode||A.focusNode.nodeType!=3){var B=A.getRangeAt(0);B.selectNodeContents(this.getEditorBody());B.collapse(true);this.deferFocus()}try{this.execCmd("useCSS",true);this.execCmd("styleWithCSS",false)}catch(C){}}this.fireEvent("activate",this)},adjustFont:function(B){var C=B.itemId=="increasefontsize"?1:-1;var A=parseInt(this.doc.queryCommandValue("FontSize")||2,10);if(Ext.isSafari3||Ext.isAir){if(A<=10){A=1+C}else{if(A<=13){A=2+C}else{if(A<=16){A=3+C}else{if(A<=18){A=4+C}else{if(A<=24){A=5+C}else{A=6+C}}}}}A=A.constrain(1,6)}else{if(Ext.isSafari){C*=2}A=Math.max(1,A+C)+(Ext.isSafari?"px":0)}this.execCmd("FontSize",A)},onEditorEvent:function(A){this.updateToolbar()},updateToolbar:function(){if(!this.activated){this.onFirstFocus();return }var B=this.tb.items.map,C=this.doc;if(this.enableFont&&!Ext.isSafari2){var A=(this.doc.queryCommandValue("FontName")||this.defaultFont).toLowerCase();if(A!=this.fontSelect.dom.value){this.fontSelect.dom.value=A}}if(this.enableFormat){B.bold.toggle(C.queryCommandState("bold"));B.italic.toggle(C.queryCommandState("italic"));B.underline.toggle(C.queryCommandState("underline"))}if(this.enableAlignments){B.justifyleft.toggle(C.queryCommandState("justifyleft"));B.justifycenter.toggle(C.queryCommandState("justifycenter"));B.justifyright.toggle(C.queryCommandState("justifyright"))}if(!Ext.isSafari2&&this.enableLists){B.insertorderedlist.toggle(C.queryCommandState("insertorderedlist"));B.insertunorderedlist.toggle(C.queryCommandState("insertunorderedlist"))}Ext.menu.MenuMgr.hideAll();this.syncValue()},relayBtnCmd:function(A){this.relayCmd(A.itemId)},relayCmd:function(B,A){(function(){this.focus();this.execCmd(B,A);this.updateToolbar()}).defer(10,this)},execCmd:function(B,A){this.doc.execCommand(B,false,A===undefined?null:A);this.syncValue()},applyCommand:function(B){if(B.ctrlKey){var C=B.getCharCode(),A;if(C>0){C=String.fromCharCode(C);switch(C){case"b":A="bold";break;case"i":A="italic";break;case"u":A="underline";break}if(A){this.win.focus();this.execCmd(A);this.deferFocus();B.preventDefault()}}}},insertAtCursor:function(B){if(!this.activated){return }if(Ext.isIE){this.win.focus();var A=this.doc.selection.createRange();if(A){A.collapse(true);A.pasteHTML(B);this.syncValue();this.deferFocus()}}else{if(Ext.isGecko||Ext.isOpera){this.win.focus();this.execCmd("InsertHTML",B);this.deferFocus()}else{if(Ext.isSafari){this.execCmd("InsertText",B);this.deferFocus()}}}},fixKeys:function(){if(Ext.isIE){return function(D){var A=D.getKey(),B;if(A==D.TAB){D.stopEvent();B=this.doc.selection.createRange();if(B){B.collapse(true);B.pasteHTML("    ");this.deferFocus()}}else{if(A==D.ENTER){B=this.doc.selection.createRange();if(B){var C=B.parentElement();if(!C||C.tagName.toLowerCase()!="li"){D.stopEvent();B.pasteHTML("
    ");B.collapse(false);B.select()}}}}}}else{if(Ext.isOpera){return function(B){var A=B.getKey();if(A==B.TAB){B.stopEvent();this.win.focus();this.execCmd("InsertHTML","    ");this.deferFocus()}}}else{if(Ext.isSafari){return function(B){var A=B.getKey();if(A==B.TAB){B.stopEvent();this.execCmd("InsertText","\t");this.deferFocus()}}}}}}(),getToolbar:function(){return this.tb},buttonTips:{bold:{title:"Bold (Ctrl+B)",text:"Make the selected text bold.",cls:"x-html-editor-tip"},italic:{title:"Italic (Ctrl+I)",text:"Make the selected text italic.",cls:"x-html-editor-tip"},underline:{title:"Underline (Ctrl+U)",text:"Underline the selected text.",cls:"x-html-editor-tip"},increasefontsize:{title:"Grow Text",text:"Increase the font size.",cls:"x-html-editor-tip"},decreasefontsize:{title:"Shrink Text",text:"Decrease the font size.",cls:"x-html-editor-tip"},backcolor:{title:"Text Highlight Color",text:"Change the background color of the selected text.",cls:"x-html-editor-tip"},forecolor:{title:"Font Color",text:"Change the color of the selected text.",cls:"x-html-editor-tip"},justifyleft:{title:"Align Text Left",text:"Align text to the left.",cls:"x-html-editor-tip"},justifycenter:{title:"Center Text",text:"Center text in the editor.",cls:"x-html-editor-tip"},justifyright:{title:"Align Text Right",text:"Align text to the right.",cls:"x-html-editor-tip"},insertunorderedlist:{title:"Bullet List",text:"Start a bulleted list.",cls:"x-html-editor-tip"},insertorderedlist:{title:"Numbered List",text:"Start a numbered list.",cls:"x-html-editor-tip"},createlink:{title:"Hyperlink",text:"Make the selected text a hyperlink.",cls:"x-html-editor-tip"},sourceedit:{title:"Source Edit",text:"Switch to source editing mode.",cls:"x-html-editor-tip"}}});Ext.reg("htmleditor",Ext.form.HtmlEditor); +Ext.form.TimeField=Ext.extend(Ext.form.ComboBox,{minValue:null,maxValue:null,minText:"The time in this field must be equal to or after {0}",maxText:"The time in this field must be equal to or before {0}",invalidText:"{0} is not a valid time",format:"g:i A",altFormats:"g:ia|g:iA|g:i a|g:i A|h:i|g:i|H:i|ga|ha|gA|h a|g a|g A|gi|hi|gia|hia|g|H",increment:15,mode:"local",triggerAction:"all",typeAhead:false,initDate:"1/1/2008",initComponent:function(){Ext.form.TimeField.superclass.initComponent.call(this);if(typeof this.minValue=="string"){this.minValue=this.parseDate(this.minValue)}if(typeof this.maxValue=="string"){this.maxValue=this.parseDate(this.maxValue)}if(!this.store){var B=this.parseDate(this.minValue);if(!B){B=new Date(this.initDate).clearTime()}var A=this.parseDate(this.maxValue);if(!A){A=new Date(this.initDate).clearTime().add("mi",(24*60)-1)}var C=[];while(B<=A){C.push([B.dateFormat(this.format)]);B=B.add("mi",this.increment)}this.store=new Ext.data.SimpleStore({fields:["text"],data:C});this.displayField="text"}},getValue:function(){var A=Ext.form.TimeField.superclass.getValue.call(this);return this.formatDate(this.parseDate(A))||""},setValue:function(A){Ext.form.TimeField.superclass.setValue.call(this,this.formatDate(this.parseDate(A)))},validateValue:Ext.form.DateField.prototype.validateValue,parseDate:Ext.form.DateField.prototype.parseDate,formatDate:Ext.form.DateField.prototype.formatDate,beforeBlur:function(){var A=this.parseDate(this.getRawValue());if(A){this.setValue(A.dateFormat(this.format))}}});Ext.reg("timefield",Ext.form.TimeField); +Ext.form.Label=Ext.extend(Ext.BoxComponent,{onRender:function(B,A){if(!this.el){this.el=document.createElement("label");this.el.id=this.getId();this.el.innerHTML=this.text?Ext.util.Format.htmlEncode(this.text):(this.html||"");if(this.forId){this.el.setAttribute("htmlFor",this.forId)}}Ext.form.Label.superclass.onRender.call(this,B,A)},setText:function(A,B){this.text=A;if(this.rendered){this.el.dom.innerHTML=B!==false?Ext.util.Format.htmlEncode(A):A}return this}});Ext.reg("label",Ext.form.Label); +Ext.form.Action=function(B,A){this.form=B;this.options=A||{}};Ext.form.Action.CLIENT_INVALID="client";Ext.form.Action.SERVER_INVALID="server";Ext.form.Action.CONNECT_FAILURE="connect";Ext.form.Action.LOAD_FAILURE="load";Ext.form.Action.prototype={type:"default",run:function(A){},success:function(A){},handleResponse:function(A){},failure:function(A){this.response=A;this.failureType=Ext.form.Action.CONNECT_FAILURE;this.form.afterAction(this,false)},processResponse:function(A){this.response=A;if(!A.responseText){return true}this.result=this.handleResponse(A);return this.result},getUrl:function(C){var A=this.options.url||this.form.url||this.form.el.dom.action;if(C){var B=this.getParams();if(B){A+=(A.indexOf("?")!=-1?"&":"?")+B}}return A},getMethod:function(){return(this.options.method||this.form.method||this.form.el.dom.method||"POST").toUpperCase()},getParams:function(){var A=this.form.baseParams;var B=this.options.params;if(B){if(typeof B=="object"){B=Ext.urlEncode(Ext.applyIf(B,A))}else{if(typeof B=="string"&&A){B+="&"+Ext.urlEncode(A)}}}else{if(A){B=Ext.urlEncode(A)}}return B},createCallback:function(A){var A=A||{};return{success:this.success,failure:this.failure,scope:this,timeout:(A.timeout*1000)||(this.form.timeout*1000),upload:this.form.fileUpload?this.success:undefined}}};Ext.form.Action.Submit=function(B,A){Ext.form.Action.Submit.superclass.constructor.call(this,B,A)};Ext.extend(Ext.form.Action.Submit,Ext.form.Action,{type:"submit",run:function(){var B=this.options;var C=this.getMethod();var A=C=="GET";if(B.clientValidation===false||this.form.isValid()){Ext.Ajax.request(Ext.apply(this.createCallback(B),{form:this.form.el.dom,url:this.getUrl(A),method:C,headers:B.headers,params:!A?this.getParams():null,isUpload:this.form.fileUpload}))}else{if(B.clientValidation!==false){this.failureType=Ext.form.Action.CLIENT_INVALID;this.form.afterAction(this,false)}}},success:function(B){var A=this.processResponse(B);if(A===true||A.success){this.form.afterAction(this,true);return }if(A.errors){this.form.markInvalid(A.errors);this.failureType=Ext.form.Action.SERVER_INVALID}this.form.afterAction(this,false)},handleResponse:function(C){if(this.form.errorReader){var B=this.form.errorReader.read(C);var F=[];if(B.records){for(var D=0,A=B.records.length;D=0){if(!D){C=F-1}D=false;while(C>=0){if(E.call(I||this,J,C,H)===true){return[J,C]}C--}J--}}else{if(C>=F){J++;D=false}while(J","
    ","
    {header}
    ","
    {body}
    ","
    ","
     
    ","
     
    ","")}if(!C.header){C.header=new Ext.Template("","{cells}","
    ")}if(!C.hcell){C.hcell=new Ext.Template("
    ",this.grid.enableHdMenu?"":"","{value}","
    ")}if(!C.body){C.body=new Ext.Template("{rows}")}if(!C.row){C.row=new Ext.Template("
    ","{cells}",(this.enableRowBody?"":""),"
    {body}
    ")}if(!C.cell){C.cell=new Ext.Template("","
    {value}
    ","")}for(var A in C){var B=C[A];if(B&&typeof B.compile=="function"&&!B.compiled){B.disableFormats=true;B.compile()}}this.templates=C;this.colRe=new RegExp("x-grid3-td-([^\\s]+)","")},fly:function(A){if(!this._flyweight){this._flyweight=new Ext.Element.Flyweight(document.body)}this._flyweight.dom=A;return this._flyweight},getEditorParent:function(A){return this.scroller.dom},initElements:function(){var C=Ext.Element;var B=this.grid.getGridEl().dom.firstChild;var A=B.childNodes;this.el=new C(B);this.mainWrap=new C(A[0]);this.mainHd=new C(this.mainWrap.dom.firstChild);if(this.grid.hideHeaders){this.mainHd.setDisplayed(false)}this.innerHd=this.mainHd.dom.firstChild;this.scroller=new C(this.mainWrap.dom.childNodes[1]);if(this.forceFit){this.scroller.setStyle("overflow-x","hidden")}this.mainBody=new C(this.scroller.dom.firstChild);this.focusEl=new C(this.scroller.dom.childNodes[1]);this.focusEl.swallowEvent("click",true);this.resizeMarker=new C(A[1]);this.resizeProxy=new C(A[2])},getRows:function(){return this.hasRows()?this.mainBody.dom.childNodes:[]},findCell:function(A){if(!A){return false}return this.fly(A).findParent(this.cellSelector,this.cellSelectorDepth)},findCellIndex:function(C,B){var A=this.findCell(C);if(A&&(!B||this.fly(A).hasClass(B))){return this.getCellIndex(A)}return false},getCellIndex:function(B){if(B){var A=B.className.match(this.colRe);if(A&&A[1]){return this.cm.getIndexById(A[1])}}return false},findHeaderCell:function(B){var A=this.findCell(B);return A&&this.fly(A).hasClass(this.hdCls)?A:null},findHeaderIndex:function(A){return this.findCellIndex(A,this.hdCls)},findRow:function(A){if(!A){return false}return this.fly(A).findParent(this.rowSelector,this.rowSelectorDepth)},findRowIndex:function(A){var B=this.findRow(A);return B?B.rowIndex:false},getRow:function(A){return this.getRows()[A]},getCell:function(B,A){return this.getRow(B).getElementsByTagName("td")[A]},getHeaderCell:function(A){return this.mainHd.dom.getElementsByTagName("td")[A]},addRowClass:function(C,A){var B=this.getRow(C);if(B){this.fly(B).addClass(A)}},removeRowClass:function(C,A){var B=this.getRow(C);if(B){this.fly(B).removeClass(A)}},removeRow:function(A){Ext.removeNode(this.getRow(A));this.focusRow(A)},removeRows:function(C,A){var B=this.mainBody.dom;for(var D=C;D<=A;D++){Ext.removeNode(B.childNodes[C])}this.focusRow(C)},getScrollState:function(){var A=this.scroller.dom;return{left:A.scrollLeft,top:A.scrollTop}},restoreScroll:function(A){var B=this.scroller.dom;B.scrollLeft=A.left;B.scrollTop=A.top},scrollToTop:function(){this.scroller.dom.scrollTop=0;this.scroller.dom.scrollLeft=0},syncScroll:function(){this.syncHeaderScroll();var A=this.scroller.dom;this.grid.fireEvent("bodyscroll",A.scrollLeft,A.scrollTop)},syncHeaderScroll:function(){var A=this.scroller.dom;this.innerHd.scrollLeft=A.scrollLeft;this.innerHd.scrollLeft=A.scrollLeft},updateSortIcon:function(B,A){var D=this.sortClasses;var C=this.mainHd.select("td").removeClass(D);C.item(B).addClass(D[A=="DESC"?1:0])},updateAllColumnWidths:function(){var D=this.getTotalWidth();var H=this.cm.getColumnCount();var F=[];for(var B=0;B=this.ds.getCount()){return }E=(E!==undefined?E:0);var I=this.getRow(P),F;if(!(D===false&&E===0)){while(this.cm.isHidden(E)){E++}F=this.getCell(P,E)}if(!I){return }var L=this.scroller.dom;var O=0;var C=I,M=this.el.dom;while(C&&C!=M){O+=C.offsetTop;C=C.offsetParent}O-=this.mainHd.dom.offsetHeight;var N=O+I.offsetHeight;var A=L.clientHeight;var M=parseInt(L.scrollTop,10);var K=M+A;if(OK){L.scrollTop=N-A}}if(D!==false){var J=parseInt(F.offsetLeft,10);var H=J+F.offsetWidth;var G=parseInt(L.scrollLeft,10);var B=G+L.clientWidth;if(JB){L.scrollLeft=H-L.clientWidth}}}return F?Ext.fly(F).getXY():[L.scrollLeft+this.el.getX(),Ext.fly(I).getY()]},insertRows:function(A,F,C,E){if(!E&&F===0&&C>=A.getCount()-1){this.refresh()}else{if(!E){this.fireEvent("beforerowsinserted",this,F,C)}var B=this.renderRows(F,C);var D=this.getRow(F);if(D){Ext.DomHelper.insertHtml("beforeBegin",D,B)}else{Ext.DomHelper.insertHtml("beforeEnd",this.mainBody.dom,B)}if(!E){this.fireEvent("rowsinserted",this,F,C);this.processRows(F)}}this.focusRow(F)},deleteRows:function(A,C,B){if(A.getRowCount()<1){this.refresh()}else{this.fireEvent("beforerowsdeleted",this,C,B);this.removeRows(C,B);this.processRows(C);this.fireEvent("rowsdeleted",this,C,B)}},getColumnStyle:function(A,C){var B=!C?(this.cm.config[A].css||""):"";B+="width:"+this.getColumnWidth(A)+";";if(this.cm.isHidden(A)){B+="display:none;"}var D=this.cm.config[A].align;if(D){B+="text-align:"+D+";"}return B},getColumnWidth:function(B){var A=this.cm.getColumnWidth(B);if(typeof A=="number"){return(Ext.isBorderBox?A:(A-this.borderWidth>0?A-this.borderWidth:0))+"px"}return A},getTotalWidth:function(){return this.cm.getTotalWidth()+"px"},fitColumns:function(D,G,E){var F=this.cm,S,L,O;var R=F.getTotalWidth(false);var J=this.grid.getGridEl().getWidth(true)-this.scrollOffset;if(J<20){return }var B=J-R;if(B===0){return false}var A=F.getColumnCount(true);var P=A-(typeof E=="number"?1:0);if(P===0){P=1;E=undefined}var K=F.getColumnCount();var I=[];var N=0;var M=0;var H;for(O=0;OJ){var Q=P!=A?E:N;F.setColumnWidth(Q,Math.max(1,F.getColumnWidth(Q)-(R-J)),true)}if(D!==true){this.updateAllColumnWidths()}return true},autoExpand:function(B){var G=this.grid,A=this.cm;if(!this.userResized&&G.autoExpandColumn){var D=A.getTotalWidth(false);var H=this.grid.getGridEl().getWidth(true)-this.scrollOffset;if(D!=H){var F=A.getIndexById(G.autoExpandColumn);var E=A.getColumnWidth(F);var C=Math.min(Math.max(((H-D)+E),G.autoExpandMin),G.autoExpandMax);if(C!=E){A.setColumnWidth(F,C,true);if(B!==true){this.updateColumnWidth(F,C)}}}}},getColumnData:function(){var D=[],A=this.cm,E=A.getColumnCount();for(var C=0;C"+this.emptyText+"")}},updateHeaderSortState:function(){var B=this.ds.getSortState();if(!B){return }if(!this.sortState||(this.sortState.field!=B.field||this.sortState.direction!=B.direction)){this.grid.fireEvent("sortchange",this.grid,B)}this.sortState=B;var C=this.cm.findColumnIndex(B.field);if(C!=-1){var A=B.direction;this.updateSortIcon(C,A)}},destroy:function(){if(this.colMenu){this.colMenu.removeAll();Ext.menu.MenuMgr.unregister(this.colMenu);this.colMenu.getEl().remove();delete this.colMenu}if(this.hmenu){this.hmenu.removeAll();Ext.menu.MenuMgr.unregister(this.hmenu);this.hmenu.getEl().remove();delete this.hmenu}if(this.grid.enableColumnMove){var C=Ext.dd.DDM.ids["gridHeader"+this.grid.getGridEl().id];if(C){for(var A in C){if(!C[A].config.isTarget&&C[A].dragElId){var B=C[A].dragElId;C[A].unreg();Ext.get(B).remove()}else{if(C[A].config.isTarget){C[A].proxyTop.remove();C[A].proxyBottom.remove();C[A].unreg()}}if(Ext.dd.DDM.locationCache[A]){delete Ext.dd.DDM.locationCache[A]}}delete Ext.dd.DDM.ids["gridHeader"+this.grid.getGridEl().id]}}Ext.destroy(this.resizeMarker,this.resizeProxy);if(this.dragZone){this.dragZone.unreg()}this.initData(null,null);Ext.EventManager.removeResizeListener(this.onWindowResize,this)},onDenyColumnHide:function(){},render:function(){if(this.autoFill){this.fitColumns(true,true)}else{if(this.forceFit){this.fitColumns(true,false)}else{if(this.grid.autoExpandColumn){this.autoExpand(true)}}}this.renderUI()},initData:function(B,A){if(this.ds){this.ds.un("load",this.onLoad,this);this.ds.un("datachanged",this.onDataChange,this);this.ds.un("add",this.onAdd,this);this.ds.un("remove",this.onRemove,this);this.ds.un("update",this.onUpdate,this);this.ds.un("clear",this.onClear,this)}if(B){B.on("load",this.onLoad,this);B.on("datachanged",this.onDataChange,this);B.on("add",this.onAdd,this);B.on("remove",this.onRemove,this);B.on("update",this.onUpdate,this);B.on("clear",this.onClear,this)}this.ds=B;if(this.cm){this.cm.un("configchange",this.onColConfigChange,this);this.cm.un("widthchange",this.onColWidthChange,this);this.cm.un("headerchange",this.onHeaderChange,this);this.cm.un("hiddenchange",this.onHiddenChange,this);this.cm.un("columnmoved",this.onColumnMove,this);this.cm.un("columnlockchange",this.onColumnLock,this)}if(A){delete this.lastViewWidth;A.on("configchange",this.onColConfigChange,this);A.on("widthchange",this.onColWidthChange,this);A.on("headerchange",this.onHeaderChange,this);A.on("hiddenchange",this.onHiddenChange,this);A.on("columnmoved",this.onColumnMove,this);A.on("columnlockchange",this.onColumnLock,this)}this.cm=A},onDataChange:function(){this.refresh();this.updateHeaderSortState()},onClear:function(){this.refresh()},onUpdate:function(B,A){this.refreshRow(A)},onAdd:function(C,A,B){this.insertRows(C,B,B+(A.length-1))},onRemove:function(D,A,B,C){if(C!==true){this.fireEvent("beforerowremoved",this,B,A)}this.removeRow(B);if(C!==true){this.processRows(B);this.applyEmptyText();this.fireEvent("rowremoved",this,B,A)}},onLoad:function(){this.scrollToTop()},onColWidthChange:function(A,B,C){this.updateColumnWidth(B,C)},onHeaderChange:function(A,B,C){this.updateHeaders()},onHiddenChange:function(A,B,C){this.updateColumnHidden(B,C)},onColumnMove:function(A,D,B){this.indexMap=null;var C=this.getScrollState();this.refresh(true);this.restoreScroll(C);this.afterMove(B)},onColConfigChange:function(){delete this.lastViewWidth;this.indexMap=null;this.refresh(true)},initUI:function(A){A.on("headerclick",this.onHeaderClick,this);if(A.trackMouseOver){A.on("mouseover",this.onRowOver,this);A.on("mouseout",this.onRowOut,this)}},initEvents:function(){},onHeaderClick:function(B,A){if(this.headersDisabled||!this.cm.isSortable(A)){return }B.stopEditing(true);B.store.sort(this.cm.getDataIndex(A))},onRowOver:function(B,A){var C;if((C=this.findRowIndex(A))!==false){this.addRowClass(C,"x-grid3-row-over")}},onRowOut:function(B,A){var C;if((C=this.findRowIndex(A))!==false&&C!==this.findRowIndex(B.getRelatedTarget())){this.removeRowClass(C,"x-grid3-row-over")}},handleWheel:function(A){A.stopPropagation()},onRowSelect:function(A){this.addRowClass(A,"x-grid3-row-selected")},onRowDeselect:function(A){this.removeRowClass(A,"x-grid3-row-selected")},onCellSelect:function(C,B){var A=this.getCell(C,B);if(A){this.fly(A).addClass("x-grid3-cell-selected")}},onCellDeselect:function(C,B){var A=this.getCell(C,B);if(A){this.fly(A).removeClass("x-grid3-cell-selected")}},onColumnSplitterMoved:function(C,B){this.userResized=true;var A=this.grid.colModel;A.setColumnWidth(C,B,true);if(this.forceFit){this.fitColumns(true,false,C);this.updateAllColumnWidths()}else{this.updateColumnWidth(C,B)}this.grid.fireEvent("columnresize",C,B)},handleHdMenuClick:function(C){var B=this.hdCtxIndex;var A=this.cm,D=this.ds;switch(C.id){case"asc":D.sort(A.getDataIndex(B),"ASC");break;case"desc":D.sort(A.getDataIndex(B),"DESC");break;default:B=A.getIndexById(C.id.substr(4));if(B!=-1){if(C.checked&&A.getColumnsBy(this.isHideableColumn,this).length<=1){this.onDenyColumnHide();return false}A.setHidden(B,C.checked)}}return true},isHideableColumn:function(A){return !A.hidden&&!A.fixed},beforeColMenuShow:function(){var A=this.cm,C=A.getColumnCount();this.colMenu.removeAll();for(var B=0;B","
    ",this.groupTextTpl,"
    ","
    ")}this.startGroup.compile();this.endGroup="
    "},findGroup:function(A){return Ext.fly(A).up(".x-grid-group",this.mainBody.dom)},getGroups:function(){return this.hasRows()?this.mainBody.dom.childNodes:[]},onAdd:function(){if(this.enableGrouping&&!this.ignoreAdd){var A=this.getScrollState();this.refresh();this.restoreScroll(A)}else{if(!this.enableGrouping){Ext.grid.GroupingView.superclass.onAdd.apply(this,arguments)}}},onRemove:function(E,A,B,D){Ext.grid.GroupingView.superclass.onRemove.apply(this,arguments);var C=document.getElementById(A._groupId);if(C&&C.childNodes[1].childNodes.length<1){Ext.removeNode(C)}this.applyEmptyText()},refreshRow:function(A){if(this.ds.getCount()==1){this.refresh()}else{this.isUpdating=true;Ext.grid.GroupingView.superclass.refreshRow.apply(this,arguments);this.isUpdating=false}},beforeMenuShow:function(){var C=this.getGroupField();var B=this.hmenu.items.get("groupBy");if(B){B.setDisabled(this.cm.config[this.hdCtxIndex].groupable===false)}var A=this.hmenu.items.get("showGroups");if(A){A.setDisabled(!C&&this.cm.config[this.hdCtxIndex].groupable===false);A.setChecked(!!C,true)}},renderUI:function(){Ext.grid.GroupingView.superclass.renderUI.call(this);this.mainBody.on("mousedown",this.interceptMouse,this);if(this.enableGroupingMenu&&this.hmenu){this.hmenu.add("-",{id:"groupBy",text:this.groupByText,handler:this.onGroupByClick,scope:this,iconCls:"x-group-by-icon"});if(this.enableNoGroups){this.hmenu.add({id:"showGroups",text:this.showGroupsText,checked:true,checkHandler:this.onShowGroupsClick,scope:this})}this.hmenu.on("beforeshow",this.beforeMenuShow,this)}},onGroupByClick:function(){this.grid.store.groupBy(this.cm.getDataIndex(this.hdCtxIndex));this.beforeMenuShow()},onShowGroupsClick:function(A,B){if(B){this.onGroupByClick()}else{this.grid.store.clearGrouping()}},toggleGroup:function(C,B){this.grid.stopEditing(true);C=Ext.getDom(C);var A=Ext.fly(C);B=B!==undefined?B:A.hasClass("x-grid-group-collapsed");this.state[A.dom.id]=B;A[B?"removeClass":"addClass"]("x-grid-group-collapsed")},toggleAllGroups:function(C){var B=this.getGroups();for(var D=0,A=B.length;D=0&&this.config[A].resizable!==false&&this.config[A].fixed!==true},setHidden:function(A,B){var C=this.config[A];if(C.hidden!==B){C.hidden=B;this.totalWidth=null;this.fireEvent("hiddenchange",this,A,B)}},setEditor:function(A,B){this.config[A].editor=B}});Ext.grid.ColumnModel.defaultRenderer=function(A){if(typeof A=="string"&&A.length<1){return" "}return A};Ext.grid.DefaultColumnModel=Ext.grid.ColumnModel; +Ext.grid.AbstractSelectionModel=function(){this.locked=false;Ext.grid.AbstractSelectionModel.superclass.constructor.call(this)};Ext.extend(Ext.grid.AbstractSelectionModel,Ext.util.Observable,{init:function(A){this.grid=A;this.initEvents()},lock:function(){this.locked=true},unlock:function(){this.locked=false},isLocked:function(){return this.locked}}); +Ext.grid.RowSelectionModel=function(A){Ext.apply(this,A);this.selections=new Ext.util.MixedCollection(false,function(B){return B.id});this.last=false;this.lastActive=false;this.addEvents("selectionchange","beforerowselect","rowselect","rowdeselect");Ext.grid.RowSelectionModel.superclass.constructor.call(this)};Ext.extend(Ext.grid.RowSelectionModel,Ext.grid.AbstractSelectionModel,{singleSelect:false,initEvents:function(){if(!this.grid.enableDragDrop&&!this.grid.enableDrag){this.grid.on("rowmousedown",this.handleMouseDown,this)}else{this.grid.on("rowclick",function(B,D,C){if(C.button===0&&!C.shiftKey&&!C.ctrlKey){this.selectRow(D,false);B.view.focusRow(D)}},this)}this.rowNav=new Ext.KeyNav(this.grid.getGridEl(),{"up":function(C){if(!C.shiftKey){this.selectPrevious(C.shiftKey)}else{if(this.last!==false&&this.lastActive!==false){var B=this.last;this.selectRange(this.last,this.lastActive-1);this.grid.getView().focusRow(this.lastActive);if(B!==false){this.last=B}}else{this.selectFirstRow()}}},"down":function(C){if(!C.shiftKey){this.selectNext(C.shiftKey)}else{if(this.last!==false&&this.lastActive!==false){var B=this.last;this.selectRange(this.last,this.lastActive+1);this.grid.getView().focusRow(this.lastActive);if(B!==false){this.last=B}}else{this.selectFirstRow()}}},scope:this});var A=this.grid.view;A.on("refresh",this.onRefresh,this);A.on("rowupdated",this.onRowUpdated,this);A.on("rowremoved",this.onRemove,this)},onRefresh:function(){var F=this.grid.store,B;var D=this.getSelections();this.clearSelections(true);for(var C=0,A=D.length;C0},isSelected:function(A){var B=typeof A=="number"?this.grid.store.getAt(A):A;return(B&&this.selections.key(B.id)?true:false)},isIdSelected:function(A){return(this.selections.key(A)?true:false)},handleMouseDown:function(D,F,E){if(E.button!==0||this.isLocked()){return }var A=this.grid.getView();if(E.shiftKey&&this.last!==false){var C=this.last;this.selectRange(C,F,E.ctrlKey);this.last=C;A.focusRow(F)}else{var B=this.isSelected(F);if(E.ctrlKey&&B){this.deselectRow(F)}else{if(!B||this.getCount()>1){this.selectRow(F,E.ctrlKey||E.shiftKey);A.focusRow(F)}}}},selectRows:function(C,D){if(!D){this.clearSelections()}for(var B=0,A=C.length;B=A;C--){this.selectRow(C,true)}}},deselectRange:function(C,B,A){if(this.locked){return }for(var D=C;D<=B;D++){this.deselectRow(D,A)}},selectRow:function(B,D,A){if(this.locked||(B<0||B>=this.grid.store.getCount())||this.isSelected(B)){return }var C=this.grid.store.getAt(B);if(C&&this.fireEvent("beforerowselect",this,B,D,C)!==false){if(!D||this.singleSelect){this.clearSelections()}this.selections.add(C);this.last=this.lastActive=B;if(!A){this.grid.getView().onRowSelect(B)}this.fireEvent("rowselect",this,B,C);this.fireEvent("selectionchange",this)}},deselectRow:function(B,A){if(this.locked){return }if(this.last==B){this.last=false}if(this.lastActive==B){this.lastActive=false}var C=this.grid.store.getAt(B);if(C){this.selections.remove(C);if(!A){this.grid.getView().onRowDeselect(B)}this.fireEvent("rowdeselect",this,B,C);this.fireEvent("selectionchange",this)}},restoreLast:function(){if(this._last){this.last=this._last}},acceptsNav:function(C,B,A){return !A.isHidden(B)&&A.isCellEditable(B,C)},onEditorKey:function(F,E){var C=E.getKey(),G,D=this.grid,B=D.activeEditor;var A=E.shiftKey;if(C==E.TAB){E.stopEvent();B.completeEdit();if(A){G=D.walkCells(B.row,B.col-1,-1,this.acceptsNav,this)}else{G=D.walkCells(B.row,B.col+1,1,this.acceptsNav,this)}}else{if(C==E.ENTER){E.stopEvent();B.completeEdit();if(this.moveEditorOnEnter!==false){if(A){G=D.walkCells(B.row-1,B.col,-1,this.acceptsNav,this)}else{G=D.walkCells(B.row+1,B.col,1,this.acceptsNav,this)}}}else{if(C==E.ESC){B.cancelEdit()}}}if(G){D.startEditing(G[0],G[1])}}}); +Ext.grid.CellSelectionModel=function(A){Ext.apply(this,A);this.selection=null;this.addEvents("beforecellselect","cellselect","selectionchange");Ext.grid.CellSelectionModel.superclass.constructor.call(this)};Ext.extend(Ext.grid.CellSelectionModel,Ext.grid.AbstractSelectionModel,{initEvents:function(){this.grid.on("cellmousedown",this.handleMouseDown,this);this.grid.getGridEl().on(Ext.isIE||Ext.isSafari3?"keydown":"keypress",this.handleKeyDown,this);var A=this.grid.view;A.on("refresh",this.onViewChange,this);A.on("rowupdated",this.onRowUpdated,this);A.on("beforerowremoved",this.clearSelections,this);A.on("beforerowsinserted",this.clearSelections,this);if(this.grid.isEditor){this.grid.on("beforeedit",this.beforeEdit,this)}},beforeEdit:function(A){this.select(A.row,A.column,false,true,A.record)},onRowUpdated:function(A,B,C){if(this.selection&&this.selection.record==C){A.onCellSelect(B,this.selection.cell[1])}},onViewChange:function(){this.clearSelections(true)},getSelectedCell:function(){return this.selection?this.selection.cell:null},clearSelections:function(B){var A=this.selection;if(A){if(B!==true){this.grid.view.onCellDeselect(A.cell[0],A.cell[1])}this.selection=null;this.fireEvent("selectionchange",this,null)}},hasSelection:function(){return this.selection?true:false},handleMouseDown:function(B,D,A,C){if(C.button!==0||this.isLocked()){return }this.select(D,A)},select:function(F,C,B,E,D){if(this.fireEvent("beforecellselect",this,F,C)!==false){this.clearSelections();D=D||this.grid.store.getAt(F);this.selection={record:D,cell:[F,C]};if(!B){var A=this.grid.getView();A.onCellSelect(F,C);if(E!==true){A.focusCell(F,C)}}this.fireEvent("cellselect",this,F,C);this.fireEvent("selectionchange",this,this.selection)}},isSelectable:function(C,B,A){return !A.isHidden(B)},handleKeyDown:function(F){if(!F.isNavKeyPress()){return }var E=this.grid,J=this.selection;if(!J){F.stopEvent();var I=E.walkCells(0,0,1,this.isSelectable,this);if(I){this.select(I[0],I[1])}return }var B=this;var H=function(M,K,L){return E.walkCells(M,K,L,B.isSelectable,B)};var C=F.getKey(),A=J.cell[0],G=J.cell[1];var D;switch(C){case F.TAB:if(F.shiftKey){D=H(A,G-1,-1)}else{D=H(A,G+1,1)}break;case F.DOWN:D=H(A+1,G,1);break;case F.UP:D=H(A-1,G,-1);break;case F.RIGHT:D=H(A,G+1,1);break;case F.LEFT:D=H(A,G-1,-1);break;case F.ENTER:if(E.isEditor&&!E.editing){E.startEditing(A,G);F.stopEvent();return }break}if(D){this.select(D[0],D[1]);F.stopEvent()}},acceptsNav:function(C,B,A){return !A.isHidden(B)&&A.isCellEditable(B,C)},onEditorKey:function(E,D){var B=D.getKey(),F,C=this.grid,A=C.activeEditor;if(B==D.TAB){if(D.shiftKey){F=C.walkCells(A.row,A.col-1,-1,this.acceptsNav,this)}else{F=C.walkCells(A.row,A.col+1,1,this.acceptsNav,this)}D.stopEvent()}else{if(B==D.ENTER){A.completeEdit();D.stopEvent()}else{if(B==D.ESC){D.stopEvent();A.cancelEdit()}}}if(F){C.startEditing(F[0],F[1])}}}); +Ext.grid.EditorGridPanel=Ext.extend(Ext.grid.GridPanel,{clicksToEdit:2,isEditor:true,detectEdit:false,autoEncode:false,trackMouseOver:false,initComponent:function(){Ext.grid.EditorGridPanel.superclass.initComponent.call(this);if(!this.selModel){this.selModel=new Ext.grid.CellSelectionModel()}this.activeEditor=null;this.addEvents("beforeedit","afteredit","validateedit")},initEvents:function(){Ext.grid.EditorGridPanel.superclass.initEvents.call(this);this.on("bodyscroll",this.stopEditing,this,[true]);if(this.clicksToEdit==1){this.on("cellclick",this.onCellDblClick,this)}else{if(this.clicksToEdit=="auto"&&this.view.mainBody){this.view.mainBody.on("mousedown",this.onAutoEditClick,this)}this.on("celldblclick",this.onCellDblClick,this)}this.getGridEl().addClass("xedit-grid")},onCellDblClick:function(B,C,A){this.startEditing(C,A)},onAutoEditClick:function(C,B){if(C.button!==0){return }var E=this.view.findRowIndex(B);var A=this.view.findCellIndex(B);if(E!==false&&A!==false){this.stopEditing();if(this.selModel.getSelectedCell){var D=this.selModel.getSelectedCell();if(D&&D.cell[0]===E&&D.cell[1]===A){this.startEditing(E,A)}}else{if(this.selModel.isSelected(E)){this.startEditing(E,A)}}}},onEditComplete:function(B,D,A){this.editing=false;this.activeEditor=null;B.un("specialkey",this.selModel.onEditorKey,this.selModel);var C=B.record;var F=this.colModel.getDataIndex(B.col);D=this.postEditValue(D,A,C,F);if(String(D)!==String(A)){var E={grid:this,record:C,field:F,originalValue:A,value:D,row:B.row,column:B.col,cancel:false};if(this.fireEvent("validateedit",E)!==false&&!E.cancel){C.set(F,E.value);delete E.cancel;this.fireEvent("afteredit",E)}}this.view.focusCell(B.row,B.col)},startEditing:function(F,B){this.stopEditing();if(this.colModel.isCellEditable(B,F)){this.view.ensureVisible(F,B,true);var C=this.store.getAt(F);var E=this.colModel.getDataIndex(B);var D={grid:this,record:C,field:E,value:C.data[E],row:F,column:B,cancel:false};if(this.fireEvent("beforeedit",D)!==false&&!D.cancel){this.editing=true;var A=this.colModel.getCellEditor(B,F);if(!A.rendered){A.render(this.view.getEditorParent(A))}(function(){A.row=F;A.col=B;A.record=C;A.on("complete",this.onEditComplete,this,{single:true});A.on("specialkey",this.selModel.onEditorKey,this.selModel);this.activeEditor=A;var G=this.preEditValue(C,E);A.startEdit(this.view.getCell(F,B).firstChild,G)}).defer(50,this)}}},preEditValue:function(A,C){var B=A.data[C];return this.autoEncode&&typeof B=="string"?Ext.util.Format.htmlDecode(B):B},postEditValue:function(C,A,B,D){return this.autoEncode&&typeof C=="string"?Ext.util.Format.htmlEncode(C):C},stopEditing:function(A){if(this.activeEditor){this.activeEditor[A===true?"cancelEdit":"completeEdit"]()}this.activeEditor=null},onDestroy:function(){if(this.rendered){var C=this.colModel.config;for(var B=0,A=C.length;B ",width:20,sortable:false,menuDisabled:true,fixed:true,dataIndex:"",id:"checker",initEvents:function(){Ext.grid.CheckboxSelectionModel.superclass.initEvents.call(this);this.grid.on("render",function(){var A=this.grid.getView();A.mainBody.on("mousedown",this.onMouseDown,this);Ext.fly(A.innerHd).on("mousedown",this.onHdMouseDown,this)},this)},onMouseDown:function(C,B){if(C.button===0&&B.className=="x-grid3-row-checker"){C.stopEvent();var D=C.getTarget(".x-grid3-row");if(D){var A=D.rowIndex;if(this.isSelected(A)){this.deselectRow(A)}else{this.selectRow(A,true)}}}},onHdMouseDown:function(C,A){if(A.className=="x-grid3-hd-checker"){C.stopEvent();var B=Ext.fly(A.parentNode);var D=B.hasClass("x-grid3-hd-checker-on");if(D){B.removeClass("x-grid3-hd-checker-on");this.clearSelections()}else{B.addClass("x-grid3-hd-checker-on");this.selectAll()}}},renderer:function(B,C,A){return"
     
    "}}); +Ext.LoadMask=function(C,B){this.el=Ext.get(C);Ext.apply(this,B);if(this.store){this.store.on("beforeload",this.onBeforeLoad,this);this.store.on("load",this.onLoad,this);this.store.on("loadexception",this.onLoad,this);this.removeMask=Ext.value(this.removeMask,false)}else{var A=this.el.getUpdater();A.showLoadIndicator=false;A.on("beforeupdate",this.onBeforeLoad,this);A.on("update",this.onLoad,this);A.on("failure",this.onLoad,this);this.removeMask=Ext.value(this.removeMask,true)}};Ext.LoadMask.prototype={msg:"Loading...",msgCls:"x-mask-loading",disabled:false,disable:function(){this.disabled=true},enable:function(){this.disabled=false},onLoad:function(){this.el.unmask(this.removeMask)},onBeforeLoad:function(){if(!this.disabled){this.el.mask(this.msg,this.msgCls)}},show:function(){this.onBeforeLoad()},hide:function(){this.onLoad()},destroy:function(){if(this.store){this.store.un("beforeload",this.onBeforeLoad,this);this.store.un("load",this.onLoad,this);this.store.un("loadexception",this.onLoad,this)}else{var A=this.el.getUpdater();A.un("beforeupdate",this.onBeforeLoad,this);A.un("update",this.onLoad,this);A.un("failure",this.onLoad,this)}}}; +Ext.ProgressBar=Ext.extend(Ext.BoxComponent,{baseCls:"x-progress",waitTimer:null,initComponent:function(){Ext.ProgressBar.superclass.initComponent.call(this);this.addEvents("update")},onRender:function(D,A){Ext.ProgressBar.superclass.onRender.call(this,D,A);var C=new Ext.Template("
    ","
    ","
    ","
    ","
     
    ","
    ","
    ","
    ","
     
    ","
    ","
    ","
    ");if(A){this.el=C.insertBefore(A,{cls:this.baseCls},true)}else{this.el=C.append(D,{cls:this.baseCls},true)}if(this.id){this.el.dom.id=this.id}var B=this.el.dom.firstChild;this.progressBar=Ext.get(B.firstChild);if(this.textEl){this.textEl=Ext.get(this.textEl);delete this.textTopEl}else{this.textTopEl=Ext.get(this.progressBar.dom.firstChild);var E=Ext.get(B.childNodes[1]);this.textTopEl.setStyle("z-index",99).addClass("x-hidden");this.textEl=new Ext.CompositeElement([this.textTopEl.dom.firstChild,E.dom.firstChild]);this.textEl.setWidth(B.offsetWidth)}this.progressBar.setHeight(B.offsetHeight)},afterRender:function(){Ext.ProgressBar.superclass.afterRender.call(this);if(this.value){this.updateProgress(this.value,this.text)}else{this.updateText(this.text)}},updateProgress:function(B,C){this.value=B||0;if(C){this.updateText(C)}if(this.rendered){var A=Math.floor(B*this.el.dom.firstChild.offsetWidth);this.progressBar.setWidth(A);if(this.textTopEl){this.textTopEl.removeClass("x-hidden").setWidth(A)}}this.fireEvent("update",this,B,C);return this},wait:function(B){if(!this.waitTimer){var A=this;B=B||{};this.updateText(B.text);this.waitTimer=Ext.TaskMgr.start({run:function(C){var D=B.increment||10;this.updateProgress(((((C+D)%D)+1)*(100/D))*0.01)},interval:B.interval||1000,duration:B.duration,onStop:function(){if(B.fn){B.fn.apply(B.scope||this)}this.reset()},scope:A})}return this},isWaiting:function(){return this.waitTimer!=null},updateText:function(A){this.text=A||" ";if(this.rendered){this.textEl.update(this.text)}return this},syncProgressBar:function(){if(this.value){this.updateProgress(this.value,this.text)}return this},setSize:function(A,C){Ext.ProgressBar.superclass.setSize.call(this,A,C);if(this.textTopEl){var B=this.el.dom.firstChild;this.textEl.setSize(B.offsetWidth,B.offsetHeight)}this.syncProgressBar();return this},reset:function(A){this.updateProgress(0);if(this.textTopEl){this.textTopEl.addClass("x-hidden")}if(this.waitTimer){this.waitTimer.onStop=null;Ext.TaskMgr.stop(this.waitTimer);this.waitTimer=null}if(A===true){this.hide()}return this}});Ext.reg("progress",Ext.ProgressBar); +Ext.Slider=Ext.extend(Ext.BoxComponent,{vertical:false,minValue:0,maxValue:100,keyIncrement:1,increment:0,clickRange:[5,15],clickToChange:true,animate:true,dragging:false,initComponent:function(){if(this.value===undefined){this.value=this.minValue}Ext.Slider.superclass.initComponent.call(this);this.keyIncrement=Math.max(this.increment,this.keyIncrement);this.addEvents("beforechange","change","changecomplete","dragstart","drag","dragend");if(this.vertical){Ext.apply(this,Ext.Slider.Vertical)}},onRender:function(){this.autoEl={cls:"x-slider "+(this.vertical?"x-slider-vert":"x-slider-horz"),cn:{cls:"x-slider-end",cn:{cls:"x-slider-inner",cn:[{cls:"x-slider-thumb"},{tag:"a",cls:"x-slider-focus",href:"#",tabIndex:"-1",hidefocus:"on"}]}}};Ext.Slider.superclass.onRender.apply(this,arguments);this.endEl=this.el.first();this.innerEl=this.endEl.first();this.thumb=this.innerEl.first();this.halfThumb=(this.vertical?this.thumb.getHeight():this.thumb.getWidth())/2;this.focusEl=this.thumb.next();this.initEvents()},initEvents:function(){this.thumb.addClassOnOver("x-slider-thumb-over");this.mon(this.el,"mousedown",this.onMouseDown,this);this.mon(this.el,"keydown",this.onKeyDown,this);this.focusEl.swallowEvent("click",true);this.tracker=new Ext.dd.DragTracker({onBeforeStart:this.onBeforeDragStart.createDelegate(this),onStart:this.onDragStart.createDelegate(this),onDrag:this.onDrag.createDelegate(this),onEnd:this.onDragEnd.createDelegate(this),tolerance:3,autoStart:300});this.tracker.initEl(this.thumb);this.on("beforedestroy",this.tracker.destroy,this.tracker)},onMouseDown:function(B){if(this.disabled){return }if(this.clickToChange&&B.target!=this.thumb.dom){var A=this.innerEl.translatePoints(B.getXY());this.onClickChange(A)}this.focus()},onClickChange:function(A){if(A.top>this.clickRange[0]&&A.top0){if(A>(C/2)){D=B+(C-A)}else{D=B-A}}return D.constrain(this.minValue,this.maxValue)},afterRender:function(){Ext.Slider.superclass.afterRender.apply(this,arguments);if(this.value!==undefined){var A=this.normalizeValue(this.value);if(A!==this.value){delete this.value;this.setValue(A,false)}else{this.moveThumb(this.translateValue(A),false)}}},getRatio:function(){var A=this.innerEl.getWidth();var B=this.maxValue-this.minValue;return B==0?A:(A/B)},normalizeValue:function(A){if(typeof A!="number"){A=parseInt(A)}A=Math.round(A);A=this.doSnap(A);A=A.constrain(this.minValue,this.maxValue);return A},setValue:function(B,A,C){B=this.normalizeValue(B);if(B!==this.value&&this.fireEvent("beforechange",this,B,this.value)!==false){this.value=B;this.moveThumb(this.translateValue(B),A!==false);this.fireEvent("change",this,B);if(C){this.fireEvent("changecomplete",this,B)}}},translateValue:function(A){var B=this.getRatio();return(A*B)-(this.minValue*B)-this.halfThumb},reverseValue:function(B){var A=this.getRatio();return(B+this.halfThumb+(this.minValue*A))/A},moveThumb:function(B,A){if(!A||this.animate===false){this.thumb.setLeft(B)}else{this.thumb.shift({left:B,stopFx:true,duration:0.35})}},focus:function(){this.focusEl.focus(10)},onBeforeDragStart:function(A){return !this.disabled},onDragStart:function(A){this.thumb.addClass("x-slider-thumb-drag");this.dragging=true;this.dragStartValue=this.value;this.fireEvent("dragstart",this,A)},onDrag:function(A){var B=this.innerEl.translatePoints(this.tracker.getXY());this.setValue(Math.round(this.reverseValue(B.left)),false);this.fireEvent("drag",this,A)},onDragEnd:function(A){this.thumb.removeClass("x-slider-thumb-drag");this.dragging=false;this.fireEvent("dragend",this,A);if(this.dragStartValue!=this.value){this.fireEvent("changecomplete",this,this.value)}},onResize:function(A,B){this.innerEl.setWidth(A-(this.el.getPadding("l")+this.endEl.getPadding("r")));this.syncThumb()},syncThumb:function(){if(this.rendered){this.moveThumb(this.translateValue(this.value))}},getValue:function(){return this.value}});Ext.reg("slider",Ext.Slider);Ext.Slider.Vertical={onResize:function(A,B){this.innerEl.setHeight(B-(this.el.getPadding("t")+this.endEl.getPadding("b")));this.syncThumb()},getRatio:function(){var B=this.innerEl.getHeight();var A=this.maxValue-this.minValue;return B/A},moveThumb:function(B,A){if(!A||this.animate===false){this.thumb.setBottom(B)}else{this.thumb.shift({bottom:B,stopFx:true,duration:0.35})}},onDrag:function(B){var C=this.innerEl.translatePoints(this.tracker.getXY());var A=this.innerEl.getHeight()-C.top;this.setValue(Math.round(A/this.getRatio()),false);this.fireEvent("drag",this,B)},onClickChange:function(B){if(B.left>this.clickRange[0]&&B.left0){this.statusEl.addClass(A);this.currIconCls=A}}else{this.currIconCls=A}return this},showBusy:function(A){if(typeof A=="string"){A={text:A}}A=Ext.applyIf(A||{},{text:this.busyText,iconCls:this.busyIconCls});return this.setStatus(A)}});Ext.reg("statusbar",Ext.StatusBar); +Ext.History=(function(){var E,C;var J=false;var D;function F(){var K=top.location.href,L=K.indexOf("#");return L>=0?K.substr(L+1):null}function A(){C.value=D}function G(K){D=K;Ext.History.fireEvent("change",K)}function H(L){var K=["
    ",L,"
    "].join("");try{var N=E.contentWindow.document;N.open();N.write(K);N.close();return true}catch(M){return false}}function B(){if(!E.contentWindow||!E.contentWindow.document){setTimeout(B,10);return }var N=E.contentWindow.document;var L=N.getElementById("state");var K=L?L.innerText:null;var M=F();setInterval(function(){N=E.contentWindow.document;L=N.getElementById("state");var P=L?L.innerText:null;var O=F();if(P!==K){K=P;G(K);top.location.hash=K;M=K;A()}else{if(O!==M){M=O;H(O)}}},50);J=true;Ext.History.fireEvent("ready",Ext.History)}function I(){D=C.value;if(Ext.isIE){B()}else{var K=F();setInterval(function(){var L=F();if(L!==K){K=L;G(K);A()}},50);J=true;Ext.History.fireEvent("ready",Ext.History)}}return{fieldId:"x-history-field",iframeId:"x-history-frame",events:{},init:function(L,K){if(J){Ext.callback(L,K,[this]);return }if(!Ext.isReady){Ext.onReady(function(){Ext.History.init(L,K)});return }C=Ext.getDom(Ext.History.fieldId);if(Ext.isIE){E=Ext.getDom(Ext.History.iframeId)}this.addEvents("ready","change");if(L){this.on("ready",L,K,{single:true})}I()},add:function(K,L){if(L!==false){if(this.getToken()==K){return true}}if(Ext.isIE){return H(K)}else{top.location.hash=K;return true}},back:function(){history.go(-1)},forward:function(){history.go(1)},getToken:function(){return J?D:F()}}})();Ext.apply(Ext.History,new Ext.util.Observable()); diff --git a/.svn/pristine/b9/b9a49270b107c2b99d53ced9b1294eb55a9e5206.svn-base b/.svn/pristine/b9/b9a49270b107c2b99d53ced9b1294eb55a9e5206.svn-base new file mode 100644 index 0000000..8d459a3 Binary files /dev/null and b/.svn/pristine/b9/b9a49270b107c2b99d53ced9b1294eb55a9e5206.svn-base differ diff --git a/.svn/pristine/ba/ba378b831eecd704c531a4e6f27289e15e25bd53.svn-base b/.svn/pristine/ba/ba378b831eecd704c531a4e6f27289e15e25bd53.svn-base new file mode 100644 index 0000000..00ba835 Binary files /dev/null and b/.svn/pristine/ba/ba378b831eecd704c531a4e6f27289e15e25bd53.svn-base differ diff --git a/.svn/pristine/ba/ba9a84e01a9e6e08c2ec534c0d0befcd07e4a7e5.svn-base b/.svn/pristine/ba/ba9a84e01a9e6e08c2ec534c0d0befcd07e4a7e5.svn-base new file mode 100644 index 0000000..63088f5 Binary files /dev/null and b/.svn/pristine/ba/ba9a84e01a9e6e08c2ec534c0d0befcd07e4a7e5.svn-base differ diff --git a/.svn/pristine/ba/bae60f6ba7016386f28be67e3e507bed7c7c91c4.svn-base b/.svn/pristine/ba/bae60f6ba7016386f28be67e3e507bed7c7c91c4.svn-base new file mode 100644 index 0000000..475d23d --- /dev/null +++ b/.svn/pristine/ba/bae60f6ba7016386f28be67e3e507bed7c7c91c4.svn-base @@ -0,0 +1,38 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.event; + +import org.comet4j.core.CometConnection; +import org.comet4j.core.CometEngine; +import org.comet4j.event.Event; + +/** + * 连接事件对象 + */ + +public class ConnectEvent extends Event { + + private CometConnection conn; + + public ConnectEvent(CometEngine target, CometConnection anConn) { + super(target); + conn = anConn; + } + + public CometConnection getConn() { + return conn; + } + + public void setConn(CometConnection conn) { + this.conn = conn; + } + + @Override + public void destroy() { + super.destroy(); + conn = null; + } +} diff --git a/.svn/pristine/bb/bb282c1bb718b592ebb3169d25c0008ca2962d4f.svn-base b/.svn/pristine/bb/bb282c1bb718b592ebb3169d25c0008ca2962d4f.svn-base new file mode 100644 index 0000000..fe7dd1c Binary files /dev/null and b/.svn/pristine/bb/bb282c1bb718b592ebb3169d25c0008ca2962d4f.svn-base differ diff --git a/.svn/pristine/bb/bb585ef9ae47c51328e7d9937a7c70d4389f53e3.svn-base b/.svn/pristine/bb/bb585ef9ae47c51328e7d9937a7c70d4389f53e3.svn-base new file mode 100644 index 0000000..53ea597 --- /dev/null +++ b/.svn/pristine/bb/bb585ef9ae47c51328e7d9937a7c70d4389f53e3.svn-base @@ -0,0 +1,206 @@ +body { + font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; + color: #000000; + background-color:#FFFFFF; + margin: 0px; + padding: 10px; +} +.body-wrap{ + width:95%; +} +.list {list-style:inside square;margin-bottom:10px;} +.list li{padding:2px;} +body, td, th { + font-size: 13px; +} +code { + font-family: "Lucida Console", "Courier New", Courier, monospace; + font-size: 12px; +} +pre { + font-family: "Lucida Console", "Courier New", Courier, monospace; + font-size: 12px; +} +th { + text-align: left; + font-weight: bold; + vertical-align: bottom; + color:black; + padding:3px; + font-weight:bold; + border:1px solid #cccccc; + border-collapse: collapse; +} +.top-tools{ + display:none; +} +table { + background-color: white; +} +a { + color: #083772; +} +a:link { + color: #083772; + text-decoration: none; +} + +a:visited { + color: #1e4e8f; + text-decoration: none; +} + +a:hover { + text-decoration: underline; + color: #0000CC; +} + +a:active { + text-decoration: none; + color: #1e4e8f; +} + +/* Headings */ +h1, h2, h3, h4, h5, h6 { + font-family: "Trebuchet MS", "Bitstream Vera Sans", verdana, lucida, arial, helvetica, sans-serif; + font-weight: bold; + margin-top: 3px; + margin-bottom: 3px; + letter-spacing: 1px; + width: 90%; +} + +h1 { + font-size: 18px; +} + +h2 { + font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; + font-weight: bold; + font-size: 18px; + padding-top: 20px; + padding-bottom: 5px; +} + +h3 { + font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; + font-weight: bold; + font-size: 16px; +} + +h4 { + font-size: 12px; + color: #666666; +} + +h5 { + font-size: 11px; +} + +.label { + font-weight: bold; + padding-right: 15px; +} +.description{ + margin: 10px 0px; +} +.member-table{ + width:100%; + margin-bottom:10px; +} +.member-table td{ + padding:2px; + vertical-align:top; + padding-right:15px; +} +body .alt{ + background:#f1f1f1; +} +.member-table td.micon{ + width:20px; + padding:0px; + border-left:1px solid #bbbbbb; +} +.member-table td.msource{ + border-right:1px solid #bbbbbb; + width:100px; +} +.mlink{ + font-weight:bold; +} +.member-table td.inherited{ + background-image: url(inherited.gif); + background-position:2px 2px; + background-repeat: no-repeat; +} +.member-table td.mdesc{ + padding-top:0px; +} +.member-table td.micon,.member-table td.mdesc,.member-table td.msource{ + border-bottom:1px solid #bbbbbb; +} +.optional{ + color:#555555; +} + +pre { + background: #F8F8F8; + border: 1px solid #e8e8e8; + border-left-width: 8px; + padding: 0.8em; + margin: 1em ; + margin-right: 0; +} +pre { + font-size: 12px !important; + line-height:14px !important; + padding:5px; + margin-left:0; +} +.detail-wrap{ + border:1px solid #bbbbbb; + border-bottom:0px none; +} +.mdetail-head{ + margin-top:10px; +} +.mdetail{ + padding:7px; + border-bottom:1px solid #bbbbbb; +} +.mdetail h3{ + margin: 5px 0px; + font-size:14px; + color:#083772; +} +.mdetail-desc{ + margin:8px; +} +.mdetail-def{ + font-style: italic; + font-size: 12px; + margin-top:10px; + margin-left:8px; + display:block; +} +.sub-desc{ + margin:5px; + margin-left:16px; +} +.mdetail-params{ + margin-top:10px; +} +.mdetail-params strong{ + font-weight:bold; + display: block; + margin-bottom:3px; +} +.mdetail-params ul{ + list-style: inside; + list-style-type: disc; + margin-left:12px; +} +.mdetail-params li{ + list-style: inside; + list-style-type: disc; +} \ No newline at end of file diff --git a/.svn/pristine/bd/bd5162fdfe9a385043088b1e895c3dd46e57d023.svn-base b/.svn/pristine/bd/bd5162fdfe9a385043088b1e895c3dd46e57d023.svn-base new file mode 100644 index 0000000..b220bbe Binary files /dev/null and b/.svn/pristine/bd/bd5162fdfe9a385043088b1e895c3dd46e57d023.svn-base differ diff --git a/.svn/pristine/bd/bdfa9fca8dc06c1a70f6481d37f0fd5e595f3571.svn-base b/.svn/pristine/bd/bdfa9fca8dc06c1a70f6481d37f0fd5e595f3571.svn-base new file mode 100644 index 0000000..82b4960 --- /dev/null +++ b/.svn/pristine/bd/bdfa9fca8dc06c1a70f6481d37f0fd5e595f3571.svn-base @@ -0,0 +1,124 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.event.demo.mac2; + +import java.util.HashMap; +import java.util.Map; + +import org.comet4j.core.util.JSONUtil; +import org.comet4j.event.Event; +import org.comet4j.event.Listener; +import org.comet4j.event.Observable; + +public class Test { + + public class SpeakEvent extends Event { + + public String words = ""; + + public SpeakEvent(Person target, String aWords) { + super(target); + words = aWords; + } + } + + public class GoEvent extends Event { + + public String where = ""; + + public GoEvent(Person target, String where) { + super(target); + this.where = where; + } + } + + @SuppressWarnings("rawtypes") + public abstract class PersonListener extends Listener { + + @Override + public boolean handleEvent(Event anEvent) { + if (anEvent instanceof SpeakEvent) { + return onSay((SpeakEvent) anEvent); + } + if (anEvent instanceof GoEvent) { + return onGo((GoEvent) anEvent); + } + return true; + } + + public abstract boolean onSay(SpeakEvent anEvent); + + public abstract boolean onGo(GoEvent anEvent); + + } + + public class PersonListener1 extends PersonListener { + + @Override + public boolean onSay(SpeakEvent anEvent) { + System.out.println("1:One person want to speak"); + return true; + } + + @Override + public boolean onGo(GoEvent anEvent) { + System.out.println("1:One person want to go"); + return true; + } + } + + @SuppressWarnings({ + "unchecked", "rawtypes" + }) + public class Person extends Observable { + + public Person() { + addEvent(SpeakEvent.class); + addEvent(GoEvent.class); + } + + public void say(String aWords) { + SpeakEvent e = new SpeakEvent(this, aWords); + if (!fireEvent(e)) { + return; + } + System.out.println("say:" + aWords); + } + + public void go(String where) { + GoEvent e = new GoEvent(this, where); + if (!fireEvent(e)) { + return; + } + System.out.println("go:" + where); + } + } + + /** + * @param args + */ + public static void main(String[] args) { + new Test().run(); + + } + + // 用法 + @SuppressWarnings({ + "unchecked", "rawtypes" + }) + public void run() { + Person person = new Person(); + PersonListener1 ls = new PersonListener1(); + person.addListener(SpeakEvent.class, ls); + person.addListener(GoEvent.class, ls); + Map m = new HashMap(); + m.put("a", "aaa"); + m.put("b", true); + System.out.println(JSONUtil.object2json(m)); + + } + +} diff --git a/.svn/pristine/be/be48f211783b11356497c915f55bae627a8ed5a0.svn-base b/.svn/pristine/be/be48f211783b11356497c915f55bae627a8ed5a0.svn-base new file mode 100644 index 0000000..a8ec87c --- /dev/null +++ b/.svn/pristine/be/be48f211783b11356497c915f55bae627a8ed5a0.svn-base @@ -0,0 +1,53 @@ + + + 4.0.0 + + Comet4j-DemoChat + org.comet4j + comet4j-chatdemo + 0.1.7 + + war + + + + src + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.6 + 1.6 + UTF-8 + + + + org.apache.maven.plugins + maven-war-plugin + + WebContent + + + + + + + + + + + + org.comet4j + comet4j + 0.1.7 + + + javax.servlet + servlet-api + 2.5 + provided + + + \ No newline at end of file diff --git a/.svn/pristine/bf/bf45a1e3b2c55d0a95edbdea1661ae3f14bb2910.svn-base b/.svn/pristine/bf/bf45a1e3b2c55d0a95edbdea1661ae3f14bb2910.svn-base new file mode 100644 index 0000000..fc8cb11 --- /dev/null +++ b/.svn/pristine/bf/bf45a1e3b2c55d0a95edbdea1661ae3f14bb2910.svn-base @@ -0,0 +1,55 @@ +v0.1.7 +改进了首次建立连接的响应速度 +v0.1.6 +修复Tomcat7下NIOEndPoint异常问题 +v0.1.5 +修复Tomcat6下NIOEndPoint异常问题 +修复BeforeConnectEvent返回false时没有及时关闭请求的问题 +v0.1.4 +修复连接回收线因外部事件处理异常而引发程重复删除问题。 +修复连接回收与消息缓存回收线程因异常而退出问题。 +DelayTask增加取消任务执行方法 +v0.1.3 +修复了多余线程残留的问题 +增加DelayTask工具 +修改连接与缓存清理线程的名字 +V0.1.2 +修复了JSON转换的bug + +V0.1.X +新增: +区分离开与掉线事件 +各种命名参考comet,如accept,quit等 +考虑在框架中增加对userId的支持 +对sevlet3.0的支持 +消息发送机制优化,建立发送队列 +使用并发包重写消息发送、过期检查等部分 +将通道从服务器端事件分开,不同Connector侦听不同通道 + + +增加XML配置能力 +web.xml去掉Listener的配置,转为一个sevlet的配置即可 +服务端auto工作模式下,客户端可指定具体的工作模式 +对Spring的整合支持:SpringRomoting,JMS等 +对Jetty的支持 + + +XMPP支持? +ActiveMQ的支持? +nodeJS的实现 +WebSocket支持? + +优化: +线程循环应使用一个控制标识来结束 +合并Tomcat6与Tomcat7的Jar包,OK +Engine增加kick方法与事件,实现服务器端使之下线功能,以区分drop事件。 +事件统一采用接口形式定义 +CometContext增加两个addListener方法 + +异常事件及异常类型的完善(ConetContext统一异常) +加入Maven管理 +分布式支持? + +Bug: +NIO异常 + diff --git a/.svn/pristine/bf/bfbdc06f81df30a0fdf2beb58fb5e24cee3a16f8.svn-base b/.svn/pristine/bf/bfbdc06f81df30a0fdf2beb58fb5e24cee3a16f8.svn-base new file mode 100644 index 0000000..9f6bd65 --- /dev/null +++ b/.svn/pristine/bf/bfbdc06f81df30a0fdf2beb58fb5e24cee3a16f8.svn-base @@ -0,0 +1,406 @@ + + +]> + + + + +
    + + + + +

    Class

    + + + + + + + + + + + + + + +
    Package: + + + Global + +
    Defined In:
    Class:
    Extends: + + + + + Object + +
    +
    + +

    This class is a singleton and cannot be created directly.
    +
    +
    + + + + +

    Config Options

    + + + + + + + + + inherited + + + expandable + + + + + + + + + + +
    Config OptionsDefined By
      + + : +
    + + +
    +
    +
    + +
    +
    +
    +
    + + + +

    Public Properties

    + + + + + + + + + + + inherited + + + expandable + + + + + + + + + + +
    PropertyDefined By
      + + : +
    + + +
    +
    +
    + +
    +
    +
    +
    +
    This class has no public properties.
    +
    + + + +

    Public Methods

    + + + + + + + + + + + + + + inherited + + + + + + + + + + +
    MethodDefined By
    +
    +
    This class has no public methods.
    +
    + + + +

    Public Events

    + + + + + + + + + + + inherited + + + + + + + + + + +
    EventDefined By
    +
    +
    This class has no public events.
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + +   + + + + +
    +
    +
    + + + +
    +
    + + + + + +
    + + + (  + + [ ] +   + + +  ) + + + + + + +
    + Parameters: +
      + +
    • None.
    • +
      + +
    • + : +
      +
    • +
    + Returns: +
      +
    • + + + +
      +
      + void +
      +
    • +
    +
    +
    + + + + <static>  + + + + +
    +
    +                
    +                    
    +                    
    +                        
    +                    
    +                    
    +                
    +                
    +            
    +
    +
    + + + + + +    + + + + + + + + + + Subclasses: + + + + , + + + + + + + + + + : + + + + + + + + + + + + + + + +
    :
    +
    +
    + +
    diff --git a/.svn/pristine/c0/c0381f6ae0afef110bbaadd51aa5a39200b8b3c7.svn-base b/.svn/pristine/c0/c0381f6ae0afef110bbaadd51aa5a39200b8b3c7.svn-base new file mode 100644 index 0000000..e9e0678 Binary files /dev/null and b/.svn/pristine/c0/c0381f6ae0afef110bbaadd51aa5a39200b8b3c7.svn-base differ diff --git a/.svn/pristine/c0/c0b8a69f763736957caf3132410bfe1461c4e953.svn-base b/.svn/pristine/c0/c0b8a69f763736957caf3132410bfe1461c4e953.svn-base new file mode 100644 index 0000000..69ab915 Binary files /dev/null and b/.svn/pristine/c0/c0b8a69f763736957caf3132410bfe1461c4e953.svn-base differ diff --git a/.svn/pristine/c0/c0c0102a864e3fc0c5d4af336f6b011f90f05957.svn-base b/.svn/pristine/c0/c0c0102a864e3fc0c5d4af336f6b011f90f05957.svn-base new file mode 100644 index 0000000..af59cf9 Binary files /dev/null and b/.svn/pristine/c0/c0c0102a864e3fc0c5d4af336f6b011f90f05957.svn-base differ diff --git a/.svn/pristine/c0/c0ca58c8df8eddd7a5372bfbd09f484cde78e4b8.svn-base b/.svn/pristine/c0/c0ca58c8df8eddd7a5372bfbd09f484cde78e4b8.svn-base new file mode 100644 index 0000000..14ce6f7 Binary files /dev/null and b/.svn/pristine/c0/c0ca58c8df8eddd7a5372bfbd09f484cde78e4b8.svn-base differ diff --git a/.svn/pristine/c1/c10fd56f2102a281c2f2f980ad4450d61f755ae4.svn-base b/.svn/pristine/c1/c10fd56f2102a281c2f2f980ad4450d61f755ae4.svn-base new file mode 100644 index 0000000..19bbef3 Binary files /dev/null and b/.svn/pristine/c1/c10fd56f2102a281c2f2f980ad4450d61f755ae4.svn-base differ diff --git a/.svn/pristine/c2/c22deab21eb247ecc1d0f6590ece6f3adb7f37cb.svn-base b/.svn/pristine/c2/c22deab21eb247ecc1d0f6590ece6f3adb7f37cb.svn-base new file mode 100644 index 0000000..45ff0ea --- /dev/null +++ b/.svn/pristine/c2/c22deab21eb247ecc1d0f6590ece6f3adb7f37cb.svn-base @@ -0,0 +1,72 @@ +package org.comet4j.core; + +import java.io.IOException; + +import javax.servlet.AsyncContext; +import javax.servlet.AsyncEvent; +import javax.servlet.AsyncListener; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@WebServlet(name = "comet4j-connector", urlPatterns = { + "/comet" +}, asyncSupported = true) +public class CometServlet3 extends HttpServlet { + + private static final long serialVersionUID = 5406891954492689797L; + + @Override + protected void service(HttpServletRequest request, HttpServletResponse response) { + if (request.isAsyncSupported() && !request.isAsyncStarted()) { + AsyncContext actx = request.getAsyncContext(); + actx.setTimeout(CometContext.getInstance().getTimeout()); + actx.addListener(new AsyncListener() { + + public void onStartAsync(AsyncEvent event) throws IOException { + HttpServletRequest request = (HttpServletRequest) event.getAsyncContext().getRequest(); + HttpServletResponse response = (HttpServletResponse) event.getAsyncContext().getResponse(); + String action = request.getParameter(CometProtocol.FLAG_ACTION); + + if (CometProtocol.CMD_CONNECT.equals(action)) { + + CometContext.getInstance().getEngine().connect(request, response); + } else if (CometProtocol.CMD_REVIVAL.equals(action)) { + + CometContext.getInstance().getEngine().revival(request, response); + + } else if (CometProtocol.CMD_DROP.equals(action)) { + CometContext.getInstance().getEngine().drop(request, response); + } + } + + public void onComplete(AsyncEvent event) throws IOException { + HttpServletRequest request = (HttpServletRequest) event.getAsyncContext().getRequest(); + HttpServletResponse response = (HttpServletResponse) event.getAsyncContext().getResponse(); + CometContext.getInstance().getEngine().dying(request, response); + } + + public void onTimeout(AsyncEvent event) throws IOException { + HttpServletRequest request = (HttpServletRequest) event.getAsyncContext().getRequest(); + HttpServletResponse response = (HttpServletResponse) event.getAsyncContext().getResponse(); + CometContext.getInstance().getEngine().dying(request, response); + } + + public void onError(AsyncEvent event) throws IOException { + HttpServletRequest request = (HttpServletRequest) event.getAsyncContext().getRequest(); + HttpServletResponse response = (HttpServletResponse) event.getAsyncContext().getResponse(); + CometContext.getInstance().getEngine().drop(request, response); + } + + }); + request.startAsync(request, response); + + } else { + System.out.println("Async not supported"); + request.startAsync(request, response); + + } + + } +} diff --git a/.svn/pristine/c2/c2a207073c021c155f4f5d057cca4fd2347fe967.svn-base b/.svn/pristine/c2/c2a207073c021c155f4f5d057cca4fd2347fe967.svn-base new file mode 100644 index 0000000..b52e0ce Binary files /dev/null and b/.svn/pristine/c2/c2a207073c021c155f4f5d057cca4fd2347fe967.svn-base differ diff --git a/.svn/pristine/c3/c309298def3edcb2646800710987557cb46e9833.svn-base b/.svn/pristine/c3/c309298def3edcb2646800710987557cb46e9833.svn-base new file mode 100644 index 0000000..043503a --- /dev/null +++ b/.svn/pristine/c3/c309298def3edcb2646800710987557cb46e9833.svn-base @@ -0,0 +1,60 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.demo.talker; + +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; + +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; + +import org.comet4j.core.CometConnection; +import org.comet4j.core.event.ConnectEvent; +import org.comet4j.core.listener.ConnectListener; +import org.comet4j.demo.talker.dto.JoinDTO; + +/** + * 上线侦听 + * @author jinghai.xiao@gmail.com + * @date 2011-3-3 + */ + +public class JoinListener extends ConnectListener { + + /* + * (non-Jsdoc) + * @see org.comet4j.event.Listener#handleEvent(org.comet4j.event.Event) + */ + @Override + public boolean handleEvent(ConnectEvent anEvent) { + CometConnection conn = anEvent.getConn(); + HttpServletRequest request = conn.getRequest(); + String userName = getCookieValue(request.getCookies(), "userName", ""); + try { + userName = URLDecoder.decode(userName, "utf-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + JoinDTO dto = new JoinDTO(conn.getId(), userName); + AppStore.getInstance().put(conn.getId(), userName); + anEvent.getTarget().sendToAll(Constant.APP_CHANNEL, dto); + return true; + } + + public String getCookieValue(Cookie[] cookies, String cookieName, String defaultValue) { + String result = defaultValue; + if (cookies != null) { + for (int i = 0; i < cookies.length; i++) { + Cookie cookie = cookies[i]; + if (cookieName.equals(cookie.getName())) { + return cookie.getValue(); + } + } + } + return result; + } + +} diff --git a/.svn/pristine/c3/c3db2fe94a1839716731e9c8d8e3e76d88b247f3.svn-base b/.svn/pristine/c3/c3db2fe94a1839716731e9c8d8e3e76d88b247f3.svn-base new file mode 100644 index 0000000..31fd980 --- /dev/null +++ b/.svn/pristine/c3/c3db2fe94a1839716731e9c8d8e3e76d88b247f3.svn-base @@ -0,0 +1,41 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ + +package org.comet4j.core.util; + +// ~--- JDK imports ------------------------------------------------------------ + +import java.lang.reflect.AccessibleObject; +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.Map; + +/** + * Bean反射工具 + */ + +public class BeanUtil { + + /** Creates a new instance of BeanUtil */ + private BeanUtil() { + } + + @SuppressWarnings("rawtypes") + public static Map getPropertiesByReflect(Object obj) throws Exception { + if (obj == null) return null; + Field[] fields = obj.getClass().getDeclaredFields(); + if (fields == null || fields.length == 0) return null; + Map map = new HashMap(); + AccessibleObject.setAccessible(fields, true); + for (Field field : fields) { + map.put(field.getName(), field.get(obj)); + + } + if (map.size() < 1) return null; + return map; + } + +} diff --git a/.svn/pristine/c4/c4ba8b3ee5e1e4fa30d5c512352d0800d6f0ced8.svn-base b/.svn/pristine/c4/c4ba8b3ee5e1e4fa30d5c512352d0800d6f0ced8.svn-base new file mode 100644 index 0000000..6c21952 --- /dev/null +++ b/.svn/pristine/c4/c4ba8b3ee5e1e4fa30d5c512352d0800d6f0ced8.svn-base @@ -0,0 +1,50 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.demo.talker; + +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; + +import org.comet4j.core.CometContext; +import org.comet4j.core.CometEngine; + +/** + * 应用初始化 + * @author jinghai.xiao@gmail.com + * @date 2011-2-25 + */ + +public class AppInit implements ServletContextListener { + + /** + * @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent) + */ + + @Override + public void contextInitialized(ServletContextEvent arg0) { + CometContext cc = CometContext.getInstance(); + CometEngine engine = cc.getEngine(); + cc.registChannel(Constant.APP_CHANNEL);// 注册通道 + // 绑定事件侦听 + engine.addConnectListener(new JoinListener()); + engine.addDropListener(new LeftListener()); + // 启动系统监控信息发送器 + Thread healthSender = new Thread(new HealthSender(), "HealthSender"); + healthSender.setDaemon(true); + healthSender.start(); + } + + /** + * @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet.ServletContextEvent) + */ + + @Override + public void contextDestroyed(ServletContextEvent arg0) { + // TODO 该方法尚未实现 + + } + +} diff --git a/.svn/pristine/c5/c5f8df249ab23ab1acbf9d1307355ebb62329e70.svn-base b/.svn/pristine/c5/c5f8df249ab23ab1acbf9d1307355ebb62329e70.svn-base new file mode 100644 index 0000000..5b13c5a Binary files /dev/null and b/.svn/pristine/c5/c5f8df249ab23ab1acbf9d1307355ebb62329e70.svn-base differ diff --git a/.svn/pristine/c7/c7308359c809ecf6f82e390b8f2a8556f0ca16c5.svn-base b/.svn/pristine/c7/c7308359c809ecf6f82e390b8f2a8556f0ca16c5.svn-base new file mode 100644 index 0000000..ae3dd92 --- /dev/null +++ b/.svn/pristine/c7/c7308359c809ecf6f82e390b8f2a8556f0ca16c5.svn-base @@ -0,0 +1,160 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; + +import org.comet4j.event.Observable; + +/** + * 负责对连接进行管理 增加、删除、获取等 + */ +@SuppressWarnings({ + "rawtypes" +}) +public class CometConnector extends Observable { + + private final long timespan; + private final long frequency; + boolean init = false; + private Thread cleanner; + + private List connections = Collections.synchronizedList(new ArrayList()); + + /** + * @param aTimespan + * @param aFrequency + */ + + public CometConnector(long aTimespan, long aFrequency) { + init = true; + frequency = aFrequency; + timespan = aTimespan; + cleanner = new Thread(new CacheCleaner(), "Comet4J-ConnectorCleaner"); + cleanner.setDaemon(true); + cleanner.start(); + } + + CometConnection getConnection(HttpServletRequest request) { + for (int i = 0; i < connections.size(); i++) { + CometConnection conn = connections.get(i); + if (conn.getRequest() == request) { + return conn; + } + } + return null; + } + + CometConnection getConnection(String id) { + for (int i = 0; i < connections.size(); i++) { + CometConnection conn = connections.get(i); + if (conn.getId().equals(id)) { + return conn; + } + } + return null; + } + + synchronized void addConnection(CometConnection connection) { + connections.add(connection); + } + + synchronized void removeConnection(CometConnection connection) { + connections.remove(connection); + } + + synchronized void removeConnection(String id) { + for (CometConnection c : connections) { + if (c.getId().equals(id)) { + connections.remove(c); + break; + } + } + } + + boolean contains(String anId) { + boolean result = false; + for (CometConnection c : connections) { + if (c.getId().equals(anId)) { + result = true; + break; + } + } + return result; + } + + boolean contains(CometConnection conn) { + return connections.contains(conn); + } + + List getConnections() { + return connections; + } + + // ----------定时清理过期连接--------------- + class CacheCleaner implements Runnable { + + private final List toDeleteList = new ArrayList(); + + public void run() { + while (init) { + try { + CometContext.getInstance().log("【CometDebug】开始清理连接"); + Thread.sleep(frequency); + checkExpires(); + CometContext.getInstance().log("【CometDebug】连接清理完毕"); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + } + + // 过期检查 + private void checkExpires() { + CometEngine engine = CometContext.getInstance().getEngine(); + CometContext.getInstance().log("【CometDebug】连接数量:" + connections.size()); + // synchronized (connections) { + if (!connections.isEmpty()) { + for (CometConnection c : connections) { + if (c == null) { + continue; + } + long expireMillis = c.getDyingTime() + timespan; + if (CometProtocol.STATE_DYING.equals(c.getState()) && expireMillis < System.currentTimeMillis()) { + toDeleteList.add(c); + } + } + } + + if (!toDeleteList.isEmpty()) { + CometContext.getInstance().log("【CometDebug】检测到过期闲置连接" + toDeleteList.size() + "个"); + for (CometConnection c : toDeleteList) { + try {// 外部事件处理可能会引发异常 + CometContext.getInstance().log("【CometDebug】移除闲置连接:" + c.getId()); + engine.remove(c); + } catch (Exception e) { + e.printStackTrace(); + } + } + toDeleteList.clear(); + } + // } + + } + } + + @Override + public void destroy() { + init = false; + cleanner = null; + connections.clear(); + connections = null; + } +} diff --git a/.svn/pristine/c7/c74324b324a276c45b68239b20e033405483db5b.svn-base b/.svn/pristine/c7/c74324b324a276c45b68239b20e033405483db5b.svn-base new file mode 100644 index 0000000..d097263 Binary files /dev/null and b/.svn/pristine/c7/c74324b324a276c45b68239b20e033405483db5b.svn-base differ diff --git a/.svn/pristine/c7/c7e52ccf18960b1d2d5498ec813793c4b46433ae.svn-base b/.svn/pristine/c7/c7e52ccf18960b1d2d5498ec813793c4b46433ae.svn-base new file mode 100644 index 0000000..f34d14c --- /dev/null +++ b/.svn/pristine/c7/c7e52ccf18960b1d2d5498ec813793c4b46433ae.svn-base @@ -0,0 +1,16 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.listener; + +import org.comet4j.core.event.MessageEvent; +import org.comet4j.event.Listener; + +/** + * 消息发送事件侦听抽象类 + */ +public abstract class MessageListener extends Listener { + +} diff --git a/.svn/pristine/c7/c7f1310574eeaac8b3d74df89dc5c69e2a2ca2d7.svn-base b/.svn/pristine/c7/c7f1310574eeaac8b3d74df89dc5c69e2a2ca2d7.svn-base new file mode 100644 index 0000000..cca91e8 Binary files /dev/null and b/.svn/pristine/c7/c7f1310574eeaac8b3d74df89dc5c69e2a2ca2d7.svn-base differ diff --git a/.svn/pristine/c8/c824f543b2e35e0687dd420e8ff71b0a105f11a0.svn-base b/.svn/pristine/c8/c824f543b2e35e0687dd420e8ff71b0a105f11a0.svn-base new file mode 100644 index 0000000..f0945cf Binary files /dev/null and b/.svn/pristine/c8/c824f543b2e35e0687dd420e8ff71b0a105f11a0.svn-base differ diff --git a/.svn/pristine/c8/c8a9d484f3f71ac3ba6644d29daf8bc6dda900da.svn-base b/.svn/pristine/c8/c8a9d484f3f71ac3ba6644d29daf8bc6dda900da.svn-base new file mode 100644 index 0000000..34f1333 Binary files /dev/null and b/.svn/pristine/c8/c8a9d484f3f71ac3ba6644d29daf8bc6dda900da.svn-base differ diff --git a/.svn/pristine/c9/c98b6f3b8fb7aad0914fb502bd7a900ce46cb4fb.svn-base b/.svn/pristine/c9/c98b6f3b8fb7aad0914fb502bd7a900ce46cb4fb.svn-base new file mode 100644 index 0000000..926010e Binary files /dev/null and b/.svn/pristine/c9/c98b6f3b8fb7aad0914fb502bd7a900ce46cb4fb.svn-base differ diff --git a/.svn/pristine/c9/c990d8958f8082d701b4250cec7b70aa74265a24.svn-base b/.svn/pristine/c9/c990d8958f8082d701b4250cec7b70aa74265a24.svn-base new file mode 100644 index 0000000..75e6da4 Binary files /dev/null and b/.svn/pristine/c9/c990d8958f8082d701b4250cec7b70aa74265a24.svn-base differ diff --git a/.svn/pristine/ca/ca4502333928e62174c89fd4121b578dbcec9756.svn-base b/.svn/pristine/ca/ca4502333928e62174c89fd4121b578dbcec9756.svn-base new file mode 100644 index 0000000..b5486c1 Binary files /dev/null and b/.svn/pristine/ca/ca4502333928e62174c89fd4121b578dbcec9756.svn-base differ diff --git a/.svn/pristine/cb/cb3c9c7a994e0635d428ca8dd992ffffda9d83f4.svn-base b/.svn/pristine/cb/cb3c9c7a994e0635d428ca8dd992ffffda9d83f4.svn-base new file mode 100644 index 0000000..c48a217 --- /dev/null +++ b/.svn/pristine/cb/cb3c9c7a994e0635d428ca8dd992ffffda9d83f4.svn-base @@ -0,0 +1,201 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.temp; + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.Date; +import java.util.Iterator; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.catalina.CometEvent; +import org.apache.catalina.CometProcessor; +import org.comet4j.core.util.ExplorerUtil; + +/** + * Servlet implementation class Messenger + */ +public class MixServlet extends HttpServlet implements CometProcessor { + + private static final long serialVersionUID = 1L; + // 表示<连接,是否可以长连接> + protected Map connections = new ConcurrentHashMap(0); + protected MessageSender messageSender = null; + protected Boolean debug = false; + + /** + * @see HttpServlet#HttpServlet() + */ + public MixServlet() { + super(); + } + + /* + * (non-Javadoc) + * @see javax.servlet.GenericServlet#init(javax.servlet.ServletConfig) + */ + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + /* + * if("true".equals(config.getInitParameter("debug").toLowerCase())){ + * this.debug =true; } + */ + + messageSender = new MessageSender(); + Thread messageSenderThread = new Thread(messageSender, "MessageSender[" + getServletContext().getContextPath() + + "]"); + messageSenderThread.setDaemon(true); + messageSenderThread.start(); + + Thread timeSenderThread = new Thread(new TimeSender()); + timeSenderThread.setDaemon(true); + // timeSenderThread.start(); + + } + + /* + * (non-Javadoc) + * @see javax.servlet.GenericServlet#destroy() + */ + @Override + public void destroy() { + connections.clear(); + messageSender.stop(); + messageSender = null; + debug = null; + } + + /* + * (non-Javadoc) + * @see + * org.apache.catalina.CometProcessor#event(org.apache.catalina.CometEvent) + */ + public void event(CometEvent event) throws IOException, ServletException { + HttpServletRequest request = event.getHttpServletRequest(); + HttpServletResponse response = event.getHttpServletResponse(); + + if (event.getEventType() == CometEvent.EventType.BEGIN) { + log("-->begin:canStreaming:" + ExplorerUtil.canStreamingXHR(request)); + connections.put(response, ExplorerUtil.canStreamingXHR(request)); + event.setTimeout(6000); + } else if (event.getEventType() == CometEvent.EventType.ERROR) { + + connections.remove(response); + if (event.getEventSubType() == CometEvent.EventSubType.TIMEOUT) { + log("-->timeout"); + response.setStatus(408); + } + response.getWriter().close(); + // event.close(); + + } else if (event.getEventType() == CometEvent.EventType.END) { + log("-->end"); + connections.remove(response); + response.getWriter().close(); + event.close(); + + } else if (event.getEventType() == CometEvent.EventType.READ) { + log("-->read"); + } + + } + + class TimeSender implements Runnable { + + @SuppressWarnings("deprecation") + public void run() { + while (true) { + messageSender.send("System", new Date().toLocaleString()); + log("send" + new Date().toLocaleString()); + try { + Thread.sleep(5000); + } catch (InterruptedException ignore) { + } + } + } + } + + public class MessageSender implements Runnable { + + protected boolean running = true; + protected ArrayList messages = new ArrayList(); + + public MessageSender() { + } + + public void stop() { + running = false; + } + + public void send(String user, String message) { + synchronized (messages) { + messages.add("[" + user + "]: " + message); + messages.notify(); + } + } + + @SuppressWarnings({ + "rawtypes" + }) + public void run() { + + while (running) { + + if (messages.size() == 0) { + try { + synchronized (messages) { + messages.wait(); + } + } catch (InterruptedException e) { + // Ignore + } + } + + String[] pendingMessages = null; + synchronized (messages) { + pendingMessages = messages.toArray(new String[0]); + messages.clear(); + } + // Send any pending message on all the open connections + Iterator it = connections.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry entry = (Map.Entry) it.next(); + HttpServletResponse connection = (HttpServletResponse) entry.getKey(); + Boolean isStreaming = (Boolean) entry.getValue(); + log("isStreaming:" + isStreaming.toString()); + PrintWriter writer; + try { + writer = connection.getWriter(); + for (int j = 0; j < pendingMessages.length; j++) { + writer.println(pendingMessages[j] + "
    "); + } + writer.flush(); + if (!isStreaming) { + writer.close(); + } + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + + } + + } + + } + +} diff --git a/.svn/pristine/cc/cc59e44f48eada4150b5c657c928dde8eb624350.svn-base b/.svn/pristine/cc/cc59e44f48eada4150b5c657c928dde8eb624350.svn-base new file mode 100644 index 0000000..8aacb30 Binary files /dev/null and b/.svn/pristine/cc/cc59e44f48eada4150b5c657c928dde8eb624350.svn-base differ diff --git a/.svn/pristine/cc/cc64b887fa75a49676ae5421adb056e3a50c3f75.svn-base b/.svn/pristine/cc/cc64b887fa75a49676ae5421adb056e3a50c3f75.svn-base new file mode 100644 index 0000000..fb52c0f --- /dev/null +++ b/.svn/pristine/cc/cc64b887fa75a49676ae5421adb056e3a50c3f75.svn-base @@ -0,0 +1,181 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.temp; + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.Date; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.catalina.CometEvent; +import org.apache.catalina.CometProcessor; + +/** + * + */ +public class LongPoolingServlet extends HttpServlet implements CometProcessor { + + private static final long serialVersionUID = 1L; + protected ArrayList connections = new ArrayList(); + protected MessageSender messageSender = null; + protected Boolean debug = false; + // 经测试,如不设置,则超时时间为20秒,定义在server.xml中 + private static final Integer TIMEOUT = 10 * 1000; + + /** + * @see HttpServlet#HttpServlet() + */ + public LongPoolingServlet() { + super(); + } + + /* + * (non-Javadoc) + * @see javax.servlet.GenericServlet#init(javax.servlet.ServletConfig) + */ + @Override + public void init() throws ServletException { + + messageSender = new MessageSender(); + Thread messageSenderThread = new Thread(messageSender, "MessageSender[" + getServletContext().getContextPath() + + "]"); + messageSenderThread.setDaemon(true); + messageSenderThread.start(); + + Thread timeSenderThread = new Thread(new TimeSender()); + timeSenderThread.setDaemon(true); + timeSenderThread.start(); + + } + + /* + * (non-Javadoc) + * @see javax.servlet.GenericServlet#destroy() + */ + @Override + public void destroy() { + connections.clear(); + messageSender.stop(); + messageSender = null; + debug = null; + } + + /* + * (non-Javadoc) + * @see + * org.apache.catalina.CometProcessor#event(org.apache.catalina.CometEvent) + */ + public void event(CometEvent event) throws IOException, ServletException { + HttpServletRequest request = event.getHttpServletRequest(); + HttpServletResponse response = event.getHttpServletResponse(); + + if (event.getEventType() == CometEvent.EventType.BEGIN) { + log("-->begin"); + request.setAttribute("org.apache.tomcat.comet.timeout", TIMEOUT); + synchronized (connections) { + connections.add(response); + } + } else if (event.getEventType() == CometEvent.EventType.ERROR) { + log("-->error"); + synchronized (connections) { + connections.remove(response); + } + response.getWriter().close(); + event.close(); + + } else if (event.getEventType() == CometEvent.EventType.END) { + log("-->end"); + synchronized (connections) { + connections.remove(response); + } + response.getWriter().close(); + event.close(); + } else if (event.getEventType() == CometEvent.EventType.READ) { + log("-->read"); + } + + } + + class TimeSender implements Runnable { + + @SuppressWarnings("deprecation") + public void run() { + while (true) { + messageSender.send("System", new Date().toLocaleString()); + log("send" + new Date().toLocaleString()); + try { + Thread.sleep(5000); + } catch (InterruptedException ignore) { + } + } + } + } + + public class MessageSender implements Runnable { + + protected boolean running = true; + protected ArrayList messages = new ArrayList(); + + public MessageSender() { + } + + public void stop() { + running = false; + } + + public void send(String user, String message) { + synchronized (messages) { + messages.add("[" + user + "]: " + message); + messages.notify(); + } + } + + public void run() { + + while (running) { + if (messages.size() == 0) { + try { + synchronized (messages) { + messages.wait(); + } + } catch (InterruptedException e) { + // Ignore + } + } + + synchronized (connections) { + String[] pendingMessages = null; + synchronized (messages) { + pendingMessages = messages.toArray(new String[0]); + messages.clear(); + } + // Send any pending message on all the open connections + for (int i = 0; i < connections.size(); i++) { + try { + PrintWriter writer = connections.get(i).getWriter(); + for (int j = 0; j < pendingMessages.length; j++) { + writer.println(pendingMessages[j] + "
    "); + } + writer.flush(); + writer.close(); + } catch (IOException e) { + log("IOExeption sending message", e); + } + } + } + + } + + } + + } + +} diff --git a/.svn/pristine/cc/ccf202fdeb74fbc829b4309198b473c5f94e437d.svn-base b/.svn/pristine/cc/ccf202fdeb74fbc829b4309198b473c5f94e437d.svn-base new file mode 100644 index 0000000..4f217a4 Binary files /dev/null and b/.svn/pristine/cc/ccf202fdeb74fbc829b4309198b473c5f94e437d.svn-base differ diff --git a/.svn/pristine/cd/cd64fb839d0dcd95f2363da4a689d3052f8c351c.svn-base b/.svn/pristine/cd/cd64fb839d0dcd95f2363da4a689d3052f8c351c.svn-base new file mode 100644 index 0000000..7e9ad4b --- /dev/null +++ b/.svn/pristine/cd/cd64fb839d0dcd95f2363da4a689d3052f8c351c.svn-base @@ -0,0 +1,130 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core; + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.List; + +import javax.servlet.http.HttpServletResponse; + +/** + * 消息发送器 负责消息的发送,主要由引擎类负责调用。 + */ + +public class CometSender { + + private ExpiresCache cacher; + + public CometSender(long timespan, long frequency) { + cacher = new ExpiresCache(timespan, frequency); + } + + /** + * 为一个连接发送一条消息 + * @param c + * @param e + */ + synchronized void sendTo(CometConnection c, CometMessage msg) { + if (c == null) { + return; + } + if (CometProtocol.STATE_DYING.equals(c.getState()) || c.getResponse() == null) { + cacher.push(c, msg); + return; + } + try { + writeData(c, msg); + } catch (IOException e1) { + e1.printStackTrace(); + } + } + + /** + * 为一个连接发送多条消息 + * @param c + * @param list + */ + void sendTo(CometConnection c, List list) { + if (c == null || list.isEmpty()) { + return; + } + for (CometMessage msg : list) { + sendTo(c, msg); + } + } + + /** + * 为多个连接发送一条消息 + * @param list + * @param e + */ + void sendTo(List list, CometMessage msg) { + if (list == null || list.isEmpty()) { + return; + } + for (CometConnection c : list) { + sendTo(c, msg); + } + } + + private void writeData(CometConnection c, CometMessage msg) throws IOException { + c.setDyingTime(System.currentTimeMillis()); + PrintWriter writer; + HttpServletResponse response = c.getResponse(); + response.setCharacterEncoding("UTF-8"); + response.setContentType("text/html;charset=UTF-8"); + response.setHeader("Pragma", "No-cache"); + response.setHeader("Cache-Control", "no-cache"); + response.setDateHeader("Expires", 0); + writer = response.getWriter(); + writer.print(CometProtocol.encode(msg)); + close(c); + + } + + private void close(CometConnection c) throws IOException { + if (c.getResponse() != null) { + if (c.getWorkStyle().equals(CometProtocol.WORKSTYLE_LLOOP)) { + c.setState(CometProtocol.STATE_DYING); + try { + c.getResponse().getWriter().close(); + } catch (Exception e) { + } + c.setResponse(null); + } else { + try { + c.getResponse().flushBuffer(); + } catch (Exception e) { + } + } + } + + } + + List getCacheMessage(CometConnection conn) { + return cacher.get(conn); + } + + /** + * 发送连接的缓存数据 + * @param conn + */ + + void sendCacheMessage(CometConnection conn) { + List list = this.getCacheMessage(conn); + if (list != null && !list.isEmpty()) { + for (CometMessage msg : list) { + sendTo(conn, msg); + } + } + } + + public void destroy() { + cacher.init = false; + cacher = null; + } +} diff --git a/.svn/pristine/cd/cda9d3b74238adb9f1412946297e90eb0b2484f6.svn-base b/.svn/pristine/cd/cda9d3b74238adb9f1412946297e90eb0b2484f6.svn-base new file mode 100644 index 0000000..a937cb2 Binary files /dev/null and b/.svn/pristine/cd/cda9d3b74238adb9f1412946297e90eb0b2484f6.svn-base differ diff --git a/.svn/pristine/cd/cdc3f78482466c143a5d3f8df21170989a7d8f28.svn-base b/.svn/pristine/cd/cdc3f78482466c143a5d3f8df21170989a7d8f28.svn-base new file mode 100644 index 0000000..abe3cf0 Binary files /dev/null and b/.svn/pristine/cd/cdc3f78482466c143a5d3f8df21170989a7d8f28.svn-base differ diff --git a/.svn/pristine/ce/ce9c66f9c893e72a78964a35be107602c31022d0.svn-base b/.svn/pristine/ce/ce9c66f9c893e72a78964a35be107602c31022d0.svn-base new file mode 100644 index 0000000..b8f4208 Binary files /dev/null and b/.svn/pristine/ce/ce9c66f9c893e72a78964a35be107602c31022d0.svn-base differ diff --git a/.svn/pristine/ce/cef134883f6d94456a80d2d89d6d8cdc32bc998d.svn-base b/.svn/pristine/ce/cef134883f6d94456a80d2d89d6d8cdc32bc998d.svn-base new file mode 100644 index 0000000..3ad0566 --- /dev/null +++ b/.svn/pristine/ce/cef134883f6d94456a80d2d89d6d8cdc32bc998d.svn-base @@ -0,0 +1 @@ +用于显示每一个请求,帮助排查问题。 \ No newline at end of file diff --git a/.svn/pristine/d0/d0efcd680f18b93cf89f0520a70ed17a9022d35d.svn-base b/.svn/pristine/d0/d0efcd680f18b93cf89f0520a70ed17a9022d35d.svn-base new file mode 100644 index 0000000..b288e38 Binary files /dev/null and b/.svn/pristine/d0/d0efcd680f18b93cf89f0520a70ed17a9022d35d.svn-base differ diff --git a/.svn/pristine/d1/d17b159ee875e3945e993bb61f70427c31700d7a.svn-base b/.svn/pristine/d1/d17b159ee875e3945e993bb61f70427c31700d7a.svn-base new file mode 100644 index 0000000..26fbbae Binary files /dev/null and b/.svn/pristine/d1/d17b159ee875e3945e993bb61f70427c31700d7a.svn-base differ diff --git a/.svn/pristine/d2/d2006d3885c5a2018b24bef8db4c433d082f50fb.svn-base b/.svn/pristine/d2/d2006d3885c5a2018b24bef8db4c433d082f50fb.svn-base new file mode 100644 index 0000000..4c5e7e3 Binary files /dev/null and b/.svn/pristine/d2/d2006d3885c5a2018b24bef8db4c433d082f50fb.svn-base differ diff --git a/.svn/pristine/d2/d20fc88c6c03433b5e4c31c0a582e710a06fe92c.svn-base b/.svn/pristine/d2/d20fc88c6c03433b5e4c31c0a582e710a06fe92c.svn-base new file mode 100644 index 0000000..effe7c9 Binary files /dev/null and b/.svn/pristine/d2/d20fc88c6c03433b5e4c31c0a582e710a06fe92c.svn-base differ diff --git a/.svn/pristine/d2/d26826a96feb44e56e088db7c8c6a6258b2c2945.svn-base b/.svn/pristine/d2/d26826a96feb44e56e088db7c8c6a6258b2c2945.svn-base new file mode 100644 index 0000000..d2b2302 Binary files /dev/null and b/.svn/pristine/d2/d26826a96feb44e56e088db7c8c6a6258b2c2945.svn-base differ diff --git a/.svn/pristine/d4/d4da49506d142e190c6a2dda388e62838926d781.svn-base b/.svn/pristine/d4/d4da49506d142e190c6a2dda388e62838926d781.svn-base new file mode 100644 index 0000000..43b32e3 --- /dev/null +++ b/.svn/pristine/d4/d4da49506d142e190c6a2dda388e62838926d781.svn-base @@ -0,0 +1,10 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.interfaces; + +public interface JSONSerializable { + +} diff --git a/.svn/pristine/d6/d600bf8a94c8ed9e3dcf73913b674bb47b90ff6d.svn-base b/.svn/pristine/d6/d600bf8a94c8ed9e3dcf73913b674bb47b90ff6d.svn-base new file mode 100644 index 0000000..9ce214b Binary files /dev/null and b/.svn/pristine/d6/d600bf8a94c8ed9e3dcf73913b674bb47b90ff6d.svn-base differ diff --git a/.svn/pristine/d6/d61c73bf1ecfd5dbfa409d89c785b5278755c5d8.svn-base b/.svn/pristine/d6/d61c73bf1ecfd5dbfa409d89c785b5278755c5d8.svn-base new file mode 100644 index 0000000..b47bc98 Binary files /dev/null and b/.svn/pristine/d6/d61c73bf1ecfd5dbfa409d89c785b5278755c5d8.svn-base differ diff --git a/.svn/pristine/d6/d637235a924457efe18d40c7b17231d4baa2e2e6.svn-base b/.svn/pristine/d6/d637235a924457efe18d40c7b17231d4baa2e2e6.svn-base new file mode 100644 index 0000000..43823e5 Binary files /dev/null and b/.svn/pristine/d6/d637235a924457efe18d40c7b17231d4baa2e2e6.svn-base differ diff --git a/.svn/pristine/d8/d82a1fc5951958fab19461a512cf3c4d926e91bd.svn-base b/.svn/pristine/d8/d82a1fc5951958fab19461a512cf3c4d926e91bd.svn-base new file mode 100644 index 0000000..91036ab --- /dev/null +++ b/.svn/pristine/d8/d82a1fc5951958fab19461a512cf3c4d926e91bd.svn-base @@ -0,0 +1,16 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.temp; + +/** + * @author jinghai.xiao@gmail.com + * @date 2011-3-24 + */ + +public interface IMonitorService { + + public MonitorInfoBean getMonitorInfoBean() throws Exception; +} diff --git a/.svn/pristine/d9/d9067923247942d58c93dbae33dcda4a0c814159.svn-base b/.svn/pristine/d9/d9067923247942d58c93dbae33dcda4a0c814159.svn-base new file mode 100644 index 0000000..806d4bc Binary files /dev/null and b/.svn/pristine/d9/d9067923247942d58c93dbae33dcda4a0c814159.svn-base differ diff --git a/.svn/pristine/d9/d99660438a8584bb199125efb7757a324d8ef0bf.svn-base b/.svn/pristine/d9/d99660438a8584bb199125efb7757a324d8ef0bf.svn-base new file mode 100644 index 0000000..3599698 Binary files /dev/null and b/.svn/pristine/d9/d99660438a8584bb199125efb7757a324d8ef0bf.svn-base differ diff --git a/.svn/pristine/d9/d9ceb7bce3fc8aa4ccabe95a016c0042a07f607c.svn-base b/.svn/pristine/d9/d9ceb7bce3fc8aa4ccabe95a016c0042a07f607c.svn-base new file mode 100644 index 0000000..41a66c2 Binary files /dev/null and b/.svn/pristine/d9/d9ceb7bce3fc8aa4ccabe95a016c0042a07f607c.svn-base differ diff --git a/.svn/pristine/d9/d9d79780e75bb77ae5d8a2600ee86fe8207fa7b0.svn-base b/.svn/pristine/d9/d9d79780e75bb77ae5d8a2600ee86fe8207fa7b0.svn-base new file mode 100644 index 0000000..b8a48cc Binary files /dev/null and b/.svn/pristine/d9/d9d79780e75bb77ae5d8a2600ee86fe8207fa7b0.svn-base differ diff --git a/.svn/pristine/da/daf25f41c84b32bc36cf111305b1b4eb58ec614b.svn-base b/.svn/pristine/da/daf25f41c84b32bc36cf111305b1b4eb58ec614b.svn-base new file mode 100644 index 0000000..4547639 --- /dev/null +++ b/.svn/pristine/da/daf25f41c84b32bc36cf111305b1b4eb58ec614b.svn-base @@ -0,0 +1,23 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.temp; + +/** + * @author jinghai.xiao@gmail.com + * @date 2011-3-24 + */ + +public class Bytes { + + public static String substring(String src, int start_idx, int end_idx) { + byte[] b = src.getBytes(); + String tgt = ""; + for (int i = start_idx; i <= end_idx; i++) { + tgt += (char) b[i]; + } + return tgt; + } +} diff --git a/.svn/pristine/db/db4d02b2fac8bc3baa82432c0106be2e40e27419.svn-base b/.svn/pristine/db/db4d02b2fac8bc3baa82432c0106be2e40e27419.svn-base new file mode 100644 index 0000000..cc1e473 Binary files /dev/null and b/.svn/pristine/db/db4d02b2fac8bc3baa82432c0106be2e40e27419.svn-base differ diff --git a/.svn/pristine/dc/dc19e1f13fb8498bca8da56fdbfe54d95408cdb4.svn-base b/.svn/pristine/dc/dc19e1f13fb8498bca8da56fdbfe54d95408cdb4.svn-base new file mode 100644 index 0000000..0e44af3 --- /dev/null +++ b/.svn/pristine/dc/dc19e1f13fb8498bca8da56fdbfe54d95408cdb4.svn-base @@ -0,0 +1,48 @@ +
    +
    + +
    +
    +
    +
    +

    Additional Resources

    +
      +
    +
    +
    +
    +
    +

    Support

    +
      + +
    +
    +
    +
    +
    +

    Icon Legend

    +
      +
    • Package
    • +
    • Class
    • +
    • Singleton
    • +
    • Component
    • +
    • Method
    • +
    • Property
    • +
    • Config Option
    • +
    • Event
    • +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/.svn/pristine/dc/dc26077b2de9f914a6dcd2fc35872044eecae291.svn-base b/.svn/pristine/dc/dc26077b2de9f914a6dcd2fc35872044eecae291.svn-base new file mode 100644 index 0000000..e969fb0 Binary files /dev/null and b/.svn/pristine/dc/dc26077b2de9f914a6dcd2fc35872044eecae291.svn-base differ diff --git a/.svn/pristine/dc/dcf0825907c5522f13b33df4eca3bf24693f9cb9.svn-base b/.svn/pristine/dc/dcf0825907c5522f13b33df4eca3bf24693f9cb9.svn-base new file mode 100644 index 0000000..2003e37 --- /dev/null +++ b/.svn/pristine/dc/dcf0825907c5522f13b33df4eca3bf24693f9cb9.svn-base @@ -0,0 +1,406 @@ +/** + * @class JS.Connector + * @extends JS.Observable + * 连接器,负责建立并维持连接,接收服务器端推送的数据。 + * @author jinghai.xiao@gmail.com + */ +JS.ns("JS.Connector"); +JS.Connector = JS.extend(JS.Observable,{ + /** + * 版本 + * @property + * @type String + */ + version : JS.version, + SYSCHANNEL:'c4j', //协议常量 + /** + * 长轮询工作模式常量 + * @property + * @type String + */ + LLOOPSTYLE : 'lpool',//协议常量 + /** + * 长连接工作模式常量 + * @property + * @type String + */ + STREAMSTYLE : 'stream',//协议常量 + CMDTAG : 'cmd', + /** + * @cfg {String} retryCount + * 重试次数,连续重试指定次数仍无法正常工作则stop. + */ + retryCount : 3, + /** + * @cfg {String} retryCount + * 重试延迟,重试时间隔指定时间执行 + */ + retryDelay : 1000, + currRetry : 0, + /** + * @cfg {String} url + * 连接地址,若使用start方法中带有url,则此配置项将被覆盖。 + */ + url : '', + /** + * @cfg {Object} param + * 连接参数,若使用start方法中带有param,则此配置项将被覆盖。 + */ + param : '', + /** + * @cfg {Object} revivalDelay + * 复活请求延时毫秒数,默认为100 + */ + revivalDelay : 100, + /** + * 连接ID,连接后有效 + * @property + * @type String + */ + cId : '', + /** + * 通道列表,连接后有效 + * @property + * @type Array + */ + channels : [], + /** + * 连接工作模式,连接后有效。值为:LLOOPSTYLE或STREAMSTYLE + * @property + * @type String + */ + workStyle : '', + emptyUrlError : 'URL为空', + runningError : '连接正在运行', + dataFormatError : '数据格式有误', + /** + * 连接器是否处于运行状态 + * @property + * @type String + */ + running : false, + _xhr : null, + lastReceiveMessage : '', + constructor:function(){ + JS.Connector.superclass.constructor.apply(this,arguments); + this.addEvents([ + /** + * @event beforeConnect 即将连接 + * @param {String} url 连接地址 + * @param {Connector} conn 连接器 + */ + 'beforeConnect', + /** + * @event connect 已连接 + * @param {String} cId 连接ID + * @param {Array} channels 通道列表 + * @param {String} workStyle 工作模式 + * @param {Number} timeout 连接超时时间 + * @param {Connector} conn 连接器 + */ + 'connect', + /** + * @event beforeStop 即将停止 + * @param {String} cause 停止原因 + * @param {String} cId 连接ID + * @param {String} url 连接地址 + * @param {Connector} conn 连接器 + */ + 'beforeStop', + /** + * @event stop 已停止 + * @param {String} cause 停止原因 + * @param {String} cId 连接ID + * @param {String} url 连接地址 + * @param {Connector} conn 连接器 + */ + 'stop', + /** + * @event message 接收到推送数据 + * @param {String} channel 通道标识 + * @param {Object} data 数据对象 + * @param {Number} time 发送时间,距1970-01-01 00:00:00毫秒数 + * @param {Connector} conn 连接器 + */ + 'message', + /** + * @event revival 请求复活,用于保持连接。 + * @param {String} url 连接地址 + * @param {String} cId 连接ID + * @param {Connector} conn 连接器 + */ + 'revival' + ]); + if(JS.isIE7){ + this._xhr = new JS.XMLHttpRequest({ + specialXHR : 'Msxml2.XMLHTTP.6.0' + }); + }else{ + this._xhr = new JS.XMLHttpRequest(); + } + //this._xhr.addListener('readyStateChange',this.onReadyStateChange,this); + + this._xhr.addListener('progress',this.doOnProgress,this); + this._xhr.addListener('load',this.doOnLoad,this); + this._xhr.addListener('error',this.doOnError,this); + this._xhr.addListener('timeout',this.doOnTimeout,this); + + this.addListener('beforeStop',this.doDrop,this); + JS.on(window,'beforeunload',this.doDrop,this); + + }, + //private + doDrop : function(url,cId,conn,xhr){ + if(!this.running || !this.cId){ + return; + } + try { + var xhr = new JS.XMLHttpRequest(); + var param = this.perfectParam(this.param); + var url = this.url + '?'+this.CMDTAG+'=drop&cid=' + this.cId + param; + xhr.open('GET', url, true); + xhr.send(null); + xhr = null; + }catch(e){}; + }, + //private distributed 派发服务器消息 + dispatchServerEvent : function(msg){ + this.fireEvent('message', msg.channel, msg.data, msg.time, this); + }, + //private 长连接信息转换 + translateStreamData : function(responseText){ + var str = responseText; + if(this.lastReceiveMessage && str){//剥离出接收到的数据 + str = str.split(this.lastReceiveMessage); + str = str.length ? str[str.length-1] : ""; + } + this.lastReceiveMessage = responseText; + return str; + }, + //private 消息解码 + decodeMessage : function(msg){ + var json = null; + if(JS.isString(msg) && msg!=""){ + //解析数据格式 + if(msg.charAt(0)=="<" ){ + msg = msg.substring(1,msg.length); + } + if(msg.charAt(msg.length-1)==">"){ + msg = msg.substring(0,msg.length-1); + } + msg = decodeURIComponent(msg); + try{ + json = eval("("+msg+")"); + }catch(e){ + this.stop('JSON转换异常'); + } + } + return json; + }, + //private + doOnProgress : function(xhr){ + if(this.workStyle === this.STREAMSTYLE){ + var str = this.translateStreamData(xhr.responseText); + var msglist = str.split(">"); + if(msglist.length > 0){ + for(var i=0, len=msglist.length; i this.retryCount){ + this.stop('服务器异常'); + }else{ + this.retryRevivalConnect(); + } + } + } + } + } + }, + //private + doOnLoad : function(xhr){ + if(this.workStyle === this.LLOOPSTYLE){ + var json = this.decodeMessage(xhr.responseText); + if(json){ + this.currRetry = 0; + this.dispatchServerEvent(json); + this.revivalConnect(); + }else{//非正常情况,状态为4,200并且还没有收到任何数据 + this.currRetry++; + if(this.currRetry > this.retryCount){ + this.stop('服务器异常'); + }else{ + this.retryRevivalConnect(); + } + } + } + }, + //private + doOnError : function(xhr){ + this.currRetry++; + if(this.currRetry > this.retryCount){ + this.stop('服务器异常'); + }else{ + this.retryRevivalConnect(); + } + + }, + //private + doOnTimeout : function(xhr){ + this.currRetry++; + if(this.currRetry > this.retryCount){ + this.stop('请求超时'); + }else{ + this.retryRevivalConnect(); + } + }, + //private + startConnect : function(url){ + if(this.running){ + var connXhr = new JS.XMLHttpRequest(); + connXhr.addListener('error',function(xhr){ + this.stop("连接时发生错误"); + },this); + connXhr.addListener('timeout',function(xhr){ + this.stop("连接超时"); + },this); + connXhr.addListener('load',function(xhr){ + var msg = this.decodeMessage(xhr.responseText); + if(!msg){ + this.stop('连接失败'); + return; + } + var data = msg.data; + this.cId = data.cId; + this.channels = data.channels; + this.workStyle = data.ws; + this._xhr.setTimeout(data.timeout + 1000/*网络延迟误差*/); + this.fireEvent('connect', data.cId, data.channels, data.ws, data.timeout, this); + this.revivalConnect(); + },this); + connXhr.open('GET', url, true); + connXhr.send(null); + /* + JS.AJAX.get(url,'',function(xhr){ + var msg = this.decodeMessage(xhr.responseText); + if(!msg){ + this.stop('连接失败'); + return; + } + var data = msg.data; + this.cId = data.cId; + this.channels = data.channels; + this.workStyle = data.ws; + this._xhr.setTimeout(data.timeout + 1000); + this.fireEvent('connect', data.cId, data.channels, data.ws, data.timeout, this); + this.revivalConnect(); + },this);*/ + } + }, + + //private 重试复活连接 + retryRevivalConnect : function(){ + var self = this; + if(this.running){ + setTimeout(function(){ + self.revivalConnect(); + },this.retryDelay); + } + }, + + //private + revivalConnect : function(){ + var self = this; + if(this.running){ + setTimeout(revival,this.revivalDelay); + } + function revival(){ + var xhr = self._xhr; + var param = self.perfectParam(self.param); + var url = self.url + '?'+self.CMDTAG+'=revival&cid=' + self.cId + param; + xhr.open('GET', url, true); + xhr.send(null); + self.fireEvent('revival',self.url, self.cId, self); + } + + }, + /** + * 开始连接 + * @method + * @param {String} url 连接地址 + * @param {String|DOM} param 连接参数 + */ + start : function(url,param){ + if(this.running){ + return; + } + + this.url = url || this.url; + if(!this.url){ + throw new Error(this.emptyUrlError); + } + + if(this.fireEvent('beforeConnect', this.url, this) === false){ + return; + } + + this.param = param || this.param; + param = this.perfectParam(this.param); + var url = this.url+'?'+this.CMDTAG+'=conn&cv='+this.version+param; + + this.running = true; + this.currRetry = 0; + var self = this; + setTimeout(function(){ + self.startConnect(url); + },1000); + }, + // 完善参数 + perfectParam : function(param){ + if(param && JS.isString(param)){ + if(param.charAt(0) != '&'){ + param = '&'+param; + } + } + return param; + }, + /** + * 停止连接 + * @method + * @param {String} cause 停止原因 + */ + stop : function(cause){ + if(!this.running){ + return; + } + if(this.fireEvent('beforeStop',cause,this.cId, this.url, this) === false){ + return; + } + this.running = false; + var cId = this.cId; + this.cId = ''; + this.channels = []; + this.workStyle = ''; + try{ + this._xhr.abort(); + }catch(e){}; + this.fireEvent('stop',cause, cId, this.url, this); + }, + /** + * 获得连接ID + * @method + * @return {String} 连接ID + */ + getId : function(){ + return this.cId; + } +}); \ No newline at end of file diff --git a/.svn/pristine/dc/dcf97f587c8a7705ccd925e1efd9ce516195f2b9.svn-base b/.svn/pristine/dc/dcf97f587c8a7705ccd925e1efd9ce516195f2b9.svn-base new file mode 100644 index 0000000..0167839 Binary files /dev/null and b/.svn/pristine/dc/dcf97f587c8a7705ccd925e1efd9ce516195f2b9.svn-base differ diff --git a/.svn/pristine/df/df068ddd74454afb8839d0b95aac5c8a1ae67efa.svn-base b/.svn/pristine/df/df068ddd74454afb8839d0b95aac5c8a1ae67efa.svn-base new file mode 100644 index 0000000..db8802b Binary files /dev/null and b/.svn/pristine/df/df068ddd74454afb8839d0b95aac5c8a1ae67efa.svn-base differ diff --git a/.svn/pristine/df/dfed4d77852f5f6dd2f3c6bba23bb40b2302396c.svn-base b/.svn/pristine/df/dfed4d77852f5f6dd2f3c6bba23bb40b2302396c.svn-base new file mode 100644 index 0000000..77224b0 Binary files /dev/null and b/.svn/pristine/df/dfed4d77852f5f6dd2f3c6bba23bb40b2302396c.svn-base differ diff --git a/.svn/pristine/e2/e2540d51be724fa077f4fabd9416aebb27926868.svn-base b/.svn/pristine/e2/e2540d51be724fa077f4fabd9416aebb27926868.svn-base new file mode 100644 index 0000000..ee2dd98 Binary files /dev/null and b/.svn/pristine/e2/e2540d51be724fa077f4fabd9416aebb27926868.svn-base differ diff --git a/.svn/pristine/e2/e2baa3df84ab68186a44d4b69d2a9c6fb5c24684.svn-base b/.svn/pristine/e2/e2baa3df84ab68186a44d4b69d2a9c6fb5c24684.svn-base new file mode 100644 index 0000000..6b64286 Binary files /dev/null and b/.svn/pristine/e2/e2baa3df84ab68186a44d4b69d2a9c6fb5c24684.svn-base differ diff --git a/.svn/pristine/e2/e2dd46f832055385e9dfb2e0f1f0074a5a4f8388.svn-base b/.svn/pristine/e2/e2dd46f832055385e9dfb2e0f1f0074a5a4f8388.svn-base new file mode 100644 index 0000000..cd654a4 Binary files /dev/null and b/.svn/pristine/e2/e2dd46f832055385e9dfb2e0f1f0074a5a4f8388.svn-base differ diff --git a/.svn/pristine/e3/e36d473d652c2a350a113a5afca0fea0c895f552.svn-base b/.svn/pristine/e3/e36d473d652c2a350a113a5afca0fea0c895f552.svn-base new file mode 100644 index 0000000..4ff1d7a --- /dev/null +++ b/.svn/pristine/e3/e36d473d652c2a350a113a5afca0fea0c895f552.svn-base @@ -0,0 +1,3 @@ +V0.1.1 +新增: +全自动化测试程序 \ No newline at end of file diff --git a/.svn/pristine/e3/e3c03133c33fac26e92896504f534120089b41df.svn-base b/.svn/pristine/e3/e3c03133c33fac26e92896504f534120089b41df.svn-base new file mode 100644 index 0000000..d87b0a9 Binary files /dev/null and b/.svn/pristine/e3/e3c03133c33fac26e92896504f534120089b41df.svn-base differ diff --git a/.svn/pristine/e3/e3d3509dd9120fa866a718f57ec681f5018dad4a.svn-base b/.svn/pristine/e3/e3d3509dd9120fa866a718f57ec681f5018dad4a.svn-base new file mode 100644 index 0000000..d112c54 Binary files /dev/null and b/.svn/pristine/e3/e3d3509dd9120fa866a718f57ec681f5018dad4a.svn-base differ diff --git a/.svn/pristine/e4/e4be8d063459b4854e4d13e791409632e236ee47.svn-base b/.svn/pristine/e4/e4be8d063459b4854e4d13e791409632e236ee47.svn-base new file mode 100644 index 0000000..3fc838f --- /dev/null +++ b/.svn/pristine/e4/e4be8d063459b4854e4d13e791409632e236ee47.svn-base @@ -0,0 +1,1299 @@ +/* + * Comet4J JavaScript Client V0.1.7 + * Copyright(c) 2011, jinghai.xiao@gamil.com. + * http://code.google.com/p/comet4j/ + * This code is licensed under BSD license. Use it as you wish, + * but keep this copyright intact. + */ + + +var JS = { + version : '0.1.7' +}; + +JS.Runtime = (function(){ + var ua = navigator.userAgent.toLowerCase(), + check = function(r){ + return r.test(ua); + }, + + isOpera = check(/opera/), + + isFirefox = check(/firefox/), + + isChrome = check(/chrome/), + + isWebKit = check(/webkit/), + + isSafari = !isChrome && check(/safari/), + + isSafari2 = isSafari && check(/applewebkit\/4/), + + isSafari3 = isSafari && check(/version\/3/), + + isSafari4 = isSafari && check(/version\/4/), + + isIE = !isOpera && check(/msie/), + + isIE7 = isIE && check(/msie 7/), + + isIE8 = isIE && check(/msie 8/), + + isIE6 = isIE && !isIE7 && !isIE8, + + isGecko = !isWebKit && check(/gecko/), + + isGecko2 = isGecko && check(/rv:1\.8/), + + isGecko3 = isGecko && check(/rv:1\.9/), + + isWindows = check(/windows|win32/), + + isMac = check(/macintosh|mac os x/), + + isAir = check(/adobeair/), + + isLinux = check(/linux/); + return { + isOpera : isOpera, + isFirefox : isFirefox, + isChrome : isChrome, + isWebKit : isWebKit, + isSafari : isSafari, + isSafari2 : isSafari2, + isSafari3 : isSafari3, + isSafari4 : isSafari4, + isIE : isIE, + isIE7 : isIE7, + isIE8 : isIE8, + isIE6 : isIE6, + isGecko : isGecko, + isGecko2 : isGecko2, + isGecko3 : isGecko3, + isWindows :isWindows, + isMac : isMac, + isAir : isAir, + isLinux : isLinux + }; +}()); +JS.isOpera = JS.Runtime.isOpera; +JS.isFirefox = JS.Runtime.isFirefox; +JS.isChrome = JS.Runtime.isChrome; +JS.isWebKit = JS.Runtime.isWebKit; +JS.isSafari = JS.Runtime.isSafari; +JS.isSafari2 = JS.Runtime.isSafari2; +JS.isSafari3 = JS.Runtime.isSafari3; +JS.isSafari4 = JS.Runtime.isSafari4; +JS.isIE = JS.Runtime.isIE; +JS.isIE7 = JS.Runtime.isIE7; +JS.isIE8 = JS.Runtime.isIE8; +JS.isIE6 = JS.Runtime.isIE6; +JS.isGecko = JS.Runtime.isGecko; +JS.isGecko2 = JS.Runtime.isGecko2; +JS.isGecko3 = JS.Runtime.isGecko3; +JS.isWindows =JS.Runtime.isWindows; +JS.isMac = JS.Runtime.isMac; +JS.isAir = JS.Runtime.isAir; +JS.isLinux = JS.Runtime.isLinux; + +JS.Syntax = { + log : function(str){ + if(typeof console!="undefined"){ + console.log(str); + } + }, + nameSpace : function(){ + if(arguments.length){ + var o, d, v; + for(var i=0,len=arguments.length; i 0){ + for(var i=0, len=eventName.length; i -1; i--){//TODO:fix 倒序 + if(listeners[i].execute.apply(listeners[i],arguments) === false){ + return false; + } + } + return true; + }, + + addListener : function(fn, scope,o){ + scope = scope || this.caller; + if(this.hasListener(fn, scope) == -1){ + this.listeners.push(new JS.Listener(fn, scope ,o)); + } + }, + + removeListener : function(fn, scope){ + var index = this.hasListener(fn, scope); + if(index!=-1){ + this.listeners.splice(index, 1); + } + }, + + hasListener : function(fn, scope){ + var i = 0, + listeners = this.listeners, + len = listeners.length; + for(; i= 200 && this.status < 300)){ + this.fireEvent('progress', this, xhr); + } + + if(this.readyState == 4){ + this.cancelTimeout(); + var status = this.status ; + if(status == 0 || status == ""){ + this.fireEvent('error', this, xhr); + }else if(status >= 200 && status < 300){ + this.fireEvent('load', this, xhr); + }else if(status >= 400 && status != 408){ + this.fireEvent('error', this, xhr); + }else if(status == 408){ + this.fireEvent('timeout', this, xhr); + } + + } + this.onreadystatechange(); + }, + + onreadystatechange : function(){ + }, + //--------request-------- + + open : function(method, url, async, username, password){ + if(!url){ + return; + } + if(!this.enableCache){ + if(url.indexOf('?') != -1){ + url += '&ram='+Math.random(); + }else{ + url += '?ram='+Math.random(); + } + } + this._xhr.open(method, url, async, username, password); + }, + + send : function(content){ + this.delayTimeout(); + this.isAbort = false; + this._xhr.send(content); + }, + + abort : function(){ + this.isAbort = true; + this.cancelTimeout(); + this._xhr.abort(); + if(JS.isIE){//IE在abort后会清空侦听 + var self = this; + self._xhr.onreadystatechange = function(){ + self.doReadyStateChange(); + }; + } + this.fireEvent('abort',this,this._xhr); + }, + + setRequestHeader : function(header, value){ + this._xhr.setRequestHeader(header,value); + }, + //--------request-------- + + getResponseHeader : function(header){ + return this._xhr.getResponseHeader(header); + }, + + getAllResponseHeaders : function(){ + return this._xhr.getAllResponseHeaders(); + }, + + setTimeout : function(t){ + this.timeout = t; + } + +}); + +JS.ns("JS.AJAX"); + +JS.AJAX = (function(){ + var xhr = new JS.XMLHttpRequest(); + return { + dataFormatError : '服务器返回的数据格式有误', + urlError : '未指定url', + + post : function(url,param,callback,scope,asyn){ + if(typeof url!=='string'){ + throw new Error(this.urlError); + } + //默认为异步请求 + var asynchronous = true; + if(asyn===false){ + asynchronous = false; + } + xhr.onreadystatechange = function(){ + if(xhr.readyState==4 && asynchronous){ + JS.callBack(callback,scope,[xhr]); + } + }; + xhr.open('POST', url, asynchronous); + xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=UTF8"); + xhr.send(param || null); + if(!asynchronous){ + JS.callBack(callback,scope,[xhr]); + } + + }, + + get : function(url,param,callback,scope,asyn){ + if(typeof url!=='string'){ + throw new Error(this.urlError); + } + //默认为异步请求 + var asynchronous = true; + if(asyn===false){ + asynchronous = false; + } + xhr.onreadystatechange = function(){ + if(xhr.readyState==4 && asynchronous){ + JS.callBack(callback,scope,[xhr]); + } + }; + xhr.open('GET', url, asynchronous); + xhr.setRequestHeader("Content-Type","html/text;charset=UTF8"); + xhr.send(param || null); + if(!asynchronous){ + JS.callBack(callback,scope,[xhr]); + } + + }, + + getText : function(url,jsonData,callback,scope,asyn){ + this.get(url,jsonData,function(xhr){ + if(scope){ + callback.call(scope,xhr.responseText); + }else{ + callback(xhr.responseText); + } + },this,asyn); + }, + + getJson : function(url,jsonData,callback,scope,asyn){ + this.get(url,jsonData,function(xhr){ + var json = null; + try{ + json = eval("("+xhr.responseText+")"); + }catch(e){ + throw new Error(this.dataFormatError); + } + JS.callBack(callback,scope,[json]); + },this,asyn); + } + }; +})(); + +JS.ns("JS.Connector"); +JS.Connector = JS.extend(JS.Observable,{ + + version : JS.version, + SYSCHANNEL:'c4j', //协议常量 + + LLOOPSTYLE : 'lpool',//协议常量 + + STREAMSTYLE : 'stream',//协议常量 + CMDTAG : 'cmd', + + retryCount : 3, + + retryDelay : 1000, + currRetry : 0, + + url : '', + + param : '', + + revivalDelay : 100, + + cId : '', + + channels : [], + + workStyle : '', + emptyUrlError : 'URL为空', + runningError : '连接正在运行', + dataFormatError : '数据格式有误', + + running : false, + _xhr : null, + lastReceiveMessage : '', + constructor:function(){ + JS.Connector.superclass.constructor.apply(this,arguments); + this.addEvents([ + + 'beforeConnect', + + 'connect', + + 'beforeStop', + + 'stop', + + 'message', + + 'revival' + ]); + if(JS.isIE7){ + this._xhr = new JS.XMLHttpRequest({ + specialXHR : 'Msxml2.XMLHTTP.6.0' + }); + }else{ + this._xhr = new JS.XMLHttpRequest(); + } + //this._xhr.addListener('readyStateChange',this.onReadyStateChange,this); + + this._xhr.addListener('progress',this.doOnProgress,this); + this._xhr.addListener('load',this.doOnLoad,this); + this._xhr.addListener('error',this.doOnError,this); + this._xhr.addListener('timeout',this.doOnTimeout,this); + + this.addListener('beforeStop',this.doDrop,this); + JS.on(window,'beforeunload',this.doDrop,this); + + }, + //private + doDrop : function(url,cId,conn,xhr){ + if(!this.running || !this.cId){ + return; + } + try { + var xhr = new JS.XMLHttpRequest(); + var param = this.perfectParam(this.param); + var url = this.url + '?'+this.CMDTAG+'=drop&cid=' + this.cId + param; + xhr.open('GET', url, false); + xhr.send(null); + xhr = null; + }catch(e){}; + }, + //private distributed 派发服务器消息 + dispatchServerEvent : function(msg){ + this.fireEvent('message', msg.channel, msg.data, msg.time, this); + }, + //private 长连接信息转换 + translateStreamData : function(responseText){ + var str = responseText; + if(this.lastReceiveMessage && str){//剥离出接收到的数据 + str = str.split(this.lastReceiveMessage); + str = str.length ? str[str.length-1] : ""; + } + this.lastReceiveMessage = responseText; + return str; + }, + //private 消息解码 + decodeMessage : function(msg){ + var json = null; + if(JS.isString(msg) && msg!=""){ + //解析数据格式 + if(msg.charAt(0)=="<" ){ + msg = msg.substring(1,msg.length); + } + if(msg.charAt(msg.length-1)==">"){ + msg = msg.substring(0,msg.length-1); + } + msg = decodeURIComponent(msg); + try{ + json = eval("("+msg+")"); + }catch(e){ + this.stop('JSON转换异常'); + } + } + return json; + }, + //private + doOnProgress : function(xhr){ + if(this.workStyle === this.STREAMSTYLE){ + var str = this.translateStreamData(xhr.responseText); + var msglist = str.split(">"); + if(msglist.length > 0){ + for(var i=0, len=msglist.length; i this.retryCount){ + this.stop('服务器异常'); + }else{ + this.retryRevivalConnect(); + } + } + } + } + } + }, + //private + doOnLoad : function(xhr){ + if(this.workStyle === this.LLOOPSTYLE){ + var json = this.decodeMessage(xhr.responseText); + if(json){ + this.currRetry = 0; + this.dispatchServerEvent(json); + this.revivalConnect(); + }else{//非正常情况,状态为4,200并且还没有收到任何数据 + this.currRetry++; + if(this.currRetry > this.retryCount){ + this.stop('服务器异常'); + }else{ + this.retryRevivalConnect(); + } + } + } + }, + //private + doOnError : function(xhr){ + this.currRetry++; + if(this.currRetry > this.retryCount){ + this.stop('服务器异常'); + }else{ + this.retryRevivalConnect(); + } + + }, + //private + doOnTimeout : function(xhr){ + this.currRetry++; + if(this.currRetry > this.retryCount){ + this.stop('请求超时'); + }else{ + this.retryRevivalConnect(); + } + }, + //private + startConnect : function(url){ + if(this.running){ + var connXhr = new JS.XMLHttpRequest(); + connXhr.addListener('error',function(xhr){ + this.stop("连接时发生错误"); + },this); + connXhr.addListener('timeout',function(xhr){ + this.stop("连接超时"); + },this); + connXhr.addListener('load',function(xhr){ + var msg = this.decodeMessage(xhr.responseText); + if(!msg){ + this.stop('连接失败'); + return; + } + var data = msg.data; + this.cId = data.cId; + this.channels = data.channels; + this.workStyle = data.ws; + this._xhr.setTimeout(data.timeout + 1000); + this.fireEvent('connect', data.cId, data.channels, data.ws, data.timeout, this); + this.revivalConnect(); + },this); + connXhr.open('GET', url, true); + connXhr.send(null); + + } + }, + + //private 重试复活连接 + retryRevivalConnect : function(){ + var self = this; + if(this.running){ + setTimeout(function(){ + self.revivalConnect(); + },this.retryDelay); + } + }, + + //private + revivalConnect : function(){ + var self = this; + if(this.running){ + setTimeout(revival,this.revivalDelay); + } + function revival(){ + var xhr = self._xhr; + var param = self.perfectParam(self.param); + var url = self.url + '?'+self.CMDTAG+'=revival&cid=' + self.cId + param; + xhr.open('GET', url, true); + xhr.send(null); + self.fireEvent('revival',self.url, self.cId, self); + } + + }, + + start : function(url,param){ + if(this.running){ + return; + } + + this.url = url || this.url; + if(!this.url){ + throw new Error(this.emptyUrlError); + } + + if(this.fireEvent('beforeConnect', this.url, this) === false){ + return; + } + + this.param = param || this.param; + param = this.perfectParam(this.param); + var url = this.url+'?'+this.CMDTAG+'=conn&cv='+this.version+param; + + this.running = true; + this.currRetry = 0; + var self = this; + setTimeout(function(){ + self.startConnect(url); + },1000); + }, + // 完善参数 + perfectParam : function(param){ + if(param && JS.isString(param)){ + if(param.charAt(0) != '&'){ + param = '&'+param; + } + } + return param; + }, + + stop : function(cause){ + if(!this.running){ + return; + } + if(this.fireEvent('beforeStop',cause,this.cId, this.url, this) === false){ + return; + } + this.running = false; + var cId = this.cId; + this.cId = ''; + this.channels = []; + this.workStyle = ''; + try{ + this._xhr.abort(); + }catch(e){}; + this.fireEvent('stop',cause, cId, this.url, this); + }, + + getId : function(){ + return this.cId; + } +}); + +JS.ns("JS.Engine"); +JS.Engine = (function(){ + var Engine = JS.extend(JS.Observable,{ + lStore : [],//用于存放没启动状态下用户增加的侦听 + + running : false, + + connector : null, + constructor:function(){ + this.addEvents([ + + 'start', + + 'stop' + ]); + Engine.superclass.constructor.apply(this,arguments); + this.connector = new JS.Connector(); + this.initEvent(); + }, + + //重载addListener函数 + addListener : function(eventName, fn, scope, o){ + if(this.running){ + Engine.superclass.addListener.apply(this,arguments); + }else{ + this.lStore.push({ + eventName : eventName, + fn : fn, + scope : scope, + o : o + }); + } + }, + //private + initEvent : function(){ + var self = this; + this.connector.on({ + connect : function(cId, aml, conn){ + //self.running = true; + self.addEvents(aml); + for(var i=0,len=self.lStore.length; i> cache = Collections + .synchronizedMap(new WeakHashMap>()); + + /** + * 构造 + * @param aTimespan 过期时长,毫秒 + * @param aFrequency 过期检测频率,毫秒 + */ + + public ExpiresCache(long aTimespan, long aFrequency) { + init = true; + frequency = aFrequency; + timespan = aTimespan; + Thread cleanerThread = new Thread(new CacheCleaner(), "Comet4J-MessageCleaner"); + cleanerThread.setDaemon(true); + cleanerThread.start(); + + } + + public synchronized void push(CometConnection c, CometMessage e) { + if (c == null) return; + List list = cache.get(c); + if (list == null) { + list = new ArrayList(); + cache.put(c, list); + } + list.add(e); + } + + public synchronized void push(CometConnection c, List e) { + if (c == null) return; + List list = cache.get(c); + if (list == null) { + list = new ArrayList(); + cache.put(c, list); + } + list.addAll(e); + } + + /** + * 获取连接的失败消息列表,取出后将此连接及信息从缓存清除 + * @param c 连接 + * @return 如果没有连接对应的消息返回null,若取到此边接的消息列表 + */ + public synchronized List get(CometConnection c) { + List list = cache.get(c); + if (list != null) { + cache.remove(c); + } + return list; + } + + // ----------定时清理过期信息--------------- + class CacheCleaner implements Runnable { + + private final List toDeleteList = new ArrayList(); + private final List toDeleteMessageList = new ArrayList(); + + public void run() { + while (init) { + try { + CometContext.getInstance().log("【CometDebug】开始清理消息缓存"); + Thread.sleep(frequency); + checkExpires(); + CometContext.getInstance().log("【CometDebug】开始清理消息缓存完毕"); + } catch (Exception ex) { + ex.printStackTrace(); + } + + } + } + + // 过期检查 + private void checkExpires() { + size = 0; + synchronized (cache) { + for (CometConnection o : cache.keySet()) { + List list = cache.get(o); + size += list.size(); + if (list.size() > 0) { + // 寻找过期消息条目 + synchronized (list) { + for (CometMessage msg : list) { + long expireMillis = msg.getTime() + timespan; + if (expireMillis < System.currentTimeMillis()) { + toDeleteMessageList.add(msg); + } + } + if (!toDeleteMessageList.isEmpty()) { + for (CometMessage msg : toDeleteMessageList) { + list.remove(msg); + } + toDeleteMessageList.clear(); + } + } + } + if (list.size() == 0) { + toDeleteList.add(o); + } + } + if (!toDeleteList.isEmpty()) { + for (CometConnection c : toDeleteList) { + cache.remove(c); + } + toDeleteList.clear(); + } + } + CometContext.getInstance().log("【CometDebug】缓存数量:" + size); + } + } + + public void destroy() { + init = false; + for (Object o : cache.keySet()) { + cache.get(o).clear(); + } + cache.clear(); + } +} diff --git a/.svn/pristine/ec/ec57f9e7b31bee9b5d63f041cd4f80278e2be6a3.svn-base b/.svn/pristine/ec/ec57f9e7b31bee9b5d63f041cd4f80278e2be6a3.svn-base new file mode 100644 index 0000000..712b1b8 --- /dev/null +++ b/.svn/pristine/ec/ec57f9e7b31bee9b5d63f041cd4f80278e2be6a3.svn-base @@ -0,0 +1,74 @@ +/* + * Comet4J JavaScript Client V0.1.7 + * Copyright(c) 2011, jinghai.xiao@gamil.com. + * http://code.google.com/p/comet4j/ + * This code is licensed under BSD license. Use it as you wish, + * but keep this copyright intact. + */ + + +var JS={version:'0.1.7'};JS.Runtime=(function(){var ua=navigator.userAgent.toLowerCase(),check=function(r){return r.test(ua);},isOpera=check(/opera/),isFirefox=check(/firefox/),isChrome=check(/chrome/),isWebKit=check(/webkit/),isSafari=!isChrome&&check(/safari/),isSafari2=isSafari&&check(/applewebkit\/4/),isSafari3=isSafari&&check(/version\/3/),isSafari4=isSafari&&check(/version\/4/),isIE=!isOpera&&check(/msie/),isIE7=isIE&&check(/msie 7/),isIE8=isIE&&check(/msie 8/),isIE6=isIE&&!isIE7&&!isIE8,isGecko=!isWebKit&&check(/gecko/),isGecko2=isGecko&&check(/rv:1\.8/),isGecko3=isGecko&&check(/rv:1\.9/),isWindows=check(/windows|win32/),isMac=check(/macintosh|mac os x/),isAir=check(/adobeair/),isLinux=check(/linux/);return{isOpera:isOpera,isFirefox:isFirefox,isChrome:isChrome,isWebKit:isWebKit,isSafari:isSafari,isSafari2:isSafari2,isSafari3:isSafari3,isSafari4:isSafari4,isIE:isIE,isIE7:isIE7,isIE8:isIE8,isIE6:isIE6,isGecko:isGecko,isGecko2:isGecko2,isGecko3:isGecko3,isWindows:isWindows,isMac:isMac,isAir:isAir,isLinux:isLinux};}());JS.isOpera=JS.Runtime.isOpera;JS.isFirefox=JS.Runtime.isFirefox;JS.isChrome=JS.Runtime.isChrome;JS.isWebKit=JS.Runtime.isWebKit;JS.isSafari=JS.Runtime.isSafari;JS.isSafari2=JS.Runtime.isSafari2;JS.isSafari3=JS.Runtime.isSafari3;JS.isSafari4=JS.Runtime.isSafari4;JS.isIE=JS.Runtime.isIE;JS.isIE7=JS.Runtime.isIE7;JS.isIE8=JS.Runtime.isIE8;JS.isIE6=JS.Runtime.isIE6;JS.isGecko=JS.Runtime.isGecko;JS.isGecko2=JS.Runtime.isGecko2;JS.isGecko3=JS.Runtime.isGecko3;JS.isWindows=JS.Runtime.isWindows;JS.isMac=JS.Runtime.isMac;JS.isAir=JS.Runtime.isAir;JS.isLinux=JS.Runtime.isLinux;JS.Syntax={log:function(str){if(typeof console!="undefined"){console.log(str);}},nameSpace:function(){if(arguments.length){var o,d,v;for(var i=0,len=arguments.length;i0){for(var i=0,len=eventName.length;i-1;i--){if(listeners[i].execute.apply(listeners[i],arguments)===false){return false;}} +return true;},addListener:function(fn,scope,o){scope=scope||this.caller;if(this.hasListener(fn,scope)==-1){this.listeners.push(new JS.Listener(fn,scope,o));}},removeListener:function(fn,scope){var index=this.hasListener(fn,scope);if(index!=-1){this.listeners.splice(index,1);}},hasListener:function(fn,scope){var i=0,listeners=this.listeners,len=listeners.length;for(;i=200&&this.status<300)){this.fireEvent('progress',this,xhr);} +if(this.readyState==4){this.cancelTimeout();var status=this.status;if(status==0||status==""){this.fireEvent('error',this,xhr);}else if(status>=200&&status<300){this.fireEvent('load',this,xhr);}else if(status>=400&&status!=408){this.fireEvent('error',this,xhr);}else if(status==408){this.fireEvent('timeout',this,xhr);}} +this.onreadystatechange();},onreadystatechange:function(){},open:function(method,url,async,username,password){if(!url){return;} +if(!this.enableCache){if(url.indexOf('?')!=-1){url+='&ram='+Math.random();}else{url+='?ram='+Math.random();}} +this._xhr.open(method,url,async,username,password);},send:function(content){this.delayTimeout();this.isAbort=false;this._xhr.send(content);},abort:function(){this.isAbort=true;this.cancelTimeout();this._xhr.abort();if(JS.isIE){var self=this;self._xhr.onreadystatechange=function(){self.doReadyStateChange();};} +this.fireEvent('abort',this,this._xhr);},setRequestHeader:function(header,value){this._xhr.setRequestHeader(header,value);},getResponseHeader:function(header){return this._xhr.getResponseHeader(header);},getAllResponseHeaders:function(){return this._xhr.getAllResponseHeaders();},setTimeout:function(t){this.timeout=t;}}); + +JS.ns("JS.AJAX");JS.AJAX=(function(){var xhr=new JS.XMLHttpRequest();return{dataFormatError:'服务器返回的数据格式有误',urlError:'未指定url',post:function(url,param,callback,scope,asyn){if(typeof url!=='string'){throw new Error(this.urlError);} +var asynchronous=true;if(asyn===false){asynchronous=false;} +xhr.onreadystatechange=function(){if(xhr.readyState==4&&asynchronous){JS.callBack(callback,scope,[xhr]);}};xhr.open('POST',url,asynchronous);xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=UTF8");xhr.send(param||null);if(!asynchronous){JS.callBack(callback,scope,[xhr]);}},get:function(url,param,callback,scope,asyn){if(typeof url!=='string'){throw new Error(this.urlError);} +var asynchronous=true;if(asyn===false){asynchronous=false;} +xhr.onreadystatechange=function(){if(xhr.readyState==4&&asynchronous){JS.callBack(callback,scope,[xhr]);}};xhr.open('GET',url,asynchronous);xhr.setRequestHeader("Content-Type","html/text;charset=UTF8");xhr.send(param||null);if(!asynchronous){JS.callBack(callback,scope,[xhr]);}},getText:function(url,jsonData,callback,scope,asyn){this.get(url,jsonData,function(xhr){if(scope){callback.call(scope,xhr.responseText);}else{callback(xhr.responseText);}},this,asyn);},getJson:function(url,jsonData,callback,scope,asyn){this.get(url,jsonData,function(xhr){var json=null;try{json=eval("("+xhr.responseText+")");}catch(e){throw new Error(this.dataFormatError);} +JS.callBack(callback,scope,[json]);},this,asyn);}};})(); + +JS.ns("JS.Connector");JS.Connector=JS.extend(JS.Observable,{version:JS.version,SYSCHANNEL:'c4j',LLOOPSTYLE:'lpool',STREAMSTYLE:'stream',CMDTAG:'cmd',retryCount:3,retryDelay:1000,currRetry:0,url:'',param:'',revivalDelay:100,cId:'',channels:[],workStyle:'',emptyUrlError:'URL为空',runningError:'连接正在运行',dataFormatError:'数据格式有误',running:false,_xhr:null,lastReceiveMessage:'',constructor:function(){JS.Connector.superclass.constructor.apply(this,arguments);this.addEvents(['beforeConnect','connect','beforeStop','stop','message','revival']);if(JS.isIE7){this._xhr=new JS.XMLHttpRequest({specialXHR:'Msxml2.XMLHTTP.6.0'});}else{this._xhr=new JS.XMLHttpRequest();} +this._xhr.addListener('progress',this.doOnProgress,this);this._xhr.addListener('load',this.doOnLoad,this);this._xhr.addListener('error',this.doOnError,this);this._xhr.addListener('timeout',this.doOnTimeout,this);this.addListener('beforeStop',this.doDrop,this);JS.on(window,'beforeunload',this.doDrop,this);},doDrop:function(url,cId,conn,xhr){if(!this.running||!this.cId){return;} +try{var xhr=new JS.XMLHttpRequest();var param=this.perfectParam(this.param);var url=this.url+'?'+this.CMDTAG+'=drop&cid='+this.cId+param;xhr.open('GET',url,false);xhr.send(null);xhr=null;}catch(e){};},dispatchServerEvent:function(msg){this.fireEvent('message',msg.channel,msg.data,msg.time,this);},translateStreamData:function(responseText){var str=responseText;if(this.lastReceiveMessage&&str){str=str.split(this.lastReceiveMessage);str=str.length?str[str.length-1]:"";} +this.lastReceiveMessage=responseText;return str;},decodeMessage:function(msg){var json=null;if(JS.isString(msg)&&msg!=""){if(msg.charAt(0)=="<"){msg=msg.substring(1,msg.length);} +if(msg.charAt(msg.length-1)==">"){msg=msg.substring(0,msg.length-1);} +msg=decodeURIComponent(msg);try{json=eval("("+msg+")");}catch(e){this.stop('JSON转换异常');}} +return json;},doOnProgress:function(xhr){if(this.workStyle===this.STREAMSTYLE){var str=this.translateStreamData(xhr.responseText);var msglist=str.split(">");if(msglist.length>0){for(var i=0,len=msglist.length;ithis.retryCount){this.stop('服务器异常');}else{this.retryRevivalConnect();}}}}}},doOnLoad:function(xhr){if(this.workStyle===this.LLOOPSTYLE){var json=this.decodeMessage(xhr.responseText);if(json){this.currRetry=0;this.dispatchServerEvent(json);this.revivalConnect();}else{this.currRetry++;if(this.currRetry>this.retryCount){this.stop('服务器异常');}else{this.retryRevivalConnect();}}}},doOnError:function(xhr){this.currRetry++;if(this.currRetry>this.retryCount){this.stop('服务器异常');}else{this.retryRevivalConnect();}},doOnTimeout:function(xhr){this.currRetry++;if(this.currRetry>this.retryCount){this.stop('请求超时');}else{this.retryRevivalConnect();}},startConnect:function(url){if(this.running){var connXhr=new JS.XMLHttpRequest();connXhr.addListener('error',function(xhr){this.stop("连接时发生错误");},this);connXhr.addListener('timeout',function(xhr){this.stop("连接超时");},this);connXhr.addListener('load',function(xhr){var msg=this.decodeMessage(xhr.responseText);if(!msg){this.stop('连接失败');return;} +var data=msg.data;this.cId=data.cId;this.channels=data.channels;this.workStyle=data.ws;this._xhr.setTimeout(data.timeout+1000);this.fireEvent('connect',data.cId,data.channels,data.ws,data.timeout,this);this.revivalConnect();},this);connXhr.open('GET',url,true);connXhr.send(null);}},retryRevivalConnect:function(){var self=this;if(this.running){setTimeout(function(){self.revivalConnect();},this.retryDelay);}},revivalConnect:function(){var self=this;if(this.running){setTimeout(revival,this.revivalDelay);} +function revival(){var xhr=self._xhr;var param=self.perfectParam(self.param);var url=self.url+'?'+self.CMDTAG+'=revival&cid='+self.cId+param;xhr.open('GET',url,true);xhr.send(null);self.fireEvent('revival',self.url,self.cId,self);}},start:function(url,param){if(this.running){return;} +this.url=url||this.url;if(!this.url){throw new Error(this.emptyUrlError);} +if(this.fireEvent('beforeConnect',this.url,this)===false){return;} +this.param=param||this.param;param=this.perfectParam(this.param);var url=this.url+'?'+this.CMDTAG+'=conn&cv='+this.version+param;this.running=true;this.currRetry=0;var self=this;setTimeout(function(){self.startConnect(url);},1000);},perfectParam:function(param){if(param&&JS.isString(param)){if(param.charAt(0)!='&'){param='&'+param;}} +return param;},stop:function(cause){if(!this.running){return;} +if(this.fireEvent('beforeStop',cause,this.cId,this.url,this)===false){return;} +this.running=false;var cId=this.cId;this.cId='';this.channels=[];this.workStyle='';try{this._xhr.abort();}catch(e){};this.fireEvent('stop',cause,cId,this.url,this);},getId:function(){return this.cId;}}); + +JS.ns("JS.Engine");JS.Engine=(function(){var Engine=JS.extend(JS.Observable,{lStore:[],running:false,connector:null,constructor:function(){this.addEvents(['start','stop']);Engine.superclass.constructor.apply(this,arguments);this.connector=new JS.Connector();this.initEvent();},addListener:function(eventName,fn,scope,o){if(this.running){Engine.superclass.addListener.apply(this,arguments);}else{this.lStore.push({eventName:eventName,fn:fn,scope:scope,o:o});}},initEvent:function(){var self=this;this.connector.on({connect:function(cId,aml,conn){self.addEvents(aml);for(var i=0,len=self.lStore.length;i { + + public static SubEventType INITIALIZED = new SubEventType(); + public static SubEventType DESTROYED = new SubEventType(); + private SubEventType subType; + private ServletContext servletContext; + private CometContext cometContext; + + public CometContextEvent(CometContext target, SubEventType anSubType) { + super(target); + subType = anSubType; + } + + public SubEventType getSubType() { + return subType; + } + + public void setSubType(SubEventType subType) { + this.subType = subType; + } + + public ServletContext getServletContext() { + return servletContext; + } + + public void setServletContext(ServletContext servletContext) { + this.servletContext = servletContext; + } + + public CometContext getCometContext() { + return cometContext; + } + + public void setCometContext(CometContext cometContext) { + this.cometContext = cometContext; + } + + @Override + public void destroy() { + super.destroy(); + subType = null; + servletContext = null; + cometContext = null; + } +} diff --git a/.svn/pristine/ed/ed216e63f7598343144bf32f573e068694792b7a.svn-base b/.svn/pristine/ed/ed216e63f7598343144bf32f573e068694792b7a.svn-base new file mode 100644 index 0000000..97d04f3 Binary files /dev/null and b/.svn/pristine/ed/ed216e63f7598343144bf32f573e068694792b7a.svn-base differ diff --git a/.svn/pristine/ee/ee219d2c04ddf5091ed5b9d39f3d93af64f5fca7.svn-base b/.svn/pristine/ee/ee219d2c04ddf5091ed5b9d39f3d93af64f5fca7.svn-base new file mode 100644 index 0000000..e5d63ab --- /dev/null +++ b/.svn/pristine/ee/ee219d2c04ddf5091ed5b9d39f3d93af64f5fca7.svn-base @@ -0,0 +1,131 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.event.demo.mac; + +import org.comet4j.event.Event; +import org.comet4j.event.Listener; +import org.comet4j.event.Observable; + +public class Test { + + // 用法展示:宏观事件模式 + public class PersonEvent extends Event { + + private SubEventType subType; + public String sayWords = ""; + public String goWhere = ""; + + public PersonEvent(Person target) { + super(target); + } + + public PersonEvent(Person target, SubEventType subtype) { + super(target); + this.subType = subtype; + } + + public SubEventType getSubType() { + return subType; + } + } + + public abstract class PersonListener extends Listener { + + @Override + public boolean handleEvent(PersonEvent pe) { + if (PersonEventSubType.BEFORESAY == pe.getSubType()) { + return onBeforeSay(pe); + } else if (PersonEventSubType.BEFOREGO == pe.getSubType()) { + return onBeforeGo(pe); + } + return true; + } + + public abstract boolean onBeforeSay(PersonEvent pe); + + public abstract boolean onBeforeGo(PersonEvent pe); + } + + public class PersonListener1 extends PersonListener { + + @Override + public boolean onBeforeSay(PersonEvent pe) { + System.out.println("1:One person want to say:" + pe.sayWords); + return true; + } + + @Override + public boolean onBeforeGo(PersonEvent pe) { + System.out.println("1:One person want to go:" + pe.goWhere); + return true; + } + } + + public class Person extends Observable { + + public Person() { + this.addEvent(PersonEvent.class); + } + + public void say(String aWords) { + PersonEvent e = new PersonEvent(this, PersonEventSubType.BEFORESAY); + e.sayWords = aWords; + if (!this.fireEvent(e)) { + return; + } + System.out.println("say:" + aWords); + } + + public void go(String where) { + PersonEvent e = new PersonEvent(this, PersonEventSubType.BEFOREGO); + e.goWhere = where; + if (!this.fireEvent(e)) { + return; + } + System.out.println("go:" + where); + } + } + + /** + * @param args + */ + public static void main(String[] args) { + new Test().run(); + + } + + // 用法 + public void run() { + Person person = new Person(); + + person.addListener(PersonEvent.class, new PersonListener1()); + + // 行间加入侦听 + person.addListener(PersonEvent.class, new PersonListener() { + + @Override + public boolean onBeforeSay(PersonEvent pe) { + // pe.stopEvent(); + // pe.preventDefault(); + System.out.println("2:One person want to say:" + pe.sayWords); + return true; + } + + @Override + public boolean onBeforeGo(PersonEvent pe) { + pe.stopEvent(); + // pe.preventDefault(); + System.out.println("2:One person want to go:" + pe.goWhere); + return true; + } + }); + + person.say("Hello world!"); + person.go("Home"); + + } + +} diff --git a/.svn/pristine/ee/ee4055aa6ef1bf7b45cdf961790643c763c6cf03.svn-base b/.svn/pristine/ee/ee4055aa6ef1bf7b45cdf961790643c763c6cf03.svn-base new file mode 100644 index 0000000..6ec7382 --- /dev/null +++ b/.svn/pristine/ee/ee4055aa6ef1bf7b45cdf961790643c763c6cf03.svn-base @@ -0,0 +1,53 @@ + + + 4.0.0 + + Comet4j-Test + org.comet4j + comet4j-test + 0.1.7 + + war + + + + src + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.6 + 1.6 + UTF-8 + + + + org.apache.maven.plugins + maven-war-plugin + + WebContent + + + + + + + + + + + + org.comet4j + comet4j + 0.1.7 + + + javax.servlet + servlet-api + 2.5 + provided + + + \ No newline at end of file diff --git a/.svn/pristine/ef/ef473db6b7899268a1e5d32cb52f1fc0bdfbcd44.svn-base b/.svn/pristine/ef/ef473db6b7899268a1e5d32cb52f1fc0bdfbcd44.svn-base new file mode 100644 index 0000000..26c9b17 --- /dev/null +++ b/.svn/pristine/ef/ef473db6b7899268a1e5d32cb52f1fc0bdfbcd44.svn-base @@ -0,0 +1,51 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.event; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.comet4j.core.CometEngine; +import org.comet4j.event.Event; + +/** + * 即将连接以前事件对象 + */ + +public class BeforeConnectEvent extends Event { + + private HttpServletRequest request; + private HttpServletResponse response; + + public BeforeConnectEvent(CometEngine target, HttpServletRequest anRequest, HttpServletResponse anResponse) { + super(target); + request = anRequest; + response = anResponse; + } + + public HttpServletRequest getRequest() { + return request; + } + + public void setRequest(HttpServletRequest request) { + this.request = request; + } + + public HttpServletResponse getResponse() { + return response; + } + + public void setResponse(HttpServletResponse response) { + this.response = response; + } + + @Override + public void destroy() { + super.destroy(); + request = null; + response = null; + } +} diff --git a/.svn/pristine/ef/efce7d53574a0450a6a3d47f617f0bb251547341.svn-base b/.svn/pristine/ef/efce7d53574a0450a6a3d47f617f0bb251547341.svn-base new file mode 100644 index 0000000..57b775c --- /dev/null +++ b/.svn/pristine/ef/efce7d53574a0450a6a3d47f617f0bb251547341.svn-base @@ -0,0 +1,27 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.demo.talker; + +/** + * 常量 + * @author jinghai.xiao@gmail.com + * @date 2011-2-25 + */ +public class Constant { + + // 通道标识 + public static final String APP_CHANNEL = "talker"; + // 上线消息标识 + public static final String UP = "up"; + // 下线消息标识 + public static final String DOWN = "down"; + // 改名消息标识 + public static final String RENAME = "rename"; + // 话语消息标识 + public static final String TALK = "talk"; + // 系统健康信息 + public static final String HEALTH = "health"; +} diff --git a/.svn/pristine/ef/efe569adea253db0b6d83b41acc659d9f4d31732.svn-base b/.svn/pristine/ef/efe569adea253db0b6d83b41acc659d9f4d31732.svn-base new file mode 100644 index 0000000..6f2339d --- /dev/null +++ b/.svn/pristine/ef/efe569adea253db0b6d83b41acc659d9f4d31732.svn-base @@ -0,0 +1,77 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core; + +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.catalina.comet.CometEvent; +import org.apache.catalina.comet.CometProcessor; + +/** + * 连接前端Servlet,负责处理连接请求,并转交给引擎处理。 + */ +public class CometServletTomcat7 extends HttpServlet implements CometProcessor { + + private static final long serialVersionUID = 1L; + + public CometServletTomcat7() { + super(); + } + + /* + * @see + * org.apache.catalina.CometProcessor#event(org.apache.catalina.CometEvent) + */ + public void event(CometEvent event) throws IOException, ServletException { + HttpServletRequest request = event.getHttpServletRequest(); + HttpServletResponse response = event.getHttpServletResponse(); + + if (event.getEventType() == CometEvent.EventType.BEGIN) { + event.setTimeout(CometContext.getInstance().getTimeout()); + String action = request.getParameter(CometProtocol.FLAG_ACTION); + if (CometProtocol.CMD_CONNECT.equals(action)) { + //System.out.println("CONNECT"); + CometContext.getInstance().getEngine().connect(request, response); + event.close(); + } else if (CometProtocol.CMD_REVIVAL.equals(action)) { + //System.out.println("REVIVAL"); + CometContext.getInstance().getEngine().revival(request, response); + } else if (CometProtocol.CMD_DROP.equals(action)) { + //System.out.println("DROP"); + CometContext.getInstance().getEngine().drop(request, response); + event.close(); + } + } else if (event.getEventType() == CometEvent.EventType.ERROR) { + if (event.getEventSubType() == CometEvent.EventSubType.TIMEOUT) { + //System.out.println("TIMEOUT"); + CometContext.getInstance().getEngine().dying(request, response); + event.close(); + } else { + //System.out.println("ERROR"); + CometContext.getInstance().getEngine().drop(request, response); + event.close(); + } + } else if (event.getEventType() == CometEvent.EventType.END) { + //System.out.println("END"); + CometContext.getInstance().getEngine().dying(request, response); + event.close(); + } else if (event.getEventType() == CometEvent.EventType.READ) { + event.close(); + } + + } + + @Override + public void destroy() { + super.destroy(); + } + +} diff --git a/.svn/pristine/f0/f03c5dba05954d748966bf418da228aa1a786a9f.svn-base b/.svn/pristine/f0/f03c5dba05954d748966bf418da228aa1a786a9f.svn-base new file mode 100644 index 0000000..25ef7b3 Binary files /dev/null and b/.svn/pristine/f0/f03c5dba05954d748966bf418da228aa1a786a9f.svn-base differ diff --git a/.svn/pristine/f0/f0e8e01a4d8235c906cccd9ad645f166d98c942b.svn-base b/.svn/pristine/f0/f0e8e01a4d8235c906cccd9ad645f166d98c942b.svn-base new file mode 100644 index 0000000..7c7a77c --- /dev/null +++ b/.svn/pristine/f0/f0e8e01a4d8235c906cccd9ad645f166d98c942b.svn-base @@ -0,0 +1,6 @@ +package org.comet4j.demo.sender; + +public class Constant { + + public static final String AppChannel = "sender"; +} diff --git a/.svn/pristine/f1/f1e2e20a7c90ee21a1370ada2450e825eae8fd4b.svn-base b/.svn/pristine/f1/f1e2e20a7c90ee21a1370ada2450e825eae8fd4b.svn-base new file mode 100644 index 0000000..724796d Binary files /dev/null and b/.svn/pristine/f1/f1e2e20a7c90ee21a1370ada2450e825eae8fd4b.svn-base differ diff --git a/.svn/pristine/f2/f2357c7511bae47f17a02586769afe78cb85522e.svn-base b/.svn/pristine/f2/f2357c7511bae47f17a02586769afe78cb85522e.svn-base new file mode 100644 index 0000000..fa419b5 Binary files /dev/null and b/.svn/pristine/f2/f2357c7511bae47f17a02586769afe78cb85522e.svn-base differ diff --git a/.svn/pristine/f2/f25073b2031a677aa1ef4f296d800775c34d28f8.svn-base b/.svn/pristine/f2/f25073b2031a677aa1ef4f296d800775c34d28f8.svn-base new file mode 100644 index 0000000..ea31a30 Binary files /dev/null and b/.svn/pristine/f2/f25073b2031a677aa1ef4f296d800775c34d28f8.svn-base differ diff --git a/.svn/pristine/f2/f252f47d76d65a7d2efafef70ff3847ab9b6e0a4.svn-base b/.svn/pristine/f2/f252f47d76d65a7d2efafef70ff3847ab9b6e0a4.svn-base new file mode 100644 index 0000000..ba4c657 Binary files /dev/null and b/.svn/pristine/f2/f252f47d76d65a7d2efafef70ff3847ab9b6e0a4.svn-base differ diff --git a/.svn/pristine/f2/f2d9b8894b5c50c6db45551f4989a6a59cd9694c.svn-base b/.svn/pristine/f2/f2d9b8894b5c50c6db45551f4989a6a59cd9694c.svn-base new file mode 100644 index 0000000..e6bd927 --- /dev/null +++ b/.svn/pristine/f2/f2d9b8894b5c50c6db45551f4989a6a59cd9694c.svn-base @@ -0,0 +1,244 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.event; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 被观察对象,此对象线程安全,内部实现使用乐观锁机制,即get方法不加锁,add,remove会有锁 职责:管理事件源对象、代理履行事件源职责 + * @author xiaojinghai@kedacom.com + */ +// TODO:考虑这里的Map是否可换为List,一个事件源对应于一种事件 +@SuppressWarnings("rawtypes") +public class Observable> { + + private Map, EventSource> eventSources = new HashMap, EventSource>(); + private List> interceptors = new ArrayList>(0); + private boolean suspend = false; + + /** + * 增加一个事件拦截器 此拦截器的interceptor方法在本对象所有事件发生之前执行,如有多个拦截器则按倒序逐个执行。 + * 当某个拦截器返回false则停止事件广播、终止动作的发生并不再执行其它拦截器,否则继续执行。 + * 当一个对象同时具备EventInterceptor和eventIntercept方法时,则先执行eventIntercept. + * @param anInterceptor + */ + @SuppressWarnings("unchecked") + public void addEventInterceptor(InterceptorInterface anInterceptor) { + synchronized (interceptors) { + interceptors.add(anInterceptor); + } + } + + /** + * 移除一个事件拦截器 + * @param anInterceptor + */ + public void removeEventInterceptor(L anInterceptor) { + synchronized (interceptors) { + interceptors.remove(anInterceptor); + } + } + + /** + * 移除所有事件拦截器 + */ + public void removeAllEventInterceptor() { + synchronized (interceptors) { + interceptors.clear(); + } + } + + /** + * 事件拦截 此方法在此对象所有事件发生之前执行,可以拦截发生在对象上的所有事件,默认不做任何处理,只返回true,子类可以重写此方法进行特殊处理。 + * 当一个对象同时具备eventIntercept方法和EventInterceptor时,则先执行eventIntercept. + * @param anEvent + * @return 返回false,则停止事件广播并终止动作的发生,否则继续执行。 + */ + public boolean eventIntercept(E anEvent) { + return true; + } + + /** + * 暂停事件的广播,但并不终止动作的发生,直到调用 resumeEvents方法 + */ + public void suspendEvents() { + suspend = true; + } + + /** + * 恢复事件广播,suspendEvents方法后使用。 + */ + public void resumeEvents() { + suspend = false; + } + + /** + * 触发事件广播 + * @param anEvent + * @return + */ + protected boolean fireEvent(E anEvent) { + if (eventIntercept(anEvent) == false) { + return false; + } + if (interceptors.size() > 0) { + for (int i = interceptors.size() - 1; i >= 0; i--) { + InterceptorInterface interceptor = interceptors.get(i); + if (interceptor.intercept(anEvent) == false) { + return false; + } + } + } + if (!suspend) { + EventSource es = null; + synchronized (eventSources) { + es = eventSources.get(anEvent.getClass()); + } + if (es != null) { + return es.fire(anEvent); + } + } + return true; + } + + /** + * 添加一种事件 + * @param clazz 事件类型 + */ + protected void addEvent(Class clazz) { + EventSource es = eventSources.get(clazz); + if (es == null) { + synchronized (eventSources) { + eventSources.put(clazz, new EventSource()); + } + } + } + + /** + * 删除一种事件及其所有侦听 + * @param clazz 事件类型 + */ + protected void removeEvent(Class clazz) { + synchronized (eventSources) { + EventSource es = eventSources.get(clazz); + if (es != null) { + es.removeAllListeners(); + } + eventSources.remove(clazz); + } + } + + /** + * 删除所有事件及所有侦听 + */ + protected void removeAllEvent() { + synchronized (eventSources) { + for (Class esn : eventSources.keySet()) { + EventSource es = eventSources.get(esn); + if (es != null) { + es.removeAllListeners(); + } + } + eventSources.clear(); + } + } + + /** + * 为事件增加侦听 + * @param clazz + * @param aListener + */ + public void addListener(Class clazz, L aListener) { + EventSource es = eventSources.get(clazz); + if (es != null) { + es.addListener(aListener); + } + } + + /** + * 删除事件的某个侦听 + * @param clazz + * @param aListener + */ + public void removeListener(Class clazz, L aListener) { + EventSource es = eventSources.get(clazz); + if (es != null) { + es.removeListener(aListener); + } + } + + /** + * 删除事件的所有侦听 + * @param clazz + */ + public void removeListener(Class clazz) { + EventSource es = eventSources.get(clazz); + if (es != null) { + es.removeAllListeners(); + } + } + + /** + * 删除所有侦听 + */ + public void removeAllListener() { + synchronized (eventSources) { + for (Class esn : eventSources.keySet()) { + EventSource es = eventSources.get(esn); + if (es != null) { + es.removeAllListeners(); + } + } + } + } + + /** + * 获取事件的所有侦听 + * @param clazz + * @return 未找到返回null + */ + public List getListeners(Class clazz) { + EventSource es = eventSources.get(clazz); + if (es != null) { + return es.getListeners(); + } else { + return new ArrayList(0); + } + } + + /** + * 获取事件的事件源对象 + * @param clazz + * @return 未找到返回null + */ + public EventSource getEventSource(Class clazz) { + return eventSources.get(clazz); + } + + /** + * 获取所有事件源 + * @return 未找到返回空列表 + */ + public List> getAllEventSource() { + List> result = new ArrayList>(); + for (Class esn : eventSources.keySet()) { + EventSource es = eventSources.get(esn); + result.add(es); + } + return result; + } + + public void destroy() { + this.removeAllEvent(); + eventSources = null; + interceptors.clear(); + interceptors = null; + } + +} diff --git a/.svn/pristine/f3/f31b6dae955e8744052c3a2c14c7bda20f6105ee.svn-base b/.svn/pristine/f3/f31b6dae955e8744052c3a2c14c7bda20f6105ee.svn-base new file mode 100644 index 0000000..e1f5e3c Binary files /dev/null and b/.svn/pristine/f3/f31b6dae955e8744052c3a2c14c7bda20f6105ee.svn-base differ diff --git a/.svn/pristine/f5/f5c330d903c2508c369bd11a5a868ed7397b980e.svn-base b/.svn/pristine/f5/f5c330d903c2508c369bd11a5a868ed7397b980e.svn-base new file mode 100644 index 0000000..99f7993 Binary files /dev/null and b/.svn/pristine/f5/f5c330d903c2508c369bd11a5a868ed7397b980e.svn-base differ diff --git a/.svn/pristine/f5/f5f3dfd0f0d8317bc6114f0b00ba11284ef1f430.svn-base b/.svn/pristine/f5/f5f3dfd0f0d8317bc6114f0b00ba11284ef1f430.svn-base new file mode 100644 index 0000000..101118b Binary files /dev/null and b/.svn/pristine/f5/f5f3dfd0f0d8317bc6114f0b00ba11284ef1f430.svn-base differ diff --git a/.svn/pristine/f6/f6ce3191278e715bcb4b9eb92ec0565ee6b3e511.svn-base b/.svn/pristine/f6/f6ce3191278e715bcb4b9eb92ec0565ee6b3e511.svn-base new file mode 100644 index 0000000..7b3d725 Binary files /dev/null and b/.svn/pristine/f6/f6ce3191278e715bcb4b9eb92ec0565ee6b3e511.svn-base differ diff --git a/.svn/pristine/f6/f6e7f23427b23f55253d1e53293797e97bcf40a8.svn-base b/.svn/pristine/f6/f6e7f23427b23f55253d1e53293797e97bcf40a8.svn-base new file mode 100644 index 0000000..06eefb2 --- /dev/null +++ b/.svn/pristine/f6/f6e7f23427b23f55253d1e53293797e97bcf40a8.svn-base @@ -0,0 +1,14 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.event; + +/** + * 子事件类型 + */ + +public class SubEventType { + +} diff --git a/.svn/pristine/f6/f6f0b1a8bbda3a4e517629a5de973897a71d9c17.svn-base b/.svn/pristine/f6/f6f0b1a8bbda3a4e517629a5de973897a71d9c17.svn-base new file mode 100644 index 0000000..c18f9e3 Binary files /dev/null and b/.svn/pristine/f6/f6f0b1a8bbda3a4e517629a5de973897a71d9c17.svn-base differ diff --git a/.svn/pristine/f8/f827bfa170834465fce9a1f431f91bd5d10e16ef.svn-base b/.svn/pristine/f8/f827bfa170834465fce9a1f431f91bd5d10e16ef.svn-base new file mode 100644 index 0000000..239cf36 --- /dev/null +++ b/.svn/pristine/f8/f827bfa170834465fce9a1f431f91bd5d10e16ef.svn-base @@ -0,0 +1,48 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.demo.talker; + +import java.util.HashMap; +import java.util.Map; + +/** + * 应用全局存储 + * @author jinghai.xiao@gmail.com + * @date 2011-2-25 + */ + +public class AppStore { + + private static Map map; + private static AppStore instance; + + public static AppStore getInstance() { + + if (instance == null) { + instance = new AppStore(); + map = new HashMap(); + } + return instance; + } + + public void put(String key, String value) { + map.put(key, value); + } + + public String get(String key) { + return map.get(key); + } + + public Map getMap() { + return map; + } + + public void destroy() { + map.clear(); + map = null; + } + +} diff --git a/.svn/pristine/f9/f9339b1f0c79e23e591fb9a68bcb531dd05673d8.svn-base b/.svn/pristine/f9/f9339b1f0c79e23e591fb9a68bcb531dd05673d8.svn-base new file mode 100644 index 0000000..1dfe9a6 Binary files /dev/null and b/.svn/pristine/f9/f9339b1f0c79e23e591fb9a68bcb531dd05673d8.svn-base differ diff --git a/.svn/pristine/f9/f941de9703bf2b234b99e4a6f6d572db574e41de.svn-base b/.svn/pristine/f9/f941de9703bf2b234b99e4a6f6d572db574e41de.svn-base new file mode 100644 index 0000000..e1677f9 --- /dev/null +++ b/.svn/pristine/f9/f941de9703bf2b234b99e4a6f6d572db574e41de.svn-base @@ -0,0 +1,71 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.dto; + +import java.util.List; + +/** + * 连接成功后所发送的数据对象 + */ +public class ConnectionDTO { + + public ConnectionDTO(String cId, String ws, List channels, int timeout) { + this.cId = cId; + this.ws = ws; + this.channels = channels; + this.timeout = timeout; + } + + /** + * 连接ID + */ + private String cId; + /** + * 工作模式workStyle + */ + private String ws; + /** + * 应用模块列表appModuesList + */ + private List channels; + /** + * 服务器超时时间 + */ + private int timeout; + + public String getcId() { + return cId; + } + + public void setcId(String cId) { + this.cId = cId; + } + + public List getChannels() { + return channels; + } + + public void setChannels(List channels) { + this.channels = channels; + } + + public String getWs() { + return ws; + } + + public void setWs(String ws) { + this.ws = ws; + } + + public int getTimeout() { + return timeout; + } + + public void setTimeout(int timeout) { + this.timeout = timeout; + } + +} diff --git a/.svn/pristine/f9/f97079f5636d90f7946cf382358ad507f262828a.svn-base b/.svn/pristine/f9/f97079f5636d90f7946cf382358ad507f262828a.svn-base new file mode 100644 index 0000000..46352bd --- /dev/null +++ b/.svn/pristine/f9/f97079f5636d90f7946cf382358ad507f262828a.svn-base @@ -0,0 +1,296 @@ +var statebar, toolbar, logbox, inputbox, lastTalkId, totalMemoryDom, freeMemoryDom, maxMemoryDom, usedMemoryDom, connectorCountDom, startupDom, workStyleDom, maxLogCount = 100,loginDom; +var isFocus = true,unreadCount = 0,dTitle="ChatDemo"; +function windowOnFocus(){ + isFocus = true; + unreadCount = 0; + document.title = dTitle; +} +function windowOnBlur(){ + isFocus = false; +} +function windowResize() { + var offset = 2; + var other = statebar.offsetHeight + toolbar.offsetHeight + offset; + logbox.style.height = document.documentElement.clientHeight - other + 'px'; +} +function loginEnter(event){ + if (event.keyCode == 13) { + login(); + return false; + } +} +function showLogin(){ + statebar.style.display = 'none'; + toolbar.style.display = 'none'; + logbox.style.display = 'none'; + loginDom.style.display = 'block'; + loginDom.style.height = document.documentElement.clientHeight + 'px'; + document.getElementById("loginName").focus(); +} +function login(callback){ + var userName = document.getElementById("loginName").value; + userName = userName ? userName.trim() : '' ; + if(!userName){ + alert('非法昵称,请重新输入'); + document.getElementById("loginName").fucos(); + return; + } + setCookie('userName',userName, 365); + loginDom.style.display = 'none'; + statebar.style.display = 'block'; + toolbar.style.display = 'block'; + logbox.style.display = 'block'; + start(); +} +function init() { + statebar = document.getElementById("statebar"); + toolbar = document.getElementById("toolbar"); + logbox = document.getElementById("logbox"); + inputbox = document.getElementById("inputbox"); + totalMemoryDom = document.getElementById("totalMemory"); + freeMemoryDom = document.getElementById("freeMemory"); + maxMemoryDom = document.getElementById("maxMemory"); + usedMemoryDom = document.getElementById("usedMemory"); + connectorCountDom = document.getElementById("connectorCount"); + workStyleDom = document.getElementById("workStyle"); + startupDom = document.getElementById("startup"); + loginDom = document.getElementById("login"); + windowResize(); + JS.on(window,'resize',windowResize); + JS.on(window,'focus',windowOnFocus); + JS.on(window,'blur',windowOnBlur); + + // 引擎事件绑定 + JS.Engine.on({ + start : function(cId, channels, engine) { + var style = engine.getConnector().workStyle; + style = style === 'stream'?'长连接':'长轮询'; + workStyleDom.innerHTML = style; + }, + stop : function(cause, url, cId, engine) { + workStyleDom.innerHTML = '已停止(重连)'; + }, + talker : function(data, timespan, engine) { + switch (data.type) { + case 'rename': // 改名 + onRename(data, timespan); + break; + case 'talk': // 收到聊天消息 + onMessage(data, timespan); + break; + case 'up': // 上线 + onJoin(data, timespan); + break; + case 'down': // 下线 + onLeft(data, timespan); + break; + case 'health': + onHealthMessage(data, timespan); + break; + default: + } + } + }); + + var userName = getCookie('userName') || ''; + userName = userName ? userName.trim() : '' ; + if(userName){ + start(); + }else{ + showLogin(); + } +} +//开启连接 +function start(){ + JS.Engine.start('conn'); + inputbox.focus(); +} +// 用户改名通知 +function onRename(data, timespan) { + var id = data.id; + var newName = data.newName || ''; + newName = newName.HTMLEncode(); + var oldName = data.oldName || ''; + oldName = oldName.HTMLEncode(); + var t = data.transtime; + var str = [ '
    ', t, '【', oldName, '】改名为【', + newName, '】
    ' ]; + checkLogCount(); + logbox.innerHTML += str.join(''); + lastTalkId = null; + moveScroll(); +} +// 用户聊天通知 +function onMessage(data, timespan) { + if(!isFocus){ + unreadCount++; + document.title = '('+unreadCount+')'+dTitle; + } + var id = data.id; + var name = data.name || ''; + name = name.HTMLEncode(); + var text = data.text || ''; + text = text.HTMLEncode(); + var t = data.transtime; + var str; + if (lastTalkId == id) { + str = [ '
    ', '
    ', text, + '
    ', '
    ' ]; + } else { + str = [ '
    ', t, '【', + name, '】
    ', text, '
    ', '
    ' ]; + } + checkLogCount(); + logbox.innerHTML += str.join(''); + lastTalkId = id; + moveScroll(); +} +// 用户上线通知 +function onJoin(data, timespan) { + if(!isFocus){ + unreadCount++; + document.title = '('+unreadCount+')'+dTitle; + } + var id = data.id; + var name = data.name || id; + name = name.HTMLEncode(); + var t = data.transtime; + var str = [ + '
    ', + t, + '【', + name, + '】来了,欢迎体验 Comet For Java', + '
    ' ]; + checkLogCount(); + logbox.innerHTML += str.join(''); + lastTalkId = null; + moveScroll(); +} +// 用户下线通知 +function onLeft(data, timespan) { + var id = data.id; + var name = data.name || id; + name = name.HTMLEncode(); + var t = data.transtime; + var str = [ '
    ', t, '【', name, '】离开了', + '
    ' ]; + checkLogCount(); + logbox.innerHTML += str.join(''); + lastTalkId = null; + moveScroll(); +} +// 系统健康信息 +function onHealthMessage(data, timespan) { + var totalMemory = data.totalMemory; + var freeMemory = data.freeMemory; + var maxMemory = data.maxMemory; + var usedMemory = data.usedMemory; + var startup = data.startup; + var connectorCount = data.connectorCount + '个'; + totalMemoryDom.innerHTML = totalMemory + 'M'; + freeMemoryDom.innerHTML = freeMemory + 'M'; + maxMemoryDom.innerHTML = maxMemory + 'M'; + usedMemoryDom.innerHTML = usedMemory + 'M'; + connectorCountDom.innerHTML = connectorCount; + startupDom.innerHTML = startup; +} + +// 检测输出长度 +function checkLogCount() { + var count = logbox.childNodes.length; + if (count > maxLogCount) { + var c = count - maxLogCount; + for ( var i = 0; i < c; i++) { + // logbox.removeChild(logbox.children[0]); + logbox.removeChild(logbox.firstChild); + } + + } +} +// 移动滚动条 +function moveScroll() { + logbox.scrollTop = logbox.scrollHeight; + inputbox.focus(); +} +// 回车事件 +function onSendBoxEnter(event) { + if (event.keyCode == 13) { + var text = inputbox.value; + send(text); + return false; + } +} +// 发送聊天信息动作 +function send(text) { + if (!JS.Engine.running) + return; + text = text.trim(); + if (!text) + return; + var id = JS.Engine.getId(); + var param = "id=" + id + '&text=' + encodeURIComponent(text); + JS.AJAX.post('talk.do?cmd=talk', param, function() { + inputbox.value = ''; + }); +} +// 改名动作 +function rename() { + if (!JS.Engine.running) + return; + var oldName = getCookie('userName') || ''; + oldName = oldName.trim(); + var userName = prompt("请输入姓名", oldName); + userName = userName ? userName.trim() : ''; + var id = JS.Engine.getId(); + if (!id || !userName || oldName == userName) + return; + var param = "id=" + id + '&newName=' + encodeURIComponent(userName) + + '&oldName=' + encodeURIComponent(oldName); + setCookie('userName', userName, 365); + JS.AJAX.post('talk.do?cmd=rename', param); +} + +// 设置Cookie +function setCookie(name, value, expireDay) { + var exp = new Date(); + exp.setTime(exp.getTime() + expireDay * 24 * 60 * 60 * 1000); + document.cookie = name + "=" + encodeURIComponent(value) + ";expires=" + + exp.toGMTString(); +} +// 获得Cookie +function getCookie(name) { + var arr = document.cookie + .match(new RegExp("(^| )" + name + "=([^;]*)(;|$)")); + if (arr != null) + return decodeURIComponent(arr[2]); + return null; +} +// 删除Cookie +function delCookie(name) { + var exp = new Date(); + exp.setTime(exp.getTime() - 1); + var cval = getCookie(name); + if (cval != null) + document.cookie = name + "=" + cval + ";expires=" + exp.toGMTString(); +} +// HTML编码 +String.prototype.HTMLEncode = function() { + var temp = document.createElement("div"); + (temp.textContent != null) ? (temp.textContent = this) + : (temp.innerText = this); + var output = temp.innerHTML; + temp = null; + return output; +}; +// HTML解码 +String.prototype.HTMLDecode = function() { + var temp = document.createElement("div"); + temp.innerHTML = this; + var output = temp.innerText || temp.textContent; + temp = null; + return output; +}; +String.prototype.trim = function() { + return this.replace(/^\s+|\s+$/g, ''); +}; \ No newline at end of file diff --git a/.svn/pristine/f9/f9958b09b1b8ed0e2d11352f8e047d73e2b58223.svn-base b/.svn/pristine/f9/f9958b09b1b8ed0e2d11352f8e047d73e2b58223.svn-base new file mode 100644 index 0000000..8b81e7f Binary files /dev/null and b/.svn/pristine/f9/f9958b09b1b8ed0e2d11352f8e047d73e2b58223.svn-base differ diff --git a/.svn/pristine/f9/f9b4cc2632c6af32d84cac7d7f90a92ecd6bc2e4.svn-base b/.svn/pristine/f9/f9b4cc2632c6af32d84cac7d7f90a92ecd6bc2e4.svn-base new file mode 100644 index 0000000..d6075bb Binary files /dev/null and b/.svn/pristine/f9/f9b4cc2632c6af32d84cac7d7f90a92ecd6bc2e4.svn-base differ diff --git a/.svn/pristine/f9/f9f10a39cd9bdb0c7c1d67941c13035e30c78bfb.svn-base b/.svn/pristine/f9/f9f10a39cd9bdb0c7c1d67941c13035e30c78bfb.svn-base new file mode 100644 index 0000000..775bb18 --- /dev/null +++ b/.svn/pristine/f9/f9f10a39cd9bdb0c7c1d67941c13035e30c78bfb.svn-base @@ -0,0 +1,6 @@ +package org.comet4j.demo.eventmonitor; + +public class Constant { + + public static final String AppChannel = "emonitor"; +} diff --git a/.svn/pristine/fa/faeabca80c82a495d73685bfb1cf05750766efc4.svn-base b/.svn/pristine/fa/faeabca80c82a495d73685bfb1cf05750766efc4.svn-base new file mode 100644 index 0000000..2cba1da --- /dev/null +++ b/.svn/pristine/fa/faeabca80c82a495d73685bfb1cf05750766efc4.svn-base @@ -0,0 +1,60 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.event; + +/** + * 事件发生时所携带的相关数据 + * @author xiaojinghai@kedacom.com + */ +@SuppressWarnings("rawtypes") +public class Event { + + private boolean stoped = false; + private boolean preventDefault = false; + private O target; + + public Event(O target) { + this.target = target; + } + + /** + * 停止事件运行
    + * 立即停止事件发出者的行为函数,用于在事件处理过程中终止事件发出者的动作, 用于在动作发生之前结束动作,避免动作的发生。
    + * 注意:只能在动作发出前进行终止,例如:BeforeGo等此类事件中应用。 + */ + public void stopEvent() { + stoped = true; + } + + /** + * 停止事件传播
    + * 调用后,此将不再传播给其它侦听,防止此事件再被其它侦听函数所处理
    + * 注意:后加入侦听的函数,在事件触发时会先执行。 + */ + public void preventDefault() { + preventDefault = true; + } + + public boolean hasStoped() { + return stoped; + } + + public boolean hasPreventDefault() { + return preventDefault; + } + + /** + * 获取事件的发出者 + * @return + */ + public O getTarget() { + return target; + } + + public void destroy() { + target = null; + } +} diff --git a/.svn/pristine/fb/fb27f031501ff6cc8d5d12fbd9df526045c87fc7.svn-base b/.svn/pristine/fb/fb27f031501ff6cc8d5d12fbd9df526045c87fc7.svn-base new file mode 100644 index 0000000..9d9c6a9 Binary files /dev/null and b/.svn/pristine/fb/fb27f031501ff6cc8d5d12fbd9df526045c87fc7.svn-base differ diff --git a/.svn/pristine/fb/fb58d80f6a9c800d63b9842363e00085d8c8f2f9.svn-base b/.svn/pristine/fb/fb58d80f6a9c800d63b9842363e00085d8c8f2f9.svn-base new file mode 100644 index 0000000..71139cb Binary files /dev/null and b/.svn/pristine/fb/fb58d80f6a9c800d63b9842363e00085d8c8f2f9.svn-base differ diff --git a/.svn/pristine/fb/fbe3e775eee3fec2394e16a39998a3955e1aba92.svn-base b/.svn/pristine/fb/fbe3e775eee3fec2394e16a39998a3955e1aba92.svn-base new file mode 100644 index 0000000..763d73e --- /dev/null +++ b/.svn/pristine/fb/fbe3e775eee3fec2394e16a39998a3955e1aba92.svn-base @@ -0,0 +1,17 @@ + + + comet4j-js + + + + + + org.eclipse.wst.jsdt.core.javascriptValidator + + + + + + org.eclipse.wst.jsdt.core.jsNature + + diff --git a/.svn/pristine/fc/fcc281d5853194df84cdbf6080911cb00eae08c0.svn-base b/.svn/pristine/fc/fcc281d5853194df84cdbf6080911cb00eae08c0.svn-base new file mode 100644 index 0000000..a38a1e4 --- /dev/null +++ b/.svn/pristine/fc/fcc281d5853194df84cdbf6080911cb00eae08c0.svn-base @@ -0,0 +1,30 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.exception; + +/** + * Comet4J异常 + */ + +public class CometException extends RuntimeException { + + private static final long serialVersionUID = 3048792398595051727L; + private Throwable cause; + + public CometException(String message) { + super(message); + } + + public CometException(Throwable t) { + super(t.getMessage()); + this.cause = t; + } + + @Override + public Throwable getCause() { + return this.cause; + } +} diff --git a/.svn/pristine/fd/fd01cae7ade53478a90b49787d262c104f542d2c.svn-base b/.svn/pristine/fd/fd01cae7ade53478a90b49787d262c104f542d2c.svn-base new file mode 100644 index 0000000..8ebfad5 --- /dev/null +++ b/.svn/pristine/fd/fd01cae7ade53478a90b49787d262c104f542d2c.svn-base @@ -0,0 +1,49 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.temp; + +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * Servlet implementation class CometServlet + */ +public class CometServlet extends HttpServlet { + + private static final long serialVersionUID = 1L; + + /** + * @see HttpServlet#HttpServlet() + */ + public CometServlet() { + super(); + // TODO Auto-generated constructor stub + } + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse + * response) + */ + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + // TODO Auto-generated method stub + } + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse + * response) + */ + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, + IOException { + // TODO Auto-generated method stub + } + +} diff --git a/.svn/pristine/fe/fe064eee5889f5b47179f9820e89a33785dd3226.svn-base b/.svn/pristine/fe/fe064eee5889f5b47179f9820e89a33785dd3226.svn-base new file mode 100644 index 0000000..34db47c Binary files /dev/null and b/.svn/pristine/fe/fe064eee5889f5b47179f9820e89a33785dd3226.svn-base differ diff --git a/.svn/pristine/fe/fe9f082b280075685622590d9ac138b9f49b8238.svn-base b/.svn/pristine/fe/fe9f082b280075685622590d9ac138b9f49b8238.svn-base new file mode 100644 index 0000000..fef2256 --- /dev/null +++ b/.svn/pristine/fe/fe9f082b280075685622590d9ac138b9f49b8238.svn-base @@ -0,0 +1,45 @@ + + + + + + Docs.classData ={"id":"apidocs","iconCls":"icon-docs","text":"API Documentation","singleClickExpand":true,"children":[]}; + Docs.icons = { + + + + icon-static + icon-cmp + icon-cls + + + "":"" + , + }; + + + + + {"id":"pkg-","text":"","iconCls":"icon-pkg","cls":"package","singleClickExpand":true, children:[]} + , + + , + + + + icon-static + icon-cmp + icon-cls + + + {"href":"output/.html","text":"","id":"","isClass":true,"iconCls":"","cls":"cls","leaf":true} + , + + + + + + + + + diff --git a/.svn/pristine/fe/fef4c1024cf8b9f6f9388427ad535ec854aa6942.svn-base b/.svn/pristine/fe/fef4c1024cf8b9f6f9388427ad535ec854aa6942.svn-base new file mode 100644 index 0000000..ae5d388 --- /dev/null +++ b/.svn/pristine/fe/fef4c1024cf8b9f6f9388427ad535ec854aa6942.svn-base @@ -0,0 +1,163 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core; + +import java.util.UUID; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.comet4j.core.util.ExplorerUtil; +import org.comet4j.core.util.NetUtil; + +/** + * Comet连接,负责构造一个连接的实例 + */ + +public class CometConnection { + + private final String id; + + private final String clientIp; + + private final String clientVersion; + + private String workStyle; + + private String state = CometProtocol.STATE_ALIVE; + + private long dyingTime = 0L; // 连接超时后会进入dying(濒死)状态,此时间指进入dying状态的起始时间 + + private HttpServletRequest request; + + private HttpServletResponse response; + + public CometConnection(HttpServletRequest anRequest, HttpServletResponse anResponse) { + clientIp = NetUtil.getIpAddr(anRequest); + clientVersion = anRequest.getParameter(CometProtocol.FLAG_CLIENTVERSION); + if (CometContext.getInstance().getWorkStyle().equals(CometProtocol.WORKSTYLE_AUTO)) { + if (ExplorerUtil.canStreamingXHR(anRequest)) { + workStyle = CometProtocol.WORKSTYLE_STREAM; + } else { + workStyle = CometProtocol.WORKSTYLE_LLOOP; + } + } else { + workStyle = CometContext.getInstance().getWorkStyle(); + } + request = anRequest; + response = anResponse; + id = UUID.randomUUID().toString(); + } + + /** + * 获得连接ID + * @return + */ + + public String getId() { + return id; + } + + /** + * 获得客户端IP + * @return + */ + + public String getClientIp() { + return clientIp; + } + + /** + * 获得Comet客户端版本号 + * @return + */ + + public String getClientVersion() { + return clientVersion; + } + + /** + * 获得连接实际的工作模式,CometProtocol.WORKSTYLE_STREAM或CometProtocol.WORKSTYLE_LLOOP + * @return + */ + + public String getWorkStyle() { + return workStyle; + } + + /** + * 获得连接状态,CometProtocol.STATE_ALIVE或CometProtocol.STATE_DYING + * @return + */ + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + /** + * 获得连接最近一次转入CometProtocol.STATE_DYING状态的时间截 + * @return + */ + + public long getDyingTime() { + return dyingTime; + } + + /** + * 设置连接最近一次转入CometProtocol.STATE_DYING状态的时间截 + * @param dyingTime + */ + + public void setDyingTime(long dyingTime) { + this.dyingTime = dyingTime; + } + + /** + * 获取连接的Request对象 + * @return + */ + + public HttpServletRequest getRequest() { + return request; + } + + /** + * 设置连接的Request对象 + * @param request + */ + + public void setRequest(HttpServletRequest request) { + this.request = request; + } + + /** + * 获取连接的Response对象 + * @return + */ + + public HttpServletResponse getResponse() { + return response; + } + + /** + * 设置连接的Response对象 + * @param response + */ + + public void setResponse(HttpServletResponse response) { + this.response = response; + } + + public void destroy() { + this.request = null; + this.response = null; + } + +} diff --git a/.svn/pristine/ff/ff03c3825f1023aaaff238075020fe9da4eed5f0.svn-base b/.svn/pristine/ff/ff03c3825f1023aaaff238075020fe9da4eed5f0.svn-base new file mode 100644 index 0000000..578ffb6 Binary files /dev/null and b/.svn/pristine/ff/ff03c3825f1023aaaff238075020fe9da4eed5f0.svn-base differ diff --git a/.svn/pristine/ff/ff66a6bc39aba2e9c4207061842171171665a608.svn-base b/.svn/pristine/ff/ff66a6bc39aba2e9c4207061842171171665a608.svn-base new file mode 100644 index 0000000..307f3bb --- /dev/null +++ b/.svn/pristine/ff/ff66a6bc39aba2e9c4207061842171171665a608.svn-base @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/.svn/pristine/ff/ff9aea316e2affca4bd0154234612433e85a765f.svn-base b/.svn/pristine/ff/ff9aea316e2affca4bd0154234612433e85a765f.svn-base new file mode 100644 index 0000000..360d693 --- /dev/null +++ b/.svn/pristine/ff/ff9aea316e2affca4bd0154234612433e85a765f.svn-base @@ -0,0 +1,16 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.listener; + +import org.comet4j.core.event.ConnectEvent; +import org.comet4j.event.Listener; + +/** + * 连接事件侦听抽象类 + */ +public abstract class ConnectListener extends Listener { + +} diff --git a/.svn/wc.db b/.svn/wc.db new file mode 100644 index 0000000..9a7fb8d Binary files /dev/null and b/.svn/wc.db differ diff --git a/comet4j-demo/.classpath b/comet4j-demo/.classpath new file mode 100644 index 0000000..9835150 --- /dev/null +++ b/comet4j-demo/.classpath @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/comet4j-demo/.project b/comet4j-demo/.project new file mode 100644 index 0000000..7de30a5 --- /dev/null +++ b/comet4j-demo/.project @@ -0,0 +1,42 @@ + + + comet4j-demo + + + + + + org.eclipse.wst.jsdt.core.javascriptValidator + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + org.maven.ide.eclipse.maven2Builder + + + + + + org.maven.ide.eclipse.maven2Nature + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.wst.common.project.facet.core.nature + org.eclipse.jdt.core.javanature + org.eclipse.wst.jsdt.core.jsNature + + diff --git a/comet4j-demo/.settings/.jsdtscope b/comet4j-demo/.settings/.jsdtscope new file mode 100644 index 0000000..3a28de0 --- /dev/null +++ b/comet4j-demo/.settings/.jsdtscope @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/comet4j-demo/.settings/org.eclipse.jdt.core.prefs b/comet4j-demo/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..813e84c --- /dev/null +++ b/comet4j-demo/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,9 @@ +#Tue Jul 26 19:43:14 GMT+08:00 2011 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/comet4j-demo/.settings/org.eclipse.wst.common.component b/comet4j-demo/.settings/org.eclipse.wst.common.component new file mode 100644 index 0000000..3ed5f24 --- /dev/null +++ b/comet4j-demo/.settings/org.eclipse.wst.common.component @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/comet4j-demo/.settings/org.eclipse.wst.common.project.facet.core.xml b/comet4j-demo/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100644 index 0000000..307f3bb --- /dev/null +++ b/comet4j-demo/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/comet4j-demo/.settings/org.eclipse.wst.jsdt.ui.superType.container b/comet4j-demo/.settings/org.eclipse.wst.jsdt.ui.superType.container new file mode 100644 index 0000000..3bd5d0a --- /dev/null +++ b/comet4j-demo/.settings/org.eclipse.wst.jsdt.ui.superType.container @@ -0,0 +1 @@ +org.eclipse.wst.jsdt.launching.baseBrowserLibrary \ No newline at end of file diff --git a/comet4j-demo/.settings/org.eclipse.wst.jsdt.ui.superType.name b/comet4j-demo/.settings/org.eclipse.wst.jsdt.ui.superType.name new file mode 100644 index 0000000..05bd71b --- /dev/null +++ b/comet4j-demo/.settings/org.eclipse.wst.jsdt.ui.superType.name @@ -0,0 +1 @@ +Window \ No newline at end of file diff --git a/comet4j-demo/RoadMap.txt b/comet4j-demo/RoadMap.txt new file mode 100644 index 0000000..fd2674e --- /dev/null +++ b/comet4j-demo/RoadMap.txt @@ -0,0 +1,13 @@ +V0.1.1 +新增: +窗体失去焦点下的新信息数量提示功能。 +与Google、sina、163等OpenId集成 +AirChat客户端Demo +文件上传插件 + +文档: +相关已有文档的更新wiki,cdoc,sdoc +Comet4J介绍(WEB即时通讯) +Comet4J Chat实例解析 +Comet4J与Spring应用整合 +Comet4J分布式架构建议 \ No newline at end of file diff --git a/comet4j-demo/WebContent/META-INF/MANIFEST.MF b/comet4j-demo/WebContent/META-INF/MANIFEST.MF new file mode 100644 index 0000000..254272e --- /dev/null +++ b/comet4j-demo/WebContent/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Class-Path: + diff --git a/comet4j-demo/WebContent/WEB-INF/lib/javamelody-1.26.0.jar b/comet4j-demo/WebContent/WEB-INF/lib/javamelody-1.26.0.jar new file mode 100644 index 0000000..41a66c2 Binary files /dev/null and b/comet4j-demo/WebContent/WEB-INF/lib/javamelody-1.26.0.jar differ diff --git a/comet4j-demo/WebContent/WEB-INF/lib/jira-javamelody-1.26.0.jar b/comet4j-demo/WebContent/WEB-INF/lib/jira-javamelody-1.26.0.jar new file mode 100644 index 0000000..b47bc98 Binary files /dev/null and b/comet4j-demo/WebContent/WEB-INF/lib/jira-javamelody-1.26.0.jar differ diff --git a/comet4j-demo/WebContent/WEB-INF/web.xml b/comet4j-demo/WebContent/WEB-INF/web.xml new file mode 100644 index 0000000..c9eed13 --- /dev/null +++ b/comet4j-demo/WebContent/WEB-INF/web.xml @@ -0,0 +1,120 @@ + + + + + Comet4J-Demo + + index.html + + + air + application/air + + + 编码过滤 + encodingfilter + org.comet4j.core.util.CharacterEncodingFilter + true + + encoding + utf-8 + + + + encodingfilter + /* + + + + + monitoring + net.bull.javamelody.MonitoringFilter + true + + + monitoring + /* + + + net.bull.javamelody.SessionListener + + + + + Comet4J容器侦听 + org.comet4j.core.CometAppListener + + + Comet连接 + CometServlet + CometServlet + org.comet4j.core.CometServletTomcat7 + true + + + CometServlet + /conn + + + + 语言[支持:zh,en,默认:zh,详细http://www.loc.gov/standards/iso639-2/php/English_list.php] + Comet.Language + zh + + + 请求超时时间/微妙[默认:60000,1分钟,建议至少设置3秒以上] + Comet.Timeout + 5000 + + + 连接空闲过期时间/微妙[默认:5000,5秒] + Comet.ConnExpires + 5000 + + + 连接检查频率/微妙[默认:5000,5秒] + Comet.ConnFrequency + 5000 + + + 缓存信息过期时间/微妙[默认:60000,1分种] + Comet.CacheExpires + 600000 + + + 缓存信息过期检查频率/微妙[默认:60000,1分种] + Comet.CacheFrequency + 60000 + + + 连接模式[auto(默认)/stream/lpool] + Comet.WorkStyle + auto + + + 开启调试[false(默认)/true] + Comet.Debug + false + + + + + + 简易聊天 + org.comet4j.demo.talker.AppInit + + + 简易聊天 + talk + talk + org.comet4j.demo.talker.WebServlet + + + talk + /talk.do + + + \ No newline at end of file diff --git a/comet4j-demo/WebContent/css/style.css b/comet4j-demo/WebContent/css/style.css new file mode 100644 index 0000000..e228aa5 --- /dev/null +++ b/comet4j-demo/WebContent/css/style.css @@ -0,0 +1,52 @@ +div{ +scrollbar-3dlight-color:aqua; +scrollbar-highlight-color:aqua; +scrollbar-face-color:black; +scrollbar-arrow-color:aqua; +scrollbar-shadow-color:aqua; +scrollbar-darkshadow-color:black; +scrollbar-base-color:black; +scrollbar-track-color:black; +} +body{ +color: aqua; background-color: #000000;margin:0px;padding:0px;overflow:hidden;height:100%;overflow-x:hidden; overflow-y:hidden; +} +a { +color:orange; +} +blockquote{ +line-height:20px; +} +#logbox{ +width:100%;overflow:auto;overflow-x: hidden; overflow-y: auto;word-break: break-all; +} +#statebar{ +border-bottom:1px aqua solid;vertical-align:middle;line-height:30px;color:aqua;text-align:center; +} +#toolbar{ +position:absolute;z-index:2;width:100%;padding-top:4px;padding-bottom:4px;bottom:0px; border-top:1px aqua solid;background:black;color:#00FFFF; +} +#login{ +display:none;position:absolute;left:0px;top:0px;width:100%;z-index:100;background:black; +} +.user{ +color:aqua; +} +.sysmessage{ +color: #666666; +} +.usermessage{ +color:silver; +} +.usermessage blockquote{ +margin:0px;margin-left:50px;padding:0px; +} +.inputbox{ +margin-bottom:4px;color:white;background:transparent;font-size:25px;vertical-align:middle;line-height:25px;height:30px;width:80%;left:1px;right:50px;top:0px;border:0px;border-bottom:1px aqua solid; +} +.button{ +margin-top:20px;border:1px aqua solid;color:white;background:transparent;vertical-align:middle;line-height:25px;height:30px; +} +.warning { +color:red; +} \ No newline at end of file diff --git a/comet4j-demo/WebContent/index.html b/comet4j-demo/WebContent/index.html new file mode 100644 index 0000000..6fdfd5e --- /dev/null +++ b/comet4j-demo/WebContent/index.html @@ -0,0 +1,39 @@ + + + + + + +ChatDemo + + + + + + +
    +连接状态:; +连接数量:; +已用内存:; +可用内存:; +内存容量:; +最大容量:; +系统已运行: +
    + +
    +
    + +
    +请输入: + + +
    + +
    + 请输入昵称: + +
    + + + diff --git a/comet4j-demo/WebContent/js/chat.js b/comet4j-demo/WebContent/js/chat.js new file mode 100644 index 0000000..46352bd --- /dev/null +++ b/comet4j-demo/WebContent/js/chat.js @@ -0,0 +1,296 @@ +var statebar, toolbar, logbox, inputbox, lastTalkId, totalMemoryDom, freeMemoryDom, maxMemoryDom, usedMemoryDom, connectorCountDom, startupDom, workStyleDom, maxLogCount = 100,loginDom; +var isFocus = true,unreadCount = 0,dTitle="ChatDemo"; +function windowOnFocus(){ + isFocus = true; + unreadCount = 0; + document.title = dTitle; +} +function windowOnBlur(){ + isFocus = false; +} +function windowResize() { + var offset = 2; + var other = statebar.offsetHeight + toolbar.offsetHeight + offset; + logbox.style.height = document.documentElement.clientHeight - other + 'px'; +} +function loginEnter(event){ + if (event.keyCode == 13) { + login(); + return false; + } +} +function showLogin(){ + statebar.style.display = 'none'; + toolbar.style.display = 'none'; + logbox.style.display = 'none'; + loginDom.style.display = 'block'; + loginDom.style.height = document.documentElement.clientHeight + 'px'; + document.getElementById("loginName").focus(); +} +function login(callback){ + var userName = document.getElementById("loginName").value; + userName = userName ? userName.trim() : '' ; + if(!userName){ + alert('非法昵称,请重新输入'); + document.getElementById("loginName").fucos(); + return; + } + setCookie('userName',userName, 365); + loginDom.style.display = 'none'; + statebar.style.display = 'block'; + toolbar.style.display = 'block'; + logbox.style.display = 'block'; + start(); +} +function init() { + statebar = document.getElementById("statebar"); + toolbar = document.getElementById("toolbar"); + logbox = document.getElementById("logbox"); + inputbox = document.getElementById("inputbox"); + totalMemoryDom = document.getElementById("totalMemory"); + freeMemoryDom = document.getElementById("freeMemory"); + maxMemoryDom = document.getElementById("maxMemory"); + usedMemoryDom = document.getElementById("usedMemory"); + connectorCountDom = document.getElementById("connectorCount"); + workStyleDom = document.getElementById("workStyle"); + startupDom = document.getElementById("startup"); + loginDom = document.getElementById("login"); + windowResize(); + JS.on(window,'resize',windowResize); + JS.on(window,'focus',windowOnFocus); + JS.on(window,'blur',windowOnBlur); + + // 引擎事件绑定 + JS.Engine.on({ + start : function(cId, channels, engine) { + var style = engine.getConnector().workStyle; + style = style === 'stream'?'长连接':'长轮询'; + workStyleDom.innerHTML = style; + }, + stop : function(cause, url, cId, engine) { + workStyleDom.innerHTML = '已停止(重连)'; + }, + talker : function(data, timespan, engine) { + switch (data.type) { + case 'rename': // 改名 + onRename(data, timespan); + break; + case 'talk': // 收到聊天消息 + onMessage(data, timespan); + break; + case 'up': // 上线 + onJoin(data, timespan); + break; + case 'down': // 下线 + onLeft(data, timespan); + break; + case 'health': + onHealthMessage(data, timespan); + break; + default: + } + } + }); + + var userName = getCookie('userName') || ''; + userName = userName ? userName.trim() : '' ; + if(userName){ + start(); + }else{ + showLogin(); + } +} +//开启连接 +function start(){ + JS.Engine.start('conn'); + inputbox.focus(); +} +// 用户改名通知 +function onRename(data, timespan) { + var id = data.id; + var newName = data.newName || ''; + newName = newName.HTMLEncode(); + var oldName = data.oldName || ''; + oldName = oldName.HTMLEncode(); + var t = data.transtime; + var str = [ '
    ', t, '【', oldName, '】改名为【', + newName, '】
    ' ]; + checkLogCount(); + logbox.innerHTML += str.join(''); + lastTalkId = null; + moveScroll(); +} +// 用户聊天通知 +function onMessage(data, timespan) { + if(!isFocus){ + unreadCount++; + document.title = '('+unreadCount+')'+dTitle; + } + var id = data.id; + var name = data.name || ''; + name = name.HTMLEncode(); + var text = data.text || ''; + text = text.HTMLEncode(); + var t = data.transtime; + var str; + if (lastTalkId == id) { + str = [ '
    ', '
    ', text, + '
    ', '
    ' ]; + } else { + str = [ '
    ', t, '【', + name, '】
    ', text, '
    ', '
    ' ]; + } + checkLogCount(); + logbox.innerHTML += str.join(''); + lastTalkId = id; + moveScroll(); +} +// 用户上线通知 +function onJoin(data, timespan) { + if(!isFocus){ + unreadCount++; + document.title = '('+unreadCount+')'+dTitle; + } + var id = data.id; + var name = data.name || id; + name = name.HTMLEncode(); + var t = data.transtime; + var str = [ + '
    ', + t, + '【', + name, + '】来了,欢迎体验 Comet For Java', + '
    ' ]; + checkLogCount(); + logbox.innerHTML += str.join(''); + lastTalkId = null; + moveScroll(); +} +// 用户下线通知 +function onLeft(data, timespan) { + var id = data.id; + var name = data.name || id; + name = name.HTMLEncode(); + var t = data.transtime; + var str = [ '
    ', t, '【', name, '】离开了', + '
    ' ]; + checkLogCount(); + logbox.innerHTML += str.join(''); + lastTalkId = null; + moveScroll(); +} +// 系统健康信息 +function onHealthMessage(data, timespan) { + var totalMemory = data.totalMemory; + var freeMemory = data.freeMemory; + var maxMemory = data.maxMemory; + var usedMemory = data.usedMemory; + var startup = data.startup; + var connectorCount = data.connectorCount + '个'; + totalMemoryDom.innerHTML = totalMemory + 'M'; + freeMemoryDom.innerHTML = freeMemory + 'M'; + maxMemoryDom.innerHTML = maxMemory + 'M'; + usedMemoryDom.innerHTML = usedMemory + 'M'; + connectorCountDom.innerHTML = connectorCount; + startupDom.innerHTML = startup; +} + +// 检测输出长度 +function checkLogCount() { + var count = logbox.childNodes.length; + if (count > maxLogCount) { + var c = count - maxLogCount; + for ( var i = 0; i < c; i++) { + // logbox.removeChild(logbox.children[0]); + logbox.removeChild(logbox.firstChild); + } + + } +} +// 移动滚动条 +function moveScroll() { + logbox.scrollTop = logbox.scrollHeight; + inputbox.focus(); +} +// 回车事件 +function onSendBoxEnter(event) { + if (event.keyCode == 13) { + var text = inputbox.value; + send(text); + return false; + } +} +// 发送聊天信息动作 +function send(text) { + if (!JS.Engine.running) + return; + text = text.trim(); + if (!text) + return; + var id = JS.Engine.getId(); + var param = "id=" + id + '&text=' + encodeURIComponent(text); + JS.AJAX.post('talk.do?cmd=talk', param, function() { + inputbox.value = ''; + }); +} +// 改名动作 +function rename() { + if (!JS.Engine.running) + return; + var oldName = getCookie('userName') || ''; + oldName = oldName.trim(); + var userName = prompt("请输入姓名", oldName); + userName = userName ? userName.trim() : ''; + var id = JS.Engine.getId(); + if (!id || !userName || oldName == userName) + return; + var param = "id=" + id + '&newName=' + encodeURIComponent(userName) + + '&oldName=' + encodeURIComponent(oldName); + setCookie('userName', userName, 365); + JS.AJAX.post('talk.do?cmd=rename', param); +} + +// 设置Cookie +function setCookie(name, value, expireDay) { + var exp = new Date(); + exp.setTime(exp.getTime() + expireDay * 24 * 60 * 60 * 1000); + document.cookie = name + "=" + encodeURIComponent(value) + ";expires=" + + exp.toGMTString(); +} +// 获得Cookie +function getCookie(name) { + var arr = document.cookie + .match(new RegExp("(^| )" + name + "=([^;]*)(;|$)")); + if (arr != null) + return decodeURIComponent(arr[2]); + return null; +} +// 删除Cookie +function delCookie(name) { + var exp = new Date(); + exp.setTime(exp.getTime() - 1); + var cval = getCookie(name); + if (cval != null) + document.cookie = name + "=" + cval + ";expires=" + exp.toGMTString(); +} +// HTML编码 +String.prototype.HTMLEncode = function() { + var temp = document.createElement("div"); + (temp.textContent != null) ? (temp.textContent = this) + : (temp.innerText = this); + var output = temp.innerHTML; + temp = null; + return output; +}; +// HTML解码 +String.prototype.HTMLDecode = function() { + var temp = document.createElement("div"); + temp.innerHTML = this; + var output = temp.innerText || temp.textContent; + temp = null; + return output; +}; +String.prototype.trim = function() { + return this.replace(/^\s+|\s+$/g, ''); +}; \ No newline at end of file diff --git a/comet4j-demo/WebContent/js/comet4j-0.1.7-debug.js b/comet4j-demo/WebContent/js/comet4j-0.1.7-debug.js new file mode 100644 index 0000000..3fc838f --- /dev/null +++ b/comet4j-demo/WebContent/js/comet4j-0.1.7-debug.js @@ -0,0 +1,1299 @@ +/* + * Comet4J JavaScript Client V0.1.7 + * Copyright(c) 2011, jinghai.xiao@gamil.com. + * http://code.google.com/p/comet4j/ + * This code is licensed under BSD license. Use it as you wish, + * but keep this copyright intact. + */ + + +var JS = { + version : '0.1.7' +}; + +JS.Runtime = (function(){ + var ua = navigator.userAgent.toLowerCase(), + check = function(r){ + return r.test(ua); + }, + + isOpera = check(/opera/), + + isFirefox = check(/firefox/), + + isChrome = check(/chrome/), + + isWebKit = check(/webkit/), + + isSafari = !isChrome && check(/safari/), + + isSafari2 = isSafari && check(/applewebkit\/4/), + + isSafari3 = isSafari && check(/version\/3/), + + isSafari4 = isSafari && check(/version\/4/), + + isIE = !isOpera && check(/msie/), + + isIE7 = isIE && check(/msie 7/), + + isIE8 = isIE && check(/msie 8/), + + isIE6 = isIE && !isIE7 && !isIE8, + + isGecko = !isWebKit && check(/gecko/), + + isGecko2 = isGecko && check(/rv:1\.8/), + + isGecko3 = isGecko && check(/rv:1\.9/), + + isWindows = check(/windows|win32/), + + isMac = check(/macintosh|mac os x/), + + isAir = check(/adobeair/), + + isLinux = check(/linux/); + return { + isOpera : isOpera, + isFirefox : isFirefox, + isChrome : isChrome, + isWebKit : isWebKit, + isSafari : isSafari, + isSafari2 : isSafari2, + isSafari3 : isSafari3, + isSafari4 : isSafari4, + isIE : isIE, + isIE7 : isIE7, + isIE8 : isIE8, + isIE6 : isIE6, + isGecko : isGecko, + isGecko2 : isGecko2, + isGecko3 : isGecko3, + isWindows :isWindows, + isMac : isMac, + isAir : isAir, + isLinux : isLinux + }; +}()); +JS.isOpera = JS.Runtime.isOpera; +JS.isFirefox = JS.Runtime.isFirefox; +JS.isChrome = JS.Runtime.isChrome; +JS.isWebKit = JS.Runtime.isWebKit; +JS.isSafari = JS.Runtime.isSafari; +JS.isSafari2 = JS.Runtime.isSafari2; +JS.isSafari3 = JS.Runtime.isSafari3; +JS.isSafari4 = JS.Runtime.isSafari4; +JS.isIE = JS.Runtime.isIE; +JS.isIE7 = JS.Runtime.isIE7; +JS.isIE8 = JS.Runtime.isIE8; +JS.isIE6 = JS.Runtime.isIE6; +JS.isGecko = JS.Runtime.isGecko; +JS.isGecko2 = JS.Runtime.isGecko2; +JS.isGecko3 = JS.Runtime.isGecko3; +JS.isWindows =JS.Runtime.isWindows; +JS.isMac = JS.Runtime.isMac; +JS.isAir = JS.Runtime.isAir; +JS.isLinux = JS.Runtime.isLinux; + +JS.Syntax = { + log : function(str){ + if(typeof console!="undefined"){ + console.log(str); + } + }, + nameSpace : function(){ + if(arguments.length){ + var o, d, v; + for(var i=0,len=arguments.length; i 0){ + for(var i=0, len=eventName.length; i -1; i--){//TODO:fix 倒序 + if(listeners[i].execute.apply(listeners[i],arguments) === false){ + return false; + } + } + return true; + }, + + addListener : function(fn, scope,o){ + scope = scope || this.caller; + if(this.hasListener(fn, scope) == -1){ + this.listeners.push(new JS.Listener(fn, scope ,o)); + } + }, + + removeListener : function(fn, scope){ + var index = this.hasListener(fn, scope); + if(index!=-1){ + this.listeners.splice(index, 1); + } + }, + + hasListener : function(fn, scope){ + var i = 0, + listeners = this.listeners, + len = listeners.length; + for(; i= 200 && this.status < 300)){ + this.fireEvent('progress', this, xhr); + } + + if(this.readyState == 4){ + this.cancelTimeout(); + var status = this.status ; + if(status == 0 || status == ""){ + this.fireEvent('error', this, xhr); + }else if(status >= 200 && status < 300){ + this.fireEvent('load', this, xhr); + }else if(status >= 400 && status != 408){ + this.fireEvent('error', this, xhr); + }else if(status == 408){ + this.fireEvent('timeout', this, xhr); + } + + } + this.onreadystatechange(); + }, + + onreadystatechange : function(){ + }, + //--------request-------- + + open : function(method, url, async, username, password){ + if(!url){ + return; + } + if(!this.enableCache){ + if(url.indexOf('?') != -1){ + url += '&ram='+Math.random(); + }else{ + url += '?ram='+Math.random(); + } + } + this._xhr.open(method, url, async, username, password); + }, + + send : function(content){ + this.delayTimeout(); + this.isAbort = false; + this._xhr.send(content); + }, + + abort : function(){ + this.isAbort = true; + this.cancelTimeout(); + this._xhr.abort(); + if(JS.isIE){//IE在abort后会清空侦听 + var self = this; + self._xhr.onreadystatechange = function(){ + self.doReadyStateChange(); + }; + } + this.fireEvent('abort',this,this._xhr); + }, + + setRequestHeader : function(header, value){ + this._xhr.setRequestHeader(header,value); + }, + //--------request-------- + + getResponseHeader : function(header){ + return this._xhr.getResponseHeader(header); + }, + + getAllResponseHeaders : function(){ + return this._xhr.getAllResponseHeaders(); + }, + + setTimeout : function(t){ + this.timeout = t; + } + +}); + +JS.ns("JS.AJAX"); + +JS.AJAX = (function(){ + var xhr = new JS.XMLHttpRequest(); + return { + dataFormatError : '服务器返回的数据格式有误', + urlError : '未指定url', + + post : function(url,param,callback,scope,asyn){ + if(typeof url!=='string'){ + throw new Error(this.urlError); + } + //默认为异步请求 + var asynchronous = true; + if(asyn===false){ + asynchronous = false; + } + xhr.onreadystatechange = function(){ + if(xhr.readyState==4 && asynchronous){ + JS.callBack(callback,scope,[xhr]); + } + }; + xhr.open('POST', url, asynchronous); + xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=UTF8"); + xhr.send(param || null); + if(!asynchronous){ + JS.callBack(callback,scope,[xhr]); + } + + }, + + get : function(url,param,callback,scope,asyn){ + if(typeof url!=='string'){ + throw new Error(this.urlError); + } + //默认为异步请求 + var asynchronous = true; + if(asyn===false){ + asynchronous = false; + } + xhr.onreadystatechange = function(){ + if(xhr.readyState==4 && asynchronous){ + JS.callBack(callback,scope,[xhr]); + } + }; + xhr.open('GET', url, asynchronous); + xhr.setRequestHeader("Content-Type","html/text;charset=UTF8"); + xhr.send(param || null); + if(!asynchronous){ + JS.callBack(callback,scope,[xhr]); + } + + }, + + getText : function(url,jsonData,callback,scope,asyn){ + this.get(url,jsonData,function(xhr){ + if(scope){ + callback.call(scope,xhr.responseText); + }else{ + callback(xhr.responseText); + } + },this,asyn); + }, + + getJson : function(url,jsonData,callback,scope,asyn){ + this.get(url,jsonData,function(xhr){ + var json = null; + try{ + json = eval("("+xhr.responseText+")"); + }catch(e){ + throw new Error(this.dataFormatError); + } + JS.callBack(callback,scope,[json]); + },this,asyn); + } + }; +})(); + +JS.ns("JS.Connector"); +JS.Connector = JS.extend(JS.Observable,{ + + version : JS.version, + SYSCHANNEL:'c4j', //协议常量 + + LLOOPSTYLE : 'lpool',//协议常量 + + STREAMSTYLE : 'stream',//协议常量 + CMDTAG : 'cmd', + + retryCount : 3, + + retryDelay : 1000, + currRetry : 0, + + url : '', + + param : '', + + revivalDelay : 100, + + cId : '', + + channels : [], + + workStyle : '', + emptyUrlError : 'URL为空', + runningError : '连接正在运行', + dataFormatError : '数据格式有误', + + running : false, + _xhr : null, + lastReceiveMessage : '', + constructor:function(){ + JS.Connector.superclass.constructor.apply(this,arguments); + this.addEvents([ + + 'beforeConnect', + + 'connect', + + 'beforeStop', + + 'stop', + + 'message', + + 'revival' + ]); + if(JS.isIE7){ + this._xhr = new JS.XMLHttpRequest({ + specialXHR : 'Msxml2.XMLHTTP.6.0' + }); + }else{ + this._xhr = new JS.XMLHttpRequest(); + } + //this._xhr.addListener('readyStateChange',this.onReadyStateChange,this); + + this._xhr.addListener('progress',this.doOnProgress,this); + this._xhr.addListener('load',this.doOnLoad,this); + this._xhr.addListener('error',this.doOnError,this); + this._xhr.addListener('timeout',this.doOnTimeout,this); + + this.addListener('beforeStop',this.doDrop,this); + JS.on(window,'beforeunload',this.doDrop,this); + + }, + //private + doDrop : function(url,cId,conn,xhr){ + if(!this.running || !this.cId){ + return; + } + try { + var xhr = new JS.XMLHttpRequest(); + var param = this.perfectParam(this.param); + var url = this.url + '?'+this.CMDTAG+'=drop&cid=' + this.cId + param; + xhr.open('GET', url, false); + xhr.send(null); + xhr = null; + }catch(e){}; + }, + //private distributed 派发服务器消息 + dispatchServerEvent : function(msg){ + this.fireEvent('message', msg.channel, msg.data, msg.time, this); + }, + //private 长连接信息转换 + translateStreamData : function(responseText){ + var str = responseText; + if(this.lastReceiveMessage && str){//剥离出接收到的数据 + str = str.split(this.lastReceiveMessage); + str = str.length ? str[str.length-1] : ""; + } + this.lastReceiveMessage = responseText; + return str; + }, + //private 消息解码 + decodeMessage : function(msg){ + var json = null; + if(JS.isString(msg) && msg!=""){ + //解析数据格式 + if(msg.charAt(0)=="<" ){ + msg = msg.substring(1,msg.length); + } + if(msg.charAt(msg.length-1)==">"){ + msg = msg.substring(0,msg.length-1); + } + msg = decodeURIComponent(msg); + try{ + json = eval("("+msg+")"); + }catch(e){ + this.stop('JSON转换异常'); + } + } + return json; + }, + //private + doOnProgress : function(xhr){ + if(this.workStyle === this.STREAMSTYLE){ + var str = this.translateStreamData(xhr.responseText); + var msglist = str.split(">"); + if(msglist.length > 0){ + for(var i=0, len=msglist.length; i this.retryCount){ + this.stop('服务器异常'); + }else{ + this.retryRevivalConnect(); + } + } + } + } + } + }, + //private + doOnLoad : function(xhr){ + if(this.workStyle === this.LLOOPSTYLE){ + var json = this.decodeMessage(xhr.responseText); + if(json){ + this.currRetry = 0; + this.dispatchServerEvent(json); + this.revivalConnect(); + }else{//非正常情况,状态为4,200并且还没有收到任何数据 + this.currRetry++; + if(this.currRetry > this.retryCount){ + this.stop('服务器异常'); + }else{ + this.retryRevivalConnect(); + } + } + } + }, + //private + doOnError : function(xhr){ + this.currRetry++; + if(this.currRetry > this.retryCount){ + this.stop('服务器异常'); + }else{ + this.retryRevivalConnect(); + } + + }, + //private + doOnTimeout : function(xhr){ + this.currRetry++; + if(this.currRetry > this.retryCount){ + this.stop('请求超时'); + }else{ + this.retryRevivalConnect(); + } + }, + //private + startConnect : function(url){ + if(this.running){ + var connXhr = new JS.XMLHttpRequest(); + connXhr.addListener('error',function(xhr){ + this.stop("连接时发生错误"); + },this); + connXhr.addListener('timeout',function(xhr){ + this.stop("连接超时"); + },this); + connXhr.addListener('load',function(xhr){ + var msg = this.decodeMessage(xhr.responseText); + if(!msg){ + this.stop('连接失败'); + return; + } + var data = msg.data; + this.cId = data.cId; + this.channels = data.channels; + this.workStyle = data.ws; + this._xhr.setTimeout(data.timeout + 1000); + this.fireEvent('connect', data.cId, data.channels, data.ws, data.timeout, this); + this.revivalConnect(); + },this); + connXhr.open('GET', url, true); + connXhr.send(null); + + } + }, + + //private 重试复活连接 + retryRevivalConnect : function(){ + var self = this; + if(this.running){ + setTimeout(function(){ + self.revivalConnect(); + },this.retryDelay); + } + }, + + //private + revivalConnect : function(){ + var self = this; + if(this.running){ + setTimeout(revival,this.revivalDelay); + } + function revival(){ + var xhr = self._xhr; + var param = self.perfectParam(self.param); + var url = self.url + '?'+self.CMDTAG+'=revival&cid=' + self.cId + param; + xhr.open('GET', url, true); + xhr.send(null); + self.fireEvent('revival',self.url, self.cId, self); + } + + }, + + start : function(url,param){ + if(this.running){ + return; + } + + this.url = url || this.url; + if(!this.url){ + throw new Error(this.emptyUrlError); + } + + if(this.fireEvent('beforeConnect', this.url, this) === false){ + return; + } + + this.param = param || this.param; + param = this.perfectParam(this.param); + var url = this.url+'?'+this.CMDTAG+'=conn&cv='+this.version+param; + + this.running = true; + this.currRetry = 0; + var self = this; + setTimeout(function(){ + self.startConnect(url); + },1000); + }, + // 完善参数 + perfectParam : function(param){ + if(param && JS.isString(param)){ + if(param.charAt(0) != '&'){ + param = '&'+param; + } + } + return param; + }, + + stop : function(cause){ + if(!this.running){ + return; + } + if(this.fireEvent('beforeStop',cause,this.cId, this.url, this) === false){ + return; + } + this.running = false; + var cId = this.cId; + this.cId = ''; + this.channels = []; + this.workStyle = ''; + try{ + this._xhr.abort(); + }catch(e){}; + this.fireEvent('stop',cause, cId, this.url, this); + }, + + getId : function(){ + return this.cId; + } +}); + +JS.ns("JS.Engine"); +JS.Engine = (function(){ + var Engine = JS.extend(JS.Observable,{ + lStore : [],//用于存放没启动状态下用户增加的侦听 + + running : false, + + connector : null, + constructor:function(){ + this.addEvents([ + + 'start', + + 'stop' + ]); + Engine.superclass.constructor.apply(this,arguments); + this.connector = new JS.Connector(); + this.initEvent(); + }, + + //重载addListener函数 + addListener : function(eventName, fn, scope, o){ + if(this.running){ + Engine.superclass.addListener.apply(this,arguments); + }else{ + this.lStore.push({ + eventName : eventName, + fn : fn, + scope : scope, + o : o + }); + } + }, + //private + initEvent : function(){ + var self = this; + this.connector.on({ + connect : function(cId, aml, conn){ + //self.running = true; + self.addEvents(aml); + for(var i=0,len=self.lStore.length; i0){for(var i=0,len=eventName.length;i-1;i--){if(listeners[i].execute.apply(listeners[i],arguments)===false){return false;}} +return true;},addListener:function(fn,scope,o){scope=scope||this.caller;if(this.hasListener(fn,scope)==-1){this.listeners.push(new JS.Listener(fn,scope,o));}},removeListener:function(fn,scope){var index=this.hasListener(fn,scope);if(index!=-1){this.listeners.splice(index,1);}},hasListener:function(fn,scope){var i=0,listeners=this.listeners,len=listeners.length;for(;i=200&&this.status<300)){this.fireEvent('progress',this,xhr);} +if(this.readyState==4){this.cancelTimeout();var status=this.status;if(status==0||status==""){this.fireEvent('error',this,xhr);}else if(status>=200&&status<300){this.fireEvent('load',this,xhr);}else if(status>=400&&status!=408){this.fireEvent('error',this,xhr);}else if(status==408){this.fireEvent('timeout',this,xhr);}} +this.onreadystatechange();},onreadystatechange:function(){},open:function(method,url,async,username,password){if(!url){return;} +if(!this.enableCache){if(url.indexOf('?')!=-1){url+='&ram='+Math.random();}else{url+='?ram='+Math.random();}} +this._xhr.open(method,url,async,username,password);},send:function(content){this.delayTimeout();this.isAbort=false;this._xhr.send(content);},abort:function(){this.isAbort=true;this.cancelTimeout();this._xhr.abort();if(JS.isIE){var self=this;self._xhr.onreadystatechange=function(){self.doReadyStateChange();};} +this.fireEvent('abort',this,this._xhr);},setRequestHeader:function(header,value){this._xhr.setRequestHeader(header,value);},getResponseHeader:function(header){return this._xhr.getResponseHeader(header);},getAllResponseHeaders:function(){return this._xhr.getAllResponseHeaders();},setTimeout:function(t){this.timeout=t;}}); + +JS.ns("JS.AJAX");JS.AJAX=(function(){var xhr=new JS.XMLHttpRequest();return{dataFormatError:'服务器返回的数据格式有误',urlError:'未指定url',post:function(url,param,callback,scope,asyn){if(typeof url!=='string'){throw new Error(this.urlError);} +var asynchronous=true;if(asyn===false){asynchronous=false;} +xhr.onreadystatechange=function(){if(xhr.readyState==4&&asynchronous){JS.callBack(callback,scope,[xhr]);}};xhr.open('POST',url,asynchronous);xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=UTF8");xhr.send(param||null);if(!asynchronous){JS.callBack(callback,scope,[xhr]);}},get:function(url,param,callback,scope,asyn){if(typeof url!=='string'){throw new Error(this.urlError);} +var asynchronous=true;if(asyn===false){asynchronous=false;} +xhr.onreadystatechange=function(){if(xhr.readyState==4&&asynchronous){JS.callBack(callback,scope,[xhr]);}};xhr.open('GET',url,asynchronous);xhr.setRequestHeader("Content-Type","html/text;charset=UTF8");xhr.send(param||null);if(!asynchronous){JS.callBack(callback,scope,[xhr]);}},getText:function(url,jsonData,callback,scope,asyn){this.get(url,jsonData,function(xhr){if(scope){callback.call(scope,xhr.responseText);}else{callback(xhr.responseText);}},this,asyn);},getJson:function(url,jsonData,callback,scope,asyn){this.get(url,jsonData,function(xhr){var json=null;try{json=eval("("+xhr.responseText+")");}catch(e){throw new Error(this.dataFormatError);} +JS.callBack(callback,scope,[json]);},this,asyn);}};})(); + +JS.ns("JS.Connector");JS.Connector=JS.extend(JS.Observable,{version:JS.version,SYSCHANNEL:'c4j',LLOOPSTYLE:'lpool',STREAMSTYLE:'stream',CMDTAG:'cmd',retryCount:3,retryDelay:1000,currRetry:0,url:'',param:'',revivalDelay:100,cId:'',channels:[],workStyle:'',emptyUrlError:'URL为空',runningError:'连接正在运行',dataFormatError:'数据格式有误',running:false,_xhr:null,lastReceiveMessage:'',constructor:function(){JS.Connector.superclass.constructor.apply(this,arguments);this.addEvents(['beforeConnect','connect','beforeStop','stop','message','revival']);if(JS.isIE7){this._xhr=new JS.XMLHttpRequest({specialXHR:'Msxml2.XMLHTTP.6.0'});}else{this._xhr=new JS.XMLHttpRequest();} +this._xhr.addListener('progress',this.doOnProgress,this);this._xhr.addListener('load',this.doOnLoad,this);this._xhr.addListener('error',this.doOnError,this);this._xhr.addListener('timeout',this.doOnTimeout,this);this.addListener('beforeStop',this.doDrop,this);JS.on(window,'beforeunload',this.doDrop,this);},doDrop:function(url,cId,conn,xhr){if(!this.running||!this.cId){return;} +try{var xhr=new JS.XMLHttpRequest();var param=this.perfectParam(this.param);var url=this.url+'?'+this.CMDTAG+'=drop&cid='+this.cId+param;xhr.open('GET',url,false);xhr.send(null);xhr=null;}catch(e){};},dispatchServerEvent:function(msg){this.fireEvent('message',msg.channel,msg.data,msg.time,this);},translateStreamData:function(responseText){var str=responseText;if(this.lastReceiveMessage&&str){str=str.split(this.lastReceiveMessage);str=str.length?str[str.length-1]:"";} +this.lastReceiveMessage=responseText;return str;},decodeMessage:function(msg){var json=null;if(JS.isString(msg)&&msg!=""){if(msg.charAt(0)=="<"){msg=msg.substring(1,msg.length);} +if(msg.charAt(msg.length-1)==">"){msg=msg.substring(0,msg.length-1);} +msg=decodeURIComponent(msg);try{json=eval("("+msg+")");}catch(e){this.stop('JSON转换异常');}} +return json;},doOnProgress:function(xhr){if(this.workStyle===this.STREAMSTYLE){var str=this.translateStreamData(xhr.responseText);var msglist=str.split(">");if(msglist.length>0){for(var i=0,len=msglist.length;ithis.retryCount){this.stop('服务器异常');}else{this.retryRevivalConnect();}}}}}},doOnLoad:function(xhr){if(this.workStyle===this.LLOOPSTYLE){var json=this.decodeMessage(xhr.responseText);if(json){this.currRetry=0;this.dispatchServerEvent(json);this.revivalConnect();}else{this.currRetry++;if(this.currRetry>this.retryCount){this.stop('服务器异常');}else{this.retryRevivalConnect();}}}},doOnError:function(xhr){this.currRetry++;if(this.currRetry>this.retryCount){this.stop('服务器异常');}else{this.retryRevivalConnect();}},doOnTimeout:function(xhr){this.currRetry++;if(this.currRetry>this.retryCount){this.stop('请求超时');}else{this.retryRevivalConnect();}},startConnect:function(url){if(this.running){var connXhr=new JS.XMLHttpRequest();connXhr.addListener('error',function(xhr){this.stop("连接时发生错误");},this);connXhr.addListener('timeout',function(xhr){this.stop("连接超时");},this);connXhr.addListener('load',function(xhr){var msg=this.decodeMessage(xhr.responseText);if(!msg){this.stop('连接失败');return;} +var data=msg.data;this.cId=data.cId;this.channels=data.channels;this.workStyle=data.ws;this._xhr.setTimeout(data.timeout+1000);this.fireEvent('connect',data.cId,data.channels,data.ws,data.timeout,this);this.revivalConnect();},this);connXhr.open('GET',url,true);connXhr.send(null);}},retryRevivalConnect:function(){var self=this;if(this.running){setTimeout(function(){self.revivalConnect();},this.retryDelay);}},revivalConnect:function(){var self=this;if(this.running){setTimeout(revival,this.revivalDelay);} +function revival(){var xhr=self._xhr;var param=self.perfectParam(self.param);var url=self.url+'?'+self.CMDTAG+'=revival&cid='+self.cId+param;xhr.open('GET',url,true);xhr.send(null);self.fireEvent('revival',self.url,self.cId,self);}},start:function(url,param){if(this.running){return;} +this.url=url||this.url;if(!this.url){throw new Error(this.emptyUrlError);} +if(this.fireEvent('beforeConnect',this.url,this)===false){return;} +this.param=param||this.param;param=this.perfectParam(this.param);var url=this.url+'?'+this.CMDTAG+'=conn&cv='+this.version+param;this.running=true;this.currRetry=0;var self=this;setTimeout(function(){self.startConnect(url);},1000);},perfectParam:function(param){if(param&&JS.isString(param)){if(param.charAt(0)!='&'){param='&'+param;}} +return param;},stop:function(cause){if(!this.running){return;} +if(this.fireEvent('beforeStop',cause,this.cId,this.url,this)===false){return;} +this.running=false;var cId=this.cId;this.cId='';this.channels=[];this.workStyle='';try{this._xhr.abort();}catch(e){};this.fireEvent('stop',cause,cId,this.url,this);},getId:function(){return this.cId;}}); + +JS.ns("JS.Engine");JS.Engine=(function(){var Engine=JS.extend(JS.Observable,{lStore:[],running:false,connector:null,constructor:function(){this.addEvents(['start','stop']);Engine.superclass.constructor.apply(this,arguments);this.connector=new JS.Connector();this.initEvent();},addListener:function(eventName,fn,scope,o){if(this.running){Engine.superclass.addListener.apply(this,arguments);}else{this.lStore.push({eventName:eventName,fn:fn,scope:scope,o:o});}},initEvent:function(){var self=this;this.connector.on({connect:function(cId,aml,conn){self.addEvents(aml);for(var i=0,len=self.lStore.length;i + + 4.0.0 + + Comet4j-DemoChat + org.comet4j + comet4j-chatdemo + 0.1.7 + + war + + + + src + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.6 + 1.6 + UTF-8 + + + + org.apache.maven.plugins + maven-war-plugin + + WebContent + + + + + + + + + + + + org.comet4j + comet4j + 0.1.7 + + + javax.servlet + servlet-api + 2.5 + provided + + + \ No newline at end of file diff --git a/comet4j-demo/src/org/comet4j/demo/talker/AppInit.java b/comet4j-demo/src/org/comet4j/demo/talker/AppInit.java new file mode 100644 index 0000000..6c21952 --- /dev/null +++ b/comet4j-demo/src/org/comet4j/demo/talker/AppInit.java @@ -0,0 +1,50 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.demo.talker; + +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; + +import org.comet4j.core.CometContext; +import org.comet4j.core.CometEngine; + +/** + * 应用初始化 + * @author jinghai.xiao@gmail.com + * @date 2011-2-25 + */ + +public class AppInit implements ServletContextListener { + + /** + * @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent) + */ + + @Override + public void contextInitialized(ServletContextEvent arg0) { + CometContext cc = CometContext.getInstance(); + CometEngine engine = cc.getEngine(); + cc.registChannel(Constant.APP_CHANNEL);// 注册通道 + // 绑定事件侦听 + engine.addConnectListener(new JoinListener()); + engine.addDropListener(new LeftListener()); + // 启动系统监控信息发送器 + Thread healthSender = new Thread(new HealthSender(), "HealthSender"); + healthSender.setDaemon(true); + healthSender.start(); + } + + /** + * @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet.ServletContextEvent) + */ + + @Override + public void contextDestroyed(ServletContextEvent arg0) { + // TODO 该方法尚未实现 + + } + +} diff --git a/comet4j-demo/src/org/comet4j/demo/talker/AppStore.java b/comet4j-demo/src/org/comet4j/demo/talker/AppStore.java new file mode 100644 index 0000000..239cf36 --- /dev/null +++ b/comet4j-demo/src/org/comet4j/demo/talker/AppStore.java @@ -0,0 +1,48 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.demo.talker; + +import java.util.HashMap; +import java.util.Map; + +/** + * 应用全局存储 + * @author jinghai.xiao@gmail.com + * @date 2011-2-25 + */ + +public class AppStore { + + private static Map map; + private static AppStore instance; + + public static AppStore getInstance() { + + if (instance == null) { + instance = new AppStore(); + map = new HashMap(); + } + return instance; + } + + public void put(String key, String value) { + map.put(key, value); + } + + public String get(String key) { + return map.get(key); + } + + public Map getMap() { + return map; + } + + public void destroy() { + map.clear(); + map = null; + } + +} diff --git a/comet4j-demo/src/org/comet4j/demo/talker/Constant.java b/comet4j-demo/src/org/comet4j/demo/talker/Constant.java new file mode 100644 index 0000000..57b775c --- /dev/null +++ b/comet4j-demo/src/org/comet4j/demo/talker/Constant.java @@ -0,0 +1,27 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.demo.talker; + +/** + * 常量 + * @author jinghai.xiao@gmail.com + * @date 2011-2-25 + */ +public class Constant { + + // 通道标识 + public static final String APP_CHANNEL = "talker"; + // 上线消息标识 + public static final String UP = "up"; + // 下线消息标识 + public static final String DOWN = "down"; + // 改名消息标识 + public static final String RENAME = "rename"; + // 话语消息标识 + public static final String TALK = "talk"; + // 系统健康信息 + public static final String HEALTH = "health"; +} diff --git a/comet4j-demo/src/org/comet4j/demo/talker/HealthSender.java b/comet4j-demo/src/org/comet4j/demo/talker/HealthSender.java new file mode 100644 index 0000000..23095d7 --- /dev/null +++ b/comet4j-demo/src/org/comet4j/demo/talker/HealthSender.java @@ -0,0 +1,55 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.demo.talker; + +import org.comet4j.core.CometContext; +import org.comet4j.core.CometEngine; +import org.comet4j.demo.talker.dto.HealthDTO; + +/** + * 系统健康信息发送器 + * @author xiaojinghai + * @date 2011-4-7 + */ + +public class HealthSender implements Runnable { + + private static final CometEngine engine = CometContext.getInstance().getEngine(); + private static final HealthDTO healthDto = new HealthDTO(); + private static final long startup = System.currentTimeMillis(); + + @Override + public void run() { + + while (true) { + try { + Thread.sleep(5000); + } catch (Exception ex) { + ex.printStackTrace(); + } + long totalMemory = Runtime.getRuntime().totalMemory(); + long freeMemory = Runtime.getRuntime().freeMemory(); + long maxMemory = Runtime.getRuntime().maxMemory(); + long usedMemory = totalMemory - freeMemory; + Integer connectorCount = engine.getConnections().size(); + healthDto.setConnectorCount(connectorCount.toString()); + healthDto.setFreeMemory(freeMemory); + healthDto.setMaxMemory(maxMemory); + healthDto.setTotalMemory(totalMemory); + healthDto.setUsedMemory(usedMemory); + long dif = System.currentTimeMillis() - startup; + long day_mill = 86400000;// 一天的毫秒数 60*60*1000*24 + long hour_mill = 3600000;// 一小时的毫秒数 60*60*1000 + Long day = dif / day_mill; + Long hour = (dif % day_mill) / hour_mill; + String str = day.toString() + "天 " + hour.toString() + "小时"; + healthDto.setStartup(str); + engine.sendToAll(Constant.APP_CHANNEL, healthDto); + + } + + } +} diff --git a/comet4j-demo/src/org/comet4j/demo/talker/JoinListener.java b/comet4j-demo/src/org/comet4j/demo/talker/JoinListener.java new file mode 100644 index 0000000..043503a --- /dev/null +++ b/comet4j-demo/src/org/comet4j/demo/talker/JoinListener.java @@ -0,0 +1,60 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.demo.talker; + +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; + +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; + +import org.comet4j.core.CometConnection; +import org.comet4j.core.event.ConnectEvent; +import org.comet4j.core.listener.ConnectListener; +import org.comet4j.demo.talker.dto.JoinDTO; + +/** + * 上线侦听 + * @author jinghai.xiao@gmail.com + * @date 2011-3-3 + */ + +public class JoinListener extends ConnectListener { + + /* + * (non-Jsdoc) + * @see org.comet4j.event.Listener#handleEvent(org.comet4j.event.Event) + */ + @Override + public boolean handleEvent(ConnectEvent anEvent) { + CometConnection conn = anEvent.getConn(); + HttpServletRequest request = conn.getRequest(); + String userName = getCookieValue(request.getCookies(), "userName", ""); + try { + userName = URLDecoder.decode(userName, "utf-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + JoinDTO dto = new JoinDTO(conn.getId(), userName); + AppStore.getInstance().put(conn.getId(), userName); + anEvent.getTarget().sendToAll(Constant.APP_CHANNEL, dto); + return true; + } + + public String getCookieValue(Cookie[] cookies, String cookieName, String defaultValue) { + String result = defaultValue; + if (cookies != null) { + for (int i = 0; i < cookies.length; i++) { + Cookie cookie = cookies[i]; + if (cookieName.equals(cookie.getName())) { + return cookie.getValue(); + } + } + } + return result; + } + +} diff --git a/comet4j-demo/src/org/comet4j/demo/talker/LeftListener.java b/comet4j-demo/src/org/comet4j/demo/talker/LeftListener.java new file mode 100644 index 0000000..8e6c14c --- /dev/null +++ b/comet4j-demo/src/org/comet4j/demo/talker/LeftListener.java @@ -0,0 +1,37 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.demo.talker; + +import org.comet4j.core.CometConnection; +import org.comet4j.core.event.DropEvent; +import org.comet4j.core.listener.DropListener; +import org.comet4j.demo.talker.dto.LeftDTO; + +/** + * 下线侦听 + * @author jinghai.xiao@gmail.com + * @date 2011-3-3 + */ + +public class LeftListener extends DropListener { + + /* + * (non-Jsdoc) + * @see org.comet4j.event.Listener#handleEvent(org.comet4j.event.Event) + */ + @Override + public boolean handleEvent(DropEvent anEvent) { + CometConnection conn = anEvent.getConn(); + if (conn != null) { + String userName = AppStore.getInstance().get(conn.getId()); + LeftDTO dto = new LeftDTO(conn.getId(), userName); + AppStore.getInstance().getMap().remove(conn.getId()); + anEvent.getTarget().sendToAll(Constant.APP_CHANNEL, dto); + } + return true; + } + +} diff --git a/comet4j-demo/src/org/comet4j/demo/talker/WebServlet.java b/comet4j-demo/src/org/comet4j/demo/talker/WebServlet.java new file mode 100644 index 0000000..f9b7c61 --- /dev/null +++ b/comet4j-demo/src/org/comet4j/demo/talker/WebServlet.java @@ -0,0 +1,85 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.demo.talker; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.comet4j.core.CometContext; +import org.comet4j.core.CometEngine; +import org.comet4j.core.util.JSONUtil; +import org.comet4j.demo.talker.dto.RenameDTO; +import org.comet4j.demo.talker.dto.TalkDTO; +import org.comet4j.demo.talker.dto.UserDTO; + +/** + * web交互 + * @author jinghai.xiao@gmail.com + * @date 2011-3-3 + */ + +public class WebServlet extends HttpServlet { + + /** serialVersionUID */ + private static final long serialVersionUID = -1311176251844328163L; + private static final String CMD_FLAG = "cmd"; + private static final String RENAME_CMD = "rename"; + private static final String TALK_CMD = "talk"; + private static final String LIST_CMD = "list"; + private static final CometContext context = CometContext.getInstance(); + private static final CometEngine engine = context.getEngine(); + private static final AppStore appStore = AppStore.getInstance(); + + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, + IOException { + response.setCharacterEncoding("UTF-8"); + response.setContentType("text/html;charset=UTF-8"); + String cmd = request.getParameter(CMD_FLAG); + // 改名 + if (RENAME_CMD.equals(cmd)) { + String id = request.getParameter("id"); + if (id == null) return; + String newName = request.getParameter("newName"); + String oldName = request.getParameter("oldName"); + appStore.put(id, newName); + RenameDTO dto = new RenameDTO(id, oldName, newName); + engine.sendToAll(Constant.APP_CHANNEL, dto); + return; + } + // 发送信息 + if (TALK_CMD.equals(cmd)) { + String id = request.getParameter("id"); + String name = appStore.get(id); + String text = request.getParameter("text"); + TalkDTO dto = new TalkDTO(id, name, text); + engine.sendToAll(Constant.APP_CHANNEL, dto); + return; + } + // 在线列表 + if (LIST_CMD.equals(cmd)) { + List userList = new ArrayList(); + Map map = AppStore.getInstance().getMap(); + Iterator> iter = map.entrySet().iterator(); + while (iter.hasNext()) { + Map.Entry entry = iter.next(); + String id = entry.getKey(); + String name = entry.getValue(); + userList.add(new UserDTO(id, name)); + } + String json = JSONUtil.object2json(userList); + response.getWriter().print(json); + } + } +} diff --git a/comet4j-demo/src/org/comet4j/demo/talker/dto/HealthDTO.java b/comet4j-demo/src/org/comet4j/demo/talker/dto/HealthDTO.java new file mode 100644 index 0000000..97a2cb9 --- /dev/null +++ b/comet4j-demo/src/org/comet4j/demo/talker/dto/HealthDTO.java @@ -0,0 +1,84 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.demo.talker.dto; + +import org.comet4j.demo.talker.Constant; + +/** + * 系统健康传输对象 + * @author jinghai.xiao@gmail.com + * @date 2011-4-7 + */ + +public class HealthDTO { + + private final String type = Constant.HEALTH; + private String totalMemory; + private String freeMemory; + private String maxMemory; + private String usedMemory; + private String connectorCount; + private String startup; + private final long divider = 1024 * 1024; + + public String getTotalMemory() { + return totalMemory; + } + + public void setTotalMemory(long totalMemory) { + Long result = totalMemory / divider; + this.totalMemory = result.toString(); + } + + public String getFreeMemory() { + return freeMemory; + } + + public void setFreeMemory(long freeMemory) { + Long result = freeMemory / divider; + this.freeMemory = result.toString(); + } + + public String getMaxMemory() { + return maxMemory; + } + + public void setMaxMemory(long maxMemory) { + Long result = maxMemory / divider; + this.maxMemory = result.toString(); + } + + public String getUsedMemory() { + return usedMemory; + } + + public void setUsedMemory(long usedMemory) { + Long result = usedMemory / divider; + this.usedMemory = result.toString(); + } + + public String getConnectorCount() { + return connectorCount; + } + + public void setConnectorCount(String connectorCount) { + this.connectorCount = connectorCount; + } + + public String getType() { + return type; + } + + public String getStartup() { + + return startup; + } + + public void setStartup(String startup) { + this.startup = startup; + } + +} diff --git a/comet4j-demo/src/org/comet4j/demo/talker/dto/JoinDTO.java b/comet4j-demo/src/org/comet4j/demo/talker/dto/JoinDTO.java new file mode 100644 index 0000000..3cdf754 --- /dev/null +++ b/comet4j-demo/src/org/comet4j/demo/talker/dto/JoinDTO.java @@ -0,0 +1,61 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.demo.talker.dto; + +import java.text.SimpleDateFormat; +import java.util.Date; + +import org.comet4j.demo.talker.Constant; + +/** + * 上线通知传输对象 + * @author jinghai.xiao@gmail.com + * @date 2011-4-7 + */ +public class JoinDTO { + + private final String transtime; + private String type; + private String id; + private String name; + + public JoinDTO(String id, String name) { + this.type = Constant.UP; + this.id = id; + this.name = name; + Date d = new Date(System.currentTimeMillis()); + SimpleDateFormat f = new SimpleDateFormat("HH:mm"); + transtime = f.format(d); + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getTranstime() { + return transtime; + } +} diff --git a/comet4j-demo/src/org/comet4j/demo/talker/dto/LeftDTO.java b/comet4j-demo/src/org/comet4j/demo/talker/dto/LeftDTO.java new file mode 100644 index 0000000..5fc45e3 --- /dev/null +++ b/comet4j-demo/src/org/comet4j/demo/talker/dto/LeftDTO.java @@ -0,0 +1,61 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.demo.talker.dto; + +import java.text.SimpleDateFormat; +import java.util.Date; + +import org.comet4j.demo.talker.Constant; + +/** + * 下线通知传输对象 + * @author jinghai.xiao@gmail.com + * @date 2011-3-3 + */ +public class LeftDTO { + + private final String transtime; + private String type; + private String id; + private String name; + + public LeftDTO(String id, String name) { + this.type = Constant.DOWN; + this.id = id; + this.name = name; + Date d = new Date(System.currentTimeMillis()); + SimpleDateFormat f = new SimpleDateFormat("HH:mm"); + transtime = f.format(d); + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getTranstime() { + return transtime; + } +} diff --git a/comet4j-demo/src/org/comet4j/demo/talker/dto/RenameDTO.java b/comet4j-demo/src/org/comet4j/demo/talker/dto/RenameDTO.java new file mode 100644 index 0000000..7da01b0 --- /dev/null +++ b/comet4j-demo/src/org/comet4j/demo/talker/dto/RenameDTO.java @@ -0,0 +1,71 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.demo.talker.dto; + +import java.text.SimpleDateFormat; +import java.util.Date; + +import org.comet4j.demo.talker.Constant; + +/** + * 改名通知传输对象 + * @author jinghai.xiao@gmail.com + * @date 2011-3-3 + */ +public class RenameDTO { + + private final String transtime; + private String type; + private String id; + private String newName; + private String oldName; + + public RenameDTO(String id, String oldName, String newName) { + this.type = Constant.RENAME; + this.id = id; + this.oldName = oldName; + this.newName = newName; + Date d = new Date(System.currentTimeMillis()); + SimpleDateFormat f = new SimpleDateFormat("HH:mm"); + transtime = f.format(d); + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getNewName() { + return newName; + } + + public void setNewName(String newName) { + this.newName = newName; + } + + public String getOldName() { + return oldName; + } + + public void setOldName(String oldName) { + this.oldName = oldName; + } + + public String getTranstime() { + return transtime; + } +} diff --git a/comet4j-demo/src/org/comet4j/demo/talker/dto/TalkDTO.java b/comet4j-demo/src/org/comet4j/demo/talker/dto/TalkDTO.java new file mode 100644 index 0000000..76ea611 --- /dev/null +++ b/comet4j-demo/src/org/comet4j/demo/talker/dto/TalkDTO.java @@ -0,0 +1,72 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.demo.talker.dto; + +import java.text.SimpleDateFormat; +import java.util.Date; + +import org.comet4j.demo.talker.Constant; + +/** + * 聊天信息传输对象 + * @author jinghai.xiao@gmail.com + * @date 2011-4-7 + */ + +public class TalkDTO { + + private final String transtime; + private String type; + private String id; + private String name; + private String text; + + public TalkDTO(String id, String name, String text) { + this.type = Constant.TALK; + this.id = id; + this.name = name; + this.text = text; + Date d = new Date(System.currentTimeMillis()); + SimpleDateFormat f = new SimpleDateFormat("HH:mm"); + transtime = f.format(d); + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getTranstime() { + return transtime; + } +} diff --git a/comet4j-demo/src/org/comet4j/demo/talker/dto/UserDTO.java b/comet4j-demo/src/org/comet4j/demo/talker/dto/UserDTO.java new file mode 100644 index 0000000..3e656c7 --- /dev/null +++ b/comet4j-demo/src/org/comet4j/demo/talker/dto/UserDTO.java @@ -0,0 +1,49 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.demo.talker.dto; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * 用户信息传输对象 + * @author jinghai.xiao@gmail.com + * @date 2011-4-7 + */ +public class UserDTO { + + private final String transtime; + private String id; + private String name; + + public UserDTO(String id, String name) { + this.id = id; + this.name = name; + Date d = new Date(System.currentTimeMillis()); + SimpleDateFormat f = new SimpleDateFormat("HH:mm"); + transtime = f.format(d); + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getTranstime() { + return transtime; + } +} diff --git a/comet4j-jar/.classpath b/comet4j-jar/.classpath new file mode 100644 index 0000000..b7465b4 --- /dev/null +++ b/comet4j-jar/.classpath @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/comet4j-jar/.project b/comet4j-jar/.project new file mode 100644 index 0000000..a6b95a6 --- /dev/null +++ b/comet4j-jar/.project @@ -0,0 +1,23 @@ + + + comet4j-jar + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.maven.ide.eclipse.maven2Builder + + + + + + org.maven.ide.eclipse.maven2Nature + org.eclipse.jdt.core.javanature + + diff --git a/comet4j-jar/RoadMap.txt b/comet4j-jar/RoadMap.txt new file mode 100644 index 0000000..fc8cb11 --- /dev/null +++ b/comet4j-jar/RoadMap.txt @@ -0,0 +1,55 @@ +v0.1.7 +改进了首次建立连接的响应速度 +v0.1.6 +修复Tomcat7下NIOEndPoint异常问题 +v0.1.5 +修复Tomcat6下NIOEndPoint异常问题 +修复BeforeConnectEvent返回false时没有及时关闭请求的问题 +v0.1.4 +修复连接回收线因外部事件处理异常而引发程重复删除问题。 +修复连接回收与消息缓存回收线程因异常而退出问题。 +DelayTask增加取消任务执行方法 +v0.1.3 +修复了多余线程残留的问题 +增加DelayTask工具 +修改连接与缓存清理线程的名字 +V0.1.2 +修复了JSON转换的bug + +V0.1.X +新增: +区分离开与掉线事件 +各种命名参考comet,如accept,quit等 +考虑在框架中增加对userId的支持 +对sevlet3.0的支持 +消息发送机制优化,建立发送队列 +使用并发包重写消息发送、过期检查等部分 +将通道从服务器端事件分开,不同Connector侦听不同通道 + + +增加XML配置能力 +web.xml去掉Listener的配置,转为一个sevlet的配置即可 +服务端auto工作模式下,客户端可指定具体的工作模式 +对Spring的整合支持:SpringRomoting,JMS等 +对Jetty的支持 + + +XMPP支持? +ActiveMQ的支持? +nodeJS的实现 +WebSocket支持? + +优化: +线程循环应使用一个控制标识来结束 +合并Tomcat6与Tomcat7的Jar包,OK +Engine增加kick方法与事件,实现服务器端使之下线功能,以区分drop事件。 +事件统一采用接口形式定义 +CometContext增加两个addListener方法 + +异常事件及异常类型的完善(ConetContext统一异常) +加入Maven管理 +分布式支持? + +Bug: +NIO异常 + diff --git a/comet4j-jar/pom.xml b/comet4j-jar/pom.xml new file mode 100644 index 0000000..5adc4f8 --- /dev/null +++ b/comet4j-jar/pom.xml @@ -0,0 +1,55 @@ + + + 4.0.0 + + comet4j + org.comet4j + comet4j + + 0.1.8-SNAPSHOT + jar + + + true + + + + src + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.6 + 1.6 + UTF-8 + + + + + + + + javax.servlet + servlet-api + 2.5 + provided + + + org.apache.tomcat + catalina + 6.0.35 + provided + + + + + + mvnrepository + mvnrepository + http://mvnrepository.com/artifact + + + + diff --git a/comet4j-jar/src/language-cn.xml b/comet4j-jar/src/language-cn.xml new file mode 100644 index 0000000..64697c7 --- /dev/null +++ b/comet4j-jar/src/language-cn.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/comet4j-jar/src/language-en.xml b/comet4j-jar/src/language-en.xml new file mode 100644 index 0000000..7a343d8 --- /dev/null +++ b/comet4j-jar/src/language-en.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/comet4j-jar/src/org/comet4j/core/CometAppListener.java b/comet4j-jar/src/org/comet4j/core/CometAppListener.java new file mode 100644 index 0000000..bf7b088 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/CometAppListener.java @@ -0,0 +1,37 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core; + +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; + +/** + * WEB容器启动侦听,负责框架的启动 + */ + +public class CometAppListener implements ServletContextListener { + + /* + * 容器初始化 + * @see + * javax.servlet.ServletContextListener#contextInitialized(javax.servlet + * .ServletContextEvent) + */ + public void contextInitialized(ServletContextEvent event) { + CometContext cct = CometContext.getInstance(); + cct.init(event); + } + + /* + * 容器销毁 + * @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet. + * ServletContextEvent) + */ + public void contextDestroyed(ServletContextEvent event) { + CometContext.getInstance().destroy(); + } + +} diff --git a/comet4j-jar/src/org/comet4j/core/CometConnection.java b/comet4j-jar/src/org/comet4j/core/CometConnection.java new file mode 100644 index 0000000..ae5d388 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/CometConnection.java @@ -0,0 +1,163 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core; + +import java.util.UUID; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.comet4j.core.util.ExplorerUtil; +import org.comet4j.core.util.NetUtil; + +/** + * Comet连接,负责构造一个连接的实例 + */ + +public class CometConnection { + + private final String id; + + private final String clientIp; + + private final String clientVersion; + + private String workStyle; + + private String state = CometProtocol.STATE_ALIVE; + + private long dyingTime = 0L; // 连接超时后会进入dying(濒死)状态,此时间指进入dying状态的起始时间 + + private HttpServletRequest request; + + private HttpServletResponse response; + + public CometConnection(HttpServletRequest anRequest, HttpServletResponse anResponse) { + clientIp = NetUtil.getIpAddr(anRequest); + clientVersion = anRequest.getParameter(CometProtocol.FLAG_CLIENTVERSION); + if (CometContext.getInstance().getWorkStyle().equals(CometProtocol.WORKSTYLE_AUTO)) { + if (ExplorerUtil.canStreamingXHR(anRequest)) { + workStyle = CometProtocol.WORKSTYLE_STREAM; + } else { + workStyle = CometProtocol.WORKSTYLE_LLOOP; + } + } else { + workStyle = CometContext.getInstance().getWorkStyle(); + } + request = anRequest; + response = anResponse; + id = UUID.randomUUID().toString(); + } + + /** + * 获得连接ID + * @return + */ + + public String getId() { + return id; + } + + /** + * 获得客户端IP + * @return + */ + + public String getClientIp() { + return clientIp; + } + + /** + * 获得Comet客户端版本号 + * @return + */ + + public String getClientVersion() { + return clientVersion; + } + + /** + * 获得连接实际的工作模式,CometProtocol.WORKSTYLE_STREAM或CometProtocol.WORKSTYLE_LLOOP + * @return + */ + + public String getWorkStyle() { + return workStyle; + } + + /** + * 获得连接状态,CometProtocol.STATE_ALIVE或CometProtocol.STATE_DYING + * @return + */ + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + /** + * 获得连接最近一次转入CometProtocol.STATE_DYING状态的时间截 + * @return + */ + + public long getDyingTime() { + return dyingTime; + } + + /** + * 设置连接最近一次转入CometProtocol.STATE_DYING状态的时间截 + * @param dyingTime + */ + + public void setDyingTime(long dyingTime) { + this.dyingTime = dyingTime; + } + + /** + * 获取连接的Request对象 + * @return + */ + + public HttpServletRequest getRequest() { + return request; + } + + /** + * 设置连接的Request对象 + * @param request + */ + + public void setRequest(HttpServletRequest request) { + this.request = request; + } + + /** + * 获取连接的Response对象 + * @return + */ + + public HttpServletResponse getResponse() { + return response; + } + + /** + * 设置连接的Response对象 + * @param response + */ + + public void setResponse(HttpServletResponse response) { + this.response = response; + } + + public void destroy() { + this.request = null; + this.response = null; + } + +} diff --git a/comet4j-jar/src/org/comet4j/core/CometConnector.java b/comet4j-jar/src/org/comet4j/core/CometConnector.java new file mode 100644 index 0000000..ae3dd92 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/CometConnector.java @@ -0,0 +1,160 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; + +import org.comet4j.event.Observable; + +/** + * 负责对连接进行管理 增加、删除、获取等 + */ +@SuppressWarnings({ + "rawtypes" +}) +public class CometConnector extends Observable { + + private final long timespan; + private final long frequency; + boolean init = false; + private Thread cleanner; + + private List connections = Collections.synchronizedList(new ArrayList()); + + /** + * @param aTimespan + * @param aFrequency + */ + + public CometConnector(long aTimespan, long aFrequency) { + init = true; + frequency = aFrequency; + timespan = aTimespan; + cleanner = new Thread(new CacheCleaner(), "Comet4J-ConnectorCleaner"); + cleanner.setDaemon(true); + cleanner.start(); + } + + CometConnection getConnection(HttpServletRequest request) { + for (int i = 0; i < connections.size(); i++) { + CometConnection conn = connections.get(i); + if (conn.getRequest() == request) { + return conn; + } + } + return null; + } + + CometConnection getConnection(String id) { + for (int i = 0; i < connections.size(); i++) { + CometConnection conn = connections.get(i); + if (conn.getId().equals(id)) { + return conn; + } + } + return null; + } + + synchronized void addConnection(CometConnection connection) { + connections.add(connection); + } + + synchronized void removeConnection(CometConnection connection) { + connections.remove(connection); + } + + synchronized void removeConnection(String id) { + for (CometConnection c : connections) { + if (c.getId().equals(id)) { + connections.remove(c); + break; + } + } + } + + boolean contains(String anId) { + boolean result = false; + for (CometConnection c : connections) { + if (c.getId().equals(anId)) { + result = true; + break; + } + } + return result; + } + + boolean contains(CometConnection conn) { + return connections.contains(conn); + } + + List getConnections() { + return connections; + } + + // ----------定时清理过期连接--------------- + class CacheCleaner implements Runnable { + + private final List toDeleteList = new ArrayList(); + + public void run() { + while (init) { + try { + CometContext.getInstance().log("【CometDebug】开始清理连接"); + Thread.sleep(frequency); + checkExpires(); + CometContext.getInstance().log("【CometDebug】连接清理完毕"); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + } + + // 过期检查 + private void checkExpires() { + CometEngine engine = CometContext.getInstance().getEngine(); + CometContext.getInstance().log("【CometDebug】连接数量:" + connections.size()); + // synchronized (connections) { + if (!connections.isEmpty()) { + for (CometConnection c : connections) { + if (c == null) { + continue; + } + long expireMillis = c.getDyingTime() + timespan; + if (CometProtocol.STATE_DYING.equals(c.getState()) && expireMillis < System.currentTimeMillis()) { + toDeleteList.add(c); + } + } + } + + if (!toDeleteList.isEmpty()) { + CometContext.getInstance().log("【CometDebug】检测到过期闲置连接" + toDeleteList.size() + "个"); + for (CometConnection c : toDeleteList) { + try {// 外部事件处理可能会引发异常 + CometContext.getInstance().log("【CometDebug】移除闲置连接:" + c.getId()); + engine.remove(c); + } catch (Exception e) { + e.printStackTrace(); + } + } + toDeleteList.clear(); + } + // } + + } + } + + @Override + public void destroy() { + init = false; + cleanner = null; + connections.clear(); + connections = null; + } +} diff --git a/comet4j-jar/src/org/comet4j/core/CometContext.java b/comet4j-jar/src/org/comet4j/core/CometContext.java new file mode 100644 index 0000000..acf68fc --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/CometContext.java @@ -0,0 +1,326 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +import javax.servlet.ServletContext; +import javax.servlet.ServletContextEvent; + +import org.comet4j.core.event.CometContextEvent; +import org.comet4j.core.exception.DoubleAppModuleKeyException; +import org.comet4j.core.listener.CometContextListener; +import org.comet4j.event.Observable; + +/** + * Comet4J上下文,负责初始化配置、引擎对象、连接器对象、消息缓存等。 + */ + +public class CometContext extends Observable { + + public final String version = "0.1.1"; + + /** + * 语言参数是一个有效的 ISO 语言代码。这些代码是由 ISO-639 定义的小写两字母代码。在许多网站上都可以找到这些代码的完整列表,如: + * http://www.loc.gov/standards/iso639-2/englangn.html。 目前可设置zh和en两种 + */ + private Locale locale = Locale.CHINESE; + + private String workStyle = CometProtocol.WORKSTYLE_AUTO; + + private CometEngine engine; + + private List appModules = new ArrayList(); + + private int timeout = 60000; + + private int cacheExpires = 60000; + + private int cacheFrequency = 60000; + + private int connExpires = 5000; + + private int connFrequency = 5000; + + private boolean debug = false; + + private boolean init = false; + + private ServletContext servletContext; + + private static CometContext instance; + + public void init(ServletContextEvent event) { + if (init) { + return; + } + servletContext = event.getServletContext(); + loadConfig(servletContext); + init = true; + CometContextEvent e = new CometContextEvent(this, CometContextEvent.INITIALIZED); + e.setCometContext(this); + e.setServletContext(event.getServletContext()); + this.fireEvent(e); + log("Comet4J v" + version + " " + Language.get("InitComplete")); + } + + public static CometContext getInstance() { + if (instance == null) { + instance = new CometContext(); + } + return instance; + } + + public void log(String str) { + if (debug) { + instance.servletContext.log(str); + } + } + + public void log(String str, Throwable trb) { + if (debug) { + instance.servletContext.log(str, trb); + } + } + + public Object createInstance(String className) throws InstantiationException, IllegalAccessException, + ClassNotFoundException { + Object obj; + obj = Class.forName(className).newInstance(); + return obj; + } + + // Singleton + private CometContext() { + super(); + this.addEvent(CometContextEvent.class); + } + + private void loadConfig(ServletContext ct) { + + String workStyleStr = ct.getInitParameter(CometProtocol.CONFIG_WORKSTYLE); + if (workStyleStr != null && !"".equals(workStyleStr.trim())) { + if (CometProtocol.WORKSTYLE_AUTO.equals(workStyleStr) || CometProtocol.WORKSTYLE_LLOOP.equals(workStyleStr) + || CometProtocol.WORKSTYLE_STREAM.equals(workStyleStr)) { + workStyle = workStyleStr; + } + } + String timeoutStr = ct.getInitParameter(CometProtocol.CONFIG_TIMEOUT); + if (timeoutStr != null && !"".equals(timeoutStr.trim())) { + try { + timeout = Integer.valueOf(timeoutStr); + } catch (Exception e) { + log("配置错误", e); + // 忽略非法数值 + } + } + String cacheExpiresStr = ct.getInitParameter(CometProtocol.CONFIG_CACHEEXPIRES); + if (cacheExpiresStr != null && !"".equals(cacheExpiresStr.trim())) { + try { + cacheExpires = Integer.valueOf(cacheExpiresStr); + } catch (Exception e) { + log("配置错误", e); + // 忽略非法数值 + } + } + String cacheFrequencyStr = ct.getInitParameter(CometProtocol.CONFIG_CACHEFREQUENCY); + if (cacheFrequencyStr != null && !"".equals(cacheFrequencyStr.trim())) { + try { + cacheFrequency = Integer.valueOf(cacheFrequencyStr); + } catch (Exception e) { + log("配置错误", e); + // 忽略非法数值 + } + } + String connExpiresStr = ct.getInitParameter(CometProtocol.CONFIG_CONNEXPIRES); + if (connExpiresStr != null && !"".equals(connExpiresStr.trim())) { + try { + connExpires = Integer.valueOf(connExpiresStr); + } catch (Exception e) { + log("配置错误", e); + // 忽略非法数值 + } + } + String connFrequencyStr = ct.getInitParameter(CometProtocol.CONFIG_CONNFREQUENCY); + if (connFrequencyStr != null && !"".equals(connFrequencyStr.trim())) { + try { + connFrequency = Integer.valueOf(connFrequencyStr); + } catch (Exception e) { + log("配置错误", e); + // 忽略非法数值 + } + } + String debugStr = ct.getInitParameter(CometProtocol.CONFIG_DEBUG); + if (debugStr != null && "true".equals(debugStr.trim())) { + debug = true; + } + + String languageStr = ct.getInitParameter(CometProtocol.CONFIG_LANGUAGE); + if (languageStr != null && !"".equals(languageStr.trim())) { + if (Locale.ENGLISH.getLanguage().equals(languageStr)) { + locale = Locale.ENGLISH; + } + } + + String engineStr = ct.getInitParameter(CometProtocol.CONFIG_ENGINE); + if (engineStr != null && !"".equals(engineStr.trim())) { + try { + engine = (CometEngine) createInstance(engineStr); + } catch (Exception e) { + log("配置错误", e); + engine = new CometEngine(); + } + + } else { + engine = new CometEngine(); + } + + } + + /** + * 获得Comet4J 服务器端版 + * @return + */ + + public String getVersion() { + return version; + } + + /** + * 工作方式 loop,stream,auto(在前两者间自动选择) + * @return + */ + public String getWorkStyle() { + return workStyle; + } + + /** + * 获得引擎对象 + * @return + */ + + public CometEngine getEngine() { + return engine; + } + + /** + * 连接超时时间(连接一次请求所能在服务器端保持的最大时间,默认1分钟) + * @return + */ + public int getTimeout() { + return timeout; + } + + /** + * 缓存信息过期时间(默认1小时) + * @return + */ + public int getCacheExpires() { + return cacheExpires; + } + + /** + * 连接过期时间(连接由于异常状况处于濒死状态到宣布死亡的时间段,默认5秒) + * @return + */ + public int getConnExpires() { + return connExpires; + } + + /** + * 是否运行在调试模式 + * @return + */ + + public boolean isDebug() { + return debug; + } + + /** + * Comet4J是否已初始化完毕 + * @return + */ + + public boolean isInit() { + return init; + } + + /** + * 获得本地化标识 + * @return + */ + + public Locale getLocale() { + return locale; + } + + /** + * 获得上下文容器实例 + * @return + */ + + public ServletContext getServletContext() { + return servletContext; + } + + /** + * 缓存信息过期检查频率/微妙[默认:60000,1分种] + * @return + */ + + public int getCacheFrequency() { + return cacheFrequency; + } + + /** + * 连接检查频率/微妙[默认:5000,5秒] + * @return + */ + + public int getConnFrequency() { + return connFrequency; + } + + /** + * 得到已注册的通道列表 + * @return List + */ + public List getAppModules() { + List list = new ArrayList(); + for (int i = 0; i < appModules.size(); i++) { + String key = appModules.get(i); + list.add(key); + } + return list; + } + + /** + * 注册一个应用模块标识 + * @param anAppModule 模块标识 + */ + + public void registChannel(String anAppModule) { + if (appModules.contains(anAppModule)) { + throw new DoubleAppModuleKeyException(Language.get("DoubleAppModuleKey")); + } + appModules.add(anAppModule); + } + + @Override + public void destroy() { + appModules.clear(); + appModules = null; + engine.destroy(); + engine = null; + servletContext = null; + instance = null; + CometContextEvent e = new CometContextEvent(this, CometContextEvent.DESTROYED); + this.fireEvent(e); + } + +} diff --git a/comet4j-jar/src/org/comet4j/core/CometEngine.java b/comet4j-jar/src/org/comet4j/core/CometEngine.java new file mode 100644 index 0000000..6219312 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/CometEngine.java @@ -0,0 +1,484 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core; + +import java.io.IOException; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.comet4j.core.dto.ConnectionDTO; +import org.comet4j.core.event.BeforeConnectEvent; +import org.comet4j.core.event.BeforeDropEvent; +import org.comet4j.core.event.BeforeRemoveEvent; +import org.comet4j.core.event.ConnectEvent; +import org.comet4j.core.event.DropEvent; +import org.comet4j.core.event.DyingEvent; +import org.comet4j.core.event.ErrorEvent; +import org.comet4j.core.event.MessageEvent; +import org.comet4j.core.event.RemovedEvent; +import org.comet4j.core.event.RevivalEvent; +import org.comet4j.core.listener.BeforeConnectListener; +import org.comet4j.core.listener.BeforeDropListener; +import org.comet4j.core.listener.BeforeRemoveListener; +import org.comet4j.core.listener.ConnectListener; +import org.comet4j.core.listener.DropListener; +import org.comet4j.core.listener.DyingListener; +import org.comet4j.core.listener.MessageListener; +import org.comet4j.core.listener.RemovedListener; +import org.comet4j.core.listener.RevivalListener; +import org.comet4j.event.Observable; + +/** + * 引擎,负责管理和维持连接,并能够必要的发送服务 + */ + +@SuppressWarnings({ + "unchecked", "rawtypes" +}) +public class CometEngine extends Observable { + + private CometConnector ct; + private CometSender sender; + + public CometEngine() { + this.addEvent(BeforeConnectEvent.class); + this.addEvent(ConnectEvent.class); + this.addEvent(BeforeDropEvent.class); + this.addEvent(DropEvent.class); + this.addEvent(DyingEvent.class); + this.addEvent(RevivalEvent.class); + this.addEvent(MessageEvent.class); + this.addEvent(ErrorEvent.class);// TODO: + CometContext cc = CometContext.getInstance(); + sender = new CometSender(cc.getCacheExpires(), cc.getCacheFrequency()); + ct = new CometConnector(cc.getConnExpires(), cc.getConnFrequency()); + } + + /** + * 建立用户连接 + * @param request + * @param response + * @throws IOException + */ + void connect(HttpServletRequest request, HttpServletResponse response) throws IOException { + String uId = request.getParameter("uid"); + CometContext.getInstance().log("【CometDebug】-->【connect】-->uid:" + uId); + + CometConnection conn = new CometConnection(request, response); + BeforeConnectEvent be = new BeforeConnectEvent(this, request, response); + if (!this.fireEvent(be)) { + conn.getResponse().setStatus(HttpServletResponse.SC_BAD_REQUEST); + conn.getResponse().getWriter().close(); + return; + } + ct.addConnection(conn); + CometContext cc = CometContext.getInstance(); + ConnectionDTO cdto = new ConnectionDTO(conn.getId(), conn.getWorkStyle(), cc.getAppModules(), cc.getTimeout()); + sendTo(CometProtocol.SYS_CHANNEL, conn, cdto); + try {// 强制关闭长连接工作模式下的输出 + conn.getResponse().getWriter().close(); + conn.setState(CometProtocol.STATE_DYING); + conn.setResponse(null); + conn.setDyingTime(System.currentTimeMillis()); + } catch (Exception ex) { + } finally { + ConnectEvent e = new ConnectEvent(this, conn); + this.fireEvent(e); + } + + } + + void dying(HttpServletRequest request, HttpServletResponse response) throws IOException { + // response.setStatus(CometProtocol.HTTPSTATUS_TIMEOUT); + String uId = request.getParameter("uid"); + String cId = request.getParameter("cid"); + CometContext.getInstance().log("【CometDebug】-->【dying】-->cid:" + cId + "," + "uid:" + uId); + + CometConnection conn = ct.getConnection(request); + if (conn != null) { + CometContext.getInstance().getEngine().sendTo(CometProtocol.SYS_CHANNEL, conn, CometProtocol.STATE_DYING); + } + try { + conn.getResponse().getWriter().close(); + } catch (Exception exc) { + try { + response.getWriter().close(); + } catch (Exception excp) { + excp.printStackTrace(); + } + + } + if (conn != null) { + conn.setState(CometProtocol.STATE_DYING); + conn.setResponse(null); + conn.setDyingTime(System.currentTimeMillis()); + DyingEvent e = new DyingEvent(this, conn); + this.fireEvent(e); + } + } + + void revival(HttpServletRequest request, HttpServletResponse response) throws IOException { + String cId = getConnectionId(request); + + String uId = request.getParameter("uid"); + CometContext.getInstance().log("【CometDebug】-->【revival】-->cid:" + cId + "," + "uid:" + uId); + + if (cId == null) { + drop(request, response); + // throw new CometException("无法复活,断开连接。"); + } + CometConnection conn = ct.getConnection(cId); + if (conn != null /* && CometProtocol.STATE_DYING.equals(conn.getState()) */) { + conn.setRequest(request); + conn.setResponse(response); + conn.setDyingTime(System.currentTimeMillis()); + conn.setState(CometProtocol.STATE_ALIVE); + RevivalEvent e = new RevivalEvent(this, conn); + this.fireEvent(e); + sender.sendCacheMessage(conn); + } else { + drop(request, response); + // throw new CometException("非正常复活,断开连接。conn=" + conn); + } + } + + /** + * 断开一个连接 + * @param request + * @param response + * @throws IOException + */ + + public void drop(HttpServletRequest request, HttpServletResponse response) throws IOException { + + BeforeDropEvent be = new BeforeDropEvent(this, request); + if (!this.fireEvent(be)) { + return; + } + String cId = getConnectionId(request); + + String uId = request.getParameter("uid"); + CometContext.getInstance().log("【CometDebug】-->【drop】-->cid:" + cId + "," + "uid:" + uId); + + CometConnection conn = null; + if (cId != null) { + conn = ct.getConnection(cId); + } else { + conn = ct.getConnection(request); + } + if (conn != null) { + remove(conn); + } + // response.setStatus(CometProtocol.HTTPSTATUS_ERROR); + response.getWriter().close(); + } + + void remove(CometConnection aConn) { + + BeforeRemoveEvent be = new BeforeRemoveEvent(this, aConn); + if (!this.fireEvent(be)) { + return; + } + sender.getCacheMessage(aConn); + ct.removeConnection(aConn); + // Fixed nio endpoint exception + /* + * try { aConn.getResponse().getWriter().close(); } catch (Exception + * exc) { // 连接有可能是dying,此时getResponse为空是正常的,这里仅保证对有效的Response做出回应 } + */ + RemovedEvent re = new RemovedEvent(this, aConn); + this.fireEvent(re); + DropEvent de = new DropEvent(this, aConn); + this.fireEvent(de); + + } + + /** + * 按ID获取已有 + * @param id + * @return + */ + + public CometConnection getConnection(String id) { + return ct.getConnection(id); + } + + /** + * 按Request对象获得连接对象 + * @param request + * @return + */ + + public CometConnection getConnection(HttpServletRequest request) { + String cId = getConnectionId(request); + CometConnection conn = null; + if (cId != null) { + conn = ct.getConnection(cId); + } else { + conn = ct.getConnection(request); + } + return conn; + } + + /** + * 获得所有连接对象 + * @return + */ + + public List getConnections() { + return ct.getConnections(); + } + + /** + * 向连接发送消息 + * @param channel 应用通道标识 + * @param c 连接对象 + * @param data 数据 + */ + + public void sendTo(String channel, CometConnection c, Object data) { + CometMessage msg = new CometMessage(data, channel); + sender.sendTo(c, msg); + MessageEvent e = new MessageEvent(this, c, msg); + this.fireEvent(e); + } + + /** + * 向连接发送批量数据 + * @param channel 应用通道标识 + * @param c 连接对象 + * @param data 数据列表 + */ + + public void sendTo(String channel, CometConnection c, List data) { + for (Object o : data) { + sendTo(channel, c, o); + } + } + + /** + * 向多个连接发送数据 + * @param channel 应用通道标识 + * @param list 连接对象列表 + * @param data 数据 + */ + + public void sendTo(String channel, List list, Object data) { + if (list.isEmpty()) { + return; + } + for (CometConnection c : list) { + sendTo(channel, c, data); + } + } + + /** + * 向所有连接发送数据 + * @param channel 应用通道标识 + * @param data 数据 + */ + + public void sendToAll(String channel, Object data) { + List list = this.getConnections(); + if (list == null) { + return; + } + synchronized (list) { + for (CometConnection c : list) { + sendTo(channel, c, data); + } + } + } + + /** + * 从Request对象中获取连接ID + * @param request + * @return + */ + + public String getConnectionId(HttpServletRequest request) { + String id = request.getParameter(CometProtocol.FLAG_ID); + if (id == null || "".equals(id)) { + id = null; + } + return id; + } + + /** + * 增加即将连接事件侦听,此事件动作可以被终止。 + * @param li + */ + + public void addBeforeConnectListener(BeforeConnectListener li) { + this.addListener(BeforeConnectEvent.class, li); + } + + /** + * 移除即将连接事件侦听,此事件动作可以被终止。 + * @param li + */ + + public void removeBeforeConnectListener(BeforeConnectListener li) { + this.removeListener(BeforeConnectEvent.class, li); + } + + /** + * 增加即将断开事件侦听,此事件动作可以被终止。 + * @param li + */ + + public void addBeforeDropListener(BeforeDropListener li) { + this.addListener(BeforeDropEvent.class, li); + } + + /** + * 移除即将断开事件侦听,此事件动作可以被终止。 + * @param li + */ + + public void removeBeforeDropListener(BeforeDropListener li) { + this.removeListener(BeforeDropEvent.class, li); + } + + /** + * 增加连接即将移除事件侦听,此事件动作可以被终止。 + * @param li + */ + + public void addBeforeRemoveListener(BeforeRemoveListener li) { + this.addListener(BeforeRemoveEvent.class, li); + } + + /** + * 移除连接即将移除事件侦听,此事件动作可以被终止。 + * @param li + */ + + public void removeBeforeRemoveListener(BeforeRemoveListener li) { + this.removeListener(BeforeRemoveEvent.class, li); + } + + /** + * 增加连接事件侦听 + * @param li + */ + + public void addConnectListener(ConnectListener li) { + this.addListener(ConnectEvent.class, li); + } + + /** + * 移除连接事件侦听 + * @param li + */ + + public void removeConnectListener(ConnectListener li) { + this.removeListener(ConnectEvent.class, li); + } + + /** + * 增加连接断开事件侦听 + * @param li + */ + + public void addDropListener(DropListener li) { + this.addListener(DropEvent.class, li); + } + + /** + * 移除连接断开事件侦听 + * @param li + */ + + public void removeDropListener(DropListener li) { + this.removeListener(DropEvent.class, li); + } + + /** + * 增加连接变为濒死状态事件侦听 + * @param li + */ + + public void addDyingListener(DyingListener li) { + this.addListener(DyingEvent.class, li); + } + + /** + * 移除连接变为濒死状态事件侦听 + * @param li + */ + + public void removeDyingListener(DyingListener li) { + this.removeListener(DyingEvent.class, li); + } + + /** + * 增加发送消息事件侦听 + * @param li + */ + + public void addMessageListener(MessageListener li) { + this.addListener(MessageEvent.class, li); + } + + /** + * 移除发送消息事件侦听 + * @param li + */ + + public void removeMessageListener(MessageListener li) { + this.removeListener(MessageEvent.class, li); + } + + /** + * 增加连接已删除事件侦听 + * @param li + */ + + public void addRemovedListener(RemovedListener li) { + this.addListener(RemovedEvent.class, li); + } + + /** + * 移除连接已删除事件侦听 + * @param li + */ + + public void removeRemovedListener(RemovedListener li) { + this.removeListener(RemovedEvent.class, li); + } + + /** + * 增加连接变为复活状态事件侦听 + * @param li + */ + + public void addRevivalListener(RevivalListener li) { + this.addListener(RevivalEvent.class, li); + } + + /** + * 移除连接变为复活状态事件侦听 + * @param li + */ + public void removeRevivalListener(RevivalListener li) { + this.removeListener(RevivalEvent.class, li); + } + + @Override + public void destroy() { + super.destroy(); + ct.init = false; + ct.destroy(); + sender.destroy(); + ct = null; + sender = null; + + } + +} diff --git a/comet4j-jar/src/org/comet4j/core/CometMessage.java b/comet4j-jar/src/org/comet4j/core/CometMessage.java new file mode 100644 index 0000000..8fb3c64 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/CometMessage.java @@ -0,0 +1,83 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core; + +/** + * 用于封装向客户端发送信息的数据格式 + */ + +public class CometMessage { + + /** 应用模块标识 */ + private String channel; + private long time;// 发送时间 + private Object data;// 包含数据 + + public CometMessage(Object anData, String aChannel) { + data = anData; + channel = aChannel; + time = System.currentTimeMillis(); + } + + /** + * 获取发送时间 + * @return + */ + + public long getTime() { + return time; + } + + /** + * 设置发送时间 + * @param time + */ + + public void setTime(long time) { + this.time = time; + } + + /** + * 获取被发送数据 + * @return + */ + + public Object getData() { + return data; + } + + /** + * 设置被发送数据 + * @param data + */ + + public void setData(Object data) { + this.data = data; + } + + /** + * 获取通道标识 + * @return + */ + + public String getChannel() { + return channel; + } + + /** + * 设置通道标识 + * @param channel + */ + + public void setChannel(String channel) { + this.channel = channel; + } + + public void destroy() { + data = null; + } + +} diff --git a/comet4j-jar/src/org/comet4j/core/CometProtocol.java b/comet4j-jar/src/org/comet4j/core/CometProtocol.java new file mode 100644 index 0000000..bb076d8 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/CometProtocol.java @@ -0,0 +1,140 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core; + +import java.io.UnsupportedEncodingException; + +import org.comet4j.core.util.JSONUtil; + +/** + * 协议类,定义了与客户端通讯的一些约定标识 + */ + +public class CometProtocol { + + /** + * 系统模块标识 + */ + public static final String SYS_CHANNEL = "c4j"; + /** + * 客户端连接器版本标识 + */ + public static final String FLAG_CLIENTVERSION = "cv"; + /** + * 客户端连接ID标识 + */ + public static final String FLAG_ID = "cid"; + /** + * 客户端连接器动作标识 + */ + public static final String FLAG_ACTION = "cmd"; + /** + * 数据开始标识 + */ + public static final String FLAG_DataStart = "<"; + /** + * 数据结束结识 + */ + public static final String FLAG_DataEnd = ">"; + /** + * 连接动作 + */ + public static final String CMD_CONNECT = "conn"; + /** + * 复活动作 + */ + public static final String CMD_REVIVAL = "revival"; + /** + * 断开连接 + */ + public static final String CMD_DROP = "drop"; + /** + * 长轮询工作状态 + */ + public static final String WORKSTYLE_LLOOP = "lpool"; + /** + * 长连接工作状态(HTTP Streaming) + */ + public static final String WORKSTYLE_STREAM = "stream"; + /** + * 智能工作状态 + */ + public static final String WORKSTYLE_AUTO = "auto"; + /** + * 连接可用状态 + */ + public static final String STATE_ALIVE = "alive"; + /** + * 连接濒死状态 + */ + public static final String STATE_DYING = "dying"; + /** + * HTTP超时状态值 + */ + public static final int HTTPSTATUS_TIMEOUT = 408; + /** + * HTTP异常状态 + */ + public static final int HTTPSTATUS_ERROR = 500; + /** + * 语言配置 + */ + public static final String CONFIG_LANGUAGE = "Comet.Language"; + /** + * 工作方式配置 + */ + public static final String CONFIG_WORKSTYLE = "Comet.WorkStyle"; + /** + * 引擎配置 + */ + public static final String CONFIG_ENGINE = "Comet.CometEngine"; + /** + * 请求超时时间 + */ + public static final String CONFIG_TIMEOUT = "Comet.Timeout"; + /** + * 缓存过期时间 + */ + public static final String CONFIG_CACHEEXPIRES = "Comet.CacheExpires"; + /** + * 缓存过期检查频率 + */ + public static final String CONFIG_CACHEFREQUENCY = "Comet.CacheFrequency"; + /** + * 连接过期时间 + */ + public static final String CONFIG_CONNEXPIRES = "Comet.ConnExpires"; + /** + * 连接过期查频率 + */ + public static final String CONFIG_CONNFREQUENCY = "Comet.ConnFrequency"; + /** + * 调试 + */ + public static final String CONFIG_DEBUG = "Comet.Debug"; + + /** + * 将被发送数据使用协议进行编码 + * @param data + * @return + */ + + public static String encode(Object data) { + StringBuffer sb = new StringBuffer(); + String code = ""; + try { + code = java.net.URLEncoder.encode(JSONUtil.object2json(data).toString(), "utf-8"); + code = code.replace("+", "%20"); + } catch (UnsupportedEncodingException e) { + // TODO 尚未处理异常 + e.printStackTrace(); + } + sb.append(FLAG_DataStart); + sb.append(code); + sb.append(FLAG_DataEnd); + return sb.toString(); + } +} diff --git a/comet4j-jar/src/org/comet4j/core/CometSender.java b/comet4j-jar/src/org/comet4j/core/CometSender.java new file mode 100644 index 0000000..7e9ad4b --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/CometSender.java @@ -0,0 +1,130 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core; + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.List; + +import javax.servlet.http.HttpServletResponse; + +/** + * 消息发送器 负责消息的发送,主要由引擎类负责调用。 + */ + +public class CometSender { + + private ExpiresCache cacher; + + public CometSender(long timespan, long frequency) { + cacher = new ExpiresCache(timespan, frequency); + } + + /** + * 为一个连接发送一条消息 + * @param c + * @param e + */ + synchronized void sendTo(CometConnection c, CometMessage msg) { + if (c == null) { + return; + } + if (CometProtocol.STATE_DYING.equals(c.getState()) || c.getResponse() == null) { + cacher.push(c, msg); + return; + } + try { + writeData(c, msg); + } catch (IOException e1) { + e1.printStackTrace(); + } + } + + /** + * 为一个连接发送多条消息 + * @param c + * @param list + */ + void sendTo(CometConnection c, List list) { + if (c == null || list.isEmpty()) { + return; + } + for (CometMessage msg : list) { + sendTo(c, msg); + } + } + + /** + * 为多个连接发送一条消息 + * @param list + * @param e + */ + void sendTo(List list, CometMessage msg) { + if (list == null || list.isEmpty()) { + return; + } + for (CometConnection c : list) { + sendTo(c, msg); + } + } + + private void writeData(CometConnection c, CometMessage msg) throws IOException { + c.setDyingTime(System.currentTimeMillis()); + PrintWriter writer; + HttpServletResponse response = c.getResponse(); + response.setCharacterEncoding("UTF-8"); + response.setContentType("text/html;charset=UTF-8"); + response.setHeader("Pragma", "No-cache"); + response.setHeader("Cache-Control", "no-cache"); + response.setDateHeader("Expires", 0); + writer = response.getWriter(); + writer.print(CometProtocol.encode(msg)); + close(c); + + } + + private void close(CometConnection c) throws IOException { + if (c.getResponse() != null) { + if (c.getWorkStyle().equals(CometProtocol.WORKSTYLE_LLOOP)) { + c.setState(CometProtocol.STATE_DYING); + try { + c.getResponse().getWriter().close(); + } catch (Exception e) { + } + c.setResponse(null); + } else { + try { + c.getResponse().flushBuffer(); + } catch (Exception e) { + } + } + } + + } + + List getCacheMessage(CometConnection conn) { + return cacher.get(conn); + } + + /** + * 发送连接的缓存数据 + * @param conn + */ + + void sendCacheMessage(CometConnection conn) { + List list = this.getCacheMessage(conn); + if (list != null && !list.isEmpty()) { + for (CometMessage msg : list) { + sendTo(conn, msg); + } + } + } + + public void destroy() { + cacher.init = false; + cacher = null; + } +} diff --git a/comet4j-jar/src/org/comet4j/core/CometServlet3.java b/comet4j-jar/src/org/comet4j/core/CometServlet3.java new file mode 100644 index 0000000..45ff0ea --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/CometServlet3.java @@ -0,0 +1,72 @@ +package org.comet4j.core; + +import java.io.IOException; + +import javax.servlet.AsyncContext; +import javax.servlet.AsyncEvent; +import javax.servlet.AsyncListener; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@WebServlet(name = "comet4j-connector", urlPatterns = { + "/comet" +}, asyncSupported = true) +public class CometServlet3 extends HttpServlet { + + private static final long serialVersionUID = 5406891954492689797L; + + @Override + protected void service(HttpServletRequest request, HttpServletResponse response) { + if (request.isAsyncSupported() && !request.isAsyncStarted()) { + AsyncContext actx = request.getAsyncContext(); + actx.setTimeout(CometContext.getInstance().getTimeout()); + actx.addListener(new AsyncListener() { + + public void onStartAsync(AsyncEvent event) throws IOException { + HttpServletRequest request = (HttpServletRequest) event.getAsyncContext().getRequest(); + HttpServletResponse response = (HttpServletResponse) event.getAsyncContext().getResponse(); + String action = request.getParameter(CometProtocol.FLAG_ACTION); + + if (CometProtocol.CMD_CONNECT.equals(action)) { + + CometContext.getInstance().getEngine().connect(request, response); + } else if (CometProtocol.CMD_REVIVAL.equals(action)) { + + CometContext.getInstance().getEngine().revival(request, response); + + } else if (CometProtocol.CMD_DROP.equals(action)) { + CometContext.getInstance().getEngine().drop(request, response); + } + } + + public void onComplete(AsyncEvent event) throws IOException { + HttpServletRequest request = (HttpServletRequest) event.getAsyncContext().getRequest(); + HttpServletResponse response = (HttpServletResponse) event.getAsyncContext().getResponse(); + CometContext.getInstance().getEngine().dying(request, response); + } + + public void onTimeout(AsyncEvent event) throws IOException { + HttpServletRequest request = (HttpServletRequest) event.getAsyncContext().getRequest(); + HttpServletResponse response = (HttpServletResponse) event.getAsyncContext().getResponse(); + CometContext.getInstance().getEngine().dying(request, response); + } + + public void onError(AsyncEvent event) throws IOException { + HttpServletRequest request = (HttpServletRequest) event.getAsyncContext().getRequest(); + HttpServletResponse response = (HttpServletResponse) event.getAsyncContext().getResponse(); + CometContext.getInstance().getEngine().drop(request, response); + } + + }); + request.startAsync(request, response); + + } else { + System.out.println("Async not supported"); + request.startAsync(request, response); + + } + + } +} diff --git a/comet4j-jar/src/org/comet4j/core/CometServletTomcat6.java b/comet4j-jar/src/org/comet4j/core/CometServletTomcat6.java new file mode 100644 index 0000000..859ab1b --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/CometServletTomcat6.java @@ -0,0 +1,73 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core; + +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.catalina.CometEvent; +import org.apache.catalina.CometProcessor; + +/** + * 连接前端Servlet,负责处理连接请求,并转交给引擎处理。 + */ +public class CometServletTomcat6 extends HttpServlet implements CometProcessor { + + private static final long serialVersionUID = 1L; + + public CometServletTomcat6() { + super(); + } + + /* + * @see + * org.apache.catalina.CometProcessor#event(org.apache.catalina.CometEvent) + */ + public void event(CometEvent event) throws IOException, ServletException { + HttpServletRequest request = event.getHttpServletRequest(); + HttpServletResponse response = event.getHttpServletResponse(); + // request.setAttribute("org.apache.tomcat.comet.timeout", + // CometContext.getInstance().getTimeout()); + + if (event.getEventType() == CometEvent.EventType.BEGIN) { + event.setTimeout(CometContext.getInstance().getTimeout()); + String action = request.getParameter(CometProtocol.FLAG_ACTION); + if (CometProtocol.CMD_CONNECT.equals(action)) { + CometContext.getInstance().getEngine().connect(request, response); + event.close(); + } else if (CometProtocol.CMD_REVIVAL.equals(action)) { + CometContext.getInstance().getEngine().revival(request, response); + } else if (CometProtocol.CMD_DROP.equals(action)) { + CometContext.getInstance().getEngine().drop(request, response); + event.close(); + } + } else if (event.getEventType() == CometEvent.EventType.ERROR) { + if (event.getEventSubType() == CometEvent.EventSubType.TIMEOUT) { + CometContext.getInstance().getEngine().dying(request, response); + event.close(); + } else { + CometContext.getInstance().getEngine().drop(request, response); + event.close(); + } + } else if (event.getEventType() == CometEvent.EventType.END) { + CometContext.getInstance().getEngine().dying(request, response); + event.close(); + } else if (event.getEventType() == CometEvent.EventType.READ) { + event.close(); + } + + } + + @Override + public void destroy() { + super.destroy(); + } + +} diff --git a/comet4j-jar/src/org/comet4j/core/CometServletTomcat7.java b/comet4j-jar/src/org/comet4j/core/CometServletTomcat7.java new file mode 100644 index 0000000..6f2339d --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/CometServletTomcat7.java @@ -0,0 +1,77 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core; + +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.catalina.comet.CometEvent; +import org.apache.catalina.comet.CometProcessor; + +/** + * 连接前端Servlet,负责处理连接请求,并转交给引擎处理。 + */ +public class CometServletTomcat7 extends HttpServlet implements CometProcessor { + + private static final long serialVersionUID = 1L; + + public CometServletTomcat7() { + super(); + } + + /* + * @see + * org.apache.catalina.CometProcessor#event(org.apache.catalina.CometEvent) + */ + public void event(CometEvent event) throws IOException, ServletException { + HttpServletRequest request = event.getHttpServletRequest(); + HttpServletResponse response = event.getHttpServletResponse(); + + if (event.getEventType() == CometEvent.EventType.BEGIN) { + event.setTimeout(CometContext.getInstance().getTimeout()); + String action = request.getParameter(CometProtocol.FLAG_ACTION); + if (CometProtocol.CMD_CONNECT.equals(action)) { + //System.out.println("CONNECT"); + CometContext.getInstance().getEngine().connect(request, response); + event.close(); + } else if (CometProtocol.CMD_REVIVAL.equals(action)) { + //System.out.println("REVIVAL"); + CometContext.getInstance().getEngine().revival(request, response); + } else if (CometProtocol.CMD_DROP.equals(action)) { + //System.out.println("DROP"); + CometContext.getInstance().getEngine().drop(request, response); + event.close(); + } + } else if (event.getEventType() == CometEvent.EventType.ERROR) { + if (event.getEventSubType() == CometEvent.EventSubType.TIMEOUT) { + //System.out.println("TIMEOUT"); + CometContext.getInstance().getEngine().dying(request, response); + event.close(); + } else { + //System.out.println("ERROR"); + CometContext.getInstance().getEngine().drop(request, response); + event.close(); + } + } else if (event.getEventType() == CometEvent.EventType.END) { + //System.out.println("END"); + CometContext.getInstance().getEngine().dying(request, response); + event.close(); + } else if (event.getEventType() == CometEvent.EventType.READ) { + event.close(); + } + + } + + @Override + public void destroy() { + super.destroy(); + } + +} diff --git a/comet4j-jar/src/org/comet4j/core/ExpiresCache.java b/comet4j-jar/src/org/comet4j/core/ExpiresCache.java new file mode 100644 index 0000000..6cf3ae2 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/ExpiresCache.java @@ -0,0 +1,142 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.WeakHashMap; + +/** + * 过期缓存器 可自动将过期内容清除,检测频率、过期时间 线程安全 一个键可以存放多个值 需改进:变成范型 + */ + +public class ExpiresCache { + + private final long timespan; + private final long frequency; + boolean init = false; + private long size = 0l; // 临时保留缓存数量 + private final Map> cache = Collections + .synchronizedMap(new WeakHashMap>()); + + /** + * 构造 + * @param aTimespan 过期时长,毫秒 + * @param aFrequency 过期检测频率,毫秒 + */ + + public ExpiresCache(long aTimespan, long aFrequency) { + init = true; + frequency = aFrequency; + timespan = aTimespan; + Thread cleanerThread = new Thread(new CacheCleaner(), "Comet4J-MessageCleaner"); + cleanerThread.setDaemon(true); + cleanerThread.start(); + + } + + public synchronized void push(CometConnection c, CometMessage e) { + if (c == null) return; + List list = cache.get(c); + if (list == null) { + list = new ArrayList(); + cache.put(c, list); + } + list.add(e); + } + + public synchronized void push(CometConnection c, List e) { + if (c == null) return; + List list = cache.get(c); + if (list == null) { + list = new ArrayList(); + cache.put(c, list); + } + list.addAll(e); + } + + /** + * 获取连接的失败消息列表,取出后将此连接及信息从缓存清除 + * @param c 连接 + * @return 如果没有连接对应的消息返回null,若取到此边接的消息列表 + */ + public synchronized List get(CometConnection c) { + List list = cache.get(c); + if (list != null) { + cache.remove(c); + } + return list; + } + + // ----------定时清理过期信息--------------- + class CacheCleaner implements Runnable { + + private final List toDeleteList = new ArrayList(); + private final List toDeleteMessageList = new ArrayList(); + + public void run() { + while (init) { + try { + CometContext.getInstance().log("【CometDebug】开始清理消息缓存"); + Thread.sleep(frequency); + checkExpires(); + CometContext.getInstance().log("【CometDebug】开始清理消息缓存完毕"); + } catch (Exception ex) { + ex.printStackTrace(); + } + + } + } + + // 过期检查 + private void checkExpires() { + size = 0; + synchronized (cache) { + for (CometConnection o : cache.keySet()) { + List list = cache.get(o); + size += list.size(); + if (list.size() > 0) { + // 寻找过期消息条目 + synchronized (list) { + for (CometMessage msg : list) { + long expireMillis = msg.getTime() + timespan; + if (expireMillis < System.currentTimeMillis()) { + toDeleteMessageList.add(msg); + } + } + if (!toDeleteMessageList.isEmpty()) { + for (CometMessage msg : toDeleteMessageList) { + list.remove(msg); + } + toDeleteMessageList.clear(); + } + } + } + if (list.size() == 0) { + toDeleteList.add(o); + } + } + if (!toDeleteList.isEmpty()) { + for (CometConnection c : toDeleteList) { + cache.remove(c); + } + toDeleteList.clear(); + } + } + CometContext.getInstance().log("【CometDebug】缓存数量:" + size); + } + } + + public void destroy() { + init = false; + for (Object o : cache.keySet()) { + cache.get(o).clear(); + } + cache.clear(); + } +} diff --git a/comet4j-jar/src/org/comet4j/core/Language.java b/comet4j-jar/src/org/comet4j/core/Language.java new file mode 100644 index 0000000..cfa51f1 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/Language.java @@ -0,0 +1,81 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core; + +import java.io.InputStream; +import java.util.Locale; +import java.util.Properties; + +/** + * 负责初始化和读取本地化字符串 + */ + +public class Language { + + private static String cnLanguageFile = "/language-cn.xml"; + private static String enLanguageFile = "/language-en.xml"; + + private static Properties prop; + + private static void beforeGet() { + if (prop == null) { + Locale locale = CometContext.getInstance().getLocale(); + if (Locale.ENGLISH == locale) { + InputStream in = Language.class.getResourceAsStream(enLanguageFile); + prop = new Properties(); + try { + prop.loadFromXML(in); + } catch (Exception e) { + e.printStackTrace(); + } + } + if (Locale.CHINESE == locale) { + InputStream in = Language.class.getResourceAsStream(cnLanguageFile); + prop = new Properties(); + try { + prop.loadFromXML(in); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + /** + * 按Key获取本地化字符串 + * @param key + * @return + */ + + public static String get(String key) { + beforeGet(); + return prop.getProperty(key); + } + + /** + * 获取连接成功本地化字符串 + * @return + */ + + public static String getConnectSuccess() { + beforeGet(); + return prop.getProperty("ConnectSuccess"); + } + + /** + * 获取连接失败本地化字符串 + * @return + */ + + public static String getConnectFailure() { + beforeGet(); + return prop.getProperty("ConnectFailure"); + } + + public void destroy() { + prop = null; + } +} diff --git a/comet4j-jar/src/org/comet4j/core/dto/ConnectionDTO.java b/comet4j-jar/src/org/comet4j/core/dto/ConnectionDTO.java new file mode 100644 index 0000000..e1677f9 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/dto/ConnectionDTO.java @@ -0,0 +1,71 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.dto; + +import java.util.List; + +/** + * 连接成功后所发送的数据对象 + */ +public class ConnectionDTO { + + public ConnectionDTO(String cId, String ws, List channels, int timeout) { + this.cId = cId; + this.ws = ws; + this.channels = channels; + this.timeout = timeout; + } + + /** + * 连接ID + */ + private String cId; + /** + * 工作模式workStyle + */ + private String ws; + /** + * 应用模块列表appModuesList + */ + private List channels; + /** + * 服务器超时时间 + */ + private int timeout; + + public String getcId() { + return cId; + } + + public void setcId(String cId) { + this.cId = cId; + } + + public List getChannels() { + return channels; + } + + public void setChannels(List channels) { + this.channels = channels; + } + + public String getWs() { + return ws; + } + + public void setWs(String ws) { + this.ws = ws; + } + + public int getTimeout() { + return timeout; + } + + public void setTimeout(int timeout) { + this.timeout = timeout; + } + +} diff --git a/comet4j-jar/src/org/comet4j/core/event/BeforeConnectEvent.java b/comet4j-jar/src/org/comet4j/core/event/BeforeConnectEvent.java new file mode 100644 index 0000000..26c9b17 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/event/BeforeConnectEvent.java @@ -0,0 +1,51 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.event; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.comet4j.core.CometEngine; +import org.comet4j.event.Event; + +/** + * 即将连接以前事件对象 + */ + +public class BeforeConnectEvent extends Event { + + private HttpServletRequest request; + private HttpServletResponse response; + + public BeforeConnectEvent(CometEngine target, HttpServletRequest anRequest, HttpServletResponse anResponse) { + super(target); + request = anRequest; + response = anResponse; + } + + public HttpServletRequest getRequest() { + return request; + } + + public void setRequest(HttpServletRequest request) { + this.request = request; + } + + public HttpServletResponse getResponse() { + return response; + } + + public void setResponse(HttpServletResponse response) { + this.response = response; + } + + @Override + public void destroy() { + super.destroy(); + request = null; + response = null; + } +} diff --git a/comet4j-jar/src/org/comet4j/core/event/BeforeDropEvent.java b/comet4j-jar/src/org/comet4j/core/event/BeforeDropEvent.java new file mode 100644 index 0000000..59f7584 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/event/BeforeDropEvent.java @@ -0,0 +1,39 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.event; + +import javax.servlet.http.HttpServletRequest; + +import org.comet4j.core.CometEngine; +import org.comet4j.event.Event; + +/** + * 即将断开前的事件对象 + */ + +public class BeforeDropEvent extends Event { + + private HttpServletRequest request; + + public BeforeDropEvent(CometEngine target, HttpServletRequest aRequest) { + super(target); + request = aRequest; + } + + public HttpServletRequest getRequest() { + return request; + } + + public void setRequest(HttpServletRequest request) { + this.request = request; + } + + @Override + public void destroy() { + super.destroy(); + request = null; + } +} diff --git a/comet4j-jar/src/org/comet4j/core/event/BeforeRemoveEvent.java b/comet4j-jar/src/org/comet4j/core/event/BeforeRemoveEvent.java new file mode 100644 index 0000000..9c266c9 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/event/BeforeRemoveEvent.java @@ -0,0 +1,38 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.event; + +import org.comet4j.core.CometConnection; +import org.comet4j.core.CometEngine; +import org.comet4j.event.Event; + +/** + * 连接被移除前的事件对象 + */ + +public class BeforeRemoveEvent extends Event { + + private CometConnection conn; + + public BeforeRemoveEvent(CometEngine target, CometConnection aConn) { + super(target); + conn = aConn; + } + + public CometConnection getConn() { + return conn; + } + + public void setConn(CometConnection conn) { + this.conn = conn; + } + + @Override + public void destroy() { + super.destroy(); + conn = null; + } +} diff --git a/comet4j-jar/src/org/comet4j/core/event/CometContextEvent.java b/comet4j-jar/src/org/comet4j/core/event/CometContextEvent.java new file mode 100644 index 0000000..1d973da --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/event/CometContextEvent.java @@ -0,0 +1,62 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.event; + +import javax.servlet.ServletContext; + +import org.comet4j.core.CometContext; +import org.comet4j.event.Event; +import org.comet4j.event.demo.mac.SubEventType; + +/** + * Comet4J上下文初始化完成事件对象 + */ + +public class CometContextEvent extends Event { + + public static SubEventType INITIALIZED = new SubEventType(); + public static SubEventType DESTROYED = new SubEventType(); + private SubEventType subType; + private ServletContext servletContext; + private CometContext cometContext; + + public CometContextEvent(CometContext target, SubEventType anSubType) { + super(target); + subType = anSubType; + } + + public SubEventType getSubType() { + return subType; + } + + public void setSubType(SubEventType subType) { + this.subType = subType; + } + + public ServletContext getServletContext() { + return servletContext; + } + + public void setServletContext(ServletContext servletContext) { + this.servletContext = servletContext; + } + + public CometContext getCometContext() { + return cometContext; + } + + public void setCometContext(CometContext cometContext) { + this.cometContext = cometContext; + } + + @Override + public void destroy() { + super.destroy(); + subType = null; + servletContext = null; + cometContext = null; + } +} diff --git a/comet4j-jar/src/org/comet4j/core/event/ConnectEvent.java b/comet4j-jar/src/org/comet4j/core/event/ConnectEvent.java new file mode 100644 index 0000000..475d23d --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/event/ConnectEvent.java @@ -0,0 +1,38 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.event; + +import org.comet4j.core.CometConnection; +import org.comet4j.core.CometEngine; +import org.comet4j.event.Event; + +/** + * 连接事件对象 + */ + +public class ConnectEvent extends Event { + + private CometConnection conn; + + public ConnectEvent(CometEngine target, CometConnection anConn) { + super(target); + conn = anConn; + } + + public CometConnection getConn() { + return conn; + } + + public void setConn(CometConnection conn) { + this.conn = conn; + } + + @Override + public void destroy() { + super.destroy(); + conn = null; + } +} diff --git a/comet4j-jar/src/org/comet4j/core/event/DropEvent.java b/comet4j-jar/src/org/comet4j/core/event/DropEvent.java new file mode 100644 index 0000000..ec2fb5e --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/event/DropEvent.java @@ -0,0 +1,38 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.event; + +import org.comet4j.core.CometConnection; +import org.comet4j.core.CometEngine; +import org.comet4j.event.Event; + +/** + * 连接断开事件对象 + */ + +public class DropEvent extends Event { + + private CometConnection conn; + + public DropEvent(CometEngine target, CometConnection aConn) { + super(target); + conn = aConn; + } + + public CometConnection getConn() { + return conn; + } + + public void setConn(CometConnection conn) { + this.conn = conn; + } + + @Override + public void destroy() { + super.destroy(); + conn = null; + } +} diff --git a/comet4j-jar/src/org/comet4j/core/event/DyingEvent.java b/comet4j-jar/src/org/comet4j/core/event/DyingEvent.java new file mode 100644 index 0000000..faa2759 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/event/DyingEvent.java @@ -0,0 +1,38 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.event; + +import org.comet4j.core.CometConnection; +import org.comet4j.core.CometEngine; +import org.comet4j.event.Event; + +/** + * 连接濒死状态事件对象 + */ + +public class DyingEvent extends Event { + + private CometConnection conn; + + public DyingEvent(CometEngine target, CometConnection aConn) { + super(target); + conn = aConn; + } + + public CometConnection getConn() { + return conn; + } + + public void setConn(CometConnection conn) { + this.conn = conn; + } + + @Override + public void destroy() { + super.destroy(); + conn = null; + } +} diff --git a/comet4j-jar/src/org/comet4j/core/event/ErrorEvent.java b/comet4j-jar/src/org/comet4j/core/event/ErrorEvent.java new file mode 100644 index 0000000..d7be8dc --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/event/ErrorEvent.java @@ -0,0 +1,28 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.event; + +import org.comet4j.core.CometEngine; +import org.comet4j.event.Event; + +public class ErrorEvent extends Event { + + private Exception err; + + public ErrorEvent(CometEngine target, Exception anErr) { + super(target); + err = anErr; + } + + public Exception getErr() { + return err; + } + + public void setErr(Exception err) { + this.err = err; + } + +} diff --git a/comet4j-jar/src/org/comet4j/core/event/MessageEvent.java b/comet4j-jar/src/org/comet4j/core/event/MessageEvent.java new file mode 100644 index 0000000..b24e6b6 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/event/MessageEvent.java @@ -0,0 +1,50 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.event; + +import org.comet4j.core.CometConnection; +import org.comet4j.core.CometEngine; +import org.comet4j.core.CometMessage; +import org.comet4j.event.Event; + +/** + * 发送消息事件对象 + */ + +public class MessageEvent extends Event { + + private CometConnection conn; + private CometMessage data; + + public MessageEvent(CometEngine target, CometConnection aConn, CometMessage aData) { + super(target); + conn = aConn; + data = aData; + } + + public CometConnection getConn() { + return conn; + } + + public void setConn(CometConnection conn) { + this.conn = conn; + } + + public CometMessage getData() { + return data; + } + + public void setData(CometMessage data) { + this.data = data; + } + + @Override + public void destroy() { + super.destroy(); + conn = null; + data = null; + } +} diff --git a/comet4j-jar/src/org/comet4j/core/event/RemovedEvent.java b/comet4j-jar/src/org/comet4j/core/event/RemovedEvent.java new file mode 100644 index 0000000..882336c --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/event/RemovedEvent.java @@ -0,0 +1,38 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.event; + +import org.comet4j.core.CometConnection; +import org.comet4j.core.CometEngine; +import org.comet4j.event.Event; + +/** + * 移除连接事件对象 + */ + +public class RemovedEvent extends Event { + + private CometConnection conn; + + public RemovedEvent(CometEngine target, CometConnection aConn) { + super(target); + conn = aConn; + } + + public CometConnection getConn() { + return conn; + } + + public void setConn(CometConnection conn) { + this.conn = conn; + } + + @Override + public void destroy() { + super.destroy(); + conn = null; + } +} diff --git a/comet4j-jar/src/org/comet4j/core/event/RevivalEvent.java b/comet4j-jar/src/org/comet4j/core/event/RevivalEvent.java new file mode 100644 index 0000000..82da71b --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/event/RevivalEvent.java @@ -0,0 +1,38 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.event; + +import org.comet4j.core.CometConnection; +import org.comet4j.core.CometEngine; +import org.comet4j.event.Event; + +/** + * 连接复活事件对象 + */ + +public class RevivalEvent extends Event { + + private CometConnection conn; + + public RevivalEvent(CometEngine target, CometConnection anConn) { + super(target); + conn = anConn; + } + + public CometConnection getConn() { + return conn; + } + + public void setConn(CometConnection conn) { + this.conn = conn; + } + + @Override + public void destroy() { + super.destroy(); + conn = null; + } +} diff --git a/comet4j-jar/src/org/comet4j/core/exception/CometException.java b/comet4j-jar/src/org/comet4j/core/exception/CometException.java new file mode 100644 index 0000000..a38a1e4 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/exception/CometException.java @@ -0,0 +1,30 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.exception; + +/** + * Comet4J异常 + */ + +public class CometException extends RuntimeException { + + private static final long serialVersionUID = 3048792398595051727L; + private Throwable cause; + + public CometException(String message) { + super(message); + } + + public CometException(Throwable t) { + super(t.getMessage()); + this.cause = t; + } + + @Override + public Throwable getCause() { + return this.cause; + } +} diff --git a/comet4j-jar/src/org/comet4j/core/exception/DoubleAppModuleKeyException.java b/comet4j-jar/src/org/comet4j/core/exception/DoubleAppModuleKeyException.java new file mode 100644 index 0000000..2aeeca1 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/exception/DoubleAppModuleKeyException.java @@ -0,0 +1,25 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.exception; + +/** + * 重复的应用通道标识 + */ + +public class DoubleAppModuleKeyException extends CometException { + + /** serialVersionUID */ + private static final long serialVersionUID = -679462669681889902L; + + /** + * @param message + */ + + public DoubleAppModuleKeyException(String message) { + super(message); + } + +} diff --git a/comet4j-jar/src/org/comet4j/core/interfaces/CometEngineInterfaces.java b/comet4j-jar/src/org/comet4j/core/interfaces/CometEngineInterfaces.java new file mode 100644 index 0000000..a5db8b0 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/interfaces/CometEngineInterfaces.java @@ -0,0 +1,32 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.interfaces; + +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.comet4j.core.CometConnection; + +public interface CometEngineInterfaces { + + // public ServerInfoDTO getServerInfo(HttpServletRequest request, + // HttpServletResponse response); + public void connect(HttpServletRequest request, HttpServletResponse response); + + public void revival(HttpServletRequest request, HttpServletResponse response); + + public void drop(HttpServletRequest request, HttpServletResponse response); + + public void timeout(HttpServletRequest request, HttpServletResponse response); + + public List getConnections(); + + public void send(String id); + + public void publish(String id); +} diff --git a/comet4j-jar/src/org/comet4j/core/interfaces/JSONSerializable.java b/comet4j-jar/src/org/comet4j/core/interfaces/JSONSerializable.java new file mode 100644 index 0000000..43b32e3 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/interfaces/JSONSerializable.java @@ -0,0 +1,10 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.interfaces; + +public interface JSONSerializable { + +} diff --git a/comet4j-jar/src/org/comet4j/core/listener/BeforeConnectListener.java b/comet4j-jar/src/org/comet4j/core/listener/BeforeConnectListener.java new file mode 100644 index 0000000..bafa953 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/listener/BeforeConnectListener.java @@ -0,0 +1,17 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.listener; + +import org.comet4j.core.event.BeforeConnectEvent; +import org.comet4j.event.Listener; + +/** + * 即将连接事件侦听抽象类 + */ + +public abstract class BeforeConnectListener extends Listener { + +} diff --git a/comet4j-jar/src/org/comet4j/core/listener/BeforeDropListener.java b/comet4j-jar/src/org/comet4j/core/listener/BeforeDropListener.java new file mode 100644 index 0000000..fb2e2c0 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/listener/BeforeDropListener.java @@ -0,0 +1,16 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.listener; + +import org.comet4j.core.event.BeforeDropEvent; +import org.comet4j.event.Listener; + +/** + * 连接即将断开事件侦听抽象类 + */ +public abstract class BeforeDropListener extends Listener { + +} diff --git a/comet4j-jar/src/org/comet4j/core/listener/BeforeRemoveListener.java b/comet4j-jar/src/org/comet4j/core/listener/BeforeRemoveListener.java new file mode 100644 index 0000000..c12caa9 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/listener/BeforeRemoveListener.java @@ -0,0 +1,16 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.listener; + +import org.comet4j.core.event.BeforeRemoveEvent; +import org.comet4j.event.Listener; + +/** + * 连接即将移除事件侦听抽象类 + */ +public abstract class BeforeRemoveListener extends Listener { + +} diff --git a/comet4j-jar/src/org/comet4j/core/listener/CometContextListener.java b/comet4j-jar/src/org/comet4j/core/listener/CometContextListener.java new file mode 100644 index 0000000..8402dab --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/listener/CometContextListener.java @@ -0,0 +1,29 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.listener; + +import org.comet4j.core.event.CometContextEvent; +import org.comet4j.event.Listener; + +/** + * 上下文事件侦听抽象类 + */ +public abstract class CometContextListener extends Listener { + + @Override + public boolean handleEvent(CometContextEvent event) { + if (CometContextEvent.INITIALIZED == event.getSubType()) { + return onInitialized(event); + } else if (CometContextEvent.DESTROYED == event.getSubType()) { + return onDestroyed(event); + } + return true; + } + + public abstract boolean onInitialized(CometContextEvent event); + + public abstract boolean onDestroyed(CometContextEvent event); +} diff --git a/comet4j-jar/src/org/comet4j/core/listener/ConnectListener.java b/comet4j-jar/src/org/comet4j/core/listener/ConnectListener.java new file mode 100644 index 0000000..360d693 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/listener/ConnectListener.java @@ -0,0 +1,16 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.listener; + +import org.comet4j.core.event.ConnectEvent; +import org.comet4j.event.Listener; + +/** + * 连接事件侦听抽象类 + */ +public abstract class ConnectListener extends Listener { + +} diff --git a/comet4j-jar/src/org/comet4j/core/listener/DropListener.java b/comet4j-jar/src/org/comet4j/core/listener/DropListener.java new file mode 100644 index 0000000..387565a --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/listener/DropListener.java @@ -0,0 +1,16 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.listener; + +import org.comet4j.core.event.DropEvent; +import org.comet4j.event.Listener; + +/** + * 连接断开事件侦听抽象类 + */ +public abstract class DropListener extends Listener { + +} diff --git a/comet4j-jar/src/org/comet4j/core/listener/DyingListener.java b/comet4j-jar/src/org/comet4j/core/listener/DyingListener.java new file mode 100644 index 0000000..188d033 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/listener/DyingListener.java @@ -0,0 +1,16 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.listener; + +import org.comet4j.core.event.DyingEvent; +import org.comet4j.event.Listener; + +/** + * 连接濒死状态事件侦听抽象类 + */ +public abstract class DyingListener extends Listener { + +} diff --git a/comet4j-jar/src/org/comet4j/core/listener/ErrorListener.java b/comet4j-jar/src/org/comet4j/core/listener/ErrorListener.java new file mode 100644 index 0000000..e4362e8 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/listener/ErrorListener.java @@ -0,0 +1,13 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.listener; + +import org.comet4j.core.event.ErrorEvent; +import org.comet4j.event.Listener; + +public abstract class ErrorListener extends Listener { + +} diff --git a/comet4j-jar/src/org/comet4j/core/listener/MessageListener.java b/comet4j-jar/src/org/comet4j/core/listener/MessageListener.java new file mode 100644 index 0000000..f34d14c --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/listener/MessageListener.java @@ -0,0 +1,16 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.listener; + +import org.comet4j.core.event.MessageEvent; +import org.comet4j.event.Listener; + +/** + * 消息发送事件侦听抽象类 + */ +public abstract class MessageListener extends Listener { + +} diff --git a/comet4j-jar/src/org/comet4j/core/listener/RemovedListener.java b/comet4j-jar/src/org/comet4j/core/listener/RemovedListener.java new file mode 100644 index 0000000..dd54ac4 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/listener/RemovedListener.java @@ -0,0 +1,16 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.listener; + +import org.comet4j.core.event.RemovedEvent; +import org.comet4j.event.Listener; + +/** + * 移除连接事件侦听抽象类 + */ +public abstract class RemovedListener extends Listener { + +} diff --git a/comet4j-jar/src/org/comet4j/core/listener/RevivalListener.java b/comet4j-jar/src/org/comet4j/core/listener/RevivalListener.java new file mode 100644 index 0000000..7862cb6 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/listener/RevivalListener.java @@ -0,0 +1,16 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.listener; + +import org.comet4j.core.event.RevivalEvent; +import org.comet4j.event.Listener; + +/** + * 连接复活事件侦听抽象类 + */ +public abstract class RevivalListener extends Listener { + +} diff --git a/comet4j-jar/src/org/comet4j/core/temp/AjaxHttpRequest.java b/comet4j-jar/src/org/comet4j/core/temp/AjaxHttpRequest.java new file mode 100644 index 0000000..dc36899 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/temp/AjaxHttpRequest.java @@ -0,0 +1,662 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.temp; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.Proxy; +import java.net.URL; +import java.net.URLConnection; +import java.net.URLEncoder; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.StringTokenizer; +import java.util.logging.Level; + +/** + * AjaxHttpRequest ,用java 模拟 浏览器的 XMLHttpRequest 对象. 目的是 用 操作浏览器中的XHR对象的 + * 方式来处理java端的 http请求. + * @author fins 本类的实现借鉴了 cobra 组件的 org.lobobrowser.html.test.SimpleHttpRequest + * 类. 可以看作是对 SimpleHttpRequest 类的一个完善和补充. cobra 组件是一个 Java HTML Renderer + * & Parser, 官方网站 : http://lobobrowser.org/cobra.jsp + */ + +public class AjaxHttpRequest { + + // 对应 XMLHttpRequest 的5种状态. + public static final int STATE_UNINITIALIZED = 0; + public static final int STATE_LOADING = 1; + public static final int STATE_LOADED = 2; + public static final int STATE_INTERACTIVE = 3; + public static final int STATE_COMPLETE = 4; + + // 默认的 userAgent + public static final String DEFAULT_USERAGENT = "Mozilla/4.0 (compatible; MSIE 6.0;) JavaAjax/1.0"; + + // 默认的 编码 + public static final String DEFAULT_AJAX_CHARSET = "UTF-8"; + public static final String DEFAULT_HTTP_CHARSET = "ISO-8859-1"; + + // 默认的 HTTP method + public static final String DEFAULT_REQUEST_METHOD = "POST"; + + private int readyState; + private int status; + private String statusText; + private String responseHeaders; + private byte[] responseBytes; + @SuppressWarnings("rawtypes") + private Map responseHeadersMap; + @SuppressWarnings("rawtypes") + private final Map requestHeadersMap; + private ReadyStateChangeListener readyStateChangeListener; + + private boolean async; + private boolean sent; + private URLConnection connection; + private String userAgent = DEFAULT_USERAGENT; + private String postCharset = DEFAULT_AJAX_CHARSET; + private Proxy proxy; + + private URL requestURL; + protected String requestMethod; + protected String requestUserName; + protected String requestPassword; + + // /////////////////////////////// + // /////////////////////////////// + + /** + * 构造方法. 自动添加 XMLHttpRequest 的一些缺省头信息. 如果不需要这些头信息,可在创建 AjaxHttpRequest 实例后, + * 通过 setRequestHeader/removeRequestHeader/removeAllRequestHeaders 方法 + * 进行修改或移除. + */ + @SuppressWarnings("rawtypes") + public AjaxHttpRequest() { + requestHeadersMap = new LinkedHashMap(); + setRequestHeader("X-Requested-With", "XMLHttpRequest"); + setRequestHeader("Accept", "text/javascript, text/html, application/xml, application/json, text/xml, */*"); + } + + /** + * 类似 XMLHttpRequest 中的 readyState 属性. + */ + public synchronized int getReadyState() { + return this.readyState; + } + + /** + * 类似 XMLHttpRequest 中的 status 属性. + */ + public synchronized int getStatus() { + return this.status; + } + + /** + * 类似 XMLHttpRequest 中的 statusText 属性. + */ + public synchronized String getStatusText() { + return this.statusText; + } + + /** + * 类似 XMLHttpRequest 中的 setRequestHeader 方法. + */ + @SuppressWarnings("unchecked") + public void setRequestHeader(String key, String value) { + this.requestHeadersMap.put(key, value); + } + + /** + * 类似 XMLHttpRequest 中的 open 方法. + */ + public void open(String method, String url, boolean async, String userName, String password) throws IOException { + URL urlObj = createURL(null, url); + open(method, urlObj, async, userName, password); + } + + /** + * 类似 XMLHttpRequest 中的 open 方法. + */ + public void open(final String method, final URL url, boolean async, final String userName, final String password) + throws IOException { + this.abort(); + Proxy proxy = this.proxy; + URLConnection c = proxy == null || proxy == Proxy.NO_PROXY ? url.openConnection() : url.openConnection(proxy); + synchronized (this) { + this.connection = c; + this.async = async; + this.requestMethod = method; + this.requestURL = url; + this.requestUserName = userName; + this.requestPassword = password; + } + this.changeState(AjaxHttpRequest.STATE_LOADING, 0, null, null); + } + + /** + * 类似 XMLHttpRequest 中的 open 方法. 省略部分参数的形式. + */ + public void open(String url, boolean async) throws IOException { + open(DEFAULT_REQUEST_METHOD, url, async, null, null); + } + + /** + * 类似 XMLHttpRequest 中的 open 方法. 省略部分参数的形式. + */ + public void open(String method, String url, boolean async) throws IOException { + open(method, url, async, null, null); + } + + /** + * 类似 XMLHttpRequest 中的 send 方法. 支持发送 key-value 形式的数据集合(Map). 传入map参数, + * 自动转换成string形式 并调用 send(String) 方法发送. + */ + @SuppressWarnings("rawtypes") + public void send(Map parameters) throws IOException { + Iterator keyItr = parameters.keySet().iterator(); + StringBuffer strb = new StringBuffer(); + while (keyItr.hasNext()) { + Object key = keyItr.next(); + String keyStr = encode(key); + String valueStr = encode(parameters.get(key)); + strb.append(keyStr).append("=").append(valueStr); + strb.append("&"); + } + send(strb.toString()); + } + + /** + * 类似 XMLHttpRequest 中的 send 方法. + */ + public void send(final String content) throws IOException { + final URL url = this.requestURL; + if (url == null) { + throw new IOException("No URL has been provided."); + } + if (this.isAsync()) { + new Thread("AjaxHttpRequest-" + url.getHost()) { + + @Override + public void run() { + try { + sendSync(content); + } catch (Throwable thrown) { + log(Level.WARNING, "send(): Error in asynchronous request on " + url, thrown); + } + } + }.start(); + } else { + sendSync(content); + } + } + + /** + * 类似 XMLHttpRequest 中的 getResponseHeader 方法. + */ + public synchronized String getResponseHeader(String headerName) { + return this.responseHeadersMap == null ? null : (String) this.responseHeadersMap.get(headerName); + } + + /** + * 类似 XMLHttpRequest 中的 getAllResponseHeaders 方法. + */ + public synchronized String getAllResponseHeaders() { + return this.responseHeaders; + } + + /** + * 类似 XMLHttpRequest 中的 responseText 属性. + */ + public synchronized String getResponseText() { + byte[] bytes = this.responseBytes; + String encoding = getCharset(this.connection); + if (encoding == null) { + encoding = getPostCharset(); + } + if (encoding == null) { + encoding = DEFAULT_HTTP_CHARSET; + } + try { + return bytes == null ? null : new String(bytes, encoding); + } catch (UnsupportedEncodingException uee) { + log(Level.WARNING, "getResponseText(): Charset '" + encoding + "' did not work. Retrying with " + + DEFAULT_HTTP_CHARSET + ".", uee); + try { + return new String(bytes, DEFAULT_HTTP_CHARSET); + } catch (UnsupportedEncodingException uee2) { + // Ignore this time + return null; + } + } + } + + /** + * 类似 XMLHttpRequest 中的 responseXML 属性. TODO : 此方法在java中 并不常使用, + * 而且需要两个额外的包,两个包不是所有的java环境都有的. 所以我(fins)把此方法注释条了. 如果确实需要此方法 + * 请自行取消该方法的注释,并引入下面列出的类/接口. javax.xml.parsers.DocumentBuilderFactory; + * org.w3c.dom.Document; + */ + // public synchronized Document getResponseXML() { + // byte[] bytes = this.responseBytes; + // if (bytes == null) { + // return null; + // } + // InputStream in = new ByteArrayInputStream(bytes); + // try { + // return DocumentBuilderFactory.newInstance().newDocumentBuilder() + // .parse(in); + // }catch (Exception err) { + // log(Level.WARNING, "Unable to parse response as XML.", err); return null; + // } + // } + + /** + * 类似 XMLHttpRequest 中的 responseBody 属性. + * @deprecated 这个方法命名源自XMLHttpRequest中的responseBody属性. 不过这个名字并不是好名字.建议使用 + * getResponseBytes 方法代替之. + */ + @Deprecated + public synchronized byte[] getResponseBody() { + return this.getResponseBytes(); + } + + /** + * 类似 XMLHttpRequest 中的 responseBody 属性. 建议使用此方法代替 getResponseBody 方法. + */ + public synchronized byte[] getResponseBytes() { + return this.responseBytes; + } + + /** + * 与 XMLHttpRequest 中的 responseStream 属性对应的方法 暂不提供. 因为1 不常用 2 通常可用 + * getResponseBytes 方法代替 + */ + + /** + * 类似 XMLHttpRequest 中的 onreadystatechange 属性. 设置一个监听器,用来跟踪HttpRequest状态变化. + * 参数是一个 ReadyStateChangeListener 对象. ReadyStateChangeListener 是一个抽象类. 只需 实现 + * onReadyStateChange方法即可. + */ + + public void setReadyStateChangeListener(ReadyStateChangeListener listener) { + this.readyStateChangeListener = listener; + } + + /** + * 中断 Request 请求. 类似 XMLHttpRequest 中的 abort. + */ + public void abort() { + URLConnection c = null; + synchronized (this) { + c = this.getConnection(); + } + if (c instanceof HttpURLConnection) { + ((HttpURLConnection) c).disconnect(); + } else if (c != null) { + try { + c.getInputStream().close(); + } catch (IOException ioe) { + ioe.printStackTrace(); + } + } + } + + // ///////////////////////////////////////////// + // // 以上 为 模拟 XMLHttpRequest 对象 相关的方法 //// + // ///////////////////////////////////////////// + // ///////////////////////////////////////////// + + /** + * 返回 此次HttpRequest是否是"异步"的. + */ + public boolean isAsync() { + return async; + } + + /** + * 返回 此次HttpRequest是否已经发送. 已经发送 且还没有完全处理完此次发送的返回信息时,是不能再次发送的. 如果需要联系发送请求, + * 请再另行创建一个 AjaxHttpRequest对象. + */ + public boolean hasSent() { + return sent; + } + + protected void setSent(boolean sent) { + this.sent = sent; + } + + /** + * 设置/取得 伪造的 userAgent 信息.通常不用理会. 很少有http服务会对此做严格的判断. + */ + public void setUserAgent(String userAgent) { + this.userAgent = userAgent; + } + + public String getUserAgent() { + return this.userAgent; + } + + /** + * 取得/设置 默认的 AJAX编码.AJAX请求都是UTF-8编码 此属性通常无需改变. + */ + public String getPostCharset() { + return this.postCharset; + } + + public void setPostCharset(String postCharset) { + this.postCharset = postCharset; + } + + /** + * 实现发送数据功能的方法,是整个类的核心. 我(fins)借鉴了 cobra 组件的 + * org.lobobrowser.html.test.SimpleHttpRequest 类中的同名方法. 略作改动. + */ + protected void sendSync(String content) throws IOException { + if (hasSent()) { + log(Level.WARNING, "This AjaxHttpRequest Object has sent", null); + return; + } + try { + URLConnection c; + synchronized (this) { + c = this.connection; + } + if (c == null) { + log(Level.WARNING, "Please open AjaxHttpRequest first.", null); + return; + } + setSent(true); + initConnectionRequestHeader(c); + int istatus; + String istatusText; + InputStream err; + if (c instanceof HttpURLConnection) { + HttpURLConnection hc = (HttpURLConnection) c; + String method = this.requestMethod == null ? DEFAULT_REQUEST_METHOD : this.requestMethod; + + method = method.toUpperCase(); + hc.setRequestMethod(method); + if ("POST".equals(method) && content != null) { + hc.setDoOutput(true); + byte[] contentBytes = content.getBytes(this.getPostCharset()); + hc.setFixedLengthStreamingMode(contentBytes.length); + OutputStream out = hc.getOutputStream(); + try { + out.write(contentBytes); + } finally { + out.flush(); + } + } + istatus = hc.getResponseCode(); + istatusText = hc.getResponseMessage(); + err = hc.getErrorStream(); + } else { + istatus = 0; + istatusText = ""; + err = null; + } + synchronized (this) { + this.responseHeaders = getConnectionResponseHeaders(c); + this.responseHeadersMap = c.getHeaderFields(); + } + this.changeState(AjaxHttpRequest.STATE_LOADED, istatus, istatusText, null); + InputStream in = err == null ? c.getInputStream() : err; + int contentLength = c.getContentLength(); + + this.changeState(AjaxHttpRequest.STATE_INTERACTIVE, istatus, istatusText, null); + byte[] bytes = loadStream(in, contentLength == -1 ? 4096 : contentLength); + this.changeState(AjaxHttpRequest.STATE_COMPLETE, istatus, istatusText, bytes); + } finally { + synchronized (this) { + this.connection = null; + setSent(false); + } + } + } + + /** + * 当状态变化时 重新设置各种状态值,并触发状态变化监听器. + */ + protected void changeState(int readyState, int status, String statusMessage, byte[] bytes) { + synchronized (this) { + this.readyState = readyState; + this.status = status; + this.statusText = statusMessage; + this.responseBytes = bytes; + } + if (this.readyStateChangeListener != null) { + this.readyStateChangeListener.onReadyStateChange(); + } + } + + /** + * 对字符串进行 URLEncoder 编码. + */ + protected String encode(Object str) { + try { + return URLEncoder.encode(String.valueOf(str), getPostCharset()); + } catch (UnsupportedEncodingException e) { + return String.valueOf(str); + } + } + + /** + * 将设置的 RequestHeader 真正的设置到链接请求中. + */ + @SuppressWarnings("rawtypes") + protected void initConnectionRequestHeader(URLConnection c) { + c.setRequestProperty("User-Agent", this.getUserAgent()); + Iterator keyItor = this.requestHeadersMap.keySet().iterator(); + while (keyItor.hasNext()) { + String key = (String) keyItor.next(); + String value = (String) this.requestHeadersMap.get(key); + c.setRequestProperty(key, value); + } + } + + /** + * 以下 4个 方法 负责处理 requestHeader信息. + */ + public String getRequestHeader(String key) { + return (String) this.requestHeadersMap.get(key); + } + + public String removeRequestHeader(String key) { + return (String) this.requestHeadersMap.remove(key); + } + + public void removeAllRequestHeaders() { + this.requestHeadersMap.clear(); + } + + @SuppressWarnings("rawtypes") + public Map getAllRequestHeaders() { + return this.requestHeadersMap; + } + + public URLConnection getConnection() { + return connection; + } + + public void setConnection(URLConnection connection) { + this.connection = connection; + } + + public Proxy getProxy() { + return proxy; + } + + public void setProxy(Proxy proxy) { + this.proxy = proxy; + } + + // /////////////////////////////////////////////////////////////////// + // 以下是 Static Method ////////////////////////////////////////////// + // 这些静态方法其实可以(应该)单独提取出去的, /////////////////////////////// + // 不过为了让这个程序结构简单些 , 我(fins)就全部 all in one 了./////////////////// + // 这些方法也不都是我(fins)自己写的 很多是copy 借鉴来的 功能都挺简单的 就不详细说明了 // + // /////////////////////////////////////////////////////////////////// + + public static void log(Level level, String msg, Throwable thrown) { + System.out.println(level.getName() + " : " + thrown.getMessage() + " ----- " + msg); + } + + public static String getConnectionResponseHeaders(URLConnection c) { + int idx = 0; + String value; + StringBuffer buf = new StringBuffer(); + while ((value = c.getHeaderField(idx)) != null) { + String key = c.getHeaderFieldKey(idx); + buf.append(key); + buf.append(": "); + buf.append(value); + idx++; + } + return buf.toString(); + } + + public static String getCharset(URLConnection connection) { + String contentType = connection == null ? null : connection.getContentType(); + if (contentType != null) { + StringTokenizer tok = new StringTokenizer(contentType, ";"); + if (tok.hasMoreTokens()) { + tok.nextToken(); + while (tok.hasMoreTokens()) { + String assignment = tok.nextToken().trim(); + int eqIdx = assignment.indexOf('='); + if (eqIdx != -1) { + String varName = assignment.substring(0, eqIdx).trim(); + if ("charset".equalsIgnoreCase(varName)) { + String varValue = assignment.substring(eqIdx + 1); + return unquote(varValue.trim()); + } + } + } + } + } + return null; + } + + public static String unquote(String text) { + if (text.startsWith("\"") && text.endsWith("\"")) { + return text.substring(1, text.length() - 2); + } + return text; + } + + protected static URL createURL(URL baseUrl, String relativeUrl) throws MalformedURLException { + return new URL(baseUrl, relativeUrl); + } + + protected static byte[] loadStream(InputStream in, int initialBufferSize) throws IOException { + if (initialBufferSize == 0) { + initialBufferSize = 1; + } + byte[] buffer = new byte[initialBufferSize]; + int offset = 0; + for (;;) { + int remain = buffer.length - offset; + if (remain <= 0) { + int newSize = buffer.length * 2; + byte[] newBuffer = new byte[newSize]; + System.arraycopy(buffer, 0, newBuffer, 0, offset); + buffer = newBuffer; + remain = buffer.length - offset; + } + int numRead = in.read(buffer, offset, remain); + if (numRead == -1) { + break; + } + offset += numRead; + } + if (offset < buffer.length) { + byte[] newBuffer = new byte[offset]; + System.arraycopy(buffer, 0, newBuffer, 0, offset); + buffer = newBuffer; + } + return buffer; + } + + // ///////////////////////////////////////////////////////// + // Listener Class ///////////////////////////////////////// + // ///////////////////////////////////////////////////////// + + /** + * 一个用来监听 HttpRequest状态 的监听器. 是一个内部静态抽象类. 可以根据实际情况来自行重构(如 增加方法、变为独立的外部类等). + */ + public static abstract class ReadyStateChangeListener { + + public abstract void onReadyStateChange(); + } + + // ///////////////////////////////////////////////////////// + // Test Method //////////////////////////////////////////// + // ///////////////////////////////////////////////////////// + + /** + * 利用这个AjaxHttpReuqest类来实现 对google translate服务的访问 . 只演示了 "英-->汉"的翻译. + * 返回的是JSON字符串,需要使用Json工具类进行转换,这个不难 就不详细举例了. + */ + @SuppressWarnings("rawtypes") + public static void testGoogleTranslate(String words, boolean async) throws IOException { + Map params = new HashMap(); + /* + * params.put("q",words); params.put("v","1.0"); + * params.put("langpair","en|zh-CN"); String + * url="http://ajax.googleapis.com/ajax/services/language/translate"; + */ + String url = "http://localhost:8080/long"; + + // 以上为 调用google翻译服务所需要的参数. + // 下面 是用java 来调用这个 翻译服务. + // 在 AjaxHttpRequest 类的 帮助下 我们可以使用 类似操作浏览器XHR对象的方式来 实现该功能. + + // 创建 AjaxHttpRequest对象 相当于 创建 XHR对象. + // 这里的final 主要是为了"使监听器内部能够调用ajax对象"而加的. + final AjaxHttpRequest ajax = new AjaxHttpRequest(); + + // 设置状态监听器,类似 XHR对象的 onreadystatechange 属性. + // 由于js 和java的本质区别 导致这里可能和 xhr有点不一样,但是应该不难理解. + ajax.setReadyStateChangeListener( + // 监听器, 根据需求 实现onReadyStateChange方法即可. + new AjaxHttpRequest.ReadyStateChangeListener() { + + @Override + public void onReadyStateChange() { + int readyState = ajax.getReadyState(); + System.out.println(ajax.getStatus()); + System.out.println(ajax.getReadyState()); + // System.out.println( ajax.getResponseText() ); + // 判断状态 然后做出相应处理. + if (// readyState==AjaxHttpRequest.STATE_INTERACTIVE || + readyState == AjaxHttpRequest.STATE_COMPLETE) { + System.out.println(ajax.getResponseText()); + } + } + }); + + // 这里就和 xhr 几乎完全一样了 + ajax.open("POST", url, true); + + // 这里这个send方法接受的参数是一个map ,当然AjaxHttpRequest类也提供了string的方法 + ajax.send(params); + + } + + public static void main(String[] args) throws IOException { + + testGoogleTranslate("Hello world!", false); + + } + +} diff --git a/comet4j-jar/src/org/comet4j/core/temp/Bytes.java b/comet4j-jar/src/org/comet4j/core/temp/Bytes.java new file mode 100644 index 0000000..4547639 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/temp/Bytes.java @@ -0,0 +1,23 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.temp; + +/** + * @author jinghai.xiao@gmail.com + * @date 2011-3-24 + */ + +public class Bytes { + + public static String substring(String src, int start_idx, int end_idx) { + byte[] b = src.getBytes(); + String tgt = ""; + for (int i = start_idx; i <= end_idx; i++) { + tgt += (char) b[i]; + } + return tgt; + } +} diff --git a/comet4j-jar/src/org/comet4j/core/temp/CometServlet.java b/comet4j-jar/src/org/comet4j/core/temp/CometServlet.java new file mode 100644 index 0000000..8ebfad5 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/temp/CometServlet.java @@ -0,0 +1,49 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.temp; + +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * Servlet implementation class CometServlet + */ +public class CometServlet extends HttpServlet { + + private static final long serialVersionUID = 1L; + + /** + * @see HttpServlet#HttpServlet() + */ + public CometServlet() { + super(); + // TODO Auto-generated constructor stub + } + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse + * response) + */ + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + // TODO Auto-generated method stub + } + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse + * response) + */ + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, + IOException { + // TODO Auto-generated method stub + } + +} diff --git a/comet4j-jar/src/org/comet4j/core/temp/IMonitorService.java b/comet4j-jar/src/org/comet4j/core/temp/IMonitorService.java new file mode 100644 index 0000000..91036ab --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/temp/IMonitorService.java @@ -0,0 +1,16 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.temp; + +/** + * @author jinghai.xiao@gmail.com + * @date 2011-3-24 + */ + +public interface IMonitorService { + + public MonitorInfoBean getMonitorInfoBean() throws Exception; +} diff --git a/comet4j-jar/src/org/comet4j/core/temp/LongPoolingServlet.java b/comet4j-jar/src/org/comet4j/core/temp/LongPoolingServlet.java new file mode 100644 index 0000000..fb52c0f --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/temp/LongPoolingServlet.java @@ -0,0 +1,181 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.temp; + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.Date; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.catalina.CometEvent; +import org.apache.catalina.CometProcessor; + +/** + * + */ +public class LongPoolingServlet extends HttpServlet implements CometProcessor { + + private static final long serialVersionUID = 1L; + protected ArrayList connections = new ArrayList(); + protected MessageSender messageSender = null; + protected Boolean debug = false; + // 经测试,如不设置,则超时时间为20秒,定义在server.xml中 + private static final Integer TIMEOUT = 10 * 1000; + + /** + * @see HttpServlet#HttpServlet() + */ + public LongPoolingServlet() { + super(); + } + + /* + * (non-Javadoc) + * @see javax.servlet.GenericServlet#init(javax.servlet.ServletConfig) + */ + @Override + public void init() throws ServletException { + + messageSender = new MessageSender(); + Thread messageSenderThread = new Thread(messageSender, "MessageSender[" + getServletContext().getContextPath() + + "]"); + messageSenderThread.setDaemon(true); + messageSenderThread.start(); + + Thread timeSenderThread = new Thread(new TimeSender()); + timeSenderThread.setDaemon(true); + timeSenderThread.start(); + + } + + /* + * (non-Javadoc) + * @see javax.servlet.GenericServlet#destroy() + */ + @Override + public void destroy() { + connections.clear(); + messageSender.stop(); + messageSender = null; + debug = null; + } + + /* + * (non-Javadoc) + * @see + * org.apache.catalina.CometProcessor#event(org.apache.catalina.CometEvent) + */ + public void event(CometEvent event) throws IOException, ServletException { + HttpServletRequest request = event.getHttpServletRequest(); + HttpServletResponse response = event.getHttpServletResponse(); + + if (event.getEventType() == CometEvent.EventType.BEGIN) { + log("-->begin"); + request.setAttribute("org.apache.tomcat.comet.timeout", TIMEOUT); + synchronized (connections) { + connections.add(response); + } + } else if (event.getEventType() == CometEvent.EventType.ERROR) { + log("-->error"); + synchronized (connections) { + connections.remove(response); + } + response.getWriter().close(); + event.close(); + + } else if (event.getEventType() == CometEvent.EventType.END) { + log("-->end"); + synchronized (connections) { + connections.remove(response); + } + response.getWriter().close(); + event.close(); + } else if (event.getEventType() == CometEvent.EventType.READ) { + log("-->read"); + } + + } + + class TimeSender implements Runnable { + + @SuppressWarnings("deprecation") + public void run() { + while (true) { + messageSender.send("System", new Date().toLocaleString()); + log("send" + new Date().toLocaleString()); + try { + Thread.sleep(5000); + } catch (InterruptedException ignore) { + } + } + } + } + + public class MessageSender implements Runnable { + + protected boolean running = true; + protected ArrayList messages = new ArrayList(); + + public MessageSender() { + } + + public void stop() { + running = false; + } + + public void send(String user, String message) { + synchronized (messages) { + messages.add("[" + user + "]: " + message); + messages.notify(); + } + } + + public void run() { + + while (running) { + if (messages.size() == 0) { + try { + synchronized (messages) { + messages.wait(); + } + } catch (InterruptedException e) { + // Ignore + } + } + + synchronized (connections) { + String[] pendingMessages = null; + synchronized (messages) { + pendingMessages = messages.toArray(new String[0]); + messages.clear(); + } + // Send any pending message on all the open connections + for (int i = 0; i < connections.size(); i++) { + try { + PrintWriter writer = connections.get(i).getWriter(); + for (int j = 0; j < pendingMessages.length; j++) { + writer.println(pendingMessages[j] + "
    "); + } + writer.flush(); + writer.close(); + } catch (IOException e) { + log("IOExeption sending message", e); + } + } + } + + } + + } + + } + +} diff --git a/comet4j-jar/src/org/comet4j/core/temp/MixServlet.java b/comet4j-jar/src/org/comet4j/core/temp/MixServlet.java new file mode 100644 index 0000000..c48a217 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/temp/MixServlet.java @@ -0,0 +1,201 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.temp; + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.Date; +import java.util.Iterator; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.catalina.CometEvent; +import org.apache.catalina.CometProcessor; +import org.comet4j.core.util.ExplorerUtil; + +/** + * Servlet implementation class Messenger + */ +public class MixServlet extends HttpServlet implements CometProcessor { + + private static final long serialVersionUID = 1L; + // 表示<连接,是否可以长连接> + protected Map connections = new ConcurrentHashMap(0); + protected MessageSender messageSender = null; + protected Boolean debug = false; + + /** + * @see HttpServlet#HttpServlet() + */ + public MixServlet() { + super(); + } + + /* + * (non-Javadoc) + * @see javax.servlet.GenericServlet#init(javax.servlet.ServletConfig) + */ + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + /* + * if("true".equals(config.getInitParameter("debug").toLowerCase())){ + * this.debug =true; } + */ + + messageSender = new MessageSender(); + Thread messageSenderThread = new Thread(messageSender, "MessageSender[" + getServletContext().getContextPath() + + "]"); + messageSenderThread.setDaemon(true); + messageSenderThread.start(); + + Thread timeSenderThread = new Thread(new TimeSender()); + timeSenderThread.setDaemon(true); + // timeSenderThread.start(); + + } + + /* + * (non-Javadoc) + * @see javax.servlet.GenericServlet#destroy() + */ + @Override + public void destroy() { + connections.clear(); + messageSender.stop(); + messageSender = null; + debug = null; + } + + /* + * (non-Javadoc) + * @see + * org.apache.catalina.CometProcessor#event(org.apache.catalina.CometEvent) + */ + public void event(CometEvent event) throws IOException, ServletException { + HttpServletRequest request = event.getHttpServletRequest(); + HttpServletResponse response = event.getHttpServletResponse(); + + if (event.getEventType() == CometEvent.EventType.BEGIN) { + log("-->begin:canStreaming:" + ExplorerUtil.canStreamingXHR(request)); + connections.put(response, ExplorerUtil.canStreamingXHR(request)); + event.setTimeout(6000); + } else if (event.getEventType() == CometEvent.EventType.ERROR) { + + connections.remove(response); + if (event.getEventSubType() == CometEvent.EventSubType.TIMEOUT) { + log("-->timeout"); + response.setStatus(408); + } + response.getWriter().close(); + // event.close(); + + } else if (event.getEventType() == CometEvent.EventType.END) { + log("-->end"); + connections.remove(response); + response.getWriter().close(); + event.close(); + + } else if (event.getEventType() == CometEvent.EventType.READ) { + log("-->read"); + } + + } + + class TimeSender implements Runnable { + + @SuppressWarnings("deprecation") + public void run() { + while (true) { + messageSender.send("System", new Date().toLocaleString()); + log("send" + new Date().toLocaleString()); + try { + Thread.sleep(5000); + } catch (InterruptedException ignore) { + } + } + } + } + + public class MessageSender implements Runnable { + + protected boolean running = true; + protected ArrayList messages = new ArrayList(); + + public MessageSender() { + } + + public void stop() { + running = false; + } + + public void send(String user, String message) { + synchronized (messages) { + messages.add("[" + user + "]: " + message); + messages.notify(); + } + } + + @SuppressWarnings({ + "rawtypes" + }) + public void run() { + + while (running) { + + if (messages.size() == 0) { + try { + synchronized (messages) { + messages.wait(); + } + } catch (InterruptedException e) { + // Ignore + } + } + + String[] pendingMessages = null; + synchronized (messages) { + pendingMessages = messages.toArray(new String[0]); + messages.clear(); + } + // Send any pending message on all the open connections + Iterator it = connections.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry entry = (Map.Entry) it.next(); + HttpServletResponse connection = (HttpServletResponse) entry.getKey(); + Boolean isStreaming = (Boolean) entry.getValue(); + log("isStreaming:" + isStreaming.toString()); + PrintWriter writer; + try { + writer = connection.getWriter(); + for (int j = 0; j < pendingMessages.length; j++) { + writer.println(pendingMessages[j] + "
    "); + } + writer.flush(); + if (!isStreaming) { + writer.close(); + } + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + + } + + } + + } + +} diff --git a/comet4j-jar/src/org/comet4j/core/temp/MonitorInfoBean.java b/comet4j-jar/src/org/comet4j/core/temp/MonitorInfoBean.java new file mode 100644 index 0000000..f1a4f51 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/temp/MonitorInfoBean.java @@ -0,0 +1,113 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.temp; + +/** + * @author jinghai.xiao@gmail.com + * @date 2011-3-24 + */ + +public class MonitorInfoBean { + + /** 可使用内存. */ + private long totalMemory; + + /** 剩余内存. */ + private long freeMemory; + + /** 最大可使用内存. */ + private long maxMemory; + + /** 操作系统. */ + private String osName; + + /** 总的物理内存. */ + private long totalMemorySize; + + /** 剩余的物理内存. */ + private long freePhysicalMemorySize; + + /** 已使用的物理内存. */ + private long usedMemory; + + /** 线程总数. */ + private int totalThread; + + /** cpu使用率. */ + private double cpuRatio; + + public long getFreeMemory() { + return freeMemory; + } + + public void setFreeMemory(long freeMemory) { + this.freeMemory = freeMemory; + } + + public long getFreePhysicalMemorySize() { + return freePhysicalMemorySize; + } + + public void setFreePhysicalMemorySize(long freePhysicalMemorySize) { + this.freePhysicalMemorySize = freePhysicalMemorySize; + } + + public long getMaxMemory() { + return maxMemory; + } + + public void setMaxMemory(long maxMemory) { + this.maxMemory = maxMemory; + } + + public String getOsName() { + return osName; + } + + public void setOsName(String osName) { + this.osName = osName; + } + + public long getTotalMemory() { + return totalMemory; + } + + public void setTotalMemory(long totalMemory) { + this.totalMemory = totalMemory; + } + + public long getTotalMemorySize() { + return totalMemorySize; + } + + public void setTotalMemorySize(long totalMemorySize) { + this.totalMemorySize = totalMemorySize; + } + + public int getTotalThread() { + return totalThread; + } + + public void setTotalThread(int totalThread) { + this.totalThread = totalThread; + } + + public long getUsedMemory() { + return usedMemory; + } + + public void setUsedMemory(long usedMemory) { + this.usedMemory = usedMemory; + } + + public double getCpuRatio() { + return cpuRatio; + } + + public void setCpuRatio(double cpuRatio) { + this.cpuRatio = cpuRatio; + } +} diff --git a/comet4j-jar/src/org/comet4j/core/temp/MonitorServiceImpl.java b/comet4j-jar/src/org/comet4j/core/temp/MonitorServiceImpl.java new file mode 100644 index 0000000..daf3564 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/temp/MonitorServiceImpl.java @@ -0,0 +1,279 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.temp; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.LineNumberReader; +import java.lang.management.ManagementFactory; +import java.lang.management.OperatingSystemMXBean; +import java.util.StringTokenizer; + +/** + * @author jinghai.xiao@gmail.com + * @date 2011-3-24 + */ + +public class MonitorServiceImpl implements IMonitorService { + + private static final int CPUTIME = 30; + + private static final int PERCENT = 100; + + private static final int FAULTLENGTH = 10; + + // private static final File versionFile = new File("/proc/version"); + private static String linuxVersion = null; + + /** + * 获得当前的监控对象. + * @return 返回构造好的监控对象 + * @throws Exception + * @author GuoHuang + */ + @SuppressWarnings({ + "unused", "static-access" + }) + public MonitorInfoBean getMonitorInfoBean() throws Exception { + int kb = 1024; + + // 可使用内存 + long totalMemory = Runtime.getRuntime().totalMemory() / kb; + // 剩余内存 + long freeMemory = Runtime.getRuntime().freeMemory() / kb; + // 最大可使用内存 + long maxMemory = Runtime.getRuntime().maxMemory() / kb; + + OperatingSystemMXBean osmxb = ManagementFactory.getOperatingSystemMXBean(); + + // 操作系统 + String osName = System.getProperty("os.name"); + // 总的物理内存 + // long totalMemorySize = osmxb.getTotalPhysicalMemorySize() / kb; + // 剩余的物理内存 + // long freePhysicalMemorySize = osmxb.getFreePhysicalMemorySize() / kb; + // 已使用的物理内存 + // long usedMemory = (osmxb.getTotalPhysicalMemorySize() - + // osmxb.getFreePhysicalMemorySize()) / kb; + + // 获得线程总数 + ThreadGroup parentThread; + for (parentThread = Thread.currentThread().getThreadGroup(); parentThread.getParent() != null; parentThread = parentThread + .getParent()) + ; + int totalThread = parentThread.activeCount(); + + double cpuRatio = 0; + if (osName.toLowerCase().startsWith("windows")) { + cpuRatio = this.getCpuRatioForWindows(); + } else { + cpuRatio = this.getCpuRateForLinux(); + } + + // 构造返回对象 + MonitorInfoBean infoBean = new MonitorInfoBean(); + infoBean.setFreeMemory(freeMemory); + // infoBean.setFreePhysicalMemorySize(freePhysicalMemorySize); + infoBean.setMaxMemory(maxMemory); + infoBean.setOsName(osName); + infoBean.setTotalMemory(totalMemory); + // infoBean.setTotalMemorySize(totalMemorySize); + infoBean.setTotalThread(totalThread); + // infoBean.setUsedMemory(usedMemory); + infoBean.setCpuRatio(cpuRatio); + return infoBean; + } + + private static double getCpuRateForLinux() { + InputStream is = null; + InputStreamReader isr = null; + BufferedReader brStat = null; + StringTokenizer tokenStat = null; + try { + System.out.println("Get usage rate of CUP , linux version: " + linuxVersion); + + Process process = Runtime.getRuntime().exec("top -b -n 1"); + is = process.getInputStream(); + isr = new InputStreamReader(is); + brStat = new BufferedReader(isr); + + if (linuxVersion.equals("2.4")) { + brStat.readLine(); + brStat.readLine(); + brStat.readLine(); + brStat.readLine(); + + tokenStat = new StringTokenizer(brStat.readLine()); + tokenStat.nextToken(); + tokenStat.nextToken(); + String user = tokenStat.nextToken(); + tokenStat.nextToken(); + String system = tokenStat.nextToken(); + tokenStat.nextToken(); + String nice = tokenStat.nextToken(); + + System.out.println(user + " , " + system + " , " + nice); + + user = user.substring(0, user.indexOf("%")); + system = system.substring(0, system.indexOf("%")); + nice = nice.substring(0, nice.indexOf("%")); + + float userUsage = new Float(user).floatValue(); + float systemUsage = new Float(system).floatValue(); + float niceUsage = new Float(nice).floatValue(); + + return (userUsage + systemUsage + niceUsage) / 100; + } else { + brStat.readLine(); + brStat.readLine(); + + tokenStat = new StringTokenizer(brStat.readLine()); + tokenStat.nextToken(); + tokenStat.nextToken(); + tokenStat.nextToken(); + tokenStat.nextToken(); + tokenStat.nextToken(); + tokenStat.nextToken(); + tokenStat.nextToken(); + String cpuUsage = tokenStat.nextToken(); + + System.out.println("CPU idle : " + cpuUsage); + Float usage = new Float(cpuUsage.substring(0, cpuUsage.indexOf("%"))); + + return (1 - usage.floatValue() / 100); + } + + } catch (IOException ioe) { + System.out.println(ioe.getMessage()); + freeResource(is, isr, brStat); + return 1; + } finally { + freeResource(is, isr, brStat); + } + + } + + private static void freeResource(InputStream is, InputStreamReader isr, BufferedReader br) { + try { + if (is != null) is.close(); + if (isr != null) isr.close(); + if (br != null) br.close(); + } catch (IOException ioe) { + System.out.println(ioe.getMessage()); + } + } + + /** + * 获得CPU使用率. + * @return 返回cpu使用率 + * @author GuoHuang + */ + private double getCpuRatioForWindows() { + try { + String procCmd = System.getenv("windir") + "\\system32\\wbem\\wmic.exe process get Caption,CommandLine," + + "KernelModeTime,ReadOperationCount,ThreadCount,UserModeTime,WriteOperationCount"; + // 取进程信息 + long[] c0 = readCpu(Runtime.getRuntime().exec(procCmd)); + Thread.sleep(CPUTIME); + long[] c1 = readCpu(Runtime.getRuntime().exec(procCmd)); + if (c0 != null && c1 != null) { + long idletime = c1[0] - c0[0]; + long busytime = c1[1] - c0[1]; + return Double.valueOf(PERCENT * (busytime) / (busytime + idletime)).doubleValue(); + } else { + return 0.0; + } + } catch (Exception ex) { + ex.printStackTrace(); + return 0.0; + } + } + + /** + * 读取CPU信息. + * @param proc + * @return + * @author GuoHuang + */ + private long[] readCpu(final Process proc) { + long[] retn = new long[2]; + try { + proc.getOutputStream().close(); + InputStreamReader ir = new InputStreamReader(proc.getInputStream()); + LineNumberReader input = new LineNumberReader(ir); + String line = input.readLine(); + if (line == null || line.length() < FAULTLENGTH) { + return null; + } + int capidx = line.indexOf("Caption"); + int cmdidx = line.indexOf("CommandLine"); + int rocidx = line.indexOf("ReadOperationCount"); + int umtidx = line.indexOf("UserModeTime"); + int kmtidx = line.indexOf("KernelModeTime"); + int wocidx = line.indexOf("WriteOperationCount"); + long idletime = 0; + long kneltime = 0; + long usertime = 0; + while ((line = input.readLine()) != null) { + if (line.length() < wocidx) { + continue; + } + // 字段出现顺序:Caption,CommandLine,KernelModeTime,ReadOperationCount, + // ThreadCount,UserModeTime,WriteOperation + String caption = Bytes.substring(line, capidx, cmdidx - 1).trim(); + String cmd = Bytes.substring(line, cmdidx, kmtidx - 1).trim(); + if (cmd.indexOf("wmic.exe") >= 0) { + continue; + } + // log.info("line="+line); + if (caption.equals("System Idle Process") || caption.equals("System")) { + idletime += Long.valueOf(Bytes.substring(line, kmtidx, rocidx - 1).trim()).longValue(); + idletime += Long.valueOf(Bytes.substring(line, umtidx, wocidx - 1).trim()).longValue(); + continue; + } + + kneltime += Long.valueOf(Bytes.substring(line, kmtidx, rocidx - 1).trim()).longValue(); + usertime += Long.valueOf(Bytes.substring(line, umtidx, wocidx - 1).trim()).longValue(); + } + retn[0] = idletime; + retn[1] = kneltime + usertime; + return retn; + } catch (Exception ex) { + ex.printStackTrace(); + } finally { + try { + proc.getInputStream().close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + return null; + } + + /** + * 测试方法. + * @param args + * @throws Exception + * @author GuoHuang + */ + public static void main(String[] args) throws Exception { + IMonitorService service = new MonitorServiceImpl(); + MonitorInfoBean monitorInfo = service.getMonitorInfoBean(); + System.out.println("cpu占有率=" + monitorInfo.getCpuRatio()); + + System.out.println("可使用内存=" + monitorInfo.getTotalMemory()); + System.out.println("剩余内存=" + monitorInfo.getFreeMemory()); + System.out.println("最大可使用内存=" + monitorInfo.getMaxMemory()); + + System.out.println("操作系统=" + monitorInfo.getOsName()); + System.out.println("总的物理内存=" + monitorInfo.getTotalMemorySize() + "kb"); + System.out.println("剩余的物理内存=" + monitorInfo.getFreeMemory() + "kb"); + System.out.println("已使用的物理内存=" + monitorInfo.getUsedMemory() + "kb"); + System.out.println("线程总数=" + monitorInfo.getTotalThread() + "kb"); + } +} diff --git a/comet4j-jar/src/org/comet4j/core/temp/ReadJARResource.java b/comet4j-jar/src/org/comet4j/core/temp/ReadJARResource.java new file mode 100644 index 0000000..0bd244b --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/temp/ReadJARResource.java @@ -0,0 +1,52 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.temp; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; + +public class ReadJARResource { + + public static void main(String[] args) throws IOException { + String jarName = "C://VODOSSClient.jar"; + String fileName = "client.properties"; + JarFile jarFile = new JarFile(jarName);// 读入jar文件 + + JarEntry entry = jarFile.getJarEntry(fileName); + InputStream input = jarFile.getInputStream(entry);// 读入需要的文件 + + readFile(input); + + jarFile.close(); + + } + + private static void readFile(InputStream input) + + throws IOException { + + InputStreamReader isr = + + new InputStreamReader(input); + + BufferedReader reader = new BufferedReader(isr); + + String line; + + while ((line = reader.readLine()) != null) { + + System.out.println(line); + + } + + reader.close(); + + } +} diff --git a/comet4j-jar/src/org/comet4j/core/temp/SendMessageTest.java b/comet4j-jar/src/org/comet4j/core/temp/SendMessageTest.java new file mode 100644 index 0000000..66b74a2 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/temp/SendMessageTest.java @@ -0,0 +1,29 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.temp; + +/** + * 模拟发送信息的测试类 + * @author xiaojinghai + * @date 2011-2-24 + */ + +public class SendMessageTest implements Runnable { + + public void run() { + while (true) { + try { + Thread.sleep(5000); + } catch (Exception ex) { + ex.printStackTrace(); + } + /* + * CometContext.getInstance().getEngine().sendTo(CometContext. + * getInstance ().getEngine().getConnections(), "Test Data"); + */ + } + } +} diff --git a/comet4j-jar/src/org/comet4j/core/temp/ServletLoadOnStart.java b/comet4j-jar/src/org/comet4j/core/temp/ServletLoadOnStart.java new file mode 100644 index 0000000..1a7609d --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/temp/ServletLoadOnStart.java @@ -0,0 +1,44 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.temp; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; + +/** + * + */ +public class ServletLoadOnStart extends HttpServlet { + + private static final long serialVersionUID = 1L; + + /** + * @see HttpServlet#HttpServlet() + */ + public ServletLoadOnStart() { + super(); + } + + /* + * (non-Javadoc) + * @see javax.servlet.GenericServlet#init(javax.servlet.ServletConfig) + */ + @Override + public void init() throws ServletException { + super.init(); + log("---------------------------------Loaded!---------------------------------"); + } + + /* + * (non-Javadoc) + * @see javax.servlet.GenericServlet#destroy() + */ + @Override + public void destroy() { + + } + +} diff --git a/comet4j-jar/src/org/comet4j/core/temp/ShowMemory.java b/comet4j-jar/src/org/comet4j/core/temp/ShowMemory.java new file mode 100644 index 0000000..ac07eab --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/temp/ShowMemory.java @@ -0,0 +1,45 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.temp; + +import java.lang.management.ManagementFactory; +import java.lang.management.MemoryMXBean; +import java.lang.management.MemoryUsage; + +/** + * @author jinghai.xiao@gmail.com + * @date 2011-3-24 + */ + +public class ShowMemory { + + static String x; + + public static void main(String[] args) { + ShowMemory sm = new ShowMemory(); + sm.show(); + x = ""; + for (int i = 0; i < 1000; i++) + x += " string number " + i; + sm.show(); + x = null; + sm.show(); + MemoryMXBean mem = ManagementFactory.getMemoryMXBean(); + mem.gc(); + sm.show(); + } + + void show() { + MemoryMXBean mem = ManagementFactory.getMemoryMXBean(); + MemoryUsage heap = mem.getHeapMemoryUsage(); + System.out.print("Heap committed=" + heap.getCommitted() + " init=" + heap.getInit() + " max=" + heap.getMax() + + " used=" + heap.getUsed()); + System.out.print(",total:" + Runtime.getRuntime().totalMemory()); + System.out.print(",free" + Runtime.getRuntime().freeMemory()); + System.out.println(",max" + Runtime.getRuntime().maxMemory() / 1024); + } + +} diff --git a/comet4j-jar/src/org/comet4j/core/temp/ShowSystem.java b/comet4j-jar/src/org/comet4j/core/temp/ShowSystem.java new file mode 100644 index 0000000..aa7a1dd --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/temp/ShowSystem.java @@ -0,0 +1,29 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.temp; + +import java.lang.management.ManagementFactory; +import java.lang.management.OperatingSystemMXBean; + +/** + * @author jinghai.xiao@gmail.com + * @date 2011-3-24 + */ + +public class ShowSystem { + + static String x; + + public static void main(String[] args) { + OperatingSystemMXBean op = ManagementFactory.getOperatingSystemMXBean(); + System.out.println("Architecture: " + op.getArch()); + System.out.println("Processors: " + op.getAvailableProcessors()); + System.out.println("System name: " + op.getName()); + System.out.println("System version: " + op.getVersion()); + System.out.println("Last minute load: " + op.getSystemLoadAverage()); + } + +} diff --git a/comet4j-jar/src/org/comet4j/core/temp/StreamingXHRServlet.java b/comet4j-jar/src/org/comet4j/core/temp/StreamingXHRServlet.java new file mode 100644 index 0000000..907bc33 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/temp/StreamingXHRServlet.java @@ -0,0 +1,186 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.temp; + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.Date; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.catalina.CometEvent; +import org.apache.catalina.CometProcessor; + +/** + * + */ +public class StreamingXHRServlet extends HttpServlet implements CometProcessor { + + private static final long serialVersionUID = 1L; + protected ArrayList connections = new ArrayList(); + protected MessageSender messageSender = null; + protected Boolean debug = false; + + /** + * @see HttpServlet#HttpServlet() + */ + public StreamingXHRServlet() { + super(); + } + + /* + * (non-Javadoc) + * @see javax.servlet.GenericServlet#init(javax.servlet.ServletConfig) + */ + @Override + public void init() throws ServletException { + + messageSender = new MessageSender(); + Thread messageSenderThread = new Thread(messageSender, "MessageSender[" + getServletContext().getContextPath() + + "]"); + messageSenderThread.setDaemon(true); + messageSenderThread.start(); + + Thread timeSenderThread = new Thread(new TimeSender()); + timeSenderThread.setDaemon(true); + timeSenderThread.start(); + + } + + /* + * (non-Javadoc) + * @see javax.servlet.GenericServlet#destroy() + */ + @Override + public void destroy() { + connections.clear(); + messageSender.stop(); + messageSender = null; + debug = null; + } + + /* + * (non-Javadoc) + * @see + * org.apache.catalina.CometProcessor#event(org.apache.catalina.CometEvent) + */ + @SuppressWarnings("unused") + public void event(CometEvent event) throws IOException, ServletException { + HttpServletRequest request = event.getHttpServletRequest(); + HttpServletResponse response = event.getHttpServletResponse(); + + if (event.getEventType() == CometEvent.EventType.BEGIN) { + // event.setTimeout(0); + log("-->begin"); + synchronized (connections) { + connections.add(response); + } + event.setTimeout(6000); + } else if (event.getEventType() == CometEvent.EventType.ERROR) { + log("-->error"); + synchronized (connections) { + connections.remove(response); + } + if (event.getEventSubType() == CometEvent.EventSubType.TIMEOUT) { + response.setStatus(408); + } + response.getWriter().close(); + event.close(); + + } else if (event.getEventType() == CometEvent.EventType.END) { + log("-->end"); + synchronized (connections) { + connections.remove(response); + } + response.getWriter().close(); + event.close(); + } else if (event.getEventType() == CometEvent.EventType.READ) { + log("-->read"); + } + + } + + class TimeSender implements Runnable { + + @SuppressWarnings("deprecation") + public void run() { + while (true) { + messageSender.send("System", new Date().toLocaleString()); + log("send" + new Date().toLocaleString()); + try { + Thread.sleep(5000); + } catch (InterruptedException ignore) { + } + } + } + } + + public class MessageSender implements Runnable { + + protected boolean running = true; + protected ArrayList messages = new ArrayList(); + + public MessageSender() { + } + + public void stop() { + running = false; + } + + public void send(String user, String message) { + synchronized (messages) { + messages.add("[" + user + "]: " + message); + messages.notify(); + } + } + + public void run() { + + while (running) { + + if (messages.size() == 0) { + try { + synchronized (messages) { + messages.wait(); + } + } catch (InterruptedException e) { + // Ignore + } + } + + synchronized (connections) { + String[] pendingMessages = null; + synchronized (messages) { + pendingMessages = messages.toArray(new String[0]); + messages.clear(); + } + // Send any pending message on all the open connections + for (int i = 0; i < connections.size(); i++) { + try { + PrintWriter writer = connections.get(i).getWriter(); + for (int j = 0; j < pendingMessages.length; j++) { + writer.println(pendingMessages[j] + "
    "); + // writer.print("<{a:'aa',b:'bb'}>"); + } + writer.flush(); + // log("Message Out:..."); + } catch (IOException e) { + // log("IOExeption sending message", e); + } + } + } + + } + + } + + } + +} diff --git a/comet4j-jar/src/org/comet4j/core/util/BeanUtil.java b/comet4j-jar/src/org/comet4j/core/util/BeanUtil.java new file mode 100644 index 0000000..31fd980 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/util/BeanUtil.java @@ -0,0 +1,41 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ + +package org.comet4j.core.util; + +// ~--- JDK imports ------------------------------------------------------------ + +import java.lang.reflect.AccessibleObject; +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.Map; + +/** + * Bean反射工具 + */ + +public class BeanUtil { + + /** Creates a new instance of BeanUtil */ + private BeanUtil() { + } + + @SuppressWarnings("rawtypes") + public static Map getPropertiesByReflect(Object obj) throws Exception { + if (obj == null) return null; + Field[] fields = obj.getClass().getDeclaredFields(); + if (fields == null || fields.length == 0) return null; + Map map = new HashMap(); + AccessibleObject.setAccessible(fields, true); + for (Field field : fields) { + map.put(field.getName(), field.get(obj)); + + } + if (map.size() < 1) return null; + return map; + } + +} diff --git a/comet4j-jar/src/org/comet4j/core/util/CharacterEncodingFilter.java b/comet4j-jar/src/org/comet4j/core/util/CharacterEncodingFilter.java new file mode 100644 index 0000000..7203f73 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/util/CharacterEncodingFilter.java @@ -0,0 +1,113 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.util; + +import java.io.IOException; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; + +/** + * 过滤器 + */ +public class CharacterEncodingFilter implements Filter { + + /** + * 对 HttpServletRequestWrapper 进行扩充, 不影响原来的功能并能提供所有的 HttpServletRequest + * 接口中的功能. 它可以统一的对 Tomcat 默认设置下的中文问题进行解决而只需要用新的 Request 对象替换页面中的 request + * 对象即可. + */ + protected String encoding = null; + protected FilterConfig filterConfig = null; + + // protected boolean ignore = true; + + public void destroy() { + this.encoding = null; + this.filterConfig = null; + } + + class Request extends HttpServletRequestWrapper { + + public Request(HttpServletRequest request) { + super(request); + } + + /** + * 转换由表单读取的数据的内码. 从 ISO 字符转到 utf-8(或gbk). + */ + public String toChi(String input) { + try { + + byte[] bytes = input.getBytes("ISO-8859-1"); + return new String(bytes, encoding); + } catch (Exception ex) { + } + return null; + } + + /** + * Return the HttpServletRequest holded by this object. + */ + private HttpServletRequest getHttpServletRequest() { + return (HttpServletRequest) super.getRequest(); + } + + /** + * 读取参数 -- 修正了中文问题. + */ + @Override + public String getParameter(String name) { + return toChi(getHttpServletRequest().getParameter(name)); + } + + /** + * 读取参数列表 - 修正了中文问题. + */ + @Override + public String[] getParameterValues(String name) { + String values[] = getHttpServletRequest().getParameterValues(name); + if (values != null) { + for (int i = 0; i < values.length; i++) { + values[i] = toChi(values[i]); + } + } + return values; + } + } + + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, + ServletException { + + HttpServletRequest httpreq = (HttpServletRequest) request; + if (httpreq.getMethod().equals("POST")) { + request.setCharacterEncoding(encoding); + } else { + request = new Request(httpreq); + } + + chain.doFilter(request, response); + + } + + /** + * Place this filter into service. + * @param filterConfig The filter configuration object + */ + public void init(FilterConfig filterConfig) throws ServletException { + + this.filterConfig = filterConfig; + this.encoding = filterConfig.getInitParameter("encoding"); + + } + +} diff --git a/comet4j-jar/src/org/comet4j/core/util/DelayTask.java b/comet4j-jar/src/org/comet4j/core/util/DelayTask.java new file mode 100644 index 0000000..e88e1b1 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/util/DelayTask.java @@ -0,0 +1,87 @@ +/** + * @(#)DelayTaskEngine.java 2011-7-25 Copyright 2011 it.kedacom.com, Inc. All + * rights reserved. + */ + +package org.comet4j.core.util; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; + +/** + * 延迟任务管理器,用于执行延迟任务,当任务在执行以前可以分配新的任务,原任务将取消执行,不同的任务组使用taskId加以区分。 + * @author xiaojinghai + * @date 2011-7-25 + */ + +public class DelayTask { + + private final int cpuCoreNumber = Runtime.getRuntime().availableProcessors(); + private final ScheduledExecutorService scheduler; + private final Map> taskHandles = new ConcurrentHashMap>(); + + public DelayTask() { + scheduler = Executors.newScheduledThreadPool(cpuCoreNumber); + } + + public DelayTask(int cpuCoreNumber) { + scheduler = Executors.newScheduledThreadPool(cpuCoreNumber); + } + + /** + * 延迟执行某任务,此方法可以多次重复调用,若之前的任务还没有执行,那么会取消原任务的执行,改为执行新任务。 + * @param taskId 任务Id,用于区分不同类别的延迟任务 + * @param task 需要执行的任务 + * @param delay 延迟时间 + * @param unit 延迟的时间单位 + */ + + @SuppressWarnings("unchecked") + public void delay(String taskId, Runnable task, long delay, TimeUnit unit) { + ScheduledFuture taskHandle = taskHandles.get(taskId); + if (taskHandle == null || taskHandle.isDone()) { + taskHandle = (ScheduledFuture) scheduler.schedule(task, delay, unit); + } else { + taskHandle.cancel(true); + taskHandle = (ScheduledFuture) scheduler.schedule(task, delay, unit); + } + taskHandles.put(taskId, taskHandle); + } + + /** + * 取消指定延迟任务的执行 + * @param taskId 任务Id + */ + + public void cancel(String taskId) { + ScheduledFuture taskHandle = taskHandles.get(taskId); + if (taskHandle != null && !taskHandle.isDone()) { + taskHandle.cancel(true); + } + } + + /** + * 取消所有延迟任务的执行 + */ + + public void cancelAllTask() { + for (String taskId : taskHandles.keySet()) { + ScheduledFuture taskHandle = taskHandles.get(taskId); + if (taskHandle != null && !taskHandle.isDone()) { + taskHandle.cancel(true); + } + } + } + + /** + * 在所有已安排的任务都执行完毕后结束并清除线程池。 + */ + public void shutdown() { + scheduler.shutdown(); + } + +} diff --git a/comet4j-jar/src/org/comet4j/core/util/ExplorerUtil.java b/comet4j-jar/src/org/comet4j/core/util/ExplorerUtil.java new file mode 100644 index 0000000..aeb9af9 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/util/ExplorerUtil.java @@ -0,0 +1,60 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.util; + +import javax.servlet.http.HttpServletRequest; + +/** + * 浏览器工具类 + */ + +public class ExplorerUtil { + + public static Boolean isIE(HttpServletRequest request) { + String regEx = "msie"; + String userAgent = request.getHeader("User-Agent").toLowerCase(); + return userAgent.indexOf(regEx) == -1 ? false : true; + } + + public static Boolean isFirefox(HttpServletRequest request) { + String regEx = "firefox"; + String userAgent = request.getHeader("User-Agent").toLowerCase(); + return userAgent.indexOf(regEx) == -1 ? false : true; + } + + public static Boolean isOpera(HttpServletRequest request) { + String regEx = "opera"; + String userAgent = request.getHeader("User-Agent").toLowerCase(); + return userAgent.indexOf(regEx) == -1 ? false : true; + } + + public static Boolean isChrome(HttpServletRequest request) { + String regEx = "\bchrome\b"; + String userAgent = request.getHeader("User-Agent").toLowerCase(); + return userAgent.indexOf(regEx) == -1 ? false : true; + } + + public static Boolean isAir(HttpServletRequest request) { + String regEx = "adobeair"; + String userAgent = request.getHeader("User-Agent").toLowerCase(); + return userAgent.indexOf(regEx) == -1 ? false : true; + } + + public static Boolean isSafari(HttpServletRequest request) { + String regEx = "safari"; + String userAgent = request.getHeader("User-Agent").toLowerCase(); + if (userAgent.indexOf(regEx) != -1 && !isChrome(request)) { + return true; + } else { + return false; + } + } + + // 是否可以进行HTTP长连接 + public static Boolean canStreamingXHR(HttpServletRequest request) { + return (isSafari(request) || isAir(request) || isChrome(request) || isFirefox(request)) ? true : false; + } +} diff --git a/comet4j-jar/src/org/comet4j/core/util/JSONUtil.java b/comet4j-jar/src/org/comet4j/core/util/JSONUtil.java new file mode 100644 index 0000000..54819ad --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/util/JSONUtil.java @@ -0,0 +1,182 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ + +package org.comet4j.core.util; + +import java.beans.IntrospectionException; +import java.beans.Introspector; +import java.beans.PropertyDescriptor; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * 用来把对象转换为json串的类,没有反向的操作 + * @author xiaojinghai + * @date 2011-7-18 + */ + +public class JSONUtil { + + public static String object2json(Object obj) { + StringBuilder json = new StringBuilder(); + if (obj == null) { + json.append("\"\""); + } else if (obj instanceof String || obj instanceof Integer || obj instanceof Float || obj instanceof Boolean + || obj instanceof Short || obj instanceof Double || obj instanceof Long || obj instanceof BigDecimal + || obj instanceof BigInteger || obj instanceof Byte) { + json.append("\"").append(string2json(obj.toString())).append("\""); + } else if (obj instanceof Object[]) { + json.append(array2json((Object[]) obj)); + } else if (obj instanceof List) { + json.append(list2json((List) obj)); + } else if (obj instanceof Map) { + json.append(map2json((Map) obj)); + } else if (obj instanceof Set) { + json.append(set2json((Set) obj)); + } else { + json.append(bean2json(obj)); + } + return json.toString(); + } + + public static String bean2json(Object bean) { + StringBuilder json = new StringBuilder(); + json.append("{"); + PropertyDescriptor[] props = null; + try { + props = Introspector.getBeanInfo(bean.getClass(), Object.class).getPropertyDescriptors(); + } catch (IntrospectionException e) { + } + if (props != null) { + for (int i = 0; i < props.length; i++) { + try { + String name = object2json(props[i].getName()); + String value = object2json(props[i].getReadMethod().invoke(bean)); + json.append(name); + json.append(":"); + json.append(value); + json.append(","); + } catch (Exception e) { + } + } + json.setCharAt(json.length() - 1, '}'); + } else { + json.append("}"); + } + return json.toString(); + } + + public static String list2json(List list) { + StringBuilder json = new StringBuilder(); + json.append("["); + if (list != null && list.size() > 0) { + for (Object obj : list) { + json.append(object2json(obj)); + json.append(","); + } + json.setCharAt(json.length() - 1, ']'); + } else { + json.append("]"); + } + return json.toString(); + } + + public static String array2json(Object[] array) { + StringBuilder json = new StringBuilder(); + json.append("["); + if (array != null && array.length > 0) { + for (Object obj : array) { + json.append(object2json(obj)); + json.append(","); + } + json.setCharAt(json.length() - 1, ']'); + } else { + json.append("]"); + } + return json.toString(); + } + + public static String map2json(Map map) { + StringBuilder json = new StringBuilder(); + json.append("{"); + if (map != null && map.size() > 0) { + for (Object key : map.keySet()) { + json.append(object2json(key)); + json.append(":"); + json.append(object2json(map.get(key))); + json.append(","); + } + json.setCharAt(json.length() - 1, '}'); + } else { + json.append("}"); + } + return json.toString(); + } + + public static String set2json(Set set) { + StringBuilder json = new StringBuilder(); + json.append("["); + if (set != null && set.size() > 0) { + for (Object obj : set) { + json.append(object2json(obj)); + json.append(","); + } + json.setCharAt(json.length() - 1, ']'); + } else { + json.append("]"); + } + return json.toString(); + } + + public static String string2json(String s) { + if (s == null) return ""; + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < s.length(); i++) { + char ch = s.charAt(i); + switch (ch) { + case '"': + sb.append("\\\""); + break; + case '\\': + sb.append("\\\\"); + break; + case '\b': + sb.append("\\b"); + break; + case '\f': + sb.append("\\f"); + break; + case '\n': + sb.append("\\n"); + break; + case '\r': + sb.append("\\r"); + break; + case '\t': + sb.append("\\t"); + break; + case '/': + sb.append("\\/"); + break; + default: + if (ch >= '\u0000' && ch <= '\u001F') { + String ss = Integer.toHexString(ch); + sb.append("\\u"); + for (int k = 0; k < 4 - ss.length(); k++) { + sb.append('0'); + } + sb.append(ss.toUpperCase()); + } else { + sb.append(ch); + } + } + } + return sb.toString(); + } +} diff --git a/comet4j-jar/src/org/comet4j/core/util/NetUtil.java b/comet4j-jar/src/org/comet4j/core/util/NetUtil.java new file mode 100644 index 0000000..c54c9b5 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/core/util/NetUtil.java @@ -0,0 +1,29 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.core.util; + +import javax.servlet.http.HttpServletRequest; + +/** + * 网络工具类 + */ + +public class NetUtil { + + public static String getIpAddr(HttpServletRequest request) { + String ip = request.getHeader("x-forwarded-for"); + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("WL-Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + } + return ip; + } +} diff --git a/comet4j-jar/src/org/comet4j/event/Event.java b/comet4j-jar/src/org/comet4j/event/Event.java new file mode 100644 index 0000000..2cba1da --- /dev/null +++ b/comet4j-jar/src/org/comet4j/event/Event.java @@ -0,0 +1,60 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.event; + +/** + * 事件发生时所携带的相关数据 + * @author xiaojinghai@kedacom.com + */ +@SuppressWarnings("rawtypes") +public class Event { + + private boolean stoped = false; + private boolean preventDefault = false; + private O target; + + public Event(O target) { + this.target = target; + } + + /** + * 停止事件运行
    + * 立即停止事件发出者的行为函数,用于在事件处理过程中终止事件发出者的动作, 用于在动作发生之前结束动作,避免动作的发生。
    + * 注意:只能在动作发出前进行终止,例如:BeforeGo等此类事件中应用。 + */ + public void stopEvent() { + stoped = true; + } + + /** + * 停止事件传播
    + * 调用后,此将不再传播给其它侦听,防止此事件再被其它侦听函数所处理
    + * 注意:后加入侦听的函数,在事件触发时会先执行。 + */ + public void preventDefault() { + preventDefault = true; + } + + public boolean hasStoped() { + return stoped; + } + + public boolean hasPreventDefault() { + return preventDefault; + } + + /** + * 获取事件的发出者 + * @return + */ + public O getTarget() { + return target; + } + + public void destroy() { + target = null; + } +} diff --git a/comet4j-jar/src/org/comet4j/event/EventSource.java b/comet4j-jar/src/org/comet4j/event/EventSource.java new file mode 100644 index 0000000..07be08c --- /dev/null +++ b/comet4j-jar/src/org/comet4j/event/EventSource.java @@ -0,0 +1,104 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.event; + +import java.util.ArrayList; +import java.util.List; + +/** + * 事件源 一个事件源代一个事件种类,并管理这种事件的侦听。 职责:对于侦听的管理和执行 + * @author xiaojinghai@kedacom.com + */ +@SuppressWarnings("rawtypes") +public class EventSource> { + + protected List listeners = new ArrayList(); + + public EventSource() { + + } + + /** + * 触发所有侦听函数 + * @param anEvent + * @return + */ + public boolean fire(E anEvent) { + synchronized (listeners) { + for (int i = listeners.size() - 1; i >= 0; i--) { + L listener = listeners.get(i); + if (anEvent.hasStoped()) { + return false; + } + if (anEvent.hasPreventDefault()) { + break; + } + if (!listener.handleEvent(anEvent)) { // 等同于hasStoped + return false; + } + } + } + return anEvent.hasStoped() ? false : true; + } + + /** + * 添加侦听函数 + * @param aListener + */ + public void addListener(L aListener) { + synchronized (listeners) { + listeners.add(aListener); + } + + } + + /** + * 删除指定的侦听函数 + * @param aListener + */ + public void removeListener(L aListener) { + synchronized (listeners) { + listeners.remove(aListener); + } + + } + + /** + * 删除所有侦听 + */ + public void removeAllListeners() { + synchronized (listeners) { + listeners.clear(); + } + } + + /** + * 得到某个侦听函数 + * @param aListener + * @return + */ + public L getListener(L aListener) { + for (L l : listeners) { + if (l == aListener) { + return l; + } + } + return null; + } + + /** + * 获取所有侦听函数 + * @return + */ + public List getListeners() { + return listeners; + } + + public void destroy() { + removeAllListeners(); + listeners = null; + } +} diff --git a/comet4j-jar/src/org/comet4j/event/InterceptorInterface.java b/comet4j-jar/src/org/comet4j/event/InterceptorInterface.java new file mode 100644 index 0000000..b44a820 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/event/InterceptorInterface.java @@ -0,0 +1,22 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.event; + +/** + * 拦截器接口 此接口用于向Observable中加入拦截器 (通过使用Observable的addEventInterceptor方法) + * @author xiaojinghai@kedacom.com + */ + +@SuppressWarnings("rawtypes") +public interface InterceptorInterface { + + /** + * 拦截器方法,供Observable对象addEventInterceptor方法使用。 + * @param anEvent + * @return 返回false则停止事件广播、终止动作的发生并不再执行其它拦截器方法,否则继续执行。 + */ + public boolean intercept(E anEvent); +} diff --git a/comet4j-jar/src/org/comet4j/event/Listener.java b/comet4j-jar/src/org/comet4j/event/Listener.java new file mode 100644 index 0000000..1ee8ea1 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/event/Listener.java @@ -0,0 +1,27 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.event; + +/** + * + */ + +/** + * 侦听抽象类 职责:规范事件侦听的执行方法 + * @author xiaojinghai@kedacom.com + */ + +@SuppressWarnings("rawtypes") +public abstract class Listener implements ListenerInterface { + + /** + * 事件处理 + * @param anEvent + * @return 对于可终止的事件(一般事件名称以before开头)返回false则终被终止被终止执行此动作,避免动作的发生(如before类事件, + * 一般为动作发生之前的事件才可以被终止执行,避免动作的发生),对于非可终止事件请设置为true + */ + public abstract boolean handleEvent(E anEvent); +} diff --git a/comet4j-jar/src/org/comet4j/event/ListenerInterface.java b/comet4j-jar/src/org/comet4j/event/ListenerInterface.java new file mode 100644 index 0000000..75d0d0d --- /dev/null +++ b/comet4j-jar/src/org/comet4j/event/ListenerInterface.java @@ -0,0 +1,28 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.event; + +/** + * + */ + +/** + * 侦听接口 职责:规范事件侦听的执行方法 + * @author xiaojinghai@kedacom.com + */ + +@SuppressWarnings("rawtypes") +public interface ListenerInterface { + + /** + * 事件处理 + * @param anEvent + * @return + * 如果返回值为false则终被终止被终止执行此动作,避免动作的发生(如before类事件,一般为动作发生之前的事件才可以被终止执行,避免动作的发生 + * ), 否则继续执行其它侦听函数。 + */ + public abstract boolean handleEvent(E anEvent); +} diff --git a/comet4j-jar/src/org/comet4j/event/Observable.java b/comet4j-jar/src/org/comet4j/event/Observable.java new file mode 100644 index 0000000..e6bd927 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/event/Observable.java @@ -0,0 +1,244 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.event; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 被观察对象,此对象线程安全,内部实现使用乐观锁机制,即get方法不加锁,add,remove会有锁 职责:管理事件源对象、代理履行事件源职责 + * @author xiaojinghai@kedacom.com + */ +// TODO:考虑这里的Map是否可换为List,一个事件源对应于一种事件 +@SuppressWarnings("rawtypes") +public class Observable> { + + private Map, EventSource> eventSources = new HashMap, EventSource>(); + private List> interceptors = new ArrayList>(0); + private boolean suspend = false; + + /** + * 增加一个事件拦截器 此拦截器的interceptor方法在本对象所有事件发生之前执行,如有多个拦截器则按倒序逐个执行。 + * 当某个拦截器返回false则停止事件广播、终止动作的发生并不再执行其它拦截器,否则继续执行。 + * 当一个对象同时具备EventInterceptor和eventIntercept方法时,则先执行eventIntercept. + * @param anInterceptor + */ + @SuppressWarnings("unchecked") + public void addEventInterceptor(InterceptorInterface anInterceptor) { + synchronized (interceptors) { + interceptors.add(anInterceptor); + } + } + + /** + * 移除一个事件拦截器 + * @param anInterceptor + */ + public void removeEventInterceptor(L anInterceptor) { + synchronized (interceptors) { + interceptors.remove(anInterceptor); + } + } + + /** + * 移除所有事件拦截器 + */ + public void removeAllEventInterceptor() { + synchronized (interceptors) { + interceptors.clear(); + } + } + + /** + * 事件拦截 此方法在此对象所有事件发生之前执行,可以拦截发生在对象上的所有事件,默认不做任何处理,只返回true,子类可以重写此方法进行特殊处理。 + * 当一个对象同时具备eventIntercept方法和EventInterceptor时,则先执行eventIntercept. + * @param anEvent + * @return 返回false,则停止事件广播并终止动作的发生,否则继续执行。 + */ + public boolean eventIntercept(E anEvent) { + return true; + } + + /** + * 暂停事件的广播,但并不终止动作的发生,直到调用 resumeEvents方法 + */ + public void suspendEvents() { + suspend = true; + } + + /** + * 恢复事件广播,suspendEvents方法后使用。 + */ + public void resumeEvents() { + suspend = false; + } + + /** + * 触发事件广播 + * @param anEvent + * @return + */ + protected boolean fireEvent(E anEvent) { + if (eventIntercept(anEvent) == false) { + return false; + } + if (interceptors.size() > 0) { + for (int i = interceptors.size() - 1; i >= 0; i--) { + InterceptorInterface interceptor = interceptors.get(i); + if (interceptor.intercept(anEvent) == false) { + return false; + } + } + } + if (!suspend) { + EventSource es = null; + synchronized (eventSources) { + es = eventSources.get(anEvent.getClass()); + } + if (es != null) { + return es.fire(anEvent); + } + } + return true; + } + + /** + * 添加一种事件 + * @param clazz 事件类型 + */ + protected void addEvent(Class clazz) { + EventSource es = eventSources.get(clazz); + if (es == null) { + synchronized (eventSources) { + eventSources.put(clazz, new EventSource()); + } + } + } + + /** + * 删除一种事件及其所有侦听 + * @param clazz 事件类型 + */ + protected void removeEvent(Class clazz) { + synchronized (eventSources) { + EventSource es = eventSources.get(clazz); + if (es != null) { + es.removeAllListeners(); + } + eventSources.remove(clazz); + } + } + + /** + * 删除所有事件及所有侦听 + */ + protected void removeAllEvent() { + synchronized (eventSources) { + for (Class esn : eventSources.keySet()) { + EventSource es = eventSources.get(esn); + if (es != null) { + es.removeAllListeners(); + } + } + eventSources.clear(); + } + } + + /** + * 为事件增加侦听 + * @param clazz + * @param aListener + */ + public void addListener(Class clazz, L aListener) { + EventSource es = eventSources.get(clazz); + if (es != null) { + es.addListener(aListener); + } + } + + /** + * 删除事件的某个侦听 + * @param clazz + * @param aListener + */ + public void removeListener(Class clazz, L aListener) { + EventSource es = eventSources.get(clazz); + if (es != null) { + es.removeListener(aListener); + } + } + + /** + * 删除事件的所有侦听 + * @param clazz + */ + public void removeListener(Class clazz) { + EventSource es = eventSources.get(clazz); + if (es != null) { + es.removeAllListeners(); + } + } + + /** + * 删除所有侦听 + */ + public void removeAllListener() { + synchronized (eventSources) { + for (Class esn : eventSources.keySet()) { + EventSource es = eventSources.get(esn); + if (es != null) { + es.removeAllListeners(); + } + } + } + } + + /** + * 获取事件的所有侦听 + * @param clazz + * @return 未找到返回null + */ + public List getListeners(Class clazz) { + EventSource es = eventSources.get(clazz); + if (es != null) { + return es.getListeners(); + } else { + return new ArrayList(0); + } + } + + /** + * 获取事件的事件源对象 + * @param clazz + * @return 未找到返回null + */ + public EventSource getEventSource(Class clazz) { + return eventSources.get(clazz); + } + + /** + * 获取所有事件源 + * @return 未找到返回空列表 + */ + public List> getAllEventSource() { + List> result = new ArrayList>(); + for (Class esn : eventSources.keySet()) { + EventSource es = eventSources.get(esn); + result.add(es); + } + return result; + } + + public void destroy() { + this.removeAllEvent(); + eventSources = null; + interceptors.clear(); + interceptors = null; + } + +} diff --git a/comet4j-jar/src/org/comet4j/event/ReleaseNotes.txt b/comet4j-jar/src/org/comet4j/event/ReleaseNotes.txt new file mode 100644 index 0000000..e8ea5b1 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/event/ReleaseNotes.txt @@ -0,0 +1,7 @@ +--------Event模型 V0.0.2[2010.03.12]-------- +改进: +Listenner接口改为Listenner类,这样使用内部匿名类的方式增加事件侦听就变得更为方便 +事件名称由直接常量改为事件类型,事件与侦听类型通过泛型指定,使语法更为严禁 +事件中增加了stopEvent、preventDefault、处理,帮助使用者更灵活的控制事件侦听的执行 +Event中增加target属性,方便获取事件的发出者 +Observable增加suspendEvents与resumeEvents方法,用于暂停或恢复事件广播 \ No newline at end of file diff --git a/comet4j-jar/src/org/comet4j/event/SubEvent.java b/comet4j-jar/src/org/comet4j/event/SubEvent.java new file mode 100644 index 0000000..65ba0a8 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/event/SubEvent.java @@ -0,0 +1,13 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.event; + +/** + * 子事件 + */ + +public class SubEvent { +} diff --git a/comet4j-jar/src/org/comet4j/event/SubEventType.java b/comet4j-jar/src/org/comet4j/event/SubEventType.java new file mode 100644 index 0000000..06eefb2 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/event/SubEventType.java @@ -0,0 +1,14 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.event; + +/** + * 子事件类型 + */ + +public class SubEventType { + +} diff --git a/comet4j-jar/src/org/comet4j/event/demo/mac/PersonEventSubType.java b/comet4j-jar/src/org/comet4j/event/demo/mac/PersonEventSubType.java new file mode 100644 index 0000000..ab8b382 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/event/demo/mac/PersonEventSubType.java @@ -0,0 +1,12 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.event.demo.mac; + +public class PersonEventSubType { + + public static final SubEventType BEFORESAY = new SubEventType(); + public static final SubEventType BEFOREGO = new SubEventType(); +} diff --git a/comet4j-jar/src/org/comet4j/event/demo/mac/SubEventType.java b/comet4j-jar/src/org/comet4j/event/demo/mac/SubEventType.java new file mode 100644 index 0000000..1ea5296 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/event/demo/mac/SubEventType.java @@ -0,0 +1,9 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.event.demo.mac; + +public class SubEventType { +} diff --git a/comet4j-jar/src/org/comet4j/event/demo/mac/Test.java b/comet4j-jar/src/org/comet4j/event/demo/mac/Test.java new file mode 100644 index 0000000..e5d63ab --- /dev/null +++ b/comet4j-jar/src/org/comet4j/event/demo/mac/Test.java @@ -0,0 +1,131 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.event.demo.mac; + +import org.comet4j.event.Event; +import org.comet4j.event.Listener; +import org.comet4j.event.Observable; + +public class Test { + + // 用法展示:宏观事件模式 + public class PersonEvent extends Event { + + private SubEventType subType; + public String sayWords = ""; + public String goWhere = ""; + + public PersonEvent(Person target) { + super(target); + } + + public PersonEvent(Person target, SubEventType subtype) { + super(target); + this.subType = subtype; + } + + public SubEventType getSubType() { + return subType; + } + } + + public abstract class PersonListener extends Listener { + + @Override + public boolean handleEvent(PersonEvent pe) { + if (PersonEventSubType.BEFORESAY == pe.getSubType()) { + return onBeforeSay(pe); + } else if (PersonEventSubType.BEFOREGO == pe.getSubType()) { + return onBeforeGo(pe); + } + return true; + } + + public abstract boolean onBeforeSay(PersonEvent pe); + + public abstract boolean onBeforeGo(PersonEvent pe); + } + + public class PersonListener1 extends PersonListener { + + @Override + public boolean onBeforeSay(PersonEvent pe) { + System.out.println("1:One person want to say:" + pe.sayWords); + return true; + } + + @Override + public boolean onBeforeGo(PersonEvent pe) { + System.out.println("1:One person want to go:" + pe.goWhere); + return true; + } + } + + public class Person extends Observable { + + public Person() { + this.addEvent(PersonEvent.class); + } + + public void say(String aWords) { + PersonEvent e = new PersonEvent(this, PersonEventSubType.BEFORESAY); + e.sayWords = aWords; + if (!this.fireEvent(e)) { + return; + } + System.out.println("say:" + aWords); + } + + public void go(String where) { + PersonEvent e = new PersonEvent(this, PersonEventSubType.BEFOREGO); + e.goWhere = where; + if (!this.fireEvent(e)) { + return; + } + System.out.println("go:" + where); + } + } + + /** + * @param args + */ + public static void main(String[] args) { + new Test().run(); + + } + + // 用法 + public void run() { + Person person = new Person(); + + person.addListener(PersonEvent.class, new PersonListener1()); + + // 行间加入侦听 + person.addListener(PersonEvent.class, new PersonListener() { + + @Override + public boolean onBeforeSay(PersonEvent pe) { + // pe.stopEvent(); + // pe.preventDefault(); + System.out.println("2:One person want to say:" + pe.sayWords); + return true; + } + + @Override + public boolean onBeforeGo(PersonEvent pe) { + pe.stopEvent(); + // pe.preventDefault(); + System.out.println("2:One person want to go:" + pe.goWhere); + return true; + } + }); + + person.say("Hello world!"); + person.go("Home"); + + } + +} diff --git a/comet4j-jar/src/org/comet4j/event/demo/mac2/Test.java b/comet4j-jar/src/org/comet4j/event/demo/mac2/Test.java new file mode 100644 index 0000000..82b4960 --- /dev/null +++ b/comet4j-jar/src/org/comet4j/event/demo/mac2/Test.java @@ -0,0 +1,124 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.event.demo.mac2; + +import java.util.HashMap; +import java.util.Map; + +import org.comet4j.core.util.JSONUtil; +import org.comet4j.event.Event; +import org.comet4j.event.Listener; +import org.comet4j.event.Observable; + +public class Test { + + public class SpeakEvent extends Event { + + public String words = ""; + + public SpeakEvent(Person target, String aWords) { + super(target); + words = aWords; + } + } + + public class GoEvent extends Event { + + public String where = ""; + + public GoEvent(Person target, String where) { + super(target); + this.where = where; + } + } + + @SuppressWarnings("rawtypes") + public abstract class PersonListener extends Listener { + + @Override + public boolean handleEvent(Event anEvent) { + if (anEvent instanceof SpeakEvent) { + return onSay((SpeakEvent) anEvent); + } + if (anEvent instanceof GoEvent) { + return onGo((GoEvent) anEvent); + } + return true; + } + + public abstract boolean onSay(SpeakEvent anEvent); + + public abstract boolean onGo(GoEvent anEvent); + + } + + public class PersonListener1 extends PersonListener { + + @Override + public boolean onSay(SpeakEvent anEvent) { + System.out.println("1:One person want to speak"); + return true; + } + + @Override + public boolean onGo(GoEvent anEvent) { + System.out.println("1:One person want to go"); + return true; + } + } + + @SuppressWarnings({ + "unchecked", "rawtypes" + }) + public class Person extends Observable { + + public Person() { + addEvent(SpeakEvent.class); + addEvent(GoEvent.class); + } + + public void say(String aWords) { + SpeakEvent e = new SpeakEvent(this, aWords); + if (!fireEvent(e)) { + return; + } + System.out.println("say:" + aWords); + } + + public void go(String where) { + GoEvent e = new GoEvent(this, where); + if (!fireEvent(e)) { + return; + } + System.out.println("go:" + where); + } + } + + /** + * @param args + */ + public static void main(String[] args) { + new Test().run(); + + } + + // 用法 + @SuppressWarnings({ + "unchecked", "rawtypes" + }) + public void run() { + Person person = new Person(); + PersonListener1 ls = new PersonListener1(); + person.addListener(SpeakEvent.class, ls); + person.addListener(GoEvent.class, ls); + Map m = new HashMap(); + m.put("a", "aaa"); + m.put("b", true); + System.out.println(JSONUtil.object2json(m)); + + } + +} diff --git a/comet4j-jar/src/org/comet4j/event/demo/mic/Test.java b/comet4j-jar/src/org/comet4j/event/demo/mic/Test.java new file mode 100644 index 0000000..e94d4df --- /dev/null +++ b/comet4j-jar/src/org/comet4j/event/demo/mic/Test.java @@ -0,0 +1,105 @@ +/* + * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is + * licensed under BSD license. Use it as you wish, but keep this copyright + * intact. + */ +package org.comet4j.event.demo.mic; + +import org.comet4j.event.Event; +import org.comet4j.event.Listener; +import org.comet4j.event.Observable; + +public class Test { + + // 用法展示:微观事件模式 + public class SpeakEvent extends Event { + + public String words = ""; + + public SpeakEvent(Person target, String aWords) { + super(target); + words = aWords; + } + } + + public abstract class SpeakListener extends Listener { + + } + + public class GoEvent extends Event { + + public String where = ""; + + public GoEvent(Person target, String where) { + super(target); + this.where = where; + } + } + + public abstract class GoListener extends Listener { + + } + + @SuppressWarnings({ + "unchecked", "rawtypes" + }) + public class Person extends Observable { + + public Person() { + this.addEvent(SpeakEvent.class); + this.addEvent(GoEvent.class); + } + + public void say(String aWords) { + SpeakEvent e = new SpeakEvent(this, aWords); + if (!this.fireEvent(e)) { + return; + } + System.out.println("say:" + aWords); + } + + public void go(String anPlace) { + GoEvent e = new GoEvent(this, anPlace); + if (!this.fireEvent(e)) { + return; + } + System.out.println("go:" + anPlace); + } + } + + /** + * @param args + */ + public static void main(String[] args) { + new Test().run(); + + } + + @SuppressWarnings("unchecked") + public void run() { + Person person = new Person(); + person.addListener(SpeakEvent.class, new SpeakListener() { + + @Override + public boolean handleEvent(SpeakEvent anEvent) { + // anEvent.stopEvent(); + System.out.println("One person want to say:" + anEvent.words); + return true; + } + + }); + person.addListener(GoEvent.class, new GoListener() { + + @Override + public boolean handleEvent(GoEvent anEvent) { + // anEvent.stopEvent(); + System.out.println("One person want to go:" + anEvent.where); + return true; + } + + }); + person.say("Hello world!"); + person.go("Home!"); + } + +} diff --git a/comet4j-js/.project b/comet4j-js/.project new file mode 100644 index 0000000..763d73e --- /dev/null +++ b/comet4j-js/.project @@ -0,0 +1,17 @@ + + + comet4j-js + + + + + + org.eclipse.wst.jsdt.core.javascriptValidator + + + + + + org.eclipse.wst.jsdt.core.jsNature + + diff --git a/comet4j-js/.settings/.jsdtscope b/comet4j-js/.settings/.jsdtscope new file mode 100644 index 0000000..4e4f60c --- /dev/null +++ b/comet4j-js/.settings/.jsdtscope @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/comet4j-js/.settings/org.eclipse.wst.jsdt.ui.superType.container b/comet4j-js/.settings/org.eclipse.wst.jsdt.ui.superType.container new file mode 100644 index 0000000..3bd5d0a --- /dev/null +++ b/comet4j-js/.settings/org.eclipse.wst.jsdt.ui.superType.container @@ -0,0 +1 @@ +org.eclipse.wst.jsdt.launching.baseBrowserLibrary \ No newline at end of file diff --git a/comet4j-js/.settings/org.eclipse.wst.jsdt.ui.superType.name b/comet4j-js/.settings/org.eclipse.wst.jsdt.ui.superType.name new file mode 100644 index 0000000..05bd71b --- /dev/null +++ b/comet4j-js/.settings/org.eclipse.wst.jsdt.ui.superType.name @@ -0,0 +1 @@ +Window \ No newline at end of file diff --git a/comet4j-js/RoadMap.txt b/comet4j-js/RoadMap.txt new file mode 100644 index 0000000..b080a4d --- /dev/null +++ b/comet4j-js/RoadMap.txt @@ -0,0 +1,19 @@ +Opera下beforeunload没起作用 +Engine增加beforeStart事件? +Engine增加beforeStop事件? +ToFix:长连接不能正常接收 +断开原因改为编码表示 +增加异常事件,对异常可以统一处理 +v0.1.7 +修改了在长连接下的重连问题,OK +解决了Engine在Kiss框架下不触发通道事件问题 +v0.1.6 +修复了引擎无法触发通道事件的问题,OK +V0.1.5 +修复引擎在连接失败时不能正确触发stop事件的问题,OK +修复建立连接永不超时问题。OK +修复IE9,Opera连接断开后无限重连问题,OK +Engine.start方法增加param参数,OK +Connector增加错误重试特性,增强网络环境较差情况下的稳定性,OK +Connector对param的处理bug ,OK +Connector停止时对未传递参数的bug,OK \ No newline at end of file diff --git a/comet4j-js/comet4j-js.jsb b/comet4j-js/comet4j-js.jsb new file mode 100644 index 0000000..9497c9e --- /dev/null +++ b/comet4j-js/comet4j-js.jsb @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/comet4j-js/docs/index.html b/comet4j-js/docs/index.html new file mode 100644 index 0000000..3c99cb1 --- /dev/null +++ b/comet4j-js/docs/index.html @@ -0,0 +1,41 @@ + + + Comet4J-JavaScript - API Documentation + + + + + + + + + + +
    +
    +
    Loading...
    +
    + + + + + + + + + + +
    + +
    + + + \ No newline at end of file diff --git a/comet4j-js/docs/resources/TabCloseMenu.js b/comet4j-js/docs/resources/TabCloseMenu.js new file mode 100644 index 0000000..99aa326 --- /dev/null +++ b/comet4j-js/docs/resources/TabCloseMenu.js @@ -0,0 +1,42 @@ +// Very simple plugin for adding a close context menu to tabs +Ext.ux.TabCloseMenu = function(){ + var tabs, menu, ctxItem; + this.init = function(tp){ + tabs = tp; + tabs.on('contextmenu', onContextMenu); + } + + function onContextMenu(ts, item, e){ + if(!menu){ // create context menu on first right click + menu = new Ext.menu.Menu([{ + id: tabs.id + '-close', + text: 'Close Tab', + handler : function(){ + tabs.remove(ctxItem); + } + },{ + id: tabs.id + '-close-others', + text: 'Close Other Tabs', + handler : function(){ + tabs.items.each(function(item){ + if(item.closable && item != ctxItem){ + tabs.remove(item); + } + }); + } + }]); + } + ctxItem = item; + var items = menu.items; + items.get(tabs.id + '-close').setDisabled(!item.closable); + var disableOthers = true; + tabs.items.each(function(){ + if(this != item && this.closable){ + disableOthers = false; + return false; + } + }); + items.get(tabs.id + '-close-others').setDisabled(disableOthers); + menu.showAt(e.getPoint()); + } +}; \ No newline at end of file diff --git a/comet4j-js/docs/resources/accordian.gif b/comet4j-js/docs/resources/accordian.gif new file mode 100644 index 0000000..8846b0f Binary files /dev/null and b/comet4j-js/docs/resources/accordian.gif differ diff --git a/comet4j-js/docs/resources/block-bg.gif b/comet4j-js/docs/resources/block-bg.gif new file mode 100644 index 0000000..f3cf86d Binary files /dev/null and b/comet4j-js/docs/resources/block-bg.gif differ diff --git a/comet4j-js/docs/resources/block-bottom.gif b/comet4j-js/docs/resources/block-bottom.gif new file mode 100644 index 0000000..c0570c5 Binary files /dev/null and b/comet4j-js/docs/resources/block-bottom.gif differ diff --git a/comet4j-js/docs/resources/block-top.gif b/comet4j-js/docs/resources/block-top.gif new file mode 100644 index 0000000..cf3fb24 Binary files /dev/null and b/comet4j-js/docs/resources/block-top.gif differ diff --git a/comet4j-js/docs/resources/class.gif b/comet4j-js/docs/resources/class.gif new file mode 100644 index 0000000..72a4026 Binary files /dev/null and b/comet4j-js/docs/resources/class.gif differ diff --git a/comet4j-js/docs/resources/cmp.gif b/comet4j-js/docs/resources/cmp.gif new file mode 100644 index 0000000..4f791e1 Binary files /dev/null and b/comet4j-js/docs/resources/cmp.gif differ diff --git a/comet4j-js/docs/resources/collapse-all.gif b/comet4j-js/docs/resources/collapse-all.gif new file mode 100644 index 0000000..891d1b7 Binary files /dev/null and b/comet4j-js/docs/resources/collapse-all.gif differ diff --git a/comet4j-js/docs/resources/collapse-bg.gif b/comet4j-js/docs/resources/collapse-bg.gif new file mode 100644 index 0000000..e6b8da2 Binary files /dev/null and b/comet4j-js/docs/resources/collapse-bg.gif differ diff --git a/comet4j-js/docs/resources/collapser.css b/comet4j-js/docs/resources/collapser.css new file mode 100644 index 0000000..d1c7b46 --- /dev/null +++ b/comet4j-js/docs/resources/collapser.css @@ -0,0 +1,34 @@ +.pkg h3 { + padding-left:34px; + font:normal 11px verdana,helvetica,tahoma,sans-serif; + height:18px; + cursor:pointer; +} +h3.collapser-expanded{ + background: #fff url(pkg-open.gif) no-repeat 0px -1px; +} +h3.collapser-collapsed { + background: #fff url(pkg-closed.gif) no-repeat 0px -1px; +} +.pkg-body{ + margin-left:16px; + font:normal 11px verdana,helvetica,tahoma,sans-serif; +} +#classes a{ + font:normal 11px verdana,helvetica,tahoma,sans-serif; + display:block; + text-decoration:none; + height:18px; + color:black; + background: #fff url(class.gif) no-repeat 16px -1px; + padding-left:34px; + -moz-outline:none; + outline:none; + white-space: nowrap; +} +#classes a:hover{ + text-decoration: underline; +} +#classes a.ex{ + background: #fff url(example.gif) no-repeat 16px -1px; +} \ No newline at end of file diff --git a/comet4j-js/docs/resources/config.gif b/comet4j-js/docs/resources/config.gif new file mode 100644 index 0000000..6534c65 Binary files /dev/null and b/comet4j-js/docs/resources/config.gif differ diff --git a/comet4j-js/docs/resources/css/ext-all.css b/comet4j-js/docs/resources/css/ext-all.css new file mode 100644 index 0000000..24724bc --- /dev/null +++ b/comet4j-js/docs/resources/css/ext-all.css @@ -0,0 +1,925 @@ +/* + * Ext JS Library 2.2 + * Copyright(c) 2006-2008, Ext JS, LLC. + * licensing@extjs.com + * + * http://extjs.com/license + */ + +html,body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquote,th,td{margin:0;padding:0;} +img,body,html{border:0;} +address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;} +ol,ul{list-style:none;} +caption,th{text-align:left;} +h1,h2,h3,h4,h5,h6{font-size:100%;} +q:before,q:after{content:'';} + +.ext-el-mask{z-index:20000;position:absolute;top:0;left:0;-moz-opacity:0.5;opacity:.50;filter:alpha(opacity=50);background-color:#CCC;width:100%;height:100%;zoom:1;} +.ext-el-mask-msg{z-index:20001;position:absolute;top:0;left:0;border:1px solid #6593cf;background:#c3daf9 url(../images/default/box/tb-blue.gif) repeat-x 0 -16px;padding:2px;} +.ext-el-mask-msg div{padding:5px 10px 5px 10px;background:#eee;border:1px solid #a3bad9;color:#222;font:normal 11px tahoma,arial,helvetica,sans-serif;cursor:wait;} +.ext-shim{position:absolute;visibility:hidden;left:0;top:0;overflow:hidden;} +.ext-ie .ext-shim{filter:alpha(opacity=0);} +.ext-ie6 .ext-shim{margin-left:5px;margin-top:3px;} +.x-mask-loading div{padding:5px 10px 5px 25px;background:#fbfbfb url( '../images/default/grid/loading.gif' ) no-repeat 5px 5px;line-height:16px;} +.x-hidden,.x-hide-offsets{position:absolute;left:-10000px;top:-10000px;visibility:hidden;} +.x-hide-display{display:none!important;} +.x-hide-visibility{visibility:hidden!important;} +.x-masked{overflow:hidden!important;} +.x-masked select,.x-masked object,.x-masked embed{visibility:hidden;} +.x-layer{visibility:hidden;} +.x-unselectable,.x-unselectable *{-moz-user-select:none;-khtml-user-select:none;} +.x-repaint{zoom:1;background-color:transparent;-moz-outline:none;} +.x-item-disabled{color:gray;cursor:default;opacity:.6;-moz-opacity:.6;filter:alpha(opacity=60);} +.x-item-disabled *{color:gray!important;cursor:default!important;} +.x-splitbar-proxy{position:absolute;visibility:hidden;z-index:20001;background:#aaa;zoom:1;line-height:1px;font-size:1px;overflow:hidden;} +.x-splitbar-h,.x-splitbar-proxy-h{cursor:e-resize;cursor:col-resize;} +.x-splitbar-v,.x-splitbar-proxy-v{cursor:s-resize;cursor:row-resize;} +.x-color-palette{width:150px;height:92px;cursor:pointer;} +.x-color-palette a{border:1px solid #fff;float:left;padding:2px;text-decoration:none;-moz-outline:0 none;outline:0 none;cursor:pointer;} +.x-color-palette a:hover,.x-color-palette a.x-color-palette-sel{border:1px solid #8BB8F3;background:#deecfd;} +.x-color-palette em{display:block;border:1px solid #ACA899;} +.x-color-palette em span{cursor:pointer;display:block;height:10px;line-height:10px;width:10px;} +.x-ie-shadow{display:none;position:absolute;overflow:hidden;left:0;top:0;background:#777;zoom:1;} +.x-shadow{display:none;position:absolute;overflow:hidden;left:0;top:0;} +.x-shadow *{overflow:hidden;} +.x-shadow *{padding:0;border:0;margin:0;clear:none;zoom:1;} +.x-shadow .xstc,.x-shadow .xsbc{height:6px;float:left;} +.x-shadow .xstl,.x-shadow .xstr,.x-shadow .xsbl,.x-shadow .xsbr{width:6px;height:6px;float:left;} +.x-shadow .xsc{width:100%;} +.x-shadow .xsml,.x-shadow .xsmr{width:6px;float:left;height:100%;} +.x-shadow .xsmc{float:left;height:100%;background:transparent url( ../images/default/shadow-c.png );} +.x-shadow .xst,.x-shadow .xsb{height:6px;overflow:hidden;width:100%;} +.x-shadow .xsml{background:transparent url( ../images/default/shadow-lr.png ) repeat-y 0 0;} +.x-shadow .xsmr{background:transparent url( ../images/default/shadow-lr.png ) repeat-y -6px 0;} +.x-shadow .xstl{background:transparent url( ../images/default/shadow.png ) no-repeat 0 0;} +.x-shadow .xstc{background:transparent url( ../images/default/shadow.png ) repeat-x 0 -30px;} +.x-shadow .xstr{background:transparent url( ../images/default/shadow.png ) repeat-x 0 -18px;} +.x-shadow .xsbl{background:transparent url( ../images/default/shadow.png ) no-repeat 0 -12px;} +.x-shadow .xsbc{background:transparent url( ../images/default/shadow.png ) repeat-x 0 -36px;} +.x-shadow .xsbr{background:transparent url( ../images/default/shadow.png ) repeat-x 0 -6px;} +.loading-indicator{font-size:11px;background-image:url(../images/default/grid/loading.gif);background-repeat:no-repeat;background-position:left;padding-left:20px;line-height:16px;margin:3px;} +.x-text-resize{position:absolute;left:-1000px;top:-1000px;visibility:hidden;zoom:1;} +.x-drag-overlay{width:100%;height:100%;display:none;position:absolute;left:0;top:0;background-image:url(../images/default/s.gif);z-index:20000;} +.x-clear{clear:both;height:0;overflow:hidden;line-height:0;font-size:0;} +.x-spotlight{z-index:8999;position:absolute;top:0;left:0;-moz-opacity:0.5;opacity:.50;filter:alpha(opacity=50);background-color:#CCC;width:0;height:0;zoom:1;} + +.x-tab-panel{overflow:hidden;} +.x-tab-panel-header,.x-tab-panel-footer{background:#deecfd;border:1px solid #8db2e3;overflow:hidden;zoom:1;} +.x-tab-panel-header{border:1px solid #8db2e3;padding-bottom:2px;} +.x-tab-panel-footer{border:1px solid #8db2e3;padding-top:2px;} +.x-tab-strip-wrap{width:100%;overflow:hidden;position:relative;zoom:1;} +ul.x-tab-strip{display:block;width:5000px;zoom:1;} +ul.x-tab-strip-top{padding-top:1px;background:url(../images/default/tabs/tab-strip-bg.gif) #cedff5 repeat-x bottom;border-bottom:1px solid #8db2e3;} +ul.x-tab-strip-bottom{padding-bottom:1px;background:url(../images/default/tabs/tab-strip-btm-bg.gif) #cedff5 repeat-x top;border-top:1px solid #8db2e3;border-bottom:0 none;} +.x-tab-panel-header-plain .x-tab-strip-top{background:transparent!important;padding-top:0!important;} +.x-tab-panel-header-plain{background:transparent!important;border-width:0!important;padding-bottom:0!important;} +.x-tab-panel-header-plain .x-tab-strip-spacer,.x-tab-panel-footer-plain .x-tab-strip-spacer{border:1px solid #8db2e3;height:2px;background:#deecfd;font-size:1px;line-height:1px;} +.x-tab-panel-header-plain .x-tab-strip-spacer{border-top:0 none;} +.x-tab-panel-footer-plain .x-tab-strip-spacer{border-bottom:0 none;} +.x-tab-panel-footer-plain .x-tab-strip-bottom{background:transparent!important;padding-bottom:0!important;} +.x-tab-panel-footer-plain{background:transparent!important;border-width:0!important;padding-top:0!important;} +.ext-border-box .x-tab-panel-header-plain .x-tab-strip-spacer,.ext-border-box .x-tab-panel-footer-plain .x-tab-strip-spacer{height:3px;} +ul.x-tab-strip li{float:left;margin-left:2px;} +ul.x-tab-strip li.x-tab-edge{float:left;margin:0!important;padding:0!important;border:0 none!important;font-size:1px!important;line-height:1px!important;overflow:hidden;zoom:1;background:transparent!important;width:1px;} +.x-tab-strip a,.x-tab-strip span,.x-tab-strip em{display:block;} +.x-tab-strip a{text-decoration:none!important;-moz-outline:none;outline:none;cursor:pointer;} +.x-tab-strip-inner{overflow:hidden;text-overflow:ellipsis;} +.x-tab-strip span.x-tab-strip-text{font:normal 11px tahoma,arial,helvetica;color:#416aa3;white-space:nowrap;cursor:pointer;padding:4px 0;} +.x-tab-strip-top .x-tab-with-icon .x-tab-right{padding-left:6px;} +.x-tab-strip .x-tab-with-icon span.x-tab-strip-text{padding-left:20px;background-position:0 3px;background-repeat:no-repeat;} +.x-tab-strip-over span.x-tab-strip-text{color:#15428b;} +.x-tab-strip-active,.x-tab-strip-active a.x-tab-right{cursor:default;} +.x-tab-strip-active span.x-tab-strip-text{cursor:default;color:#15428b;font-weight:bold;} +.x-tab-strip-disabled .x-tabs-text{cursor:default;color:#aaa;} +.x-tab-panel-body{overflow:hidden;} +.x-tab-panel-bwrap{overflow:hidden;} +.ext-ie .x-tab-strip .x-tab-right{position:relative;} +.x-tab-strip-top .x-tab-strip-active .x-tab-right{margin-bottom:-1px;} +.x-tab-strip-top .x-tab-strip-active .x-tab-right span.x-tab-strip-text{padding-bottom:5px;} +.x-tab-strip-bottom .x-tab-strip-active .x-tab-right{margin-top:-1px;} +.x-tab-strip-bottom .x-tab-strip-active .x-tab-right span.x-tab-strip-text{padding-top:5px;} +.x-tab-strip-top .x-tab-right{background:transparent url(../images/default/tabs/tabs-sprite.gif) no-repeat 0 -51px;padding-left:10px;} +.x-tab-strip-top .x-tab-left{background:transparent url(../images/default/tabs/tabs-sprite.gif) no-repeat right -351px;padding-right:10px;} +.x-tab-strip-top .x-tab-strip-inner{background:transparent url(../images/default/tabs/tabs-sprite.gif) repeat-x 0 -201px;} +.x-tab-strip-top .x-tab-strip-over .x-tab-right{background-position:0 -101px;} +.x-tab-strip-top .x-tab-strip-over .x-tab-left{background-position:right -401px;} +.x-tab-strip-top .x-tab-strip-over .x-tab-strip-inner{background-position:0 -251px;} +.x-tab-strip-top .x-tab-strip-active .x-tab-right{background-position:0 0;} +.x-tab-strip-top .x-tab-strip-active .x-tab-left{background-position:right -301px;} +.x-tab-strip-top .x-tab-strip-active .x-tab-strip-inner{background-position:0 -151px;} +.x-tab-strip-bottom .x-tab-right{background:url(../images/default/tabs/tab-btm-inactive-right-bg.gif) no-repeat bottom right;} +.x-tab-strip-bottom .x-tab-left{background:url(../images/default/tabs/tab-btm-inactive-left-bg.gif) no-repeat bottom left;} +.x-tab-strip-bottom .x-tab-strip-active .x-tab-right{background:url(../images/default/tabs/tab-btm-right-bg.gif) no-repeat bottom left;} +.x-tab-strip-bottom .x-tab-strip-active .x-tab-left{background:url(../images/default/tabs/tab-btm-left-bg.gif) no-repeat bottom right;} +.x-tab-strip-bottom .x-tab-left{padding:0 10px;} +.x-tab-strip-bottom .x-tab-right{padding:0;} +.x-tab-strip .x-tab-strip-close{display:none;} +.x-tab-strip-closable{position:relative;} +.x-tab-strip-closable .x-tab-left{padding-right:19px;} +.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close{background-image:url(../images/default/tabs/tab-close.gif);opacity:.6;-moz-opacity:.6;background-repeat:no-repeat;display:block;width:11px;height:11px;position:absolute;top:3px;right:3px;cursor:pointer;z-index:2;} +.x-tab-strip .x-tab-strip-active a.x-tab-strip-close{opacity:.8;-moz-opacity:.8;} +.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close:hover{background-image:url(../images/default/tabs/tab-close.gif);opacity:1;-moz-opacity:1;} +.x-tab-panel-body{border:1px solid #8db2e3;background:#fff;} +.x-tab-panel-body-top{border-top:0 none;} +.x-tab-panel-body-bottom{border-bottom:0 none;} +.x-tab-scroller-left{background:transparent url(../images/default/tabs/scroll-left.gif) no-repeat -18px 0;border-bottom:1px solid #8db2e3;width:18px;position:absolute;left:0;top:0;z-index:10;cursor:pointer;} +.x-tab-scroller-left-over{background-position:0 0;} +.x-tab-scroller-left-disabled{background-position:-18px 0;opacity:.5;-moz-opacity:.5;filter:alpha(opacity=50);cursor:default;} +.x-tab-scroller-right{background:transparent url(../images/default/tabs/scroll-right.gif) no-repeat 0 0;border-bottom:1px solid #8db2e3;width:18px;position:absolute;right:0;top:0;z-index:10;cursor:pointer;} +.x-tab-scroller-right-over{background-position:-18px 0;} +.x-tab-scroller-right-disabled{background-position:0 0;opacity:.5;-moz-opacity:.5;filter:alpha(opacity=50);cursor:default;} +.x-tab-scrolling .x-tab-strip-wrap{margin-left:18px;margin-right:18px;} +.x-tab-scrolling{position:relative;} +.x-tab-panel-bbar .x-toolbar{border:1px solid #99bbe8;border-top:0 none;overflow:hidden;padding:2px;} +.x-tab-panel-tbar .x-toolbar{border:1px solid #99bbe8;border-top:0 none;overflow:hidden;padding:2px;} + + .x-form-field{margin:0;font:normal 12px tahoma,arial,helvetica,sans-serif;} +.x-form-text,textarea.x-form-field{padding:1px 3px;background:#fff url(../images/default/form/text-bg.gif) repeat-x 0 0;border:1px solid #B5B8C8;} +textarea.x-form-field{padding:2px 3px;} +.x-form-text{height:22px;line-height:18px;vertical-align:middle;} +.ext-ie .x-form-text{margin:-1px 0;height:22px;line-height:18px;} +.ext-ie textarea.x-form-field{margin:-1px 0;} +.ext-strict .x-form-text{height:18px;} +.ext-safari .x-form-text{height:20px;padding:0 3px;} +.ext-safari.ext-mac textarea.x-form-field{margin-bottom:-2px;} +.ext-gecko .x-form-text{padding-top:2px;padding-bottom:0;} +textarea{resize:none;} +.x-form-select-one{height:20px;line-height:18px;vertical-align:middle;background-color:#fff;border:1px solid #B5B8C8;} +.x-form-check-group,.x-form-radio-group{margin-bottom:0;} +.x-form-check-group .x-form-invalid .x-panel-body,.x-form-radio-group .x-form-invalid .x-panel-body{background-color:transparent;} +.x-form-check-wrap,.x-form-radio-wrap{padding:3px 0 0 0;line-height:18px;} +.x-form-check-group .x-form-check-wrap,.x-form-radio-group .x-form-radio-wrap{height:18px;} +.ext-ie .x-form-check-group .x-form-check-wrap,.ext-ie .x-form-radio-group .x-form-radio-wrap{height:21px;} +.ext-ie .x-form-check-wrap input,.ext-ie .x-form-radio-wrap input{width:15px;height:15px;} +.x-form-check,.x-form-radio{height:13px;width:13px;vertical-align:bottom;} +.x-form-radio{margin-bottom:3px;} +.x-form-check,.ext-ie .x-form-radio{margin-bottom:2px;} +.x-form-check-wrap-inner,.x-form-radio-wrap-inner{display:inline;padding:3px 0 0 0;} +.x-form-check{background:url('../images/default/form/checkbox.gif') no-repeat 0 0;} +.x-form-radio{background:url('../images/default/form/radio.gif') no-repeat 0 0;} +.x-form-check-focus .x-form-check,.x-form-check-over .x-form-check,.x-form-check-focus .x-form-radio,.x-form-check-over .x-form-radio{background-position:-13px 0;} +.x-form-check-down .x-form-check,.x-form-check-down .x-form-radio{background-position:-26px 0;} +.x-form-check-checked .x-form-check-focus .x-form-check,.x-form-check-checked .x-form-check-over .x-form-check{background-position:-13px -13px;} +.x-form-check-checked .x-form-check-down .x-form-check{background-position:-26px -13px;} +.x-form-check-checked .x-form-check,.x-form-check-checked .x-form-radio{background-position:0 -13px;} +.x-form-check-group-label{border-bottom:1px solid #99BBE8;color:#15428B;margin-bottom:5px;padding-left:3px!important;float:none!important;} +.x-form-field-wrap{position:relative;zoom:1;white-space:nowrap;} +.x-form-field-wrap .x-form-trigger{width:17px;height:21px;border:0;background:transparent url(../images/default/form/trigger.gif) no-repeat 0 0;cursor:pointer;border-bottom:1px solid #B5B8C8;position:absolute;top:0;} +.ext-safari .x-form-field-wrap .x-form-trigger{height:21px;} +.x-form-field-wrap .x-form-date-trigger{background-image:url(../images/default/form/date-trigger.gif);cursor:pointer;} +.x-form-field-wrap .x-form-clear-trigger{background-image:url(../images/default/form/clear-trigger.gif);cursor:pointer;} +.x-form-field-wrap .x-form-search-trigger{background-image:url(../images/default/form/search-trigger.gif);cursor:pointer;} +.ext-safari .x-form-field-wrap .x-form-trigger{right:0;} +.x-form-field-wrap .x-form-twin-triggers .x-form-trigger{position:static;top:auto;vertical-align:top;} +.x-form-field-wrap .x-form-trigger-over{background-position:-17px 0;} +.x-form-field-wrap .x-form-trigger-click{background-position:-34px 0;} +.x-trigger-wrap-focus .x-form-trigger{background-position:-51px 0;} +.x-trigger-wrap-focus .x-form-trigger-over{background-position:-68px 0;} +.x-trigger-wrap-focus .x-form-trigger-click{background-position:-85px 0;} +.x-trigger-wrap-focus .x-form-trigger{border-bottom:1px solid #7eadd9;} +.x-item-disabled .x-form-trigger-over{background-position:0 0!important;border-bottom:1px solid #B5B8C8;} +.x-item-disabled .x-form-trigger-click{background-position:0 0!important;border-bottom:1px solid #B5B8C8;} +.x-form-focus,textarea.x-form-focus{border:1px solid #7eadd9;} +.x-form-invalid,textarea.x-form-invalid{background:#fff url(../images/default/grid/invalid_line.gif) repeat-x bottom;border:1px solid #dd7870;} +.ext-safari .x-form-invalid{background-color:#fee;border:1px solid #ff7870;} +.x-editor{visibility:hidden;padding:0;margin:0;} +.x-editor .x-form-check-wrap,.x-editor .x-form-radio-wrap{background:#fff;padding:3px;} +.x-editor .x-form-checkbox{height:13px;} +.x-form-grow-sizer{font:normal 12px tahoma,arial,helvetica,sans-serif;left:-10000px;padding:8px 3px;position:absolute;visibility:hidden;top:-10000px;white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word;zoom:1;} +.x-form-grow-sizer p{margin:0!important;border:0 none!important;padding:0!important;} +.x-form-item{font:normal 12px tahoma,arial,helvetica,sans-serif;display:block;margin-bottom:4px;zoom:1;} +.x-form-item label{display:block;float:left;width:100px;padding:3px;padding-left:0;clear:left;z-index:2;position:relative;} +.x-form-element{padding-left:105px;position:relative;} +.x-form-invalid-msg{color:#e00;padding:2px;padding-left:18px;font:normal 11px tahoma,arial,helvetica,sans-serif;background:transparent url(../images/default/shared/warning.gif) no-repeat 0 2px;line-height:16px;width:200px;} +.x-form-label-right label{text-align:right;} +.x-form-label-left label{text-align:left;} +.x-form-label-top .x-form-item label{width:auto;float:none;clear:none;display:inline;margin-bottom:4px;position:static;} +.x-form-label-top .x-form-element{padding-left:0;padding-top:4px;} +.x-form-label-top .x-form-item{padding-bottom:4px;} +.x-form-empty-field{color:gray;} +.x-small-editor .x-form-field{font:normal 11px arial,tahoma,helvetica,sans-serif;} +.x-small-editor .x-form-text{height:20px;line-height:16px;vertical-align:middle;} +.ext-ie .x-small-editor .x-form-text{margin-top:-1px!important;margin-bottom:-1px!important;height:20px!important;line-height:16px!important;} +.ext-strict .x-small-editor .x-form-text{height:16px!important;} +.ext-safari .x-small-editor .x-form-field{font:normal 12px arial,tahoma,helvetica,sans-serif;} +.ext-ie .x-small-editor .x-form-text{height:20px;line-height:16px;} +.ext-border-box .x-small-editor .x-form-text{height:20px;} +.x-small-editor .x-form-select-one{height:20px;line-height:16px;vertical-align:middle;} +.x-small-editor .x-form-num-field{text-align:right;} +.x-small-editor .x-form-field-wrap .x-form-trigger{height:19px;} +.x-form-clear{clear:both;height:0;overflow:hidden;line-height:0;font-size:0;} +.x-form-clear-left{clear:left;height:0;overflow:hidden;line-height:0;font-size:0;} +.x-form-cb-label{width:'auto'!important;float:none!important;clear:none!important;display:inline!important;margin-left:4px;} +.x-form-column{float:left;padding:0;margin:0;width:48%;overflow:hidden;zoom:1;} +.x-form .x-form-btns-ct .x-btn{float:right;clear:none;} +.x-form .x-form-btns-ct .x-form-btns td{border:0;padding:0;} +.x-form .x-form-btns-ct .x-form-btns-right table{float:right;clear:none;} +.x-form .x-form-btns-ct .x-form-btns-left table{float:left;clear:none;} +.x-form .x-form-btns-ct .x-form-btns-center{text-align:center;} +.x-form .x-form-btns-ct .x-form-btns-center table{margin:0 auto;} +.x-form .x-form-btns-ct table td.x-form-btn-td{padding:3px;} +.x-form .x-form-btns-ct .x-btn-focus .x-btn-left{background-position:0 -147px;} +.x-form .x-form-btns-ct .x-btn-focus .x-btn-right{background-position:0 -168px;} +.x-form .x-form-btns-ct .x-btn-focus .x-btn-center{background-position:0 -189px;} +.x-form .x-form-btns-ct .x-btn-click .x-btn-center{background-position:0 -126px;} +.x-form .x-form-btns-ct .x-btn-click .x-btn-right{background-position:0 -84px;} +.x-form .x-form-btns-ct .x-btn-click .x-btn-left{background-position:0 -63px;} +.x-form-invalid-icon{width:16px;height:18px;visibility:hidden;position:absolute;left:0;top:0;display:block;background:transparent url(../images/default/form/exclamation.gif) no-repeat 0 2px;} +.x-fieldset{border:1px solid #B5B8C8;padding:10px;margin-bottom:10px;display:block;} +.x-fieldset legend{font:bold 11px tahoma,arial,helvetica,sans-serif;color:#15428b;} +.ext-ie .x-fieldset legend{margin-bottom:10px;} +.ext-ie .x-fieldset{padding-top:0;padding-bottom:10px;} +.x-fieldset legend .x-tool-toggle{margin-right:3px;margin-left:0;float:left!important;} +.x-fieldset legend input{margin-right:3px;float:left!important;height:13px;width:13px;} +fieldset.x-panel-collapsed{padding-bottom:0!important;border-width:1px 0 0 0!important;} +fieldset.x-panel-collapsed .x-fieldset-bwrap{visibility:hidden;position:absolute;left:-1000px;top:-1000px;} +.ext-ie .x-fieldset-bwrap{zoom:1;} +.ext-ie td .x-form-text{position:relative;top:-1px;} +.x-fieldset-noborder{border:0 none transparent;} +.x-fieldset-noborder legend{margin-left:-3px;} +.ext-ie .x-fieldset-noborder legend{position:relative;margin-bottom:23px;} +.ext-ie .x-fieldset-noborder legend span{position:absolute;left:-5px;} +.ext-gecko .x-window-body .x-form-item{-moz-outline:none;overflow:auto;} +.ext-gecko .x-form-item{-moz-outline:none;} +.x-hide-label label.x-form-item-label{display:none;} +.x-hide-label .x-form-element{padding-left:0!important;} +.x-fieldset{overflow:hidden;} +.x-fieldset-bwrap{overflow:hidden;zoom:1;} +.x-fieldset-body{overflow:hidden;} + +.x-btn{font:normal 11px tahoma,verdana,helvetica;cursor:pointer;white-space:nowrap;} +.x-btn button{border:0 none;background:transparent;font:normal 11px tahoma,verdana,helvetica;padding-left:3px;padding-right:3px;cursor:pointer;margin:0;overflow:visible;width:auto;-moz-outline:0 none;outline:0 none;} +* html .ext-ie .x-btn button{width:1px;} +.ext-gecko .x-btn button{padding-left:0;padding-right:0;} +.ext-ie .x-btn button{padding-top:2px;} +.x-btn-icon .x-btn-center .x-btn-text{background-position:center;background-repeat:no-repeat;height:16px;width:16px;cursor:pointer;white-space:nowrap;padding:0;} +.x-btn-icon .x-btn-center{padding:1px;} +.x-btn em{font-style:normal;font-weight:normal;} +.x-btn-text-icon .x-btn-center .x-btn-text{background-position:0 2px;background-repeat:no-repeat;padding-left:18px;padding-top:3px;padding-bottom:2px;padding-right:0;} +.ext-gecko3 .x-btn-text-icon .x-btn-center .x-btn-text{padding-top:2px;} +.x-btn-left,.x-btn-right{font-size:1px;line-height:1px;} +.x-btn-left{width:3px;height:21px;background:url(../images/default/button/btn-sprite.gif) no-repeat 0 0;} +.x-btn-right{width:3px;height:21px;background:url(../images/default/button/btn-sprite.gif) no-repeat 0 -21px;} +.x-btn-left i,.x-btn-right i{display:block;width:3px;overflow:hidden;font-size:1px;line-height:1px;} +.x-btn-center{background:url(../images/default/button/btn-sprite.gif) repeat-x 0 -42px;vertical-align:middle;text-align:center;padding:0 5px;cursor:pointer;white-space:nowrap;} +.x-btn-over .x-btn-left{background-position:0 -63px;} +.x-btn-over .x-btn-right{background-position:0 -84px;} +.x-btn-over .x-btn-center{background-position:0 -105px;} +.x-btn-click .x-btn-center,.x-btn-menu-active .x-btn-center{background-position:0 -126px;} +.x-btn-disabled *{color:gray!important;cursor:default!important;} +.x-btn-menu-text-wrap .x-btn-center{padding:0 3px;} +.ext-gecko .x-btn-menu-text-wrap .x-btn-center{padding:0 1px;} +.x-btn-menu-arrow-wrap .x-btn-center{padding:0;} +.x-btn-menu-arrow-wrap .x-btn-center button{width:12px!important;height:21px;padding:0!important;display:block;background:transparent url(../images/default/button/btn-arrow.gif) no-repeat left 3px;} +.x-btn-with-menu .x-btn-center{padding-right:2px!important;} +.x-btn-with-menu .x-btn-center em{display:block;background:transparent url(../images/default/toolbar/btn-arrow.gif) no-repeat right 0;padding-right:10px;} +.x-btn-text-icon .x-btn-with-menu .x-btn-center em{display:block;background:transparent url(../images/default/toolbar/btn-arrow.gif) no-repeat right 3px;padding-right:10px;} +.x-btn-pressed .x-btn-left{background:url(../images/default/button/btn-sprite.gif) no-repeat 0 -63px;} +.x-btn-pressed .x-btn-right{background:url(../images/default/button/btn-sprite.gif) no-repeat 0 -84px;} +.x-btn-pressed .x-btn-center{background:url(../images/default/button/btn-sprite.gif) repeat-x 0 -126px;} + +.x-toolbar{border-color:#a9bfd3;border-style:solid;border-width:0 0 1px 0;display:block;padding:2px;background:#d0def0 url(../images/default/toolbar/bg.gif) repeat-x top left;position:relative;zoom:1;} +.x-toolbar .x-item-disabled .x-btn-icon{opacity:.35;-moz-opacity:.35;filter:alpha(opacity=35);} +.x-toolbar td{vertical-align:middle;} +.mso .x-toolbar,.x-grid-mso .x-toolbar{border:0 none;background:url(../images/default/grid/mso-hd.gif);} +.x-toolbar td,.x-toolbar span,.x-toolbar input,.x-toolbar div,.x-toolbar select,.x-toolbar label{white-space:nowrap;font:normal 11px tahoma,arial,helvetica,sans-serif;} +.x-toolbar .x-item-disabled{color:gray;cursor:default;opacity:.6;-moz-opacity:.6;filter:alpha(opacity=60);} +.x-toolbar .x-item-disabled *{color:gray;cursor:default;} +.x-toolbar .x-btn-left{background:none;} +.x-toolbar .x-btn-right{background:none;} +.x-toolbar .x-btn-center{background:none;padding:0;} +.x-toolbar .x-btn-menu-text-wrap .x-btn-center button{padding-right:2px;} +.ext-gecko .x-toolbar .x-btn-menu-text-wrap .x-btn-center button{padding-right:0;} +.x-toolbar .x-btn-menu-arrow-wrap .x-btn-center button{padding:0 2px;} +.x-toolbar .x-btn-menu-arrow-wrap .x-btn-center button{width:12px;background:transparent url(../images/default/toolbar/btn-arrow.gif) no-repeat 0 3px;} +.x-toolbar .x-btn-text-icon .x-btn-menu-arrow-wrap .x-btn-center button{width:12px;background:transparent url(../images/default/toolbar/btn-arrow.gif) no-repeat 0 3px;} +.x-toolbar .x-btn-over .x-btn-menu-arrow-wrap .x-btn-center button{background-position:0 -47px;} +.x-toolbar .x-btn-over .x-btn-left{background:url(../images/default/toolbar/tb-btn-sprite.gif) no-repeat 0 0;} +.x-toolbar .x-btn-over .x-btn-right{background:url(../images/default/toolbar/tb-btn-sprite.gif) no-repeat 0 -21px;} +.x-toolbar .x-btn-over .x-btn-center{background:url(../images/default/toolbar/tb-btn-sprite.gif) repeat-x 0 -42px;} +.x-toolbar .x-btn-click .x-btn-left,.x-toolbar .x-btn-pressed .x-btn-left,.x-toolbar .x-btn-menu-active .x-btn-left{background:url(../images/default/toolbar/tb-btn-sprite.gif) no-repeat 0 -63px;} +.x-toolbar .x-btn-click .x-btn-right,.x-toolbar .x-btn-pressed .x-btn-right,.x-toolbar .x-btn-menu-active .x-btn-right{background:url(../images/default/toolbar/tb-btn-sprite.gif) no-repeat 0 -84px;} +.x-toolbar .x-btn-click .x-btn-center,.x-toolbar .x-btn-pressed .x-btn-center,.x-toolbar .x-btn-menu-active .x-btn-center{background:url(../images/default/toolbar/tb-btn-sprite.gif) repeat-x 0 -105px;} +.x-toolbar .x-btn-with-menu .x-btn-center em{padding-right:8px;} +.x-toolbar .ytb-text{padding:2px;} +.x-toolbar .ytb-sep{background-image:url(../images/default/grid/grid-blue-split.gif);background-position:center;background-repeat:no-repeat;display:block;font-size:1px;height:16px;width:4px;overflow:hidden;cursor:default;margin:0 2px 0;border:0;} +.x-toolbar .ytb-spacer{width:2px;} +.x-tbar-page-number{width:24px;height:14px;} +.x-tbar-page-first{background-image:url(../images/default/grid/page-first.gif)!important;} +.x-tbar-loading{background-image:url(../images/default/grid/refresh.gif)!important;} +.x-tbar-page-last{background-image:url(../images/default/grid/page-last.gif)!important;} +.x-tbar-page-next{background-image:url(../images/default/grid/page-next.gif)!important;} +.x-tbar-page-prev{background-image:url(../images/default/grid/page-prev.gif)!important;} +.x-item-disabled .x-tbar-loading{background-image:url(../images/default/grid/loading.gif)!important;} +.x-item-disabled .x-tbar-page-first{background-image:url(../images/default/grid/page-first-disabled.gif)!important;} +.x-item-disabled .x-tbar-page-last{background-image:url(../images/default/grid/page-last-disabled.gif)!important;} +.x-item-disabled .x-tbar-page-next{background-image:url(../images/default/grid/page-next-disabled.gif)!important;} +.x-item-disabled .x-tbar-page-prev{background-image:url(../images/default/grid/page-prev-disabled.gif)!important;} +.x-paging-info{position:absolute;top:5px;right:8px;color:#444;} +.x-statusbar .x-status-text{height:21px;line-height:21px;padding:0 4px;cursor:default;} +.x-statusbar .x-status-busy{padding-left:25px;background:transparent url(../images/default/grid/loading.gif) no-repeat 3px 3px;} +.x-statusbar .x-status-text-panel{border-top:1px solid #99BBE8;border-right:1px solid #fff;border-bottom:1px solid #fff;border-left:1px solid #99BBE8;padding:2px 8px 2px 5px;} + +.x-resizable-handle{position:absolute;z-index:100;font-size:1px;line-height:6px;overflow:hidden;background:white;filter:alpha(opacity=0);opacity:0;zoom:1;} +.x-resizable-handle-east{width:6px;cursor:e-resize;right:0;top:0;height:100%;} +.ext-ie .x-resizable-handle-east{margin-right:-1px;} +.x-resizable-handle-south{width:100%;cursor:s-resize;left:0;bottom:0;height:6px;} +.ext-ie .x-resizable-handle-south{margin-bottom:-1px;} +.x-resizable-handle-west{width:6px;cursor:w-resize;left:0;top:0;height:100%;} +.x-resizable-handle-north{width:100%;cursor:n-resize;left:0;top:0;height:6px;} +.x-resizable-handle-southeast{width:6px;cursor:se-resize;right:0;bottom:0;height:6px;z-index:101;} +.x-resizable-handle-northwest{width:6px;cursor:nw-resize;left:0;top:0;height:6px;z-index:101;} +.x-resizable-handle-northeast{width:6px;cursor:ne-resize;right:0;top:0;height:6px;z-index:101;} +.x-resizable-handle-southwest{width:6px;cursor:sw-resize;left:0;bottom:0;height:6px;z-index:101;} +.x-resizable-over .x-resizable-handle,.x-resizable-pinned .x-resizable-handle{filter:alpha(opacity=100);opacity:1;} +.x-resizable-over .x-resizable-handle-east,.x-resizable-pinned .x-resizable-handle-east{background:url(../images/default/sizer/e-handle.gif);background-position:left;} +.x-resizable-over .x-resizable-handle-west,.x-resizable-pinned .x-resizable-handle-west{background:url(../images/default/sizer/e-handle.gif);background-position:left;} +.x-resizable-over .x-resizable-handle-south,.x-resizable-pinned .x-resizable-handle-south{background:url(../images/default/sizer/s-handle.gif);background-position:top;} +.x-resizable-over .x-resizable-handle-north,.x-resizable-pinned .x-resizable-handle-north{background:url(../images/default/sizer/s-handle.gif);background-position:top;} +.x-resizable-over .x-resizable-handle-southeast,.x-resizable-pinned .x-resizable-handle-southeast{background:url(../images/default/sizer/se-handle.gif);background-position:top left;} +.x-resizable-over .x-resizable-handle-northwest,.x-resizable-pinned .x-resizable-handle-northwest{background:url(../images/default/sizer/nw-handle.gif);background-position:bottom right;} +.x-resizable-over .x-resizable-handle-northeast,.x-resizable-pinned .x-resizable-handle-northeast{background:url(../images/default/sizer/ne-handle.gif);background-position:bottom left;} +.x-resizable-over .x-resizable-handle-southwest,.x-resizable-pinned .x-resizable-handle-southwest{background:url(../images/default/sizer/sw-handle.gif);background-position:top right;} +.x-resizable-proxy{border:1px dashed #3b5a82;position:absolute;overflow:hidden;display:none;left:0;top:0;z-index:50000;} +.x-resizable-overlay{width:100%;height:100%;display:none;position:absolute;left:0;top:0;background:white;z-index:200000;-moz-opacity:0;opacity:0;filter:alpha(opacity=0);} + + .x-grid3{position:relative;overflow:hidden;background-color:#fff;} +.x-grid-panel .x-panel-body{overflow:hidden!important;} +.x-grid-panel .x-panel-mc .x-panel-body{border:1px solid #99bbe8;} +.x-grid3 table{table-layout:fixed;} +.x-grid3-viewport{overflow:hidden;} +.x-grid3-hd-row td,.x-grid3-row td,.x-grid3-summary-row td{font:normal 11px arial,tahoma,helvetica,sans-serif;-moz-outline:none;-moz-user-focus:normal;} +.x-grid3-row td,.x-grid3-summary-row td{line-height:13px;vertical-align:top;padding-left:1px;padding-right:1px;-moz-user-select:none;} +.x-grid3-hd-row td{line-height:15px;vertical-align:middle;border-left:1px solid #eee;border-right:1px solid #d0d0d0;} +.x-grid3-hd-row .x-grid3-marker-hd{padding:3px;} +.x-grid3-row .x-grid3-marker{padding:3px;} +.x-grid3-cell-inner,.x-grid3-hd-inner{overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis;padding:3px 3px 3px 5px;white-space:nowrap;} +.x-grid3-hd-inner{position:relative;cursor:inherit;padding:4px 3px 4px 5px;} +.x-grid3-row-body{white-space:normal;} +.x-grid3-body-cell{-moz-outline:0 none;outline:0 none;} +.ext-ie .x-grid3-cell-inner,.ext-ie .x-grid3-hd-inner{width:100%;} +.ext-strict .x-grid3-cell-inner,.ext-strict .x-grid3-hd-inner{width:auto;} +.x-grid-row-loading{background:#fff url(../images/default/shared/loading-balls.gif) no-repeat center center;} +.x-grid-page{overflow:hidden;} +.x-grid3-row{cursor:default;border:1px solid #ededed;border-top-color:#fff;width:100%;} +.x-grid3-row-alt{background-color:#fafafa;} +.x-grid3-row-over{border:1px solid #ddd;background:#efefef url(../images/default/grid/row-over.gif) repeat-x left top;} +.x-grid3-resize-proxy{width:1px;left:0;background-color:#777;cursor:e-resize;cursor:col-resize;position:absolute;top:0;height:100px;overflow:hidden;visibility:hidden;border:0 none;z-index:7;} +.x-grid3-resize-marker{width:1px;left:0;background-color:#777;position:absolute;top:0;height:100px;overflow:hidden;visibility:hidden;border:0 none;z-index:7;} +.x-grid3-focus{position:absolute;left:0;top:0;width:1px;height:1px;line-height:1px;font-size:1px;-moz-outline:0 none;outline:0 none;-moz-user-select:text;-khtml-user-select:text;} +.x-grid3-header{background:#f9f9f9 url(../images/default/grid/grid3-hrow.gif) repeat-x 0 bottom;cursor:default;zoom:1;padding:1px 0 0 0;} +.x-grid3-header-pop{border-left:1px solid #d0d0d0;float:right;clear:none;} +.x-grid3-header-pop-inner{border-left:1px solid #eee;width:14px;height:19px;background:transparent url(../images/default/grid/hd-pop.gif) no-repeat center center;} +.ext-ie .x-grid3-header-pop-inner{width:15px;} +.ext-strict .x-grid3-header-pop-inner{width:14px;} +.x-grid3-header-inner{overflow:hidden;zoom:1;float:left;} +.x-grid3-header-offset{padding-left:1px;width:10000px;} +td.x-grid3-hd-over,td.sort-desc,td.sort-asc,td.x-grid3-hd-menu-open{border-left:1px solid #aaccf6;border-right:1px solid #aaccf6;} +td.x-grid3-hd-over .x-grid3-hd-inner,td.sort-desc .x-grid3-hd-inner,td.sort-asc .x-grid3-hd-inner,td.x-grid3-hd-menu-open .x-grid3-hd-inner{background:#ebf3fd url(../images/default/grid/grid3-hrow-over.gif) repeat-x left bottom;} +.x-grid3-sort-icon{background-repeat:no-repeat;display:none;height:4px;width:13px;margin-left:3px;vertical-align:middle;} +.sort-asc .x-grid3-sort-icon{background-image:url(../images/default/grid/sort_asc.gif);display:inline;} +.sort-desc .x-grid3-sort-icon{background-image:url(../images/default/grid/sort_desc.gif);display:inline;} +.ext-strict .ext-ie .x-grid3-header-inner{position:relative;} +.ext-strict .ext-ie6 .x-grid3-hd{position:relative;} +.ext-strict .ext-ie6 .x-grid3-hd-inner{position:static;} +.x-grid3-body{zoom:1;} +.x-grid3-scroller{overflow:auto;zoom:1;position:relative;} +.x-grid3-cell-text,.x-grid3-hd-text{display:block;padding:3px 5px 3px 5px;-moz-user-select:none;-khtml-user-select:none;color:black;} +.x-grid3-split{background-image:url(../images/default/grid/grid-split.gif);background-position:center;background-repeat:no-repeat;cursor:e-resize;cursor:col-resize;display:block;font-size:1px;height:16px;overflow:hidden;position:absolute;top:2px;width:6px;z-index:3;} +.x-grid3-hd-text{color:#15428b;} +.x-dd-drag-proxy .x-grid3-hd-inner{background:#ebf3fd url(../images/default/grid/grid3-hrow-over.gif) repeat-x left bottom;width:120px;padding:3px;border:1px solid #aaccf6;overflow:hidden;} +.col-move-top,.col-move-bottom{width:9px;height:9px;position:absolute;top:0;line-height:1px;font-size:1px;overflow:hidden;visibility:hidden;z-index:20000;} +.col-move-top{background:transparent url(../images/default/grid/col-move-top.gif) no-repeat left top;} +.col-move-bottom{background:transparent url(../images/default/grid/col-move-bottom.gif) no-repeat left top;} +.x-grid3-row-selected{background:#DFE8F6!important;border:1px dotted #a3bae9;} +.x-grid3-cell-selected{background-color:#B8CFEE!important;color:black;} +.x-grid3-cell-selected span{color:black!important;} +.x-grid3-cell-selected .x-grid3-cell-text{color:black;} +.x-grid3-locked td.x-grid3-row-marker,.x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker{background:#ebeadb url(../images/default/grid/grid-hrow.gif) repeat-x 0 bottom!important;vertical-align:middle!important;color:black;padding:0;border-top:1px solid white;border-bottom:none!important;border-right:1px solid #6fa0df!important;text-align:center;} +.x-grid3-locked td.x-grid3-row-marker div,.x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker div{padding:0 4px;color:#15428b!important;text-align:center;} +.x-grid3-dirty-cell{background:transparent url(../images/default/grid/dirty.gif) no-repeat 0 0;} +.x-grid3-topbar,.x-grid3-bottombar{font:normal 11px arial,tahoma,helvetica,sans-serif;overflow:hidden;display:none;zoom:1;position:relative;} +.x-grid3-topbar .x-toolbar{border-right:0 none;} +.x-grid3-bottombar .x-toolbar{border-right:0 none;border-bottom:0 none;border-top:1px solid #a9bfd3;} +.x-props-grid .x-grid3-cell{padding:1px;} +.x-props-grid .x-grid3-td-name .x-grid3-cell-inner{background:transparent url(../images/default/grid/grid3-special-col-bg.gif) repeat-y -16px!important;padding-left:12px;color:black!important;} +.x-props-grid .x-grid3-body .x-grid3-td-name{padding:1px;padding-right:0;background:white!important;border:0 none;border-right:1px solid #eee;} +.xg-hmenu-sort-asc .x-menu-item-icon{background-image:url(../images/default/grid/hmenu-asc.gif);} +.xg-hmenu-sort-desc .x-menu-item-icon{background-image:url(../images/default/grid/hmenu-desc.gif);} +.xg-hmenu-lock .x-menu-item-icon{background-image:url(../images/default/grid/hmenu-lock.gif);} +.xg-hmenu-unlock .x-menu-item-icon{background-image:url(../images/default/grid/hmenu-unlock.gif);} +.x-grid3-col-dd{border:0 none;padding:0;background:transparent;} +.x-dd-drag-ghost .x-grid3-dd-wrap{padding:1px 3px 3px 1px;} +.x-grid3-hd{-moz-user-select:none;} +.x-grid3-hd-btn{display:none;position:absolute;width:14px;background:#c3daf9 url(../images/default/grid/grid3-hd-btn.gif) no-repeat left center;right:0;top:0;z-index:2;cursor:pointer;} +.x-grid3-hd-over .x-grid3-hd-btn,.x-grid3-hd-menu-open .x-grid3-hd-btn{display:block;} +a.x-grid3-hd-btn:hover{background-position:-14px center;} +.x-grid3-body .x-grid3-td-expander{background:transparent url(../images/default/grid/grid3-special-col-bg.gif) repeat-y right;} +.x-grid3-body .x-grid3-td-expander .x-grid3-cell-inner{padding:0!important;height:100%;} +.x-grid3-row-expander{width:100%;height:18px;background-position:4px 2px;background-repeat:no-repeat;background-color:transparent;background-image:url(../images/default/grid/row-expand-sprite.gif);} +.x-grid3-row-collapsed .x-grid3-row-expander{background-position:4px 2px;} +.x-grid3-row-expanded .x-grid3-row-expander{background-position:-21px 2px;} +.x-grid3-row-collapsed .x-grid3-row-body{display:none!important;} +.x-grid3-row-expanded .x-grid3-row-body{display:block!important;} +.x-grid3-body .x-grid3-td-checker{background:transparent url(../images/default/grid/grid3-special-col-bg.gif) repeat-y right;} +.x-grid3-body .x-grid3-td-checker .x-grid3-cell-inner,.x-grid3-header .x-grid3-td-checker .x-grid3-hd-inner{padding:0!important;height:100%;} +.x-grid3-row-checker,.x-grid3-hd-checker{width:100%;height:18px;background-position:2px 2px;background-repeat:no-repeat;background-color:transparent;background-image:url(../images/default/grid/row-check-sprite.gif);} +.x-grid3-row .x-grid3-row-checker{background-position:2px 2px;} +.x-grid3-row-selected .x-grid3-row-checker,.x-grid3-hd-checker-on .x-grid3-hd-checker{background-position:-23px 2px;} +.x-grid3-hd-checker{background-position:2px 3px;} +.x-grid3-hd-checker-on .x-grid3-hd-checker{background-position:-23px 3px;} +.x-grid3-body .x-grid3-td-numberer{background:transparent url(../images/default/grid/grid3-special-col-bg.gif) repeat-y right;} +.x-grid3-body .x-grid3-td-numberer .x-grid3-cell-inner{padding:3px 5px 0 0!important;text-align:right;color:#444;} +.x-grid3-body .x-grid3-row-selected .x-grid3-td-numberer,.x-grid3-body .x-grid3-row-selected .x-grid3-td-checker,.x-grid3-body .x-grid3-row-selected .x-grid3-td-expander{background:transparent url(../images/default/grid/grid3-special-col-sel-bg.gif) repeat-y right;} +.x-grid3-body .x-grid3-check-col-td .x-grid3-cell-inner{padding:1px 0 0 0!important;} +.x-grid3-check-col{width:100%;height:16px;background-position:center center;background-repeat:no-repeat;background-color:transparent;background-image:url(../images/default/menu/unchecked.gif);} +.x-grid3-check-col-on{width:100%;height:16px;background-position:center center;background-repeat:no-repeat;background-color:transparent;background-image:url(../images/default/menu/checked.gif);} +.x-grid-group,.x-grid-group-body,.x-grid-group-hd{zoom:1;} +.x-grid-group-hd{border-bottom:2px solid #99bbe8;cursor:pointer;padding-top:6px;} +.x-grid-group-hd div{background:transparent url(../images/default/grid/group-expand-sprite.gif) no-repeat 3px -47px;padding:4px 4px 4px 17px;color:#3764a0;font:bold 11px tahoma,arial,helvetica,sans-serif;} +.x-grid-group-collapsed .x-grid-group-hd div{background-position:3px 3px;} +.x-grid-group-collapsed .x-grid-group-body{display:none;} +.x-group-by-icon{background-image:url(../images/default/grid/group-by.gif);} +.x-cols-icon{background-image:url(../images/default/grid/columns.gif);} +.x-show-groups-icon{background-image:url(../images/default/grid/group-by.gif);} +.ext-ie .x-grid3 .x-editor .x-form-text{position:relative;top:-1px;} +.ext-ie .x-props-grid .x-editor .x-form-text{position:static;top:0;} +.x-grid-empty{padding:10px;color:gray;font:normal 11px tahoma,arial,helvetica,sans-serif;} +.ext-ie7 .x-grid-panel .x-panel-bbar{position:relative;} + +.x-dd-drag-proxy{position:absolute;left:0;top:0;visibility:hidden;z-index:15000;} +.x-dd-drag-ghost{color:black;font:normal 11px arial,helvetica,sans-serif;-moz-opacity:0.85;opacity:.85;filter:alpha(opacity=85);border-top:1px solid #ddd;border-left:1px solid #ddd;border-right:1px solid #bbb;border-bottom:1px solid #bbb;padding:3px;padding-left:20px;background-color:white;white-space:nowrap;} +.x-dd-drag-repair .x-dd-drag-ghost{-moz-opacity:0.4;opacity:.4;filter:alpha(opacity=40);border:0 none;padding:0;background-color:transparent;} +.x-dd-drag-repair .x-dd-drop-icon{visibility:hidden;} +.x-dd-drop-icon{position:absolute;top:3px;left:3px;display:block;width:16px;height:16px;background-color:transparent;background-position:center;background-repeat:no-repeat;z-index:1;} +.x-dd-drop-nodrop .x-dd-drop-icon{background-image:url(../images/default/dd/drop-no.gif);} +.x-dd-drop-ok .x-dd-drop-icon{background-image:url(../images/default/dd/drop-yes.gif);} +.x-dd-drop-ok-add .x-dd-drop-icon{background-image:url(../images/default/dd/drop-add.gif);} +.x-view-selector{position:absolute;left:0;top:0;width:0;background:#c3daf9;border:1px dotted #39b;opacity:.5;-moz-opacity:.5;filter:alpha(opacity=50);zoom:1;} + +.x-tree .x-panel-body{background-color:#fff;} +.ext-strict .ext-ie .x-tree .x-panel-bwrap{position:relative;overflow:hidden;} +.x-tree-icon,.x-tree-ec-icon,.x-tree-elbow-line,.x-tree-elbow,.x-tree-elbow-end,.x-tree-elbow-plus,.x-tree-elbow-minus,.x-tree-elbow-end-plus,.x-tree-elbow-end-minus{border:0 none;height:18px;margin:0;padding:0;vertical-align:top;width:16px;background-repeat:no-repeat;} +.x-tree-node-collapsed .x-tree-node-icon,.x-tree-node-expanded .x-tree-node-icon,.x-tree-node-leaf .x-tree-node-icon{border:0 none;height:18px;margin:0;padding:0;vertical-align:top;width:16px;background-position:center;background-repeat:no-repeat;} +.ext-ie .x-tree-node-indent img,.ext-ie .x-tree-node-icon,.ext-ie .x-tree-ec-icon{vertical-align:middle!important;} +.x-tree-node-expanded .x-tree-node-icon{background-image:url(../images/default/tree/folder-open.gif);} +.x-tree-node-leaf .x-tree-node-icon{background-image:url(../images/default/tree/leaf.gif);} +.x-tree-node-collapsed .x-tree-node-icon{background-image:url(../images/default/tree/folder.gif);} +.ext-ie input.x-tree-node-cb{width:15px;height:15px;} +input.x-tree-node-cb{margin-left:1px;} +.ext-ie input.x-tree-node-cb{margin-left:0;} +.x-tree-noicon .x-tree-node-icon{width:0;height:0;} +.x-tree-node-loading .x-tree-node-icon{background-image:url(../images/default/tree/loading.gif)!important;} +.x-tree-node-loading a span{font-style:italic;color:#444;} +.ext-ie .x-tree-node-el input{width:15px;height:15px;} +.x-tree-lines .x-tree-elbow{background-image:url(../images/default/tree/elbow.gif);} +.x-tree-lines .x-tree-elbow-plus{background-image:url(../images/default/tree/elbow-plus.gif);} +.x-tree-lines .x-tree-elbow-minus{background-image:url(../images/default/tree/elbow-minus.gif);} +.x-tree-lines .x-tree-elbow-end{background-image:url(../images/default/tree/elbow-end.gif);} +.x-tree-lines .x-tree-elbow-end-plus{background-image:url(../images/default/tree/elbow-end-plus.gif);} +.x-tree-lines .x-tree-elbow-end-minus{background-image:url(../images/default/tree/elbow-end-minus.gif);} +.x-tree-lines .x-tree-elbow-line{background-image:url(../images/default/tree/elbow-line.gif);} +.x-tree-no-lines .x-tree-elbow{background:transparent;} +.x-tree-no-lines .x-tree-elbow-plus{background-image:url(../images/default/tree/elbow-plus-nl.gif);} +.x-tree-no-lines .x-tree-elbow-minus{background-image:url(../images/default/tree/elbow-minus-nl.gif);} +.x-tree-no-lines .x-tree-elbow-end{background:transparent;} +.x-tree-no-lines .x-tree-elbow-end-plus{background-image:url(../images/default/tree/elbow-end-plus-nl.gif);} +.x-tree-no-lines .x-tree-elbow-end-minus{background-image:url(../images/default/tree/elbow-end-minus-nl.gif);} +.x-tree-no-lines .x-tree-elbow-line{background:transparent;} +.x-tree-arrows .x-tree-elbow{background:transparent;} +.x-tree-arrows .x-tree-elbow-plus{background:transparent url(../images/default/tree/arrows.gif) no-repeat 0 0;} +.x-tree-arrows .x-tree-elbow-minus{background:transparent url(../images/default/tree/arrows.gif) no-repeat -16px 0;} +.x-tree-arrows .x-tree-elbow-end{background:transparent;} +.x-tree-arrows .x-tree-elbow-end-plus{background:transparent url(../images/default/tree/arrows.gif) no-repeat 0 0;} +.x-tree-arrows .x-tree-elbow-end-minus{background:transparent url(../images/default/tree/arrows.gif) no-repeat -16px 0;} +.x-tree-arrows .x-tree-elbow-line{background:transparent;} +.x-tree-arrows .x-tree-ec-over .x-tree-elbow-plus{background-position:-32px 0;} +.x-tree-arrows .x-tree-ec-over .x-tree-elbow-minus{background-position:-48px 0;} +.x-tree-arrows .x-tree-ec-over .x-tree-elbow-end-plus{background-position:-32px 0;} +.x-tree-arrows .x-tree-ec-over .x-tree-elbow-end-minus{background-position:-48px 0;} +.x-tree-elbow-plus,.x-tree-elbow-minus,.x-tree-elbow-end-plus,.x-tree-elbow-end-minus{cursor:pointer;} +.ext-ie ul.x-tree-node-ct{font-size:0;line-height:0;zoom:1;} +.x-tree-node{color:black;font:normal 11px arial,tahoma,helvetica,sans-serif;white-space:nowrap;} +.x-tree-node-el{line-height:18px;cursor:pointer;} +.x-tree-node a,.x-dd-drag-ghost a{text-decoration:none;color:black;-khtml-user-select:none;-moz-user-select:none;-kthml-user-focus:normal;-moz-user-focus:normal;-moz-outline:0 none;outline:0 none;} +.x-tree-node a span,.x-dd-drag-ghost a span{text-decoration:none;color:black;padding:1px 3px 1px 2px;} +.x-tree-node .x-tree-node-disabled a span{color:gray!important;} +.x-tree-node .x-tree-node-disabled .x-tree-node-icon{-moz-opacity:0.5;opacity:.5;filter:alpha(opacity=50);} +.x-tree-node .x-tree-node-inline-icon{background:transparent;} +.x-tree-node a:hover,.x-dd-drag-ghost a:hover{text-decoration:none;} +.x-tree-node div.x-tree-drag-insert-below{border-bottom:1px dotted #36c;} +.x-tree-node div.x-tree-drag-insert-above{border-top:1px dotted #36c;} +.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-below{border-bottom:0 none;} +.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-above{border-top:0 none;} +.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-below a{border-bottom:2px solid #36c;} +.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-above a{border-top:2px solid #36c;} +.x-tree-node .x-tree-drag-append a span{background:#ddd;border:1px dotted gray;} +.x-tree-node .x-tree-node-over{background-color:#eee;} +.x-tree-node .x-tree-selected{background-color:#d9e8fb;} +.x-dd-drag-ghost .x-tree-node-indent,.x-dd-drag-ghost .x-tree-ec-icon{display:none!important;} +.x-tree-drop-ok-append .x-dd-drop-icon{background-image:url(../images/default/tree/drop-add.gif);} +.x-tree-drop-ok-above .x-dd-drop-icon{background-image:url(../images/default/tree/drop-over.gif);} +.x-tree-drop-ok-below .x-dd-drop-icon{background-image:url(../images/default/tree/drop-under.gif);} +.x-tree-drop-ok-between .x-dd-drop-icon{background-image:url(../images/default/tree/drop-between.gif);} +.x-tree-root-ct{zoom:1;} + +.x-date-picker{border:1px solid #1b376c;border-top:0 none;background:#fff;position:relative;} +.x-date-picker a{-moz-outline:0 none;outline:0 none;} +.x-date-inner,.x-date-inner td,.x-date-inner th{border-collapse:separate;} +.x-date-middle,.x-date-left,.x-date-right{background:url(../images/default/shared/hd-sprite.gif) repeat-x 0 -83px;color:#FFF;font:bold 11px "sans serif",tahoma,verdana,helvetica;overflow:hidden;} +.x-date-middle .x-btn-left,.x-date-middle .x-btn-center,.x-date-middle .x-btn-right{background:transparent!important;vertical-align:middle;} +.x-date-middle .x-btn .x-btn-text{color:#fff;} +.x-date-middle .x-btn-with-menu .x-btn-center em{background:transparent url(../images/default/toolbar/btn-arrow-light.gif) no-repeat right 0;} +.x-date-right,.x-date-left{width:18px;} +.x-date-right{text-align:right;} +.x-date-middle{padding-top:2px;padding-bottom:2px;width:130px;} +.x-date-right a,.x-date-left a{display:block;width:16px;height:16px;background-position:center;background-repeat:no-repeat;cursor:pointer;-moz-opacity:0.6;opacity:.6;filter:alpha(opacity=60);} +.x-date-right a:hover,.x-date-left a:hover{-moz-opacity:1;opacity:1;filter:alpha(opacity=100);} +.x-date-right a{background-image:url(../images/default/shared/right-btn.gif);margin-right:2px;text-decoration:none!important;} +.x-date-left a{background-image:url(../images/default/shared/left-btn.gif);margin-left:2px;text-decoration:none!important;} +table.x-date-inner{width:100%;table-layout:fixed;} +.x-date-inner th{width:25px;} +.x-date-inner th{background:#dfecfb url(../images/default/shared/glass-bg.gif) repeat-x left top;text-align:right!important;border-bottom:1px solid #a3bad9;font:normal 10px arial,helvetica,tahoma,sans-serif;color:#233d6d;cursor:default;padding:0;border-collapse:separate;} +.x-date-inner th span{display:block;padding:2px;padding-right:7px;} +.x-date-inner td{border:1px solid #fff;text-align:right;padding:0;} +.x-date-inner a{padding:2px 5px;display:block;font:normal 11px arial,helvetica,tahoma,sans-serif;text-decoration:none;color:black;text-align:right;zoom:1;} +.x-date-inner .x-date-active{cursor:pointer;color:black;} +.x-date-inner .x-date-selected a{background:#dfecfb url(../images/default/shared/glass-bg.gif) repeat-x left top;border:1px solid #8db2e3;padding:1px 4px;} +.x-date-inner .x-date-today a{border:1px solid darkred;padding:1px 4px;} +.x-date-inner .x-date-selected span{font-weight:bold;} +.x-date-inner .x-date-prevday a,.x-date-inner .x-date-nextday a{color:#aaa;text-decoration:none!important;} +.x-date-bottom{padding:4px;border-top:1px solid #a3bad9;background:#dfecfb url(../images/default/shared/glass-bg.gif) repeat-x left top;} +.x-date-inner a:hover,.x-date-inner .x-date-disabled a:hover{text-decoration:none!important;color:black;background:#ddecfe;} +.x-date-inner .x-date-disabled a{cursor:default;background:#eee;color:#bbb;} +.x-date-mmenu{background:#eee!important;} +.x-date-mmenu .x-menu-item{font-size:10px;padding:1px 24px 1px 4px;white-space:nowrap;color:#000;} +.x-date-mmenu .x-menu-item .x-menu-item-icon{width:10px;height:10px;margin-right:5px;background-position:center -4px!important;} +.x-date-mp{position:absolute;left:0;top:0;background:white;display:none;} +.x-date-mp td{padding:2px;font:normal 11px arial,helvetica,tahoma,sans-serif;} +td.x-date-mp-month,td.x-date-mp-year,td.x-date-mp-ybtn{border:0 none;text-align:center;vertical-align:middle;width:25%;} +.x-date-mp-ok{margin-right:3px;} +.x-date-mp-btns button{text-decoration:none;text-align:center;text-decoration:none!important;background:#083772;color:white;border:1px solid;border-color:#36c #005 #005 #36c;padding:1px 3px 1px;font:normal 11px arial,helvetica,tahoma,sans-serif;cursor:pointer;} +.x-date-mp-btns{background:#dfecfb url(../images/default/shared/glass-bg.gif) repeat-x left top;} +.x-date-mp-btns td{border-top:1px solid #c5d2df;text-align:center;} +td.x-date-mp-month a,td.x-date-mp-year a{display:block;padding:2px 4px;text-decoration:none;text-align:center;color:#15428b;} +td.x-date-mp-month a:hover,td.x-date-mp-year a:hover{color:#15428b;text-decoration:none;cursor:pointer;background:#ddecfe;} +td.x-date-mp-sel a{padding:1px 3px;background:#dfecfb url(../images/default/shared/glass-bg.gif) repeat-x left top;border:1px solid #8db2e3;} +.x-date-mp-ybtn a{overflow:hidden;width:15px;height:15px;cursor:pointer;background:transparent url(../images/default/panel/tool-sprites.gif) no-repeat;display:block;margin:0 auto;} +.x-date-mp-ybtn a.x-date-mp-next{background-position:0 -120px;} +.x-date-mp-ybtn a.x-date-mp-next:hover{background-position:-15px -120px;} +.x-date-mp-ybtn a.x-date-mp-prev{background-position:0 -105px;} +.x-date-mp-ybtn a.x-date-mp-prev:hover{background-position:-15px -105px;} +.x-date-mp-ybtn{text-align:center;} +td.x-date-mp-sep{border-right:1px solid #c5d2df;} + +.x-tip{position:absolute;top:0;left:0;visibility:hidden;z-index:20000;border:0 none;} +.x-tip .x-tip-close{background-image:url(../images/default/qtip/close.gif);height:15px;float:right;width:15px;margin:0 0 2px 2px;cursor:pointer;display:none;} +.x-tip .x-tip-tc{background:transparent url(../images/default/qtip/tip-sprite.gif) no-repeat 0 -62px;padding-top:3px;overflow:hidden;zoom:1;} +.x-tip .x-tip-tl{background:transparent url(../images/default/qtip/tip-sprite.gif) no-repeat 0 0;padding-left:6px;overflow:hidden;zoom:1;} +.x-tip .x-tip-tr{background:transparent url(../images/default/qtip/tip-sprite.gif) no-repeat right 0;padding-right:6px;overflow:hidden;zoom:1;} +.x-tip .x-tip-bc{background:transparent url(../images/default/qtip/tip-sprite.gif) no-repeat 0 -121px;height:3px;overflow:hidden;} +.x-tip .x-tip-bl{background:transparent url(../images/default/qtip/tip-sprite.gif) no-repeat 0 -59px;padding-left:6px;zoom:1;} +.x-tip .x-tip-br{background:transparent url(../images/default/qtip/tip-sprite.gif) no-repeat right -59px;padding-right:6px;zoom:1;} +.x-tip .x-tip-mc{border:0 none;font:normal 11px tahoma,arial,helvetica,sans-serif;} +.x-tip .x-tip-ml{background:#fff url(../images/default/qtip/tip-sprite.gif) no-repeat 0 -124px;padding-left:6px;zoom:1;} +.x-tip .x-tip-mr{background:transparent url(../images/default/qtip/tip-sprite.gif) no-repeat right -124px;padding-right:6px;zoom:1;} +.ext-ie .x-tip .x-tip-header,.ext-ie .x-tip .x-tip-tc{font-size:0;line-height:0;} +.x-tip .x-tip-header-text{font:bold 11px tahoma,arial,helvetica,sans-serif;padding:0;margin:0 0 2px 0;color:#444;} +.x-tip .x-tip-body{font:normal 11px tahoma,arial,helvetica,sans-serif;margin:0!important;line-height:14px;color:#444;padding:0;} +.x-tip .x-tip-body .loading-indicator{margin:0;} +.x-tip-draggable .x-tip-header,.x-tip-draggable .x-tip-header-text{cursor:move;} +.x-form-invalid-tip .x-tip-tc{background:url(../images/default/form/error-tip-corners.gif) repeat-x 0 -12px;padding-top:6px;} +.x-form-invalid-tip .x-tip-tl{background-image:url(../images/default/form/error-tip-corners.gif);} +.x-form-invalid-tip .x-tip-tr{background-image:url(../images/default/form/error-tip-corners.gif);} +.x-form-invalid-tip .x-tip-bc{background:url(../images/default/form/error-tip-corners.gif) repeat-x 0 -18px;height:6px;} +.x-form-invalid-tip .x-tip-bl{background:url(../images/default/form/error-tip-corners.gif) no-repeat 0 -6px;} +.x-form-invalid-tip .x-tip-br{background:url(../images/default/form/error-tip-corners.gif) no-repeat right -6px;} +.x-form-invalid-tip .x-tip-ml{background-image:url(../images/default/form/error-tip-corners.gif);} +.x-form-invalid-tip .x-tip-mr{background-image:url(../images/default/form/error-tip-corners.gif);} +.x-form-invalid-tip .x-tip-body{padding:2px;} +.x-form-invalid-tip .x-tip-body{padding-left:24px;background:transparent url(../images/default/form/exclamation.gif) no-repeat 2px 2px;} + +.x-menu{border:1px solid #718bb7;z-index:15000;zoom:1;background:#f0f0f0 url(../images/default/menu/menu.gif) repeat-y;padding:2px;} +.x-menu a{text-decoration:none!important;} +.ext-ie .x-menu{zoom:1;overflow:hidden;} +.x-menu-list{background:transparent;border:0 none;} +.x-menu li{line-height:100%;} +.x-menu li.x-menu-sep-li{font-size:1px;line-height:1px;} +.x-menu-list-item{font:normal 11px tahoma,arial,sans-serif;white-space:nowrap;-moz-user-select:none;-khtml-user-select:none;display:block;padding:1px;} +.x-menu-item-arrow{background:transparent url(../images/default/menu/menu-parent.gif) no-repeat right;} +.x-menu-sep{display:block;font-size:1px;line-height:1px;margin:2px 3px;background-color:#e0e0e0;border-bottom:1px solid #fff;overflow:hidden;} +.x-menu-focus{position:absolute;left:-1px;top:-1px;width:1px;height:1px;line-height:1px;font-size:1px;-moz-outline:0 none;outline:0 none;-moz-user-select:text;-khtml-user-select:text;overflow:hidden;display:block;} +.x-menu a.x-menu-item{display:block;line-height:16px;padding:3px 21px 3px 3px;white-space:nowrap;text-decoration:none;color:#222;-moz-outline:0 none;outline:0 none;cursor:pointer;} +.x-menu-item-active{background:#ebf3fd url(../images/default/menu/item-over.gif) repeat-x left bottom;border:1px solid #aaccf6;padding:0;} +.x-menu-item-active a.x-menu-item{color:#233d6d;} +.x-menu-item-icon{border:0 none;height:16px;padding:0;vertical-align:top;width:16px;margin:0 8px 0 0;background-position:center;} +.x-menu-check-item .x-menu-item-icon{background:transparent url(../images/default/menu/unchecked.gif) no-repeat center;} +.x-menu-item-checked .x-menu-item-icon{background-image:url(../images/default/menu/checked.gif);} +.x-menu-group-item .x-menu-item-icon{background:transparent;} +.x-menu-item-checked .x-menu-group-item .x-menu-item-icon{background:transparent url(../images/default/menu/group-checked.gif) no-repeat center;} +.x-menu-plain{background:#fff!important;} +.x-menu-date-item{padding:0;} +.x-menu .x-color-palette,.x-menu .x-date-picker{margin-left:26px;margin-right:4px;} +.x-menu .x-date-picker{border:1px solid #a3bad9;margin-top:2px;margin-bottom:2px;} +.x-menu-plain .x-color-palette,.x-menu-plain .x-date-picker{margin:0;border:0 none;} +.x-date-menu{padding:0!important;} +.x-cycle-menu .x-menu-item-checked{border:1px dotted #a3bae9!important;background:#DFE8F6;padding:0;} + + .x-box-tl{background:transparent url(../images/default/box/corners.gif) no-repeat 0 0;zoom:1;} +.x-box-tc{height:8px;background:transparent url(../images/default/box/tb.gif) repeat-x 0 0;overflow:hidden;} +.x-box-tr{background:transparent url(../images/default/box/corners.gif) no-repeat right -8px;} +.x-box-ml{background:transparent url(../images/default/box/l.gif) repeat-y 0;padding-left:4px;overflow:hidden;zoom:1;} +.x-box-mc{background:#eee url(../images/default/box/tb.gif) repeat-x 0 -16px;padding:4px 10px;font-family:"Myriad Pro","Myriad Web","Tahoma","Helvetica","Arial",sans-serif;color:#393939;font-size:12px;} +.x-box-mc h3{font-size:14px;font-weight:bold;margin:0 0 4px 0;zoom:1;} +.x-box-mr{background:transparent url(../images/default/box/r.gif) repeat-y right;padding-right:4px;overflow:hidden;} +.x-box-bl{background:transparent url(../images/default/box/corners.gif) no-repeat 0 -16px;zoom:1;} +.x-box-bc{background:transparent url(../images/default/box/tb.gif) repeat-x 0 -8px;height:8px;overflow:hidden;} +.x-box-br{background:transparent url(../images/default/box/corners.gif) no-repeat right -24px;} +.x-box-tl,.x-box-bl{padding-left:8px;overflow:hidden;} +.x-box-tr,.x-box-br{padding-right:8px;overflow:hidden;} +.x-box-blue .x-box-bl,.x-box-blue .x-box-br,.x-box-blue .x-box-tl,.x-box-blue .x-box-tr{background-image:url(../images/default/box/corners-blue.gif);} +.x-box-blue .x-box-bc,.x-box-blue .x-box-mc,.x-box-blue .x-box-tc{background-image:url(../images/default/box/tb-blue.gif);} +.x-box-blue .x-box-mc{background-color:#c3daf9;} +.x-box-blue .x-box-mc h3{color:#17385b;} +.x-box-blue .x-box-ml{background-image:url(../images/default/box/l-blue.gif);} +.x-box-blue .x-box-mr{background-image:url(../images/default/box/r-blue.gif);} + +#x-debug-browser .x-tree .x-tree-node a span{color:#222297;font-size:11px;padding-top:2px;font-family:"monotype","courier new",sans-serif;line-height:18px;} +#x-debug-browser .x-tree a i{color:#FF4545;font-style:normal;} +#x-debug-browser .x-tree a em{color:#999;} +#x-debug-browser .x-tree .x-tree-node .x-tree-selected a span{background:#c3daf9;} +#x-debug-browser .x-tool-toggle{background-position:0 -75px;} +#x-debug-browser .x-tool-toggle-over{background-position:-15px -75px;} +#x-debug-browser.x-panel-collapsed .x-tool-toggle{background-position:0 -60px;} +#x-debug-browser.x-panel-collapsed .x-tool-toggle-over{background-position:-15px -60px;} + +.x-combo-list{border:1px solid #98c0f4;background:#ddecfe;zoom:1;overflow:hidden;} +.x-combo-list-inner{overflow:auto;background:white;position:relative;zoom:1;overflow-x:hidden;} +.x-combo-list-hd{font:bold 11px tahoma,arial,helvetica,sans-serif;color:#15428b;background-image:url(../images/default/layout/panel-title-light-bg.gif);border-bottom:1px solid #98c0f4;padding:3px;} +.x-resizable-pinned .x-combo-list-inner{border-bottom:1px solid #98c0f4;} +.x-combo-list-item{font:normal 12px tahoma,arial,helvetica,sans-serif;padding:2px;border:1px solid #fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;} +.x-combo-list .x-combo-selected{border:1px dotted #a3bae9!important;background:#DFE8F6;cursor:pointer;} +.x-combo-noedit{cursor:pointer;} +.x-combo-list .x-toolbar{border-top:1px solid #98c0f4;border-bottom:0 none;} +.x-combo-list-small .x-combo-list-item{font:normal 11px tahoma,arial,helvetica,sans-serif;} + +.x-panel{border-style:solid;border-color:#99bbe8;border-width:0;} +.x-panel-header{overflow:hidden;zoom:1;color:#15428b;font:bold 11px tahoma,arial,verdana,sans-serif;padding:5px 3px 4px 5px;border:1px solid #99bbe8;line-height:15px;background:transparent url(../images/default/panel/white-top-bottom.gif) repeat-x 0 -1px;} +.x-panel-body{border:1px solid #99bbe8;border-top:0 none;overflow:hidden;background:white;position:relative;} +.x-panel-bbar .x-toolbar{border:1px solid #99bbe8;border-top:0 none;overflow:hidden;padding:2px;} +.x-panel-tbar .x-toolbar{border:1px solid #99bbe8;border-top:0 none;overflow:hidden;padding:2px;} +.x-panel-tbar-noheader .x-toolbar,.x-panel-mc .x-panel-tbar .x-toolbar{border-top:1px solid #99bbe8;border-bottom:0 none;} +.x-panel-body-noheader,.x-panel-mc .x-panel-body{border-top:1px solid #99bbe8;} +.x-panel-header{overflow:hidden;zoom:1;} +.x-panel-tl .x-panel-header{color:#15428b;font:bold 11px tahoma,arial,verdana,sans-serif;padding:5px 0 4px 0;border:0 none;background:transparent;} +.x-panel-tl .x-panel-icon,.x-window-tl .x-panel-icon{padding-left:20px!important;background-repeat:no-repeat;background-position:0 4px;zoom:1;} +.x-panel-inline-icon{width:16px;height:16px;background-repeat:no-repeat;background-position:0 0;vertical-align:middle;margin-right:4px;margin-top:-1px;margin-bottom:-1px;} +.x-panel-tc{background:transparent url(../images/default/panel/top-bottom.gif) repeat-x 0 0;overflow:hidden;} +.ext-strict .ext-ie7 .x-panel-tc{overflow:visible;} +.x-panel-tl{background:transparent url(../images/default/panel/corners-sprite.gif) no-repeat 0 0;padding-left:6px;zoom:1;border-bottom:1px solid #99bbe8;} +.x-panel-tr{background:transparent url(../images/default/panel/corners-sprite.gif) no-repeat right 0;zoom:1;padding-right:6px;} +.x-panel-bc{background:transparent url(../images/default/panel/top-bottom.gif) repeat-x 0 bottom;zoom:1;} +.x-panel-bc .x-panel-footer{zoom:1;} +.x-panel-bl{background:transparent url(../images/default/panel/corners-sprite.gif) no-repeat 0 bottom;padding-left:6px;zoom:1;} +.x-panel-br{background:transparent url(../images/default/panel/corners-sprite.gif) no-repeat right bottom;padding-right:6px;zoom:1;} +.x-panel-mc{border:0 none;padding:0;margin:0;font:normal 11px tahoma,arial,helvetica,sans-serif;padding-top:6px;background:#dfe8f6;} +.x-panel-mc .x-panel-body{background:transparent;border:0 none;} +.x-panel-ml{background:#fff url(../images/default/panel/left-right.gif) repeat-y 0 0;padding-left:6px;zoom:1;} +.x-panel-mr{background:transparent url(../images/default/panel/left-right.gif) repeat-y right 0;padding-right:6px;zoom:1;} +.x-panel-bc .x-panel-footer{padding-bottom:6px;} +.x-panel-nofooter .x-panel-bc,.x-panel-nofooter .x-window-bc{height:6px;font-size:0;line-height:0;} +.x-panel-bwrap{overflow:hidden;zoom:1;left:0;top:0;} +.x-panel-body{overflow:hidden;zoom:1;} +.x-panel-collapsed .x-resizable-handle{display:none;} +.ext-gecko .x-panel-animated div{overflow:hidden!important;} +.x-plain-body{overflow:hidden;} +.x-plain-bbar .x-toolbar{overflow:hidden;padding:2px;} +.x-plain-tbar .x-toolbar{overflow:hidden;padding:2px;} +.x-plain-bwrap{overflow:hidden;zoom:1;} +.x-plain{overflow:hidden;} +.x-tool{overflow:hidden;width:15px;height:15px;float:right;cursor:pointer;background:transparent url(../images/default/panel/tool-sprites.gif) no-repeat;margin-left:2px;} +.x-tool-toggle{background-position:0 -60px;} +.x-tool-toggle-over{background-position:-15px -60px;} +.x-panel-collapsed .x-tool-toggle{background-position:0 -75px;} +.x-panel-collapsed .x-tool-toggle-over{background-position:-15px -75px;} +.x-tool-close{background-position:0 -0;} +.x-tool-close-over{background-position:-15px 0;} +.x-tool-minimize{background-position:0 -15px;} +.x-tool-minimize-over{background-position:-15px -15px;} +.x-tool-maximize{background-position:0 -30px;} +.x-tool-maximize-over{background-position:-15px -30px;} +.x-tool-restore{background-position:0 -45px;} +.x-tool-restore-over{background-position:-15px -45px;} +.x-tool-gear{background-position:0 -90px;} +.x-tool-gear-over{background-position:-15px -90px;} +.x-tool-pin{background-position:0 -135px;} +.x-tool-pin-over{background-position:-15px -135px;} +.x-tool-unpin{background-position:0 -150px;} +.x-tool-unpin-over{background-position:-15px -150px;} +.x-tool-right{background-position:0 -165px;} +.x-tool-right-over{background-position:-15px -165px;} +.x-tool-left{background-position:0 -180px;} +.x-tool-left-over{background-position:-15px -180px;} +.x-tool-up{background-position:0 -210px;} +.x-tool-up-over{background-position:-15px -210px;} +.x-tool-down{background-position:0 -195px;} +.x-tool-down-over{background-position:-15px -195px;} +.x-tool-refresh{background-position:0 -225px;} +.x-tool-refresh-over{background-position:-15px -225px;} +.x-tool-minus{background-position:0 -255px;} +.x-tool-minus-over{background-position:-15px -255px;} +.x-tool-plus{background-position:0 -240px;} +.x-tool-plus-over{background-position:-15px -240px;} +.x-tool-search{background-position:0 -270px;} +.x-tool-search-over{background-position:-15px -270px;} +.x-tool-save{background-position:0 -285px;} +.x-tool-save-over{background-position:-15px -285px;} +.x-tool-help{background-position:0 -300px;} +.x-tool-help-over{background-position:-15px -300px;} +.x-tool-print{background-position:0 -315px;} +.x-tool-print-over{background-position:-15px -315px;} +.x-panel-ghost{background:#cbddf3;z-index:12000;overflow:hidden;position:absolute;left:0;top:0;opacity:.65;-moz-opacity:.65;filter:alpha(opacity=65);} +.x-panel-ghost ul{margin:0;padding:0;overflow:hidden;font-size:0;line-height:0;border:1px solid #99bbe8;border-top:0 none;display:block;} +.x-panel-ghost *{cursor:move!important;} +.x-panel-dd-spacer{border:2px dashed #99bbe8;} +.x-panel-btns-ct{padding:5px;} +.x-panel-btns-ct .x-btn{float:right;clear:none;} +.x-panel-btns-ct .x-panel-btns td{border:0;padding:0;} +.x-panel-btns-ct .x-panel-btns-right table{float:right;clear:none;} +.x-panel-btns-ct .x-panel-btns-left table{float:left;clear:none;} +.x-panel-btns-ct .x-panel-btns-center{text-align:center;} +.x-panel-btns-ct .x-panel-btns-center table{margin:0 auto;} +.x-panel-btns-ct table td.x-panel-btn-td{padding:3px;} +.x-panel-btns-ct .x-btn-focus .x-btn-left{background-position:0 -147px;} +.x-panel-btns-ct .x-btn-focus .x-btn-right{background-position:0 -168px;} +.x-panel-btns-ct .x-btn-focus .x-btn-center{background-position:0 -189px;} +.x-panel-btns-ct .x-btn-over .x-btn-left{background-position:0 -63px;} +.x-panel-btns-ct .x-btn-over .x-btn-right{background-position:0 -84px;} +.x-panel-btns-ct .x-btn-over .x-btn-center{background-position:0 -105px;} +.x-panel-btns-ct .x-btn-click .x-btn-center{background-position:0 -126px;} +.x-panel-btns-ct .x-btn-click .x-btn-right{background-position:0 -84px;} +.x-panel-btns-ct .x-btn-click .x-btn-left{background-position:0 -63px;} + +.x-window{zoom:1;} +.x-window .x-resizable-handle{opacity:0;-moz-opacity:0;filter:alpha(opacity=0);} +.x-window-proxy{background:#C7DFFC;border:1px solid #99bbe8;z-index:12000;overflow:hidden;position:absolute;left:0;top:0;display:none;opacity:.5;-moz-opacity:.5;filter:alpha(opacity=50);} +.x-window-header{overflow:hidden;zoom:1;} +.x-window-bwrap{z-index:1;position:relative;zoom:1;left:0;top:0;} +.x-window-tl .x-window-header{color:#15428b;font:bold 11px tahoma,arial,verdana,sans-serif;padding:5px 0 4px 0;} +.x-window-header-text{cursor:pointer;} +.x-window-tc{background:transparent url(../images/default/window/top-bottom.png) repeat-x 0 0;overflow:hidden;zoom:1;} +.x-window-tl{background:transparent url(../images/default/window/left-corners.png) no-repeat 0 0;padding-left:6px;zoom:1;z-index:1;position:relative;} +.x-window-tr{background:transparent url(../images/default/window/right-corners.png) no-repeat right 0;padding-right:6px;} +.x-window-bc{background:transparent url(../images/default/window/top-bottom.png) repeat-x 0 bottom;zoom:1;} +.x-window-bc .x-window-footer{padding-bottom:6px;zoom:1;font-size:0;line-height:0;} +.x-window-bl{background:transparent url(../images/default/window/left-corners.png) no-repeat 0 bottom;padding-left:6px;zoom:1;} +.x-window-br{background:transparent url(../images/default/window/right-corners.png) no-repeat right bottom;padding-right:6px;zoom:1;} +.x-window-mc{border:1px solid #99bbe8;padding:0;margin:0;font:normal 11px tahoma,arial,helvetica,sans-serif;background:#dfe8f6;} +.x-window-ml{background:transparent url(../images/default/window/left-right.png) repeat-y 0 0;padding-left:6px;zoom:1;} +.x-window-mr{background:transparent url(../images/default/window/left-right.png) repeat-y right 0;padding-right:6px;zoom:1;} +.x-window-body{overflow:hidden;} +.x-window-bwrap{overflow:hidden;} +.x-window-maximized .x-window-bl,.x-window-maximized .x-window-br,.x-window-maximized .x-window-ml,.x-window-maximized .x-window-mr,.x-window-maximized .x-window-tl,.x-window-maximized .x-window-tr{padding:0;} +.x-window-maximized .x-window-footer{padding-bottom:0;} +.x-window-maximized .x-window-tc{padding-left:3px;padding-right:3px;background-color:white;} +.x-window-maximized .x-window-mc{border-left:0 none;border-right:0 none;} +.x-window-tbar .x-toolbar,.x-window-bbar .x-toolbar{border-left:0 none;border-right:0 none;} +.x-window-bbar .x-toolbar{border-top:1px solid #99bbe8;border-bottom:0 none;} +.x-window-draggable,.x-window-draggable .x-window-header-text{cursor:move;} +.x-window-maximized .x-window-draggable,.x-window-maximized .x-window-draggable .x-window-header-text{cursor:default;} +.x-window-body{background:transparent;} +.x-panel-ghost .x-window-tl{border-bottom:1px solid #99bbe8;} +.x-panel-collapsed .x-window-tl{border-bottom:1px solid #84a0c4;} +.x-window-maximized-ct{overflow:hidden;} +.x-window-maximized .x-resizable-handle{display:none;} +.x-window-sizing-ghost ul{border:0 none!important;} +.x-dlg-focus{-moz-outline:0 none;outline:0 none;width:0;height:0;overflow:hidden;position:absolute;top:0;left:0;} +.x-dlg-mask{z-index:10000;display:none;position:absolute;top:0;left:0;-moz-opacity:0.5;opacity:.50;filter:alpha(opacity=50);background-color:#CCC;} +body.ext-ie6.x-body-masked select{visibility:hidden;} +body.ext-ie6.x-body-masked .x-window select{visibility:visible;} +.x-window-plain .x-window-mc{background:#CAD9EC;border-right:1px solid #DFE8F6;border-bottom:1px solid #DFE8F6;border-top:1px solid #a3bae9;border-left:1px solid #a3bae9;} +.x-window-plain .x-window-body{border-left:1px solid #DFE8F6;border-top:1px solid #DFE8F6;border-bottom:1px solid #a3bae9;border-right:1px solid #a3bae9;background:transparent!important;} +body.x-body-masked .x-window-plain .x-window-mc{background:#C7D6E9;} + +.x-html-editor-wrap{border:1px solid #a9bfd3;background:white;} +.x-html-editor-tb .x-btn-text{background:transparent url(../images/default/editor/tb-sprite.gif) no-repeat;} +.x-html-editor-tb .x-edit-bold .x-btn-text{background-position:0 0;} +.x-html-editor-tb .x-edit-italic .x-btn-text{background-position:-16px 0;} +.x-html-editor-tb .x-edit-underline .x-btn-text{background-position:-32px 0;} +.x-html-editor-tb .x-edit-forecolor .x-btn-text{background-position:-160px 0;} +.x-html-editor-tb .x-edit-backcolor .x-btn-text{background-position:-176px 0;} +.x-html-editor-tb .x-edit-justifyleft .x-btn-text{background-position:-112px 0;} +.x-html-editor-tb .x-edit-justifycenter .x-btn-text{background-position:-128px 0;} +.x-html-editor-tb .x-edit-justifyright .x-btn-text{background-position:-144px 0;} +.x-html-editor-tb .x-edit-insertorderedlist .x-btn-text{background-position:-80px 0;} +.x-html-editor-tb .x-edit-insertunorderedlist .x-btn-text{background-position:-96px 0;} +.x-html-editor-tb .x-edit-increasefontsize .x-btn-text{background-position:-48px 0;} +.x-html-editor-tb .x-edit-decreasefontsize .x-btn-text{background-position:-64px 0;} +.x-html-editor-tb .x-edit-sourceedit .x-btn-text{background-position:-192px 0;} +.x-html-editor-tb .x-edit-createlink .x-btn-text{background-position:-208px 0;} +.x-html-editor-tip .x-tip-bd .x-tip-bd-inner{padding:5px;padding-bottom:1px;} +.x-html-editor-tb .x-toolbar{position:static!important;} + +.x-panel-noborder .x-panel-body-noborder{border-width:0;} +.x-panel-noborder .x-panel-header-noborder{border-width:0;border-bottom:1px solid #99bbe8;} +.x-panel-noborder .x-panel-tbar-noborder .x-toolbar{border-width:0;border-bottom:1px solid #99bbe8;} +.x-panel-noborder .x-panel-bbar-noborder .x-toolbar{border-width:0;border-top:1px solid #99bbe8;} +.x-window-noborder .x-window-mc{border-width:0;} +.x-window-plain .x-window-body-noborder{border-width:0;} +.x-tab-panel-noborder .x-tab-panel-body-noborder{border-width:0;} +.x-tab-panel-noborder .x-tab-panel-header-noborder{border-top-width:0;border-left-width:0;border-right-width:0;} +.x-tab-panel-noborder .x-tab-panel-footer-noborder{border-bottom-width:0;border-left-width:0;border-right-width:0;} +.x-tab-panel-bbar-noborder .x-toolbar{border-width:0;border-top:1px solid #99bbe8;} +.x-tab-panel-tbar-noborder .x-toolbar{border-width:0;border-bottom:1px solid #99bbe8;} + +.x-border-layout-ct{background:#dfe8f6;} +.x-border-panel{position:absolute;left:0;top:0;} +.x-tool-collapse-south{background-position:0 -195px;} +.x-tool-collapse-south-over{background-position:-15px -195px;} +.x-tool-collapse-north{background-position:0 -210px;} +.x-tool-collapse-north-over{background-position:-15px -210px;} +.x-tool-collapse-west{background-position:0 -180px;} +.x-tool-collapse-west-over{background-position:-15px -180px;} +.x-tool-collapse-east{background-position:0 -165px;} +.x-tool-collapse-east-over{background-position:-15px -165px;} +.x-tool-expand-south{background-position:0 -210px;} +.x-tool-expand-south-over{background-position:-15px -210px;} +.x-tool-expand-north{background-position:0 -195px;} +.x-tool-expand-north-over{background-position:-15px -195px;} +.x-tool-expand-west{background-position:0 -165px;} +.x-tool-expand-west-over{background-position:-15px -165px;} +.x-tool-expand-east{background-position:0 -180px;} +.x-tool-expand-east-over{background-position:-15px -180px;} +.x-tool-expand-north,.x-tool-expand-south{float:right;margin:3px;} +.x-tool-expand-east,.x-tool-expand-west{float:none;margin:3px auto;} +.x-accordion-hd .x-tool-toggle{background-position:0 -255px;} +.x-accordion-hd .x-tool-toggle-over{background-position:-15px -255px;} +.x-panel-collapsed .x-accordion-hd .x-tool-toggle{background-position:0 -240px;} +.x-panel-collapsed .x-accordion-hd .x-tool-toggle-over{background-position:-15px -240px;} +.x-accordion-hd{color:#222;padding-top:4px;padding-bottom:3px;border-top:0 none;font-weight:normal;background:transparent url(../images/default/panel/light-hd.gif) repeat-x 0 -9px;} +.x-layout-collapsed{position:absolute;left:-10000px;top:-10000px;visibility:hidden;background-color:#d2e0f2;width:20px;height:20px;overflow:hidden;border:1px solid #98c0f4;z-index:20;} +.ext-border-box .x-layout-collapsed{width:22px;height:22px;} +.x-layout-collapsed-over{cursor:pointer;background-color:#d9e8fb;} +.x-layout-collapsed-west .x-layout-collapsed-tools,.x-layout-collapsed-east .x-layout-collapsed-tools{position:absolute;top:0;left:0;width:20px;height:20px;} +.x-layout-split{position:absolute;height:5px;width:5px;line-height:1px;font-size:1px;z-index:3;background-color:transparent;} +.ext-strict .ext-ie6 .x-layout-split{background-color:#fff!important;filter:alpha(opacity=1);} +.x-layout-split-h{background-image:url(../images/default/s.gif);background-position:left;} +.x-layout-split-v{background-image:url(../images/default/s.gif);background-position:top;} +.x-column-layout-ct{overflow:hidden;zoom:1;} +.x-column{float:left;padding:0;margin:0;overflow:hidden;zoom:1;} +.x-layout-mini{position:absolute;top:0;left:0;display:block;width:5px;height:35px;cursor:pointer;opacity:.5;-moz-opacity:.5;filter:alpha(opacity=50);} +.x-layout-mini-over,.x-layout-collapsed-over .x-layout-mini{opacity:1;-moz-opacity:1;filter:none;} +.x-layout-split-west .x-layout-mini{top:48%;background-image:url(../images/default/layout/mini-left.gif);} +.x-layout-split-east .x-layout-mini{top:48%;background-image:url(../images/default/layout/mini-right.gif);} +.x-layout-split-north .x-layout-mini{left:48%;height:5px;width:35px;background-image:url(../images/default/layout/mini-top.gif);} +.x-layout-split-south .x-layout-mini{left:48%;height:5px;width:35px;background-image:url(../images/default/layout/mini-bottom.gif);} +.x-layout-cmini-west .x-layout-mini{top:48%;background-image:url(../images/default/layout/mini-right.gif);} +.x-layout-cmini-east .x-layout-mini{top:48%;background-image:url(../images/default/layout/mini-left.gif);} +.x-layout-cmini-north .x-layout-mini{left:48%;height:5px;width:35px;background-image:url(../images/default/layout/mini-bottom.gif);} +.x-layout-cmini-south .x-layout-mini{left:48%;height:5px;width:35px;background-image:url(../images/default/layout/mini-top.gif);} +.x-layout-cmini-west,.x-layout-cmini-east{border:0 none;width:5px!important;padding:0;background:transparent;} +.x-layout-cmini-north,.x-layout-cmini-south{border:0 none;height:5px!important;padding:0;background:transparent;} +.x-viewport,.x-viewport body{margin:0;padding:0;border:0 none;overflow:hidden;height:100%;} +.x-abs-layout-item{position:absolute;left:0;top:0;} +.ext-ie input.x-abs-layout-item,.ext-ie textarea.x-abs-layout-item{margin:0;} + +.x-progress-wrap{border:1px solid #6593cf;overflow:hidden;} +.x-progress-inner{height:18px;background:#e0e8f3 url(../images/default/qtip/bg.gif) repeat-x;position:relative;} +.x-progress-bar{height:18px;float:left;width:0;background:#9CBFEE url( ../images/default/progress/progress-bg.gif ) repeat-x left center;border-top:1px solid #D1E4FD;border-bottom:1px solid #7FA9E4;border-right:1px solid #7FA9E4;} +.x-progress-text{font-size:11px;font-weight:bold;color:#fff;padding:1px 5px;overflow:hidden;position:absolute;left:0;text-align:center;} +.x-progress-text-back{color:#396095;line-height:16px;} +.ext-ie .x-progress-text-back{line-height:15px;} + +.x-window-dlg .x-window-body{border:0 none!important;padding:5px 10px;overflow:hidden!important;} +.x-window-dlg .x-window-mc{border:0 none!important;} +.x-window-dlg .ext-mb-text,.x-window-dlg .x-window-header-text{font-size:12px;} +.x-window-dlg .ext-mb-input{margin-top:4px;width:95%;} +.x-window-dlg .ext-mb-textarea{margin-top:4px;font:normal 12px tahoma,arial,helvetica,sans-serif;} +.x-window-dlg .x-progress-wrap{margin-top:4px;} +.ext-ie .x-window-dlg .x-progress-wrap{margin-top:6px;} +.x-window-dlg .x-msg-box-wait{background:transparent url(../images/default/grid/loading.gif) no-repeat left;display:block;width:300px;padding-left:18px;line-height:18px;} +.x-window-dlg .ext-mb-icon{float:left;width:47px;height:32px;} +.x-window-dlg .ext-mb-icon{float:left;width:47px;height:32px;} +.ext-ie .x-window-dlg .ext-mb-icon{width:44px;} +.x-window-dlg .ext-mb-info{background:transparent url(../images/default/window/icon-info.gif) no-repeat top left;} +.x-window-dlg .ext-mb-warning{background:transparent url(../images/default/window/icon-warning.gif) no-repeat top left;} +.x-window-dlg .ext-mb-question{background:transparent url(../images/default/window/icon-question.gif) no-repeat top left;} +.x-window-dlg .ext-mb-error{background:transparent url(../images/default/window/icon-error.gif) no-repeat top left;} +.ext-gecko2 .ext-mb-fix-cursor{overflow:auto;} + + .x-slider{zoom:1;} +.x-slider-inner{position:relative;left:0;top:0;overflow:visible;zoom:1;} +.x-slider-focus{position:absolute;left:0;top:0;width:1px;height:1px;line-height:1px;font-size:1px;-moz-outline:0 none;outline:0 none;-moz-user-select:text;-khtml-user-select:text;} +.x-slider-horz{padding-left:7px;background:transparent url(../images/default/slider/slider-bg.png) no-repeat 0 -22px;} +.x-slider-horz .x-slider-end{padding-right:7px;zoom:1;background:transparent url(../images/default/slider/slider-bg.png) no-repeat right -44px;} +.x-slider-horz .x-slider-inner{background:transparent url(../images/default/slider/slider-bg.png) repeat-x 0 0;height:22px;} +.x-slider-horz .x-slider-thumb{width:14px;height:15px;position:absolute;left:0;top:3px;background:transparent url(../images/default/slider/slider-thumb.png) no-repeat 0 0;} +.x-slider-horz .x-slider-thumb-over{background-position:-14px -15px;} +.x-slider-horz .x-slider-thumb-drag{background-position:-28px -30px;} +.x-slider-vert{padding-top:7px;background:transparent url(../images/default/slider/slider-v-bg.png) no-repeat -44px 0;width:22px;} +.x-slider-vert .x-slider-end{padding-bottom:7px;zoom:1;background:transparent url(../images/default/slider/slider-v-bg.png) no-repeat -22px bottom;} +.x-slider-vert .x-slider-inner{background:transparent url(../images/default/slider/slider-v-bg.png) repeat-y 0 0;} +.x-slider-vert .x-slider-thumb{width:15px;height:14px;position:absolute;left:3px;bottom:0;background:transparent url(../images/default/slider/slider-v-thumb.png) no-repeat 0 0;} +.x-slider-vert .x-slider-thumb-over{background-position:-15px -14px;} +.x-slider-vert .x-slider-thumb-drag{background-position:-30px -28px;} + diff --git a/comet4j-js/docs/resources/docs.css b/comet4j-js/docs/resources/docs.css new file mode 100644 index 0000000..4d3c5e9 --- /dev/null +++ b/comet4j-js/docs/resources/docs.css @@ -0,0 +1,346 @@ +body { + font: normal 12px verdana,arial,tahoma; +} +html, body { + margin:0; + padding:0; + border:0 none; + overflow:hidden; + height:100%; + width:100%; +} +#class .loading-indicator{ + font-size:12px; + height:18px; +} + + +#docs .top-toolbar{ + border:0 none; + border-top:1px solid #d0d0d0; + background:transparent; +} +#docs .top-toolbar button { + +} +.x-panel-noborder { + border: 0 none; +} +#header{ + border:0 none; + background:#1E4176 url(hd-bg.gif) repeat-x 0 0; + padding-top:3px; + padding-left:3px; +} +.docs-header .x-panel-body { + background:transparent; +} + +#header { + +} + +#header .api-title { + font:normal 16px tahoma, arial, sans-serif; + color:white; + margin:5px; +} + +.loading-indicator { + font-size:11px; + background-image:url('../resources/images/default/grid/loading.gif'); + background-repeat: no-repeat; + background-position:top left; + padding-left:20px; + height:18px; + text-align:left; +} + +#doc-body .loading-indicator { + font:bold 13px Tahoma, Verdana, Arial, Helvetica, sans-serif; + position:absolute; + top:35%; + left:43%; + color:#444; + background-image:url(../resources/images/default/shared/large-loading.gif); + background-repeat: no-repeat; + background-position:left 5px; + padding:10px 10px 10px 38px; + text-align:left; +} +a#welcome-link{ + background:#fff url(docs.gif) no-repeat 0px 0px; + padding-left:18px; +} +a#help-forums{ + background:#fff url(forum.gif) no-repeat 16px 0px; + padding-left:34px; + display:block +} +#loading-mask{ + position:absolute; + left:0; + top:0; + width:100%; + height:100%; + z-index:20000; + background-color:white; +} +#loading{ + position:absolute; + left:45%; + top:40%; + padding:2px; + z-index:20001; + height:auto; +} +#loading img { + margin-bottom:5px; +} +#loading .loading-indicator{ + background:white; + color:#555; + font:bold 13px tahoma,arial,helvetica; + padding:10px; + margin:0; + text-align:center; + height:auto; +} +#api-tree a span { + font-family:verdana,arial,tahoma,sans-serif; + font-size:11px; +} +#api-tree .cls a:hover span { + text-decoration:underline; +} +#api-tree .x-panel-body { + background-color:white; + position:relative; + padding:3px; +} +#api-tree .cls{ + border:1px solid #fff; +} + +#api-tree .x-tree-selected { + border:1px dotted #a3bae9; + background:#DFE8F6; +} +#api-tree .x-tree-node .x-tree-selected a span{ + background:transparent; + color:#1E4176; + font-weight:bold; +} + +a { + color: #1E4176; +} +a:link { + color: #1E4176; + text-decoration: none; +} + +a:visited { + color: #555; + text-decoration: none; +} + +a:hover { + text-decoration: underline; + color: #15428b; +} + +#welcome { + position:relative; + top:0; + left: 0; + zoom:1; +} +.col{ + margin:0 250px 0 10px; + zoom:1; + padding: 10px 0; +} + +.col-last { + width: 220px; + position:absolute; + right:10px; + top:10px; +} + +.block{ + margin-bottom:10px; +} +.block-title{ + color: #1E4176; + font:normal 18px tahoma,verdana,sans-serif; + letter-spacing:-1px; + padding: 4px; + padding-left: 8px; +} +.block-body{ + padding:8px; + padding-top:2px; +} +.block-body b{ + color:#333333; + font-size:11px; +} +.block-body em { + display:block; + margin-top:5px; + font-size:11px; + color:gray; + text-align:right; +} +.list{ + list-style: square; + padding-left:20px; + margin-top:5px; +} + +.res-block { + padding-top:5px; + background:transparent url(block-top.gif) no-repeat; + width:210px; + margin-bottom:15px; +} +.res-block-inner { + padding:6px 11px; + background:transparent url(block-bottom.gif) no-repeat left bottom; +} + +.res-block h3 { + font: bold 12px tahoma,arial,sans-serif; + color:#555; + margin-bottom:8px; +} + +.res-block ul { + list-style-type: disc; + margin-left:15px; + font: normal 12px tahoma,arial,sans-serif; + color:#555; +} + +.res-block ul li { + margin:0 0 5px 3px; +} + +.hide-inherited .inherited { + display:none; +} + +#doc-body .x-tab-panel-body { + background:#fff url(../resources/images/default/form/text-bg.gif) repeat-x 0 0; +} +#doc-body .x-panel-body, #doc-body .body-wrap { + background:transparent !important; +} +.icon-cls { + background-image: url(class.gif) !important; +} +.icon-event { + background-image: url(event.gif) !important; +} +.icon-config { + background-image: url(config.gif) !important; +} +.icon-prop { + background-image: url(prop.gif) !important; +} +.icon-method { + background-image: url(method.gif) !important; +} +.icon-cmp { + background-image: url(cmp.gif) !important; +} +.icon-pkg { + background-image: url(pkg.gif) !important; +} +.icon-fav { + background-image: url(fav.gif) !important; +} +.icon-static { + background-image: url(static.gif) !important; +} +.icon-docs { + background-image: url(docs.gif) !important; +} +.icon-expand-all { + background-image: url(expand-all.gif) !important; +} +.icon-collapse-all { + background-image: url(collapse-all.gif) !important; +} +.icon-expand-members { + background-image: url(expand-members.gif) !important; +} +.icon-hide-inherited { + background-image: url(hide-inherited.gif) !important; +} + +#legend li { + line-height:16px; +} +.item-icon { + vertical-align:top; + width:16px; + height:16px; + margin-right:6px; +} +.ext-ie .item-icon { + vertical-align:middle; +} +h3.home-title { + margin:5px 0; + font:bold 13px tahoma,arial,sans-serif; + color:#444; +} + +.search-item { + margin:5px 5px 9px; + padding:0 5px 10px 0; +} + +.search-item .member { + font:bold 12px tahoma,arial,sans-serif; + color:#444; + margin:5px; + overflow:hidden; + white-space:nowrap; + zoom:1; +} + +.search-item .cls { + font:normal 12px tahoma,arial,sans-serif; + color:#444; + margin:5px; + overflow:hidden; + text-align:left; + white-space:nowrap; + zoom:1; +} +.search-item p { + font:normal 11px tahoma,arial,sans-serif; + clear:both; + margin: 0 5px 5px 28px; + color:#444; + zoom:1; +} +#search .loading-indicator { + position:static !important; +} +#search h3 { + font:normal 12px tahoma,arial,sans-serif; + color:#444; + margin:10px; +} +.inner-link .item-icon, .bookmark .item-icon{ + margin-right:3px; +} +.inner-link, .bookmark { + margin-left:10px; +} + diff --git a/comet4j-js/docs/resources/docs.gif b/comet4j-js/docs/resources/docs.gif new file mode 100644 index 0000000..a915dfb Binary files /dev/null and b/comet4j-js/docs/resources/docs.gif differ diff --git a/comet4j-js/docs/resources/docs.js b/comet4j-js/docs/resources/docs.js new file mode 100644 index 0000000..7baadc9 --- /dev/null +++ b/comet4j-js/docs/resources/docs.js @@ -0,0 +1,632 @@ +Ext.BLANK_IMAGE_URL = 'resources/s.gif'; + +Docs = {}; + +ApiPanel = function() { + ApiPanel.superclass.constructor.call(this, { + id:'api-tree', + region:'west', + split:true, + width: 280, + minSize: 175, + maxSize: 500, + collapsible: true, + margins:'0 0 5 5', + cmargins:'0 0 0 0', + rootVisible:false, + lines:false, + autoScroll:true, + animCollapse:false, + animate: false, + collapseMode:'mini', + loader: new Ext.tree.TreeLoader({ + preloadChildren: true, + clearOnLoad: false + }), + root: new Ext.tree.AsyncTreeNode({ + text:'Ext JS', + id:'root', + expanded:true, + children:[Docs.classData] + }), + collapseFirst:false + }); + // no longer needed! + //new Ext.tree.TreeSorter(this, {folderSort:true,leafAttr:'isClass'}); + + this.getSelectionModel().on('beforeselect', function(sm, node){ + return node.isLeaf(); + }); +}; + +Ext.extend(ApiPanel, Ext.tree.TreePanel, { + selectClass : function(cls){ + if(cls){ + var parts = cls.split('.'); + var last = parts.length-1; + var res = []; + var pkg = []; + for(var i = 0; i < last; i++){ // things get nasty - static classes can have . + var p = parts[i]; + var fc = p.charAt(0); + var staticCls = fc.toUpperCase() == fc; + if(p == 'Ext' || !staticCls){ + pkg.push(p); + res[i] = 'pkg-'+pkg.join('.'); + }else if(staticCls){ + --last; + res.splice(i, 1); + } + } + res[last] = cls; + + this.selectPath('/root/apidocs/'+res.join('/')); + } + } +}); + + +DocPanel = Ext.extend(Ext.Panel, { + closable: true, + autoScroll:true, + + initComponent : function(){ + var ps = this.cclass.split('.'); + this.title = ps[ps.length-1]; + + DocPanel.superclass.initComponent.call(this); + }, + + scrollToMember : function(member){ + var el = Ext.fly(this.cclass + '-' + member); + if(el){ + var top = (el.getOffsetsTo(this.body)[1]) + this.body.dom.scrollTop; + this.body.scrollTo('top', top-25, {duration:.75, callback: this.hlMember.createDelegate(this, [member])}); + } + }, + + scrollToSection : function(id){ + var el = Ext.getDom(id); + if(el){ + var top = (Ext.fly(el).getOffsetsTo(this.body)[1]) + this.body.dom.scrollTop; + this.body.scrollTo('top', top-25, {duration:.5, callback: function(){ + Ext.fly(el).next('h2').pause(.2).highlight('#8DB2E3', {attr:'color'}); + }}); + } + }, + + hlMember : function(member){ + var el = Ext.fly(this.cclass + '-' + member); + if(el){ + el.up('tr').highlight('#cadaf9'); + } + } +}); + + +MainPanel = function(){ + + this.searchStore = new Ext.data.Store({ + proxy: new Ext.data.ScriptTagProxy({ + url: 'http://extjs.com/playpen/api.php' + }), + reader: new Ext.data.JsonReader({ + root: 'data' + }, + ['cls', 'member', 'type', 'doc'] + ), + baseParams: {}, + listeners: { + 'beforeload' : function(){ + this.baseParams.qt = Ext.getCmp('search-type').getValue(); + } + } + }); + + MainPanel.superclass.constructor.call(this, { + id:'doc-body', + region:'center', + margins:'0 5 5 0', + resizeTabs: true, + minTabWidth: 135, + tabWidth: 135, + plugins: new Ext.ux.TabCloseMenu(), + enableTabScroll: true, + activeTab: 0, + + items: { + id:'welcome-panel', + title: 'API Home', + autoLoad: {url: 'welcome.html', callback: this.initSearch, scope: this}, + iconCls:'icon-docs', + autoScroll: true, + tbar: [ + 'Search: ', ' ', + new Ext.ux.SelectBox({ + listClass:'x-combo-list-small', + width:90, + value:'Starts with', + id:'search-type', + store: new Ext.data.SimpleStore({ + fields: ['text'], + expandData: true, + data : ['Starts with', 'Ends with', 'Any match'] + }), + displayField: 'text' + }), ' ', + new Ext.app.SearchField({ + width:240, + store: this.searchStore, + paramName: 'q' + }) + ] + } + }); +}; + +Ext.extend(MainPanel, Ext.TabPanel, { + + initEvents : function(){ + MainPanel.superclass.initEvents.call(this); + this.body.on('click', this.onClick, this); + }, + + onClick: function(e, target){ + if(target = e.getTarget('a:not(.exi)', 3)){ + var cls = Ext.fly(target).getAttributeNS('ext', 'cls'); + e.stopEvent(); + if(cls){ + var member = Ext.fly(target).getAttributeNS('ext', 'member'); + this.loadClass(target.href, cls, member); + }else if(target.className == 'inner-link'){ + this.getActiveTab().scrollToSection(target.href.split('#')[1]); + }else{ + window.open(target.href); + } + }else if(target = e.getTarget('.micon', 2)){ + e.stopEvent(); + var tr = Ext.fly(target.parentNode); + if(tr.hasClass('expandable')){ + tr.toggleClass('expanded'); + } + } + }, + + loadClass : function(href, cls, member){ + var id = 'docs-' + cls; + var tab = this.getComponent(id); + if(tab){ + this.setActiveTab(tab); + if(member){ + tab.scrollToMember(member); + } + }else{ + var autoLoad = {url: href}; + if(member){ + autoLoad.callback = function(){ + Ext.getCmp(id).scrollToMember(member); + } + } + var p = this.add(new DocPanel({ + id: id, + cclass : cls, + autoLoad: autoLoad, + iconCls: Docs.icons[cls] + })); + this.setActiveTab(p); + } + }, + + initSearch : function(){ + // Custom rendering Template for the View + var resultTpl = new Ext.XTemplate( + '', + '
    ', + '', + '{member}', + ' ', + '{cls}', + '

    {doc}

    ', + '
    ' + ); + + var p = new Ext.DataView({ + applyTo: 'search', + tpl: resultTpl, + loadingText:'Searching...', + store: this.searchStore, + itemSelector: 'div.search-item', + emptyText: '

    Use the search field above to search the Ext API for classes, properties, config options, methods and events.

    ' + }); + }, + + doSearch : function(e){ + var k = e.getKey(); + if(!e.isSpecialKey()){ + var text = e.target.value; + if(!text){ + this.searchStore.baseParams.q = ''; + this.searchStore.removeAll(); + }else{ + this.searchStore.baseParams.q = text; + this.searchStore.reload(); + } + } + } +}); + + +Ext.onReady(function(){ + + Ext.QuickTips.init(); + + var api = new ApiPanel(); + var mainPanel = new MainPanel(); + + api.on('click', function(node, e){ + if(node.isLeaf()){ + e.stopEvent(); + mainPanel.loadClass(node.attributes.href, node.id); + } + }); + + mainPanel.on('tabchange', function(tp, tab){ + api.selectClass(tab.cclass); + }); + + var hd = new Ext.Panel({ + border: false, + layout:'anchor', + region:'north', + cls: 'docs-header', + height:60, + items: [{ + xtype:'box', + el:'header', + border:false, + anchor: 'none -25' + }, + new Ext.Toolbar({ + cls:'top-toolbar', + items:[ ' ', + new Ext.form.TextField({ + width: 200, + emptyText:'Find a Class', + listeners:{ + render: function(f){ + f.el.on('keydown', filterTree, f, {buffer: 350}); + } + } + }), ' ', ' ', + { + iconCls: 'icon-expand-all', + tooltip: 'Expand All', + handler: function(){ api.root.expand(true); } + }, '-', { + iconCls: 'icon-collapse-all', + tooltip: 'Collapse All', + handler: function(){ api.root.collapse(true); } + }, '->', { + tooltip:'Hide Inherited Members', + iconCls: 'icon-hide-inherited', + enableToggle: true, + toggleHandler : function(b, pressed){ + mainPanel[pressed ? 'addClass' : 'removeClass']('hide-inherited'); + } + }, '-', { + tooltip:'Expand All Members', + iconCls: 'icon-expand-members', + enableToggle: true, + toggleHandler : function(b, pressed){ + mainPanel[pressed ? 'addClass' : 'removeClass']('full-details'); + } + }] + })] + }) + + var viewport = new Ext.Viewport({ + layout:'border', + items:[ hd, api, mainPanel ] + }); + + api.expandPath('/root/apidocs'); + + // allow for link in + var page = window.location.href.split('?')[1]; + if(page){ + var ps = Ext.urlDecode(page); + var cls = ps['class']; + mainPanel.loadClass('output/' + cls + '.html', cls, ps.member); + } + + viewport.doLayout(); + + setTimeout(function(){ + Ext.get('loading').remove(); + Ext.get('loading-mask').fadeOut({remove:true}); + }, 250); + + var filter = new Ext.tree.TreeFilter(api, { + clearBlank: true, + autoClear: true + }); + var hiddenPkgs = []; + function filterTree(e){ + var text = e.target.value; + Ext.each(hiddenPkgs, function(n){ + n.ui.show(); + }); + if(!text){ + filter.clear(); + return; + } + api.expandAll(); + + var re = new RegExp('^' + Ext.escapeRe(text), 'i'); + filter.filterBy(function(n){ + return !n.attributes.isClass || re.test(n.text); + }); + + // hide empty packages that weren't filtered + hiddenPkgs = []; + api.root.cascade(function(n){ + if(!n.attributes.isClass && n.ui.ctNode.offsetHeight < 3){ + n.ui.hide(); + hiddenPkgs.push(n); + } + }); + } + +}); + + +Ext.app.SearchField = Ext.extend(Ext.form.TwinTriggerField, { + initComponent : function(){ + if(!this.store.baseParams){ + this.store.baseParams = {}; + } + Ext.app.SearchField.superclass.initComponent.call(this); + this.on('specialkey', function(f, e){ + if(e.getKey() == e.ENTER){ + this.onTrigger2Click(); + } + }, this); + }, + + validationEvent:false, + validateOnBlur:false, + trigger1Class:'x-form-clear-trigger', + trigger2Class:'x-form-search-trigger', + hideTrigger1:true, + width:180, + hasSearch : false, + paramName : 'query', + + onTrigger1Click : function(){ + if(this.hasSearch){ + this.store.baseParams[this.paramName] = ''; + this.store.removeAll(); + this.el.dom.value = ''; + this.triggers[0].hide(); + this.hasSearch = false; + this.focus(); + } + }, + + onTrigger2Click : function(){ + var v = this.getRawValue(); + if(v.length < 1){ + this.onTrigger1Click(); + return; + } + if(v.length < 2){ + Ext.Msg.alert('Invalid Search', 'You must enter a minimum of 2 characters to search the API'); + return; + } + this.store.baseParams[this.paramName] = v; + var o = {start: 0}; + this.store.reload({params:o}); + this.hasSearch = true; + this.triggers[0].show(); + this.focus(); + } +}); + + +/** + * Makes a ComboBox more closely mimic an HTML SELECT. Supports clicking and dragging + * through the list, with item selection occurring when the mouse button is released. + * When used will automatically set {@link #editable} to false and call {@link Ext.Element#unselectable} + * on inner elements. Re-enabling editable after calling this will NOT work. + * + * @author Corey Gilmore + * http://extjs.com/forum/showthread.php?t=6392 + * + * @history 2007-07-08 jvs + * Slight mods for Ext 2.0 + */ +Ext.ux.SelectBox = function(config){ + this.searchResetDelay = 1000; + config = config || {}; + config = Ext.apply(config || {}, { + editable: false, + forceSelection: true, + rowHeight: false, + lastSearchTerm: false, + triggerAction: 'all', + mode: 'local' + }); + + Ext.ux.SelectBox.superclass.constructor.apply(this, arguments); + + this.lastSelectedIndex = this.selectedIndex || 0; +}; + +Ext.extend(Ext.ux.SelectBox, Ext.form.ComboBox, { + lazyInit: false, + initEvents : function(){ + Ext.ux.SelectBox.superclass.initEvents.apply(this, arguments); + // you need to use keypress to capture upper/lower case and shift+key, but it doesn't work in IE + this.el.on('keydown', this.keySearch, this, true); + this.cshTask = new Ext.util.DelayedTask(this.clearSearchHistory, this); + }, + + keySearch : function(e, target, options) { + var raw = e.getKey(); + var key = String.fromCharCode(raw); + var startIndex = 0; + + if( !this.store.getCount() ) { + return; + } + + switch(raw) { + case Ext.EventObject.HOME: + e.stopEvent(); + this.selectFirst(); + return; + + case Ext.EventObject.END: + e.stopEvent(); + this.selectLast(); + return; + + case Ext.EventObject.PAGEDOWN: + this.selectNextPage(); + e.stopEvent(); + return; + + case Ext.EventObject.PAGEUP: + this.selectPrevPage(); + e.stopEvent(); + return; + } + + // skip special keys other than the shift key + if( (e.hasModifier() && !e.shiftKey) || e.isNavKeyPress() || e.isSpecialKey() ) { + return; + } + if( this.lastSearchTerm == key ) { + startIndex = this.lastSelectedIndex; + } + this.search(this.displayField, key, startIndex); + this.cshTask.delay(this.searchResetDelay); + }, + + onRender : function(ct, position) { + this.store.on('load', this.calcRowsPerPage, this); + Ext.ux.SelectBox.superclass.onRender.apply(this, arguments); + if( this.mode == 'local' ) { + this.calcRowsPerPage(); + } + }, + + onSelect : function(record, index, skipCollapse){ + if(this.fireEvent('beforeselect', this, record, index) !== false){ + this.setValue(record.data[this.valueField || this.displayField]); + if( !skipCollapse ) { + this.collapse(); + } + this.lastSelectedIndex = index + 1; + this.fireEvent('select', this, record, index); + } + }, + + render : function(ct) { + Ext.ux.SelectBox.superclass.render.apply(this, arguments); + if( Ext.isSafari ) { + this.el.swallowEvent('mousedown', true); + } + this.el.unselectable(); + this.innerList.unselectable(); + this.trigger.unselectable(); + this.innerList.on('mouseup', function(e, target, options) { + if( target.id && target.id == this.innerList.id ) { + return; + } + this.onViewClick(); + }, this); + + this.innerList.on('mouseover', function(e, target, options) { + if( target.id && target.id == this.innerList.id ) { + return; + } + this.lastSelectedIndex = this.view.getSelectedIndexes()[0] + 1; + this.cshTask.delay(this.searchResetDelay); + }, this); + + this.trigger.un('click', this.onTriggerClick, this); + this.trigger.on('mousedown', function(e, target, options) { + e.preventDefault(); + this.onTriggerClick(); + }, this); + + this.on('collapse', function(e, target, options) { + Ext.getDoc().un('mouseup', this.collapseIf, this); + }, this, true); + + this.on('expand', function(e, target, options) { + Ext.getDoc().on('mouseup', this.collapseIf, this); + }, this, true); + }, + + clearSearchHistory : function() { + this.lastSelectedIndex = 0; + this.lastSearchTerm = false; + }, + + selectFirst : function() { + this.focusAndSelect(this.store.data.first()); + }, + + selectLast : function() { + this.focusAndSelect(this.store.data.last()); + }, + + selectPrevPage : function() { + if( !this.rowHeight ) { + return; + } + var index = Math.max(this.selectedIndex-this.rowsPerPage, 0); + this.focusAndSelect(this.store.getAt(index)); + }, + + selectNextPage : function() { + if( !this.rowHeight ) { + return; + } + var index = Math.min(this.selectedIndex+this.rowsPerPage, this.store.getCount() - 1); + this.focusAndSelect(this.store.getAt(index)); + }, + + search : function(field, value, startIndex) { + field = field || this.displayField; + this.lastSearchTerm = value; + var index = this.store.find.apply(this.store, arguments); + if( index !== -1 ) { + this.focusAndSelect(index); + } + }, + + focusAndSelect : function(record) { + var index = typeof record === 'number' ? record : this.store.indexOf(record); + this.select(index, this.isExpanded()); + this.onSelect(this.store.getAt(record), index, this.isExpanded()); + }, + + calcRowsPerPage : function() { + if( this.store.getCount() ) { + this.rowHeight = Ext.fly(this.view.getNode(0)).getHeight(); + this.rowsPerPage = this.maxHeight / this.rowHeight; + } else { + this.rowHeight = false; + } + } + +}); + +Ext.Ajax.on('requestcomplete', function(ajax, xhr, o){ + if(typeof urchinTracker == 'function' && o && o.url){ + urchinTracker(o.url); + } +}); \ No newline at end of file diff --git a/comet4j-js/docs/resources/elbow-end.gif b/comet4j-js/docs/resources/elbow-end.gif new file mode 100644 index 0000000..f24ddee Binary files /dev/null and b/comet4j-js/docs/resources/elbow-end.gif differ diff --git a/comet4j-js/docs/resources/event.gif b/comet4j-js/docs/resources/event.gif new file mode 100644 index 0000000..9fb1ba9 Binary files /dev/null and b/comet4j-js/docs/resources/event.gif differ diff --git a/comet4j-js/docs/resources/example.gif b/comet4j-js/docs/resources/example.gif new file mode 100644 index 0000000..ad599cf Binary files /dev/null and b/comet4j-js/docs/resources/example.gif differ diff --git a/comet4j-js/docs/resources/expand-all.gif b/comet4j-js/docs/resources/expand-all.gif new file mode 100644 index 0000000..3798498 Binary files /dev/null and b/comet4j-js/docs/resources/expand-all.gif differ diff --git a/comet4j-js/docs/resources/expand-bg-over.gif b/comet4j-js/docs/resources/expand-bg-over.gif new file mode 100644 index 0000000..ec3a546 Binary files /dev/null and b/comet4j-js/docs/resources/expand-bg-over.gif differ diff --git a/comet4j-js/docs/resources/expand-bg.gif b/comet4j-js/docs/resources/expand-bg.gif new file mode 100644 index 0000000..135aa89 Binary files /dev/null and b/comet4j-js/docs/resources/expand-bg.gif differ diff --git a/comet4j-js/docs/resources/expand-members.gif b/comet4j-js/docs/resources/expand-members.gif new file mode 100644 index 0000000..14b5437 Binary files /dev/null and b/comet4j-js/docs/resources/expand-members.gif differ diff --git a/comet4j-js/docs/resources/ext-all.js b/comet4j-js/docs/resources/ext-all.js new file mode 100644 index 0000000..9834745 --- /dev/null +++ b/comet4j-js/docs/resources/ext-all.js @@ -0,0 +1,162 @@ +/* + * Ext JS Library 2.2 + * Copyright(c) 2006-2008, Ext JS, LLC. + * licensing@extjs.com + * + * http://extjs.com/license + */ + +Ext.DomHelper=function(){var L=null;var F=/^(?:br|frame|hr|img|input|link|meta|range|spacer|wbr|area|param|col)$/i;var B=/^table|tbody|tr|td$/i;var A=function(T){if(typeof T=="string"){return T}var O="";if(Ext.isArray(T)){for(var R=0,P=T.length;R"}else{O+=">";var U=T.children||T.cn;if(U){O+=A(U)}else{if(T.html){O+=T.html}}O+=""}return O};var M=function(T,O){var S;if(Ext.isArray(T)){S=document.createDocumentFragment();for(var R=0,P=T.length;R",K=""+E,H=C+"",D=""+K;var G=function(N,O,Q,P){if(!L){L=document.createElement("div")}var R;var S=null;if(N=="td"){if(O=="afterbegin"||O=="beforeend"){return }if(O=="beforebegin"){S=Q;Q=Q.parentNode}else{S=Q.nextSibling;Q=Q.parentNode}R=I(4,H,P,D)}else{if(N=="tr"){if(O=="beforebegin"){S=Q;Q=Q.parentNode;R=I(3,C,P,K)}else{if(O=="afterend"){S=Q.nextSibling;Q=Q.parentNode;R=I(3,C,P,K)}else{if(O=="afterbegin"){S=Q.firstChild}R=I(4,H,P,D)}}}else{if(N=="tbody"){if(O=="beforebegin"){S=Q;Q=Q.parentNode;R=I(2,J,P,E)}else{if(O=="afterend"){S=Q.nextSibling;Q=Q.parentNode;R=I(2,J,P,E)}else{if(O=="afterbegin"){S=Q.firstChild}R=I(3,C,P,K)}}}else{if(O=="beforebegin"||O=="afterend"){return }if(O=="afterbegin"){S=Q.firstChild}R=I(2,J,P,E)}}}Q.insertBefore(R,S);return R};return{useDom:false,markup:function(N){return A(N)},applyStyles:function(P,Q){if(Q){P=Ext.fly(P);if(typeof Q=="string"){var O=/\s?([a-z\-]*)\:\s?([^;]*);?/gi;var R;while((R=O.exec(Q))!=null){P.setStyle(R[1],R[2])}}else{if(typeof Q=="object"){for(var N in Q){P.setStyle(N,Q[N])}}else{if(typeof Q=="function"){Ext.DomHelper.applyStyles(P,Q.call())}}}}},insertHtml:function(P,R,Q){P=P.toLowerCase();if(R.insertAdjacentHTML){if(B.test(R.tagName)){var O;if(O=G(R.tagName.toLowerCase(),P,R,Q)){return O}}switch(P){case"beforebegin":R.insertAdjacentHTML("BeforeBegin",Q);return R.previousSibling;case"afterbegin":R.insertAdjacentHTML("AfterBegin",Q);return R.firstChild;case"beforeend":R.insertAdjacentHTML("BeforeEnd",Q);return R.lastChild;case"afterend":R.insertAdjacentHTML("AfterEnd",Q);return R.nextSibling}throw"Illegal insertion point -> \""+P+"\""}var N=R.ownerDocument.createRange();var S;switch(P){case"beforebegin":N.setStartBefore(R);S=N.createContextualFragment(Q);R.parentNode.insertBefore(S,R);return R.previousSibling;case"afterbegin":if(R.firstChild){N.setStartBefore(R.firstChild);S=N.createContextualFragment(Q);R.insertBefore(S,R.firstChild);return R.firstChild}else{R.innerHTML=Q;return R.firstChild}case"beforeend":if(R.lastChild){N.setStartAfter(R.lastChild);S=N.createContextualFragment(Q);R.appendChild(S);return R.lastChild}else{R.innerHTML=Q;return R.lastChild}case"afterend":N.setStartAfter(R);S=N.createContextualFragment(Q);R.parentNode.insertBefore(S,R.nextSibling);return R.nextSibling}throw"Illegal insertion point -> \""+P+"\""},insertBefore:function(N,P,O){return this.doInsert(N,P,O,"beforeBegin")},insertAfter:function(N,P,O){return this.doInsert(N,P,O,"afterEnd","nextSibling")},insertFirst:function(N,P,O){return this.doInsert(N,P,O,"afterBegin","firstChild")},doInsert:function(Q,S,R,T,P){Q=Ext.getDom(Q);var O;if(this.useDom){O=M(S,null);(P==="firstChild"?Q:Q.parentNode).insertBefore(O,P?Q[P]:Q)}else{var N=A(S);O=this.insertHtml(T,Q,N)}return R?Ext.get(O,true):O},append:function(P,R,Q){P=Ext.getDom(P);var O;if(this.useDom){O=M(R,null);P.appendChild(O)}else{var N=A(R);O=this.insertHtml("beforeEnd",P,N)}return Q?Ext.get(O,true):O},overwrite:function(N,P,O){N=Ext.getDom(N);N.innerHTML=A(P);return O?Ext.get(N.firstChild,true):N.firstChild},createTemplate:function(O){var N=A(O);return new Ext.Template(N)}}}(); +Ext.Template=function(E){var B=arguments;if(Ext.isArray(E)){E=E.join("")}else{if(B.length>1){var C=[];for(var D=0,A=B.length;D+~]\s?|\s|$)/;var tagTokenRe=/^(#)?([\w-\*]+)/;var nthRe=/(\d*)n\+?(\d*)/,nthRe2=/\D/;function child(p,index){var i=0;var n=p.firstChild;while(n){if(n.nodeType==1){if(++i==index){return n}}n=n.nextSibling}return null}function next(n){while((n=n.nextSibling)&&n.nodeType!=1){}return n}function prev(n){while((n=n.previousSibling)&&n.nodeType!=1){}return n}function children(d){var n=d.firstChild,ni=-1;while(n){var nx=n.nextSibling;if(n.nodeType==3&&!nonSpace.test(n.nodeValue)){d.removeChild(n)}else{n.nodeIndex=++ni}n=nx}return this}function byClassName(c,a,v){if(!v){return c}var r=[],ri=-1,cn;for(var i=0,ci;ci=c[i];i++){if((" "+ci.className+" ").indexOf(v)!=-1){r[++ri]=ci}}return r}function attrValue(n,attr){if(!n.tagName&&typeof n.length!="undefined"){n=n[0]}if(!n){return null}if(attr=="for"){return n.htmlFor}if(attr=="class"||attr=="className"){return n.className}return n.getAttribute(attr)||n[attr]}function getNodes(ns,mode,tagName){var result=[],ri=-1,cs;if(!ns){return result}tagName=tagName||"*";if(typeof ns.getElementsByTagName!="undefined"){ns=[ns]}if(!mode){for(var i=0,ni;ni=ns[i];i++){cs=ni.getElementsByTagName(tagName);for(var j=0,ci;ci=cs[j];j++){result[++ri]=ci}}}else{if(mode=="/"||mode==">"){var utag=tagName.toUpperCase();for(var i=0,ni,cn;ni=ns[i];i++){cn=ni.children||ni.childNodes;for(var j=0,cj;cj=cn[j];j++){if(cj.nodeName==utag||cj.nodeName==tagName||tagName=="*"){result[++ri]=cj}}}}else{if(mode=="+"){var utag=tagName.toUpperCase();for(var i=0,n;n=ns[i];i++){while((n=n.nextSibling)&&n.nodeType!=1){}if(n&&(n.nodeName==utag||n.nodeName==tagName||tagName=="*")){result[++ri]=n}}}else{if(mode=="~"){for(var i=0,n;n=ns[i];i++){while((n=n.nextSibling)&&(n.nodeType!=1||(tagName=="*"||n.tagName.toLowerCase()!=tagName))){}if(n){result[++ri]=n}}}}}}return result}function concat(a,b){if(b.slice){return a.concat(b)}for(var i=0,l=b.length;i1){return nodup(results)}return results},selectNode:function(path,root){return Ext.DomQuery.select(path,root)[0]},selectValue:function(path,root,defaultValue){path=path.replace(trimRe,"");if(!valueCache[path]){valueCache[path]=Ext.DomQuery.compile(path,"select")}var n=valueCache[path](root);n=n[0]?n[0]:n;var v=(n&&n.firstChild?n.firstChild.nodeValue:null);return((v===null||v===undefined||v==="")?defaultValue:v)},selectNumber:function(path,root,defaultValue){var v=Ext.DomQuery.selectValue(path,root,defaultValue||0);return parseFloat(v)},is:function(el,ss){if(typeof el=="string"){el=document.getElementById(el)}var isArray=Ext.isArray(el);var result=Ext.DomQuery.filter(isArray?el:[el],ss);return isArray?(result.length==el.length):(result.length>0)},filter:function(els,ss,nonMatches){ss=ss.replace(trimRe,"");if(!simpleCache[ss]){simpleCache[ss]=Ext.DomQuery.compile(ss,"simple")}var result=simpleCache[ss](els);return nonMatches?quickDiff(result,els):result},matchers:[{re:/^\.([\w-]+)/,select:"n = byClassName(n, null, \" {1} \");"},{re:/^\:([\w-]+)(?:\(((?:[^\s>\/]*|.*?))\))?/,select:"n = byPseudo(n, \"{1}\", \"{2}\");"},{re:/^(?:([\[\{])(?:@)?([\w-]+)\s?(?:(=|.=)\s?['"]?(.*?)["']?)?[\]\}])/,select:"n = byAttribute(n, \"{2}\", \"{4}\", \"{3}\", \"{1}\");"},{re:/^#([\w-]+)/,select:"n = byId(n, null, \"{1}\");"},{re:/^@([\w-]+)/,select:"return {firstChild:{nodeValue:attrValue(n, \"{1}\")}};"}],operators:{"=":function(a,v){return a==v},"!=":function(a,v){return a!=v},"^=":function(a,v){return a&&a.substr(0,v.length)==v},"$=":function(a,v){return a&&a.substr(a.length-v.length)==v},"*=":function(a,v){return a&&a.indexOf(v)!==-1},"%=":function(a,v){return(a%v)==0},"|=":function(a,v){return a&&(a==v||a.substr(0,v.length+1)==v+"-")},"~=":function(a,v){return a&&(" "+a+" ").indexOf(" "+v+" ")!=-1}},pseudos:{"first-child":function(c){var r=[],ri=-1,n;for(var i=0,ci;ci=n=c[i];i++){while((n=n.previousSibling)&&n.nodeType!=1){}if(!n){r[++ri]=ci}}return r},"last-child":function(c){var r=[],ri=-1,n;for(var i=0,ci;ci=n=c[i];i++){while((n=n.nextSibling)&&n.nodeType!=1){}if(!n){r[++ri]=ci}}return r},"nth-child":function(c,a){var r=[],ri=-1;var m=nthRe.exec(a=="even"&&"2n"||a=="odd"&&"2n+1"||!nthRe2.test(a)&&"n+"+a||a);var f=(m[1]||1)-0,l=m[2]-0;for(var i=0,n;n=c[i];i++){var pn=n.parentNode;if(batch!=pn._batch){var j=0;for(var cn=pn.firstChild;cn;cn=cn.nextSibling){if(cn.nodeType==1){cn.nodeIndex=++j}}pn._batch=batch}if(f==1){if(l==0||n.nodeIndex==l){r[++ri]=n}}else{if((n.nodeIndex+l)%f==0){r[++ri]=n}}}return r},"only-child":function(c){var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){if(!prev(ci)&&!next(ci)){r[++ri]=ci}}return r},"empty":function(c){var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){var cns=ci.childNodes,j=0,cn,empty=true;while(cn=cns[j]){++j;if(cn.nodeType==1||cn.nodeType==3){empty=false;break}}if(empty){r[++ri]=ci}}return r},"contains":function(c,v){var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){if((ci.textContent||ci.innerText||"").indexOf(v)!=-1){r[++ri]=ci}}return r},"nodeValue":function(c,v){var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){if(ci.firstChild&&ci.firstChild.nodeValue==v){r[++ri]=ci}}return r},"checked":function(c){var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){if(ci.checked==true){r[++ri]=ci}}return r},"not":function(c,ss){return Ext.DomQuery.filter(c,ss,true)},"any":function(c,selectors){var ss=selectors.split("|");var r=[],ri=-1,s;for(var i=0,ci;ci=c[i];i++){for(var j=0;s=ss[j];j++){if(Ext.DomQuery.is(ci,s)){r[++ri]=ci;break}}}return r},"odd":function(c){return this["nth-child"](c,"odd")},"even":function(c){return this["nth-child"](c,"even")},"nth":function(c,a){return c[a-1]||[]},"first":function(c){return c[0]||[]},"last":function(c){return c[c.length-1]||[]},"has":function(c,ss){var s=Ext.DomQuery.select;var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){if(s(ss,ci).length>0){r[++ri]=ci}}return r},"next":function(c,ss){var is=Ext.DomQuery.is;var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){var n=next(ci);if(n&&is(n,ss)){r[++ri]=ci}}return r},"prev":function(c,ss){var is=Ext.DomQuery.is;var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){var n=prev(ci);if(n&&is(n,ss)){r[++ri]=ci}}return r}}}}();Ext.query=Ext.DomQuery.select; +Ext.util.Observable=function(){if(this.listeners){this.on(this.listeners);delete this.listeners}};Ext.util.Observable.prototype={fireEvent:function(){if(this.eventsSuspended!==true){var A=this.events[arguments[0].toLowerCase()];if(typeof A=="object"){return A.fire.apply(A,Array.prototype.slice.call(arguments,1))}}return true},filterOptRe:/^(?:scope|delay|buffer|single)$/,addListener:function(A,C,B,F){if(typeof A=="object"){F=A;for(var E in F){if(this.filterOptRe.test(E)){continue}if(typeof F[E]=="function"){this.addListener(E,F[E],F.scope,F)}else{this.addListener(E,F[E].fn,F[E].scope,F[E])}}return }F=(!F||typeof F=="boolean")?{}:F;A=A.toLowerCase();var D=this.events[A]||true;if(typeof D=="boolean"){D=new Ext.util.Event(this,A);this.events[A]=D}D.addListener(C,B,F)},removeListener:function(A,C,B){var D=this.events[A.toLowerCase()];if(typeof D=="object"){D.removeListener(C,B)}},purgeListeners:function(){for(var A in this.events){if(typeof this.events[A]=="object"){this.events[A].clearListeners()}}},relayEvents:function(F,D){var E=function(G){return function(){return this.fireEvent.apply(this,Ext.combine(G,Array.prototype.slice.call(arguments,0)))}};for(var C=0,A=D.length;C0},suspendEvents:function(){this.eventsSuspended=true},resumeEvents:function(){this.eventsSuspended=false},getMethodEvent:function(G){if(!this.methodEvents){this.methodEvents={}}var F=this.methodEvents[G];if(!F){F={};this.methodEvents[G]=F;F.originalFn=this[G];F.methodName=G;F.before=[];F.after=[];var C,B,D;var E=this;var A=function(J,I,H){if((B=J.apply(I||E,H))!==undefined){if(typeof B==="object"){if(B.returnValue!==undefined){C=B.returnValue}else{C=B}if(B.cancel===true){D=true}}else{if(B===false){D=true}else{C=B}}}};this[G]=function(){C=B=undefined;D=false;var I=Array.prototype.slice.call(arguments,0);for(var J=0,H=F.before.length;J0){this.firing=true;var G=Array.prototype.slice.call(arguments,0);for(var H=0;H=33&&D<=40)||D==this.RETURN||D==this.TAB||D==this.ESC},isSpecialKey:function(){var D=this.keyCode;return(this.type=="keypress"&&this.ctrlKey)||D==9||D==13||D==40||D==27||(D==16)||(D==17)||(D>=18&&D<=20)||(D>=33&&D<=35)||(D>=36&&D<=39)||(D>=44&&D<=45)},stopPropagation:function(){if(this.browserEvent){if(this.browserEvent.type=="mousedown"){Ext.EventManager.stoppedMouseDownEvent.fire(this)}B.stopPropagation(this.browserEvent)}},getCharCode:function(){return this.charCode||this.keyCode},getKey:function(){var D=this.keyCode||this.charCode;return Ext.isSafari?(A[D]||D):D},getPageX:function(){return this.xy[0]},getPageY:function(){return this.xy[1]},getTime:function(){if(this.browserEvent){return B.getTime(this.browserEvent)}return null},getXY:function(){return this.xy},getTarget:function(E,F,D){return E?Ext.fly(this.target).findParent(E,F,D):(D?Ext.get(this.target):this.target)},getRelatedTarget:function(){if(this.browserEvent){return B.getRelatedTarget(this.browserEvent)}return null},getWheelDelta:function(){var D=this.browserEvent;var E=0;if(D.wheelDelta){E=D.wheelDelta/120}else{if(D.detail){E=-D.detail/3}}return E},hasModifier:function(){return((this.ctrlKey||this.altKey)||this.shiftKey)?true:false},within:function(E,F){var D=this[F?"getRelatedTarget":"getTarget"]();return D&&Ext.fly(E).contains(D)},getPoint:function(){return new Ext.lib.Point(this.xy[0],this.xy[1])}};return new Ext.EventObjectImpl()}(); +(function(){var D=Ext.lib.Dom;var E=Ext.lib.Event;var A=Ext.lib.Anim;var propCache={};var camelRe=/(-[a-z])/gi;var camelFn=function(m,a){return a.charAt(1).toUpperCase()};var view=document.defaultView;Ext.Element=function(element,forceNew){var dom=typeof element=="string"?document.getElementById(element):element;if(!dom){return null}var id=dom.id;if(forceNew!==true&&id&&Ext.Element.cache[id]){return Ext.Element.cache[id]}this.dom=dom;this.id=id||Ext.id(dom)};var El=Ext.Element;El.prototype={originalDisplay:"",visibilityMode:1,defaultUnit:"px",setVisibilityMode:function(visMode){this.visibilityMode=visMode;return this},enableDisplayMode:function(display){this.setVisibilityMode(El.DISPLAY);if(typeof display!="undefined"){this.originalDisplay=display}return this},findParent:function(simpleSelector,maxDepth,returnEl){var p=this.dom,b=document.body,depth=0,dq=Ext.DomQuery,stopEl;maxDepth=maxDepth||50;if(typeof maxDepth!="number"){stopEl=Ext.getDom(maxDepth);maxDepth=10}while(p&&p.nodeType==1&&depthch||tcb){c.scrollTop=b-ch}}c.scrollTop=c.scrollTop;if(hscroll!==false){if(el.offsetWidth>c.clientWidth||lcr){c.scrollLeft=r-c.clientWidth}}c.scrollLeft=c.scrollLeft}return this},scrollChildIntoView:function(child,hscroll){Ext.fly(child,"_scrollChildIntoView").scrollIntoView(this,hscroll)},autoHeight:function(animate,duration,onComplete,easing){var oldHeight=this.getHeight();this.clip();this.setHeight(1);setTimeout(function(){var height=parseInt(this.dom.scrollHeight,10);if(!animate){this.setHeight(height);this.unclip();if(typeof onComplete=="function"){onComplete()}}else{this.setHeight(oldHeight);this.setHeight(height,animate,duration,function(){this.unclip();if(typeof onComplete=="function"){onComplete()}}.createDelegate(this),easing)}}.createDelegate(this),0);return this},contains:function(el){if(!el){return false}return D.isAncestor(this.dom,el.dom?el.dom:el)},isVisible:function(deep){var vis=!(this.getStyle("visibility")=="hidden"||this.getStyle("display")=="none");if(deep!==true||!vis){return vis}var p=this.dom.parentNode;while(p&&p.tagName.toLowerCase()!="body"){if(!Ext.fly(p,"_isVisible").isVisible()){return false}p=p.parentNode}return true},select:function(selector,unique){return El.select(selector,unique,this.dom)},query:function(selector){return Ext.DomQuery.select(selector,this.dom)},child:function(selector,returnDom){var n=Ext.DomQuery.selectNode(selector,this.dom);return returnDom?n:Ext.get(n)},down:function(selector,returnDom){var n=Ext.DomQuery.selectNode(" > "+selector,this.dom);return returnDom?n:Ext.get(n)},initDD:function(group,config,overrides){var dd=new Ext.dd.DD(Ext.id(this.dom),group,config);return Ext.apply(dd,overrides)},initDDProxy:function(group,config,overrides){var dd=new Ext.dd.DDProxy(Ext.id(this.dom),group,config);return Ext.apply(dd,overrides)},initDDTarget:function(group,config,overrides){var dd=new Ext.dd.DDTarget(Ext.id(this.dom),group,config);return Ext.apply(dd,overrides)},setVisible:function(visible,animate){if(!animate||!A){if(this.visibilityMode==El.DISPLAY){this.setDisplayed(visible)}else{this.fixDisplay();this.dom.style.visibility=visible?"visible":"hidden"}}else{var dom=this.dom;var visMode=this.visibilityMode;if(visible){this.setOpacity(0.01);this.setVisible(true)}this.anim({opacity:{to:(visible?1:0)}},this.preanim(arguments,1),null,0.35,"easeIn",function(){if(!visible){if(visMode==El.DISPLAY){dom.style.display="none"}else{dom.style.visibility="hidden"}Ext.get(dom).setOpacity(1)}})}return this},isDisplayed:function(){return this.getStyle("display")!="none"},toggle:function(animate){this.setVisible(!this.isVisible(),this.preanim(arguments,0));return this},setDisplayed:function(value){if(typeof value=="boolean"){value=value?this.originalDisplay:"none"}this.setStyle("display",value);return this},focus:function(){try{this.dom.focus()}catch(e){}return this},blur:function(){try{this.dom.blur()}catch(e){}return this},addClass:function(className){if(Ext.isArray(className)){for(var i=0,len=className.length;idw+scrollX){x=swapX?r.left-w:dw+scrollX-w}if(xdh+scrollY){y=swapY?r.top-h:dh+scrollY-h}if(yvr){x=vr-w;moved=true}if((y+h)>vb){y=vb-h;moved=true}if(x";E.onAvailable(id,function(){var hd=document.getElementsByTagName("head")[0];var re=/(?:]*)?>)((\n|\r|.)*?)(?:<\/script>)/ig;var srcRe=/\ssrc=([\'\"])(.*?)\1/i;var typeRe=/\stype=([\'\"])(.*?)\1/i;var match;while(match=re.exec(html)){var attrs=match[1];var srcMatch=attrs?attrs.match(srcRe):false;if(srcMatch&&srcMatch[2]){var s=document.createElement("script");s.src=srcMatch[2];var typeMatch=attrs.match(typeRe);if(typeMatch&&typeMatch[2]){s.type=typeMatch[2]}hd.appendChild(s)}else{if(match[2]&&match[2].length>0){if(window.execScript){window.execScript(match[2])}else{window.eval(match[2])}}}}var el=document.getElementById(id);if(el){Ext.removeNode(el)}if(typeof callback=="function"){callback()}});dom.innerHTML=html.replace(/(?:)((\n|\r|.)*?)(?:<\/script>)/ig,"");return this},load:function(){var um=this.getUpdater();um.update.apply(um,arguments);return this},getUpdater:function(){if(!this.updateManager){this.updateManager=new Ext.Updater(this)}return this.updateManager},unselectable:function(){this.dom.unselectable="on";this.swallowEvent("selectstart",true);this.applyStyles("-moz-user-select:none;-khtml-user-select:none;");this.addClass("x-unselectable");return this},getCenterXY:function(){return this.getAlignToXY(document,"c-c")},center:function(centerIn){this.alignTo(centerIn||document,"c-c");return this},isBorderBox:function(){return noBoxAdjust[this.dom.tagName.toLowerCase()]||Ext.isBorderBox},getBox:function(contentBox,local){var xy;if(!local){xy=this.getXY()}else{var left=parseInt(this.getStyle("left"),10)||0;var top=parseInt(this.getStyle("top"),10)||0;xy=[left,top]}var el=this.dom,w=el.offsetWidth,h=el.offsetHeight,bx;if(!contentBox){bx={x:xy[0],y:xy[1],0:xy[0],1:xy[1],width:w,height:h}}else{var l=this.getBorderWidth("l")+this.getPadding("l");var r=this.getBorderWidth("r")+this.getPadding("r");var t=this.getBorderWidth("t")+this.getPadding("t");var b=this.getBorderWidth("b")+this.getPadding("b");bx={x:xy[0]+l,y:xy[1]+t,0:xy[0]+l,1:xy[1]+t,width:w-(l+r),height:h-(t+b)}}bx.right=bx.x+bx.width;bx.bottom=bx.y+bx.height;return bx},getFrameWidth:function(sides,onlyContentBox){return onlyContentBox&&Ext.isBorderBox?0:(this.getPadding(sides)+this.getBorderWidth(sides))},setBox:function(box,adjust,animate){var w=box.width,h=box.height;if((adjust&&!this.autoBoxAdjust)&&!this.isBorderBox()){w-=(this.getBorderWidth("lr")+this.getPadding("lr"));h-=(this.getBorderWidth("tb")+this.getPadding("tb"))}this.setBounds(box.x,box.y,w,h,this.preanim(arguments,2));return this},repaint:function(){var dom=this.dom;this.addClass("x-repaint");setTimeout(function(){Ext.get(dom).removeClass("x-repaint")},1);return this},getMargins:function(side){if(!side){return{top:parseInt(this.getStyle("margin-top"),10)||0,left:parseInt(this.getStyle("margin-left"),10)||0,bottom:parseInt(this.getStyle("margin-bottom"),10)||0,right:parseInt(this.getStyle("margin-right"),10)||0}}else{return this.addStyles(side,El.margins)}},addStyles:function(sides,styles){var val=0,v,w;for(var i=0,len=sides.length;i=0?w:-1*w)}}}return val},createProxy:function(config,renderTo,matchBox){config=typeof config=="object"?config:{tag:"div",cls:config};var proxy;if(renderTo){proxy=Ext.DomHelper.append(renderTo,config,true)}else{proxy=Ext.DomHelper.insertBefore(this.dom,config,true)}if(matchBox){proxy.setBox(this.getBox())}return proxy},mask:function(msg,msgCls){if(this.getStyle("position")=="static"){this.setStyle("position","relative")}if(this._maskMsg){this._maskMsg.remove()}if(this._mask){this._mask.remove()}this._mask=Ext.DomHelper.append(this.dom,{cls:"ext-el-mask"},true);this.addClass("x-masked");this._mask.setDisplayed(true);if(typeof msg=="string"){this._maskMsg=Ext.DomHelper.append(this.dom,{cls:"ext-el-mask-msg",cn:{tag:"div"}},true);var mm=this._maskMsg;mm.dom.className=msgCls?"ext-el-mask-msg "+msgCls:"ext-el-mask-msg";mm.dom.firstChild.innerHTML=msg;mm.setDisplayed(true);mm.center(this)}if(Ext.isIE&&!(Ext.isIE7&&Ext.isStrict)&&this.getStyle("height")=="auto"){this._mask.setSize(this.dom.clientWidth,this.getHeight())}return this._mask},unmask:function(){if(this._mask){if(this._maskMsg){this._maskMsg.remove();delete this._maskMsg}this._mask.remove();delete this._mask}this.removeClass("x-masked")},isMasked:function(){return this._mask&&this._mask.isVisible()},createShim:function(){var el=document.createElement("iframe");el.frameBorder="0";el.className="ext-shim";if(Ext.isIE&&Ext.isSecure){el.src=Ext.SSL_SECURE_URL}var shim=Ext.get(this.dom.parentNode.insertBefore(el,this.dom));shim.autoBoxAdjust=false;return shim},remove:function(){Ext.removeNode(this.dom);delete El.cache[this.dom.id]},hover:function(overFn,outFn,scope){var preOverFn=function(e){if(!e.within(this,true)){overFn.apply(scope||this,arguments)}};var preOutFn=function(e){if(!e.within(this,true)){outFn.apply(scope||this,arguments)}};this.on("mouseover",preOverFn,this.dom);this.on("mouseout",preOutFn,this.dom);return this},addClassOnOver:function(className){this.hover(function(){Ext.fly(this,"_internal").addClass(className)},function(){Ext.fly(this,"_internal").removeClass(className)});return this},addClassOnFocus:function(className){this.on("focus",function(){Ext.fly(this,"_internal").addClass(className)},this.dom);this.on("blur",function(){Ext.fly(this,"_internal").removeClass(className)},this.dom);return this},addClassOnClick:function(className){var dom=this.dom;this.on("mousedown",function(){Ext.fly(dom,"_internal").addClass(className);var d=Ext.getDoc();var fn=function(){Ext.fly(dom,"_internal").removeClass(className);d.removeListener("mouseup",fn)};d.on("mouseup",fn)});return this},swallowEvent:function(eventName,preventDefault){var fn=function(e){e.stopPropagation();if(preventDefault){e.preventDefault()}};if(Ext.isArray(eventName)){for(var i=0,len=eventName.length;idom.clientHeight||dom.scrollWidth>dom.clientWidth},scrollTo:function(side,value,animate){var prop=side.toLowerCase()=="left"?"scrollLeft":"scrollTop";if(!animate||!A){this.dom[prop]=value}else{var to=prop=="scrollLeft"?[value,this.dom.scrollTop]:[this.dom.scrollLeft,value];this.anim({scroll:{"to":to}},this.preanim(arguments,2),"scroll")}return this},scroll:function(direction,distance,animate){if(!this.isScrollable()){return }var el=this.dom;var l=el.scrollLeft,t=el.scrollTop;var w=el.scrollWidth,h=el.scrollHeight;var cw=el.clientWidth,ch=el.clientHeight;direction=direction.toLowerCase();var scrolled=false;var a=this.preanim(arguments,2);switch(direction){case"l":case"left":if(w-l>cw){var v=Math.min(l+distance,w-cw);this.scrollTo("left",v,a);scrolled=true}break;case"r":case"right":if(l>0){var v=Math.max(l-distance,0);this.scrollTo("left",v,a);scrolled=true}break;case"t":case"top":case"up":if(t>0){var v=Math.max(t-distance,0);this.scrollTo("top",v,a);scrolled=true}break;case"b":case"bottom":case"down":if(h-t>ch){var v=Math.min(t+distance,h-ch);this.scrollTo("top",v,a);scrolled=true}break}return scrolled},translatePoints:function(x,y){if(typeof x=="object"||Ext.isArray(x)){y=x[1];x=x[0]}var p=this.getStyle("position");var o=this.getXY();var l=parseInt(this.getStyle("left"),10);var t=parseInt(this.getStyle("top"),10);if(isNaN(l)){l=(p=="relative")?0:this.dom.offsetLeft}if(isNaN(t)){t=(p=="relative")?0:this.dom.offsetTop}return{left:(x-o[0]+l),top:(y-o[1]+t)}},getScroll:function(){var d=this.dom,doc=document;if(d==doc||d==doc.body){var l,t;if(Ext.isIE&&Ext.isStrict){l=doc.documentElement.scrollLeft||(doc.body.scrollLeft||0);t=doc.documentElement.scrollTop||(doc.body.scrollTop||0)}else{l=window.pageXOffset||(doc.body.scrollLeft||0);t=window.pageYOffset||(doc.body.scrollTop||0)}return{left:l,top:t}}else{return{left:d.scrollLeft,top:d.scrollTop}}},getColor:function(attr,defaultValue,prefix){var v=this.getStyle(attr);if(!v||v=="transparent"||v=="inherit"){return defaultValue}var color=typeof prefix=="undefined"?"#":prefix;if(v.substr(0,4)=="rgb("){var rvs=v.slice(4,v.length-1).split(",");for(var i=0;i<3;i++){var h=parseInt(rvs[i]);var s=h.toString(16);if(h<16){s="0"+s}color+=s}}else{if(v.substr(0,1)=="#"){if(v.length==4){for(var i=1;i<4;i++){var c=v.charAt(i);color+=c+c}}else{if(v.length==7){color+=v.substr(1)}}}}return(color.length>5?color.toLowerCase():defaultValue)},boxWrap:function(cls){cls=cls||"x-box";var el=Ext.get(this.insertHtml("beforeBegin",String.format("
    "+El.boxMarkup+"
    ",cls)));el.child("."+cls+"-mc").dom.appendChild(this.dom);return el},getAttributeNS:Ext.isIE?function(ns,name){var d=this.dom;var type=typeof d[ns+":"+name];if(type!="undefined"&&type!="unknown"){return d[ns+":"+name]}return d[name]}:function(ns,name){var d=this.dom;return d.getAttributeNS(ns,name)||d.getAttribute(ns+":"+name)||d.getAttribute(name)||d[name]},getTextWidth:function(text,min,max){return(Ext.util.TextMetrics.measure(this.dom,Ext.value(text,this.dom.innerHTML,true)).width).constrain(min||0,max||1000000)}};var ep=El.prototype;ep.on=ep.addListener;ep.mon=ep.addListener;ep.getUpdateManager=ep.getUpdater;ep.un=ep.removeListener;ep.autoBoxAdjust=true;El.unitPattern=/\d+(px|em|%|en|ex|pt|in|cm|mm|pc)$/i;El.addUnits=function(v,defaultUnit){if(v===""||v=="auto"){return v}if(v===undefined){return""}if(typeof v=="number"||!El.unitPattern.test(v)){return v+(defaultUnit||"px")}return v};El.boxMarkup="
    ";El.VISIBILITY=1;El.DISPLAY=2;El.borders={l:"border-left-width",r:"border-right-width",t:"border-top-width",b:"border-bottom-width"};El.paddings={l:"padding-left",r:"padding-right",t:"padding-top",b:"padding-bottom"};El.margins={l:"margin-left",r:"margin-right",t:"margin-top",b:"margin-bottom"};El.cache={};var docEl;El.get=function(el){var ex,elm,id;if(!el){return null}if(typeof el=="string"){if(!(elm=document.getElementById(el))){return null}if(ex=El.cache[el]){ex.dom=elm}else{ex=El.cache[el]=new El(elm)}return ex}else{if(el.tagName){if(!(id=el.id)){id=Ext.id(el)}if(ex=El.cache[id]){ex.dom=el}else{ex=El.cache[id]=new El(el)}return ex}else{if(el instanceof El){if(el!=docEl){el.dom=document.getElementById(el.id)||el.dom;El.cache[el.id]=el}return el}else{if(el.isComposite){return el}else{if(Ext.isArray(el)){return El.select(el)}else{if(el==document){if(!docEl){var f=function(){};f.prototype=El.prototype;docEl=new f();docEl.dom=document}return docEl}}}}}}return null};El.uncache=function(el){for(var i=0,a=arguments,len=a.length;i0){F()}else{B.afterFx(D)}})};F.call(this)});return this},pause:function(C){var A=this.getFxEl();var B={};A.queueFx(B,function(){setTimeout(function(){A.afterFx(B)},C*1000)});return this},fadeIn:function(B){var A=this.getFxEl();B=B||{};A.queueFx(B,function(){this.setOpacity(0);this.fixDisplay();this.dom.style.visibility="visible";var C=B.endOpacity||1;arguments.callee.anim=this.fxanim({opacity:{to:C}},B,null,0.5,"easeOut",function(){if(C==1){this.clearOpacity()}A.afterFx(B)})});return this},fadeOut:function(B){var A=this.getFxEl();B=B||{};A.queueFx(B,function(){arguments.callee.anim=this.fxanim({opacity:{to:B.endOpacity||0}},B,null,0.5,"easeOut",function(){if(this.visibilityMode==Ext.Element.DISPLAY||B.useDisplay){this.dom.style.display="none"}else{this.dom.style.visibility="hidden"}this.clearOpacity();A.afterFx(B)})});return this},scale:function(A,B,C){this.shift(Ext.apply({},C,{width:A,height:B}));return this},shift:function(B){var A=this.getFxEl();B=B||{};A.queueFx(B,function(){var E={},D=B.width,F=B.height,C=B.x,H=B.y,G=B.opacity;if(D!==undefined){E.width={to:this.adjustWidth(D)}}if(F!==undefined){E.height={to:this.adjustHeight(F)}}if(B.left!==undefined){E.left={to:B.left}}if(B.top!==undefined){E.top={to:B.top}}if(B.right!==undefined){E.right={to:B.right}}if(B.bottom!==undefined){E.bottom={to:B.bottom}}if(C!==undefined||H!==undefined){E.points={to:[C!==undefined?C:this.getX(),H!==undefined?H:this.getY()]}}if(G!==undefined){E.opacity={to:G}}if(B.xy!==undefined){E.points={to:B.xy}}arguments.callee.anim=this.fxanim(E,B,"motion",0.35,"easeOut",function(){A.afterFx(B)})});return this},ghost:function(A,C){var B=this.getFxEl();C=C||{};B.queueFx(C,function(){A=A||"b";var H=this.getFxRestore();var E=this.getWidth(),G=this.getHeight();var F=this.dom.style;var J=function(){if(C.useDisplay){B.setDisplayed(false)}else{B.hide()}B.clearOpacity();B.setPositioning(H.pos);F.width=H.width;F.height=H.height;B.afterFx(C)};var D={opacity:{to:0},points:{}},I=D.points;switch(A.toLowerCase()){case"t":I.by=[0,-G];break;case"l":I.by=[-E,0];break;case"r":I.by=[E,0];break;case"b":I.by=[0,G];break;case"tl":I.by=[-E,-G];break;case"bl":I.by=[-E,G];break;case"br":I.by=[E,G];break;case"tr":I.by=[E,-G];break}arguments.callee.anim=this.fxanim(D,C,"motion",0.5,"easeOut",J)});return this},syncFx:function(){this.fxDefaults=Ext.apply(this.fxDefaults||{},{block:false,concurrent:true,stopFx:false});return this},sequenceFx:function(){this.fxDefaults=Ext.apply(this.fxDefaults||{},{block:false,concurrent:false,stopFx:false});return this},nextFx:function(){var A=this.fxQueue[0];if(A){A.call(this)}},hasActiveFx:function(){return this.fxQueue&&this.fxQueue[0]},stopFx:function(){if(this.hasActiveFx()){var A=this.fxQueue[0];if(A&&A.anim&&A.anim.isAnimated()){this.fxQueue=[A];A.anim.stop(true)}}return this},beforeFx:function(A){if(this.hasActiveFx()&&!A.concurrent){if(A.stopFx){this.stopFx();return true}return false}return true},hasFxBlock:function(){var A=this.fxQueue;return A&&A[0]&&A[0].block},queueFx:function(C,A){if(!this.fxQueue){this.fxQueue=[]}if(!this.hasFxBlock()){Ext.applyIf(C,this.fxDefaults);if(!C.concurrent){var B=this.beforeFx(C);A.block=C.block;this.fxQueue.push(A);if(B){this.nextFx()}}else{A.call(this)}}return this},fxWrap:function(F,D,C){var B;if(!D.wrap||!(B=Ext.get(D.wrap))){var A;if(D.fixPosition){A=this.getXY()}var E=document.createElement("div");E.style.visibility=C;B=Ext.get(this.dom.parentNode.insertBefore(E,this.dom));B.setPositioning(F);if(B.getStyle("position")=="static"){B.position("relative")}this.clearPositioning("auto");B.clip();B.dom.appendChild(this.dom);if(A){B.setXY(A)}}return B},fxUnwrap:function(A,C,B){this.clearPositioning();this.setPositioning(C);if(!B.wrap){A.dom.parentNode.insertBefore(this.dom,A.dom);A.remove()}},getFxRestore:function(){var A=this.dom.style;return{pos:this.getPositioning(),width:A.width,height:A.height}},afterFx:function(A){if(A.afterStyle){this.applyStyles(A.afterStyle)}if(A.afterCls){this.addClass(A.afterCls)}if(A.remove===true){this.remove()}Ext.callback(A.callback,A.scope,[this]);if(!A.concurrent){this.fxQueue.shift();this.nextFx()}},getFxEl:function(){return Ext.get(this.dom)},fxanim:function(D,E,B,F,C,A){B=B||"run";E=E||{};var G=Ext.lib.Anim[B](this.dom,D,(E.duration||F)||0.35,(E.easing||C)||"easeOut",function(){Ext.callback(A,this)},this);E.anim=G;return G}};Ext.Fx.resize=Ext.Fx.scale;Ext.apply(Ext.Element.prototype,Ext.Fx); +Ext.CompositeElement=function(A){this.elements=[];this.addElements(A)};Ext.CompositeElement.prototype={isComposite:true,addElements:function(E){if(!E){return this}if(typeof E=="string"){E=Ext.Element.selectorFunction(E)}var D=this.elements;var B=D.length-1;for(var C=0,A=E.length;C"+A.text+""}if(typeof A.scripts!="undefined"){this.loadScripts=A.scripts}if(typeof A.timeout!="undefined"){this.timeout=A.timeout}}this.showLoading();if(!D){this.defaultUrl=B}if(typeof B=="function"){B=B.call(this)}var E=Ext.apply({},{url:B,params:(typeof F=="function"&&C)?F.createDelegate(C):F,success:this.processSuccess,failure:this.processFailure,scope:this,callback:undefined,timeout:(this.timeout*1000),disableCaching:this.disableCaching,argument:{"options":A,"url":B,"form":null,"callback":G,"scope":C||window,"params":F}},A);this.transaction=Ext.Ajax.request(E)}},formUpdate:function(C,A,B,D){if(this.fireEvent("beforeupdate",this.el,C,A)!==false){if(typeof A=="function"){A=A.call(this)}C=Ext.getDom(C);this.transaction=Ext.Ajax.request({form:C,url:A,success:this.processSuccess,failure:this.processFailure,scope:this,timeout:(this.timeout*1000),argument:{"url":A,"form":C,"callback":D,"reset":B}});this.showLoading.defer(1,this)}},refresh:function(A){if(this.defaultUrl==null){return }this.update(this.defaultUrl,null,A,true)},startAutoRefresh:function(B,C,D,E,A){if(A){this.update(C||this.defaultUrl,D,E,true)}if(this.autoRefreshProcId){clearInterval(this.autoRefreshProcId)}this.autoRefreshProcId=setInterval(this.update.createDelegate(this,[C||this.defaultUrl,D,E,true]),B*1000)},stopAutoRefresh:function(){if(this.autoRefreshProcId){clearInterval(this.autoRefreshProcId);delete this.autoRefreshProcId}},isAutoRefreshing:function(){return this.autoRefreshProcId?true:false},showLoading:function(){if(this.showLoadIndicator){this.el.update(this.indicatorText)}},processSuccess:function(A){this.transaction=null;if(A.argument.form&&A.argument.reset){try{A.argument.form.reset()}catch(B){}}if(this.loadScripts){this.renderer.render(this.el,A,this,this.updateComplete.createDelegate(this,[A]))}else{this.renderer.render(this.el,A,this);this.updateComplete(A)}},updateComplete:function(A){this.fireEvent("update",this.el,A);if(typeof A.argument.callback=="function"){A.argument.callback.call(A.argument.scope,this.el,true,A,A.argument.options)}},processFailure:function(A){this.transaction=null;this.fireEvent("failure",this.el,A);if(typeof A.argument.callback=="function"){A.argument.callback.call(A.argument.scope,this.el,false,A,A.argument.options)}},setRenderer:function(A){this.renderer=A},getRenderer:function(){return this.renderer},setDefaultUrl:function(A){this.defaultUrl=A},abort:function(){if(this.transaction){Ext.Ajax.abort(this.transaction)}},isUpdating:function(){if(this.transaction){return Ext.Ajax.isLoading(this.transaction)}return false}});Ext.Updater.defaults={timeout:30,loadScripts:false,sslBlankUrl:(Ext.SSL_SECURE_URL||"javascript:false"),disableCaching:false,showLoadIndicator:true,indicatorText:"
    Loading...
    "};Ext.Updater.updateElement=function(D,C,E,B){var A=Ext.get(D).getUpdater();Ext.apply(A,B);A.update(C,E,B?B.callback:null)};Ext.Updater.BasicRenderer=function(){};Ext.Updater.BasicRenderer.prototype={render:function(C,A,B,D){C.update(A.responseText,B.loadScripts,D)}};Ext.UpdateManager=Ext.Updater; +(function(){Date.formatCodeToRegex=function(character,currentGroup){var p=Date.parseCodes[character];if(p){p=Ext.type(p)=="function"?p():p;Date.parseCodes[character]=p}return p?Ext.applyIf({c:p.c?String.format(p.c,currentGroup||"{0}"):p.c},p):{g:0,c:null,s:Ext.escapeRe(character)}};var $f=Date.formatCodeToRegex;Ext.apply(Date,{parseFunctions:{count:0},parseRegexes:[],formatFunctions:{count:0},daysInMonth:[31,28,31,30,31,30,31,31,30,31,30,31],y2kYear:50,MILLI:"ms",SECOND:"s",MINUTE:"mi",HOUR:"h",DAY:"d",MONTH:"mo",YEAR:"y",dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNumbers:{Jan:0,Feb:1,Mar:2,Apr:3,May:4,Jun:5,Jul:6,Aug:7,Sep:8,Oct:9,Nov:10,Dec:11},getShortMonthName:function(month){return Date.monthNames[month].substring(0,3)},getShortDayName:function(day){return Date.dayNames[day].substring(0,3)},getMonthNumber:function(name){return Date.monthNumbers[name.substring(0,1).toUpperCase()+name.substring(1,3).toLowerCase()]},formatCodes:{d:"String.leftPad(this.getDate(), 2, '0')",D:"Date.getShortDayName(this.getDay())",j:"this.getDate()",l:"Date.dayNames[this.getDay()]",N:"(this.getDay() ? this.getDay() : 7)",S:"this.getSuffix()",w:"this.getDay()",z:"this.getDayOfYear()",W:"String.leftPad(this.getWeekOfYear(), 2, '0')",F:"Date.monthNames[this.getMonth()]",m:"String.leftPad(this.getMonth() + 1, 2, '0')",M:"Date.getShortMonthName(this.getMonth())",n:"(this.getMonth() + 1)",t:"this.getDaysInMonth()",L:"(this.isLeapYear() ? 1 : 0)",o:"(this.getFullYear() + (this.getWeekOfYear() == 1 && this.getMonth() > 0 ? +1 : (this.getWeekOfYear() >= 52 && this.getMonth() < 11 ? -1 : 0)))",Y:"this.getFullYear()",y:"('' + this.getFullYear()).substring(2, 4)",a:"(this.getHours() < 12 ? 'am' : 'pm')",A:"(this.getHours() < 12 ? 'AM' : 'PM')",g:"((this.getHours() % 12) ? this.getHours() % 12 : 12)",G:"this.getHours()",h:"String.leftPad((this.getHours() % 12) ? this.getHours() % 12 : 12, 2, '0')",H:"String.leftPad(this.getHours(), 2, '0')",i:"String.leftPad(this.getMinutes(), 2, '0')",s:"String.leftPad(this.getSeconds(), 2, '0')",u:"String.leftPad(this.getMilliseconds(), 3, '0')",O:"this.getGMTOffset()",P:"this.getGMTOffset(true)",T:"this.getTimezone()",Z:"(this.getTimezoneOffset() * -60)",c:function(){for(var c="Y-m-dTH:i:sP",code=[],i=0,l=c.length;i 0) {";var regex="";var special=false;var ch="";for(var i=0;i= 0 && m >= 0 && d > 0 && h >= 0 && i >= 0 && s >= 0 && ms >= 0){\n"+"v = new Date(y, m, d, h, i, s, ms);\n"+"}else if (y >= 0 && m >= 0 && d > 0 && h >= 0 && i >= 0 && s >= 0){\n"+"v = new Date(y, m, d, h, i, s);\n"+"}else if (y >= 0 && m >= 0 && d > 0 && h >= 0 && i >= 0){\n"+"v = new Date(y, m, d, h, i);\n"+"}else if (y >= 0 && m >= 0 && d > 0 && h >= 0){\n"+"v = new Date(y, m, d, h);\n"+"}else if (y >= 0 && m >= 0 && d > 0){\n"+"v = new Date(y, m, d);\n"+"}else if (y >= 0 && m >= 0){\n"+"v = new Date(y, m);\n"+"}else if (y >= 0){\n"+"v = new Date(y);\n"+"}\n}\nreturn (v && (z || o))?"+" (Ext.type(z) == 'number' ? v.add(Date.SECOND, -v.getTimezoneOffset() * 60 - z) :"+" v.add(Date.MINUTE, -v.getTimezoneOffset() + (sn == '+'? -1 : 1) * (hr * 60 + mn))) : v;\n"+"}";Date.parseRegexes[regexNum]=new RegExp("^"+regex+"$","i");eval(code)},parseCodes:{d:{g:1,c:"d = parseInt(results[{0}], 10);\n",s:"(\\d{2})"},j:{g:1,c:"d = parseInt(results[{0}], 10);\n",s:"(\\d{1,2})"},D:function(){for(var a=[],i=0;i<7;a.push(Date.getShortDayName(i)),++i){}return{g:0,c:null,s:"(?:"+a.join("|")+")"}},l:function(){return{g:0,c:null,s:"(?:"+Date.dayNames.join("|")+")"}},N:{g:0,c:null,s:"[1-7]"},S:{g:0,c:null,s:"(?:st|nd|rd|th)"},w:{g:0,c:null,s:"[0-6]"},z:{g:0,c:null,s:"(?:\\d{1,3}"},W:{g:0,c:null,s:"(?:\\d{2})"},F:function(){return{g:1,c:"m = parseInt(Date.getMonthNumber(results[{0}]), 10);\n",s:"("+Date.monthNames.join("|")+")"}},M:function(){for(var a=[],i=0;i<12;a.push(Date.getShortMonthName(i)),++i){}return Ext.applyIf({s:"("+a.join("|")+")"},$f("F"))},m:{g:1,c:"m = parseInt(results[{0}], 10) - 1;\n",s:"(\\d{2})"},n:{g:1,c:"m = parseInt(results[{0}], 10) - 1;\n",s:"(\\d{1,2})"},t:{g:0,c:null,s:"(?:\\d{2})"},L:{g:0,c:null,s:"(?:1|0)"},o:function(){return $f("Y")},Y:{g:1,c:"y = parseInt(results[{0}], 10);\n",s:"(\\d{4})"},y:{g:1,c:"var ty = parseInt(results[{0}], 10);\n"+"y = ty > Date.y2kYear ? 1900 + ty : 2000 + ty;\n",s:"(\\d{1,2})"},a:{g:1,c:"if (results[{0}] == 'am') {\n"+"if (h == 12) { h = 0; }\n"+"} else { if (h < 12) { h += 12; }}",s:"(am|pm)"},A:{g:1,c:"if (results[{0}] == 'AM') {\n"+"if (h == 12) { h = 0; }\n"+"} else { if (h < 12) { h += 12; }}",s:"(AM|PM)"},g:function(){return $f("G")},G:{g:1,c:"h = parseInt(results[{0}], 10);\n",s:"(\\d{1,2})"},h:function(){return $f("H")},H:{g:1,c:"h = parseInt(results[{0}], 10);\n",s:"(\\d{2})"},i:{g:1,c:"i = parseInt(results[{0}], 10);\n",s:"(\\d{2})"},s:{g:1,c:"s = parseInt(results[{0}], 10);\n",s:"(\\d{2})"},u:{g:1,c:"ms = results[{0}]; ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n",s:"(\\d+)"},O:{g:1,c:["o = results[{0}];","var sn = o.substring(0,1);","var hr = o.substring(1,3)*1 + Math.floor(o.substring(3,5) / 60);","var mn = o.substring(3,5) % 60;","o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + String.leftPad(hr, 2, '0') + String.leftPad(mn, 2, '0')) : null;\n"].join("\n"),s:"([+-]\\d{4})"},P:{g:1,c:["o = results[{0}];","var sn = o.substring(0,1);","var hr = o.substring(1,3)*1 + Math.floor(o.substring(4,6) / 60);","var mn = o.substring(4,6) % 60;","o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + String.leftPad(hr, 2, '0') + String.leftPad(mn, 2, '0')) : null;\n"].join("\n"),s:"([+-]\\d{2}:\\d{2})"},T:{g:0,c:null,s:"[A-Z]{1,4}"},Z:{g:1,c:"z = results[{0}] * 1;\n"+"z = (-43200 <= z && z <= 50400)? z : null;\n",s:"([+-]?\\d{1,5})"},c:function(){var calc=[];var arr=[$f("Y",1),$f("m",2),$f("d",3),$f("h",4),$f("i",5),$f("s",6),{c:"ms = (results[7] || '.0').substring(1); ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n"},{c:"if(results[9] == 'Z'){\no = 0;\n}else{\n"+$f("P",9).c+"\n}"}];for(var i=0,l=arr.length;i0?"-":"+")+String.leftPad(Math.abs(Math.floor(this.getTimezoneOffset()/60)),2,"0")+(A?":":"")+String.leftPad(Math.abs(this.getTimezoneOffset()%60),2,"0")},getDayOfYear:function(){var A=0;Date.daysInMonth[1]=this.isLeapYear()?29:28;for(var B=0;B28){A=Math.min(A,this.getFirstDateOfMonth().add("mo",C).getLastDateOfMonth().getDate())}D.setDate(A);D.setMonth(this.getMonth()+C);break;case Date.YEAR:D.setFullYear(this.getFullYear()+C);break}return D},between:function(C,A){var B=this.getTime();return C.getTime()<=B&&B<=A.getTime()}});Date.prototype.format=Date.prototype.dateFormat;if(Ext.isSafari){Date.brokenSetMonth=Date.prototype.setMonth;Date.prototype.setMonth=function(A){if(A<=-1){var D=Math.ceil(-A);var C=Math.ceil(D/12);var B=(D%12)?12-D%12:0;this.setFullYear(this.getFullYear()-C);return Date.brokenSetMonth.call(this,B)}else{return Date.brokenSetMonth.apply(this,arguments)}}}; +Ext.util.DelayedTask=function(E,D,A){var G=null,F,B;var C=function(){var H=new Date().getTime();if(H-B>=F){clearInterval(G);G=null;E.apply(D,A||[])}};this.delay=function(I,K,J,H){if(G&&I!=F){this.cancel()}F=I;B=new Date().getTime();E=K||E;D=J||D;A=H||A;if(!G){G=setInterval(C,F)}};this.cancel=function(){if(G){clearInterval(G);G=null}}}; +Ext.util.TaskRunner=function(E){E=E||10;var F=[],A=[];var B=0;var G=false;var D=function(){G=false;clearInterval(B);B=0};var H=function(){if(!G){G=true;B=setInterval(I,E)}};var C=function(J){A.push(J);if(J.onStop){J.onStop.apply(J.scope||J)}};var I=function(){if(A.length>0){for(var O=0,K=A.length;O1||Ext.isArray(E)){var B=arguments.length>1?arguments:E;for(var D=0,A=B.length;D=this.length){return this.add(B,C)}this.length++;this.items.splice(A,0,C);if(typeof B!="undefined"&&B!=null){this.map[B]=C}this.keys.splice(A,0,B);this.fireEvent("add",A,C,B);return C},remove:function(A){return this.removeAt(this.indexOf(A))},removeAt:function(A){if(A=0){this.length--;var C=this.items[A];this.items.splice(A,1);var B=this.keys[A];if(typeof B!="undefined"){delete this.map[B]}this.keys.splice(A,1);this.fireEvent("remove",C,B);return C}return false},removeKey:function(A){return this.removeAt(this.indexOfKey(A))},getCount:function(){return this.length},indexOf:function(A){return this.items.indexOf(A)},indexOfKey:function(A){return this.keys.indexOf(A)},item:function(A){var B=typeof this.map[A]!="undefined"?this.map[A]:this.items[A];return typeof B!="function"||this.allowFunctions?B:null},itemAt:function(A){return this.items[A]},key:function(A){return this.map[A]},contains:function(A){return this.indexOf(A)!=-1},containsKey:function(A){return typeof this.map[A]!="undefined"},clear:function(){this.length=0;this.items=[];this.keys=[];this.map={};this.fireEvent("clear")},first:function(){return this.items[0]},last:function(){return this.items[this.length-1]},_sort:function(I,A,H){var C=String(A).toUpperCase()=="DESC"?-1:1;H=H||function(K,J){return K-J};var G=[],B=this.keys,F=this.items;for(var D=0,E=F.length;D=A;C--){D[D.length]=B[C]}}return D},filter:function(C,B,D,A){if(Ext.isEmpty(B,false)){return this.clone()}B=this.createValueMatcher(B,D,A);return this.filterBy(function(E){return E&&B.test(E[C])})},filterBy:function(F,E){var G=new Ext.util.MixedCollection();G.getKey=this.getKey;var B=this.keys,D=this.items;for(var C=0,A=D.length;C0){for(var C=0;Clen){return value.substr(0,len-3)+"..."}return value},undef:function(value){return value!==undefined?value:""},defaultValue:function(value,defaultValue){return value!==undefined&&value!==""?value:defaultValue},htmlEncode:function(value){return !value?value:String(value).replace(/&/g,"&").replace(/>/g,">").replace(/").replace(/</g,"<").replace(/"/g,"\"").replace(/&/g,"&")},trim:function(value){return String(value).replace(trimRe,"")},substr:function(value,start,length){return String(value).substr(start,length)},lowercase:function(value){return String(value).toLowerCase()},uppercase:function(value){return String(value).toUpperCase()},capitalize:function(value){return !value?value:value.charAt(0).toUpperCase()+value.substr(1).toLowerCase()},call:function(value,fn){if(arguments.length>2){var args=Array.prototype.slice.call(arguments,2);args.unshift(value);return eval(fn).apply(window,args)}else{return eval(fn).call(window,value)}},usMoney:function(v){v=(Math.round((v-0)*100))/100;v=(v==Math.floor(v))?v+".00":((v*10==Math.floor(v*10))?v+"0":v);v=String(v);var ps=v.split(".");var whole=ps[0];var sub=ps[1]?"."+ps[1]:".00";var r=/(\d+)(\d{3})/;while(r.test(whole)){whole=whole.replace(r,"$1"+","+"$2")}v=whole+sub;if(v.charAt(0)=="-"){return"-$"+v.substr(1)}return"$"+v},date:function(v,format){if(!v){return""}if(!Ext.isDate(v)){v=new Date(Date.parse(v))}return v.dateFormat(format||"m/d/Y")},dateRenderer:function(format){return function(v){return Ext.util.Format.date(v,format)}},stripTagsRE:/<\/?[^>]+>/gi,stripTags:function(v){return !v?v:String(v).replace(this.stripTagsRE,"")},stripScriptsRe:/(?:)((\n|\r|.)*?)(?:<\/script>)/ig,stripScripts:function(v){return !v?v:String(v).replace(this.stripScriptsRe,"")},fileSize:function(size){if(size<1024){return size+" bytes"}else{if(size<1048576){return(Math.round(((size*10)/1024))/10)+" KB"}else{return(Math.round(((size*10)/1048576))/10)+" MB"}}},math:function(){var fns={};return function(v,a){if(!fns[a]){fns[a]=new Function("v","return v "+a+";")}return fns[a](v)}}(),nl2br:function(v){return v===undefined||v===null?"":v.replace(/\n/g,"
    ")}}}(); +Ext.XTemplate=function(){Ext.XTemplate.superclass.constructor.apply(this,arguments);var P=this.html;P=["",P,""].join("");var O=/]*>((?:(?=([^<]+))\2|<(?!tpl\b[^>]*>))*?)<\/tpl>/;var N=/^]*?for="(.*?)"/;var L=/^]*?if="(.*?)"/;var J=/^]*?exec="(.*?)"/;var C,B=0;var G=[];while(C=P.match(O)){var M=C[0].match(N);var K=C[0].match(L);var I=C[0].match(J);var E=null,H=null,D=null;var A=M&&M[1]?M[1]:"";if(K){E=K&&K[1]?K[1]:null;if(E){H=new Function("values","parent","xindex","xcount","with(values){ return "+(Ext.util.Format.htmlDecode(E))+"; }")}}if(I){E=I&&I[1]?I[1]:null;if(E){D=new Function("values","parent","xindex","xcount","with(values){ "+(Ext.util.Format.htmlDecode(E))+"; }")}}if(A){switch(A){case".":A=new Function("values","parent","with(values){ return values; }");break;case"..":A=new Function("values","parent","with(values){ return parent; }");break;default:A=new Function("values","parent","with(values){ return "+A+"; }")}}G.push({id:B,target:A,exec:D,test:H,body:C[1]||""});P=P.replace(C[0],"{xtpl"+B+"}");++B}for(var F=G.length-1;F>=0;--F){this.compileTpl(G[F])}this.master=G[G.length-1];this.tpls=G};Ext.extend(Ext.XTemplate,Ext.Template,{re:/\{([\w-\.\#]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?(\s?[\+\-\*\\]\s?[\d\.\+\-\*\\\(\)]+)?\}/g,codeRe:/\{\[((?:\\\]|.|\n)*?)\]\}/g,applySubTemplate:function(A,H,G,D,C){var J=this.tpls[A];if(J.test&&!J.test.call(this,H,G,D,C)){return""}if(J.exec&&J.exec.call(this,H,G,D,C)){return""}var I=J.target?J.target.call(this,H,G):H;G=J.target?H:G;if(J.target&&Ext.isArray(I)){var B=[];for(var E=0,F=I.length;E=0;--E){D[H[E].selectorText]=H[E]}}catch(G){}},getRules:function(F){if(D==null||F){D={};var H=C.styleSheets;for(var G=0,E=H.length;G=37&&A<=40){C.stopEvent()}},relay:function(C){var A=C.getKey();var B=this.keyToHandler[A];if(B&&this[B]){if(this.doRelay(C,this[B],B)!==true){C[this.defaultEventAction]()}}},doRelay:function(C,B,A){return B.call(this.scope||this,C)},enter:false,left:false,right:false,up:false,down:false,tab:false,esc:false,pageUp:false,pageDown:false,del:false,home:false,end:false,keyToHandler:{37:"left",39:"right",38:"up",40:"down",33:"pageUp",34:"pageDown",46:"del",36:"home",35:"end",13:"enter",27:"esc",9:"tab"},enable:function(){if(this.disabled){if(this.forceKeyDown||Ext.isIE||Ext.isSafari3||Ext.isAir){this.el.on("keydown",this.relay,this)}else{this.el.on("keydown",this.prepareEvent,this);this.el.on("keypress",this.relay,this)}this.disabled=false}},disable:function(){if(!this.disabled){if(this.forceKeyDown||Ext.isIE||Ext.isSafari3||Ext.isAir){this.el.un("keydown",this.relay)}else{this.el.un("keydown",this.prepareEvent);this.el.un("keypress",this.relay)}this.disabled=true}}}; +Ext.KeyMap=function(C,B,A){this.el=Ext.get(C);this.eventName=A||"keydown";this.bindings=[];if(B){this.addBinding(B)}this.enable()};Ext.KeyMap.prototype={stopEvent:false,addBinding:function(D){if(Ext.isArray(D)){for(var F=0,H=D.length;F=this.minX;D=D-C){if(!E[D]){this.xTicks[this.xTicks.length]=D;E[D]=true}}for(D=this.initPageX;D<=this.maxX;D=D+C){if(!E[D]){this.xTicks[this.xTicks.length]=D;E[D]=true}}this.xTicks.sort(this.DDM.numericSort)},setYTicks:function(F,C){this.yTicks=[];this.yTickSize=C;var E={};for(var D=this.initPageY;D>=this.minY;D=D-C){if(!E[D]){this.yTicks[this.yTicks.length]=D;E[D]=true}}for(D=this.initPageY;D<=this.maxY;D=D+C){if(!E[D]){this.yTicks[this.yTicks.length]=D;E[D]=true}}this.yTicks.sort(this.DDM.numericSort)},setXConstraint:function(E,D,C){this.leftConstraint=E;this.rightConstraint=D;this.minX=this.initPageX-E;this.maxX=this.initPageX+D;if(C){this.setXTicks(this.initPageX,C)}this.constrainX=true},clearConstraints:function(){this.constrainX=false;this.constrainY=false;this.clearTicks()},clearTicks:function(){this.xTicks=null;this.yTicks=null;this.xTickSize=0;this.yTickSize=0},setYConstraint:function(C,E,D){this.topConstraint=C;this.bottomConstraint=E;this.minY=this.initPageY-C;this.maxY=this.initPageY+E;if(D){this.setYTicks(this.initPageY,D)}this.constrainY=true},resetConstraints:function(){if(this.initPageX||this.initPageX===0){var D=(this.maintainOffset)?this.lastPageX-this.initPageX:0;var C=(this.maintainOffset)?this.lastPageY-this.initPageY:0;this.setInitPosition(D,C)}else{this.setInitPosition()}if(this.constrainX){this.setXConstraint(this.leftConstraint,this.rightConstraint,this.xTickSize)}if(this.constrainY){this.setYConstraint(this.topConstraint,this.bottomConstraint,this.yTickSize)}},getTick:function(I,F){if(!F){return I}else{if(F[0]>=I){return F[0]}else{for(var D=0,C=F.length;D=I){var H=I-F[D];var G=F[E]-I;return(G>H)?F[D]:F[E]}}return F[F.length-1]}}},toString:function(){return("DragDrop "+this.id)}}})();if(!Ext.dd.DragDropMgr){Ext.dd.DragDropMgr=function(){var A=Ext.EventManager;return{ids:{},handleIds:{},dragCurrent:null,dragOvers:{},deltaX:0,deltaY:0,preventDefault:true,stopPropagation:true,initialized:false,locked:false,init:function(){this.initialized=true},POINT:0,INTERSECT:1,mode:0,_execOnAll:function(D,C){for(var E in this.ids){for(var B in this.ids[E]){var F=this.ids[E][B];if(!this.isTypeOfDD(F)){continue}F[D].apply(F,C)}}},_onLoad:function(){this.init();A.on(document,"mouseup",this.handleMouseUp,this,true);A.on(document,"mousemove",this.handleMouseMove,this,true);A.on(window,"unload",this._onUnload,this,true);A.on(window,"resize",this._onResize,this,true)},_onResize:function(B){this._execOnAll("resetConstraints",[])},lock:function(){this.locked=true},unlock:function(){this.locked=false},isLocked:function(){return this.locked},locationCache:{},useCache:true,clickPixelThresh:3,clickTimeThresh:350,dragThreshMet:false,clickTimeout:null,startX:0,startY:0,regDragDrop:function(C,B){if(!this.initialized){this.init()}if(!this.ids[B]){this.ids[B]={}}this.ids[B][C.id]=C},removeDDFromGroup:function(D,B){if(!this.ids[B]){this.ids[B]={}}var C=this.ids[B];if(C&&C[D.id]){delete C[D.id]}},_remove:function(C){for(var B in C.groups){if(B&&this.ids[B][C.id]){delete this.ids[B][C.id]}}delete this.handleIds[C.id]},regHandle:function(C,B){if(!this.handleIds[C]){this.handleIds[C]={}}this.handleIds[C][B]=B},isDragDrop:function(B){return(this.getDDById(B))?true:false},getRelated:function(F,C){var E=[];for(var D in F.groups){for(j in this.ids[D]){var B=this.ids[D][j];if(!this.isTypeOfDD(B)){continue}if(!C||B.isTarget){E[E.length]=B}}}return E},isLegalTarget:function(F,E){var C=this.getRelated(F,true);for(var D=0,B=C.length;Dthis.clickPixelThresh||B>this.clickPixelThresh){this.startDrag(this.startX,this.startY)}}if(this.dragThreshMet){this.dragCurrent.b4Drag(D);this.dragCurrent.onDrag(D);if(!this.dragCurrent.moveOnly){this.fireEvents(D,false)}}this.stopEvent(D);return true},fireEvents:function(K,L){var N=this.dragCurrent;if(!N||N.isLocked()){return }var O=K.getPoint();var B=[];var E=[];var I=[];var G=[];var D=[];for(var F in this.dragOvers){var C=this.dragOvers[F];if(!this.isTypeOfDD(C)){continue}if(!this.isOverTarget(O,C,this.mode)){E.push(C)}B[F]=true;delete this.dragOvers[F]}for(var M in N.groups){if("string"!=typeof M){continue}for(F in this.ids[M]){var H=this.ids[M][F];if(!this.isTypeOfDD(H)){continue}if(H.isTarget&&!H.isLocked()&&H!=N){if(this.isOverTarget(O,H,this.mode)){if(L){G.push(H)}else{if(!B[H.id]){D.push(H)}else{I.push(H)}this.dragOvers[H.id]=H}}}}}if(this.mode){if(E.length){N.b4DragOut(K,E);N.onDragOut(K,E)}if(D.length){N.onDragEnter(K,D)}if(I.length){N.b4DragOver(K,I);N.onDragOver(K,I)}if(G.length){N.b4DragDrop(K,G);N.onDragDrop(K,G)}}else{var J=0;for(F=0,J=E.length;F2000){}else{setTimeout(B._addListeners,10);if(document&&document.body){B._timeoutCount+=1}}}},handleWasClicked:function(B,D){if(this.isHandle(D,B.id)){return true}else{var C=B.parentNode;while(C){if(this.isHandle(D,C.id)){return true}else{C=C.parentNode}}}return false}}}();Ext.dd.DDM=Ext.dd.DragDropMgr;Ext.dd.DDM._addListeners()}Ext.dd.DD=function(C,A,B){if(C){this.init(C,A,B)}};Ext.extend(Ext.dd.DD,Ext.dd.DragDrop,{scroll:true,autoOffset:function(C,B){var A=C-this.startPageX;var D=B-this.startPageY;this.setDelta(A,D)},setDelta:function(B,A){this.deltaX=B;this.deltaY=A},setDragElPos:function(C,B){var A=this.getDragEl();this.alignElWithMouse(A,C,B)},alignElWithMouse:function(C,G,F){var E=this.getTargetCoord(G,F);var B=C.dom?C:Ext.fly(C,"_dd");if(!this.deltaSetXY){var H=[E.x,E.y];B.setXY(H);var D=B.getLeft(true);var A=B.getTop(true);this.deltaSetXY=[D-E.x,A-E.y]}else{B.setLeftTop(E.x+this.deltaSetXY[0],E.y+this.deltaSetXY[1])}this.cachePosition(E.x,E.y);this.autoScroll(E.x,E.y,C.offsetHeight,C.offsetWidth);return E},cachePosition:function(B,A){if(B){this.lastPageX=B;this.lastPageY=A}else{var C=Ext.lib.Dom.getXY(this.getEl());this.lastPageX=C[0];this.lastPageY=C[1]}},autoScroll:function(J,I,E,K){if(this.scroll){var L=Ext.lib.Dom.getViewHeight();var B=Ext.lib.Dom.getViewWidth();var N=this.DDM.getScrollTop();var D=this.DDM.getScrollLeft();var H=E+I;var M=K+J;var G=(L+N-I-this.deltaY);var F=(B+D-J-this.deltaX);var C=40;var A=(document.all)?80:30;if(H>L&&G0&&I-NB&&F0&&J-Dthis.maxX){A=this.maxX}}if(this.constrainY){if(Dthis.maxY){D=this.maxY}}A=this.getTick(A,this.xTicks);D=this.getTick(D,this.yTicks);return{x:A,y:D}},applyConfig:function(){Ext.dd.DD.superclass.applyConfig.call(this);this.scroll=(this.config.scroll!==false)},b4MouseDown:function(A){this.autoOffset(A.getPageX(),A.getPageY())},b4Drag:function(A){this.setDragElPos(A.getPageX(),A.getPageY())},toString:function(){return("DD "+this.id)}});Ext.dd.DDProxy=function(C,A,B){if(C){this.init(C,A,B);this.initFrame()}};Ext.dd.DDProxy.dragElId="ygddfdiv";Ext.extend(Ext.dd.DDProxy,Ext.dd.DD,{resizeFrame:true,centerFrame:false,createFrame:function(){var B=this;var A=document.body;if(!A||!A.firstChild){setTimeout(function(){B.createFrame()},50);return }var D=this.getDragEl();if(!D){D=document.createElement("div");D.id=this.dragElId;var C=D.style;C.position="absolute";C.visibility="hidden";C.cursor="move";C.border="2px solid #aaa";C.zIndex=999;A.insertBefore(D,A.firstChild)}},initFrame:function(){this.createFrame()},applyConfig:function(){Ext.dd.DDProxy.superclass.applyConfig.call(this);this.resizeFrame=(this.config.resizeFrame!==false);this.centerFrame=(this.config.centerFrame);this.setDragElId(this.config.dragElId||Ext.dd.DDProxy.dragElId)},showFrame:function(E,D){var C=this.getEl();var A=this.getDragEl();var B=A.style;this._resizeProxy();if(this.centerFrame){this.setDelta(Math.round(parseInt(B.width,10)/2),Math.round(parseInt(B.height,10)/2))}this.setDragElPos(E,D);Ext.fly(A).show()},_resizeProxy:function(){if(this.resizeFrame){var A=this.getEl();Ext.fly(this.getDragEl()).setSize(A.offsetWidth,A.offsetHeight)}},b4MouseDown:function(B){var A=B.getPageX();var C=B.getPageY();this.autoOffset(A,C);this.setDragElPos(A,C)},b4StartDrag:function(A,B){this.showFrame(A,B)},b4EndDrag:function(A){Ext.fly(this.getDragEl()).hide()},endDrag:function(C){var B=this.getEl();var A=this.getDragEl();A.style.visibility="";this.beforeMove();B.style.visibility="hidden";Ext.dd.DDM.moveToEl(B,A);A.style.visibility="hidden";B.style.visibility="";this.afterDrag()},beforeMove:function(){},afterDrag:function(){},toString:function(){return("DDProxy "+this.id)}});Ext.dd.DDTarget=function(C,A,B){if(C){this.initTarget(C,A,B)}};Ext.extend(Ext.dd.DDTarget,Ext.dd.DragDrop,{toString:function(){return("DDTarget "+this.id)}}); +Ext.dd.DragTracker=function(A){Ext.apply(this,A);this.addEvents("mousedown","mouseup","mousemove","dragstart","dragend","drag");this.dragRegion=new Ext.lib.Region(0,0,0,0);if(this.el){this.initEl(this.el)}};Ext.extend(Ext.dd.DragTracker,Ext.util.Observable,{active:false,tolerance:5,autoStart:false,initEl:function(A){this.el=Ext.get(A);A.on("mousedown",this.onMouseDown,this,this.delegate?{delegate:this.delegate}:undefined)},destroy:function(){this.el.un("mousedown",this.onMouseDown,this)},onMouseDown:function(C,B){if(this.fireEvent("mousedown",this,C)!==false&&this.onBeforeStart(C)!==false){this.startXY=this.lastXY=C.getXY();this.dragTarget=this.delegate?B:this.el.dom;C.preventDefault();var A=Ext.getDoc();A.on("mouseup",this.onMouseUp,this);A.on("mousemove",this.onMouseMove,this);A.on("selectstart",this.stopSelect,this);if(this.autoStart){this.timer=this.triggerStart.defer(this.autoStart===true?1000:this.autoStart,this)}}},onMouseMove:function(D,C){D.preventDefault();var B=D.getXY(),A=this.startXY;this.lastXY=B;if(!this.active){if(Math.abs(A[0]-B[0])>this.tolerance||Math.abs(A[1]-B[1])>this.tolerance){this.triggerStart()}else{return }}this.fireEvent("mousemove",this,D);this.onDrag(D);this.fireEvent("drag",this,D)},onMouseUp:function(B){var A=Ext.getDoc();A.un("mousemove",this.onMouseMove,this);A.un("mouseup",this.onMouseUp,this);A.un("selectstart",this.stopSelect,this);B.preventDefault();this.clearStart();this.active=false;delete this.elRegion;this.fireEvent("mouseup",this,B);this.onEnd(B);this.fireEvent("dragend",this,B)},triggerStart:function(A){this.clearStart();this.active=true;this.onStart(this.startXY);this.fireEvent("dragstart",this,this.startXY)},clearStart:function(){if(this.timer){clearTimeout(this.timer);delete this.timer}},stopSelect:function(A){A.stopEvent();return false},onBeforeStart:function(A){},onStart:function(A){},onDrag:function(A){},onEnd:function(A){},getDragTarget:function(){return this.dragTarget},getDragCt:function(){return this.el},getXY:function(A){return A?this.constrainModes[A].call(this,this.lastXY):this.lastXY},getOffset:function(C){var B=this.getXY(C);var A=this.startXY;return[A[0]-B[0],A[1]-B[1]]},constrainModes:{"point":function(B){if(!this.elRegion){this.elRegion=this.getDragCt().getRegion()}var A=this.dragRegion;A.left=B[0];A.top=B[1];A.right=B[0];A.bottom=B[1];A.constrainTo(this.elRegion);return[A.left,A.top]}}}); +Ext.dd.ScrollManager=function(){var C=Ext.dd.DragDropMgr;var E={};var B=null;var H={};var G=function(K){B=null;A()};var I=function(){if(C.dragCurrent){C.refreshCache(C.dragCurrent.groups)}};var D=function(){if(C.dragCurrent){var K=Ext.dd.ScrollManager;var L=H.el.ddScrollConfig?H.el.ddScrollConfig.increment:K.increment;if(!K.animate){if(H.el.scroll(H.dir,L)){I()}}else{H.el.scroll(H.dir,L,true,K.animDuration,I)}}};var A=function(){if(H.id){clearInterval(H.id)}H.id=0;H.el=null;H.dir=""};var F=function(L,K){A();H.el=L;H.dir=K;var M=(L.ddScrollConfig&&L.ddScrollConfig.frequency)?L.ddScrollConfig.frequency:Ext.dd.ScrollManager.frequency;H.id=setInterval(D,M)};var J=function(N,P){if(P||!C.dragCurrent){return }var Q=Ext.dd.ScrollManager;if(!B||B!=C.dragCurrent){B=C.dragCurrent;Q.refreshCache()}var R=Ext.lib.Event.getXY(N);var S=new Ext.lib.Point(R[0],R[1]);for(var L in E){var M=E[L],K=M._region;var O=M.ddScrollConfig?M.ddScrollConfig:Q;if(K&&K.contains(S)&&M.isScrollable()){if(K.bottom-S.y<=O.vthresh){if(H.el!=M){F(M,"down")}return }else{if(K.right-S.x<=O.hthresh){if(H.el!=M){F(M,"left")}return }else{if(S.y-K.top<=O.vthresh){if(H.el!=M){F(M,"up")}return }else{if(S.x-K.left<=O.hthresh){if(H.el!=M){F(M,"right")}return }}}}}}A()};C.fireEvents=C.fireEvents.createSequence(J,C);C.stopDrag=C.stopDrag.createSequence(G,C);return{register:function(M){if(Ext.isArray(M)){for(var L=0,K=M.length;L]+>/gi,asText:function(A){return String(A).replace(this.stripTagsRE,"")},asUCText:function(A){return String(A).toUpperCase().replace(this.stripTagsRE,"")},asUCString:function(A){return String(A).toUpperCase()},asDate:function(A){if(!A){return 0}if(Ext.isDate(A)){return A.getTime()}return Date.parse(String(A))},asFloat:function(A){var B=parseFloat(String(A).replace(/,/g,""));if(isNaN(B)){B=0}return B},asInt:function(A){var B=parseInt(String(A).replace(/,/g,""));if(isNaN(B)){B=0}return B}}; +Ext.data.Record=function(A,B){this.id=(B||B===0)?B:++Ext.data.Record.AUTO_ID;this.data=A};Ext.data.Record.create=function(E){var C=Ext.extend(Ext.data.Record,{});var D=C.prototype;D.fields=new Ext.util.MixedCollection(false,function(F){return F.name});for(var B=0,A=E.length;BG?1:(H0},isExpandable:function(){return this.attributes.expandable||this.hasChildNodes()},appendChild:function(E){var F=false;if(Ext.isArray(E)){F=E}else{if(arguments.length>1){F=arguments}}if(F){for(var D=0,A=F.length;D0){var F=D?function(){E.apply(D,arguments)}:E;C.sort(F);for(var B=0;BG+L.left){H=G-I-this.shadowOffset;E=true}if((F+D)>C+L.top){F=C-D-this.shadowOffset;E=true}if(H=J){F=J-D-5}}K=[H,F];this.storeXY(K);A.setXY.call(this,K);this.sync()}}},isVisible:function(){return this.visible},showAction:function(){this.visible=true;if(this.useDisplay===true){this.setDisplayed("")}else{if(this.lastXY){A.setXY.call(this,this.lastXY)}else{if(this.lastLT){A.setLeftTop.call(this,this.lastLT[0],this.lastLT[1])}}}},hideAction:function(){this.visible=false;if(this.useDisplay===true){this.setDisplayed(false)}else{this.setLeftTop(-10000,-10000)}},setVisible:function(E,D,G,H,F){if(E){this.showAction()}if(D&&E){var C=function(){this.sync(true);if(H){H()}}.createDelegate(this);A.setVisible.call(this,true,true,G,C,F)}else{if(!E){this.hideUnders(true)}var C=H;if(D){C=function(){this.hideAction();if(H){H()}}.createDelegate(this)}A.setVisible.call(this,E,D,G,C,F);if(E){this.sync(true)}else{if(!D){this.hideAction()}}}},storeXY:function(C){delete this.lastLT;this.lastXY=C},storeLeftTop:function(D,C){delete this.lastXY;this.lastLT=[D,C]},beforeFx:function(){this.beforeAction();return Ext.Layer.superclass.beforeFx.apply(this,arguments)},afterFx:function(){Ext.Layer.superclass.afterFx.apply(this,arguments);this.sync(this.isVisible())},beforeAction:function(){if(!this.updating&&this.shadow){this.shadow.hide()}},setLeft:function(C){this.storeLeftTop(C,this.getTop(true));A.setLeft.apply(this,arguments);this.sync()},setTop:function(C){this.storeLeftTop(this.getLeft(true),C);A.setTop.apply(this,arguments);this.sync()},setLeftTop:function(D,C){this.storeLeftTop(D,C);A.setLeftTop.apply(this,arguments);this.sync()},setXY:function(F,D,G,H,E){this.fixDisplay();this.beforeAction();this.storeXY(F);var C=this.createCB(H);A.setXY.call(this,F,D,G,C,E);if(!D){C()}},createCB:function(D){var C=this;return function(){C.constrainXY();C.sync(true);if(D){D()}}},setX:function(C,D,F,G,E){this.setXY([C,this.getY()],D,F,G,E)},setY:function(G,C,E,F,D){this.setXY([this.getX(),G],C,E,F,D)},setSize:function(E,F,D,H,I,G){this.beforeAction();var C=this.createCB(I);A.setSize.call(this,E,F,D,H,C,G);if(!D){C()}},setWidth:function(E,D,G,H,F){this.beforeAction();var C=this.createCB(H);A.setWidth.call(this,E,D,G,C,F);if(!D){C()}},setHeight:function(E,D,G,H,F){this.beforeAction();var C=this.createCB(H);A.setHeight.call(this,E,D,G,C,F);if(!D){C()}},setBounds:function(J,H,K,D,I,F,G,E){this.beforeAction();var C=this.createCB(G);if(!I){this.storeXY([J,H]);A.setXY.call(this,[J,H]);A.setSize.call(this,K,D,I,F,C,E);C()}else{A.setBounds.call(this,J,H,K,D,I,F,C,E)}return this},setZIndex:function(C){this.zindex=C;this.setStyle("z-index",C+2);if(this.shadow){this.shadow.setZIndex(C+1)}if(this.shim){this.shim.setStyle("z-index",C)}}})})(); +Ext.Shadow=function(C){Ext.apply(this,C);if(typeof this.mode!="string"){this.mode=this.defaultMode}var D=this.offset,B={h:0};var A=Math.floor(this.offset/2);switch(this.mode.toLowerCase()){case"drop":B.w=0;B.l=B.t=D;B.t-=1;if(Ext.isIE){B.l-=this.offset+A;B.t-=this.offset+A;B.w-=A;B.h-=A;B.t+=1}break;case"sides":B.w=(D*2);B.l=-D;B.t=D-1;if(Ext.isIE){B.l-=(this.offset-A);B.t-=this.offset+A;B.l+=1;B.w-=(this.offset-A)*2;B.w-=A+1;B.h-=1}break;case"frame":B.w=B.h=(D*2);B.l=B.t=-D;B.t+=1;B.h-=2;if(Ext.isIE){B.l-=(this.offset-A);B.t-=(this.offset-A);B.l+=1;B.w-=(this.offset+A+1);B.h-=(this.offset+A);B.h+=1}break}this.adjusts=B};Ext.Shadow.prototype={offset:4,defaultMode:"drop",show:function(A){A=Ext.get(A);if(!this.el){this.el=Ext.Shadow.Pool.pull();if(this.el.dom.nextSibling!=A.dom){this.el.insertBefore(A)}}this.el.setStyle("z-index",this.zIndex||parseInt(A.getStyle("z-index"),10)-1);if(Ext.isIE){this.el.dom.style.filter="progid:DXImageTransform.Microsoft.alpha(opacity=50) progid:DXImageTransform.Microsoft.Blur(pixelradius="+(this.offset)+")"}this.realign(A.getLeft(true),A.getTop(true),A.getWidth(),A.getHeight());this.el.dom.style.display="block"},isVisible:function(){return this.el?true:false},realign:function(A,M,L,D){if(!this.el){return }var I=this.adjusts,G=this.el.dom,N=G.style;var E=0;N.left=(A+I.l)+"px";N.top=(M+I.t)+"px";var K=(L+I.w),C=(D+I.h),F=K+"px",J=C+"px";if(N.width!=F||N.height!=J){N.width=F;N.height=J;if(!Ext.isIE){var H=G.childNodes;var B=Math.max(0,(K-12))+"px";H[0].childNodes[1].style.width=B;H[1].childNodes[1].style.width=B;H[2].childNodes[1].style.width=B;H[1].style.height=Math.max(0,(C-12))+"px"}}},hide:function(){if(this.el){this.el.dom.style.display="none";Ext.Shadow.Pool.push(this.el);delete this.el}},setZIndex:function(A){this.zIndex=A;if(this.el){this.el.setStyle("z-index",A)}}};Ext.Shadow.Pool=function(){var B=[];var A=Ext.isIE?"
    ":"
    ";return{pull:function(){var C=B.shift();if(!C){C=Ext.get(Ext.DomHelper.insertHtml("beforeBegin",document.body.firstChild,A));C.autoBoxAdjust=false}return C},push:function(C){B.push(C)}}}(); +Ext.BoxComponent=Ext.extend(Ext.Component,{initComponent:function(){Ext.BoxComponent.superclass.initComponent.call(this);this.addEvents("resize","move")},boxReady:false,deferHeight:false,setSize:function(B,D){if(typeof B=="object"){D=B.height;B=B.width}if(!this.boxReady){this.width=B;this.height=D;return this}if(this.lastSize&&this.lastSize.width==B&&this.lastSize.height==D){return this}this.lastSize={width:B,height:D};var C=this.adjustSize(B,D);var F=C.width,A=C.height;if(F!==undefined||A!==undefined){var E=this.getResizeEl();if(!this.deferHeight&&F!==undefined&&A!==undefined){E.setSize(F,A)}else{if(!this.deferHeight&&A!==undefined){E.setHeight(A)}else{if(F!==undefined){E.setWidth(F)}}}this.onResize(F,A,B,D);this.fireEvent("resize",this,F,A,B,D)}return this},setWidth:function(A){return this.setSize(A)},setHeight:function(A){return this.setSize(undefined,A)},getSize:function(){return this.el.getSize()},getPosition:function(A){if(A===true){return[this.el.getLeft(true),this.el.getTop(true)]}return this.xy||this.el.getXY()},getBox:function(A){var B=this.el.getSize();if(A===true){B.x=this.el.getLeft(true);B.y=this.el.getTop(true)}else{var C=this.xy||this.el.getXY();B.x=C[0];B.y=C[1]}return B},updateBox:function(A){this.setSize(A.width,A.height);this.setPagePosition(A.x,A.y);return this},getResizeEl:function(){return this.resizeEl||this.el},getPositionEl:function(){return this.positionEl||this.el},setPosition:function(A,F){if(A&&typeof A[1]=="number"){F=A[1];A=A[0]}this.x=A;this.y=F;if(!this.boxReady){return this}var B=this.adjustPosition(A,F);var E=B.x,D=B.y;var C=this.getPositionEl();if(E!==undefined||D!==undefined){if(E!==undefined&&D!==undefined){C.setLeftTop(E,D)}else{if(E!==undefined){C.setLeft(E)}else{if(D!==undefined){C.setTop(D)}}}this.onPosition(E,D);this.fireEvent("move",this,E,D)}return this},setPagePosition:function(A,C){if(A&&typeof A[1]=="number"){C=A[1];A=A[0]}this.pageX=A;this.pageY=C;if(!this.boxReady){return }if(A===undefined||C===undefined){return }var B=this.el.translatePoints(A,C);this.setPosition(B.left,B.top);return this},onRender:function(B,A){Ext.BoxComponent.superclass.onRender.call(this,B,A);if(this.resizeEl){this.resizeEl=Ext.get(this.resizeEl)}if(this.positionEl){this.positionEl=Ext.get(this.positionEl)}},afterRender:function(){Ext.BoxComponent.superclass.afterRender.call(this);this.boxReady=true;this.setSize(this.width,this.height);if(this.x||this.y){this.setPosition(this.x,this.y)}else{if(this.pageX||this.pageY){this.setPagePosition(this.pageX,this.pageY)}}},syncSize:function(){delete this.lastSize;this.setSize(this.autoWidth?undefined:this.el.getWidth(),this.autoHeight?undefined:this.el.getHeight());return this},onResize:function(D,B,A,C){},onPosition:function(A,B){},adjustSize:function(A,B){if(this.autoWidth){A="auto"}if(this.autoHeight){B="auto"}return{width:A,height:B}},adjustPosition:function(A,B){return{x:A,y:B}}});Ext.reg("box",Ext.BoxComponent); +Ext.SplitBar=function(C,E,B,D,A){this.el=Ext.get(C,true);this.el.dom.unselectable="on";this.resizingEl=Ext.get(E,true);this.orientation=B||Ext.SplitBar.HORIZONTAL;this.minSize=0;this.maxSize=2000;this.animate=false;this.useShim=false;this.shim=null;if(!A){this.proxy=Ext.SplitBar.createProxy(this.orientation)}else{this.proxy=Ext.get(A).dom}this.dd=new Ext.dd.DDProxy(this.el.dom.id,"XSplitBars",{dragElId:this.proxy.id});this.dd.b4StartDrag=this.onStartProxyDrag.createDelegate(this);this.dd.endDrag=this.onEndProxyDrag.createDelegate(this);this.dragSpecs={};this.adapter=new Ext.SplitBar.BasicLayoutAdapter();this.adapter.init(this);if(this.orientation==Ext.SplitBar.HORIZONTAL){this.placement=D||(this.el.getX()>this.resizingEl.getX()?Ext.SplitBar.LEFT:Ext.SplitBar.RIGHT);this.el.addClass("x-splitbar-h")}else{this.placement=D||(this.el.getY()>this.resizingEl.getY()?Ext.SplitBar.TOP:Ext.SplitBar.BOTTOM);this.el.addClass("x-splitbar-v")}this.addEvents("resize","moved","beforeresize","beforeapply");Ext.SplitBar.superclass.constructor.call(this)};Ext.extend(Ext.SplitBar,Ext.util.Observable,{onStartProxyDrag:function(A,E){this.fireEvent("beforeresize",this);this.overlay=Ext.DomHelper.append(document.body,{cls:"x-drag-overlay",html:" "},true);this.overlay.unselectable();this.overlay.setSize(Ext.lib.Dom.getViewWidth(true),Ext.lib.Dom.getViewHeight(true));this.overlay.show();Ext.get(this.proxy).setDisplayed("block");var C=this.adapter.getElementSize(this);this.activeMinSize=this.getMinimumSize();this.activeMaxSize=this.getMaximumSize();var D=C-this.activeMinSize;var B=Math.max(this.activeMaxSize-C,0);if(this.orientation==Ext.SplitBar.HORIZONTAL){this.dd.resetConstraints();this.dd.setXConstraint(this.placement==Ext.SplitBar.LEFT?D:B,this.placement==Ext.SplitBar.LEFT?B:D);this.dd.setYConstraint(0,0)}else{this.dd.resetConstraints();this.dd.setXConstraint(0,0);this.dd.setYConstraint(this.placement==Ext.SplitBar.TOP?D:B,this.placement==Ext.SplitBar.TOP?B:D)}this.dragSpecs.startSize=C;this.dragSpecs.startPoint=[A,E];Ext.dd.DDProxy.prototype.b4StartDrag.call(this.dd,A,E)},onEndProxyDrag:function(C){Ext.get(this.proxy).setDisplayed(false);var B=Ext.lib.Event.getXY(C);if(this.overlay){this.overlay.remove();delete this.overlay}var A;if(this.orientation==Ext.SplitBar.HORIZONTAL){A=this.dragSpecs.startSize+(this.placement==Ext.SplitBar.LEFT?B[0]-this.dragSpecs.startPoint[0]:this.dragSpecs.startPoint[0]-B[0])}else{A=this.dragSpecs.startSize+(this.placement==Ext.SplitBar.TOP?B[1]-this.dragSpecs.startPoint[1]:this.dragSpecs.startPoint[1]-B[1])}A=Math.min(Math.max(A,this.activeMinSize),this.activeMaxSize);if(A!=this.dragSpecs.startSize){if(this.fireEvent("beforeapply",this,A)!==false){this.adapter.setElementSize(this,A);this.fireEvent("moved",this,A);this.fireEvent("resize",this,A)}}},getAdapter:function(){return this.adapter},setAdapter:function(A){this.adapter=A;this.adapter.init(this)},getMinimumSize:function(){return this.minSize},setMinimumSize:function(A){this.minSize=A},getMaximumSize:function(){return this.maxSize},setMaximumSize:function(A){this.maxSize=A},setCurrentSize:function(B){var A=this.animate;this.animate=false;this.adapter.setElementSize(this,B);this.animate=A},destroy:function(A){if(this.shim){this.shim.remove()}this.dd.unreg();Ext.removeNode(this.proxy);if(A){this.el.remove()}}});Ext.SplitBar.createProxy=function(B){var C=new Ext.Element(document.createElement("div"));C.unselectable();var A="x-splitbar-proxy";C.addClass(A+" "+(B==Ext.SplitBar.HORIZONTAL?A+"-h":A+"-v"));document.body.appendChild(C.dom);return C.dom};Ext.SplitBar.BasicLayoutAdapter=function(){};Ext.SplitBar.BasicLayoutAdapter.prototype={init:function(A){},getElementSize:function(A){if(A.orientation==Ext.SplitBar.HORIZONTAL){return A.resizingEl.getWidth()}else{return A.resizingEl.getHeight()}},setElementSize:function(B,A,C){if(B.orientation==Ext.SplitBar.HORIZONTAL){if(!B.animate){B.resizingEl.setWidth(A);if(C){C(B,A)}}else{B.resizingEl.setWidth(A,true,0.1,C,"easeOut")}}else{if(!B.animate){B.resizingEl.setHeight(A);if(C){C(B,A)}}else{B.resizingEl.setHeight(A,true,0.1,C,"easeOut")}}}};Ext.SplitBar.AbsoluteLayoutAdapter=function(A){this.basic=new Ext.SplitBar.BasicLayoutAdapter();this.container=Ext.get(A)};Ext.SplitBar.AbsoluteLayoutAdapter.prototype={init:function(A){this.basic.init(A)},getElementSize:function(A){return this.basic.getElementSize(A)},setElementSize:function(B,A,C){this.basic.setElementSize(B,A,this.moveSplitter.createDelegate(this,[B]))},moveSplitter:function(A){var B=Ext.SplitBar;switch(A.placement){case B.LEFT:A.el.setX(A.resizingEl.getRight());break;case B.RIGHT:A.el.setStyle("right",(this.container.getWidth()-A.resizingEl.getLeft())+"px");break;case B.TOP:A.el.setY(A.resizingEl.getBottom());break;case B.BOTTOM:A.el.setY(A.resizingEl.getTop()-A.el.getHeight());break}}};Ext.SplitBar.VERTICAL=1;Ext.SplitBar.HORIZONTAL=2;Ext.SplitBar.LEFT=1;Ext.SplitBar.RIGHT=2;Ext.SplitBar.TOP=3;Ext.SplitBar.BOTTOM=4; +Ext.Container=Ext.extend(Ext.BoxComponent,{autoDestroy:true,defaultType:"panel",initComponent:function(){Ext.Container.superclass.initComponent.call(this);this.addEvents("afterlayout","beforeadd","beforeremove","add","remove");var A=this.items;if(A){delete this.items;if(Ext.isArray(A)){this.add.apply(this,A)}else{this.add(A)}}},initItems:function(){if(!this.items){this.items=new Ext.util.MixedCollection(false,this.getComponentId);this.getLayout()}},setLayout:function(A){if(this.layout&&this.layout!=A){this.layout.setContainer(null)}this.initItems();this.layout=A;A.setContainer(this)},render:function(){Ext.Container.superclass.render.apply(this,arguments);if(this.layout){if(typeof this.layout=="string"){this.layout=new Ext.Container.LAYOUTS[this.layout.toLowerCase()](this.layoutConfig)}this.setLayout(this.layout);if(this.activeItem!==undefined){var A=this.activeItem;delete this.activeItem;this.layout.setActiveItem(A);return }}if(!this.ownerCt){this.doLayout()}if(this.monitorResize===true){Ext.EventManager.onWindowResize(this.doLayout,this,[false])}},getLayoutTarget:function(){return this.el},getComponentId:function(A){return A.itemId||A.id},add:function(C){if(!this.items){this.initItems()}var B=arguments,A=B.length;if(A>1){for(var D=0;D2){for(var E=A-1;E>=1;--E){this.insert(D,B[E])}return }var F=this.lookupComponent(this.applyDefaults(C));if(F.ownerCt==this&&this.items.indexOf(F)0){B.setSize(A)}}});Ext.Container.LAYOUTS["fit"]=Ext.layout.FitLayout; +Ext.layout.CardLayout=Ext.extend(Ext.layout.FitLayout,{deferredRender:false,renderHidden:true,setActiveItem:function(A){A=this.container.getComponent(A);if(this.activeItem!=A){if(this.activeItem){this.activeItem.hide()}this.activeItem=A;A.show();this.layout()}},renderAll:function(A,B){if(this.deferredRender){this.renderItem(this.activeItem,undefined,B)}else{Ext.layout.CardLayout.superclass.renderAll.call(this,A,B)}}});Ext.Container.LAYOUTS["card"]=Ext.layout.CardLayout; +Ext.layout.AnchorLayout=Ext.extend(Ext.layout.ContainerLayout,{monitorResize:true,getAnchorViewSize:function(A,B){return B.dom==document.body?B.getViewSize():B.getStyleSize()},onLayout:function(F,I){Ext.layout.AnchorLayout.superclass.onLayout.call(this,F,I);var O=this.getAnchorViewSize(F,I);var M=O.width,E=O.height;if(M<20||E<20){return }var B,K;if(F.anchorSize){if(typeof F.anchorSize=="number"){B=F.anchorSize}else{B=F.anchorSize.width;K=F.anchorSize.height}}else{B=F.initialConfig.width;K=F.initialConfig.height}var H=F.items.items,G=H.length,D,J,L,C,A;for(D=0;D ");B.disableFormats=true;B.compile();Ext.layout.BorderLayout.Region.prototype.toolTemplate=B}this.collapsedEl=this.targetEl.createChild({cls:"x-layout-collapsed x-layout-collapsed-"+this.position,id:this.panel.id+"-xcollapsed"});this.collapsedEl.enableDisplayMode("block");if(this.collapseMode=="mini"){this.collapsedEl.addClass("x-layout-cmini-"+this.position);this.miniCollapsedEl=this.collapsedEl.createChild({cls:"x-layout-mini x-layout-mini-"+this.position,html:" "});this.miniCollapsedEl.addClassOnOver("x-layout-mini-over");this.collapsedEl.addClassOnOver("x-layout-collapsed-over");this.collapsedEl.on("click",this.onExpandClick,this,{stopEvent:true})}else{var A=this.toolTemplate.append(this.collapsedEl.dom,{id:"expand-"+this.position},true);A.addClassOnOver("x-tool-expand-"+this.position+"-over");A.on("click",this.onExpandClick,this,{stopEvent:true});if(this.floatable!==false){this.collapsedEl.addClassOnOver("x-layout-collapsed-over");this.collapsedEl.on("click",this.collapseClick,this)}}}return this.collapsedEl},onExpandClick:function(A){if(this.isSlid){this.afterSlideIn();this.panel.expand(false)}else{this.panel.expand()}},onCollapseClick:function(A){this.panel.collapse()},beforeCollapse:function(B,A){this.lastAnim=A;if(this.splitEl){this.splitEl.hide()}this.getCollapsedEl().show();this.panel.el.setStyle("z-index",100);this.isCollapsed=true;this.layout.layout()},onCollapse:function(A){this.panel.el.setStyle("z-index",1);if(this.lastAnim===false||this.panel.animCollapse===false){this.getCollapsedEl().dom.style.visibility="visible"}else{this.getCollapsedEl().slideIn(this.panel.slideAnchor,{duration:0.2})}this.state.collapsed=true;this.panel.saveState()},beforeExpand:function(A){var B=this.getCollapsedEl();this.el.show();if(this.position=="east"||this.position=="west"){this.panel.setSize(undefined,B.getHeight())}else{this.panel.setSize(B.getWidth(),undefined)}B.hide();B.dom.style.visibility="hidden";this.panel.el.setStyle("z-index",100)},onExpand:function(){this.isCollapsed=false;if(this.splitEl){this.splitEl.show()}this.layout.layout();this.panel.el.setStyle("z-index",1);this.state.collapsed=false;this.panel.saveState()},collapseClick:function(A){if(this.isSlid){A.stopPropagation();this.slideIn()}else{A.stopPropagation();this.slideOut()}},onHide:function(){if(this.isCollapsed){this.getCollapsedEl().hide()}else{if(this.splitEl){this.splitEl.hide()}}},onShow:function(){if(this.isCollapsed){this.getCollapsedEl().show()}else{if(this.splitEl){this.splitEl.show()}}},isVisible:function(){return !this.panel.hidden},getMargins:function(){return this.isCollapsed&&this.cmargins?this.cmargins:this.margins},getSize:function(){return this.isCollapsed?this.getCollapsedEl().getSize():this.panel.getSize()},setPanel:function(A){this.panel=A},getMinWidth:function(){return this.minWidth},getMinHeight:function(){return this.minHeight},applyLayoutCollapsed:function(A){var B=this.getCollapsedEl();B.setLeftTop(A.x,A.y);B.setSize(A.width,A.height)},applyLayout:function(A){if(this.isCollapsed){this.applyLayoutCollapsed(A)}else{this.panel.setPosition(A.x,A.y);this.panel.setSize(A.width,A.height)}},beforeSlide:function(){this.panel.beforeEffect()},afterSlide:function(){this.panel.afterEffect()},initAutoHide:function(){if(this.autoHide!==false){if(!this.autoHideHd){var A=new Ext.util.DelayedTask(this.slideIn,this);this.autoHideHd={"mouseout":function(B){if(!B.within(this.el,true)){A.delay(500)}},"mouseover":function(B){A.cancel()},scope:this}}this.el.on(this.autoHideHd)}},clearAutoHide:function(){if(this.autoHide!==false){this.el.un("mouseout",this.autoHideHd.mouseout);this.el.un("mouseover",this.autoHideHd.mouseover)}},clearMonitor:function(){Ext.getDoc().un("click",this.slideInIf,this)},slideOut:function(){if(this.isSlid||this.el.hasActiveFx()){return }this.isSlid=true;var A=this.panel.tools;if(A&&A.toggle){A.toggle.hide()}this.el.show();if(this.position=="east"||this.position=="west"){this.panel.setSize(undefined,this.collapsedEl.getHeight())}else{this.panel.setSize(this.collapsedEl.getWidth(),undefined)}this.restoreLT=[this.el.dom.style.left,this.el.dom.style.top];this.el.alignTo(this.collapsedEl,this.getCollapseAnchor());this.el.setStyle("z-index",102);if(this.animFloat!==false){this.beforeSlide();this.el.slideIn(this.getSlideAnchor(),{callback:function(){this.afterSlide();this.initAutoHide();Ext.getDoc().on("click",this.slideInIf,this)},scope:this,block:true})}else{this.initAutoHide();Ext.getDoc().on("click",this.slideInIf,this)}},afterSlideIn:function(){this.clearAutoHide();this.isSlid=false;this.clearMonitor();this.el.setStyle("z-index","");this.el.dom.style.left=this.restoreLT[0];this.el.dom.style.top=this.restoreLT[1];var A=this.panel.tools;if(A&&A.toggle){A.toggle.show()}},slideIn:function(A){if(!this.isSlid||this.el.hasActiveFx()){Ext.callback(A);return }this.isSlid=false;if(this.animFloat!==false){this.beforeSlide();this.el.slideOut(this.getSlideAnchor(),{callback:function(){this.el.hide();this.afterSlide();this.afterSlideIn();Ext.callback(A)},scope:this,block:true})}else{this.el.hide();this.afterSlideIn()}},slideInIf:function(A){if(!A.within(this.el)){this.slideIn()}},anchors:{"west":"left","east":"right","north":"top","south":"bottom"},sanchors:{"west":"l","east":"r","north":"t","south":"b"},canchors:{"west":"tl-tr","east":"tr-tl","north":"tl-bl","south":"bl-tl"},getAnchor:function(){return this.anchors[this.position]},getCollapseAnchor:function(){return this.canchors[this.position]},getSlideAnchor:function(){return this.sanchors[this.position]},getAlignAdj:function(){var A=this.cmargins;switch(this.position){case"west":return[0,0];break;case"east":return[0,0];break;case"north":return[0,0];break;case"south":return[0,0];break}},getExpandAdj:function(){var B=this.collapsedEl,A=this.cmargins;switch(this.position){case"west":return[-(A.right+B.getWidth()+A.left),0];break;case"east":return[A.right+B.getWidth()+A.left,0];break;case"north":return[0,-(A.top+A.bottom+B.getHeight())];break;case"south":return[0,A.top+A.bottom+B.getHeight()];break}}};Ext.layout.BorderLayout.SplitRegion=function(B,A,C){Ext.layout.BorderLayout.SplitRegion.superclass.constructor.call(this,B,A,C);this.applyLayout=this.applyFns[C]};Ext.extend(Ext.layout.BorderLayout.SplitRegion,Ext.layout.BorderLayout.Region,{splitTip:"Drag to resize.",collapsibleSplitTip:"Drag to resize. Double click to hide.",useSplitTips:false,splitSettings:{north:{orientation:Ext.SplitBar.VERTICAL,placement:Ext.SplitBar.TOP,maxFn:"getVMaxSize",minProp:"minHeight",maxProp:"maxHeight"},south:{orientation:Ext.SplitBar.VERTICAL,placement:Ext.SplitBar.BOTTOM,maxFn:"getVMaxSize",minProp:"minHeight",maxProp:"maxHeight"},east:{orientation:Ext.SplitBar.HORIZONTAL,placement:Ext.SplitBar.RIGHT,maxFn:"getHMaxSize",minProp:"minWidth",maxProp:"maxWidth"},west:{orientation:Ext.SplitBar.HORIZONTAL,placement:Ext.SplitBar.LEFT,maxFn:"getHMaxSize",minProp:"minWidth",maxProp:"maxWidth"}},applyFns:{west:function(C){if(this.isCollapsed){return this.applyLayoutCollapsed(C)}var D=this.splitEl.dom,B=D.style;this.panel.setPosition(C.x,C.y);var A=D.offsetWidth;B.left=(C.x+C.width-A)+"px";B.top=(C.y)+"px";B.height=Math.max(0,C.height)+"px";this.panel.setSize(C.width-A,C.height)},east:function(C){if(this.isCollapsed){return this.applyLayoutCollapsed(C)}var D=this.splitEl.dom,B=D.style;var A=D.offsetWidth;this.panel.setPosition(C.x+A,C.y);B.left=(C.x)+"px";B.top=(C.y)+"px";B.height=Math.max(0,C.height)+"px";this.panel.setSize(C.width-A,C.height)},north:function(C){if(this.isCollapsed){return this.applyLayoutCollapsed(C)}var D=this.splitEl.dom,B=D.style;var A=D.offsetHeight;this.panel.setPosition(C.x,C.y);B.left=(C.x)+"px";B.top=(C.y+C.height-A)+"px";B.width=Math.max(0,C.width)+"px";this.panel.setSize(C.width,C.height-A)},south:function(C){if(this.isCollapsed){return this.applyLayoutCollapsed(C)}var D=this.splitEl.dom,B=D.style;var A=D.offsetHeight;this.panel.setPosition(C.x,C.y+A);B.left=(C.x)+"px";B.top=(C.y)+"px";B.width=Math.max(0,C.width)+"px";this.panel.setSize(C.width,C.height-A)}},render:function(A,C){Ext.layout.BorderLayout.SplitRegion.superclass.render.call(this,A,C);var D=this.position;this.splitEl=A.createChild({cls:"x-layout-split x-layout-split-"+D,html:" ",id:this.panel.id+"-xsplit"});if(this.collapseMode=="mini"){this.miniSplitEl=this.splitEl.createChild({cls:"x-layout-mini x-layout-mini-"+D,html:" "});this.miniSplitEl.addClassOnOver("x-layout-mini-over");this.miniSplitEl.on("click",this.onCollapseClick,this,{stopEvent:true})}var B=this.splitSettings[D];this.split=new Ext.SplitBar(this.splitEl.dom,C.el,B.orientation);this.split.placement=B.placement;this.split.getMaximumSize=this[B.maxFn].createDelegate(this);this.split.minSize=this.minSize||this[B.minProp];this.split.on("beforeapply",this.onSplitMove,this);this.split.useShim=this.useShim===true;this.maxSize=this.maxSize||this[B.maxProp];if(C.hidden){this.splitEl.hide()}if(this.useSplitTips){this.splitEl.dom.title=this.collapsible?this.collapsibleSplitTip:this.splitTip}if(this.collapsible){this.splitEl.on("dblclick",this.onCollapseClick,this)}},getSize:function(){if(this.isCollapsed){return this.collapsedEl.getSize()}var A=this.panel.getSize();if(this.position=="north"||this.position=="south"){A.height+=this.splitEl.dom.offsetHeight}else{A.width+=this.splitEl.dom.offsetWidth}return A},getHMaxSize:function(){var B=this.maxSize||10000;var A=this.layout.center;return Math.min(B,(this.el.getWidth()+A.el.getWidth())-A.getMinWidth())},getVMaxSize:function(){var B=this.maxSize||10000;var A=this.layout.center;return Math.min(B,(this.el.getHeight()+A.el.getHeight())-A.getMinHeight())},onSplitMove:function(B,A){var C=this.panel.getSize();this.lastSplitSize=A;if(this.position=="north"||this.position=="south"){this.panel.setSize(C.width,A);this.state.height=A}else{this.panel.setSize(A,C.height);this.state.width=A}this.layout.layout();this.panel.saveState();return false},getSplitBar:function(){return this.split}});Ext.Container.LAYOUTS["border"]=Ext.layout.BorderLayout; +Ext.layout.FormLayout=Ext.extend(Ext.layout.AnchorLayout,{labelSeparator:":",getAnchorViewSize:function(A,B){return A.body.getStyleSize()},setContainer:function(B){Ext.layout.FormLayout.superclass.setContainer.call(this,B);if(B.labelAlign){B.addClass("x-form-label-"+B.labelAlign)}if(B.hideLabels){this.labelStyle="display:none";this.elementStyle="padding-left:0;";this.labelAdjust=0}else{this.labelSeparator=B.labelSeparator||this.labelSeparator;B.labelWidth=B.labelWidth||100;if(typeof B.labelWidth=="number"){var C=(typeof B.labelPad=="number"?B.labelPad:5);this.labelAdjust=B.labelWidth+C;this.labelStyle="width:"+B.labelWidth+"px;";this.elementStyle="padding-left:"+(B.labelWidth+C)+"px"}if(B.labelAlign=="top"){this.labelStyle="width:auto;";this.labelAdjust=0;this.elementStyle="padding-left:0;"}}if(!this.fieldTpl){var A=new Ext.Template("
    ","","
    ","
    ","
    ");A.disableFormats=true;A.compile();Ext.layout.FormLayout.prototype.fieldTpl=A}},renderItem:function(D,A,C){if(D&&!D.rendered&&D.isFormField&&D.inputType!="hidden"){var B=[D.id,D.fieldLabel,D.labelStyle||this.labelStyle||"",this.elementStyle||"",typeof D.labelSeparator=="undefined"?this.labelSeparator:D.labelSeparator,(D.itemCls||this.container.itemCls||"")+(D.hideLabel?" x-hide-label":""),D.clearCls||"x-form-clear-left"];if(typeof A=="number"){A=C.dom.childNodes[A]||null}if(A){this.fieldTpl.insertBefore(A,B)}else{this.fieldTpl.append(C,B)}D.render("x-form-el-"+D.id)}else{Ext.layout.FormLayout.superclass.renderItem.apply(this,arguments)}},adjustWidthAnchor:function(B,A){return B-(A.isFormField?(A.hideLabel?0:this.labelAdjust):0)},isValidParent:function(B,A){return true}});Ext.Container.LAYOUTS["form"]=Ext.layout.FormLayout; +Ext.layout.Accordion=Ext.extend(Ext.layout.FitLayout,{fill:true,autoWidth:true,titleCollapse:true,hideCollapseTool:false,collapseFirst:false,animate:false,sequence:false,activeOnTop:false,renderItem:function(A){if(this.animate===false){A.animCollapse=false}A.collapsible=true;if(this.autoWidth){A.autoWidth=true}if(this.titleCollapse){A.titleCollapse=true}if(this.hideCollapseTool){A.hideCollapseTool=true}if(this.collapseFirst!==undefined){A.collapseFirst=this.collapseFirst}if(!this.activeItem&&!A.collapsed){this.activeItem=A}else{if(this.activeItem){A.collapsed=true}}Ext.layout.Accordion.superclass.renderItem.apply(this,arguments);A.header.addClass("x-accordion-hd");A.on("beforeexpand",this.beforeExpand,this)},beforeExpand:function(C,B){var A=this.activeItem;if(A){if(this.sequence){delete this.activeItem;if(!A.collapsed){A.collapse({callback:function(){C.expand(B||true)},scope:this});return false}}else{A.collapse(this.animate)}}this.activeItem=C;if(this.activeOnTop){C.el.dom.parentNode.insertBefore(C.el.dom,C.el.dom.parentNode.firstChild)}this.layout()},setItemSize:function(F,E){if(this.fill&&F){var B=this.container.items.items;var D=0;for(var C=0,A=B.length;C=B)||(this.cells[C]&&this.cells[C][A])){if(B&&A>=B){C++;A=0}else{A++}}return[A,C]},renderItem:function(C,A,B){if(C&&!C.rendered){C.render(this.getNextCell(C))}},isValidParent:function(B,A){return true}});Ext.Container.LAYOUTS["table"]=Ext.layout.TableLayout; +Ext.layout.AbsoluteLayout=Ext.extend(Ext.layout.AnchorLayout,{extraCls:"x-abs-layout-item",isForm:false,setContainer:function(A){Ext.layout.AbsoluteLayout.superclass.setContainer.call(this,A);if(A.isXType("form")){this.isForm=true}},onLayout:function(A,B){if(this.isForm){A.body.position()}else{B.position()}Ext.layout.AbsoluteLayout.superclass.onLayout.call(this,A,B)},getAnchorViewSize:function(A,B){return this.isForm?A.body.getStyleSize():Ext.layout.AbsoluteLayout.superclass.getAnchorViewSize.call(this,A,B)},isValidParent:function(B,A){return this.isForm?true:Ext.layout.AbsoluteLayout.superclass.isValidParent.call(this,B,A)},adjustWidthAnchor:function(B,A){return B?B-A.getPosition(true)[0]:B},adjustHeightAnchor:function(B,A){return B?B-A.getPosition(true)[1]:B}});Ext.Container.LAYOUTS["absolute"]=Ext.layout.AbsoluteLayout; +Ext.Viewport=Ext.extend(Ext.Container,{initComponent:function(){Ext.Viewport.superclass.initComponent.call(this);document.getElementsByTagName("html")[0].className+=" x-viewport";this.el=Ext.getBody();this.el.setHeight=Ext.emptyFn;this.el.setWidth=Ext.emptyFn;this.el.setSize=Ext.emptyFn;this.el.dom.scroll="no";this.allowDomMove=false;this.autoWidth=true;this.autoHeight=true;Ext.EventManager.onWindowResize(this.fireResize,this);this.renderTo=this.el},fireResize:function(A,B){this.fireEvent("resize",this,A,B,A,B)}});Ext.reg("viewport",Ext.Viewport); +Ext.Panel=Ext.extend(Ext.Container,{baseCls:"x-panel",collapsedCls:"x-panel-collapsed",maskDisabled:true,animCollapse:Ext.enableFx,headerAsText:true,buttonAlign:"right",collapsed:false,collapseFirst:true,minButtonWidth:75,elements:"body",toolTarget:"header",collapseEl:"bwrap",slideAnchor:"t",disabledClass:"",deferHeight:true,expandDefaults:{duration:0.25},collapseDefaults:{duration:0.25},initComponent:function(){Ext.Panel.superclass.initComponent.call(this);this.addEvents("bodyresize","titlechange","collapse","expand","beforecollapse","beforeexpand","beforeclose","close","activate","deactivate");if(this.tbar){this.elements+=",tbar";if(typeof this.tbar=="object"){this.topToolbar=this.tbar}delete this.tbar}if(this.bbar){this.elements+=",bbar";if(typeof this.bbar=="object"){this.bottomToolbar=this.bbar}delete this.bbar}if(this.header===true){this.elements+=",header";delete this.header}else{if(this.title&&this.header!==false){this.elements+=",header"}}if(this.footer===true){this.elements+=",footer";delete this.footer}if(this.buttons){var C=this.buttons;this.buttons=[];for(var B=0,A=C.length;B"+this.header.dom.innerHTML+"";if(this.iconCls){this.setIconClass(this.iconCls)}}}if(this.floating){this.makeFloating(this.floating)}if(this.collapsible){this.tools=this.tools?this.tools.slice(0):[];if(!this.hideCollapseTool){this.tools[this.collapseFirst?"unshift":"push"]({id:"toggle",handler:this.toggleCollapse,scope:this})}if(this.titleCollapse&&this.header){this.header.on("click",this.toggleCollapse,this);this.header.setStyle("cursor","pointer")}}if(this.tools){var J=this.tools;this.tools={};this.addTool.apply(this,J)}else{this.tools={}}if(this.buttons&&this.buttons.length>0){var D=this.footer.createChild({cls:"x-panel-btns-ct",cn:{cls:"x-panel-btns x-panel-btns-"+this.buttonAlign,html:"
    "}},null,true);var L=D.getElementsByTagName("tr")[0];for(var F=0,I=this.buttons.length;F ");F.disableFormats=true;F.compile();Ext.Panel.prototype.toolTemplate=F}for(var E=0,C=arguments,B=C.length;E0){J.sort(C);var I=J[0].manager.zseed;for(var K=0;K=0;--H){if(!D[H].hidden){B(D[H]);return }}B(null)};return{zseed:9000,register:function(H){F[H.id]=H;D.push(H);H.on("hide",A)},unregister:function(H){delete F[H.id];H.un("hide",A);D.remove(H)},get:function(H){return typeof H=="object"?H:F[H]},bringToFront:function(H){H=this.get(H);if(H!=E){H._lastAccess=new Date().getTime();G();return true}return false},sendToBack:function(H){H=this.get(H);H._lastAccess=-(new Date().getTime());G();return H},hideAll:function(){for(var H in F){if(F[H]&&typeof F[H]!="function"&&F[H].isVisible()){F[H].hide()}}},getActive:function(){return E},getBy:function(J,I){var K=[];for(var H=D.length-1;H>=0;--H){var L=D[H];if(J.call(I||L,L)!==false){K.push(L)}}return K},each:function(I,H){for(var J in F){if(F[J]&&typeof F[J]!="function"){if(I.call(H||F[J],F[J])===false){return }}}}}};Ext.WindowMgr=new Ext.WindowGroup(); +Ext.dd.PanelProxy=function(A,B){this.panel=A;this.id=this.panel.id+"-ddproxy";Ext.apply(this,B)};Ext.dd.PanelProxy.prototype={insertProxy:true,setStatus:Ext.emptyFn,reset:Ext.emptyFn,update:Ext.emptyFn,stop:Ext.emptyFn,sync:Ext.emptyFn,getEl:function(){return this.ghost},getGhost:function(){return this.ghost},getProxy:function(){return this.proxy},hide:function(){if(this.ghost){if(this.proxy){this.proxy.remove();delete this.proxy}this.panel.el.dom.style.display="";this.ghost.remove();delete this.ghost}},show:function(){if(!this.ghost){this.ghost=this.panel.createGhost(undefined,undefined,Ext.getBody());this.ghost.setXY(this.panel.el.getXY());if(this.insertProxy){this.proxy=this.panel.el.insertSibling({cls:"x-panel-dd-spacer"});this.proxy.setSize(this.panel.getSize())}this.panel.el.dom.style.display="none"}},repair:function(B,C,A){this.hide();if(typeof C=="function"){C.call(A||this)}},moveProxy:function(A,B){if(this.proxy){A.insertBefore(this.proxy.dom,B)}}};Ext.Panel.DD=function(B,A){this.panel=B;this.dragData={panel:B};this.proxy=new Ext.dd.PanelProxy(B,A);Ext.Panel.DD.superclass.constructor.call(this,B.el,A);var C=B.header;if(C){this.setHandleElId(C.id)}(C?C:this.panel.body).setStyle("cursor","move");this.scroll=false};Ext.extend(Ext.Panel.DD,Ext.dd.DragSource,{showFrame:Ext.emptyFn,startDrag:Ext.emptyFn,b4StartDrag:function(A,B){this.proxy.show()},b4MouseDown:function(B){var A=B.getPageX();var C=B.getPageY();this.autoOffset(A,C)},onInitDrag:function(A,B){this.onStartDrag(A,B);return true},createFrame:Ext.emptyFn,getDragEl:function(A){return this.proxy.ghost.dom},endDrag:function(A){this.proxy.hide();this.panel.saveState()},autoOffset:function(A,B){A-=this.startPageX;B-=this.startPageY;this.setDelta(A,B)}}); +Ext.state.Provider=function(){this.addEvents("statechange");this.state={};Ext.state.Provider.superclass.constructor.call(this)};Ext.extend(Ext.state.Provider,Ext.util.Observable,{get:function(B,A){return typeof this.state[B]=="undefined"?A:this.state[B]},clear:function(A){delete this.state[A];this.fireEvent("statechange",this,A,null)},set:function(A,B){this.state[A]=B;this.fireEvent("statechange",this,A,B)},decodeValue:function(A){var J=/^(a|n|d|b|s|o)\:(.*)$/;var C=J.exec(unescape(A));if(!C||!C[1]){return }var F=C[1];var H=C[2];switch(F){case"n":return parseFloat(H);case"d":return new Date(Date.parse(H));case"b":return(H=="1");case"a":var G=[];var I=H.split("^");for(var B=0,D=I.length;B0){if(!B){this.selected.removeClass(this.selectedClass)}this.selected.clear();this.last=false;if(!A){this.fireEvent("selectionchange",this,this.selected.elements)}}},isSelected:function(A){return this.selected.contains(this.getNode(A))},deselect:function(A){if(this.isSelected(A)){A=this.getNode(A);this.selected.removeElement(A);if(this.last==A.viewIndex){this.last=false}Ext.fly(A).removeClass(this.selectedClass);this.fireEvent("selectionchange",this,this.selected.elements)}},select:function(D,F,B){if(Ext.isArray(D)){if(!F){this.clearSelections(true)}for(var C=0,A=D.length;C=A&&D[C];C--){B.push(D[C])}}return B},indexOf:function(A){A=this.getNode(A);if(typeof A.viewIndex=="number"){return A.viewIndex}return this.all.indexOf(A)},onBeforeLoad:function(){if(this.loadingText){this.clearSelections(false,true);this.el.update("
    "+this.loadingText+"
    ");this.all.clear()}},onDestroy:function(){Ext.DataView.superclass.onDestroy.call(this);this.setStore(null)}});Ext.reg("dataview",Ext.DataView); +Ext.ColorPalette=function(A){Ext.ColorPalette.superclass.constructor.call(this,A);this.addEvents("select");if(this.handler){this.on("select",this.handler,this.scope,true)}};Ext.extend(Ext.ColorPalette,Ext.Component,{itemCls:"x-color-palette",value:null,clickEvent:"click",ctype:"Ext.ColorPalette",allowReselect:false,colors:["000000","993300","333300","003300","003366","000080","333399","333333","800000","FF6600","808000","008000","008080","0000FF","666699","808080","FF0000","FF9900","99CC00","339966","33CCCC","3366FF","800080","969696","FF00FF","FFCC00","FFFF00","00FF00","00FFFF","00CCFF","993366","C0C0C0","FF99CC","FFCC99","FFFF99","CCFFCC","CCFFFF","99CCFF","CC99FF","FFFFFF"],onRender:function(B,A){var C=this.tpl||new Ext.XTemplate(" ");var D=document.createElement("div");D.className=this.itemCls;C.overwrite(D,this.colors);B.dom.insertBefore(D,A);this.el=Ext.get(D);this.el.on(this.clickEvent,this.handleClick,this,{delegate:"a"});if(this.clickEvent!="click"){this.el.on("click",Ext.emptyFn,this,{delegate:"a",preventDefault:true})}},afterRender:function(){Ext.ColorPalette.superclass.afterRender.call(this);if(this.value){var A=this.value;this.value=null;this.select(A)}},handleClick:function(B,A){B.preventDefault();if(!this.disabled){var C=A.className.match(/(?:^|\s)color-(.{6})(?:\s|$)/)[1];this.select(C.toUpperCase())}},select:function(A){A=A.replace("#","");if(A!=this.value||this.allowReselect){var B=this.el;if(this.value){B.child("a.color-"+this.value).removeClass("x-color-palette-sel")}B.child("a.color-"+A).addClass("x-color-palette-sel");this.value=A;this.fireEvent("select",this,A)}}});Ext.reg("colorpalette",Ext.ColorPalette); +Ext.DatePicker=Ext.extend(Ext.Component,{todayText:"Today",okText:" OK ",cancelText:"Cancel",todayTip:"{0} (Spacebar)",minText:"This date is before the minimum date",maxText:"This date is after the maximum date",format:"m/d/y",disabledDaysText:"Disabled",disabledDatesText:"Disabled",constrainToViewport:true,monthNames:Date.monthNames,dayNames:Date.dayNames,nextText:"Next Month (Control+Right)",prevText:"Previous Month (Control+Left)",monthYearText:"Choose a month (Control+Up/Down to move years)",startDay:0,showToday:true,initComponent:function(){Ext.DatePicker.superclass.initComponent.call(this);this.value=this.value?this.value.clearTime():new Date().clearTime();this.addEvents("select");if(this.handler){this.on("select",this.handler,this.scope||this)}this.initDisabledDays()},initDisabledDays:function(){if(!this.disabledDatesRE&&this.disabledDates){var A=this.disabledDates;var C="(?:";for(var B=0;B","  ",""];var E=this.dayNames;for(var D=0;D<7;D++){var G=this.startDay+D;if(G>6){G=G-7}C.push("")}C[C.length]="";for(var D=0;D<42;D++){if(D%7==0&&D!=0){C[C.length]=""}C[C.length]=""}C.push("
    ",E[G].substr(0,1),"
    ",this.showToday?"":"","
    ");var B=document.createElement("div");B.className="x-date-picker";B.innerHTML=C.join("");A.dom.insertBefore(B,F);this.el=Ext.get(B);this.eventEl=Ext.get(B.firstChild);new Ext.util.ClickRepeater(this.el.child("td.x-date-left a"),{handler:this.showPrevMonth,scope:this,preventDefault:true,stopDefault:true});new Ext.util.ClickRepeater(this.el.child("td.x-date-right a"),{handler:this.showNextMonth,scope:this,preventDefault:true,stopDefault:true});this.eventEl.on("mousewheel",this.handleMouseWheel,this);this.monthPicker=this.el.down("div.x-date-mp");this.monthPicker.enableDisplayMode("block");var I=new Ext.KeyNav(this.eventEl,{"left":function(J){J.ctrlKey?this.showPrevMonth():this.update(this.activeDate.add("d",-1))},"right":function(J){J.ctrlKey?this.showNextMonth():this.update(this.activeDate.add("d",1))},"up":function(J){J.ctrlKey?this.showNextYear():this.update(this.activeDate.add("d",-7))},"down":function(J){J.ctrlKey?this.showPrevYear():this.update(this.activeDate.add("d",7))},"pageUp":function(J){this.showNextMonth()},"pageDown":function(J){this.showPrevMonth()},"enter":function(J){J.stopPropagation();return true},scope:this});this.eventEl.on("click",this.handleDateClick,this,{delegate:"a.x-date-date"});this.el.unselectable();this.cells=this.el.select("table.x-date-inner tbody td");this.textNodes=this.el.query("table.x-date-inner tbody span");this.mbtn=new Ext.Button({text:" ",tooltip:this.monthYearText,renderTo:this.el.child("td.x-date-middle",true)});this.mbtn.on("click",this.showMonthPicker,this);this.mbtn.el.child(this.mbtn.menuClassTarget).addClass("x-btn-with-menu");if(this.showToday){this.todayKeyListener=this.eventEl.addKeyListener(Ext.EventObject.SPACE,this.selectToday,this);var H=(new Date()).dateFormat(this.format);this.todayBtn=new Ext.Button({renderTo:this.el.child("td.x-date-bottom",true),text:String.format(this.todayText,H),tooltip:String.format(this.todayTip,H),handler:this.selectToday,scope:this})}if(Ext.isIE){this.el.repaint()}this.update(this.value)},createMonthPicker:function(){if(!this.monthPicker.dom.firstChild){var A=[""];for(var B=0;B<6;B++){A.push("","",B==0?"":"")}A.push("","
    ",this.monthNames[B].substr(0,3),"",this.monthNames[B+6].substr(0,3),"
    ");this.monthPicker.update(A.join(""));this.monthPicker.on("click",this.onMonthClick,this);this.monthPicker.on("dblclick",this.onMonthDblClick,this);this.mpMonths=this.monthPicker.select("td.x-date-mp-month");this.mpYears=this.monthPicker.select("td.x-date-mp-year");this.mpMonths.each(function(C,D,E){E+=1;if((E%2)==0){C.dom.xmonth=5+Math.round(E*0.5)}else{C.dom.xmonth=Math.round((E-1)*0.5)}})}},showMonthPicker:function(){this.createMonthPicker();var A=this.el.getSize();this.monthPicker.setSize(A);this.monthPicker.child("table").setSize(A);this.mpSelMonth=(this.activeDate||this.value).getMonth();this.updateMPMonth(this.mpSelMonth);this.mpSelYear=(this.activeDate||this.value).getFullYear();this.updateMPYear(this.mpSelYear);this.monthPicker.slideIn("t",{duration:0.2})},updateMPYear:function(E){this.mpyear=E;var C=this.mpYears.elements;for(var B=1;B<=10;B++){var D=C[B-1],A;if((B%2)==0){A=E+Math.round(B*0.5);D.firstChild.innerHTML=A;D.xyear=A}else{A=E-(5-Math.round(B*0.5));D.firstChild.innerHTML=A;D.xyear=A}this.mpYears.item(B-1)[A==this.mpSelYear?"addClass":"removeClass"]("x-date-mp-sel")}},updateMPMonth:function(A){this.mpMonths.each(function(B,C,D){B[B.dom.xmonth==A?"addClass":"removeClass"]("x-date-mp-sel")})},selectMPMonth:function(A){},onMonthClick:function(D,B){D.stopEvent();var C=new Ext.Element(B),A;if(C.is("button.x-date-mp-cancel")){this.hideMonthPicker()}else{if(C.is("button.x-date-mp-ok")){var E=new Date(this.mpSelYear,this.mpSelMonth,(this.activeDate||this.value).getDate());if(E.getMonth()!=this.mpSelMonth){E=new Date(this.mpSelYear,this.mpSelMonth,1).getLastDateOfMonth()}this.update(E);this.hideMonthPicker()}else{if(A=C.up("td.x-date-mp-month",2)){this.mpMonths.removeClass("x-date-mp-sel");A.addClass("x-date-mp-sel");this.mpSelMonth=A.dom.xmonth}else{if(A=C.up("td.x-date-mp-year",2)){this.mpYears.removeClass("x-date-mp-sel");A.addClass("x-date-mp-sel");this.mpSelYear=A.dom.xyear}else{if(C.is("a.x-date-mp-prev")){this.updateMPYear(this.mpyear-10)}else{if(C.is("a.x-date-mp-next")){this.updateMPYear(this.mpyear+10)}}}}}}},onMonthDblClick:function(D,B){D.stopEvent();var C=new Ext.Element(B),A;if(A=C.up("td.x-date-mp-month",2)){this.update(new Date(this.mpSelYear,A.dom.xmonth,(this.activeDate||this.value).getDate()));this.hideMonthPicker()}else{if(A=C.up("td.x-date-mp-year",2)){this.update(new Date(A.dom.xyear,this.mpSelMonth,(this.activeDate||this.value).getDate()));this.hideMonthPicker()}}},hideMonthPicker:function(A){if(this.monthPicker){if(A===true){this.monthPicker.hide()}else{this.monthPicker.slideOut("t",{duration:0.2})}}},showPrevMonth:function(A){this.update(this.activeDate.add("mo",-1))},showNextMonth:function(A){this.update(this.activeDate.add("mo",1))},showPrevYear:function(){this.update(this.activeDate.add("y",-1))},showNextYear:function(){this.update(this.activeDate.add("y",1))},handleMouseWheel:function(A){var B=A.getWheelDelta();if(B>0){this.showPrevMonth();A.stopEvent()}else{if(B<0){this.showNextMonth();A.stopEvent()}}},handleDateClick:function(B,A){B.stopEvent();if(A.dateValue&&!Ext.fly(A.parentNode).hasClass("x-date-disabled")){this.setValue(new Date(A.dateValue));this.fireEvent("select",this,this.value)}},selectToday:function(){if(this.todayBtn&&!this.todayBtn.disabled){this.setValue(new Date().clearTime());this.fireEvent("select",this,this.value)}},update:function(a,U){var A=this.activeDate;this.activeDate=a;if(!U&&A&&this.el){var K=a.getTime();if(A.getMonth()==a.getMonth()&&A.getFullYear()==a.getFullYear()){this.cells.removeClass("x-date-selected");this.cells.each(function(d){if(d.dom.firstChild.dateValue==K){d.addClass("x-date-selected");setTimeout(function(){try{d.dom.firstChild.focus()}catch(f){}},50);return false}});return }}var G=a.getDaysInMonth();var L=a.getFirstDateOfMonth();var D=L.getDay()-this.startDay;if(D<=this.startDay){D+=7}var V=a.add("mo",-1);var E=V.getDaysInMonth()-D;var C=this.cells.elements;var M=this.textNodes;G+=D;var R=86400000;var X=(new Date(V.getFullYear(),V.getMonth(),E)).clearTime();var W=new Date().clearTime().getTime();var P=a.clearTime().getTime();var O=this.minDate?this.minDate.clearTime():Number.NEGATIVE_INFINITY;var S=this.maxDate?this.maxDate.clearTime():Number.POSITIVE_INFINITY;var Z=this.disabledDatesRE;var N=this.disabledDatesText;var c=this.disabledDays?this.disabledDays.join(""):false;var Y=this.disabledDaysText;var T=this.format;if(this.showToday){var I=new Date().clearTime();var B=(IS||(Z&&T&&Z.test(I.dateFormat(T)))||(c&&c.indexOf(I.getDay())!=-1));this.todayBtn.setDisabled(B);this.todayKeyListener[B?"disable":"enable"]()}var H=function(g,d){d.title="";var e=X.getTime();d.firstChild.dateValue=e;if(e==W){d.className+=" x-date-today";d.title=g.todayText}if(e==P){d.className+=" x-date-selected";setTimeout(function(){try{d.firstChild.focus()}catch(h){}},50)}if(eS){d.className=" x-date-disabled";d.title=g.maxText;return }if(c){if(c.indexOf(X.getDay())!=-1){d.title=Y;d.className=" x-date-disabled"}}if(Z&&T){var f=X.dateFormat(T);if(Z.test(f)){d.title=N.replace("%0",f);d.className=" x-date-disabled"}}};var Q=0;for(;Q","","{text}","");D.disableFormats=true;D.compile();Ext.TabPanel.prototype.itemTpl=D}this.items.each(this.initTab,this)},afterRender:function(){Ext.TabPanel.superclass.afterRender.call(this);if(this.autoTabs){this.readTabs(false)}},initEvents:function(){Ext.TabPanel.superclass.initEvents.call(this);this.on("add",this.onAdd,this);this.on("remove",this.onRemove,this);this.strip.on("mousedown",this.onStripMouseDown,this);this.strip.on("contextmenu",this.onStripContextMenu,this);if(this.enableTabScroll){this.strip.on("mousewheel",this.onWheel,this)}},findTargets:function(C){var B=null;var A=C.getTarget("li",this.strip);if(A){B=this.getComponent(A.id.split(this.idDelimiter)[1]);if(B.disabled){return{close:null,item:null,el:null}}}return{close:C.getTarget(".x-tab-strip-close",this.strip),item:B,el:A}},onStripMouseDown:function(B){if(B.button!=0){return }B.preventDefault();var A=this.findTargets(B);if(A.close){this.remove(A.item);return }if(A.item&&A.item!=this.activeTab){this.setActiveTab(A.item)}},onStripContextMenu:function(B){B.preventDefault();var A=this.findTargets(B);if(A.item){this.fireEvent("contextmenu",this,A.item,B)}},readTabs:function(D){if(D===true){this.items.each(function(G){this.remove(G)},this)}var C=this.el.query(this.autoTabSelector);for(var B=0,A=C.length;B20?C:20);if(!this.scrolling){if(!this.scrollLeft){this.createScrollers()}else{this.scrollLeft.show();this.scrollRight.show()}}this.scrolling=true;if(H>(A-C)){E.scrollLeft=A-C}else{this.scrollToTab(this.activeTab,false)}this.updateScrollButtons()}},createScrollers:function(){var C=this.stripWrap.dom.offsetHeight;var A=this.header.insertFirst({cls:"x-tab-scroller-left"});A.setHeight(C);A.addClassOnOver("x-tab-scroller-left-over");this.leftRepeater=new Ext.util.ClickRepeater(A,{interval:this.scrollRepeatInterval,handler:this.onScrollLeft,scope:this});this.scrollLeft=A;var B=this.header.insertFirst({cls:"x-tab-scroller-right"});B.setHeight(C);B.addClassOnOver("x-tab-scroller-right-over");this.rightRepeater=new Ext.util.ClickRepeater(B,{interval:this.scrollRepeatInterval,handler:this.onScrollRight,scope:this});this.scrollRight=B},getScrollWidth:function(){return this.edge.getOffsetsTo(this.stripWrap)[0]+this.getScrollPos()},getScrollPos:function(){return parseInt(this.stripWrap.dom.scrollLeft,10)||0},getScrollArea:function(){return parseInt(this.stripWrap.dom.clientWidth,10)||0},getScrollAnim:function(){return{duration:this.scrollDuration,callback:this.updateScrollButtons,scope:this}},getScrollIncrement:function(){return this.scrollIncrement||(this.resizeTabs?this.lastTabWidth+2:100)},scrollToTab:function(E,A){if(!E){return }var C=this.getTabEl(E);var G=this.getScrollPos(),D=this.getScrollArea();var F=Ext.fly(C).getOffsetsTo(this.stripWrap)[0]+G;var B=F+C.offsetWidth;if(F(G+D)){this.scrollTo(B-D,A)}}},scrollTo:function(B,A){this.stripWrap.scrollTo("left",B,A?this.getScrollAnim():false);if(!A){this.updateScrollButtons()}},onWheel:function(D){var E=D.getWheelDelta()*this.wheelIncrement*-1;D.stopEvent();var F=this.getScrollPos();var C=F+E;var A=this.getScrollWidth()-this.getScrollArea();var B=Math.max(0,Math.min(A,C));if(B!=F){this.scrollTo(B,false)}},onScrollRight:function(){var A=this.getScrollWidth()-this.getScrollArea();var C=this.getScrollPos();var B=Math.min(A,C+this.getScrollIncrement());if(B!=C){this.scrollTo(B,this.animScroll)}},onScrollLeft:function(){var B=this.getScrollPos();var A=Math.max(0,B-this.getScrollIncrement());if(A!=B){this.scrollTo(A,this.animScroll)}},updateScrollButtons:function(){var A=this.getScrollPos();this.scrollLeft[A==0?"addClass":"removeClass"]("x-tab-scroller-left-disabled");this.scrollRight[A>=(this.getScrollWidth()-this.getScrollArea())?"addClass":"removeClass"]("x-tab-scroller-right-disabled")}});Ext.reg("tabpanel",Ext.TabPanel);Ext.TabPanel.prototype.activate=Ext.TabPanel.prototype.setActiveTab;Ext.TabPanel.AccessStack=function(){var A=[];return{add:function(B){A.push(B);if(A.length>10){A.shift()}},remove:function(E){var D=[];for(var C=0,B=A.length;C","  ","")}this.template=Ext.Button.buttonTemplate}var B,E=[this.text||" ",this.type];if(A){B=this.template.insertBefore(A,E,true)}else{B=this.template.append(C,E,true)}var D=B.child(this.buttonSelector);D.on("focus",this.onFocus,this);D.on("blur",this.onBlur,this);this.initButtonEl(B,D);if(this.menu){this.el.child(this.menuClassTarget).addClass("x-btn-with-menu")}Ext.ButtonToggleMgr.register(this)},initButtonEl:function(B,C){this.el=B;B.addClass("x-btn");if(this.icon){C.setStyle("background-image","url("+this.icon+")")}if(this.iconCls){C.addClass(this.iconCls);if(!this.cls){B.addClass(this.text?"x-btn-text-icon":"x-btn-icon")}}if(this.tabIndex!==undefined){C.dom.tabIndex=this.tabIndex}if(this.tooltip){if(typeof this.tooltip=="object"){Ext.QuickTips.register(Ext.apply({target:C.id},this.tooltip))}else{C.dom[this.tooltipType]=this.tooltip}}if(this.pressed){this.el.addClass("x-btn-pressed")}if(this.handleMouseEvents){B.on("mouseover",this.onMouseOver,this);B.on("mousedown",this.onMouseDown,this)}if(this.menu){this.menu.on("show",this.onMenuShow,this);this.menu.on("hide",this.onMenuHide,this)}if(this.id){this.el.dom.id=this.el.id=this.id}if(this.repeat){var A=new Ext.util.ClickRepeater(B,typeof this.repeat=="object"?this.repeat:{});A.on("click",this.onClick,this)}B.on(this.clickEvent,this.onClick,this)},afterRender:function(){Ext.Button.superclass.afterRender.call(this);if(Ext.isIE6){this.autoWidth.defer(1,this)}else{this.autoWidth()}},setIconClass:function(A){if(this.el){this.el.child(this.buttonSelector).replaceClass(this.iconCls,A)}this.iconCls=A},beforeDestroy:function(){if(this.rendered){var A=this.el.child(this.buttonSelector);if(A){A.removeAllListeners()}}if(this.menu){Ext.destroy(this.menu)}},onDestroy:function(){if(this.rendered){Ext.ButtonToggleMgr.unregister(this)}},autoWidth:function(){if(this.el){this.el.setWidth("auto");if(Ext.isIE7&&Ext.isStrict){var A=this.el.child(this.buttonSelector);if(A&&A.getWidth()>20){A.clip();A.setWidth(Ext.util.TextMetrics.measure(A,this.text).width+A.getFrameWidth("lr"))}}if(this.minWidth){if(this.el.getWidth()","","","
     
    ","","","
     
    ");var C,F=[this.text||" ",this.type];if(A){C=B.insertBefore(A,F,true)}else{C=B.append(D,F,true)}var E=C.child(this.buttonSelector);this.initButtonEl(C,E);this.arrowBtnTable=C.child("table:last");if(this.arrowTooltip){C.child(this.arrowSelector).dom[this.tooltipType]=this.arrowTooltip}},autoWidth:function(){if(this.el){var C=this.el.child("table:first");var B=this.el.child("table:last");this.el.setWidth("auto");C.setWidth("auto");if(Ext.isIE7&&Ext.isStrict){var A=this.el.child(this.buttonSelector);if(A&&A.getWidth()>20){A.clip();A.setWidth(Ext.util.TextMetrics.measure(A,this.text).width+A.getFrameWidth("lr"))}}if(this.minWidth){if((C.getWidth()+B.getWidth())"},onRender:function(C,B){this.el=C.createChild(Ext.apply({id:this.id},this.autoCreate),B);this.tr=this.el.child("tr",true)},afterRender:function(){A.superclass.afterRender.call(this);if(this.buttons){this.add.apply(this,this.buttons);delete this.buttons}},add:function(){var C=arguments,B=C.length;for(var D=0;D"){this.addFill()}else{this.addText(E)}}}}else{if(E.tagName){this.addElement(E)}else{if(typeof E=="object"){if(E.xtype){this.addField(Ext.ComponentMgr.create(E,"button"))}else{this.addButton(E)}}}}}}}},addSeparator:function(){return this.addItem(new A.Separator())},addSpacer:function(){return this.addItem(new A.Spacer())},addFill:function(){return this.addItem(new A.Fill())},addElement:function(B){return this.addItem(new A.Item(B))},addItem:function(B){var C=this.nextBlock();this.initMenuTracking(B);B.render(C);this.items.add(B);return B},addButton:function(D){if(Ext.isArray(D)){var F=[];for(var E=0,C=D.length;E=1&C<=E.pages){this.field.dom.value=C}}}}}},beforeLoad:function(){if(this.rendered&&this.loading){this.loading.disable()}},doLoad:function(C){var B={},A=this.paramNames;B[A.start]=C;B[A.limit]=this.pageSize;if(this.fireEvent("beforechange",this,B)!==false){this.store.load({params:B})}},changePage:function(A){this.doLoad(((A-1)*this.pageSize).constrain(0,this.store.getTotalCount()))},onClick:function(E){var B=this.store;switch(E){case"first":this.doLoad(0);break;case"prev":this.doLoad(Math.max(0,this.cursor-this.pageSize));break;case"next":this.doLoad(this.cursor+this.pageSize);break;case"last":var D=B.getTotalCount();var A=D%this.pageSize;var C=A?(D-A):D-this.pageSize;this.doLoad(C);break;case"refresh":this.doLoad(this.cursor);break}},unbind:function(A){A=Ext.StoreMgr.lookup(A);A.un("beforeload",this.beforeLoad,this);A.un("load",this.onLoad,this);A.un("loadexception",this.onLoadError,this);this.store=undefined},bind:function(A){A=Ext.StoreMgr.lookup(A);A.on("beforeload",this.beforeLoad,this);A.on("load",this.onLoad,this);A.on("loadexception",this.onLoadError,this);this.store=A}});Ext.reg("paging",Ext.PagingToolbar); +Ext.Resizable=function(D,E){this.el=Ext.get(D);if(E&&E.wrap){E.resizeChild=this.el;this.el=this.el.wrap(typeof E.wrap=="object"?E.wrap:{cls:"xresizable-wrap"});this.el.id=this.el.dom.id=E.resizeChild.id+"-rzwrap";this.el.setStyle("overflow","hidden");this.el.setPositioning(E.resizeChild.getPositioning());E.resizeChild.clearPositioning();if(!E.width||!E.height){var F=E.resizeChild.getSize();this.el.setSize(F.width,F.height)}if(E.pinned&&!E.adjustments){E.adjustments="auto"}}this.proxy=this.el.createProxy({tag:"div",cls:"x-resizable-proxy",id:this.el.id+"-rzproxy"},Ext.getBody());this.proxy.unselectable();this.proxy.enableDisplayMode("block");Ext.apply(this,E);if(this.pinned){this.disableTrackOver=true;this.el.addClass("x-resizable-pinned")}var I=this.el.getStyle("position");if(I!="absolute"&&I!="fixed"){this.el.setStyle("position","relative")}if(!this.handles){this.handles="s,e,se";if(this.multiDirectional){this.handles+=",n,w"}}if(this.handles=="all"){this.handles="n s e w ne nw se sw"}var M=this.handles.split(/\s*?[,;]\s*?| /);var C=Ext.Resizable.positions;for(var H=0,J=M.length;H0){if(A>(E/2)){D=C+(E-A)}else{D=C-A}}return Math.max(B,D)},resizeElement:function(){var A=this.proxy.getBox();if(this.updateBox){this.el.setBox(A,false,this.animate,this.duration,null,this.easing)}else{this.el.setSize(A.width,A.height,this.animate,this.duration,null,this.easing)}this.updateChildSize();if(!this.dynamic){this.proxy.hide()}return A},constrain:function(B,C,A,D){if(B-CD){C=D-B}}return C},onMouseMove:function(S){if(this.enabled){try{if(this.resizeRegion&&!this.resizeRegion.contains(S.getPoint())){return }var Q=this.curSize||this.startBox;var I=this.startBox.x,H=this.startBox.y;var C=I,B=H;var J=Q.width,R=Q.height;var D=J,L=R;var K=this.minWidth,T=this.minHeight;var P=this.maxWidth,W=this.maxHeight;var F=this.widthIncrement;var A=this.heightIncrement;var U=S.getXY();var O=-(this.startPoint[0]-Math.max(this.minX,U[0]));var M=-(this.startPoint[1]-Math.max(this.minY,U[1]));var G=this.activeHandle.position;switch(G){case"east":J+=O;J=Math.min(Math.max(K,J),P);break;case"south":R+=M;R=Math.min(Math.max(T,R),W);break;case"southeast":J+=O;R+=M;J=Math.min(Math.max(K,J),P);R=Math.min(Math.max(T,R),W);break;case"north":M=this.constrain(R,M,T,W);H+=M;R-=M;break;case"west":O=this.constrain(J,O,K,P);I+=O;J-=O;break;case"northeast":J+=O;J=Math.min(Math.max(K,J),P);M=this.constrain(R,M,T,W);H+=M;R-=M;break;case"northwest":O=this.constrain(J,O,K,P);M=this.constrain(R,M,T,W);H+=M;R-=M;I+=O;J-=O;break;case"southwest":O=this.constrain(J,O,K,P);R+=M;R=Math.min(Math.max(T,R),W);I+=O;J-=O;break}var N=this.snap(J,F,K);var V=this.snap(R,A,T);if(N!=J||V!=R){switch(G){case"northeast":H-=V-R;break;case"north":H-=V-R;break;case"southwest":I-=N-J;break;case"west":I-=N-J;break;case"northwest":I-=N-J;H-=V-R;break}J=N;R=V}if(this.preserveRatio){switch(G){case"southeast":case"east":R=L*(J/D);R=Math.min(Math.max(T,R),W);J=D*(R/L);break;case"south":J=D*(R/L);J=Math.min(Math.max(K,J),P);R=L*(J/D);break;case"northeast":J=D*(R/L);J=Math.min(Math.max(K,J),P);R=L*(J/D);break;case"north":var X=J;J=D*(R/L);J=Math.min(Math.max(K,J),P);R=L*(J/D);I+=(X-J)/2;break;case"southwest":R=L*(J/D);R=Math.min(Math.max(T,R),W);var X=J;J=D*(R/L);I+=X-J;break;case"west":var E=R;R=L*(J/D);R=Math.min(Math.max(T,R),W);H+=(E-R)/2;var X=J;J=D*(R/L);I+=X-J;break;case"northwest":var X=J;var E=R;R=L*(J/D);R=Math.min(Math.max(T,R),W);J=D*(R/L);H+=E-R;I+=X-J;break}}this.proxy.setBounds(I,H,J,R);if(this.dynamic){this.resizeElement()}}catch(S){}}},handleOver:function(){if(this.enabled){this.el.addClass("x-resizable-over")}},handleOut:function(){if(!this.resizing){this.el.removeClass("x-resizable-over")}},getEl:function(){return this.el},getResizeChild:function(){return this.resizeChild},destroy:function(C){this.proxy.remove();if(this.overlay){this.overlay.removeAllListeners();this.overlay.remove()}var D=Ext.Resizable.positions;for(var A in D){if(typeof D[A]!="function"&&this[D[A]]){var B=this[D[A]];B.el.removeAllListeners();B.el.remove()}}if(C){this.el.update("");this.el.remove()}},syncHandleHeight:function(){var A=this.el.getHeight(true);if(this.west){this.west.el.setHeight(A)}if(this.east){this.east.el.setHeight(A)}}});Ext.Resizable.positions={n:"north",s:"south",e:"east",w:"west",se:"southeast",sw:"southwest",nw:"northwest",ne:"northeast"};Ext.Resizable.Handle=function(C,E,B,D){if(!this.tpl){var A=Ext.DomHelper.createTemplate({tag:"div",cls:"x-resizable-handle x-resizable-handle-{0}"});A.compile();Ext.Resizable.Handle.prototype.tpl=A}this.position=E;this.rz=C;this.el=this.tpl.append(C.el.dom,[this.position],true);this.el.unselectable();if(D){this.el.setOpacity(0)}this.el.on("mousedown",this.onMouseDown,this);if(!B){this.el.on("mouseover",this.onMouseOver,this);this.el.on("mouseout",this.onMouseOut,this)}};Ext.Resizable.Handle.prototype={afterResize:function(A){},onMouseDown:function(A){this.rz.onMouseDown(this,A)},onMouseOver:function(A){this.rz.handleOver(this,A)},onMouseOut:function(A){this.rz.handleOut(this,A)}}; +Ext.Editor=function(B,A){this.field=B;Ext.Editor.superclass.constructor.call(this,A)};Ext.extend(Ext.Editor,Ext.Component,{value:"",alignment:"c-c?",shadow:"frame",constrain:false,swallowKeys:true,completeOnEnter:false,cancelOnEsc:false,updateEl:false,initComponent:function(){Ext.Editor.superclass.initComponent.call(this);this.addEvents("beforestartedit","startedit","beforecomplete","complete","canceledit","specialkey")},onRender:function(B,A){this.el=new Ext.Layer({shadow:this.shadow,cls:"x-editor",parentEl:B,shim:this.shim,shadowOffset:4,id:this.id,constrain:this.constrain});this.el.setStyle("overflow",Ext.isGecko?"auto":"hidden");if(this.field.msgTarget!="title"){this.field.msgTarget="qtip"}this.field.inEditor=true;this.field.render(this.el);if(Ext.isGecko){this.field.el.dom.setAttribute("autocomplete","off")}this.field.on("specialkey",this.onSpecialKey,this);if(this.swallowKeys){this.field.el.swallowEvent(["keydown","keypress"])}this.field.show();this.field.on("blur",this.onBlur,this);if(this.field.grow){this.field.on("autosize",this.el.sync,this.el,{delay:1})}},onSpecialKey:function(C,B){var A=B.getKey();if(this.completeOnEnter&&A==B.ENTER){B.stopEvent();this.completeEdit()}else{if(this.cancelOnEsc&&A==B.ESC){this.cancelEdit()}else{this.fireEvent("specialkey",C,B)}}if(this.field.triggerBlur&&(A==B.ENTER||A==B.ESC||A==B.TAB)){this.field.triggerBlur()}},startEdit:function(B,C){if(this.editing){this.completeEdit()}this.boundEl=Ext.get(B);var A=C!==undefined?C:this.boundEl.dom.innerHTML;if(!this.rendered){this.render(this.parentEl||document.body)}if(this.fireEvent("beforestartedit",this,this.boundEl,A)===false){return }this.startValue=A;this.field.setValue(A);this.doAutoSize();this.el.alignTo(this.boundEl,this.alignment);this.editing=true;this.show()},doAutoSize:function(){if(this.autoSize){var A=this.boundEl.getSize();switch(this.autoSize){case"width":this.setSize(A.width,"");break;case"height":this.setSize("",A.height);break;default:this.setSize(A.width,A.height)}}},setSize:function(A,B){delete this.field.lastSize;this.field.setSize(A,B);if(this.el){if(Ext.isGecko2||Ext.isOpera){this.el.setSize(A,B)}this.el.sync()}},realign:function(){this.el.alignTo(this.boundEl,this.alignment)},completeEdit:function(A){if(!this.editing){return }var B=this.getValue();if(this.revertInvalid!==false&&!this.field.isValid()){B=this.startValue;this.cancelEdit(true)}if(String(B)===String(this.startValue)&&this.ignoreNoChange){this.editing=false;this.hide();return }if(this.fireEvent("beforecomplete",this,B,this.startValue)!==false){this.editing=false;if(this.updateEl&&this.boundEl){this.boundEl.update(B)}if(A!==true){this.hide()}this.fireEvent("complete",this,B,this.startValue)}},onShow:function(){this.el.show();if(this.hideEl!==false){this.boundEl.hide()}this.field.show();if(Ext.isIE&&!this.fixIEFocus){this.fixIEFocus=true;this.deferredFocus.defer(50,this)}else{this.field.focus()}this.fireEvent("startedit",this.boundEl,this.startValue)},deferredFocus:function(){if(this.editing){this.field.focus()}},cancelEdit:function(A){if(this.editing){var B=this.getValue();this.setValue(this.startValue);if(A!==true){this.hide()}this.fireEvent("canceledit",this,B,this.startValue)}},onBlur:function(){if(this.allowBlur!==true&&this.editing){this.completeEdit()}},onHide:function(){if(this.editing){this.completeEdit();return }this.field.blur();if(this.field.collapse){this.field.collapse()}this.el.hide();if(this.hideEl!==false){this.boundEl.show()}},setValue:function(A){this.field.setValue(A)},getValue:function(){return this.field.getValue()},beforeDestroy:function(){this.field.destroy();this.field=null}});Ext.reg("editor",Ext.Editor); +Ext.MessageBox=function(){var R,B,N,Q;var G,J,P,A,K,M,H,F;var O,S,L,C="";var D=function(U){if(R.isVisible()){R.hide();Ext.callback(B.fn,B.scope||window,[U,S.dom.value],1)}};var T=function(){if(B&&B.cls){R.el.removeClass(B.cls)}K.reset()};var E=function(W,U,V){if(B&&B.closable!==false){R.hide()}if(V){V.stopEvent()}};var I=function(U){var W=0;if(!U){O["ok"].hide();O["cancel"].hide();O["yes"].hide();O["no"].hide();return W}R.footer.dom.style.display="";for(var V in O){if(typeof O[V]!="function"){if(U[V]){O[V].show();O[V].setText(typeof U[V]=="string"?U[V]:Ext.MessageBox.buttonText[V]);W+=O[V].el.getWidth()+15}else{O[V].hide()}}}return W};return{getDialog:function(U){if(!R){R=new Ext.Window({autoCreate:true,title:U,resizable:false,constrain:true,constrainHeader:true,minimizable:false,maximizable:false,stateful:false,modal:true,shim:true,buttonAlign:"center",width:400,height:100,minHeight:80,plain:true,footer:true,closable:true,close:function(){if(B&&B.buttons&&B.buttons.no&&!B.buttons.cancel){D("no")}else{D("cancel")}}});O={};var V=this.buttonText;O["ok"]=R.addButton(V["ok"],D.createCallback("ok"));O["yes"]=R.addButton(V["yes"],D.createCallback("yes"));O["no"]=R.addButton(V["no"],D.createCallback("no"));O["cancel"]=R.addButton(V["cancel"],D.createCallback("cancel"));O["ok"].hideMode=O["yes"].hideMode=O["no"].hideMode=O["cancel"].hideMode="offsets";R.render(document.body);R.getEl().addClass("x-window-dlg");N=R.mask;G=R.body.createChild({html:"

    "});H=Ext.get(G.dom.firstChild);var W=G.dom.childNodes[1];J=Ext.get(W.firstChild);P=Ext.get(W.childNodes[2].firstChild);P.enableDisplayMode();P.addKeyListener([10,13],function(){if(R.isVisible()&&B&&B.buttons){if(B.buttons.ok){D("ok")}else{if(B.buttons.yes){D("yes")}}}});A=Ext.get(W.childNodes[2].childNodes[1]);A.enableDisplayMode();K=new Ext.ProgressBar({renderTo:G});G.createChild({cls:"x-clear"})}return R},updateText:function(X){if(!R.isVisible()&&!B.width){R.setSize(this.maxWidth,100)}J.update(X||" ");var V=C!=""?(H.getWidth()+H.getMargins("lr")):0;var Z=J.getWidth()+J.getMargins("lr");var W=R.getFrameWidth("lr");var Y=R.body.getFrameWidth("lr");if(Ext.isIE&&V>0){V+=3}var U=Math.max(Math.min(B.width||V+Z+W+Y,this.maxWidth),Math.max(B.minWidth||this.minWidth,L||0));if(B.prompt===true){S.setWidth(U-V-W-Y)}if(B.progress===true||B.wait===true){K.setSize(U-V-W-Y)}R.setSize(U,"auto").center();return this},updateProgress:function(V,U,W){K.updateProgress(V,U);if(W){this.updateText(W)}return this},isVisible:function(){return R&&R.isVisible()},hide:function(){if(this.isVisible()){R.hide();T()}return this},show:function(X){if(this.isVisible()){this.hide()}B=X;var Y=this.getDialog(B.title||" ");Y.setTitle(B.title||" ");var U=(B.closable!==false&&B.progress!==true&&B.wait!==true);Y.tools.close.setDisplayed(U);S=P;B.prompt=B.prompt||(B.multiline?true:false);if(B.prompt){if(B.multiline){P.hide();A.show();A.setHeight(typeof B.multiline=="number"?B.multiline:this.defaultTextHeight);S=A}else{P.show();A.hide()}}else{P.hide();A.hide()}S.dom.value=B.value||"";if(B.prompt){Y.focusEl=S}else{var W=B.buttons;var V=null;if(W&&W.ok){V=O["ok"]}else{if(W&&W.yes){V=O["yes"]}}if(V){Y.focusEl=V}}if(B.iconCls){Y.setIconClass(B.iconCls)}this.setIcon(B.icon);L=I(B.buttons);K.setVisible(B.progress===true||B.wait===true);this.updateProgress(0,B.progressText);this.updateText(B.msg);if(B.cls){Y.el.addClass(B.cls)}Y.proxyDrag=B.proxyDrag===true;Y.modal=B.modal!==false;Y.mask=B.modal!==false?N:false;if(!Y.isVisible()){document.body.appendChild(R.el.dom);Y.setAnimateTarget(B.animEl);Y.show(B.animEl)}Y.on("show",function(){if(U===true){Y.keyMap.enable()}else{Y.keyMap.disable()}},this,{single:true});if(B.wait===true){K.wait(B.waitConfig)}return this},setIcon:function(U){if(U&&U!=""){H.removeClass("x-hidden");H.replaceClass(C,U);C=U}else{H.replaceClass(C,"x-hidden");C=""}return this},progress:function(W,V,U){this.show({title:W,msg:V,buttons:false,progress:true,closable:false,minWidth:this.minProgressWidth,progressText:U});return this},wait:function(W,V,U){this.show({title:V,msg:W,buttons:false,closable:false,wait:true,modal:true,minWidth:this.minProgressWidth,waitConfig:U});return this},alert:function(X,W,V,U){this.show({title:X,msg:W,buttons:this.OK,fn:V,scope:U});return this},confirm:function(X,W,V,U){this.show({title:X,msg:W,buttons:this.YESNO,fn:V,scope:U,icon:this.QUESTION});return this},prompt:function(Z,Y,W,V,U,X){this.show({title:Z,msg:Y,buttons:this.OKCANCEL,fn:W,minWidth:250,scope:V,prompt:true,multiline:U,value:X});return this},OK:{ok:true},CANCEL:{cancel:true},OKCANCEL:{ok:true,cancel:true},YESNO:{yes:true,no:true},YESNOCANCEL:{yes:true,no:true,cancel:true},INFO:"ext-mb-info",WARNING:"ext-mb-warning",QUESTION:"ext-mb-question",ERROR:"ext-mb-error",defaultTextHeight:75,maxWidth:600,minWidth:100,minProgressWidth:250,buttonText:{ok:"OK",cancel:"Cancel",yes:"Yes",no:"No"}}}();Ext.Msg=Ext.MessageBox; +Ext.Tip=Ext.extend(Ext.Panel,{minWidth:40,maxWidth:300,shadow:"sides",defaultAlign:"tl-bl?",autoRender:true,quickShowInterval:250,frame:true,hidden:true,baseCls:"x-tip",floating:{shadow:true,shim:true,useDisplay:true,constrain:false},autoHeight:true,initComponent:function(){Ext.Tip.superclass.initComponent.call(this);if(this.closable&&!this.title){this.elements+=",header"}},afterRender:function(){Ext.Tip.superclass.afterRender.call(this);if(this.closable){this.addTool({id:"close",handler:this.hide,scope:this})}},showAt:function(A){Ext.Tip.superclass.show.call(this);if(this.measureWidth!==false&&(!this.initialConfig||typeof this.initialConfig.width!="number")){this.doAutoWidth()}if(this.constrainPosition){A=this.el.adjustForConstraints(A)}this.setPagePosition(A[0],A[1])},doAutoWidth:function(){var A=this.body.getTextWidth();if(this.title){A=Math.max(A,this.header.child("span").getTextWidth(this.title))}A+=this.getFrameWidth()+(this.closable?20:0)+this.body.getPadding("lr");this.setWidth(A.constrain(this.minWidth,this.maxWidth));if(Ext.isIE7&&!this.repainted){this.el.repaint();this.repainted=true}},showBy:function(A,B){if(!this.rendered){this.render(Ext.getBody())}this.showAt(this.el.getAlignToXY(A,B||this.defaultAlign))},initDraggable:function(){this.dd=new Ext.Tip.DD(this,typeof this.draggable=="boolean"?null:this.draggable);this.header.addClass("x-tip-draggable")}});Ext.Tip.DD=function(B,A){Ext.apply(this,A);this.tip=B;Ext.Tip.DD.superclass.constructor.call(this,B.el.id,"WindowDD-"+B.id);this.setHandleElId(B.header.id);this.scroll=false};Ext.extend(Ext.Tip.DD,Ext.dd.DD,{moveOnly:true,scroll:false,headerOffsets:[100,25],startDrag:function(){this.tip.el.disableShadow()},endDrag:function(A){this.tip.el.enableShadow(true)}}); +Ext.ToolTip=Ext.extend(Ext.Tip,{showDelay:500,hideDelay:200,dismissDelay:5000,mouseOffset:[15,18],trackMouse:false,constrainPosition:true,initComponent:function(){Ext.ToolTip.superclass.initComponent.call(this);this.lastActive=new Date();this.initTarget()},initTarget:function(){if(this.target){this.target=Ext.get(this.target);this.target.on("mouseover",this.onTargetOver,this);this.target.on("mouseout",this.onTargetOut,this);this.target.on("mousemove",this.onMouseMove,this)}},onMouseMove:function(A){this.targetXY=A.getXY();if(!this.hidden&&this.trackMouse){this.setPagePosition(this.getTargetXY())}},getTargetXY:function(){return[this.targetXY[0]+this.mouseOffset[0],this.targetXY[1]+this.mouseOffset[1]]},onTargetOver:function(A){if(this.disabled||A.within(this.target.dom,true)){return }this.clearTimer("hide");this.targetXY=A.getXY();this.delayShow()},delayShow:function(){if(this.hidden&&!this.showTimer){if(this.lastActive.getElapsed()=C){D=C-B-5}return{x:A,y:D}},onDestroy:function(){Ext.ToolTip.superclass.onDestroy.call(this);if(this.target){this.target.un("mouseover",this.onTargetOver,this);this.target.un("mouseout",this.onTargetOut,this);this.target.un("mousemove",this.onMouseMove,this)}}}); +Ext.QuickTip=Ext.extend(Ext.ToolTip,{interceptTitles:false,tagConfig:{namespace:"ext",attribute:"qtip",width:"qwidth",target:"target",title:"qtitle",hide:"hide",cls:"qclass",align:"qalign"},initComponent:function(){this.target=this.target||Ext.getDoc();this.targets=this.targets||{};Ext.QuickTip.superclass.initComponent.call(this)},register:function(D){var F=Ext.isArray(D)?D:arguments;for(var E=0,A=F.length;E0){var D=function(H,G){if(H&&G){var I=G.findChild(A,B);if(I){I.select();if(F){F(true,I)}}else{if(F){F(false,I)}}}else{if(F){F(false,I)}}};this.expandPath(C.join(this.pathSeparator),A,D)}else{this.root.select();if(F){F(true,this.root)}}},getTreeEl:function(){return this.body},onRender:function(B,A){Ext.tree.TreePanel.superclass.onRender.call(this,B,A);this.el.addClass("x-tree");this.innerCt=this.body.createChild({tag:"ul",cls:"x-tree-root-ct "+(this.useArrows?"x-tree-arrows":this.lines?"x-tree-lines":"x-tree-no-lines")})},initEvents:function(){Ext.tree.TreePanel.superclass.initEvents.call(this);if(this.containerScroll){Ext.dd.ScrollManager.register(this.body)}if((this.enableDD||this.enableDrop)&&!this.dropZone){this.dropZone=new Ext.tree.TreeDropZone(this,this.dropConfig||{ddGroup:this.ddGroup||"TreeDD",appendOnly:this.ddAppendOnly===true})}if((this.enableDD||this.enableDrag)&&!this.dragZone){this.dragZone=new Ext.tree.TreeDragZone(this,this.dragConfig||{ddGroup:this.ddGroup||"TreeDD",scroll:this.ddScroll})}this.getSelectionModel().init(this)},afterRender:function(){Ext.tree.TreePanel.superclass.afterRender.call(this);this.root.render();if(!this.rootVisible){this.root.renderChildren()}},onDestroy:function(){if(this.rendered){this.body.removeAllListeners();Ext.dd.ScrollManager.unregister(this.body);if(this.dropZone){this.dropZone.unreg()}if(this.dragZone){this.dragZone.unreg()}}this.root.destroy();this.nodeHash=null;Ext.tree.TreePanel.superclass.onDestroy.call(this)}});Ext.tree.TreePanel.nodeTypes={};Ext.reg("treepanel",Ext.tree.TreePanel); +Ext.tree.TreeEventModel=function(A){this.tree=A;this.tree.on("render",this.initEvents,this)};Ext.tree.TreeEventModel.prototype={initEvents:function(){var A=this.tree.getTreeEl();A.on("click",this.delegateClick,this);if(this.tree.trackMouseOver!==false){A.on("mouseover",this.delegateOver,this);A.on("mouseout",this.delegateOut,this)}A.on("dblclick",this.delegateDblClick,this);A.on("contextmenu",this.delegateContextMenu,this)},getNode:function(B){var A;if(A=B.getTarget(".x-tree-node-el",10)){var C=Ext.fly(A,"_treeEvents").getAttributeNS("ext","tree-node-id");if(C){return this.tree.getNodeById(C)}}return null},getNodeTarget:function(B){var A=B.getTarget(".x-tree-node-icon",1);if(!A){A=B.getTarget(".x-tree-node-el",6)}return A},delegateOut:function(B,A){if(!this.beforeEvent(B)){return }if(B.getTarget(".x-tree-ec-icon",1)){var C=this.getNode(B);this.onIconOut(B,C);if(C==this.lastEcOver){delete this.lastEcOver}}if((A=this.getNodeTarget(B))&&!B.within(A,true)){this.onNodeOut(B,this.getNode(B))}},delegateOver:function(B,A){if(!this.beforeEvent(B)){return }if(this.lastEcOver){this.onIconOut(B,this.lastEcOver);delete this.lastEcOver}if(B.getTarget(".x-tree-ec-icon",1)){this.lastEcOver=this.getNode(B);this.onIconOver(B,this.lastEcOver)}if(A=this.getNodeTarget(B)){this.onNodeOver(B,this.getNode(B))}},delegateClick:function(B,A){if(!this.beforeEvent(B)){return }if(B.getTarget("input[type=checkbox]",1)){this.onCheckboxClick(B,this.getNode(B))}else{if(B.getTarget(".x-tree-ec-icon",1)){this.onIconClick(B,this.getNode(B))}else{if(this.getNodeTarget(B)){this.onNodeClick(B,this.getNode(B))}}}},delegateDblClick:function(B,A){if(this.beforeEvent(B)&&this.getNodeTarget(B)){this.onNodeDblClick(B,this.getNode(B))}},delegateContextMenu:function(B,A){if(this.beforeEvent(B)&&this.getNodeTarget(B)){this.onNodeContextMenu(B,this.getNode(B))}},onNodeClick:function(B,A){A.ui.onClick(B)},onNodeOver:function(B,A){A.ui.onOver(B)},onNodeOut:function(B,A){A.ui.onOut(B)},onIconOver:function(B,A){A.ui.addClass("x-tree-ec-over")},onIconOut:function(B,A){A.ui.removeClass("x-tree-ec-over")},onIconClick:function(B,A){A.ui.ecClick(B)},onCheckboxClick:function(B,A){A.ui.onCheckChange(B)},onNodeDblClick:function(B,A){A.ui.onDblClick(B)},onNodeContextMenu:function(B,A){A.ui.onContextMenu(B)},beforeEvent:function(A){if(this.disabled){A.stopEvent();return false}return true},disable:function(){this.disabled=true},enable:function(){this.disabled=false}}; +Ext.tree.DefaultSelectionModel=function(A){this.selNode=null;this.addEvents("selectionchange","beforeselect");Ext.apply(this,A);Ext.tree.DefaultSelectionModel.superclass.constructor.call(this)};Ext.extend(Ext.tree.DefaultSelectionModel,Ext.util.Observable,{init:function(A){this.tree=A;A.getTreeEl().on("keydown",this.onKeyDown,this);A.on("click",this.onNodeClick,this)},onNodeClick:function(A,B){this.select(A)},select:function(B){var A=this.selNode;if(A!=B&&this.fireEvent("beforeselect",this,B,A)!==false){if(A){A.ui.onSelectedChange(false)}this.selNode=B;B.ui.onSelectedChange(true);this.fireEvent("selectionchange",this,B,A)}return B},unselect:function(A){if(this.selNode==A){this.clearSelections()}},clearSelections:function(){var A=this.selNode;if(A){A.ui.onSelectedChange(false);this.selNode=null;this.fireEvent("selectionchange",this,null)}return A},getSelectedNode:function(){return this.selNode},isSelected:function(A){return this.selNode==A},selectPrevious:function(){var A=this.selNode||this.lastSelNode;if(!A){return null}var C=A.previousSibling;if(C){if(!C.isExpanded()||C.childNodes.length<1){return this.select(C)}else{var B=C.lastChild;while(B&&B.isExpanded()&&B.childNodes.length>0){B=B.lastChild}return this.select(B)}}else{if(A.parentNode&&(this.tree.rootVisible||!A.parentNode.isRoot)){return this.select(A.parentNode)}}return null},selectNext:function(){var B=this.selNode||this.lastSelNode;if(!B){return null}if(B.firstChild&&B.isExpanded()){return this.select(B.firstChild)}else{if(B.nextSibling){return this.select(B.nextSibling)}else{if(B.parentNode){var A=null;B.parentNode.bubble(function(){if(this.nextSibling){A=this.getOwnerTree().selModel.select(this.nextSibling);return false}});return A}}}return null},onKeyDown:function(C){var B=this.selNode||this.lastSelNode;var D=this;if(!B){return }var A=C.getKey();switch(A){case C.DOWN:C.stopEvent();this.selectNext();break;case C.UP:C.stopEvent();this.selectPrevious();break;case C.RIGHT:C.preventDefault();if(B.hasChildNodes()){if(!B.isExpanded()){B.expand()}else{if(B.firstChild){this.select(B.firstChild,C)}}}break;case C.LEFT:C.preventDefault();if(B.hasChildNodes()&&B.isExpanded()){B.collapse()}else{if(B.parentNode&&(this.tree.rootVisible||B.parentNode!=this.tree.getRootNode())){this.select(B.parentNode,C)}}break}}});Ext.tree.MultiSelectionModel=function(A){this.selNodes=[];this.selMap={};this.addEvents("selectionchange");Ext.apply(this,A);Ext.tree.MultiSelectionModel.superclass.constructor.call(this)};Ext.extend(Ext.tree.MultiSelectionModel,Ext.util.Observable,{init:function(A){this.tree=A;A.getTreeEl().on("keydown",this.onKeyDown,this);A.on("click",this.onNodeClick,this)},onNodeClick:function(A,B){this.select(A,B,B.ctrlKey)},select:function(A,C,B){if(B!==true){this.clearSelections(true)}if(this.isSelected(A)){this.lastSelNode=A;return A}this.selNodes.push(A);this.selMap[A.id]=A;this.lastSelNode=A;A.ui.onSelectedChange(true);this.fireEvent("selectionchange",this,this.selNodes);return A},unselect:function(B){if(this.selMap[B.id]){B.ui.onSelectedChange(false);var C=this.selNodes;var A=C.indexOf(B);if(A!=-1){this.selNodes.splice(A,1)}delete this.selMap[B.id];this.fireEvent("selectionchange",this,this.selNodes)}},clearSelections:function(B){var D=this.selNodes;if(D.length>0){for(var C=0,A=D.length;C
    ","",this.indentMarkup,"","","",E?("":"/>")):"","",D.text,"
    ","
      ",""].join("");var A;if(J!==true&&D.nextSibling&&(A=D.nextSibling.ui.getEl())){this.wrap=Ext.DomHelper.insertHtml("beforeBegin",A,C)}else{this.wrap=Ext.DomHelper.insertHtml("beforeEnd",H,C)}this.elNode=this.wrap.childNodes[0];this.ctNode=this.wrap.childNodes[1];var G=this.elNode.childNodes;this.indentNode=G[0];this.ecNode=G[1];this.iconNode=G[2];var F=3;if(E){this.checkbox=G[3];this.checkbox.defaultChecked=this.checkbox.checked;F++}this.anchor=G[F];this.textNode=G[F].firstChild},getAnchor:function(){return this.anchor},getTextEl:function(){return this.textNode},getIconEl:function(){return this.iconNode},isChecked:function(){return this.checkbox?this.checkbox.checked:false},updateExpandIcon:function(){if(this.rendered){var E=this.node,D,C;var A=E.isLast()?"x-tree-elbow-end":"x-tree-elbow";if(E.isExpandable()){if(E.expanded){A+="-minus";D="x-tree-node-collapsed";C="x-tree-node-expanded"}else{A+="-plus";D="x-tree-node-expanded";C="x-tree-node-collapsed"}if(this.wasLeaf){this.removeClass("x-tree-node-leaf");this.wasLeaf=false}if(this.c1!=D||this.c2!=C){Ext.fly(this.elNode).replaceClass(D,C);this.c1=D;this.c2=C}}else{if(!this.wasLeaf){Ext.fly(this.elNode).replaceClass("x-tree-node-expanded","x-tree-node-leaf");delete this.c1;delete this.c2;this.wasLeaf=true}}var B="x-tree-ec-icon "+A;if(this.ecc!=B){this.ecNode.className=B;this.ecc=B}}},getChildIndent:function(){if(!this.childIndent){var A=[];var B=this.node;while(B){if(!B.isRoot||(B.isRoot&&B.ownerTree.rootVisible)){if(!B.isLast()){A.unshift("")}else{A.unshift("")}}B=B.parentNode}this.childIndent=A.join("")}return this.childIndent},renderIndent:function(){if(this.rendered){var A="";var B=this.node.parentNode;if(B){A=B.ui.getChildIndent()}if(this.indentMarkup!=A){this.indentNode.innerHTML=A;this.indentMarkup=A}this.updateExpandIcon()}},destroy:function(){if(this.elNode){Ext.dd.Registry.unregister(this.elNode.id)}delete this.elNode;delete this.ctNode;delete this.indentNode;delete this.ecNode;delete this.iconNode;delete this.checkbox;delete this.anchor;delete this.textNode;Ext.removeNode(this.ctNode)}};Ext.tree.RootTreeNodeUI=Ext.extend(Ext.tree.TreeNodeUI,{render:function(){if(!this.rendered){var A=this.node.ownerTree.innerCt.dom;this.node.expanded=true;A.innerHTML="
      ";this.wrap=this.ctNode=A.firstChild}},collapse:Ext.emptyFn,expand:Ext.emptyFn}); +Ext.tree.TreeLoader=function(A){this.baseParams={};Ext.apply(this,A);this.addEvents("beforeload","load","loadexception");Ext.tree.TreeLoader.superclass.constructor.call(this)};Ext.extend(Ext.tree.TreeLoader,Ext.util.Observable,{uiProviders:{},clearOnLoad:true,load:function(A,B){if(this.clearOnLoad){while(A.firstChild){A.removeChild(A.firstChild)}}if(this.doPreload(A)){if(typeof B=="function"){B()}}else{if(this.dataUrl||this.url){this.requestData(A,B)}}},doPreload:function(D){if(D.attributes.children){if(D.childNodes.length<1){var C=D.attributes.children;D.beginUpdate();for(var B=0,A=C.length;BK){return E?-1:+1}else{return 0}}}};Ext.tree.TreeSorter.prototype={doSort:function(A){A.sort(this.sortFn)},compareNodes:function(B,A){return(B.text.toUpperCase()>A.text.toUpperCase()?1:-1)},updateSort:function(A,B){if(B.childrenRendered){this.doSort.defer(1,this,[B])}},updateSortParent:function(A){var B=A.parentNode;if(B&&B.childrenRendered){this.doSort.defer(1,this,[B])}}}; +if(Ext.dd.DropZone){Ext.tree.TreeDropZone=function(A,B){this.allowParentInsert=false;this.allowContainerDrop=false;this.appendOnly=false;Ext.tree.TreeDropZone.superclass.constructor.call(this,A.innerCt,B);this.tree=A;this.dragOverData={};this.lastInsertClass="x-tree-no-status"};Ext.extend(Ext.tree.TreeDropZone,Ext.dd.DropZone,{ddGroup:"TreeDD",expandDelay:1000,expandNode:function(A){if(A.hasChildNodes()&&!A.isExpanded()){A.expand(false,null,this.triggerCacheRefresh.createDelegate(this))}},queueExpand:function(A){this.expandProcId=this.expandNode.defer(this.expandDelay,this,[A])},cancelExpand:function(){if(this.expandProcId){clearTimeout(this.expandProcId);this.expandProcId=false}},isValidDropPoint:function(A,I,G,D,C){if(!A||!C){return false}var E=A.node;var F=C.node;if(!(E&&E.isTarget&&I)){return false}if(I=="append"&&E.allowChildren===false){return false}if((I=="above"||I=="below")&&(E.parentNode&&E.parentNode.allowChildren===false)){return false}if(F&&(E==F||F.contains(E))){return false}var B=this.dragOverData;B.tree=this.tree;B.target=E;B.data=C;B.point=I;B.source=G;B.rawEvent=D;B.dropNode=F;B.cancel=false;var H=this.tree.fireEvent("nodedragover",B);return B.cancel===false&&H!==false},getDropPoint:function(E,D,I){var J=D.node;if(J.isRoot){return J.allowChildren!==false?"append":false}var B=D.ddel;var K=Ext.lib.Dom.getY(B),G=K+B.offsetHeight;var F=Ext.lib.Event.getPageY(E);var H=J.allowChildren===false||J.isLeaf();if(this.appendOnly||J.parentNode.allowChildren===false){return H?false:"append"}var C=false;if(!this.allowParentInsert){C=J.hasChildNodes()&&J.isExpanded()}var A=(G-K)/(H?2:3);if(F>=K&&F<(K+A)){return"above"}else{if(!C&&(H||F>=G-A&&F<=G)){return"below"}else{return"append"}}},onNodeEnter:function(D,A,C,B){this.cancelExpand()},onNodeOver:function(B,G,F,E){var I=this.getDropPoint(F,B,G);var C=B.node;if(!this.expandProcId&&I=="append"&&C.hasChildNodes()&&!B.node.isExpanded()){this.queueExpand(C)}else{if(I!="append"){this.cancelExpand()}}var D=this.dropNotAllowed;if(this.isValidDropPoint(B,I,G,F,E)){if(I){var A=B.ddel;var H;if(I=="above"){D=B.node.isFirst()?"x-tree-drop-ok-above":"x-tree-drop-ok-between";H="x-tree-drag-insert-above"}else{if(I=="below"){D=B.node.isLast()?"x-tree-drop-ok-below":"x-tree-drop-ok-between";H="x-tree-drag-insert-below"}else{D="x-tree-drop-ok-append";H="x-tree-drag-append"}}if(this.lastInsertClass!=H){Ext.fly(A).replaceClass(this.lastInsertClass,H);this.lastInsertClass=H}}}return D},onNodeOut:function(D,A,C,B){this.cancelExpand();this.removeDropIndicators(D)},onNodeDrop:function(C,I,E,D){var H=this.getDropPoint(E,C,I);var F=C.node;F.ui.startDrop();if(!this.isValidDropPoint(C,H,I,E,D)){F.ui.endDrop();return false}var G=D.node||(I.getTreeNode?I.getTreeNode(D,F,H,E):null);var B={tree:this.tree,target:F,data:D,point:H,source:I,rawEvent:E,dropNode:G,cancel:!G,dropStatus:false};var A=this.tree.fireEvent("beforenodedrop",B);if(A===false||B.cancel===true||!B.dropNode){F.ui.endDrop();return B.dropStatus}F=B.target;if(H=="append"&&!F.isExpanded()){F.expand(false,null,function(){this.completeDrop(B)}.createDelegate(this))}else{this.completeDrop(B)}return true},completeDrop:function(G){var D=G.dropNode,E=G.point,C=G.target;if(!Ext.isArray(D)){D=[D]}var F;for(var B=0,A=D.length;BD.offsetLeft){E.scrollLeft=D.offsetLeft}var A=Math.min(this.maxWidth,(E.clientWidth>20?E.clientWidth:E.offsetWidth)-Math.max(0,D.offsetLeft-E.scrollLeft)-5);this.setSize(A,"")},triggerEdit:function(A,B){this.completeEdit();if(A.attributes.editable!==false){this.editNode=A;if(this.tree.autoScroll){A.ui.getEl().scrollIntoView(this.tree.body)}this.autoEditTimer=this.startEdit.defer(this.editDelay,this,[A.ui.textNode,A.text]);return false}},bindScroll:function(){this.tree.getTreeEl().on("scroll",this.cancelEdit,this)},beforeNodeClick:function(A,B){clearTimeout(this.autoEditTimer);if(this.tree.getSelectionModel().isSelected(A)){B.stopEvent();return this.triggerEdit(A)}},onNodeDblClick:function(A,B){clearTimeout(this.autoEditTimer)},updateNode:function(A,B){this.tree.getTreeEl().un("scroll",this.cancelEdit,this);this.editNode.setText(B)},onHide:function(){Ext.tree.TreeEditor.superclass.onHide.call(this);if(this.editNode){this.editNode.ui.focus.defer(50,this.editNode.ui)}},onSpecialKey:function(C,B){var A=B.getKey();if(A==B.ESC){B.stopEvent();this.cancelEdit()}else{if(A==B.ENTER&&!B.hasModifier()){B.stopEvent();this.completeEdit()}}}}); +Ext.menu.Menu=function(A){if(Ext.isArray(A)){A={items:A}}Ext.apply(this,A);this.id=this.id||Ext.id();this.addEvents("beforeshow","beforehide","show","hide","click","mouseover","mouseout","itemclick");Ext.menu.MenuMgr.register(this);Ext.menu.Menu.superclass.constructor.call(this);var B=this.items;this.items=new Ext.util.MixedCollection();if(B){this.add.apply(this,B)}};Ext.extend(Ext.menu.Menu,Ext.util.Observable,{minWidth:120,shadow:"sides",subMenuAlign:"tl-tr?",defaultAlign:"tl-bl?",allowOtherMenus:false,ignoreParentClicks:false,hidden:true,createEl:function(){return new Ext.Layer({cls:"x-menu",shadow:this.shadow,constrain:false,parentEl:this.parentEl||document.body,zindex:15000})},render:function(){if(this.el){return }var B=this.el=this.createEl();if(!this.keyNav){this.keyNav=new Ext.menu.MenuNav(this)}if(this.plain){B.addClass("x-menu-plain")}if(this.cls){B.addClass(this.cls)}this.focusEl=B.createChild({tag:"a",cls:"x-menu-focus",href:"#",onclick:"return false;",tabIndex:"-1"});var A=B.createChild({tag:"ul",cls:"x-menu-list"});A.on("click",this.onClick,this);A.on("mouseover",this.onMouseOver,this);A.on("mouseout",this.onMouseOut,this);this.items.each(function(D){var C=document.createElement("li");C.className="x-menu-list-item";A.dom.appendChild(C);D.render(C,this)},this);this.ul=A;this.autoWidth()},autoWidth:function(){var D=this.el,C=this.ul;if(!D){return }var A=this.width;if(A){D.setWidth(A)}else{if(Ext.isIE){D.setWidth(this.minWidth);var B=D.dom.offsetWidth;D.setWidth(C.getWidth()+D.getFrameWidth("lr"))}}},delayAutoWidth:function(){if(this.el){if(!this.awTask){this.awTask=new Ext.util.DelayedTask(this.autoWidth,this)}this.awTask.delay(20)}},findTargetItem:function(B){var A=B.getTarget(".x-menu-list-item",this.ul,true);if(A&&A.menuItemId){return this.items.get(A.menuItemId)}},onClick:function(B){var A;if(A=this.findTargetItem(B)){if(A.menu&&this.ignoreParentClicks){A.expandMenu()}else{A.onClick(B);this.fireEvent("click",this,A,B)}}},setActiveItem:function(A,B){if(A!=this.activeItem){if(this.activeItem){this.activeItem.deactivate()}this.activeItem=A;A.activate(B)}else{if(B){A.expandMenu()}}},tryActivate:function(F,E){var B=this.items;for(var C=F,A=B.length;C>=0&&C0){H()}})}function H(){if(D&&D.length>0){var N=D.clone();N.each(function(O){O.hide()})}}function E(N){D.remove(N);if(D.length<1){Ext.getDoc().un("mousedown",L);A=false}}function J(N){var O=D.last();K=new Date();D.add(N);if(!A){Ext.getDoc().on("mousedown",L);A=true}if(N.parentMenu){N.getEl().setZIndex(parseInt(N.parentMenu.getEl().getStyle("z-index"),10)+3);N.parentMenu.activeChild=N}else{if(O&&O.isVisible()){N.getEl().setZIndex(parseInt(O.getEl().getStyle("z-index"),10)+3)}}}function B(N){if(N.activeChild){N.activeChild.hide()}if(N.autoHideTimer){clearTimeout(N.autoHideTimer);delete N.autoHideTimer}}function G(N){var O=N.parentMenu;if(!O&&!N.allowOtherMenus){H()}else{if(O&&O.activeChild){O.activeChild.hide()}}}function L(N){if(K.getElapsed()>50&&D.length>0&&!N.getTarget(".x-menu")){H()}}function I(O,R){if(R){var Q=C[O.group];for(var P=0,N=Q.length;P{1}",this.icon||Ext.BLANK_IMAGE_URL,this.itemText||this.text,this.iconCls||"");this.el=C;Ext.menu.Item.superclass.onRender.call(this,B,A)},setText:function(A){this.text=A;if(this.rendered){this.el.update(String.format("{1}",this.icon||Ext.BLANK_IMAGE_URL,this.text,this.iconCls||""));this.parentMenu.autoWidth()}},setIconClass:function(A){var B=this.iconCls;this.iconCls=A;if(this.rendered){this.el.child("img.x-menu-item-icon").replaceClass(B,this.iconCls)}},handleClick:function(A){if(!this.href){A.stopEvent()}Ext.menu.Item.superclass.handleClick.apply(this,arguments)},activate:function(A){if(Ext.menu.Item.superclass.activate.apply(this,arguments)){this.focus();if(A){this.expandMenu()}}return true},shouldDeactivate:function(A){if(Ext.menu.Item.superclass.shouldDeactivate.call(this,A)){if(this.menu&&this.menu.isVisible()){return !this.menu.getEl().getRegion().contains(A.getPoint())}return true}return false},deactivate:function(){Ext.menu.Item.superclass.deactivate.apply(this,arguments);this.hideMenu()},expandMenu:function(A){if(!this.disabled&&this.menu){clearTimeout(this.hideTimer);delete this.hideTimer;if(!this.menu.isVisible()&&!this.showTimer){this.showTimer=this.deferExpand.defer(this.showDelay,this,[A])}else{if(this.menu.isVisible()&&A){this.menu.tryActivate(0,1)}}}},deferExpand:function(A){delete this.showTimer;this.menu.show(this.container,this.parentMenu.subMenuAlign||"tl-tr?",this.parentMenu);if(A){this.menu.tryActivate(0,1)}},hideMenu:function(){clearTimeout(this.showTimer);delete this.showTimer;if(!this.hideTimer&&this.menu&&this.menu.isVisible()){this.hideTimer=this.deferHide.defer(this.hideDelay,this)}},deferHide:function(){delete this.hideTimer;if(this.menu.over){this.parentMenu.setActiveItem(this,false)}else{this.menu.hide()}}}); +Ext.menu.CheckItem=function(A){Ext.menu.CheckItem.superclass.constructor.call(this,A);this.addEvents("beforecheckchange","checkchange");if(this.checkHandler){this.on("checkchange",this.checkHandler,this.scope)}Ext.menu.MenuMgr.registerCheckable(this)};Ext.extend(Ext.menu.CheckItem,Ext.menu.Item,{itemCls:"x-menu-item x-menu-check-item",groupClass:"x-menu-group-item",checked:false,ctype:"Ext.menu.CheckItem",onRender:function(A){Ext.menu.CheckItem.superclass.onRender.apply(this,arguments);if(this.group){this.el.addClass(this.groupClass)}if(this.checked){this.checked=false;this.setChecked(true,true)}},destroy:function(){Ext.menu.MenuMgr.unregisterCheckable(this);Ext.menu.CheckItem.superclass.destroy.apply(this,arguments)},setChecked:function(B,A){if(this.checked!=B&&this.fireEvent("beforecheckchange",this,B)!==false){if(this.container){this.container[B?"addClass":"removeClass"]("x-menu-item-checked")}this.checked=B;if(A!==true){this.fireEvent("checkchange",this,B)}}},handleClick:function(A){if(!this.disabled&&!(this.checked&&this.group)){this.setChecked(!this.checked)}Ext.menu.CheckItem.superclass.handleClick.apply(this,arguments)}}); +Ext.menu.Adapter=function(B,A){Ext.menu.Adapter.superclass.constructor.call(this,A);this.component=B};Ext.extend(Ext.menu.Adapter,Ext.menu.BaseItem,{canActivate:true,onRender:function(B,A){this.component.render(B);this.el=this.component.getEl()},activate:function(){if(this.disabled){return false}this.component.focus();this.fireEvent("activate",this);return true},deactivate:function(){this.fireEvent("deactivate",this)},disable:function(){this.component.disable();Ext.menu.Adapter.superclass.disable.call(this)},enable:function(){this.component.enable();Ext.menu.Adapter.superclass.enable.call(this)}}); +Ext.menu.DateItem=function(A){Ext.menu.DateItem.superclass.constructor.call(this,new Ext.DatePicker(A),A);this.picker=this.component;this.addEvents("select");this.picker.on("render",function(B){B.getEl().swallowEvent("click");B.container.addClass("x-menu-date-item")});this.picker.on("select",this.onSelect,this)};Ext.extend(Ext.menu.DateItem,Ext.menu.Adapter,{onSelect:function(B,A){this.fireEvent("select",this,A,B);Ext.menu.DateItem.superclass.handleClick.call(this)}}); +Ext.menu.ColorItem=function(A){Ext.menu.ColorItem.superclass.constructor.call(this,new Ext.ColorPalette(A),A);this.palette=this.component;this.relayEvents(this.palette,["select"]);if(this.selectHandler){this.on("select",this.selectHandler,this.scope)}};Ext.extend(Ext.menu.ColorItem,Ext.menu.Adapter); +Ext.menu.DateMenu=function(A){Ext.menu.DateMenu.superclass.constructor.call(this,A);this.plain=true;var B=new Ext.menu.DateItem(A);this.add(B);this.picker=B.picker;this.relayEvents(B,["select"]);this.on("beforeshow",function(){if(this.picker){this.picker.hideMonthPicker(true)}},this)};Ext.extend(Ext.menu.DateMenu,Ext.menu.Menu,{cls:"x-date-menu",beforeDestroy:function(){this.picker.destroy()}}); +Ext.menu.ColorMenu=function(A){Ext.menu.ColorMenu.superclass.constructor.call(this,A);this.plain=true;var B=new Ext.menu.ColorItem(A);this.add(B);this.palette=B.palette;this.relayEvents(B,["select"])};Ext.extend(Ext.menu.ColorMenu,Ext.menu.Menu); +Ext.form.Field=Ext.extend(Ext.BoxComponent,{invalidClass:"x-form-invalid",invalidText:"The value in this field is invalid",focusClass:"x-form-focus",validationEvent:"keyup",validateOnBlur:true,validationDelay:250,defaultAutoCreate:{tag:"input",type:"text",size:"20",autocomplete:"off"},fieldClass:"x-form-field",msgTarget:"qtip",msgFx:"normal",readOnly:false,disabled:false,isFormField:true,hasFocus:false,initComponent:function(){Ext.form.Field.superclass.initComponent.call(this);this.addEvents("focus","blur","specialkey","change","invalid","valid")},getName:function(){return this.rendered&&this.el.dom.name?this.el.dom.name:(this.hiddenName||"")},onRender:function(C,A){Ext.form.Field.superclass.onRender.call(this,C,A);if(!this.el){var B=this.getAutoCreate();if(!B.name){B.name=this.name||this.id}if(this.inputType){B.type=this.inputType}this.el=C.createChild(B,A)}var D=this.el.dom.type;if(D){if(D=="password"){D="text"}this.el.addClass("x-form-"+D)}if(this.readOnly){this.el.dom.readOnly=true}if(this.tabIndex!==undefined){this.el.dom.setAttribute("tabIndex",this.tabIndex)}this.el.addClass([this.fieldClass,this.cls])},initValue:function(){if(this.value!==undefined){this.setValue(this.value)}else{if(this.el.dom.value.length>0&&this.el.dom.value!=this.emptyText){this.setValue(this.el.dom.value)}}this.originalValue=this.getValue()},isDirty:function(){if(this.disabled){return false}return String(this.getValue())!==String(this.originalValue)},afterRender:function(){Ext.form.Field.superclass.afterRender.call(this);this.initEvents();this.initValue()},fireKey:function(A){if(A.isSpecialKey()){this.fireEvent("specialkey",this,A)}},reset:function(){this.setValue(this.originalValue);this.clearInvalid()},initEvents:function(){this.el.on(Ext.isIE||Ext.isSafari3?"keydown":"keypress",this.fireKey,this);this.el.on("focus",this.onFocus,this);var A=this.inEditor&&Ext.isWindows&&Ext.isGecko?{buffer:10}:null;this.el.on("blur",this.onBlur,this,A);this.originalValue=this.getValue()},onFocus:function(){if(!Ext.isOpera&&this.focusClass){this.el.addClass(this.focusClass)}if(!this.hasFocus){this.hasFocus=true;this.startValue=this.getValue();this.fireEvent("focus",this)}},beforeBlur:Ext.emptyFn,onBlur:function(){this.beforeBlur();if(!Ext.isOpera&&this.focusClass){this.el.removeClass(this.focusClass)}this.hasFocus=false;if(this.validationEvent!==false&&this.validateOnBlur&&this.validationEvent!="blur"){this.validate()}var A=this.getValue();if(String(A)!==String(this.startValue)){this.fireEvent("change",this,A,this.startValue)}this.fireEvent("blur",this)},isValid:function(A){if(this.disabled){return true}var C=this.preventMark;this.preventMark=A===true;var B=this.validateValue(this.processValue(this.getRawValue()));this.preventMark=C;return B},validate:function(){if(this.disabled||this.validateValue(this.processValue(this.getRawValue()))){this.clearInvalid();return true}return false},processValue:function(A){return A},validateValue:function(A){return true},markInvalid:function(C){if(!this.rendered||this.preventMark){return }this.el.addClass(this.invalidClass);C=C||this.invalidText;switch(this.msgTarget){case"qtip":this.el.dom.qtip=C;this.el.dom.qclass="x-form-invalid-tip";if(Ext.QuickTips){Ext.QuickTips.enable()}break;case"title":this.el.dom.title=C;break;case"under":if(!this.errorEl){var B=this.getErrorCt();if(!B){this.el.dom.title=C;break}this.errorEl=B.createChild({cls:"x-form-invalid-msg"});this.errorEl.setWidth(B.getWidth(true)-20)}this.errorEl.update(C);Ext.form.Field.msgFx[this.msgFx].show(this.errorEl,this);break;case"side":if(!this.errorIcon){var B=this.getErrorCt();if(!B){this.el.dom.title=C;break}this.errorIcon=B.createChild({cls:"x-form-invalid-icon"})}this.alignErrorIcon();this.errorIcon.dom.qtip=C;this.errorIcon.dom.qclass="x-form-invalid-tip";this.errorIcon.show();this.on("resize",this.alignErrorIcon,this);break;default:var A=Ext.getDom(this.msgTarget);A.innerHTML=C;A.style.display=this.msgDisplay;break}this.fireEvent("invalid",this,C)},getErrorCt:function(){return this.el.findParent(".x-form-element",5,true)||this.el.findParent(".x-form-field-wrap",5,true)},alignErrorIcon:function(){this.errorIcon.alignTo(this.el,"tl-tr",[2,0])},clearInvalid:function(){if(!this.rendered||this.preventMark){return }this.el.removeClass(this.invalidClass);switch(this.msgTarget){case"qtip":this.el.dom.qtip="";break;case"title":this.el.dom.title="";break;case"under":if(this.errorEl){Ext.form.Field.msgFx[this.msgFx].hide(this.errorEl,this)}break;case"side":if(this.errorIcon){this.errorIcon.dom.qtip="";this.errorIcon.hide();this.un("resize",this.alignErrorIcon,this)}break;default:var A=Ext.getDom(this.msgTarget);A.innerHTML="";A.style.display="none";break}this.fireEvent("valid",this)},getRawValue:function(){var A=this.rendered?this.el.getValue():Ext.value(this.value,"");if(A===this.emptyText){A=""}return A},getValue:function(){if(!this.rendered){return this.value}var A=this.el.getValue();if(A===this.emptyText||A===undefined){A=""}return A},setRawValue:function(A){return this.el.dom.value=(A===null||A===undefined?"":A)},setValue:function(A){this.value=A;if(this.rendered){this.el.dom.value=(A===null||A===undefined?"":A);this.validate()}},adjustSize:function(A,C){var B=Ext.form.Field.superclass.adjustSize.call(this,A,C);B.width=this.adjustWidth(this.el.dom.tagName,B.width);return B},adjustWidth:function(A,B){A=A.toLowerCase();if(typeof B=="number"&&!Ext.isSafari){if(Ext.isIE&&(A=="input"||A=="textarea")){if(A=="input"&&!Ext.isStrict){return this.inEditor?B:B-3}if(A=="input"&&Ext.isStrict){return B-(Ext.isIE6?4:1)}if(A=="textarea"&&Ext.isStrict){return B-2}}else{if(Ext.isOpera&&Ext.isStrict){if(A=="input"){return B+2}if(A=="textarea"){return B-2}}}}return B}});Ext.form.MessageTargets={"qtip":{mark:function(A){this.el.dom.qtip=msg;this.el.dom.qclass="x-form-invalid-tip";if(Ext.QuickTips){Ext.QuickTips.enable()}},clear:function(A){this.el.dom.qtip=""}},"title":{mark:function(A){this.el.dom.title=msg},clear:function(A){this.el.dom.title=""}},"under":{mark:function(B){if(!this.errorEl){var A=this.getErrorCt();if(!A){this.el.dom.title=msg;return }this.errorEl=A.createChild({cls:"x-form-invalid-msg"});this.errorEl.setWidth(A.getWidth(true)-20)}this.errorEl.update(msg);Ext.form.Field.msgFx[this.msgFx].show(this.errorEl,this)},clear:function(A){if(this.errorEl){Ext.form.Field.msgFx[this.msgFx].hide(this.errorEl,this)}else{this.el.dom.title=""}}},"side":{mark:function(B){if(!this.errorIcon){var A=this.getErrorCt();if(!A){this.el.dom.title=msg;return }this.errorIcon=A.createChild({cls:"x-form-invalid-icon"})}this.alignErrorIcon();this.errorIcon.dom.qtip=msg;this.errorIcon.dom.qclass="x-form-invalid-tip";this.errorIcon.show();this.on("resize",this.alignErrorIcon,this)},clear:function(A){if(this.errorIcon){this.errorIcon.dom.qtip="";this.errorIcon.hide();this.un("resize",this.alignErrorIcon,this)}else{this.el.dom.title=""}}},"around":{mark:function(A){},clear:function(A){}}};Ext.form.Field.msgFx={normal:{show:function(A,B){A.setDisplayed("block")},hide:function(A,B){A.setDisplayed(false).update("")}},slide:{show:function(A,B){A.slideIn("t",{stopFx:true})},hide:function(A,B){A.slideOut("t",{stopFx:true,useDisplay:true})}},slideRight:{show:function(A,B){A.fixDisplay();A.alignTo(B.el,"tl-tr");A.slideIn("l",{stopFx:true})},hide:function(A,B){A.slideOut("l",{stopFx:true,useDisplay:true})}}};Ext.reg("field",Ext.form.Field); +Ext.form.TextField=Ext.extend(Ext.form.Field,{grow:false,growMin:30,growMax:800,vtype:null,maskRe:null,disableKeyFilter:false,allowBlank:true,minLength:0,maxLength:Number.MAX_VALUE,minLengthText:"The minimum length for this field is {0}",maxLengthText:"The maximum length for this field is {0}",selectOnFocus:false,blankText:"This field is required",validator:null,regex:null,regexText:"",emptyText:null,emptyClass:"x-form-empty-field",initComponent:function(){Ext.form.TextField.superclass.initComponent.call(this);this.addEvents("autosize","keydown","keyup","keypress")},initEvents:function(){Ext.form.TextField.superclass.initEvents.call(this);if(this.validationEvent=="keyup"){this.validationTask=new Ext.util.DelayedTask(this.validate,this);this.el.on("keyup",this.filterValidation,this)}else{if(this.validationEvent!==false){this.el.on(this.validationEvent,this.validate,this,{buffer:this.validationDelay})}}if(this.selectOnFocus||this.emptyText){this.on("focus",this.preFocus,this);this.el.on("mousedown",function(){if(!this.hasFocus){this.el.on("mouseup",function(A){A.preventDefault()},this,{single:true})}},this);if(this.emptyText){this.on("blur",this.postBlur,this);this.applyEmptyText()}}if(this.maskRe||(this.vtype&&this.disableKeyFilter!==true&&(this.maskRe=Ext.form.VTypes[this.vtype+"Mask"]))){this.el.on("keypress",this.filterKeys,this)}if(this.grow){this.el.on("keyup",this.onKeyUpBuffered,this,{buffer:50});this.el.on("click",this.autoSize,this)}if(this.enableKeyEvents){this.el.on("keyup",this.onKeyUp,this);this.el.on("keydown",this.onKeyDown,this);this.el.on("keypress",this.onKeyPress,this)}},processValue:function(A){if(this.stripCharsRe){var B=A.replace(this.stripCharsRe,"");if(B!==A){this.setRawValue(B);return B}}return A},filterValidation:function(A){if(!A.isNavKeyPress()){this.validationTask.delay(this.validationDelay)}},onKeyUpBuffered:function(A){if(!A.isNavKeyPress()){this.autoSize()}},onKeyUp:function(A){this.fireEvent("keyup",this,A)},onKeyDown:function(A){this.fireEvent("keydown",this,A)},onKeyPress:function(A){this.fireEvent("keypress",this,A)},reset:function(){Ext.form.TextField.superclass.reset.call(this);this.applyEmptyText()},applyEmptyText:function(){if(this.rendered&&this.emptyText&&this.getRawValue().length<1){this.setRawValue(this.emptyText);this.el.addClass(this.emptyClass)}},preFocus:function(){if(this.emptyText){if(this.el.dom.value==this.emptyText){this.setRawValue("")}this.el.removeClass(this.emptyClass)}if(this.selectOnFocus){this.el.dom.select()}},postBlur:function(){this.applyEmptyText()},filterKeys:function(B){if(B.ctrlKey){return }var A=B.getKey();if(Ext.isGecko&&(B.isNavKeyPress()||A==B.BACKSPACE||(A==B.DELETE&&B.button==-1))){return }var D=B.getCharCode(),C=String.fromCharCode(D);if(!Ext.isGecko&&B.isSpecialKey()&&!C){return }if(!this.maskRe.test(C)){B.stopEvent()}},setValue:function(A){if(this.emptyText&&this.el&&A!==undefined&&A!==null&&A!==""){this.el.removeClass(this.emptyClass)}Ext.form.TextField.superclass.setValue.apply(this,arguments);this.applyEmptyText();this.autoSize()},validateValue:function(A){if(A.length<1||A===this.emptyText){if(this.allowBlank){this.clearInvalid();return true}else{this.markInvalid(this.blankText);return false}}if(A.lengththis.maxLength){this.markInvalid(String.format(this.maxLengthText,this.maxLength));return false}if(this.vtype){var C=Ext.form.VTypes;if(!C[this.vtype](A,this)){this.markInvalid(this.vtypeText||C[this.vtype+"Text"]);return false}}if(typeof this.validator=="function"){var B=this.validator(A);if(B!==true){this.markInvalid(B);return false}}if(this.regex&&!this.regex.test(A)){this.markInvalid(this.regexText);return false}return true},selectText:function(E,A){var C=this.getRawValue();if(C.length>0){E=E===undefined?0:E;A=A===undefined?C.length:A;var D=this.el.dom;if(D.setSelectionRange){D.setSelectionRange(E,A)}else{if(D.createTextRange){var B=D.createTextRange();B.moveStart("character",E);B.moveEnd("character",A-C.length);B.select()}}}},autoSize:function(){if(!this.grow||!this.rendered){return }if(!this.metrics){this.metrics=Ext.util.TextMetrics.createInstance(this.el)}var C=this.el;var B=C.dom.value;var D=document.createElement("div");D.appendChild(document.createTextNode(B));B=D.innerHTML;D=null;B+=" ";var A=Math.min(this.growMax,Math.max(this.metrics.getWidth(B)+10,this.growMin));this.el.setWidth(A);this.fireEvent("autosize",this,A)}});Ext.reg("textfield",Ext.form.TextField); +Ext.form.TriggerField=Ext.extend(Ext.form.TextField,{defaultAutoCreate:{tag:"input",type:"text",size:"16",autocomplete:"off"},hideTrigger:false,autoSize:Ext.emptyFn,monitorTab:true,deferHeight:true,mimicing:false,onResize:function(A,B){Ext.form.TriggerField.superclass.onResize.call(this,A,B);if(typeof A=="number"){this.el.setWidth(this.adjustWidth("input",A-this.trigger.getWidth()))}this.wrap.setWidth(this.el.getWidth()+this.trigger.getWidth())},adjustSize:Ext.BoxComponent.prototype.adjustSize,getResizeEl:function(){return this.wrap},getPositionEl:function(){return this.wrap},alignErrorIcon:function(){if(this.wrap){this.errorIcon.alignTo(this.wrap,"tl-tr",[2,0])}},onRender:function(B,A){Ext.form.TriggerField.superclass.onRender.call(this,B,A);this.wrap=this.el.wrap({cls:"x-form-field-wrap"});this.trigger=this.wrap.createChild(this.triggerConfig||{tag:"img",src:Ext.BLANK_IMAGE_URL,cls:"x-form-trigger "+this.triggerClass});if(this.hideTrigger){this.trigger.setDisplayed(false)}this.initTrigger();if(!this.width){this.wrap.setWidth(this.el.getWidth()+this.trigger.getWidth())}},afterRender:function(){Ext.form.TriggerField.superclass.afterRender.call(this);var A;if(Ext.isIE&&this.el.getY()!=(A=this.trigger.getY())){this.el.position();this.el.setY(A)}},initTrigger:function(){this.trigger.on("click",this.onTriggerClick,this,{preventDefault:true});this.trigger.addClassOnOver("x-form-trigger-over");this.trigger.addClassOnClick("x-form-trigger-click")},onDestroy:function(){if(this.trigger){this.trigger.removeAllListeners();this.trigger.remove()}if(this.wrap){this.wrap.remove()}Ext.form.TriggerField.superclass.onDestroy.call(this)},onFocus:function(){Ext.form.TriggerField.superclass.onFocus.call(this);if(!this.mimicing){this.wrap.addClass("x-trigger-wrap-focus");this.mimicing=true;Ext.get(Ext.isIE?document.body:document).on("mousedown",this.mimicBlur,this,{delay:10});if(this.monitorTab){this.el.on("keydown",this.checkTab,this)}}},checkTab:function(A){if(A.getKey()==A.TAB){this.triggerBlur()}},onBlur:function(){},mimicBlur:function(A){if(!this.wrap.contains(A.target)&&this.validateBlur(A)){this.triggerBlur()}},triggerBlur:function(){this.mimicing=false;Ext.get(Ext.isIE?document.body:document).un("mousedown",this.mimicBlur,this);if(this.monitorTab){this.el.un("keydown",this.checkTab,this)}this.beforeBlur();this.wrap.removeClass("x-trigger-wrap-focus");Ext.form.TriggerField.superclass.onBlur.call(this)},beforeBlur:Ext.emptyFn,validateBlur:function(A){return true},onDisable:function(){Ext.form.TriggerField.superclass.onDisable.call(this);if(this.wrap){this.wrap.addClass(this.disabledClass);this.el.removeClass(this.disabledClass)}},onEnable:function(){Ext.form.TriggerField.superclass.onEnable.call(this);if(this.wrap){this.wrap.removeClass(this.disabledClass)}},onShow:function(){if(this.wrap){this.wrap.dom.style.display="";this.wrap.dom.style.visibility="visible"}},onHide:function(){this.wrap.dom.style.display="none"},onTriggerClick:Ext.emptyFn});Ext.form.TwinTriggerField=Ext.extend(Ext.form.TriggerField,{initComponent:function(){Ext.form.TwinTriggerField.superclass.initComponent.call(this);this.triggerConfig={tag:"span",cls:"x-form-twin-triggers",cn:[{tag:"img",src:Ext.BLANK_IMAGE_URL,cls:"x-form-trigger "+this.trigger1Class},{tag:"img",src:Ext.BLANK_IMAGE_URL,cls:"x-form-trigger "+this.trigger2Class}]}},getTrigger:function(A){return this.triggers[A]},initTrigger:function(){var A=this.trigger.select(".x-form-trigger",true);this.wrap.setStyle("overflow","hidden");var B=this;A.each(function(D,F,C){D.hide=function(){var G=B.wrap.getWidth();this.dom.style.display="none";B.el.setWidth(G-B.trigger.getWidth())};D.show=function(){var G=B.wrap.getWidth();this.dom.style.display="";B.el.setWidth(G-B.trigger.getWidth())};var E="Trigger"+(C+1);if(this["hide"+E]){D.dom.style.display="none"}D.on("click",this["on"+E+"Click"],this,{preventDefault:true});D.addClassOnOver("x-form-trigger-over");D.addClassOnClick("x-form-trigger-click")},this);this.triggers=A.elements},onTrigger1Click:Ext.emptyFn,onTrigger2Click:Ext.emptyFn});Ext.reg("trigger",Ext.form.TriggerField); +Ext.form.TextArea=Ext.extend(Ext.form.TextField,{growMin:60,growMax:1000,growAppend:" \n ",growPad:0,enterIsSpecial:false,preventScrollbars:false,onRender:function(B,A){if(!this.el){this.defaultAutoCreate={tag:"textarea",style:"width:100px;height:60px;",autocomplete:"off"}}Ext.form.TextArea.superclass.onRender.call(this,B,A);if(this.grow){this.textSizeEl=Ext.DomHelper.append(document.body,{tag:"pre",cls:"x-form-grow-sizer"});if(this.preventScrollbars){this.el.setStyle("overflow","hidden")}this.el.setHeight(this.growMin)}},onDestroy:function(){if(this.textSizeEl){Ext.removeNode(this.textSizeEl)}Ext.form.TextArea.superclass.onDestroy.call(this)},fireKey:function(A){if(A.isSpecialKey()&&(this.enterIsSpecial||(A.getKey()!=A.ENTER||A.hasModifier()))){this.fireEvent("specialkey",this,A)}},onKeyUp:function(A){if(!A.isNavKeyPress()||A.getKey()==A.ENTER){this.autoSize()}Ext.form.TextArea.superclass.onKeyUp.call(this,A)},autoSize:function(){if(!this.grow||!this.textSizeEl){return }var C=this.el;var A=C.dom.value;var D=this.textSizeEl;D.innerHTML="";D.appendChild(document.createTextNode(A));A=D.innerHTML;Ext.fly(D).setWidth(this.el.getWidth());if(A.length<1){A="  "}else{if(Ext.isIE){A=A.replace(/\n/g,"

       

      ")}A+=this.growAppend}D.innerHTML=A;var B=Math.min(this.growMax,Math.max(D.offsetHeight,this.growMin)+this.growPad);if(B!=this.lastHeight){this.lastHeight=B;this.el.setHeight(B);this.fireEvent("autosize",this,B)}}});Ext.reg("textarea",Ext.form.TextArea); +Ext.form.NumberField=Ext.extend(Ext.form.TextField,{fieldClass:"x-form-field x-form-num-field",allowDecimals:true,decimalSeparator:".",decimalPrecision:2,allowNegative:true,minValue:Number.NEGATIVE_INFINITY,maxValue:Number.MAX_VALUE,minText:"The minimum value for this field is {0}",maxText:"The maximum value for this field is {0}",nanText:"{0} is not a valid number",baseChars:"0123456789",initEvents:function(){Ext.form.NumberField.superclass.initEvents.call(this);var B=this.baseChars+"";if(this.allowDecimals){B+=this.decimalSeparator}if(this.allowNegative){B+="-"}this.stripCharsRe=new RegExp("[^"+B+"]","gi");var A=function(D){var C=D.getKey();if(!Ext.isIE&&(D.isSpecialKey()||C==D.BACKSPACE||C==D.DELETE)){return }var E=D.getCharCode();if(B.indexOf(String.fromCharCode(E))===-1){D.stopEvent()}};this.el.on("keypress",A,this)},validateValue:function(B){if(!Ext.form.NumberField.superclass.validateValue.call(this,B)){return false}if(B.length<1){return true}B=String(B).replace(this.decimalSeparator,".");if(isNaN(B)){this.markInvalid(String.format(this.nanText,B));return false}var A=this.parseValue(B);if(Athis.maxValue){this.markInvalid(String.format(this.maxText,this.maxValue));return false}return true},getValue:function(){return this.fixPrecision(this.parseValue(Ext.form.NumberField.superclass.getValue.call(this)))},setValue:function(A){A=typeof A=="number"?A:parseFloat(String(A).replace(this.decimalSeparator,"."));A=isNaN(A)?"":String(A).replace(".",this.decimalSeparator);Ext.form.NumberField.superclass.setValue.call(this,A)},parseValue:function(A){A=parseFloat(String(A).replace(this.decimalSeparator,"."));return isNaN(A)?"":A},fixPrecision:function(B){var A=isNaN(B);if(!this.allowDecimals||this.decimalPrecision==-1||A||!B){return A?"":B}return parseFloat(parseFloat(B).toFixed(this.decimalPrecision))},beforeBlur:function(){var A=this.parseValue(this.getRawValue());if(A){this.setValue(this.fixPrecision(A))}}});Ext.reg("numberfield",Ext.form.NumberField); +Ext.form.DateField=Ext.extend(Ext.form.TriggerField,{format:"m/d/Y",altFormats:"m/d/Y|n/j/Y|n/j/y|m/j/y|n/d/y|m/j/Y|n/d/Y|m-d-y|m-d-Y|m/d|m-d|md|mdy|mdY|d|Y-m-d",disabledDaysText:"Disabled",disabledDatesText:"Disabled",minText:"The date in this field must be equal to or after {0}",maxText:"The date in this field must be equal to or before {0}",invalidText:"{0} is not a valid date - it must be in the format {1}",triggerClass:"x-form-date-trigger",showToday:true,defaultAutoCreate:{tag:"input",type:"text",size:"10",autocomplete:"off"},initComponent:function(){Ext.form.DateField.superclass.initComponent.call(this);if(typeof this.minValue=="string"){this.minValue=this.parseDate(this.minValue)}if(typeof this.maxValue=="string"){this.maxValue=this.parseDate(this.maxValue)}this.ddMatch=null;this.initDisabledDays()},initDisabledDays:function(){if(this.disabledDates){var A=this.disabledDates;var C="(?:";for(var B=0;Bthis.maxValue.getTime()){this.markInvalid(String.format(this.maxText,this.formatDate(this.maxValue)));return false}if(this.disabledDays){var A=E.getDay();for(var B=0;B
      {"+this.displayField+"}
      "}this.view=new Ext.DataView({applyTo:this.innerList,tpl:this.tpl,singleSelect:true,selectedClass:this.selectedClass,itemSelector:this.itemSelector||"."+A+"-item"});this.view.on("click",this.onViewClick,this);this.bindStore(this.store,true);if(this.resizable){this.resizer=new Ext.Resizable(this.list,{pinned:true,handles:"se"});this.resizer.on("resize",function(E,C,D){this.maxHeight=D-this.handleHeight-this.list.getFrameWidth("tb")-this.assetHeight;this.listWidth=C;this.innerList.setWidth(C-this.list.getFrameWidth("lr"));this.restrictHeight()},this);this[this.pageSize?"footer":"innerList"].setStyle("margin-bottom",this.handleHeight+"px")}}},bindStore:function(A,B){if(this.store&&!B){this.store.un("beforeload",this.onBeforeLoad,this);this.store.un("load",this.onLoad,this);this.store.un("loadexception",this.collapse,this);if(!A){this.store=null;if(this.view){this.view.setStore(null)}}}if(A){this.store=Ext.StoreMgr.lookup(A);this.store.on("beforeload",this.onBeforeLoad,this);this.store.on("load",this.onLoad,this);this.store.on("loadexception",this.collapse,this);if(this.view){this.view.setStore(A)}}},initEvents:function(){Ext.form.ComboBox.superclass.initEvents.call(this);this.keyNav=new Ext.KeyNav(this.el,{"up":function(A){this.inKeyMode=true;this.selectPrev()},"down":function(A){if(!this.isExpanded()){this.onTriggerClick()}else{this.inKeyMode=true;this.selectNext()}},"enter":function(A){this.onViewClick();this.delayedCheck=true;this.unsetDelayCheck.defer(10,this)},"esc":function(A){this.collapse()},"tab":function(A){this.onViewClick(false);return true},scope:this,doRelay:function(C,B,A){if(A=="down"||this.scope.isExpanded()){return Ext.KeyNav.prototype.doRelay.apply(this,arguments)}return true},forceKeyDown:true});this.queryDelay=Math.max(this.queryDelay||10,this.mode=="local"?10:250);this.dqTask=new Ext.util.DelayedTask(this.initQuery,this);if(this.typeAhead){this.taTask=new Ext.util.DelayedTask(this.onTypeAhead,this)}if(this.editable!==false){this.el.on("keyup",this.onKeyUp,this)}if(this.forceSelection){this.on("blur",this.doForce,this)}},onDestroy:function(){if(this.view){this.view.el.removeAllListeners();this.view.el.remove();this.view.purgeListeners()}if(this.list){this.list.destroy()}this.bindStore(null);Ext.form.ComboBox.superclass.onDestroy.call(this)},unsetDelayCheck:function(){delete this.delayedCheck},fireKey:function(A){if(A.isNavKeyPress()&&!this.isExpanded()&&!this.delayedCheck){this.fireEvent("specialkey",this,A)}},onResize:function(A,B){Ext.form.ComboBox.superclass.onResize.apply(this,arguments);if(this.list&&this.listWidth===undefined){var C=Math.max(A,this.minListWidth);this.list.setWidth(C);this.innerList.setWidth(C-this.list.getFrameWidth("lr"))}},onEnable:function(){Ext.form.ComboBox.superclass.onEnable.apply(this,arguments);if(this.hiddenField){this.hiddenField.disabled=false}},onDisable:function(){Ext.form.ComboBox.superclass.onDisable.apply(this,arguments);if(this.hiddenField){this.hiddenField.disabled=true}},setEditable:function(A){if(A==this.editable){return }this.editable=A;if(!A){this.el.dom.setAttribute("readOnly",true);this.el.on("mousedown",this.onTriggerClick,this);this.el.addClass("x-combo-noedit")}else{this.el.dom.setAttribute("readOnly",false);this.el.un("mousedown",this.onTriggerClick,this);this.el.removeClass("x-combo-noedit")}},onBeforeLoad:function(){if(!this.hasFocus){return }this.innerList.update(this.loadingText?"
      "+this.loadingText+"
      ":"");this.restrictHeight();this.selectedIndex=-1},onLoad:function(){if(!this.hasFocus){return }if(this.store.getCount()>0){this.expand();this.restrictHeight();if(this.lastQuery==this.allQuery){if(this.editable){this.el.dom.select()}if(!this.selectByValue(this.value,true)){this.select(0,true)}}else{this.selectNext();if(this.typeAhead&&this.lastKey!=Ext.EventObject.BACKSPACE&&this.lastKey!=Ext.EventObject.DELETE){this.taTask.delay(this.typeAheadDelay)}}}else{this.onEmptyResults()}},onTypeAhead:function(){if(this.store.getCount()>0){var B=this.store.getAt(0);var C=B.data[this.displayField];var A=C.length;var D=this.getRawValue().length;if(D!=A){this.setRawValue(C);this.selectText(D,C.length)}}},onSelect:function(A,B){if(this.fireEvent("beforeselect",this,A,B)!==false){this.setValue(A.data[this.valueField||this.displayField]);this.collapse();this.fireEvent("select",this,A,B)}},getValue:function(){if(this.valueField){return typeof this.value!="undefined"?this.value:""}else{return Ext.form.ComboBox.superclass.getValue.call(this)}},clearValue:function(){if(this.hiddenField){this.hiddenField.value=""}this.setRawValue("");this.lastSelectionText="";this.applyEmptyText();this.value=""},setValue:function(A){var C=A;if(this.valueField){var B=this.findRecord(this.valueField,A);if(B){C=B.data[this.displayField]}else{if(this.valueNotFoundText!==undefined){C=this.valueNotFoundText}}}this.lastSelectionText=C;if(this.hiddenField){this.hiddenField.value=A}Ext.form.ComboBox.superclass.setValue.call(this,C);this.value=A},findRecord:function(C,B){var A;if(this.store.getCount()>0){this.store.each(function(D){if(D.data[C]==B){A=D;return false}})}return A},onViewMove:function(B,A){this.inKeyMode=false},onViewOver:function(D,B){if(this.inKeyMode){return }var C=this.view.findItemFromChild(B);if(C){var A=this.view.indexOf(C);this.select(A,false)}},onViewClick:function(B){var A=this.view.getSelectedIndexes()[0];var C=this.store.getAt(A);if(C){this.onSelect(C,A)}if(B!==false){this.el.focus()}},restrictHeight:function(){this.innerList.dom.style.height="";var B=this.innerList.dom;var E=this.list.getFrameWidth("tb")+(this.resizable?this.handleHeight:0)+this.assetHeight;var C=Math.max(B.clientHeight,B.offsetHeight,B.scrollHeight);var A=this.getPosition()[1]-Ext.getBody().getScroll().top;var F=Ext.lib.Dom.getViewHeight()-A-this.getSize().height;var D=Math.max(A,F,this.minHeight||0)-this.list.shadowOffset-E-5;C=Math.min(C,D,this.maxHeight);this.innerList.setHeight(C);this.list.beginUpdate();this.list.setHeight(C+E);this.list.alignTo(this.wrap,this.listAlign);this.list.endUpdate()},onEmptyResults:function(){this.collapse()},isExpanded:function(){return this.list&&this.list.isVisible()},selectByValue:function(A,C){if(A!==undefined&&A!==null){var B=this.findRecord(this.valueField||this.displayField,A);if(B){this.select(this.store.indexOf(B),C);return true}}return false},select:function(A,C){this.selectedIndex=A;this.view.select(A);if(C!==false){var B=this.view.getNode(A);if(B){this.innerList.scrollChildIntoView(B,false)}}},selectNext:function(){var A=this.store.getCount();if(A>0){if(this.selectedIndex==-1){this.select(0)}else{if(this.selectedIndex0){if(this.selectedIndex==-1){this.select(0)}else{if(this.selectedIndex!=0){this.select(this.selectedIndex-1)}}}},onKeyUp:function(A){if(this.editable!==false&&!A.isSpecialKey()){this.lastKey=A.getKey();this.dqTask.delay(this.queryDelay)}},validateBlur:function(){return !this.list||!this.list.isVisible()},initQuery:function(){this.doQuery(this.getRawValue())},doForce:function(){if(this.el.dom.value.length>0){this.el.dom.value=this.lastSelectionText===undefined?"":this.lastSelectionText;this.applyEmptyText()}},doQuery:function(C,B){if(C===undefined||C===null){C=""}var A={query:C,forceAll:B,combo:this,cancel:false};if(this.fireEvent("beforequery",A)===false||A.cancel){return false}C=A.query;B=A.forceAll;if(B===true||(C.length>=this.minChars)){if(this.lastQuery!==C){this.lastQuery=C;if(this.mode=="local"){this.selectedIndex=-1;if(B){this.store.clearFilter()}else{this.store.filter(this.displayField,C)}this.onLoad()}else{this.store.baseParams[this.queryParam]=C;this.store.load({params:this.getParams(C)});this.expand()}}else{this.selectedIndex=-1;this.onLoad()}}},getParams:function(A){var B={};if(this.pageSize){B.start=0;B.limit=this.pageSize}return B},collapse:function(){if(!this.isExpanded()){return }this.list.hide();Ext.getDoc().un("mousewheel",this.collapseIf,this);Ext.getDoc().un("mousedown",this.collapseIf,this);this.fireEvent("collapse",this)},collapseIf:function(A){if(!A.within(this.wrap)&&!A.within(this.list)){this.collapse()}},expand:function(){if(this.isExpanded()||!this.hasFocus){return }this.list.alignTo(this.wrap,this.listAlign);this.list.show();this.innerList.setOverflow("auto");Ext.getDoc().on("mousewheel",this.collapseIf,this);Ext.getDoc().on("mousedown",this.collapseIf,this);this.fireEvent("expand",this)},onTriggerClick:function(){if(this.disabled){return }if(this.isExpanded()){this.collapse();this.el.focus()}else{this.onFocus({});if(this.triggerAction=="all"){this.doQuery(this.allQuery,true)}else{this.doQuery(this.getRawValue())}this.el.focus()}}});Ext.reg("combo",Ext.form.ComboBox); +Ext.form.Checkbox=Ext.extend(Ext.form.Field,{checkedCls:"x-form-check-checked",focusCls:"x-form-check-focus",overCls:"x-form-check-over",mouseDownCls:"x-form-check-down",tabIndex:0,checked:false,defaultAutoCreate:{tag:"input",type:"checkbox",autocomplete:"off"},baseCls:"x-form-check",initComponent:function(){Ext.form.Checkbox.superclass.initComponent.call(this);this.addEvents("check")},initEvents:function(){Ext.form.Checkbox.superclass.initEvents.call(this);this.initCheckEvents()},initCheckEvents:function(){this.innerWrap.removeAllListeners();this.innerWrap.addClassOnOver(this.overCls);this.innerWrap.addClassOnClick(this.mouseDownCls);this.innerWrap.on("click",this.onClick,this);this.innerWrap.on("keyup",this.onKeyUp,this)},onRender:function(B,A){Ext.form.Checkbox.superclass.onRender.call(this,B,A);if(this.inputValue!==undefined){this.el.dom.value=this.inputValue}this.el.addClass("x-hidden");this.innerWrap=this.el.wrap({tabIndex:this.tabIndex,cls:this.baseCls+"-wrap-inner"});this.wrap=this.innerWrap.wrap({cls:this.baseCls+"-wrap"});if(this.boxLabel){this.labelEl=this.innerWrap.createChild({tag:"label",htmlFor:this.el.id,cls:"x-form-cb-label",html:this.boxLabel})}this.imageEl=this.innerWrap.createChild({tag:"img",src:Ext.BLANK_IMAGE_URL,cls:this.baseCls},this.el);if(this.checked){this.setValue(true)}else{this.checked=this.el.dom.checked}this.originalValue=this.checked},onDestroy:function(){if(this.rendered){Ext.destroy(this.imageEl,this.labelEl,this.innerWrap,this.wrap)}Ext.form.Checkbox.superclass.onDestroy.call(this)},onFocus:function(A){Ext.form.Checkbox.superclass.onFocus.call(this,A);this.el.addClass(this.focusCls)},onBlur:function(A){Ext.form.Checkbox.superclass.onBlur.call(this,A);this.el.removeClass(this.focusCls)},onResize:function(){Ext.form.Checkbox.superclass.onResize.apply(this,arguments);if(!this.boxLabel&&!this.fieldLabel){this.el.alignTo(this.wrap,"c-c")}},onKeyUp:function(A){if(A.getKey()==Ext.EventObject.SPACE){this.onClick(A)}},onClick:function(A){if(!this.disabled&&!this.readOnly){this.toggleValue()}A.stopEvent()},onEnable:function(){Ext.form.Checkbox.superclass.onEnable.call(this);this.initCheckEvents()},onDisable:function(){Ext.form.Checkbox.superclass.onDisable.call(this);this.innerWrap.removeAllListeners()},toggleValue:function(){this.setValue(!this.checked)},getResizeEl:function(){if(!this.resizeEl){this.resizeEl=Ext.isSafari?this.wrap:(this.wrap.up(".x-form-element",5)||this.wrap)}return this.resizeEl},getPositionEl:function(){return this.wrap},getActionEl:function(){return this.wrap},markInvalid:Ext.emptyFn,clearInvalid:Ext.emptyFn,initValue:Ext.emptyFn,getValue:function(){if(this.rendered){return this.el.dom.checked}return false},setValue:function(A){var B=this.checked;this.checked=(A===true||A==="true"||A=="1"||String(A).toLowerCase()=="on");if(this.el&&this.el.dom){this.el.dom.checked=this.checked;this.el.dom.defaultChecked=this.checked}this.wrap[this.checked?"addClass":"removeClass"](this.checkedCls);if(B!=this.checked){this.fireEvent("check",this,this.checked);if(this.handler){this.handler.call(this.scope||this,this,this.checked)}}}});Ext.reg("checkbox",Ext.form.Checkbox); +Ext.form.CheckboxGroup=Ext.extend(Ext.form.Field,{columns:"auto",vertical:false,allowBlank:true,blankText:"You must select at least one item in this group",defaultType:"checkbox",groupCls:"x-form-check-group",onRender:function(H,F){if(!this.el){var M={cls:this.groupCls,layout:"column",border:false,renderTo:H};var A={defaultType:this.defaultType,layout:"form",border:false,defaults:{hideLabel:true,anchor:"100%"}};if(this.items[0].items){Ext.apply(M,{layoutConfig:{columns:this.items.length},defaults:this.defaults,items:this.items});for(var E=0,J=this.items.length;E0&&E%O==0){L++}if(this.items[E].fieldLabel){this.items[E].hideLabel=false}K[L].items.push(this.items[E])}}else{for(var E=0,J=this.items.length;E":">"),C,"")}return D.join("")},createToolbar:function(D){var A=Ext.QuickTips&&Ext.QuickTips.isEnabled();function C(G,E,F){return{itemId:G,cls:"x-btn-icon x-edit-"+G,enableToggle:E!==false,scope:D,handler:F||D.relayBtnCmd,clickEvent:"mousedown",tooltip:A?D.buttonTips[G]||undefined:undefined,tabIndex:-1}}var B=new Ext.Toolbar({renderTo:this.wrap.dom.firstChild});B.el.on("click",function(E){E.preventDefault()});if(this.enableFont&&!Ext.isSafari2){this.fontSelect=B.el.createChild({tag:"select",cls:"x-font-select",html:this.createFontOptions()});this.fontSelect.on("change",function(){var E=this.fontSelect.dom.value;this.relayCmd("fontname",E);this.deferFocus()},this);B.add(this.fontSelect.dom,"-")}if(this.enableFormat){B.add(C("bold"),C("italic"),C("underline"))}if(this.enableFontSize){B.add("-",C("increasefontsize",false,this.adjustFont),C("decreasefontsize",false,this.adjustFont))}if(this.enableColors){B.add("-",{itemId:"forecolor",cls:"x-btn-icon x-edit-forecolor",clickEvent:"mousedown",tooltip:A?D.buttonTips["forecolor"]||undefined:undefined,tabIndex:-1,menu:new Ext.menu.ColorMenu({allowReselect:true,focus:Ext.emptyFn,value:"000000",plain:true,selectHandler:function(F,E){this.execCmd("forecolor",Ext.isSafari||Ext.isIE?"#"+E:E);this.deferFocus()},scope:this,clickEvent:"mousedown"})},{itemId:"backcolor",cls:"x-btn-icon x-edit-backcolor",clickEvent:"mousedown",tooltip:A?D.buttonTips["backcolor"]||undefined:undefined,tabIndex:-1,menu:new Ext.menu.ColorMenu({focus:Ext.emptyFn,value:"FFFFFF",plain:true,allowReselect:true,selectHandler:function(F,E){if(Ext.isGecko){this.execCmd("useCSS",false);this.execCmd("hilitecolor",E);this.execCmd("useCSS",true);this.deferFocus()}else{this.execCmd(Ext.isOpera?"hilitecolor":"backcolor",Ext.isSafari||Ext.isIE?"#"+E:E);this.deferFocus()}},scope:this,clickEvent:"mousedown"})})}if(this.enableAlignments){B.add("-",C("justifyleft"),C("justifycenter"),C("justifyright"))}if(!Ext.isSafari2){if(this.enableLinks){B.add("-",C("createlink",false,this.createLink))}if(this.enableLists){B.add("-",C("insertorderedlist"),C("insertunorderedlist"))}if(this.enableSourceEdit){B.add("-",C("sourceedit",true,function(E){this.toggleSourceEdit(E.pressed)}))}}this.tb=B},getDocMarkup:function(){return""},getEditorBody:function(){return this.doc.body||this.doc.documentElement},getDoc:function(){return Ext.isIE?this.getWin().document:(this.iframe.contentDocument||this.getWin().document)},getWin:function(){return Ext.isIE?this.iframe.contentWindow:window.frames[this.iframe.name]},onRender:function(B,A){Ext.form.HtmlEditor.superclass.onRender.call(this,B,A);this.el.dom.style.border="0 none";this.el.dom.setAttribute("tabIndex",-1);this.el.addClass("x-hidden");if(Ext.isIE){this.el.applyStyles("margin-top:-1px;margin-bottom:-1px;")}this.wrap=this.el.wrap({cls:"x-html-editor-wrap",cn:{cls:"x-html-editor-tb"}});this.createToolbar(this);this.tb.items.each(function(E){if(E.itemId!="sourceedit"){E.disable()}});var C=document.createElement("iframe");C.name=Ext.id();C.frameBorder="0";C.src=Ext.isIE?Ext.SSL_SECURE_URL:"javascript:;";this.wrap.dom.appendChild(C);this.iframe=C;this.initFrame();if(this.autoMonitorDesignMode!==false){this.monitorTask=Ext.TaskMgr.start({run:this.checkDesignMode,scope:this,interval:100})}if(!this.width){var D=this.el.getSize();this.setSize(D.width,this.height||D.height)}},initFrame:function(){this.doc=this.getDoc();this.win=this.getWin();this.doc.open();this.doc.write(this.getDocMarkup());this.doc.close();var A={run:function(){if(this.doc.body||this.doc.readyState=="complete"){Ext.TaskMgr.stop(A);this.doc.designMode="on";this.initEditor.defer(10,this)}},interval:10,duration:10000,scope:this};Ext.TaskMgr.start(A)},checkDesignMode:function(){if(this.wrap&&this.wrap.dom.offsetWidth){var A=this.getDoc();if(!A){return }if(!A.editorInitialized||String(A.designMode).toLowerCase()!="on"){this.initFrame()}}},onResize:function(B,C){Ext.form.HtmlEditor.superclass.onResize.apply(this,arguments);if(this.el&&this.iframe){if(typeof B=="number"){var D=B-this.wrap.getFrameWidth("lr");this.el.setWidth(this.adjustWidth("textarea",D));this.iframe.style.width=D+"px"}if(typeof C=="number"){var A=C-this.wrap.getFrameWidth("tb")-this.tb.el.getHeight();this.el.setHeight(this.adjustWidth("textarea",A));this.iframe.style.height=A+"px";if(this.doc){this.getEditorBody().style.height=(A-(this.iframePad*2))+"px"}}}},toggleSourceEdit:function(A){if(A===undefined){A=!this.sourceEditMode}this.sourceEditMode=A===true;var C=this.tb.items.get("sourceedit");if(C.pressed!==this.sourceEditMode){C.toggle(this.sourceEditMode);return }if(this.sourceEditMode){this.tb.items.each(function(D){if(D.itemId!="sourceedit"){D.disable()}});this.syncValue();this.iframe.className="x-hidden";this.el.removeClass("x-hidden");this.el.dom.removeAttribute("tabIndex");this.el.focus()}else{if(this.initialized){this.tb.items.each(function(D){D.enable()})}this.pushValue();this.iframe.className="";this.el.addClass("x-hidden");this.el.dom.setAttribute("tabIndex",-1);this.deferFocus()}var B=this.lastSize;if(B){delete this.lastSize;this.setSize(B)}this.fireEvent("editmodechange",this,this.sourceEditMode)},createLink:function(){var A=prompt(this.createLinkText,this.defaultLinkValue);if(A&&A!="http:/"+"/"){this.relayCmd("createlink",A)}},adjustSize:Ext.BoxComponent.prototype.adjustSize,getResizeEl:function(){return this.wrap},getPositionEl:function(){return this.wrap},initEvents:function(){this.originalValue=this.getValue()},markInvalid:Ext.emptyFn,clearInvalid:Ext.emptyFn,setValue:function(A){Ext.form.HtmlEditor.superclass.setValue.call(this,A);this.pushValue()},cleanHtml:function(A){A=String(A);if(A.length>5){if(Ext.isSafari){A=A.replace(/\sclass="(?:Apple-style-span|khtml-block-placeholder)"/gi,"")}}if(A==" "){A=""}return A},syncValue:function(){if(this.initialized){var D=this.getEditorBody();var C=D.innerHTML;if(Ext.isSafari){var B=D.getAttribute("style");var A=B.match(/text-align:(.*?);/i);if(A&&A[1]){C="
      "+C+"
      "}}C=this.cleanHtml(C);if(this.fireEvent("beforesync",this,C)!==false){this.el.dom.value=C;this.fireEvent("sync",this,C)}}},pushValue:function(){if(this.initialized){var A=this.el.dom.value;if(!this.activated&&A.length<1){A=" "}if(this.fireEvent("beforepush",this,A)!==false){this.getEditorBody().innerHTML=A;this.fireEvent("push",this,A)}}},deferFocus:function(){this.focus.defer(10,this)},focus:function(){if(this.win&&!this.sourceEditMode){this.win.focus()}else{this.el.focus()}},initEditor:function(){var B=this.getEditorBody();var A=this.el.getStyles("font-size","font-family","background-image","background-repeat");A["background-attachment"]="fixed";B.bgProperties="fixed";Ext.DomHelper.applyStyles(B,A);if(this.doc){try{Ext.EventManager.removeAll(this.doc)}catch(C){}}this.doc=this.getDoc();Ext.EventManager.on(this.doc,{"mousedown":this.onEditorEvent,"dblclick":this.onEditorEvent,"click":this.onEditorEvent,"keyup":this.onEditorEvent,buffer:100,scope:this});if(Ext.isGecko){Ext.EventManager.on(this.doc,"keypress",this.applyCommand,this)}if(Ext.isIE||Ext.isSafari||Ext.isOpera){Ext.EventManager.on(this.doc,"keydown",this.fixKeys,this)}this.initialized=true;this.fireEvent("initialize",this);this.doc.editorInitialized=true;this.pushValue()},onDestroy:function(){if(this.monitorTask){Ext.TaskMgr.stop(this.monitorTask)}if(this.rendered){this.tb.items.each(function(A){if(A.menu){A.menu.removeAll();if(A.menu.el){A.menu.el.destroy()}}A.destroy()});this.wrap.dom.innerHTML="";this.wrap.remove()}},onFirstFocus:function(){this.activated=true;this.tb.items.each(function(D){D.enable()});if(Ext.isGecko){this.win.focus();var A=this.win.getSelection();if(!A.focusNode||A.focusNode.nodeType!=3){var B=A.getRangeAt(0);B.selectNodeContents(this.getEditorBody());B.collapse(true);this.deferFocus()}try{this.execCmd("useCSS",true);this.execCmd("styleWithCSS",false)}catch(C){}}this.fireEvent("activate",this)},adjustFont:function(B){var C=B.itemId=="increasefontsize"?1:-1;var A=parseInt(this.doc.queryCommandValue("FontSize")||2,10);if(Ext.isSafari3||Ext.isAir){if(A<=10){A=1+C}else{if(A<=13){A=2+C}else{if(A<=16){A=3+C}else{if(A<=18){A=4+C}else{if(A<=24){A=5+C}else{A=6+C}}}}}A=A.constrain(1,6)}else{if(Ext.isSafari){C*=2}A=Math.max(1,A+C)+(Ext.isSafari?"px":0)}this.execCmd("FontSize",A)},onEditorEvent:function(A){this.updateToolbar()},updateToolbar:function(){if(!this.activated){this.onFirstFocus();return }var B=this.tb.items.map,C=this.doc;if(this.enableFont&&!Ext.isSafari2){var A=(this.doc.queryCommandValue("FontName")||this.defaultFont).toLowerCase();if(A!=this.fontSelect.dom.value){this.fontSelect.dom.value=A}}if(this.enableFormat){B.bold.toggle(C.queryCommandState("bold"));B.italic.toggle(C.queryCommandState("italic"));B.underline.toggle(C.queryCommandState("underline"))}if(this.enableAlignments){B.justifyleft.toggle(C.queryCommandState("justifyleft"));B.justifycenter.toggle(C.queryCommandState("justifycenter"));B.justifyright.toggle(C.queryCommandState("justifyright"))}if(!Ext.isSafari2&&this.enableLists){B.insertorderedlist.toggle(C.queryCommandState("insertorderedlist"));B.insertunorderedlist.toggle(C.queryCommandState("insertunorderedlist"))}Ext.menu.MenuMgr.hideAll();this.syncValue()},relayBtnCmd:function(A){this.relayCmd(A.itemId)},relayCmd:function(B,A){(function(){this.focus();this.execCmd(B,A);this.updateToolbar()}).defer(10,this)},execCmd:function(B,A){this.doc.execCommand(B,false,A===undefined?null:A);this.syncValue()},applyCommand:function(B){if(B.ctrlKey){var C=B.getCharCode(),A;if(C>0){C=String.fromCharCode(C);switch(C){case"b":A="bold";break;case"i":A="italic";break;case"u":A="underline";break}if(A){this.win.focus();this.execCmd(A);this.deferFocus();B.preventDefault()}}}},insertAtCursor:function(B){if(!this.activated){return }if(Ext.isIE){this.win.focus();var A=this.doc.selection.createRange();if(A){A.collapse(true);A.pasteHTML(B);this.syncValue();this.deferFocus()}}else{if(Ext.isGecko||Ext.isOpera){this.win.focus();this.execCmd("InsertHTML",B);this.deferFocus()}else{if(Ext.isSafari){this.execCmd("InsertText",B);this.deferFocus()}}}},fixKeys:function(){if(Ext.isIE){return function(D){var A=D.getKey(),B;if(A==D.TAB){D.stopEvent();B=this.doc.selection.createRange();if(B){B.collapse(true);B.pasteHTML("    ");this.deferFocus()}}else{if(A==D.ENTER){B=this.doc.selection.createRange();if(B){var C=B.parentElement();if(!C||C.tagName.toLowerCase()!="li"){D.stopEvent();B.pasteHTML("
      ");B.collapse(false);B.select()}}}}}}else{if(Ext.isOpera){return function(B){var A=B.getKey();if(A==B.TAB){B.stopEvent();this.win.focus();this.execCmd("InsertHTML","    ");this.deferFocus()}}}else{if(Ext.isSafari){return function(B){var A=B.getKey();if(A==B.TAB){B.stopEvent();this.execCmd("InsertText","\t");this.deferFocus()}}}}}}(),getToolbar:function(){return this.tb},buttonTips:{bold:{title:"Bold (Ctrl+B)",text:"Make the selected text bold.",cls:"x-html-editor-tip"},italic:{title:"Italic (Ctrl+I)",text:"Make the selected text italic.",cls:"x-html-editor-tip"},underline:{title:"Underline (Ctrl+U)",text:"Underline the selected text.",cls:"x-html-editor-tip"},increasefontsize:{title:"Grow Text",text:"Increase the font size.",cls:"x-html-editor-tip"},decreasefontsize:{title:"Shrink Text",text:"Decrease the font size.",cls:"x-html-editor-tip"},backcolor:{title:"Text Highlight Color",text:"Change the background color of the selected text.",cls:"x-html-editor-tip"},forecolor:{title:"Font Color",text:"Change the color of the selected text.",cls:"x-html-editor-tip"},justifyleft:{title:"Align Text Left",text:"Align text to the left.",cls:"x-html-editor-tip"},justifycenter:{title:"Center Text",text:"Center text in the editor.",cls:"x-html-editor-tip"},justifyright:{title:"Align Text Right",text:"Align text to the right.",cls:"x-html-editor-tip"},insertunorderedlist:{title:"Bullet List",text:"Start a bulleted list.",cls:"x-html-editor-tip"},insertorderedlist:{title:"Numbered List",text:"Start a numbered list.",cls:"x-html-editor-tip"},createlink:{title:"Hyperlink",text:"Make the selected text a hyperlink.",cls:"x-html-editor-tip"},sourceedit:{title:"Source Edit",text:"Switch to source editing mode.",cls:"x-html-editor-tip"}}});Ext.reg("htmleditor",Ext.form.HtmlEditor); +Ext.form.TimeField=Ext.extend(Ext.form.ComboBox,{minValue:null,maxValue:null,minText:"The time in this field must be equal to or after {0}",maxText:"The time in this field must be equal to or before {0}",invalidText:"{0} is not a valid time",format:"g:i A",altFormats:"g:ia|g:iA|g:i a|g:i A|h:i|g:i|H:i|ga|ha|gA|h a|g a|g A|gi|hi|gia|hia|g|H",increment:15,mode:"local",triggerAction:"all",typeAhead:false,initDate:"1/1/2008",initComponent:function(){Ext.form.TimeField.superclass.initComponent.call(this);if(typeof this.minValue=="string"){this.minValue=this.parseDate(this.minValue)}if(typeof this.maxValue=="string"){this.maxValue=this.parseDate(this.maxValue)}if(!this.store){var B=this.parseDate(this.minValue);if(!B){B=new Date(this.initDate).clearTime()}var A=this.parseDate(this.maxValue);if(!A){A=new Date(this.initDate).clearTime().add("mi",(24*60)-1)}var C=[];while(B<=A){C.push([B.dateFormat(this.format)]);B=B.add("mi",this.increment)}this.store=new Ext.data.SimpleStore({fields:["text"],data:C});this.displayField="text"}},getValue:function(){var A=Ext.form.TimeField.superclass.getValue.call(this);return this.formatDate(this.parseDate(A))||""},setValue:function(A){Ext.form.TimeField.superclass.setValue.call(this,this.formatDate(this.parseDate(A)))},validateValue:Ext.form.DateField.prototype.validateValue,parseDate:Ext.form.DateField.prototype.parseDate,formatDate:Ext.form.DateField.prototype.formatDate,beforeBlur:function(){var A=this.parseDate(this.getRawValue());if(A){this.setValue(A.dateFormat(this.format))}}});Ext.reg("timefield",Ext.form.TimeField); +Ext.form.Label=Ext.extend(Ext.BoxComponent,{onRender:function(B,A){if(!this.el){this.el=document.createElement("label");this.el.id=this.getId();this.el.innerHTML=this.text?Ext.util.Format.htmlEncode(this.text):(this.html||"");if(this.forId){this.el.setAttribute("htmlFor",this.forId)}}Ext.form.Label.superclass.onRender.call(this,B,A)},setText:function(A,B){this.text=A;if(this.rendered){this.el.dom.innerHTML=B!==false?Ext.util.Format.htmlEncode(A):A}return this}});Ext.reg("label",Ext.form.Label); +Ext.form.Action=function(B,A){this.form=B;this.options=A||{}};Ext.form.Action.CLIENT_INVALID="client";Ext.form.Action.SERVER_INVALID="server";Ext.form.Action.CONNECT_FAILURE="connect";Ext.form.Action.LOAD_FAILURE="load";Ext.form.Action.prototype={type:"default",run:function(A){},success:function(A){},handleResponse:function(A){},failure:function(A){this.response=A;this.failureType=Ext.form.Action.CONNECT_FAILURE;this.form.afterAction(this,false)},processResponse:function(A){this.response=A;if(!A.responseText){return true}this.result=this.handleResponse(A);return this.result},getUrl:function(C){var A=this.options.url||this.form.url||this.form.el.dom.action;if(C){var B=this.getParams();if(B){A+=(A.indexOf("?")!=-1?"&":"?")+B}}return A},getMethod:function(){return(this.options.method||this.form.method||this.form.el.dom.method||"POST").toUpperCase()},getParams:function(){var A=this.form.baseParams;var B=this.options.params;if(B){if(typeof B=="object"){B=Ext.urlEncode(Ext.applyIf(B,A))}else{if(typeof B=="string"&&A){B+="&"+Ext.urlEncode(A)}}}else{if(A){B=Ext.urlEncode(A)}}return B},createCallback:function(A){var A=A||{};return{success:this.success,failure:this.failure,scope:this,timeout:(A.timeout*1000)||(this.form.timeout*1000),upload:this.form.fileUpload?this.success:undefined}}};Ext.form.Action.Submit=function(B,A){Ext.form.Action.Submit.superclass.constructor.call(this,B,A)};Ext.extend(Ext.form.Action.Submit,Ext.form.Action,{type:"submit",run:function(){var B=this.options;var C=this.getMethod();var A=C=="GET";if(B.clientValidation===false||this.form.isValid()){Ext.Ajax.request(Ext.apply(this.createCallback(B),{form:this.form.el.dom,url:this.getUrl(A),method:C,headers:B.headers,params:!A?this.getParams():null,isUpload:this.form.fileUpload}))}else{if(B.clientValidation!==false){this.failureType=Ext.form.Action.CLIENT_INVALID;this.form.afterAction(this,false)}}},success:function(B){var A=this.processResponse(B);if(A===true||A.success){this.form.afterAction(this,true);return }if(A.errors){this.form.markInvalid(A.errors);this.failureType=Ext.form.Action.SERVER_INVALID}this.form.afterAction(this,false)},handleResponse:function(C){if(this.form.errorReader){var B=this.form.errorReader.read(C);var F=[];if(B.records){for(var D=0,A=B.records.length;D=0){if(!D){C=F-1}D=false;while(C>=0){if(E.call(I||this,J,C,H)===true){return[J,C]}C--}J--}}else{if(C>=F){J++;D=false}while(J","
      ","
      {header}
      ","
      {body}
      ","
      ","
       
      ","
       
      ","")}if(!C.header){C.header=new Ext.Template("","{cells}","
      ")}if(!C.hcell){C.hcell=new Ext.Template("
      ",this.grid.enableHdMenu?"":"","{value}","
      ")}if(!C.body){C.body=new Ext.Template("{rows}")}if(!C.row){C.row=new Ext.Template("
      ","{cells}",(this.enableRowBody?"":""),"
      {body}
      ")}if(!C.cell){C.cell=new Ext.Template("","
      {value}
      ","")}for(var A in C){var B=C[A];if(B&&typeof B.compile=="function"&&!B.compiled){B.disableFormats=true;B.compile()}}this.templates=C;this.colRe=new RegExp("x-grid3-td-([^\\s]+)","")},fly:function(A){if(!this._flyweight){this._flyweight=new Ext.Element.Flyweight(document.body)}this._flyweight.dom=A;return this._flyweight},getEditorParent:function(A){return this.scroller.dom},initElements:function(){var C=Ext.Element;var B=this.grid.getGridEl().dom.firstChild;var A=B.childNodes;this.el=new C(B);this.mainWrap=new C(A[0]);this.mainHd=new C(this.mainWrap.dom.firstChild);if(this.grid.hideHeaders){this.mainHd.setDisplayed(false)}this.innerHd=this.mainHd.dom.firstChild;this.scroller=new C(this.mainWrap.dom.childNodes[1]);if(this.forceFit){this.scroller.setStyle("overflow-x","hidden")}this.mainBody=new C(this.scroller.dom.firstChild);this.focusEl=new C(this.scroller.dom.childNodes[1]);this.focusEl.swallowEvent("click",true);this.resizeMarker=new C(A[1]);this.resizeProxy=new C(A[2])},getRows:function(){return this.hasRows()?this.mainBody.dom.childNodes:[]},findCell:function(A){if(!A){return false}return this.fly(A).findParent(this.cellSelector,this.cellSelectorDepth)},findCellIndex:function(C,B){var A=this.findCell(C);if(A&&(!B||this.fly(A).hasClass(B))){return this.getCellIndex(A)}return false},getCellIndex:function(B){if(B){var A=B.className.match(this.colRe);if(A&&A[1]){return this.cm.getIndexById(A[1])}}return false},findHeaderCell:function(B){var A=this.findCell(B);return A&&this.fly(A).hasClass(this.hdCls)?A:null},findHeaderIndex:function(A){return this.findCellIndex(A,this.hdCls)},findRow:function(A){if(!A){return false}return this.fly(A).findParent(this.rowSelector,this.rowSelectorDepth)},findRowIndex:function(A){var B=this.findRow(A);return B?B.rowIndex:false},getRow:function(A){return this.getRows()[A]},getCell:function(B,A){return this.getRow(B).getElementsByTagName("td")[A]},getHeaderCell:function(A){return this.mainHd.dom.getElementsByTagName("td")[A]},addRowClass:function(C,A){var B=this.getRow(C);if(B){this.fly(B).addClass(A)}},removeRowClass:function(C,A){var B=this.getRow(C);if(B){this.fly(B).removeClass(A)}},removeRow:function(A){Ext.removeNode(this.getRow(A));this.focusRow(A)},removeRows:function(C,A){var B=this.mainBody.dom;for(var D=C;D<=A;D++){Ext.removeNode(B.childNodes[C])}this.focusRow(C)},getScrollState:function(){var A=this.scroller.dom;return{left:A.scrollLeft,top:A.scrollTop}},restoreScroll:function(A){var B=this.scroller.dom;B.scrollLeft=A.left;B.scrollTop=A.top},scrollToTop:function(){this.scroller.dom.scrollTop=0;this.scroller.dom.scrollLeft=0},syncScroll:function(){this.syncHeaderScroll();var A=this.scroller.dom;this.grid.fireEvent("bodyscroll",A.scrollLeft,A.scrollTop)},syncHeaderScroll:function(){var A=this.scroller.dom;this.innerHd.scrollLeft=A.scrollLeft;this.innerHd.scrollLeft=A.scrollLeft},updateSortIcon:function(B,A){var D=this.sortClasses;var C=this.mainHd.select("td").removeClass(D);C.item(B).addClass(D[A=="DESC"?1:0])},updateAllColumnWidths:function(){var D=this.getTotalWidth();var H=this.cm.getColumnCount();var F=[];for(var B=0;B=this.ds.getCount()){return }E=(E!==undefined?E:0);var I=this.getRow(P),F;if(!(D===false&&E===0)){while(this.cm.isHidden(E)){E++}F=this.getCell(P,E)}if(!I){return }var L=this.scroller.dom;var O=0;var C=I,M=this.el.dom;while(C&&C!=M){O+=C.offsetTop;C=C.offsetParent}O-=this.mainHd.dom.offsetHeight;var N=O+I.offsetHeight;var A=L.clientHeight;var M=parseInt(L.scrollTop,10);var K=M+A;if(OK){L.scrollTop=N-A}}if(D!==false){var J=parseInt(F.offsetLeft,10);var H=J+F.offsetWidth;var G=parseInt(L.scrollLeft,10);var B=G+L.clientWidth;if(JB){L.scrollLeft=H-L.clientWidth}}}return F?Ext.fly(F).getXY():[L.scrollLeft+this.el.getX(),Ext.fly(I).getY()]},insertRows:function(A,F,C,E){if(!E&&F===0&&C>=A.getCount()-1){this.refresh()}else{if(!E){this.fireEvent("beforerowsinserted",this,F,C)}var B=this.renderRows(F,C);var D=this.getRow(F);if(D){Ext.DomHelper.insertHtml("beforeBegin",D,B)}else{Ext.DomHelper.insertHtml("beforeEnd",this.mainBody.dom,B)}if(!E){this.fireEvent("rowsinserted",this,F,C);this.processRows(F)}}this.focusRow(F)},deleteRows:function(A,C,B){if(A.getRowCount()<1){this.refresh()}else{this.fireEvent("beforerowsdeleted",this,C,B);this.removeRows(C,B);this.processRows(C);this.fireEvent("rowsdeleted",this,C,B)}},getColumnStyle:function(A,C){var B=!C?(this.cm.config[A].css||""):"";B+="width:"+this.getColumnWidth(A)+";";if(this.cm.isHidden(A)){B+="display:none;"}var D=this.cm.config[A].align;if(D){B+="text-align:"+D+";"}return B},getColumnWidth:function(B){var A=this.cm.getColumnWidth(B);if(typeof A=="number"){return(Ext.isBorderBox?A:(A-this.borderWidth>0?A-this.borderWidth:0))+"px"}return A},getTotalWidth:function(){return this.cm.getTotalWidth()+"px"},fitColumns:function(D,G,E){var F=this.cm,S,L,O;var R=F.getTotalWidth(false);var J=this.grid.getGridEl().getWidth(true)-this.scrollOffset;if(J<20){return }var B=J-R;if(B===0){return false}var A=F.getColumnCount(true);var P=A-(typeof E=="number"?1:0);if(P===0){P=1;E=undefined}var K=F.getColumnCount();var I=[];var N=0;var M=0;var H;for(O=0;OJ){var Q=P!=A?E:N;F.setColumnWidth(Q,Math.max(1,F.getColumnWidth(Q)-(R-J)),true)}if(D!==true){this.updateAllColumnWidths()}return true},autoExpand:function(B){var G=this.grid,A=this.cm;if(!this.userResized&&G.autoExpandColumn){var D=A.getTotalWidth(false);var H=this.grid.getGridEl().getWidth(true)-this.scrollOffset;if(D!=H){var F=A.getIndexById(G.autoExpandColumn);var E=A.getColumnWidth(F);var C=Math.min(Math.max(((H-D)+E),G.autoExpandMin),G.autoExpandMax);if(C!=E){A.setColumnWidth(F,C,true);if(B!==true){this.updateColumnWidth(F,C)}}}}},getColumnData:function(){var D=[],A=this.cm,E=A.getColumnCount();for(var C=0;C"+this.emptyText+"")}},updateHeaderSortState:function(){var B=this.ds.getSortState();if(!B){return }if(!this.sortState||(this.sortState.field!=B.field||this.sortState.direction!=B.direction)){this.grid.fireEvent("sortchange",this.grid,B)}this.sortState=B;var C=this.cm.findColumnIndex(B.field);if(C!=-1){var A=B.direction;this.updateSortIcon(C,A)}},destroy:function(){if(this.colMenu){this.colMenu.removeAll();Ext.menu.MenuMgr.unregister(this.colMenu);this.colMenu.getEl().remove();delete this.colMenu}if(this.hmenu){this.hmenu.removeAll();Ext.menu.MenuMgr.unregister(this.hmenu);this.hmenu.getEl().remove();delete this.hmenu}if(this.grid.enableColumnMove){var C=Ext.dd.DDM.ids["gridHeader"+this.grid.getGridEl().id];if(C){for(var A in C){if(!C[A].config.isTarget&&C[A].dragElId){var B=C[A].dragElId;C[A].unreg();Ext.get(B).remove()}else{if(C[A].config.isTarget){C[A].proxyTop.remove();C[A].proxyBottom.remove();C[A].unreg()}}if(Ext.dd.DDM.locationCache[A]){delete Ext.dd.DDM.locationCache[A]}}delete Ext.dd.DDM.ids["gridHeader"+this.grid.getGridEl().id]}}Ext.destroy(this.resizeMarker,this.resizeProxy);if(this.dragZone){this.dragZone.unreg()}this.initData(null,null);Ext.EventManager.removeResizeListener(this.onWindowResize,this)},onDenyColumnHide:function(){},render:function(){if(this.autoFill){this.fitColumns(true,true)}else{if(this.forceFit){this.fitColumns(true,false)}else{if(this.grid.autoExpandColumn){this.autoExpand(true)}}}this.renderUI()},initData:function(B,A){if(this.ds){this.ds.un("load",this.onLoad,this);this.ds.un("datachanged",this.onDataChange,this);this.ds.un("add",this.onAdd,this);this.ds.un("remove",this.onRemove,this);this.ds.un("update",this.onUpdate,this);this.ds.un("clear",this.onClear,this)}if(B){B.on("load",this.onLoad,this);B.on("datachanged",this.onDataChange,this);B.on("add",this.onAdd,this);B.on("remove",this.onRemove,this);B.on("update",this.onUpdate,this);B.on("clear",this.onClear,this)}this.ds=B;if(this.cm){this.cm.un("configchange",this.onColConfigChange,this);this.cm.un("widthchange",this.onColWidthChange,this);this.cm.un("headerchange",this.onHeaderChange,this);this.cm.un("hiddenchange",this.onHiddenChange,this);this.cm.un("columnmoved",this.onColumnMove,this);this.cm.un("columnlockchange",this.onColumnLock,this)}if(A){delete this.lastViewWidth;A.on("configchange",this.onColConfigChange,this);A.on("widthchange",this.onColWidthChange,this);A.on("headerchange",this.onHeaderChange,this);A.on("hiddenchange",this.onHiddenChange,this);A.on("columnmoved",this.onColumnMove,this);A.on("columnlockchange",this.onColumnLock,this)}this.cm=A},onDataChange:function(){this.refresh();this.updateHeaderSortState()},onClear:function(){this.refresh()},onUpdate:function(B,A){this.refreshRow(A)},onAdd:function(C,A,B){this.insertRows(C,B,B+(A.length-1))},onRemove:function(D,A,B,C){if(C!==true){this.fireEvent("beforerowremoved",this,B,A)}this.removeRow(B);if(C!==true){this.processRows(B);this.applyEmptyText();this.fireEvent("rowremoved",this,B,A)}},onLoad:function(){this.scrollToTop()},onColWidthChange:function(A,B,C){this.updateColumnWidth(B,C)},onHeaderChange:function(A,B,C){this.updateHeaders()},onHiddenChange:function(A,B,C){this.updateColumnHidden(B,C)},onColumnMove:function(A,D,B){this.indexMap=null;var C=this.getScrollState();this.refresh(true);this.restoreScroll(C);this.afterMove(B)},onColConfigChange:function(){delete this.lastViewWidth;this.indexMap=null;this.refresh(true)},initUI:function(A){A.on("headerclick",this.onHeaderClick,this);if(A.trackMouseOver){A.on("mouseover",this.onRowOver,this);A.on("mouseout",this.onRowOut,this)}},initEvents:function(){},onHeaderClick:function(B,A){if(this.headersDisabled||!this.cm.isSortable(A)){return }B.stopEditing(true);B.store.sort(this.cm.getDataIndex(A))},onRowOver:function(B,A){var C;if((C=this.findRowIndex(A))!==false){this.addRowClass(C,"x-grid3-row-over")}},onRowOut:function(B,A){var C;if((C=this.findRowIndex(A))!==false&&C!==this.findRowIndex(B.getRelatedTarget())){this.removeRowClass(C,"x-grid3-row-over")}},handleWheel:function(A){A.stopPropagation()},onRowSelect:function(A){this.addRowClass(A,"x-grid3-row-selected")},onRowDeselect:function(A){this.removeRowClass(A,"x-grid3-row-selected")},onCellSelect:function(C,B){var A=this.getCell(C,B);if(A){this.fly(A).addClass("x-grid3-cell-selected")}},onCellDeselect:function(C,B){var A=this.getCell(C,B);if(A){this.fly(A).removeClass("x-grid3-cell-selected")}},onColumnSplitterMoved:function(C,B){this.userResized=true;var A=this.grid.colModel;A.setColumnWidth(C,B,true);if(this.forceFit){this.fitColumns(true,false,C);this.updateAllColumnWidths()}else{this.updateColumnWidth(C,B)}this.grid.fireEvent("columnresize",C,B)},handleHdMenuClick:function(C){var B=this.hdCtxIndex;var A=this.cm,D=this.ds;switch(C.id){case"asc":D.sort(A.getDataIndex(B),"ASC");break;case"desc":D.sort(A.getDataIndex(B),"DESC");break;default:B=A.getIndexById(C.id.substr(4));if(B!=-1){if(C.checked&&A.getColumnsBy(this.isHideableColumn,this).length<=1){this.onDenyColumnHide();return false}A.setHidden(B,C.checked)}}return true},isHideableColumn:function(A){return !A.hidden&&!A.fixed},beforeColMenuShow:function(){var A=this.cm,C=A.getColumnCount();this.colMenu.removeAll();for(var B=0;B","
      ",this.groupTextTpl,"
      ","
      ")}this.startGroup.compile();this.endGroup="
      "},findGroup:function(A){return Ext.fly(A).up(".x-grid-group",this.mainBody.dom)},getGroups:function(){return this.hasRows()?this.mainBody.dom.childNodes:[]},onAdd:function(){if(this.enableGrouping&&!this.ignoreAdd){var A=this.getScrollState();this.refresh();this.restoreScroll(A)}else{if(!this.enableGrouping){Ext.grid.GroupingView.superclass.onAdd.apply(this,arguments)}}},onRemove:function(E,A,B,D){Ext.grid.GroupingView.superclass.onRemove.apply(this,arguments);var C=document.getElementById(A._groupId);if(C&&C.childNodes[1].childNodes.length<1){Ext.removeNode(C)}this.applyEmptyText()},refreshRow:function(A){if(this.ds.getCount()==1){this.refresh()}else{this.isUpdating=true;Ext.grid.GroupingView.superclass.refreshRow.apply(this,arguments);this.isUpdating=false}},beforeMenuShow:function(){var C=this.getGroupField();var B=this.hmenu.items.get("groupBy");if(B){B.setDisabled(this.cm.config[this.hdCtxIndex].groupable===false)}var A=this.hmenu.items.get("showGroups");if(A){A.setDisabled(!C&&this.cm.config[this.hdCtxIndex].groupable===false);A.setChecked(!!C,true)}},renderUI:function(){Ext.grid.GroupingView.superclass.renderUI.call(this);this.mainBody.on("mousedown",this.interceptMouse,this);if(this.enableGroupingMenu&&this.hmenu){this.hmenu.add("-",{id:"groupBy",text:this.groupByText,handler:this.onGroupByClick,scope:this,iconCls:"x-group-by-icon"});if(this.enableNoGroups){this.hmenu.add({id:"showGroups",text:this.showGroupsText,checked:true,checkHandler:this.onShowGroupsClick,scope:this})}this.hmenu.on("beforeshow",this.beforeMenuShow,this)}},onGroupByClick:function(){this.grid.store.groupBy(this.cm.getDataIndex(this.hdCtxIndex));this.beforeMenuShow()},onShowGroupsClick:function(A,B){if(B){this.onGroupByClick()}else{this.grid.store.clearGrouping()}},toggleGroup:function(C,B){this.grid.stopEditing(true);C=Ext.getDom(C);var A=Ext.fly(C);B=B!==undefined?B:A.hasClass("x-grid-group-collapsed");this.state[A.dom.id]=B;A[B?"removeClass":"addClass"]("x-grid-group-collapsed")},toggleAllGroups:function(C){var B=this.getGroups();for(var D=0,A=B.length;D=0&&this.config[A].resizable!==false&&this.config[A].fixed!==true},setHidden:function(A,B){var C=this.config[A];if(C.hidden!==B){C.hidden=B;this.totalWidth=null;this.fireEvent("hiddenchange",this,A,B)}},setEditor:function(A,B){this.config[A].editor=B}});Ext.grid.ColumnModel.defaultRenderer=function(A){if(typeof A=="string"&&A.length<1){return" "}return A};Ext.grid.DefaultColumnModel=Ext.grid.ColumnModel; +Ext.grid.AbstractSelectionModel=function(){this.locked=false;Ext.grid.AbstractSelectionModel.superclass.constructor.call(this)};Ext.extend(Ext.grid.AbstractSelectionModel,Ext.util.Observable,{init:function(A){this.grid=A;this.initEvents()},lock:function(){this.locked=true},unlock:function(){this.locked=false},isLocked:function(){return this.locked}}); +Ext.grid.RowSelectionModel=function(A){Ext.apply(this,A);this.selections=new Ext.util.MixedCollection(false,function(B){return B.id});this.last=false;this.lastActive=false;this.addEvents("selectionchange","beforerowselect","rowselect","rowdeselect");Ext.grid.RowSelectionModel.superclass.constructor.call(this)};Ext.extend(Ext.grid.RowSelectionModel,Ext.grid.AbstractSelectionModel,{singleSelect:false,initEvents:function(){if(!this.grid.enableDragDrop&&!this.grid.enableDrag){this.grid.on("rowmousedown",this.handleMouseDown,this)}else{this.grid.on("rowclick",function(B,D,C){if(C.button===0&&!C.shiftKey&&!C.ctrlKey){this.selectRow(D,false);B.view.focusRow(D)}},this)}this.rowNav=new Ext.KeyNav(this.grid.getGridEl(),{"up":function(C){if(!C.shiftKey){this.selectPrevious(C.shiftKey)}else{if(this.last!==false&&this.lastActive!==false){var B=this.last;this.selectRange(this.last,this.lastActive-1);this.grid.getView().focusRow(this.lastActive);if(B!==false){this.last=B}}else{this.selectFirstRow()}}},"down":function(C){if(!C.shiftKey){this.selectNext(C.shiftKey)}else{if(this.last!==false&&this.lastActive!==false){var B=this.last;this.selectRange(this.last,this.lastActive+1);this.grid.getView().focusRow(this.lastActive);if(B!==false){this.last=B}}else{this.selectFirstRow()}}},scope:this});var A=this.grid.view;A.on("refresh",this.onRefresh,this);A.on("rowupdated",this.onRowUpdated,this);A.on("rowremoved",this.onRemove,this)},onRefresh:function(){var F=this.grid.store,B;var D=this.getSelections();this.clearSelections(true);for(var C=0,A=D.length;C0},isSelected:function(A){var B=typeof A=="number"?this.grid.store.getAt(A):A;return(B&&this.selections.key(B.id)?true:false)},isIdSelected:function(A){return(this.selections.key(A)?true:false)},handleMouseDown:function(D,F,E){if(E.button!==0||this.isLocked()){return }var A=this.grid.getView();if(E.shiftKey&&this.last!==false){var C=this.last;this.selectRange(C,F,E.ctrlKey);this.last=C;A.focusRow(F)}else{var B=this.isSelected(F);if(E.ctrlKey&&B){this.deselectRow(F)}else{if(!B||this.getCount()>1){this.selectRow(F,E.ctrlKey||E.shiftKey);A.focusRow(F)}}}},selectRows:function(C,D){if(!D){this.clearSelections()}for(var B=0,A=C.length;B=A;C--){this.selectRow(C,true)}}},deselectRange:function(C,B,A){if(this.locked){return }for(var D=C;D<=B;D++){this.deselectRow(D,A)}},selectRow:function(B,D,A){if(this.locked||(B<0||B>=this.grid.store.getCount())||this.isSelected(B)){return }var C=this.grid.store.getAt(B);if(C&&this.fireEvent("beforerowselect",this,B,D,C)!==false){if(!D||this.singleSelect){this.clearSelections()}this.selections.add(C);this.last=this.lastActive=B;if(!A){this.grid.getView().onRowSelect(B)}this.fireEvent("rowselect",this,B,C);this.fireEvent("selectionchange",this)}},deselectRow:function(B,A){if(this.locked){return }if(this.last==B){this.last=false}if(this.lastActive==B){this.lastActive=false}var C=this.grid.store.getAt(B);if(C){this.selections.remove(C);if(!A){this.grid.getView().onRowDeselect(B)}this.fireEvent("rowdeselect",this,B,C);this.fireEvent("selectionchange",this)}},restoreLast:function(){if(this._last){this.last=this._last}},acceptsNav:function(C,B,A){return !A.isHidden(B)&&A.isCellEditable(B,C)},onEditorKey:function(F,E){var C=E.getKey(),G,D=this.grid,B=D.activeEditor;var A=E.shiftKey;if(C==E.TAB){E.stopEvent();B.completeEdit();if(A){G=D.walkCells(B.row,B.col-1,-1,this.acceptsNav,this)}else{G=D.walkCells(B.row,B.col+1,1,this.acceptsNav,this)}}else{if(C==E.ENTER){E.stopEvent();B.completeEdit();if(this.moveEditorOnEnter!==false){if(A){G=D.walkCells(B.row-1,B.col,-1,this.acceptsNav,this)}else{G=D.walkCells(B.row+1,B.col,1,this.acceptsNav,this)}}}else{if(C==E.ESC){B.cancelEdit()}}}if(G){D.startEditing(G[0],G[1])}}}); +Ext.grid.CellSelectionModel=function(A){Ext.apply(this,A);this.selection=null;this.addEvents("beforecellselect","cellselect","selectionchange");Ext.grid.CellSelectionModel.superclass.constructor.call(this)};Ext.extend(Ext.grid.CellSelectionModel,Ext.grid.AbstractSelectionModel,{initEvents:function(){this.grid.on("cellmousedown",this.handleMouseDown,this);this.grid.getGridEl().on(Ext.isIE||Ext.isSafari3?"keydown":"keypress",this.handleKeyDown,this);var A=this.grid.view;A.on("refresh",this.onViewChange,this);A.on("rowupdated",this.onRowUpdated,this);A.on("beforerowremoved",this.clearSelections,this);A.on("beforerowsinserted",this.clearSelections,this);if(this.grid.isEditor){this.grid.on("beforeedit",this.beforeEdit,this)}},beforeEdit:function(A){this.select(A.row,A.column,false,true,A.record)},onRowUpdated:function(A,B,C){if(this.selection&&this.selection.record==C){A.onCellSelect(B,this.selection.cell[1])}},onViewChange:function(){this.clearSelections(true)},getSelectedCell:function(){return this.selection?this.selection.cell:null},clearSelections:function(B){var A=this.selection;if(A){if(B!==true){this.grid.view.onCellDeselect(A.cell[0],A.cell[1])}this.selection=null;this.fireEvent("selectionchange",this,null)}},hasSelection:function(){return this.selection?true:false},handleMouseDown:function(B,D,A,C){if(C.button!==0||this.isLocked()){return }this.select(D,A)},select:function(F,C,B,E,D){if(this.fireEvent("beforecellselect",this,F,C)!==false){this.clearSelections();D=D||this.grid.store.getAt(F);this.selection={record:D,cell:[F,C]};if(!B){var A=this.grid.getView();A.onCellSelect(F,C);if(E!==true){A.focusCell(F,C)}}this.fireEvent("cellselect",this,F,C);this.fireEvent("selectionchange",this,this.selection)}},isSelectable:function(C,B,A){return !A.isHidden(B)},handleKeyDown:function(F){if(!F.isNavKeyPress()){return }var E=this.grid,J=this.selection;if(!J){F.stopEvent();var I=E.walkCells(0,0,1,this.isSelectable,this);if(I){this.select(I[0],I[1])}return }var B=this;var H=function(M,K,L){return E.walkCells(M,K,L,B.isSelectable,B)};var C=F.getKey(),A=J.cell[0],G=J.cell[1];var D;switch(C){case F.TAB:if(F.shiftKey){D=H(A,G-1,-1)}else{D=H(A,G+1,1)}break;case F.DOWN:D=H(A+1,G,1);break;case F.UP:D=H(A-1,G,-1);break;case F.RIGHT:D=H(A,G+1,1);break;case F.LEFT:D=H(A,G-1,-1);break;case F.ENTER:if(E.isEditor&&!E.editing){E.startEditing(A,G);F.stopEvent();return }break}if(D){this.select(D[0],D[1]);F.stopEvent()}},acceptsNav:function(C,B,A){return !A.isHidden(B)&&A.isCellEditable(B,C)},onEditorKey:function(E,D){var B=D.getKey(),F,C=this.grid,A=C.activeEditor;if(B==D.TAB){if(D.shiftKey){F=C.walkCells(A.row,A.col-1,-1,this.acceptsNav,this)}else{F=C.walkCells(A.row,A.col+1,1,this.acceptsNav,this)}D.stopEvent()}else{if(B==D.ENTER){A.completeEdit();D.stopEvent()}else{if(B==D.ESC){D.stopEvent();A.cancelEdit()}}}if(F){C.startEditing(F[0],F[1])}}}); +Ext.grid.EditorGridPanel=Ext.extend(Ext.grid.GridPanel,{clicksToEdit:2,isEditor:true,detectEdit:false,autoEncode:false,trackMouseOver:false,initComponent:function(){Ext.grid.EditorGridPanel.superclass.initComponent.call(this);if(!this.selModel){this.selModel=new Ext.grid.CellSelectionModel()}this.activeEditor=null;this.addEvents("beforeedit","afteredit","validateedit")},initEvents:function(){Ext.grid.EditorGridPanel.superclass.initEvents.call(this);this.on("bodyscroll",this.stopEditing,this,[true]);if(this.clicksToEdit==1){this.on("cellclick",this.onCellDblClick,this)}else{if(this.clicksToEdit=="auto"&&this.view.mainBody){this.view.mainBody.on("mousedown",this.onAutoEditClick,this)}this.on("celldblclick",this.onCellDblClick,this)}this.getGridEl().addClass("xedit-grid")},onCellDblClick:function(B,C,A){this.startEditing(C,A)},onAutoEditClick:function(C,B){if(C.button!==0){return }var E=this.view.findRowIndex(B);var A=this.view.findCellIndex(B);if(E!==false&&A!==false){this.stopEditing();if(this.selModel.getSelectedCell){var D=this.selModel.getSelectedCell();if(D&&D.cell[0]===E&&D.cell[1]===A){this.startEditing(E,A)}}else{if(this.selModel.isSelected(E)){this.startEditing(E,A)}}}},onEditComplete:function(B,D,A){this.editing=false;this.activeEditor=null;B.un("specialkey",this.selModel.onEditorKey,this.selModel);var C=B.record;var F=this.colModel.getDataIndex(B.col);D=this.postEditValue(D,A,C,F);if(String(D)!==String(A)){var E={grid:this,record:C,field:F,originalValue:A,value:D,row:B.row,column:B.col,cancel:false};if(this.fireEvent("validateedit",E)!==false&&!E.cancel){C.set(F,E.value);delete E.cancel;this.fireEvent("afteredit",E)}}this.view.focusCell(B.row,B.col)},startEditing:function(F,B){this.stopEditing();if(this.colModel.isCellEditable(B,F)){this.view.ensureVisible(F,B,true);var C=this.store.getAt(F);var E=this.colModel.getDataIndex(B);var D={grid:this,record:C,field:E,value:C.data[E],row:F,column:B,cancel:false};if(this.fireEvent("beforeedit",D)!==false&&!D.cancel){this.editing=true;var A=this.colModel.getCellEditor(B,F);if(!A.rendered){A.render(this.view.getEditorParent(A))}(function(){A.row=F;A.col=B;A.record=C;A.on("complete",this.onEditComplete,this,{single:true});A.on("specialkey",this.selModel.onEditorKey,this.selModel);this.activeEditor=A;var G=this.preEditValue(C,E);A.startEdit(this.view.getCell(F,B).firstChild,G)}).defer(50,this)}}},preEditValue:function(A,C){var B=A.data[C];return this.autoEncode&&typeof B=="string"?Ext.util.Format.htmlDecode(B):B},postEditValue:function(C,A,B,D){return this.autoEncode&&typeof C=="string"?Ext.util.Format.htmlEncode(C):C},stopEditing:function(A){if(this.activeEditor){this.activeEditor[A===true?"cancelEdit":"completeEdit"]()}this.activeEditor=null},onDestroy:function(){if(this.rendered){var C=this.colModel.config;for(var B=0,A=C.length;B ",width:20,sortable:false,menuDisabled:true,fixed:true,dataIndex:"",id:"checker",initEvents:function(){Ext.grid.CheckboxSelectionModel.superclass.initEvents.call(this);this.grid.on("render",function(){var A=this.grid.getView();A.mainBody.on("mousedown",this.onMouseDown,this);Ext.fly(A.innerHd).on("mousedown",this.onHdMouseDown,this)},this)},onMouseDown:function(C,B){if(C.button===0&&B.className=="x-grid3-row-checker"){C.stopEvent();var D=C.getTarget(".x-grid3-row");if(D){var A=D.rowIndex;if(this.isSelected(A)){this.deselectRow(A)}else{this.selectRow(A,true)}}}},onHdMouseDown:function(C,A){if(A.className=="x-grid3-hd-checker"){C.stopEvent();var B=Ext.fly(A.parentNode);var D=B.hasClass("x-grid3-hd-checker-on");if(D){B.removeClass("x-grid3-hd-checker-on");this.clearSelections()}else{B.addClass("x-grid3-hd-checker-on");this.selectAll()}}},renderer:function(B,C,A){return"
       
      "}}); +Ext.LoadMask=function(C,B){this.el=Ext.get(C);Ext.apply(this,B);if(this.store){this.store.on("beforeload",this.onBeforeLoad,this);this.store.on("load",this.onLoad,this);this.store.on("loadexception",this.onLoad,this);this.removeMask=Ext.value(this.removeMask,false)}else{var A=this.el.getUpdater();A.showLoadIndicator=false;A.on("beforeupdate",this.onBeforeLoad,this);A.on("update",this.onLoad,this);A.on("failure",this.onLoad,this);this.removeMask=Ext.value(this.removeMask,true)}};Ext.LoadMask.prototype={msg:"Loading...",msgCls:"x-mask-loading",disabled:false,disable:function(){this.disabled=true},enable:function(){this.disabled=false},onLoad:function(){this.el.unmask(this.removeMask)},onBeforeLoad:function(){if(!this.disabled){this.el.mask(this.msg,this.msgCls)}},show:function(){this.onBeforeLoad()},hide:function(){this.onLoad()},destroy:function(){if(this.store){this.store.un("beforeload",this.onBeforeLoad,this);this.store.un("load",this.onLoad,this);this.store.un("loadexception",this.onLoad,this)}else{var A=this.el.getUpdater();A.un("beforeupdate",this.onBeforeLoad,this);A.un("update",this.onLoad,this);A.un("failure",this.onLoad,this)}}}; +Ext.ProgressBar=Ext.extend(Ext.BoxComponent,{baseCls:"x-progress",waitTimer:null,initComponent:function(){Ext.ProgressBar.superclass.initComponent.call(this);this.addEvents("update")},onRender:function(D,A){Ext.ProgressBar.superclass.onRender.call(this,D,A);var C=new Ext.Template("
      ","
      ","
      ","
      ","
       
      ","
      ","
      ","
      ","
       
      ","
      ","
      ","
      ");if(A){this.el=C.insertBefore(A,{cls:this.baseCls},true)}else{this.el=C.append(D,{cls:this.baseCls},true)}if(this.id){this.el.dom.id=this.id}var B=this.el.dom.firstChild;this.progressBar=Ext.get(B.firstChild);if(this.textEl){this.textEl=Ext.get(this.textEl);delete this.textTopEl}else{this.textTopEl=Ext.get(this.progressBar.dom.firstChild);var E=Ext.get(B.childNodes[1]);this.textTopEl.setStyle("z-index",99).addClass("x-hidden");this.textEl=new Ext.CompositeElement([this.textTopEl.dom.firstChild,E.dom.firstChild]);this.textEl.setWidth(B.offsetWidth)}this.progressBar.setHeight(B.offsetHeight)},afterRender:function(){Ext.ProgressBar.superclass.afterRender.call(this);if(this.value){this.updateProgress(this.value,this.text)}else{this.updateText(this.text)}},updateProgress:function(B,C){this.value=B||0;if(C){this.updateText(C)}if(this.rendered){var A=Math.floor(B*this.el.dom.firstChild.offsetWidth);this.progressBar.setWidth(A);if(this.textTopEl){this.textTopEl.removeClass("x-hidden").setWidth(A)}}this.fireEvent("update",this,B,C);return this},wait:function(B){if(!this.waitTimer){var A=this;B=B||{};this.updateText(B.text);this.waitTimer=Ext.TaskMgr.start({run:function(C){var D=B.increment||10;this.updateProgress(((((C+D)%D)+1)*(100/D))*0.01)},interval:B.interval||1000,duration:B.duration,onStop:function(){if(B.fn){B.fn.apply(B.scope||this)}this.reset()},scope:A})}return this},isWaiting:function(){return this.waitTimer!=null},updateText:function(A){this.text=A||" ";if(this.rendered){this.textEl.update(this.text)}return this},syncProgressBar:function(){if(this.value){this.updateProgress(this.value,this.text)}return this},setSize:function(A,C){Ext.ProgressBar.superclass.setSize.call(this,A,C);if(this.textTopEl){var B=this.el.dom.firstChild;this.textEl.setSize(B.offsetWidth,B.offsetHeight)}this.syncProgressBar();return this},reset:function(A){this.updateProgress(0);if(this.textTopEl){this.textTopEl.addClass("x-hidden")}if(this.waitTimer){this.waitTimer.onStop=null;Ext.TaskMgr.stop(this.waitTimer);this.waitTimer=null}if(A===true){this.hide()}return this}});Ext.reg("progress",Ext.ProgressBar); +Ext.Slider=Ext.extend(Ext.BoxComponent,{vertical:false,minValue:0,maxValue:100,keyIncrement:1,increment:0,clickRange:[5,15],clickToChange:true,animate:true,dragging:false,initComponent:function(){if(this.value===undefined){this.value=this.minValue}Ext.Slider.superclass.initComponent.call(this);this.keyIncrement=Math.max(this.increment,this.keyIncrement);this.addEvents("beforechange","change","changecomplete","dragstart","drag","dragend");if(this.vertical){Ext.apply(this,Ext.Slider.Vertical)}},onRender:function(){this.autoEl={cls:"x-slider "+(this.vertical?"x-slider-vert":"x-slider-horz"),cn:{cls:"x-slider-end",cn:{cls:"x-slider-inner",cn:[{cls:"x-slider-thumb"},{tag:"a",cls:"x-slider-focus",href:"#",tabIndex:"-1",hidefocus:"on"}]}}};Ext.Slider.superclass.onRender.apply(this,arguments);this.endEl=this.el.first();this.innerEl=this.endEl.first();this.thumb=this.innerEl.first();this.halfThumb=(this.vertical?this.thumb.getHeight():this.thumb.getWidth())/2;this.focusEl=this.thumb.next();this.initEvents()},initEvents:function(){this.thumb.addClassOnOver("x-slider-thumb-over");this.mon(this.el,"mousedown",this.onMouseDown,this);this.mon(this.el,"keydown",this.onKeyDown,this);this.focusEl.swallowEvent("click",true);this.tracker=new Ext.dd.DragTracker({onBeforeStart:this.onBeforeDragStart.createDelegate(this),onStart:this.onDragStart.createDelegate(this),onDrag:this.onDrag.createDelegate(this),onEnd:this.onDragEnd.createDelegate(this),tolerance:3,autoStart:300});this.tracker.initEl(this.thumb);this.on("beforedestroy",this.tracker.destroy,this.tracker)},onMouseDown:function(B){if(this.disabled){return }if(this.clickToChange&&B.target!=this.thumb.dom){var A=this.innerEl.translatePoints(B.getXY());this.onClickChange(A)}this.focus()},onClickChange:function(A){if(A.top>this.clickRange[0]&&A.top0){if(A>(C/2)){D=B+(C-A)}else{D=B-A}}return D.constrain(this.minValue,this.maxValue)},afterRender:function(){Ext.Slider.superclass.afterRender.apply(this,arguments);if(this.value!==undefined){var A=this.normalizeValue(this.value);if(A!==this.value){delete this.value;this.setValue(A,false)}else{this.moveThumb(this.translateValue(A),false)}}},getRatio:function(){var A=this.innerEl.getWidth();var B=this.maxValue-this.minValue;return B==0?A:(A/B)},normalizeValue:function(A){if(typeof A!="number"){A=parseInt(A)}A=Math.round(A);A=this.doSnap(A);A=A.constrain(this.minValue,this.maxValue);return A},setValue:function(B,A,C){B=this.normalizeValue(B);if(B!==this.value&&this.fireEvent("beforechange",this,B,this.value)!==false){this.value=B;this.moveThumb(this.translateValue(B),A!==false);this.fireEvent("change",this,B);if(C){this.fireEvent("changecomplete",this,B)}}},translateValue:function(A){var B=this.getRatio();return(A*B)-(this.minValue*B)-this.halfThumb},reverseValue:function(B){var A=this.getRatio();return(B+this.halfThumb+(this.minValue*A))/A},moveThumb:function(B,A){if(!A||this.animate===false){this.thumb.setLeft(B)}else{this.thumb.shift({left:B,stopFx:true,duration:0.35})}},focus:function(){this.focusEl.focus(10)},onBeforeDragStart:function(A){return !this.disabled},onDragStart:function(A){this.thumb.addClass("x-slider-thumb-drag");this.dragging=true;this.dragStartValue=this.value;this.fireEvent("dragstart",this,A)},onDrag:function(A){var B=this.innerEl.translatePoints(this.tracker.getXY());this.setValue(Math.round(this.reverseValue(B.left)),false);this.fireEvent("drag",this,A)},onDragEnd:function(A){this.thumb.removeClass("x-slider-thumb-drag");this.dragging=false;this.fireEvent("dragend",this,A);if(this.dragStartValue!=this.value){this.fireEvent("changecomplete",this,this.value)}},onResize:function(A,B){this.innerEl.setWidth(A-(this.el.getPadding("l")+this.endEl.getPadding("r")));this.syncThumb()},syncThumb:function(){if(this.rendered){this.moveThumb(this.translateValue(this.value))}},getValue:function(){return this.value}});Ext.reg("slider",Ext.Slider);Ext.Slider.Vertical={onResize:function(A,B){this.innerEl.setHeight(B-(this.el.getPadding("t")+this.endEl.getPadding("b")));this.syncThumb()},getRatio:function(){var B=this.innerEl.getHeight();var A=this.maxValue-this.minValue;return B/A},moveThumb:function(B,A){if(!A||this.animate===false){this.thumb.setBottom(B)}else{this.thumb.shift({bottom:B,stopFx:true,duration:0.35})}},onDrag:function(B){var C=this.innerEl.translatePoints(this.tracker.getXY());var A=this.innerEl.getHeight()-C.top;this.setValue(Math.round(A/this.getRatio()),false);this.fireEvent("drag",this,B)},onClickChange:function(B){if(B.left>this.clickRange[0]&&B.left0){this.statusEl.addClass(A);this.currIconCls=A}}else{this.currIconCls=A}return this},showBusy:function(A){if(typeof A=="string"){A={text:A}}A=Ext.applyIf(A||{},{text:this.busyText,iconCls:this.busyIconCls});return this.setStatus(A)}});Ext.reg("statusbar",Ext.StatusBar); +Ext.History=(function(){var E,C;var J=false;var D;function F(){var K=top.location.href,L=K.indexOf("#");return L>=0?K.substr(L+1):null}function A(){C.value=D}function G(K){D=K;Ext.History.fireEvent("change",K)}function H(L){var K=["
      ",L,"
      "].join("");try{var N=E.contentWindow.document;N.open();N.write(K);N.close();return true}catch(M){return false}}function B(){if(!E.contentWindow||!E.contentWindow.document){setTimeout(B,10);return }var N=E.contentWindow.document;var L=N.getElementById("state");var K=L?L.innerText:null;var M=F();setInterval(function(){N=E.contentWindow.document;L=N.getElementById("state");var P=L?L.innerText:null;var O=F();if(P!==K){K=P;G(K);top.location.hash=K;M=K;A()}else{if(O!==M){M=O;H(O)}}},50);J=true;Ext.History.fireEvent("ready",Ext.History)}function I(){D=C.value;if(Ext.isIE){B()}else{var K=F();setInterval(function(){var L=F();if(L!==K){K=L;G(K);A()}},50);J=true;Ext.History.fireEvent("ready",Ext.History)}}return{fieldId:"x-history-field",iframeId:"x-history-frame",events:{},init:function(L,K){if(J){Ext.callback(L,K,[this]);return }if(!Ext.isReady){Ext.onReady(function(){Ext.History.init(L,K)});return }C=Ext.getDom(Ext.History.fieldId);if(Ext.isIE){E=Ext.getDom(Ext.History.iframeId)}this.addEvents("ready","change");if(L){this.on("ready",L,K,{single:true})}I()},add:function(K,L){if(L!==false){if(this.getToken()==K){return true}}if(Ext.isIE){return H(K)}else{top.location.hash=K;return true}},back:function(){history.go(-1)},forward:function(){history.go(1)},getToken:function(){return J?D:F()}}})();Ext.apply(Ext.History,new Ext.util.Observable()); diff --git a/comet4j-js/docs/resources/ext-base.js b/comet4j-js/docs/resources/ext-base.js new file mode 100644 index 0000000..fedb877 --- /dev/null +++ b/comet4j-js/docs/resources/ext-base.js @@ -0,0 +1,10 @@ +/* + * Ext JS Library 2.2 + * Copyright(c) 2006-2008, Ext JS, LLC. + * licensing@extjs.com + * + * http://extjs.com/license + */ + +Ext={version:"2.2"};window["undefined"]=window["undefined"];Ext.apply=function(C,D,B){if(B){Ext.apply(C,B)}if(C&&D&&typeof D=="object"){for(var A in D){C[A]=D[A]}}return C};(function(){var idSeed=0;var ua=navigator.userAgent.toLowerCase();var isStrict=document.compatMode=="CSS1Compat",isOpera=ua.indexOf("opera")>-1,isSafari=(/webkit|khtml/).test(ua),isSafari3=isSafari&&ua.indexOf("webkit/5")!=-1,isIE=!isOpera&&ua.indexOf("msie")>-1,isIE7=!isOpera&&ua.indexOf("msie 7")>-1,isGecko=!isSafari&&ua.indexOf("gecko")>-1,isGecko3=!isSafari&&ua.indexOf("rv:1.9")>-1,isBorderBox=isIE&&!isStrict,isWindows=(ua.indexOf("windows")!=-1||ua.indexOf("win32")!=-1),isMac=(ua.indexOf("macintosh")!=-1||ua.indexOf("mac os x")!=-1),isAir=(ua.indexOf("adobeair")!=-1),isLinux=(ua.indexOf("linux")!=-1),isSecure=window.location.href.toLowerCase().indexOf("https")===0;if(isIE&&!isIE7){try{document.execCommand("BackgroundImageCache",false,true)}catch(e){}}Ext.apply(Ext,{isStrict:isStrict,isSecure:isSecure,isReady:false,enableGarbageCollector:true,enableListenerCollection:false,SSL_SECURE_URL:"javascript:false",BLANK_IMAGE_URL:"http:/"+"/extjs.com/s.gif",emptyFn:function(){},applyIf:function(o,c){if(o&&c){for(var p in c){if(typeof o[p]=="undefined"){o[p]=c[p]}}}return o},addBehaviors:function(o){if(!Ext.isReady){Ext.onReady(function(){Ext.addBehaviors(o)});return }var cache={};for(var b in o){var parts=b.split("@");if(parts[1]){var s=parts[0];if(!cache[s]){cache[s]=Ext.select(s)}cache[s].on(parts[1],o[b])}}cache=null},id:function(el,prefix){prefix=prefix||"ext-gen";el=Ext.getDom(el);var id=prefix+(++idSeed);return el?(el.id?el.id:(el.id=id)):id},extend:function(){var io=function(o){for(var m in o){this[m]=o[m]}};var oc=Object.prototype.constructor;return function(sb,sp,overrides){if(typeof sp=="object"){overrides=sp;sp=sb;sb=overrides.constructor!=oc?overrides.constructor:function(){sp.apply(this,arguments)}}var F=function(){},sbp,spp=sp.prototype;F.prototype=spp;sbp=sb.prototype=new F();sbp.constructor=sb;sb.superclass=spp;if(spp.constructor==oc){spp.constructor=sp}sb.override=function(o){Ext.override(sb,o)};sbp.override=io;Ext.override(sb,overrides);sb.extend=function(o){Ext.extend(sb,o)};return sb}}(),override:function(origclass,overrides){if(overrides){var p=origclass.prototype;for(var method in overrides){p[method]=overrides[method]}}},namespace:function(){var a=arguments,o=null,i,j,d,rt;for(i=0;i=0){L=G[P]}if(!S||!L){return false}this.doRemove(S,O,L[this.WFN],false);delete G[P][this.WFN];delete G[P][this.FN];G.splice(P,1);return true},getTarget:function(N,M){N=N.browserEvent||N;var L=N.target||N.srcElement;return this.resolveTextNode(L)},resolveTextNode:function(L){if(Ext.isSafari&&L&&3==L.nodeType){return L.parentNode}else{return L}},getPageX:function(M){M=M.browserEvent||M;var L=M.pageX;if(!L&&0!==L){L=M.clientX||0;if(Ext.isIE){L+=this.getScroll()[1]}}return L},getPageY:function(L){L=L.browserEvent||L;var M=L.pageY;if(!M&&0!==M){M=L.clientY||0;if(Ext.isIE){M+=this.getScroll()[0]}}return M},getXY:function(L){L=L.browserEvent||L;return[this.getPageX(L),this.getPageY(L)]},getRelatedTarget:function(M){M=M.browserEvent||M;var L=M.relatedTarget;if(!L){if(M.type=="mouseout"){L=M.toElement}else{if(M.type=="mouseover"){L=M.fromElement}}}return this.resolveTextNode(L)},getTime:function(N){N=N.browserEvent||N;if(!N.time){var M=new Date().getTime();try{N.time=M}catch(L){this.lastError=L;return M}}return N.time},stopEvent:function(L){this.stopPropagation(L);this.preventDefault(L)},stopPropagation:function(L){L=L.browserEvent||L;if(L.stopPropagation){L.stopPropagation()}else{L.cancelBubble=true}},preventDefault:function(L){L=L.browserEvent||L;if(L.preventDefault){L.preventDefault()}else{L.returnValue=false}},getEvent:function(M){var L=M||window.event;if(!L){var N=this.getEvent.caller;while(N){L=N.arguments[0];if(L&&Event==L.constructor){break}N=N.caller}}return L},getCharCode:function(L){L=L.browserEvent||L;return L.charCode||L.keyCode||0},_getCacheIndex:function(Q,N,P){for(var O=0,M=G.length;O0)}var Q=[];for(var M=0,L=H.length;M0){for(var Q=0,S=T.length;Q0){O=G.length;while(O){N=O-1;M=G[N];if(M){R.removeListener(M[R.EL],M[R.TYPE],M[R.FN],N)}O=O-1}M=null;R.clearCache()}R.doRemove(window,"unload",R._unload)},getScroll:function(){var L=document.documentElement,M=document.body;if(L&&(L.scrollTop||L.scrollLeft)){return[L.scrollTop,L.scrollLeft]}else{if(M){return[M.scrollTop,M.scrollLeft]}else{return[0,0]}}},doAdd:function(){if(window.addEventListener){return function(O,M,N,L){O.addEventListener(M,N,(L))}}else{if(window.attachEvent){return function(O,M,N,L){O.attachEvent("on"+M,N)}}else{return function(){}}}}(),doRemove:function(){if(window.removeEventListener){return function(O,M,N,L){O.removeEventListener(M,N,(L))}}else{if(window.detachEvent){return function(N,L,M){N.detachEvent("on"+L,M)}}else{return function(){}}}}()}}();var D=Ext.lib.Event;D.on=D.addListener;D.un=D.removeListener;if(document&&document.body){D._load()}else{D.doAdd(window,"load",D._load)}D.doAdd(window,"unload",D._unload);D._tryPreloadAttach();Ext.lib.Ajax={request:function(K,I,E,J,F){if(F){var G=F.headers;if(G){for(var H in G){if(G.hasOwnProperty(H)){this.initHeader(H,G[H],false)}}}if(F.xmlData){if(!G||!G["Content-Type"]){this.initHeader("Content-Type","text/xml",false)}K=(K?K:(F.method?F.method:"POST"));J=F.xmlData}else{if(F.jsonData){if(!G||!G["Content-Type"]){this.initHeader("Content-Type","application/json",false)}K=(K?K:(F.method?F.method:"POST"));J=typeof F.jsonData=="object"?Ext.encode(F.jsonData):F.jsonData}}}return this.asyncRequest(K,I,E,J)},serializeForm:function(F){if(typeof F=="string"){F=(document.getElementById(F)||document.forms[F])}var G,E,H,J,K="",M=false;for(var L=0;L=200&&G<300){F=this.createResponseObject(I,J.argument);if(J.success){if(!J.scope){J.success(F)}else{J.success.apply(J.scope,[F])}}}else{switch(G){case 12002:case 12029:case 12030:case 12031:case 12152:case 13030:F=this.createExceptionObject(I.tId,J.argument,(E?E:false));if(J.failure){if(!J.scope){J.failure(F)}else{J.failure.apply(J.scope,[F])}}break;default:F=this.createResponseObject(I,J.argument);if(J.failure){if(!J.scope){J.failure(F)}else{J.failure.apply(J.scope,[F])}}}}this.releaseObject(I);F=null},createResponseObject:function(E,K){var H={};var M={};try{var G=E.conn.getAllResponseHeaders();var J=G.split("\n");for(var I=0;I=this.left&&E.right<=this.right&&E.top>=this.top&&E.bottom<=this.bottom)},getArea:function(){return((this.bottom-this.top)*(this.right-this.left))},intersect:function(I){var G=Math.max(this.top,I.top);var H=Math.min(this.right,I.right);var E=Math.min(this.bottom,I.bottom);var F=Math.max(this.left,I.left);if(E>=G&&H>=F){return new Ext.lib.Region(G,H,E,F)}else{return null}},union:function(I){var G=Math.min(this.top,I.top);var H=Math.max(this.right,I.right);var E=Math.max(this.bottom,I.bottom);var F=Math.min(this.left,I.left);return new Ext.lib.Region(G,H,E,F)},constrainTo:function(E){this.top=this.top.constrain(E.top,E.bottom);this.bottom=this.bottom.constrain(E.top,E.bottom);this.left=this.left.constrain(E.left,E.right);this.right=this.right.constrain(E.left,E.right);return this},adjust:function(G,F,E,H){this.top+=G;this.left+=F;this.right+=H;this.bottom+=E;return this}};Ext.lib.Region.getRegion=function(H){var J=Ext.lib.Dom.getXY(H);var G=J[1];var I=J[0]+H.offsetWidth;var E=J[1]+H.offsetHeight;var F=J[0];return new Ext.lib.Region(G,I,E,F)};Ext.lib.Point=function(E,F){if(Ext.isArray(E)){F=E[1];E=E[0]}this.x=this.right=this.left=this[0]=E;this.y=this.top=this.bottom=this[1]=F};Ext.lib.Point.prototype=new Ext.lib.Region();Ext.lib.Anim={scroll:function(H,F,I,J,E,G){return this.run(H,F,I,J,E,G,Ext.lib.Scroll)},motion:function(H,F,I,J,E,G){return this.run(H,F,I,J,E,G,Ext.lib.Motion)},color:function(H,F,I,J,E,G){return this.run(H,F,I,J,E,G,Ext.lib.ColorAnim)},run:function(I,F,K,L,E,H,G){G=G||Ext.lib.AnimBase;if(typeof L=="string"){L=Ext.lib.Easing[L]}var J=new G(I,F,K,L);J.animateX(function(){Ext.callback(E,H)});return J}};function C(E){if(!B){B=new Ext.Element.Flyweight()}B.dom=E;return B}if(Ext.isIE){function A(){var E=Function.prototype;delete E.createSequence;delete E.defer;delete E.createDelegate;delete E.createCallback;delete E.createInterceptor;window.detachEvent("onunload",A)}window.attachEvent("onunload",A)}Ext.lib.AnimBase=function(F,E,G,H){if(F){this.init(F,E,G,H)}};Ext.lib.AnimBase.prototype={toString:function(){var E=this.getEl();var F=E.id||E.tagName;return("Anim "+F)},patterns:{noNegatives:/width|height|opacity|padding/i,offsetAttribute:/^((width|height)|(top|left))$/,defaultUnit:/width|height|top$|bottom$|left$|right$/i,offsetUnit:/\d+(em|%|en|ex|pt|in|cm|mm|pc)$/i},doMethod:function(E,G,F){return this.method(this.currentFrame,G,F-G,this.totalFrames)},setAttribute:function(E,G,F){if(this.patterns.noNegatives.test(E)){G=(G>0)?G:0}Ext.fly(this.getEl(),"_anim").setStyle(E,G+F)},getAttribute:function(E){var G=this.getEl();var I=C(G).getStyle(E);if(I!=="auto"&&!this.patterns.offsetUnit.test(I)){return parseFloat(I)}var F=this.patterns.offsetAttribute.exec(E)||[];var J=!!(F[3]);var H=!!(F[2]);if(H||(C(G).getStyle("position")=="absolute"&&J)){I=G["offset"+F[0].charAt(0).toUpperCase()+F[0].substr(1)]}else{I=0}return I},getDefaultUnit:function(E){if(this.patterns.defaultUnit.test(E)){return"px"}return""},animateX:function(G,E){var F=function(){this.onComplete.removeListener(F);if(typeof G=="function"){G.call(E||this,this)}};this.onComplete.addListener(F,this);this.animate()},setRuntimeAttribute:function(F){var K;var G;var H=this.attributes;this.runtimeAttributes[F]={};var J=function(L){return(typeof L!=="undefined")};if(!J(H[F]["to"])&&!J(H[F]["by"])){return false}K=(J(H[F]["from"]))?H[F]["from"]:this.getAttribute(F);if(J(H[F]["to"])){G=H[F]["to"]}else{if(J(H[F]["by"])){if(K.constructor==Array){G=[];for(var I=0,E=K.length;I0&&isFinite(O)){if(K.currentFrame+O>=N){O=N-(M+1)}K.currentFrame+=O}}};Ext.lib.Bezier=new function(){this.getPosition=function(I,H){var J=I.length;var G=[];for(var F=0;F0&&!Ext.isArray(O[0])){O=[O]}else{var N=[];for(P=0,R=O.length;P0){this.runtimeAttributes[S]=this.runtimeAttributes[S].concat(O)}this.runtimeAttributes[S][this.runtimeAttributes[S].length]=L}else{I.setRuntimeAttribute.call(this,S)}};var E=function(J,L){var K=Ext.lib.Dom.getXY(this.getEl());J=[J[0]-K[0]+L[0],J[1]-K[1]+L[1]];return J};var G=function(J){return(typeof J!=="undefined")}})();(function(){Ext.lib.Scroll=function(I,H,J,K){if(I){Ext.lib.Scroll.superclass.constructor.call(this,I,H,J,K)}};Ext.extend(Ext.lib.Scroll,Ext.lib.ColorAnim);var F=Ext.lib;var G=F.Scroll.superclass;var E=F.Scroll.prototype;E.toString=function(){var H=this.getEl();var I=H.id||H.tagName;return("Scroll "+I)};E.doMethod=function(H,K,I){var J=null;if(H=="scroll"){J=[this.method(this.currentFrame,K[0],I[0]-K[0],this.totalFrames),this.method(this.currentFrame,K[1],I[1]-K[1],this.totalFrames)]}else{J=G.doMethod.call(this,H,K,I)}return J};E.getAttribute=function(H){var J=null;var I=this.getEl();if(H=="scroll"){J=[I.scrollLeft,I.scrollTop]}else{J=G.getAttribute.call(this,H)}return J};E.setAttribute=function(H,K,J){var I=this.getEl();if(H=="scroll"){I.scrollLeft=K[0];I.scrollTop=K[1]}else{G.setAttribute.call(this,H,K,J)}}})()})(); diff --git a/comet4j-js/docs/resources/extanim32.gif b/comet4j-js/docs/resources/extanim32.gif new file mode 100644 index 0000000..effe7c9 Binary files /dev/null and b/comet4j-js/docs/resources/extanim32.gif differ diff --git a/comet4j-js/docs/resources/extanim64.gif b/comet4j-js/docs/resources/extanim64.gif new file mode 100644 index 0000000..07a6862 Binary files /dev/null and b/comet4j-js/docs/resources/extanim64.gif differ diff --git a/comet4j-js/docs/resources/extjs.gif b/comet4j-js/docs/resources/extjs.gif new file mode 100644 index 0000000..724796d Binary files /dev/null and b/comet4j-js/docs/resources/extjs.gif differ diff --git a/comet4j-js/docs/resources/fav.gif b/comet4j-js/docs/resources/fav.gif new file mode 100644 index 0000000..abe3cf0 Binary files /dev/null and b/comet4j-js/docs/resources/fav.gif differ diff --git a/comet4j-js/docs/resources/folder.gif b/comet4j-js/docs/resources/folder.gif new file mode 100644 index 0000000..2064442 Binary files /dev/null and b/comet4j-js/docs/resources/folder.gif differ diff --git a/comet4j-js/docs/resources/folder_open.gif b/comet4j-js/docs/resources/folder_open.gif new file mode 100644 index 0000000..ba4c657 Binary files /dev/null and b/comet4j-js/docs/resources/folder_open.gif differ diff --git a/comet4j-js/docs/resources/form.png b/comet4j-js/docs/resources/form.png new file mode 100644 index 0000000..f0945cf Binary files /dev/null and b/comet4j-js/docs/resources/form.png differ diff --git a/comet4j-js/docs/resources/forum.gif b/comet4j-js/docs/resources/forum.gif new file mode 100644 index 0000000..21d7268 Binary files /dev/null and b/comet4j-js/docs/resources/forum.gif differ diff --git a/comet4j-js/docs/resources/hd-bg.gif b/comet4j-js/docs/resources/hd-bg.gif new file mode 100644 index 0000000..310102a Binary files /dev/null and b/comet4j-js/docs/resources/hd-bg.gif differ diff --git a/comet4j-js/docs/resources/hide-inherited.gif b/comet4j-js/docs/resources/hide-inherited.gif new file mode 100644 index 0000000..eae8e54 Binary files /dev/null and b/comet4j-js/docs/resources/hide-inherited.gif differ diff --git a/comet4j-js/docs/resources/icon-grid.gif b/comet4j-js/docs/resources/icon-grid.gif new file mode 100644 index 0000000..6b64286 Binary files /dev/null and b/comet4j-js/docs/resources/icon-grid.gif differ diff --git a/comet4j-js/docs/resources/images/default/box/corners-blue.gif b/comet4j-js/docs/resources/images/default/box/corners-blue.gif new file mode 100644 index 0000000..fa419b5 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/box/corners-blue.gif differ diff --git a/comet4j-js/docs/resources/images/default/box/corners.gif b/comet4j-js/docs/resources/images/default/box/corners.gif new file mode 100644 index 0000000..8aa8cae Binary files /dev/null and b/comet4j-js/docs/resources/images/default/box/corners.gif differ diff --git a/comet4j-js/docs/resources/images/default/box/l-blue.gif b/comet4j-js/docs/resources/images/default/box/l-blue.gif new file mode 100644 index 0000000..5ed7f00 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/box/l-blue.gif differ diff --git a/comet4j-js/docs/resources/images/default/box/l.gif b/comet4j-js/docs/resources/images/default/box/l.gif new file mode 100644 index 0000000..0160f97 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/box/l.gif differ diff --git a/comet4j-js/docs/resources/images/default/box/r-blue.gif b/comet4j-js/docs/resources/images/default/box/r-blue.gif new file mode 100644 index 0000000..3ea5cae Binary files /dev/null and b/comet4j-js/docs/resources/images/default/box/r-blue.gif differ diff --git a/comet4j-js/docs/resources/images/default/box/r.gif b/comet4j-js/docs/resources/images/default/box/r.gif new file mode 100644 index 0000000..34237f6 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/box/r.gif differ diff --git a/comet4j-js/docs/resources/images/default/box/tb-blue.gif b/comet4j-js/docs/resources/images/default/box/tb-blue.gif new file mode 100644 index 0000000..562fecc Binary files /dev/null and b/comet4j-js/docs/resources/images/default/box/tb-blue.gif differ diff --git a/comet4j-js/docs/resources/images/default/box/tb.gif b/comet4j-js/docs/resources/images/default/box/tb.gif new file mode 100644 index 0000000..435889b Binary files /dev/null and b/comet4j-js/docs/resources/images/default/box/tb.gif differ diff --git a/comet4j-js/docs/resources/images/default/button/btn-arrow.gif b/comet4j-js/docs/resources/images/default/button/btn-arrow.gif new file mode 100644 index 0000000..f90d5df Binary files /dev/null and b/comet4j-js/docs/resources/images/default/button/btn-arrow.gif differ diff --git a/comet4j-js/docs/resources/images/default/button/btn-sprite.gif b/comet4j-js/docs/resources/images/default/button/btn-sprite.gif new file mode 100644 index 0000000..b52e0ce Binary files /dev/null and b/comet4j-js/docs/resources/images/default/button/btn-sprite.gif differ diff --git a/comet4j-js/docs/resources/images/default/dd/drop-add.gif b/comet4j-js/docs/resources/images/default/dd/drop-add.gif new file mode 100644 index 0000000..b22cd14 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/dd/drop-add.gif differ diff --git a/comet4j-js/docs/resources/images/default/dd/drop-no.gif b/comet4j-js/docs/resources/images/default/dd/drop-no.gif new file mode 100644 index 0000000..08d0833 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/dd/drop-no.gif differ diff --git a/comet4j-js/docs/resources/images/default/dd/drop-yes.gif b/comet4j-js/docs/resources/images/default/dd/drop-yes.gif new file mode 100644 index 0000000..8aacb30 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/dd/drop-yes.gif differ diff --git a/comet4j-js/docs/resources/images/default/editor/tb-sprite.gif b/comet4j-js/docs/resources/images/default/editor/tb-sprite.gif new file mode 100644 index 0000000..fb70577 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/editor/tb-sprite.gif differ diff --git a/comet4j-js/docs/resources/images/default/form/checkbox.gif b/comet4j-js/docs/resources/images/default/form/checkbox.gif new file mode 100644 index 0000000..835b346 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/form/checkbox.gif differ diff --git a/comet4j-js/docs/resources/images/default/form/clear-trigger.gif b/comet4j-js/docs/resources/images/default/form/clear-trigger.gif new file mode 100644 index 0000000..da78d45 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/form/clear-trigger.gif differ diff --git a/comet4j-js/docs/resources/images/default/form/clear-trigger.psd b/comet4j-js/docs/resources/images/default/form/clear-trigger.psd new file mode 100644 index 0000000..f637fa5 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/form/clear-trigger.psd differ diff --git a/comet4j-js/docs/resources/images/default/form/date-trigger.gif b/comet4j-js/docs/resources/images/default/form/date-trigger.gif new file mode 100644 index 0000000..25ef7b3 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/form/date-trigger.gif differ diff --git a/comet4j-js/docs/resources/images/default/form/date-trigger.psd b/comet4j-js/docs/resources/images/default/form/date-trigger.psd new file mode 100644 index 0000000..74883b2 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/form/date-trigger.psd differ diff --git a/comet4j-js/docs/resources/images/default/form/error-tip-corners.gif b/comet4j-js/docs/resources/images/default/form/error-tip-corners.gif new file mode 100644 index 0000000..6ea4c38 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/form/error-tip-corners.gif differ diff --git a/comet4j-js/docs/resources/images/default/form/exclamation.gif b/comet4j-js/docs/resources/images/default/form/exclamation.gif new file mode 100644 index 0000000..ea31a30 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/form/exclamation.gif differ diff --git a/comet4j-js/docs/resources/images/default/form/radio.gif b/comet4j-js/docs/resources/images/default/form/radio.gif new file mode 100644 index 0000000..36bb91d Binary files /dev/null and b/comet4j-js/docs/resources/images/default/form/radio.gif differ diff --git a/comet4j-js/docs/resources/images/default/form/search-trigger.gif b/comet4j-js/docs/resources/images/default/form/search-trigger.gif new file mode 100644 index 0000000..db8802b Binary files /dev/null and b/comet4j-js/docs/resources/images/default/form/search-trigger.gif differ diff --git a/comet4j-js/docs/resources/images/default/form/search-trigger.psd b/comet4j-js/docs/resources/images/default/form/search-trigger.psd new file mode 100644 index 0000000..b11f273 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/form/search-trigger.psd differ diff --git a/comet4j-js/docs/resources/images/default/form/text-bg.gif b/comet4j-js/docs/resources/images/default/form/text-bg.gif new file mode 100644 index 0000000..4179607 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/form/text-bg.gif differ diff --git a/comet4j-js/docs/resources/images/default/form/trigger-tpl.gif b/comet4j-js/docs/resources/images/default/form/trigger-tpl.gif new file mode 100644 index 0000000..e3701a3 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/form/trigger-tpl.gif differ diff --git a/comet4j-js/docs/resources/images/default/form/trigger.gif b/comet4j-js/docs/resources/images/default/form/trigger.gif new file mode 100644 index 0000000..b220bbe Binary files /dev/null and b/comet4j-js/docs/resources/images/default/form/trigger.gif differ diff --git a/comet4j-js/docs/resources/images/default/form/trigger.psd b/comet4j-js/docs/resources/images/default/form/trigger.psd new file mode 100644 index 0000000..1f1ed64 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/form/trigger.psd differ diff --git a/comet4j-js/docs/resources/images/default/gradient-bg.gif b/comet4j-js/docs/resources/images/default/gradient-bg.gif new file mode 100644 index 0000000..8134e49 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/gradient-bg.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/arrow-left-white.gif b/comet4j-js/docs/resources/images/default/grid/arrow-left-white.gif new file mode 100644 index 0000000..63088f5 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/arrow-left-white.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/arrow-right-white.gif b/comet4j-js/docs/resources/images/default/grid/arrow-right-white.gif new file mode 100644 index 0000000..e9e0678 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/arrow-right-white.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/col-move-bottom.gif b/comet4j-js/docs/resources/images/default/grid/col-move-bottom.gif new file mode 100644 index 0000000..cc1e473 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/col-move-bottom.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/col-move-top.gif b/comet4j-js/docs/resources/images/default/grid/col-move-top.gif new file mode 100644 index 0000000..58ff32c Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/col-move-top.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/columns.gif b/comet4j-js/docs/resources/images/default/grid/columns.gif new file mode 100644 index 0000000..2d3a823 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/columns.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/dirty.gif b/comet4j-js/docs/resources/images/default/grid/dirty.gif new file mode 100644 index 0000000..4f217a4 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/dirty.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/done.gif b/comet4j-js/docs/resources/images/default/grid/done.gif new file mode 100644 index 0000000..a937cb2 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/done.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/drop-no.gif b/comet4j-js/docs/resources/images/default/grid/drop-no.gif new file mode 100644 index 0000000..31a332b Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/drop-no.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/drop-yes.gif b/comet4j-js/docs/resources/images/default/grid/drop-yes.gif new file mode 100644 index 0000000..926010e Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/drop-yes.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/footer-bg.gif b/comet4j-js/docs/resources/images/default/grid/footer-bg.gif new file mode 100644 index 0000000..126120f Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/footer-bg.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/grid-blue-hd.gif b/comet4j-js/docs/resources/images/default/grid/grid-blue-hd.gif new file mode 100644 index 0000000..862094e Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/grid-blue-hd.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/grid-blue-split.gif b/comet4j-js/docs/resources/images/default/grid/grid-blue-split.gif new file mode 100644 index 0000000..5286f58 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/grid-blue-split.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/grid-hrow.gif b/comet4j-js/docs/resources/images/default/grid/grid-hrow.gif new file mode 100644 index 0000000..6374104 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/grid-hrow.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/grid-loading.gif b/comet4j-js/docs/resources/images/default/grid/grid-loading.gif new file mode 100644 index 0000000..d112c54 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/grid-loading.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/grid-split.gif b/comet4j-js/docs/resources/images/default/grid/grid-split.gif new file mode 100644 index 0000000..c76a16e Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/grid-split.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/grid-vista-hd.gif b/comet4j-js/docs/resources/images/default/grid/grid-vista-hd.gif new file mode 100644 index 0000000..d097263 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/grid-vista-hd.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/grid3-hd-btn.gif b/comet4j-js/docs/resources/images/default/grid/grid3-hd-btn.gif new file mode 100644 index 0000000..2112607 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/grid3-hd-btn.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/grid3-hrow-over.gif b/comet4j-js/docs/resources/images/default/grid/grid3-hrow-over.gif new file mode 100644 index 0000000..f9c07af Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/grid3-hrow-over.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/grid3-hrow.gif b/comet4j-js/docs/resources/images/default/grid/grid3-hrow.gif new file mode 100644 index 0000000..8d459a3 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/grid3-hrow.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/grid3-special-col-bg.gif b/comet4j-js/docs/resources/images/default/grid/grid3-special-col-bg.gif new file mode 100644 index 0000000..0b4d6ca Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/grid3-special-col-bg.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/grid3-special-col-sel-bg.gif b/comet4j-js/docs/resources/images/default/grid/grid3-special-col-sel-bg.gif new file mode 100644 index 0000000..1dfe9a6 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/grid3-special-col-sel-bg.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/group-by.gif b/comet4j-js/docs/resources/images/default/grid/group-by.gif new file mode 100644 index 0000000..d6075bb Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/group-by.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/group-expand-sprite.gif b/comet4j-js/docs/resources/images/default/grid/group-expand-sprite.gif new file mode 100644 index 0000000..9c1653b Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/group-expand-sprite.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/hd-pop.gif b/comet4j-js/docs/resources/images/default/grid/hd-pop.gif new file mode 100644 index 0000000..eb8ba79 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/hd-pop.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/hmenu-asc.gif b/comet4j-js/docs/resources/images/default/grid/hmenu-asc.gif new file mode 100644 index 0000000..8917e0e Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/hmenu-asc.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/hmenu-desc.gif b/comet4j-js/docs/resources/images/default/grid/hmenu-desc.gif new file mode 100644 index 0000000..f26b7c2 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/hmenu-desc.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/hmenu-lock.gif b/comet4j-js/docs/resources/images/default/grid/hmenu-lock.gif new file mode 100644 index 0000000..1596126 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/hmenu-lock.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/hmenu-lock.png b/comet4j-js/docs/resources/images/default/grid/hmenu-lock.png new file mode 100644 index 0000000..8b81e7f Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/hmenu-lock.png differ diff --git a/comet4j-js/docs/resources/images/default/grid/hmenu-unlock.gif b/comet4j-js/docs/resources/images/default/grid/hmenu-unlock.gif new file mode 100644 index 0000000..af59cf9 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/hmenu-unlock.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/hmenu-unlock.png b/comet4j-js/docs/resources/images/default/grid/hmenu-unlock.png new file mode 100644 index 0000000..9dd5df3 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/hmenu-unlock.png differ diff --git a/comet4j-js/docs/resources/images/default/grid/invalid_line.gif b/comet4j-js/docs/resources/images/default/grid/invalid_line.gif new file mode 100644 index 0000000..fb7e0f3 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/invalid_line.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/loading.gif b/comet4j-js/docs/resources/images/default/grid/loading.gif new file mode 100644 index 0000000..e846e1d Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/loading.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/mso-hd.gif b/comet4j-js/docs/resources/images/default/grid/mso-hd.gif new file mode 100644 index 0000000..669f3cf Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/mso-hd.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/nowait.gif b/comet4j-js/docs/resources/images/default/grid/nowait.gif new file mode 100644 index 0000000..4c5862c Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/nowait.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/page-first-disabled.gif b/comet4j-js/docs/resources/images/default/grid/page-first-disabled.gif new file mode 100644 index 0000000..1e02c41 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/page-first-disabled.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/page-first.gif b/comet4j-js/docs/resources/images/default/grid/page-first.gif new file mode 100644 index 0000000..d84f41a Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/page-first.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/page-last-disabled.gif b/comet4j-js/docs/resources/images/default/grid/page-last-disabled.gif new file mode 100644 index 0000000..8697067 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/page-last-disabled.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/page-last.gif b/comet4j-js/docs/resources/images/default/grid/page-last.gif new file mode 100644 index 0000000..3df5c2b Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/page-last.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/page-next-disabled.gif b/comet4j-js/docs/resources/images/default/grid/page-next-disabled.gif new file mode 100644 index 0000000..90a7756 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/page-next-disabled.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/page-next.gif b/comet4j-js/docs/resources/images/default/grid/page-next.gif new file mode 100644 index 0000000..9601635 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/page-next.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/page-prev-disabled.gif b/comet4j-js/docs/resources/images/default/grid/page-prev-disabled.gif new file mode 100644 index 0000000..37154d6 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/page-prev-disabled.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/page-prev.gif b/comet4j-js/docs/resources/images/default/grid/page-prev.gif new file mode 100644 index 0000000..eb70cf8 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/page-prev.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/pick-button.gif b/comet4j-js/docs/resources/images/default/grid/pick-button.gif new file mode 100644 index 0000000..6957924 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/pick-button.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/refresh.gif b/comet4j-js/docs/resources/images/default/grid/refresh.gif new file mode 100644 index 0000000..110f684 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/refresh.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/row-check-sprite.gif b/comet4j-js/docs/resources/images/default/grid/row-check-sprite.gif new file mode 100644 index 0000000..6101164 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/row-check-sprite.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/row-expand-sprite.gif b/comet4j-js/docs/resources/images/default/grid/row-expand-sprite.gif new file mode 100644 index 0000000..6f4d874 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/row-expand-sprite.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/row-over.gif b/comet4j-js/docs/resources/images/default/grid/row-over.gif new file mode 100644 index 0000000..b288e38 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/row-over.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/row-sel.gif b/comet4j-js/docs/resources/images/default/grid/row-sel.gif new file mode 100644 index 0000000..98209e6 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/row-sel.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/sort_asc.gif b/comet4j-js/docs/resources/images/default/grid/sort_asc.gif new file mode 100644 index 0000000..67a2a4c Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/sort_asc.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/sort_desc.gif b/comet4j-js/docs/resources/images/default/grid/sort_desc.gif new file mode 100644 index 0000000..34db47c Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/sort_desc.gif differ diff --git a/comet4j-js/docs/resources/images/default/grid/wait.gif b/comet4j-js/docs/resources/images/default/grid/wait.gif new file mode 100644 index 0000000..471c1a4 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/grid/wait.gif differ diff --git a/comet4j-js/docs/resources/images/default/layout/collapse.gif b/comet4j-js/docs/resources/images/default/layout/collapse.gif new file mode 100644 index 0000000..d87b0a9 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/layout/collapse.gif differ diff --git a/comet4j-js/docs/resources/images/default/layout/expand.gif b/comet4j-js/docs/resources/images/default/layout/expand.gif new file mode 100644 index 0000000..7b6e1c1 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/layout/expand.gif differ diff --git a/comet4j-js/docs/resources/images/default/layout/gradient-bg.gif b/comet4j-js/docs/resources/images/default/layout/gradient-bg.gif new file mode 100644 index 0000000..8134e49 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/layout/gradient-bg.gif differ diff --git a/comet4j-js/docs/resources/images/default/layout/mini-bottom.gif b/comet4j-js/docs/resources/images/default/layout/mini-bottom.gif new file mode 100644 index 0000000..c18f9e3 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/layout/mini-bottom.gif differ diff --git a/comet4j-js/docs/resources/images/default/layout/mini-left.gif b/comet4j-js/docs/resources/images/default/layout/mini-left.gif new file mode 100644 index 0000000..99f7993 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/layout/mini-left.gif differ diff --git a/comet4j-js/docs/resources/images/default/layout/mini-right.gif b/comet4j-js/docs/resources/images/default/layout/mini-right.gif new file mode 100644 index 0000000..5b13c5a Binary files /dev/null and b/comet4j-js/docs/resources/images/default/layout/mini-right.gif differ diff --git a/comet4j-js/docs/resources/images/default/layout/mini-top.gif b/comet4j-js/docs/resources/images/default/layout/mini-top.gif new file mode 100644 index 0000000..a4ca2bb Binary files /dev/null and b/comet4j-js/docs/resources/images/default/layout/mini-top.gif differ diff --git a/comet4j-js/docs/resources/images/default/layout/ns-collapse.gif b/comet4j-js/docs/resources/images/default/layout/ns-collapse.gif new file mode 100644 index 0000000..df2a77e Binary files /dev/null and b/comet4j-js/docs/resources/images/default/layout/ns-collapse.gif differ diff --git a/comet4j-js/docs/resources/images/default/layout/ns-expand.gif b/comet4j-js/docs/resources/images/default/layout/ns-expand.gif new file mode 100644 index 0000000..77ab9da Binary files /dev/null and b/comet4j-js/docs/resources/images/default/layout/ns-expand.gif differ diff --git a/comet4j-js/docs/resources/images/default/layout/panel-close.gif b/comet4j-js/docs/resources/images/default/layout/panel-close.gif new file mode 100644 index 0000000..2bdd623 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/layout/panel-close.gif differ diff --git a/comet4j-js/docs/resources/images/default/layout/panel-title-bg.gif b/comet4j-js/docs/resources/images/default/layout/panel-title-bg.gif new file mode 100644 index 0000000..d1daef5 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/layout/panel-title-bg.gif differ diff --git a/comet4j-js/docs/resources/images/default/layout/panel-title-light-bg.gif b/comet4j-js/docs/resources/images/default/layout/panel-title-light-bg.gif new file mode 100644 index 0000000..8c2c83d Binary files /dev/null and b/comet4j-js/docs/resources/images/default/layout/panel-title-light-bg.gif differ diff --git a/comet4j-js/docs/resources/images/default/layout/stick.gif b/comet4j-js/docs/resources/images/default/layout/stick.gif new file mode 100644 index 0000000..5a1e8ba Binary files /dev/null and b/comet4j-js/docs/resources/images/default/layout/stick.gif differ diff --git a/comet4j-js/docs/resources/images/default/layout/stuck.gif b/comet4j-js/docs/resources/images/default/layout/stuck.gif new file mode 100644 index 0000000..0a8de4d Binary files /dev/null and b/comet4j-js/docs/resources/images/default/layout/stuck.gif differ diff --git a/comet4j-js/docs/resources/images/default/layout/tab-close-on.gif b/comet4j-js/docs/resources/images/default/layout/tab-close-on.gif new file mode 100644 index 0000000..eacea39 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/layout/tab-close-on.gif differ diff --git a/comet4j-js/docs/resources/images/default/layout/tab-close.gif b/comet4j-js/docs/resources/images/default/layout/tab-close.gif new file mode 100644 index 0000000..45db61e Binary files /dev/null and b/comet4j-js/docs/resources/images/default/layout/tab-close.gif differ diff --git a/comet4j-js/docs/resources/images/default/menu/checked.gif b/comet4j-js/docs/resources/images/default/menu/checked.gif new file mode 100644 index 0000000..fad5893 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/menu/checked.gif differ diff --git a/comet4j-js/docs/resources/images/default/menu/group-checked.gif b/comet4j-js/docs/resources/images/default/menu/group-checked.gif new file mode 100644 index 0000000..d30b3e5 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/menu/group-checked.gif differ diff --git a/comet4j-js/docs/resources/images/default/menu/item-over.gif b/comet4j-js/docs/resources/images/default/menu/item-over.gif new file mode 100644 index 0000000..0167839 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/menu/item-over.gif differ diff --git a/comet4j-js/docs/resources/images/default/menu/menu-parent.gif b/comet4j-js/docs/resources/images/default/menu/menu-parent.gif new file mode 100644 index 0000000..1e37562 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/menu/menu-parent.gif differ diff --git a/comet4j-js/docs/resources/images/default/menu/menu.gif b/comet4j-js/docs/resources/images/default/menu/menu.gif new file mode 100644 index 0000000..30a2c4b Binary files /dev/null and b/comet4j-js/docs/resources/images/default/menu/menu.gif differ diff --git a/comet4j-js/docs/resources/images/default/menu/unchecked.gif b/comet4j-js/docs/resources/images/default/menu/unchecked.gif new file mode 100644 index 0000000..43823e5 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/menu/unchecked.gif differ diff --git a/comet4j-js/docs/resources/images/default/panel/corners-sprite.gif b/comet4j-js/docs/resources/images/default/panel/corners-sprite.gif new file mode 100644 index 0000000..aa0d0ed Binary files /dev/null and b/comet4j-js/docs/resources/images/default/panel/corners-sprite.gif differ diff --git a/comet4j-js/docs/resources/images/default/panel/left-right.gif b/comet4j-js/docs/resources/images/default/panel/left-right.gif new file mode 100644 index 0000000..9fae2d5 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/panel/left-right.gif differ diff --git a/comet4j-js/docs/resources/images/default/panel/light-hd.gif b/comet4j-js/docs/resources/images/default/panel/light-hd.gif new file mode 100644 index 0000000..58d6747 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/panel/light-hd.gif differ diff --git a/comet4j-js/docs/resources/images/default/panel/tool-sprite-tpl.gif b/comet4j-js/docs/resources/images/default/panel/tool-sprite-tpl.gif new file mode 100644 index 0000000..e647867 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/panel/tool-sprite-tpl.gif differ diff --git a/comet4j-js/docs/resources/images/default/panel/tool-sprites.gif b/comet4j-js/docs/resources/images/default/panel/tool-sprites.gif new file mode 100644 index 0000000..cca91e8 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/panel/tool-sprites.gif differ diff --git a/comet4j-js/docs/resources/images/default/panel/tools-sprites-trans.gif b/comet4j-js/docs/resources/images/default/panel/tools-sprites-trans.gif new file mode 100644 index 0000000..e58bf20 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/panel/tools-sprites-trans.gif differ diff --git a/comet4j-js/docs/resources/images/default/panel/top-bottom.gif b/comet4j-js/docs/resources/images/default/panel/top-bottom.gif new file mode 100644 index 0000000..be6c50e Binary files /dev/null and b/comet4j-js/docs/resources/images/default/panel/top-bottom.gif differ diff --git a/comet4j-js/docs/resources/images/default/panel/top-bottom.png b/comet4j-js/docs/resources/images/default/panel/top-bottom.png new file mode 100644 index 0000000..578ffb6 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/panel/top-bottom.png differ diff --git a/comet4j-js/docs/resources/images/default/panel/white-corners-sprite.gif b/comet4j-js/docs/resources/images/default/panel/white-corners-sprite.gif new file mode 100644 index 0000000..22d4bba Binary files /dev/null and b/comet4j-js/docs/resources/images/default/panel/white-corners-sprite.gif differ diff --git a/comet4j-js/docs/resources/images/default/panel/white-left-right.gif b/comet4j-js/docs/resources/images/default/panel/white-left-right.gif new file mode 100644 index 0000000..d82c337 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/panel/white-left-right.gif differ diff --git a/comet4j-js/docs/resources/images/default/panel/white-top-bottom.gif b/comet4j-js/docs/resources/images/default/panel/white-top-bottom.gif new file mode 100644 index 0000000..fe7dd1c Binary files /dev/null and b/comet4j-js/docs/resources/images/default/panel/white-top-bottom.gif differ diff --git a/comet4j-js/docs/resources/images/default/progress/progress-bg.gif b/comet4j-js/docs/resources/images/default/progress/progress-bg.gif new file mode 100644 index 0000000..1c1abeb Binary files /dev/null and b/comet4j-js/docs/resources/images/default/progress/progress-bg.gif differ diff --git a/comet4j-js/docs/resources/images/default/qtip/bg.gif b/comet4j-js/docs/resources/images/default/qtip/bg.gif new file mode 100644 index 0000000..43488af Binary files /dev/null and b/comet4j-js/docs/resources/images/default/qtip/bg.gif differ diff --git a/comet4j-js/docs/resources/images/default/qtip/close.gif b/comet4j-js/docs/resources/images/default/qtip/close.gif new file mode 100644 index 0000000..69ab915 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/qtip/close.gif differ diff --git a/comet4j-js/docs/resources/images/default/qtip/tip-sprite.gif b/comet4j-js/docs/resources/images/default/qtip/tip-sprite.gif new file mode 100644 index 0000000..9810aca Binary files /dev/null and b/comet4j-js/docs/resources/images/default/qtip/tip-sprite.gif differ diff --git a/comet4j-js/docs/resources/images/default/s.gif b/comet4j-js/docs/resources/images/default/s.gif new file mode 100644 index 0000000..1d11fa9 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/s.gif differ diff --git a/comet4j-js/docs/resources/images/default/shadow-c.png b/comet4j-js/docs/resources/images/default/shadow-c.png new file mode 100644 index 0000000..d435f80 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/shadow-c.png differ diff --git a/comet4j-js/docs/resources/images/default/shadow-c.psd b/comet4j-js/docs/resources/images/default/shadow-c.psd new file mode 100644 index 0000000..28bbe69 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/shadow-c.psd differ diff --git a/comet4j-js/docs/resources/images/default/shadow-lr.png b/comet4j-js/docs/resources/images/default/shadow-lr.png new file mode 100644 index 0000000..bb88b6f Binary files /dev/null and b/comet4j-js/docs/resources/images/default/shadow-lr.png differ diff --git a/comet4j-js/docs/resources/images/default/shadow.png b/comet4j-js/docs/resources/images/default/shadow.png new file mode 100644 index 0000000..75c0eba Binary files /dev/null and b/comet4j-js/docs/resources/images/default/shadow.png differ diff --git a/comet4j-js/docs/resources/images/default/shared/blue-loading.gif b/comet4j-js/docs/resources/images/default/shared/blue-loading.gif new file mode 100644 index 0000000..3bbf639 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/shared/blue-loading.gif differ diff --git a/comet4j-js/docs/resources/images/default/shared/calendar.gif b/comet4j-js/docs/resources/images/default/shared/calendar.gif new file mode 100644 index 0000000..133cf23 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/shared/calendar.gif differ diff --git a/comet4j-js/docs/resources/images/default/shared/glass-bg.gif b/comet4j-js/docs/resources/images/default/shared/glass-bg.gif new file mode 100644 index 0000000..26fbbae Binary files /dev/null and b/comet4j-js/docs/resources/images/default/shared/glass-bg.gif differ diff --git a/comet4j-js/docs/resources/images/default/shared/hd-sprite.gif b/comet4j-js/docs/resources/images/default/shared/hd-sprite.gif new file mode 100644 index 0000000..42da1ea Binary files /dev/null and b/comet4j-js/docs/resources/images/default/shared/hd-sprite.gif differ diff --git a/comet4j-js/docs/resources/images/default/shared/large-loading.gif b/comet4j-js/docs/resources/images/default/shared/large-loading.gif new file mode 100644 index 0000000..b36b555 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/shared/large-loading.gif differ diff --git a/comet4j-js/docs/resources/images/default/shared/left-btn.gif b/comet4j-js/docs/resources/images/default/shared/left-btn.gif new file mode 100644 index 0000000..a0ddd9e Binary files /dev/null and b/comet4j-js/docs/resources/images/default/shared/left-btn.gif differ diff --git a/comet4j-js/docs/resources/images/default/shared/loading-balls.gif b/comet4j-js/docs/resources/images/default/shared/loading-balls.gif new file mode 100644 index 0000000..9ce214b Binary files /dev/null and b/comet4j-js/docs/resources/images/default/shared/loading-balls.gif differ diff --git a/comet4j-js/docs/resources/images/default/shared/right-btn.gif b/comet4j-js/docs/resources/images/default/shared/right-btn.gif new file mode 100644 index 0000000..dee63e2 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/shared/right-btn.gif differ diff --git a/comet4j-js/docs/resources/images/default/shared/warning.gif b/comet4j-js/docs/resources/images/default/shared/warning.gif new file mode 100644 index 0000000..806d4bc Binary files /dev/null and b/comet4j-js/docs/resources/images/default/shared/warning.gif differ diff --git a/comet4j-js/docs/resources/images/default/sizer/e-handle-dark.gif b/comet4j-js/docs/resources/images/default/sizer/e-handle-dark.gif new file mode 100644 index 0000000..b5486c1 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/sizer/e-handle-dark.gif differ diff --git a/comet4j-js/docs/resources/images/default/sizer/e-handle.gif b/comet4j-js/docs/resources/images/default/sizer/e-handle.gif new file mode 100644 index 0000000..00ba835 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/sizer/e-handle.gif differ diff --git a/comet4j-js/docs/resources/images/default/sizer/ne-handle-dark.gif b/comet4j-js/docs/resources/images/default/sizer/ne-handle-dark.gif new file mode 100644 index 0000000..04e5ecf Binary files /dev/null and b/comet4j-js/docs/resources/images/default/sizer/ne-handle-dark.gif differ diff --git a/comet4j-js/docs/resources/images/default/sizer/ne-handle.gif b/comet4j-js/docs/resources/images/default/sizer/ne-handle.gif new file mode 100644 index 0000000..09405c7 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/sizer/ne-handle.gif differ diff --git a/comet4j-js/docs/resources/images/default/sizer/nw-handle-dark.gif b/comet4j-js/docs/resources/images/default/sizer/nw-handle-dark.gif new file mode 100644 index 0000000..6e49d69 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/sizer/nw-handle-dark.gif differ diff --git a/comet4j-js/docs/resources/images/default/sizer/nw-handle.gif b/comet4j-js/docs/resources/images/default/sizer/nw-handle.gif new file mode 100644 index 0000000..2fcea8a Binary files /dev/null and b/comet4j-js/docs/resources/images/default/sizer/nw-handle.gif differ diff --git a/comet4j-js/docs/resources/images/default/sizer/s-handle-dark.gif b/comet4j-js/docs/resources/images/default/sizer/s-handle-dark.gif new file mode 100644 index 0000000..4eb5f0f Binary files /dev/null and b/comet4j-js/docs/resources/images/default/sizer/s-handle-dark.gif differ diff --git a/comet4j-js/docs/resources/images/default/sizer/s-handle.gif b/comet4j-js/docs/resources/images/default/sizer/s-handle.gif new file mode 100644 index 0000000..bf069c2 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/sizer/s-handle.gif differ diff --git a/comet4j-js/docs/resources/images/default/sizer/se-handle-dark.gif b/comet4j-js/docs/resources/images/default/sizer/se-handle-dark.gif new file mode 100644 index 0000000..c4c1087 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/sizer/se-handle-dark.gif differ diff --git a/comet4j-js/docs/resources/images/default/sizer/se-handle.gif b/comet4j-js/docs/resources/images/default/sizer/se-handle.gif new file mode 100644 index 0000000..972055e Binary files /dev/null and b/comet4j-js/docs/resources/images/default/sizer/se-handle.gif differ diff --git a/comet4j-js/docs/resources/images/default/sizer/square.gif b/comet4j-js/docs/resources/images/default/sizer/square.gif new file mode 100644 index 0000000..14ce6f7 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/sizer/square.gif differ diff --git a/comet4j-js/docs/resources/images/default/sizer/sw-handle-dark.gif b/comet4j-js/docs/resources/images/default/sizer/sw-handle-dark.gif new file mode 100644 index 0000000..77224b0 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/sizer/sw-handle-dark.gif differ diff --git a/comet4j-js/docs/resources/images/default/sizer/sw-handle.gif b/comet4j-js/docs/resources/images/default/sizer/sw-handle.gif new file mode 100644 index 0000000..3ca0ed9 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/sizer/sw-handle.gif differ diff --git a/comet4j-js/docs/resources/images/default/slider/slider-bg.png b/comet4j-js/docs/resources/images/default/slider/slider-bg.png new file mode 100644 index 0000000..9999194 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/slider/slider-bg.png differ diff --git a/comet4j-js/docs/resources/images/default/slider/slider-thumb.png b/comet4j-js/docs/resources/images/default/slider/slider-thumb.png new file mode 100644 index 0000000..cd654a4 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/slider/slider-thumb.png differ diff --git a/comet4j-js/docs/resources/images/default/slider/slider-v-bg.png b/comet4j-js/docs/resources/images/default/slider/slider-v-bg.png new file mode 100644 index 0000000..121450c Binary files /dev/null and b/comet4j-js/docs/resources/images/default/slider/slider-v-bg.png differ diff --git a/comet4j-js/docs/resources/images/default/slider/slider-v-thumb.png b/comet4j-js/docs/resources/images/default/slider/slider-v-thumb.png new file mode 100644 index 0000000..7b3d725 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/slider/slider-v-thumb.png differ diff --git a/comet4j-js/docs/resources/images/default/tabs/scroll-left.gif b/comet4j-js/docs/resources/images/default/tabs/scroll-left.gif new file mode 100644 index 0000000..9f2f6d1 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/tabs/scroll-left.gif differ diff --git a/comet4j-js/docs/resources/images/default/tabs/scroll-right.gif b/comet4j-js/docs/resources/images/default/tabs/scroll-right.gif new file mode 100644 index 0000000..4c5e7e3 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/tabs/scroll-right.gif differ diff --git a/comet4j-js/docs/resources/images/default/tabs/scroller-bg.gif b/comet4j-js/docs/resources/images/default/tabs/scroller-bg.gif new file mode 100644 index 0000000..099b90d Binary files /dev/null and b/comet4j-js/docs/resources/images/default/tabs/scroller-bg.gif differ diff --git a/comet4j-js/docs/resources/images/default/tabs/tab-btm-inactive-left-bg.gif b/comet4j-js/docs/resources/images/default/tabs/tab-btm-inactive-left-bg.gif new file mode 100644 index 0000000..188bf94 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/tabs/tab-btm-inactive-left-bg.gif differ diff --git a/comet4j-js/docs/resources/images/default/tabs/tab-btm-inactive-right-bg.gif b/comet4j-js/docs/resources/images/default/tabs/tab-btm-inactive-right-bg.gif new file mode 100644 index 0000000..e1f5e3c Binary files /dev/null and b/comet4j-js/docs/resources/images/default/tabs/tab-btm-inactive-right-bg.gif differ diff --git a/comet4j-js/docs/resources/images/default/tabs/tab-btm-left-bg.gif b/comet4j-js/docs/resources/images/default/tabs/tab-btm-left-bg.gif new file mode 100644 index 0000000..e695186 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/tabs/tab-btm-left-bg.gif differ diff --git a/comet4j-js/docs/resources/images/default/tabs/tab-btm-right-bg.gif b/comet4j-js/docs/resources/images/default/tabs/tab-btm-right-bg.gif new file mode 100644 index 0000000..dde7968 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/tabs/tab-btm-right-bg.gif differ diff --git a/comet4j-js/docs/resources/images/default/tabs/tab-close.gif b/comet4j-js/docs/resources/images/default/tabs/tab-close.gif new file mode 100644 index 0000000..e699878 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/tabs/tab-close.gif differ diff --git a/comet4j-js/docs/resources/images/default/tabs/tab-strip-bg.gif b/comet4j-js/docs/resources/images/default/tabs/tab-strip-bg.gif new file mode 100644 index 0000000..34f1333 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/tabs/tab-strip-bg.gif differ diff --git a/comet4j-js/docs/resources/images/default/tabs/tab-strip-bg.png b/comet4j-js/docs/resources/images/default/tabs/tab-strip-bg.png new file mode 100644 index 0000000..fa8ab3f Binary files /dev/null and b/comet4j-js/docs/resources/images/default/tabs/tab-strip-bg.png differ diff --git a/comet4j-js/docs/resources/images/default/tabs/tab-strip-btm-bg.gif b/comet4j-js/docs/resources/images/default/tabs/tab-strip-btm-bg.gif new file mode 100644 index 0000000..5eaba1e Binary files /dev/null and b/comet4j-js/docs/resources/images/default/tabs/tab-strip-btm-bg.gif differ diff --git a/comet4j-js/docs/resources/images/default/tabs/tabs-sprite.gif b/comet4j-js/docs/resources/images/default/tabs/tabs-sprite.gif new file mode 100644 index 0000000..e969fb0 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/tabs/tabs-sprite.gif differ diff --git a/comet4j-js/docs/resources/images/default/toolbar/bg.gif b/comet4j-js/docs/resources/images/default/toolbar/bg.gif new file mode 100644 index 0000000..0b085bf Binary files /dev/null and b/comet4j-js/docs/resources/images/default/toolbar/bg.gif differ diff --git a/comet4j-js/docs/resources/images/default/toolbar/btn-arrow-light.gif b/comet4j-js/docs/resources/images/default/toolbar/btn-arrow-light.gif new file mode 100644 index 0000000..b0e24b5 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/toolbar/btn-arrow-light.gif differ diff --git a/comet4j-js/docs/resources/images/default/toolbar/btn-arrow.gif b/comet4j-js/docs/resources/images/default/toolbar/btn-arrow.gif new file mode 100644 index 0000000..8acb460 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/toolbar/btn-arrow.gif differ diff --git a/comet4j-js/docs/resources/images/default/toolbar/btn-over-bg.gif b/comet4j-js/docs/resources/images/default/toolbar/btn-over-bg.gif new file mode 100644 index 0000000..ee2dd98 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/toolbar/btn-over-bg.gif differ diff --git a/comet4j-js/docs/resources/images/default/toolbar/gray-bg.gif b/comet4j-js/docs/resources/images/default/toolbar/gray-bg.gif new file mode 100644 index 0000000..bd49438 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/toolbar/gray-bg.gif differ diff --git a/comet4j-js/docs/resources/images/default/toolbar/tb-bg.gif b/comet4j-js/docs/resources/images/default/toolbar/tb-bg.gif new file mode 100644 index 0000000..4969e4e Binary files /dev/null and b/comet4j-js/docs/resources/images/default/toolbar/tb-bg.gif differ diff --git a/comet4j-js/docs/resources/images/default/toolbar/tb-btn-sprite.gif b/comet4j-js/docs/resources/images/default/toolbar/tb-btn-sprite.gif new file mode 100644 index 0000000..19bbef3 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/toolbar/tb-btn-sprite.gif differ diff --git a/comet4j-js/docs/resources/images/default/tree/arrows.gif b/comet4j-js/docs/resources/images/default/tree/arrows.gif new file mode 100644 index 0000000..f8ff7b8 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/tree/arrows.gif differ diff --git a/comet4j-js/docs/resources/images/default/tree/drop-add.gif b/comet4j-js/docs/resources/images/default/tree/drop-add.gif new file mode 100644 index 0000000..b22cd14 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/tree/drop-add.gif differ diff --git a/comet4j-js/docs/resources/images/default/tree/drop-between.gif b/comet4j-js/docs/resources/images/default/tree/drop-between.gif new file mode 100644 index 0000000..5c6c09d Binary files /dev/null and b/comet4j-js/docs/resources/images/default/tree/drop-between.gif differ diff --git a/comet4j-js/docs/resources/images/default/tree/drop-no.gif b/comet4j-js/docs/resources/images/default/tree/drop-no.gif new file mode 100644 index 0000000..9d9c6a9 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/tree/drop-no.gif differ diff --git a/comet4j-js/docs/resources/images/default/tree/drop-over.gif b/comet4j-js/docs/resources/images/default/tree/drop-over.gif new file mode 100644 index 0000000..30d1ca7 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/tree/drop-over.gif differ diff --git a/comet4j-js/docs/resources/images/default/tree/drop-under.gif b/comet4j-js/docs/resources/images/default/tree/drop-under.gif new file mode 100644 index 0000000..85f66b1 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/tree/drop-under.gif differ diff --git a/comet4j-js/docs/resources/images/default/tree/drop-yes.gif b/comet4j-js/docs/resources/images/default/tree/drop-yes.gif new file mode 100644 index 0000000..8aacb30 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/tree/drop-yes.gif differ diff --git a/comet4j-js/docs/resources/images/default/tree/elbow-end-minus-nl.gif b/comet4j-js/docs/resources/images/default/tree/elbow-end-minus-nl.gif new file mode 100644 index 0000000..928779e Binary files /dev/null and b/comet4j-js/docs/resources/images/default/tree/elbow-end-minus-nl.gif differ diff --git a/comet4j-js/docs/resources/images/default/tree/elbow-end-minus.gif b/comet4j-js/docs/resources/images/default/tree/elbow-end-minus.gif new file mode 100644 index 0000000..9a8d727 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/tree/elbow-end-minus.gif differ diff --git a/comet4j-js/docs/resources/images/default/tree/elbow-end-plus-nl.gif b/comet4j-js/docs/resources/images/default/tree/elbow-end-plus-nl.gif new file mode 100644 index 0000000..9f7f698 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/tree/elbow-end-plus-nl.gif differ diff --git a/comet4j-js/docs/resources/images/default/tree/elbow-end-plus.gif b/comet4j-js/docs/resources/images/default/tree/elbow-end-plus.gif new file mode 100644 index 0000000..5943a01 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/tree/elbow-end-plus.gif differ diff --git a/comet4j-js/docs/resources/images/default/tree/elbow-end.gif b/comet4j-js/docs/resources/images/default/tree/elbow-end.gif new file mode 100644 index 0000000..f24ddee Binary files /dev/null and b/comet4j-js/docs/resources/images/default/tree/elbow-end.gif differ diff --git a/comet4j-js/docs/resources/images/default/tree/elbow-line.gif b/comet4j-js/docs/resources/images/default/tree/elbow-line.gif new file mode 100644 index 0000000..75e6da4 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/tree/elbow-line.gif differ diff --git a/comet4j-js/docs/resources/images/default/tree/elbow-minus-nl.gif b/comet4j-js/docs/resources/images/default/tree/elbow-minus-nl.gif new file mode 100644 index 0000000..928779e Binary files /dev/null and b/comet4j-js/docs/resources/images/default/tree/elbow-minus-nl.gif differ diff --git a/comet4j-js/docs/resources/images/default/tree/elbow-minus.gif b/comet4j-js/docs/resources/images/default/tree/elbow-minus.gif new file mode 100644 index 0000000..97dcc71 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/tree/elbow-minus.gif differ diff --git a/comet4j-js/docs/resources/images/default/tree/elbow-plus-nl.gif b/comet4j-js/docs/resources/images/default/tree/elbow-plus-nl.gif new file mode 100644 index 0000000..9f7f698 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/tree/elbow-plus-nl.gif differ diff --git a/comet4j-js/docs/resources/images/default/tree/elbow-plus.gif b/comet4j-js/docs/resources/images/default/tree/elbow-plus.gif new file mode 100644 index 0000000..698de47 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/tree/elbow-plus.gif differ diff --git a/comet4j-js/docs/resources/images/default/tree/elbow.gif b/comet4j-js/docs/resources/images/default/tree/elbow.gif new file mode 100644 index 0000000..b8f4208 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/tree/elbow.gif differ diff --git a/comet4j-js/docs/resources/images/default/tree/folder-open.gif b/comet4j-js/docs/resources/images/default/tree/folder-open.gif new file mode 100644 index 0000000..56ba737 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/tree/folder-open.gif differ diff --git a/comet4j-js/docs/resources/images/default/tree/folder.gif b/comet4j-js/docs/resources/images/default/tree/folder.gif new file mode 100644 index 0000000..20412f7 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/tree/folder.gif differ diff --git a/comet4j-js/docs/resources/images/default/tree/leaf.gif b/comet4j-js/docs/resources/images/default/tree/leaf.gif new file mode 100644 index 0000000..445769d Binary files /dev/null and b/comet4j-js/docs/resources/images/default/tree/leaf.gif differ diff --git a/comet4j-js/docs/resources/images/default/tree/loading.gif b/comet4j-js/docs/resources/images/default/tree/loading.gif new file mode 100644 index 0000000..e846e1d Binary files /dev/null and b/comet4j-js/docs/resources/images/default/tree/loading.gif differ diff --git a/comet4j-js/docs/resources/images/default/tree/s.gif b/comet4j-js/docs/resources/images/default/tree/s.gif new file mode 100644 index 0000000..1d11fa9 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/tree/s.gif differ diff --git a/comet4j-js/docs/resources/images/default/window/icon-error.gif b/comet4j-js/docs/resources/images/default/window/icon-error.gif new file mode 100644 index 0000000..397b655 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/window/icon-error.gif differ diff --git a/comet4j-js/docs/resources/images/default/window/icon-info.gif b/comet4j-js/docs/resources/images/default/window/icon-info.gif new file mode 100644 index 0000000..58281c3 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/window/icon-info.gif differ diff --git a/comet4j-js/docs/resources/images/default/window/icon-question.gif b/comet4j-js/docs/resources/images/default/window/icon-question.gif new file mode 100644 index 0000000..08abd82 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/window/icon-question.gif differ diff --git a/comet4j-js/docs/resources/images/default/window/icon-warning.gif b/comet4j-js/docs/resources/images/default/window/icon-warning.gif new file mode 100644 index 0000000..27ff98b Binary files /dev/null and b/comet4j-js/docs/resources/images/default/window/icon-warning.gif differ diff --git a/comet4j-js/docs/resources/images/default/window/left-corners.png b/comet4j-js/docs/resources/images/default/window/left-corners.png new file mode 100644 index 0000000..18e215d Binary files /dev/null and b/comet4j-js/docs/resources/images/default/window/left-corners.png differ diff --git a/comet4j-js/docs/resources/images/default/window/left-corners.psd b/comet4j-js/docs/resources/images/default/window/left-corners.psd new file mode 100644 index 0000000..3d7f062 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/window/left-corners.psd differ diff --git a/comet4j-js/docs/resources/images/default/window/left-right.png b/comet4j-js/docs/resources/images/default/window/left-right.png new file mode 100644 index 0000000..97d04f3 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/window/left-right.png differ diff --git a/comet4j-js/docs/resources/images/default/window/left-right.psd b/comet4j-js/docs/resources/images/default/window/left-right.psd new file mode 100644 index 0000000..f490c5e Binary files /dev/null and b/comet4j-js/docs/resources/images/default/window/left-right.psd differ diff --git a/comet4j-js/docs/resources/images/default/window/right-corners.png b/comet4j-js/docs/resources/images/default/window/right-corners.png new file mode 100644 index 0000000..101118b Binary files /dev/null and b/comet4j-js/docs/resources/images/default/window/right-corners.png differ diff --git a/comet4j-js/docs/resources/images/default/window/right-corners.psd b/comet4j-js/docs/resources/images/default/window/right-corners.psd new file mode 100644 index 0000000..86d5095 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/window/right-corners.psd differ diff --git a/comet4j-js/docs/resources/images/default/window/top-bottom.png b/comet4j-js/docs/resources/images/default/window/top-bottom.png new file mode 100644 index 0000000..a739234 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/window/top-bottom.png differ diff --git a/comet4j-js/docs/resources/images/default/window/top-bottom.psd b/comet4j-js/docs/resources/images/default/window/top-bottom.psd new file mode 100644 index 0000000..d2b2302 Binary files /dev/null and b/comet4j-js/docs/resources/images/default/window/top-bottom.psd differ diff --git a/comet4j-js/docs/resources/inherited.gif b/comet4j-js/docs/resources/inherited.gif new file mode 100644 index 0000000..63039d9 Binary files /dev/null and b/comet4j-js/docs/resources/inherited.gif differ diff --git a/comet4j-js/docs/resources/localXHR.js b/comet4j-js/docs/resources/localXHR.js new file mode 100644 index 0000000..563c904 --- /dev/null +++ b/comet4j-js/docs/resources/localXHR.js @@ -0,0 +1,309 @@ + +Ext.apply( Ext.lib.Ajax , +{ forceActiveX:false, + createXhrObject:function(transactionId) + { + var obj={ status:{isError:false} + , tId:transactionId}, http; + try + { + + if(Ext.isIE7 && !!this.forceActiveX){throw("IE7forceActiveX");} + + obj.conn= new XMLHttpRequest(); + + } + catch(e) + { + for (var i = 0; i < this.activeX.length; ++i) { + try + { + obj.conn= new ActiveXObject(this.activeX[i]); + + break; + } + catch(e) { + } + } + } + finally + { + obj.status.isError = typeof(obj.conn) === undefined; + } + return obj; + + }, + + getHttpStatus: function(reqObj){ + + var statObj = { status:0 + ,statusText:'' + ,isError:false + ,isLocal:false + ,isOK:false + ,error:null}; + + try { + if(!reqObj)throw('noobj'); + statObj.status = reqObj.status; + + statObj.isLocal = !reqObj.status && location.protocol == "file:" || + Ext.isSafari && reqObj.status === undefined; + + statObj.isOK = (statObj.isLocal || (statObj.status > 199 && statObj.status < 300)); + statObj.statusText = reqObj.statusText || ''; + } catch(e){ //status may not avail/valid yet (or called too early). + } + + return statObj; + + }, + handleTransactionResponse:function(o, callback, isAbort) + { + + + callback = callback || {}; + var responseObject=null; + + if(!o.status.isError){ + o.status = this.getHttpStatus(o.conn); + /* create and enhance the response with proper status and XMLDOM if necessary */ + responseObject = this.createResponseObject(o, callback.argument); + } + + if(o.status.isError){ /* checked again in case exception was raised - ActiveX was disabled during XML-DOM creation? */ + // And mixin everything the XHR object had to offer as well + responseObject = Ext.applyIf(responseObject||{},this.createExceptionObject(o.tId, callback.argument, (isAbort ? isAbort : false))); + + } + + responseObject.options = o.options; + responseObject.stat = o.status; + + if (o.status.isOK && !o.status.isError) { + if (callback.success) { + if (!callback.scope) { + callback.success(responseObject); + } + else { + callback.success.apply(callback.scope, [responseObject]); + } + } + } else { + + if (callback.failure) { + if (!callback.scope) { + callback.failure(responseObject); + } + else { + callback.failure.apply(callback.scope, [responseObject]); + } + } + + } + + if(o.options.async){ + this.releaseObject(o); + responseObject = null; + }else{ + this.releaseObject(o); + return responseObject; + } + + }, + createResponseObject:function(o, callbackArg) + { + var obj = {}; + var headerObj = {},headerStr=''; + + try{ //to catch bad encoding problems here + obj.responseText = o.conn.responseText; + }catch(e){obj.responseText ='';} + + obj.responseXML = o.conn.responseXML; + + try{ + headerStr = o.conn.getAllResponseHeaders()||''; + } catch(e){} + + if(o.status.isLocal){ + + o.status.isOK = ((o.status.status = (!!obj.responseText.length)?200:404) == 200); + + if(o.status.isOK && (!obj.responseXML || obj.responseXML.childNodes.length == 0)){ + + var xdoc=null; + try{ //ActiveX may be disabled + if(typeof(DOMParser) == 'undefined'){ + xdoc=new ActiveXObject("Microsoft.XMLDOM"); + xdoc.async="false"; + xdoc.loadXML(obj.responseText); + + }else{ + try{ //Opera 9 will fail parsing non-XML content, so trap here. + var domParser = new DOMParser(); + xdoc = domParser.parseFromString(obj.responseText, 'application\/xml'); + }catch(ex){} + finally{domParser = null;} + + } + } catch(ex){ + o.status.isError = true; + o.status.error = ex; + + } + + obj.responseXML = xdoc; + } + + if(obj.responseXML){ + + var parseBad = (obj.responseXML.parseError || 0) != 0 || obj.responseXML.childNodes.length == 0; + if(!parseBad){ + headerStr = 'Content-Type: ' + (obj.responseXML.contentType || 'text\/xml') + '\n' + headerStr ; + } + } + + + } + + var header = headerStr.split('\n'); + for (var i = 0; i < header.length; i++) { + var delimitPos = header[i].indexOf(':'); + if (delimitPos != -1) { + headerObj[header[i].substring(0, delimitPos)] = header[i].substring(delimitPos + 2); + } + } + + obj.tId = o.tId; + obj.status = o.status.status; + obj.statusText = o.status.statusText; + obj.getResponseHeader = headerObj; + obj.getAllResponseHeaders = headerStr; + obj.stat = o.status + + if (typeof callbackArg !== undefined) { + obj.argument = callbackArg; + } + + return obj; + }, + + request : function(method, uri, cb, data, options) { + + options = Ext.apply({async:true, + headers:false, + userId:null, + password:null, + xmlData:null }, options||{}); + + var hs = options.headers; + if(hs){ + for(var h in hs){ + if(hs.hasOwnProperty(h)){ + this.initHeader(h, hs[h], false); + } + } + } + if(options.xmlData){ + this.initHeader('Content-Type', 'text/xml', false); + method = 'POST'; + data = options.xmlData; + } + + return this.makeRequest(method, uri, cb, data, options); + + }, + asyncRequest:function(method, uri, callback, postData) + { + var o = this.getConnectionObject(); + + if (!o || o.status.isError) { + return null; + } + else { + o.options = options; + try{ + o.conn.open(method, uri, true); + } catch(ex){ + o.status.isError = true; + o.status.error = ex; + return Ext.apply(o,this.handleTransactionResponse(o, callback)); + + } + + + if (this.useDefaultXhrHeader) { + if (!this.defaultHeaders['X-Requested-With']) { + this.initHeader('X-Requested-With', this.defaultXhrHeader, true); + } + } + + if(postData && this.useDefaultHeader){ + this.initHeader('Content-Type', this.defaultPostHeader); + } + + if (this.hasDefaultHeaders || this.hasHeaders) { + this.setHeader(o); + } + + this.handleReadyState(o, callback); + + try{ o.conn.send(postData || null); + } catch(ex){ + o.status.isError=true; + o.status.error = ex; + return Ext.apply(o,this.handleTransactionResponse(o, callback)); + } + + + return o; + } + }, + + makeRequest:function(method, uri, callback, postData, options) + { + var o = this.getConnectionObject(); + + if (!o || o.status.isError) { + return null; + } + else { + o.options = options; + try{ + o.conn.open(method, uri, options.async, options.userId, options.password); + } catch(ex){ + o.status.isError = true; + o.status.error = ex; + var r=this.handleTransactionResponse(o, callback); + return Ext.apply(o,r); + } + + if (this.useDefaultXhrHeader) { + if (!this.defaultHeaders['X-Requested-With']) { + this.initHeader('X-Requested-With', this.defaultXhrHeader, true); + } + } + + if(postData && this.useDefaultHeader){ + this.initHeader('Content-Type', this.defaultPostHeader); + } + + if (this.hasDefaultHeaders || this.hasHeaders) { + this.setHeader(o); + } + + if(o.options.async){ //Timers won't work here as it's a blocking call + this.handleReadyState(o, callback); + } + + try{ o.conn.send(postData || null); + } catch(ex){ + //Ext.apply(o,this.handleTransactionResponse(o, callback)); + } + + return options.async?o:Ext.apply(o,this.handleTransactionResponse(o, callback)); + } + }}); + +Ext.lib.Ajax.forceActiveX = (document.location.protocol == 'file:');/* or other true/false mechanism */ \ No newline at end of file diff --git a/comet4j-js/docs/resources/member-collapsed.gif b/comet4j-js/docs/resources/member-collapsed.gif new file mode 100644 index 0000000..16bce1d Binary files /dev/null and b/comet4j-js/docs/resources/member-collapsed.gif differ diff --git a/comet4j-js/docs/resources/member-expanded.gif b/comet4j-js/docs/resources/member-expanded.gif new file mode 100644 index 0000000..d72c132 Binary files /dev/null and b/comet4j-js/docs/resources/member-expanded.gif differ diff --git a/comet4j-js/docs/resources/member-hover.gif b/comet4j-js/docs/resources/member-hover.gif new file mode 100644 index 0000000..9b53390 Binary files /dev/null and b/comet4j-js/docs/resources/member-hover.gif differ diff --git a/comet4j-js/docs/resources/method.gif b/comet4j-js/docs/resources/method.gif new file mode 100644 index 0000000..af74265 Binary files /dev/null and b/comet4j-js/docs/resources/method.gif differ diff --git a/comet4j-js/docs/resources/minus.gif b/comet4j-js/docs/resources/minus.gif new file mode 100644 index 0000000..2c63585 Binary files /dev/null and b/comet4j-js/docs/resources/minus.gif differ diff --git a/comet4j-js/docs/resources/pkg-closed.gif b/comet4j-js/docs/resources/pkg-closed.gif new file mode 100644 index 0000000..71139cb Binary files /dev/null and b/comet4j-js/docs/resources/pkg-closed.gif differ diff --git a/comet4j-js/docs/resources/pkg-open.gif b/comet4j-js/docs/resources/pkg-open.gif new file mode 100644 index 0000000..ffd18a3 Binary files /dev/null and b/comet4j-js/docs/resources/pkg-open.gif differ diff --git a/comet4j-js/docs/resources/pkg.gif b/comet4j-js/docs/resources/pkg.gif new file mode 100644 index 0000000..d3d3448 Binary files /dev/null and b/comet4j-js/docs/resources/pkg.gif differ diff --git a/comet4j-js/docs/resources/plus.gif b/comet4j-js/docs/resources/plus.gif new file mode 100644 index 0000000..c09f82e Binary files /dev/null and b/comet4j-js/docs/resources/plus.gif differ diff --git a/comet4j-js/docs/resources/prettify/prettify.css b/comet4j-js/docs/resources/prettify/prettify.css new file mode 100644 index 0000000..0f1ed75 --- /dev/null +++ b/comet4j-js/docs/resources/prettify/prettify.css @@ -0,0 +1 @@ +.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun{color:#660}.pln{color:#000}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec{color:#606}pre.prettyprint{padding:2px;border:1px solid #888}@media print{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun{color:#440}.pln{color:#000}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}} \ No newline at end of file diff --git a/comet4j-js/docs/resources/prettify/prettify.js b/comet4j-js/docs/resources/prettify/prettify.js new file mode 100644 index 0000000..f8f4f7f --- /dev/null +++ b/comet4j-js/docs/resources/prettify/prettify.js @@ -0,0 +1,25 @@ +function _pr_isIE6(){var F=navigator&&navigator.userAgent&&/\bMSIE 6\./.test(navigator.userAgent);_pr_isIE6=function(){return F};return F}var aa="break continue do else for if return while ",ba="auto case char const default double enum extern float goto int long register short signed sizeof static struct switch typedef union unsigned void volatile ",ca="catch class delete false import new operator private protected public this throw true try ",da="alignof align_union asm axiom bool concept concept_map const_cast constexpr decltype dynamic_cast explicit export friend inline late_check mutable namespace nullptr reinterpret_cast static_assert static_cast template typeid typename typeof using virtual wchar_t where ", +ea="boolean byte extends final finally implements import instanceof null native package strictfp super synchronized throws transient ",fa="as base by checked decimal delegate descending event fixed foreach from group implicit in interface internal into is lock object out override orderby params readonly ref sbyte sealed stackalloc string select uint ulong unchecked unsafe ushort var ",ga="debugger eval export function get null set undefined var with Infinity NaN ",ha="caller delete die do dump elsif eval exit foreach for goto if import last local my next no our print package redo require sub undef unless until use wantarray while BEGIN END ", +ia="and as assert class def del elif except exec finally from global import in is lambda nonlocal not or pass print raise try with yield False True None ",ja="alias and begin case class def defined elsif end ensure false in module next nil not or redo rescue retry self super then true undef unless until when yield BEGIN END ",ka="case done elif esac eval fi function in local set then until ",la="a",ma="z",na="A",oa="Z",pa="!",qa="!=",ra="!==",s="#",sa="%",Ha="%=",v="&",Ia="&&",Ja="&&=",Ka="&=",La= +"(",Ma="*",Na="*=",Oa="+=",Pa=",",Qa="-=",Ra="->",w="/",Sa="/=",Ta=":",Ua="::",y=";",z="<",Va="<<",Wa="<<=",Xa="<=",Ya="=",Za="==",$a="===",A=">",ab=">=",bb=">>",cb=">>=",db=">>>",eb=">>>=",fb="?",C="@",gb="[",hb="^",ib="^=",jb="^^",kb="^^=",lb="{",mb="|",nb="|=",ob="||",pb="||=",qb="~",rb="break",sb="case",tb="continue",ub="delete",vb="do",wb="else",xb="finally",yb="instanceof",zb="return",Ab="throw",Bb="try",Cb="typeof",Db="(?:(?:(?:^|[^0-9.])\\.{1,3})|(?:(?:^|[^\\+])\\+)|(?:(?:^|[^\\-])-)",Eb= +"|\\b",Fb="\\$1",Gb="|^)\\s*$",Hb="&",Ib="<",Jb=">",Kb=""",Lb="&#",Mb="x",Nb="'",G='"',Ob=" ",Pb="XMP",Qb="\n',I="",Tb="\t",Ub="\n",Vb="nocode",Wb=' $1="$2$3$4"',J="pln",O="com",Xb="dec",P="src",Q="tag",R="atv",S="pun",Yb="<>/=",X="atn",Zb=" \t\r\n",Y="str",$b="'\"",ac="'\"`",bc="\"'",cc=" \r\n",Z="lit",dc="123456789",ec=".",fc="kwd",gc="typ",$="",hc='',jc="$1 ",kc="
      ",lc="console",mc= +"cannot override language handler %s",nc="default-code",oc="default-markup",pc="html",qc="htm",rc="xhtml",sc="xml",tc="xsl",uc="c",vc="cc",wc="cpp",xc="cs",yc="cxx",zc="cyc",Ac="java",Bc="bsh",Cc="csh",Dc="sh",Ec="cv",Fc="py",Gc="perl",Hc="pl",Ic="pm",Jc="rb",Kc="js",Lc="pre",Mc="code",Nc="xmp",Oc="prettyprint",Pc="class",Qc="br",Rc="\r\n";(function(){function F(b){b=b.split(/ /g);var a={};for(var c=b.length;--c>=0;){var d=b[c];if(d)a[d]=null}return a}var K=aa,Sc=K+ba,T=Sc+ca,ta=T+da,ua=T+ea,Tc=ua+ +fa,va=T+ga,wa=ha,xa=K+ia,ya=K+ja,za=K+ka,Uc=ta+Tc+va+wa+xa+ya+za;function Vc(b){return b>=la&&b<=ma||b>=na&&b<=oa}function D(b,a,c,d){b.unshift(c,d||0);try{a.splice.apply(a,b)}finally{b.splice(0,2)}}var Wc=(function(){var b=[pa,qa,ra,s,sa,Ha,v,Ia,Ja,Ka,La,Ma,Na,Oa,Pa,Qa,Ra,w,Sa,Ta,Ua,y,z,Va,Wa,Xa,Ya,Za,$a,A,ab,bb,cb,db,eb,fb,C,gb,hb,ib,jb,kb,lb,mb,nb,ob,pb,qb,rb,sb,tb,ub,vb,wb,xb,yb,zb,Ab,Bb,Cb],a=Db;for(var c=0;c:&])/g,Fb)}a+= +Gb;return new RegExp(a)})(),Aa=/&/g,Ba=//g,Xc=/\"/g;function Yc(b){return b.replace(Aa,Hb).replace(Ba,Ib).replace(Ca,Jb).replace(Xc,Kb)}function U(b){return b.replace(Aa,Hb).replace(Ba,Ib).replace(Ca,Jb)}var Zc=/</g,$c=/>/g,ad=/'/g,bd=/"/g,cd=/&/g,dd=/ /g;function ed(b){var a=b.indexOf(v);if(a<0)return b;for(--a;(a=b.indexOf(Lb,a+1))>=0;){var c=b.indexOf(y,a);if(c>=0){var d=b.substring(a+3,c),g=10;if(d&&d.charAt(0)===Mb){d=d.substring(1);g=16}var e=parseInt(d,g); +if(!isNaN(e))b=b.substring(0,a)+String.fromCharCode(e)+b.substring(c+1)}}return b.replace(Zc,z).replace($c,A).replace(ad,Nb).replace(bd,G).replace(cd,v).replace(dd,Ob)}function Da(b){return Pb===b.tagName}function L(b,a){switch(b.nodeType){case 1:var c=b.tagName.toLowerCase();a.push(z,c);for(var d=0;d=0;i-=" ".length)d.push(" ".substring(0,i));g=e+1;break;case Ub:a=0;break;default:++a}}if(!d)return c;d.push(c.substring(g));return d.join(I)}}var hd=/(?:[^<]+| + + + +
      +
      +

      Support

      +
        + +
      +
      +
      +
      +
      +

      Icon Legend

      +
        +
      • Package
      • +
      • Class
      • +
      • Singleton
      • +
      • Component
      • +
      • Method
      • +
      • Property
      • +
      • Config Option
      • +
      • Event
      • +
      +
      +
      + + \ No newline at end of file diff --git a/comet4j-js/generateDoc/comet4j-js-doc.xml b/comet4j-js/generateDoc/comet4j-js-doc.xml new file mode 100644 index 0000000..c2f11c5 --- /dev/null +++ b/comet4j-js/generateDoc/comet4j-js-doc.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/comet4j-js/generateDoc/ext-doc.jar b/comet4j-js/generateDoc/ext-doc.jar new file mode 100644 index 0000000..8c74dbc Binary files /dev/null and b/comet4j-js/generateDoc/ext-doc.jar differ diff --git a/comet4j-js/generateDoc/generateDocs.bat b/comet4j-js/generateDoc/generateDocs.bat new file mode 100644 index 0000000..f3e13a4 --- /dev/null +++ b/comet4j-js/generateDoc/generateDocs.bat @@ -0,0 +1,7 @@ +set extDocJarFile="ext-doc.jar" +set extDocXMLFile="comet4j-js-doc.xml" +set extDocTemplate="template/ext/template.xml" +set outputFolder="../docs" +java -jar %extDocJarFile% -p %extDocXMLFile% -o %outputFolder% -t %extDocTemplate% -verbose + +echo. & pause \ No newline at end of file diff --git a/comet4j-js/generateDoc/lib/commons-cli-1.1.jar b/comet4j-js/generateDoc/lib/commons-cli-1.1.jar new file mode 100644 index 0000000..e633afb Binary files /dev/null and b/comet4j-js/generateDoc/lib/commons-cli-1.1.jar differ diff --git a/comet4j-js/generateDoc/template/ext/index.html b/comet4j-js/generateDoc/template/ext/index.html new file mode 100644 index 0000000..3c99cb1 --- /dev/null +++ b/comet4j-js/generateDoc/template/ext/index.html @@ -0,0 +1,41 @@ + + + Comet4J-JavaScript - API Documentation + + + + + + + + + + +
      +
      +
      Loading...
      +
      + + + + + + + + + + +
      + +
      + + + \ No newline at end of file diff --git a/comet4j-js/generateDoc/template/ext/license.txt b/comet4j-js/generateDoc/template/ext/license.txt new file mode 100644 index 0000000..7577dd5 --- /dev/null +++ b/comet4j-js/generateDoc/template/ext/license.txt @@ -0,0 +1,42 @@ +Ext JS - JavaScript Library +Copyright (c) 2006-2008, Ext JS, LLC +All rights reserved. +licensing@extjs.com + +http://extjs.com/license + +Open Source License +------------------------------------------------------------------------------------------ +Ext is licensed under the terms of the Open Source GPL 3.0 license. + +http://www.gnu.org/licenses/gpl.html + +There are several FLOSS exceptions available for use with this release for +open source applications that are distributed under a license other than the GPL. + +* Open Source License Exception for Applications + + http://extjs.com/products/floss-exception.php + +* Open Source License Exception for Development + + http://extjs.com/products/ux-exception.php + + +Commercial License +------------------------------------------------------------------------------------------ +This is the appropriate option if you are creating proprietary applications and you are +not prepared to distribute and share the source code of your application under the +GPL v3 license. Please visit http://extjs.com/license for more details. + + +OEM / Reseller License +------------------------------------------------------------------------------------------ +For more details, please visit: http://extjs.com/license. + +-- + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. \ No newline at end of file diff --git a/comet4j-js/generateDoc/template/ext/resources/TabCloseMenu.js b/comet4j-js/generateDoc/template/ext/resources/TabCloseMenu.js new file mode 100644 index 0000000..99aa326 --- /dev/null +++ b/comet4j-js/generateDoc/template/ext/resources/TabCloseMenu.js @@ -0,0 +1,42 @@ +// Very simple plugin for adding a close context menu to tabs +Ext.ux.TabCloseMenu = function(){ + var tabs, menu, ctxItem; + this.init = function(tp){ + tabs = tp; + tabs.on('contextmenu', onContextMenu); + } + + function onContextMenu(ts, item, e){ + if(!menu){ // create context menu on first right click + menu = new Ext.menu.Menu([{ + id: tabs.id + '-close', + text: 'Close Tab', + handler : function(){ + tabs.remove(ctxItem); + } + },{ + id: tabs.id + '-close-others', + text: 'Close Other Tabs', + handler : function(){ + tabs.items.each(function(item){ + if(item.closable && item != ctxItem){ + tabs.remove(item); + } + }); + } + }]); + } + ctxItem = item; + var items = menu.items; + items.get(tabs.id + '-close').setDisabled(!item.closable); + var disableOthers = true; + tabs.items.each(function(){ + if(this != item && this.closable){ + disableOthers = false; + return false; + } + }); + items.get(tabs.id + '-close-others').setDisabled(disableOthers); + menu.showAt(e.getPoint()); + } +}; \ No newline at end of file diff --git a/comet4j-js/generateDoc/template/ext/resources/accordian.gif b/comet4j-js/generateDoc/template/ext/resources/accordian.gif new file mode 100644 index 0000000..8846b0f Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/accordian.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/block-bg.gif b/comet4j-js/generateDoc/template/ext/resources/block-bg.gif new file mode 100644 index 0000000..f3cf86d Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/block-bg.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/block-bottom.gif b/comet4j-js/generateDoc/template/ext/resources/block-bottom.gif new file mode 100644 index 0000000..c0570c5 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/block-bottom.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/block-top.gif b/comet4j-js/generateDoc/template/ext/resources/block-top.gif new file mode 100644 index 0000000..cf3fb24 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/block-top.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/class.gif b/comet4j-js/generateDoc/template/ext/resources/class.gif new file mode 100644 index 0000000..72a4026 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/class.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/cmp.gif b/comet4j-js/generateDoc/template/ext/resources/cmp.gif new file mode 100644 index 0000000..4f791e1 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/cmp.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/collapse-all.gif b/comet4j-js/generateDoc/template/ext/resources/collapse-all.gif new file mode 100644 index 0000000..891d1b7 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/collapse-all.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/collapse-bg.gif b/comet4j-js/generateDoc/template/ext/resources/collapse-bg.gif new file mode 100644 index 0000000..e6b8da2 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/collapse-bg.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/collapser.css b/comet4j-js/generateDoc/template/ext/resources/collapser.css new file mode 100644 index 0000000..d1c7b46 --- /dev/null +++ b/comet4j-js/generateDoc/template/ext/resources/collapser.css @@ -0,0 +1,34 @@ +.pkg h3 { + padding-left:34px; + font:normal 11px verdana,helvetica,tahoma,sans-serif; + height:18px; + cursor:pointer; +} +h3.collapser-expanded{ + background: #fff url(pkg-open.gif) no-repeat 0px -1px; +} +h3.collapser-collapsed { + background: #fff url(pkg-closed.gif) no-repeat 0px -1px; +} +.pkg-body{ + margin-left:16px; + font:normal 11px verdana,helvetica,tahoma,sans-serif; +} +#classes a{ + font:normal 11px verdana,helvetica,tahoma,sans-serif; + display:block; + text-decoration:none; + height:18px; + color:black; + background: #fff url(class.gif) no-repeat 16px -1px; + padding-left:34px; + -moz-outline:none; + outline:none; + white-space: nowrap; +} +#classes a:hover{ + text-decoration: underline; +} +#classes a.ex{ + background: #fff url(example.gif) no-repeat 16px -1px; +} \ No newline at end of file diff --git a/comet4j-js/generateDoc/template/ext/resources/config.gif b/comet4j-js/generateDoc/template/ext/resources/config.gif new file mode 100644 index 0000000..6534c65 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/config.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/css/ext-all.css b/comet4j-js/generateDoc/template/ext/resources/css/ext-all.css new file mode 100644 index 0000000..24724bc --- /dev/null +++ b/comet4j-js/generateDoc/template/ext/resources/css/ext-all.css @@ -0,0 +1,925 @@ +/* + * Ext JS Library 2.2 + * Copyright(c) 2006-2008, Ext JS, LLC. + * licensing@extjs.com + * + * http://extjs.com/license + */ + +html,body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquote,th,td{margin:0;padding:0;} +img,body,html{border:0;} +address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;} +ol,ul{list-style:none;} +caption,th{text-align:left;} +h1,h2,h3,h4,h5,h6{font-size:100%;} +q:before,q:after{content:'';} + +.ext-el-mask{z-index:20000;position:absolute;top:0;left:0;-moz-opacity:0.5;opacity:.50;filter:alpha(opacity=50);background-color:#CCC;width:100%;height:100%;zoom:1;} +.ext-el-mask-msg{z-index:20001;position:absolute;top:0;left:0;border:1px solid #6593cf;background:#c3daf9 url(../images/default/box/tb-blue.gif) repeat-x 0 -16px;padding:2px;} +.ext-el-mask-msg div{padding:5px 10px 5px 10px;background:#eee;border:1px solid #a3bad9;color:#222;font:normal 11px tahoma,arial,helvetica,sans-serif;cursor:wait;} +.ext-shim{position:absolute;visibility:hidden;left:0;top:0;overflow:hidden;} +.ext-ie .ext-shim{filter:alpha(opacity=0);} +.ext-ie6 .ext-shim{margin-left:5px;margin-top:3px;} +.x-mask-loading div{padding:5px 10px 5px 25px;background:#fbfbfb url( '../images/default/grid/loading.gif' ) no-repeat 5px 5px;line-height:16px;} +.x-hidden,.x-hide-offsets{position:absolute;left:-10000px;top:-10000px;visibility:hidden;} +.x-hide-display{display:none!important;} +.x-hide-visibility{visibility:hidden!important;} +.x-masked{overflow:hidden!important;} +.x-masked select,.x-masked object,.x-masked embed{visibility:hidden;} +.x-layer{visibility:hidden;} +.x-unselectable,.x-unselectable *{-moz-user-select:none;-khtml-user-select:none;} +.x-repaint{zoom:1;background-color:transparent;-moz-outline:none;} +.x-item-disabled{color:gray;cursor:default;opacity:.6;-moz-opacity:.6;filter:alpha(opacity=60);} +.x-item-disabled *{color:gray!important;cursor:default!important;} +.x-splitbar-proxy{position:absolute;visibility:hidden;z-index:20001;background:#aaa;zoom:1;line-height:1px;font-size:1px;overflow:hidden;} +.x-splitbar-h,.x-splitbar-proxy-h{cursor:e-resize;cursor:col-resize;} +.x-splitbar-v,.x-splitbar-proxy-v{cursor:s-resize;cursor:row-resize;} +.x-color-palette{width:150px;height:92px;cursor:pointer;} +.x-color-palette a{border:1px solid #fff;float:left;padding:2px;text-decoration:none;-moz-outline:0 none;outline:0 none;cursor:pointer;} +.x-color-palette a:hover,.x-color-palette a.x-color-palette-sel{border:1px solid #8BB8F3;background:#deecfd;} +.x-color-palette em{display:block;border:1px solid #ACA899;} +.x-color-palette em span{cursor:pointer;display:block;height:10px;line-height:10px;width:10px;} +.x-ie-shadow{display:none;position:absolute;overflow:hidden;left:0;top:0;background:#777;zoom:1;} +.x-shadow{display:none;position:absolute;overflow:hidden;left:0;top:0;} +.x-shadow *{overflow:hidden;} +.x-shadow *{padding:0;border:0;margin:0;clear:none;zoom:1;} +.x-shadow .xstc,.x-shadow .xsbc{height:6px;float:left;} +.x-shadow .xstl,.x-shadow .xstr,.x-shadow .xsbl,.x-shadow .xsbr{width:6px;height:6px;float:left;} +.x-shadow .xsc{width:100%;} +.x-shadow .xsml,.x-shadow .xsmr{width:6px;float:left;height:100%;} +.x-shadow .xsmc{float:left;height:100%;background:transparent url( ../images/default/shadow-c.png );} +.x-shadow .xst,.x-shadow .xsb{height:6px;overflow:hidden;width:100%;} +.x-shadow .xsml{background:transparent url( ../images/default/shadow-lr.png ) repeat-y 0 0;} +.x-shadow .xsmr{background:transparent url( ../images/default/shadow-lr.png ) repeat-y -6px 0;} +.x-shadow .xstl{background:transparent url( ../images/default/shadow.png ) no-repeat 0 0;} +.x-shadow .xstc{background:transparent url( ../images/default/shadow.png ) repeat-x 0 -30px;} +.x-shadow .xstr{background:transparent url( ../images/default/shadow.png ) repeat-x 0 -18px;} +.x-shadow .xsbl{background:transparent url( ../images/default/shadow.png ) no-repeat 0 -12px;} +.x-shadow .xsbc{background:transparent url( ../images/default/shadow.png ) repeat-x 0 -36px;} +.x-shadow .xsbr{background:transparent url( ../images/default/shadow.png ) repeat-x 0 -6px;} +.loading-indicator{font-size:11px;background-image:url(../images/default/grid/loading.gif);background-repeat:no-repeat;background-position:left;padding-left:20px;line-height:16px;margin:3px;} +.x-text-resize{position:absolute;left:-1000px;top:-1000px;visibility:hidden;zoom:1;} +.x-drag-overlay{width:100%;height:100%;display:none;position:absolute;left:0;top:0;background-image:url(../images/default/s.gif);z-index:20000;} +.x-clear{clear:both;height:0;overflow:hidden;line-height:0;font-size:0;} +.x-spotlight{z-index:8999;position:absolute;top:0;left:0;-moz-opacity:0.5;opacity:.50;filter:alpha(opacity=50);background-color:#CCC;width:0;height:0;zoom:1;} + +.x-tab-panel{overflow:hidden;} +.x-tab-panel-header,.x-tab-panel-footer{background:#deecfd;border:1px solid #8db2e3;overflow:hidden;zoom:1;} +.x-tab-panel-header{border:1px solid #8db2e3;padding-bottom:2px;} +.x-tab-panel-footer{border:1px solid #8db2e3;padding-top:2px;} +.x-tab-strip-wrap{width:100%;overflow:hidden;position:relative;zoom:1;} +ul.x-tab-strip{display:block;width:5000px;zoom:1;} +ul.x-tab-strip-top{padding-top:1px;background:url(../images/default/tabs/tab-strip-bg.gif) #cedff5 repeat-x bottom;border-bottom:1px solid #8db2e3;} +ul.x-tab-strip-bottom{padding-bottom:1px;background:url(../images/default/tabs/tab-strip-btm-bg.gif) #cedff5 repeat-x top;border-top:1px solid #8db2e3;border-bottom:0 none;} +.x-tab-panel-header-plain .x-tab-strip-top{background:transparent!important;padding-top:0!important;} +.x-tab-panel-header-plain{background:transparent!important;border-width:0!important;padding-bottom:0!important;} +.x-tab-panel-header-plain .x-tab-strip-spacer,.x-tab-panel-footer-plain .x-tab-strip-spacer{border:1px solid #8db2e3;height:2px;background:#deecfd;font-size:1px;line-height:1px;} +.x-tab-panel-header-plain .x-tab-strip-spacer{border-top:0 none;} +.x-tab-panel-footer-plain .x-tab-strip-spacer{border-bottom:0 none;} +.x-tab-panel-footer-plain .x-tab-strip-bottom{background:transparent!important;padding-bottom:0!important;} +.x-tab-panel-footer-plain{background:transparent!important;border-width:0!important;padding-top:0!important;} +.ext-border-box .x-tab-panel-header-plain .x-tab-strip-spacer,.ext-border-box .x-tab-panel-footer-plain .x-tab-strip-spacer{height:3px;} +ul.x-tab-strip li{float:left;margin-left:2px;} +ul.x-tab-strip li.x-tab-edge{float:left;margin:0!important;padding:0!important;border:0 none!important;font-size:1px!important;line-height:1px!important;overflow:hidden;zoom:1;background:transparent!important;width:1px;} +.x-tab-strip a,.x-tab-strip span,.x-tab-strip em{display:block;} +.x-tab-strip a{text-decoration:none!important;-moz-outline:none;outline:none;cursor:pointer;} +.x-tab-strip-inner{overflow:hidden;text-overflow:ellipsis;} +.x-tab-strip span.x-tab-strip-text{font:normal 11px tahoma,arial,helvetica;color:#416aa3;white-space:nowrap;cursor:pointer;padding:4px 0;} +.x-tab-strip-top .x-tab-with-icon .x-tab-right{padding-left:6px;} +.x-tab-strip .x-tab-with-icon span.x-tab-strip-text{padding-left:20px;background-position:0 3px;background-repeat:no-repeat;} +.x-tab-strip-over span.x-tab-strip-text{color:#15428b;} +.x-tab-strip-active,.x-tab-strip-active a.x-tab-right{cursor:default;} +.x-tab-strip-active span.x-tab-strip-text{cursor:default;color:#15428b;font-weight:bold;} +.x-tab-strip-disabled .x-tabs-text{cursor:default;color:#aaa;} +.x-tab-panel-body{overflow:hidden;} +.x-tab-panel-bwrap{overflow:hidden;} +.ext-ie .x-tab-strip .x-tab-right{position:relative;} +.x-tab-strip-top .x-tab-strip-active .x-tab-right{margin-bottom:-1px;} +.x-tab-strip-top .x-tab-strip-active .x-tab-right span.x-tab-strip-text{padding-bottom:5px;} +.x-tab-strip-bottom .x-tab-strip-active .x-tab-right{margin-top:-1px;} +.x-tab-strip-bottom .x-tab-strip-active .x-tab-right span.x-tab-strip-text{padding-top:5px;} +.x-tab-strip-top .x-tab-right{background:transparent url(../images/default/tabs/tabs-sprite.gif) no-repeat 0 -51px;padding-left:10px;} +.x-tab-strip-top .x-tab-left{background:transparent url(../images/default/tabs/tabs-sprite.gif) no-repeat right -351px;padding-right:10px;} +.x-tab-strip-top .x-tab-strip-inner{background:transparent url(../images/default/tabs/tabs-sprite.gif) repeat-x 0 -201px;} +.x-tab-strip-top .x-tab-strip-over .x-tab-right{background-position:0 -101px;} +.x-tab-strip-top .x-tab-strip-over .x-tab-left{background-position:right -401px;} +.x-tab-strip-top .x-tab-strip-over .x-tab-strip-inner{background-position:0 -251px;} +.x-tab-strip-top .x-tab-strip-active .x-tab-right{background-position:0 0;} +.x-tab-strip-top .x-tab-strip-active .x-tab-left{background-position:right -301px;} +.x-tab-strip-top .x-tab-strip-active .x-tab-strip-inner{background-position:0 -151px;} +.x-tab-strip-bottom .x-tab-right{background:url(../images/default/tabs/tab-btm-inactive-right-bg.gif) no-repeat bottom right;} +.x-tab-strip-bottom .x-tab-left{background:url(../images/default/tabs/tab-btm-inactive-left-bg.gif) no-repeat bottom left;} +.x-tab-strip-bottom .x-tab-strip-active .x-tab-right{background:url(../images/default/tabs/tab-btm-right-bg.gif) no-repeat bottom left;} +.x-tab-strip-bottom .x-tab-strip-active .x-tab-left{background:url(../images/default/tabs/tab-btm-left-bg.gif) no-repeat bottom right;} +.x-tab-strip-bottom .x-tab-left{padding:0 10px;} +.x-tab-strip-bottom .x-tab-right{padding:0;} +.x-tab-strip .x-tab-strip-close{display:none;} +.x-tab-strip-closable{position:relative;} +.x-tab-strip-closable .x-tab-left{padding-right:19px;} +.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close{background-image:url(../images/default/tabs/tab-close.gif);opacity:.6;-moz-opacity:.6;background-repeat:no-repeat;display:block;width:11px;height:11px;position:absolute;top:3px;right:3px;cursor:pointer;z-index:2;} +.x-tab-strip .x-tab-strip-active a.x-tab-strip-close{opacity:.8;-moz-opacity:.8;} +.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close:hover{background-image:url(../images/default/tabs/tab-close.gif);opacity:1;-moz-opacity:1;} +.x-tab-panel-body{border:1px solid #8db2e3;background:#fff;} +.x-tab-panel-body-top{border-top:0 none;} +.x-tab-panel-body-bottom{border-bottom:0 none;} +.x-tab-scroller-left{background:transparent url(../images/default/tabs/scroll-left.gif) no-repeat -18px 0;border-bottom:1px solid #8db2e3;width:18px;position:absolute;left:0;top:0;z-index:10;cursor:pointer;} +.x-tab-scroller-left-over{background-position:0 0;} +.x-tab-scroller-left-disabled{background-position:-18px 0;opacity:.5;-moz-opacity:.5;filter:alpha(opacity=50);cursor:default;} +.x-tab-scroller-right{background:transparent url(../images/default/tabs/scroll-right.gif) no-repeat 0 0;border-bottom:1px solid #8db2e3;width:18px;position:absolute;right:0;top:0;z-index:10;cursor:pointer;} +.x-tab-scroller-right-over{background-position:-18px 0;} +.x-tab-scroller-right-disabled{background-position:0 0;opacity:.5;-moz-opacity:.5;filter:alpha(opacity=50);cursor:default;} +.x-tab-scrolling .x-tab-strip-wrap{margin-left:18px;margin-right:18px;} +.x-tab-scrolling{position:relative;} +.x-tab-panel-bbar .x-toolbar{border:1px solid #99bbe8;border-top:0 none;overflow:hidden;padding:2px;} +.x-tab-panel-tbar .x-toolbar{border:1px solid #99bbe8;border-top:0 none;overflow:hidden;padding:2px;} + + .x-form-field{margin:0;font:normal 12px tahoma,arial,helvetica,sans-serif;} +.x-form-text,textarea.x-form-field{padding:1px 3px;background:#fff url(../images/default/form/text-bg.gif) repeat-x 0 0;border:1px solid #B5B8C8;} +textarea.x-form-field{padding:2px 3px;} +.x-form-text{height:22px;line-height:18px;vertical-align:middle;} +.ext-ie .x-form-text{margin:-1px 0;height:22px;line-height:18px;} +.ext-ie textarea.x-form-field{margin:-1px 0;} +.ext-strict .x-form-text{height:18px;} +.ext-safari .x-form-text{height:20px;padding:0 3px;} +.ext-safari.ext-mac textarea.x-form-field{margin-bottom:-2px;} +.ext-gecko .x-form-text{padding-top:2px;padding-bottom:0;} +textarea{resize:none;} +.x-form-select-one{height:20px;line-height:18px;vertical-align:middle;background-color:#fff;border:1px solid #B5B8C8;} +.x-form-check-group,.x-form-radio-group{margin-bottom:0;} +.x-form-check-group .x-form-invalid .x-panel-body,.x-form-radio-group .x-form-invalid .x-panel-body{background-color:transparent;} +.x-form-check-wrap,.x-form-radio-wrap{padding:3px 0 0 0;line-height:18px;} +.x-form-check-group .x-form-check-wrap,.x-form-radio-group .x-form-radio-wrap{height:18px;} +.ext-ie .x-form-check-group .x-form-check-wrap,.ext-ie .x-form-radio-group .x-form-radio-wrap{height:21px;} +.ext-ie .x-form-check-wrap input,.ext-ie .x-form-radio-wrap input{width:15px;height:15px;} +.x-form-check,.x-form-radio{height:13px;width:13px;vertical-align:bottom;} +.x-form-radio{margin-bottom:3px;} +.x-form-check,.ext-ie .x-form-radio{margin-bottom:2px;} +.x-form-check-wrap-inner,.x-form-radio-wrap-inner{display:inline;padding:3px 0 0 0;} +.x-form-check{background:url('../images/default/form/checkbox.gif') no-repeat 0 0;} +.x-form-radio{background:url('../images/default/form/radio.gif') no-repeat 0 0;} +.x-form-check-focus .x-form-check,.x-form-check-over .x-form-check,.x-form-check-focus .x-form-radio,.x-form-check-over .x-form-radio{background-position:-13px 0;} +.x-form-check-down .x-form-check,.x-form-check-down .x-form-radio{background-position:-26px 0;} +.x-form-check-checked .x-form-check-focus .x-form-check,.x-form-check-checked .x-form-check-over .x-form-check{background-position:-13px -13px;} +.x-form-check-checked .x-form-check-down .x-form-check{background-position:-26px -13px;} +.x-form-check-checked .x-form-check,.x-form-check-checked .x-form-radio{background-position:0 -13px;} +.x-form-check-group-label{border-bottom:1px solid #99BBE8;color:#15428B;margin-bottom:5px;padding-left:3px!important;float:none!important;} +.x-form-field-wrap{position:relative;zoom:1;white-space:nowrap;} +.x-form-field-wrap .x-form-trigger{width:17px;height:21px;border:0;background:transparent url(../images/default/form/trigger.gif) no-repeat 0 0;cursor:pointer;border-bottom:1px solid #B5B8C8;position:absolute;top:0;} +.ext-safari .x-form-field-wrap .x-form-trigger{height:21px;} +.x-form-field-wrap .x-form-date-trigger{background-image:url(../images/default/form/date-trigger.gif);cursor:pointer;} +.x-form-field-wrap .x-form-clear-trigger{background-image:url(../images/default/form/clear-trigger.gif);cursor:pointer;} +.x-form-field-wrap .x-form-search-trigger{background-image:url(../images/default/form/search-trigger.gif);cursor:pointer;} +.ext-safari .x-form-field-wrap .x-form-trigger{right:0;} +.x-form-field-wrap .x-form-twin-triggers .x-form-trigger{position:static;top:auto;vertical-align:top;} +.x-form-field-wrap .x-form-trigger-over{background-position:-17px 0;} +.x-form-field-wrap .x-form-trigger-click{background-position:-34px 0;} +.x-trigger-wrap-focus .x-form-trigger{background-position:-51px 0;} +.x-trigger-wrap-focus .x-form-trigger-over{background-position:-68px 0;} +.x-trigger-wrap-focus .x-form-trigger-click{background-position:-85px 0;} +.x-trigger-wrap-focus .x-form-trigger{border-bottom:1px solid #7eadd9;} +.x-item-disabled .x-form-trigger-over{background-position:0 0!important;border-bottom:1px solid #B5B8C8;} +.x-item-disabled .x-form-trigger-click{background-position:0 0!important;border-bottom:1px solid #B5B8C8;} +.x-form-focus,textarea.x-form-focus{border:1px solid #7eadd9;} +.x-form-invalid,textarea.x-form-invalid{background:#fff url(../images/default/grid/invalid_line.gif) repeat-x bottom;border:1px solid #dd7870;} +.ext-safari .x-form-invalid{background-color:#fee;border:1px solid #ff7870;} +.x-editor{visibility:hidden;padding:0;margin:0;} +.x-editor .x-form-check-wrap,.x-editor .x-form-radio-wrap{background:#fff;padding:3px;} +.x-editor .x-form-checkbox{height:13px;} +.x-form-grow-sizer{font:normal 12px tahoma,arial,helvetica,sans-serif;left:-10000px;padding:8px 3px;position:absolute;visibility:hidden;top:-10000px;white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word;zoom:1;} +.x-form-grow-sizer p{margin:0!important;border:0 none!important;padding:0!important;} +.x-form-item{font:normal 12px tahoma,arial,helvetica,sans-serif;display:block;margin-bottom:4px;zoom:1;} +.x-form-item label{display:block;float:left;width:100px;padding:3px;padding-left:0;clear:left;z-index:2;position:relative;} +.x-form-element{padding-left:105px;position:relative;} +.x-form-invalid-msg{color:#e00;padding:2px;padding-left:18px;font:normal 11px tahoma,arial,helvetica,sans-serif;background:transparent url(../images/default/shared/warning.gif) no-repeat 0 2px;line-height:16px;width:200px;} +.x-form-label-right label{text-align:right;} +.x-form-label-left label{text-align:left;} +.x-form-label-top .x-form-item label{width:auto;float:none;clear:none;display:inline;margin-bottom:4px;position:static;} +.x-form-label-top .x-form-element{padding-left:0;padding-top:4px;} +.x-form-label-top .x-form-item{padding-bottom:4px;} +.x-form-empty-field{color:gray;} +.x-small-editor .x-form-field{font:normal 11px arial,tahoma,helvetica,sans-serif;} +.x-small-editor .x-form-text{height:20px;line-height:16px;vertical-align:middle;} +.ext-ie .x-small-editor .x-form-text{margin-top:-1px!important;margin-bottom:-1px!important;height:20px!important;line-height:16px!important;} +.ext-strict .x-small-editor .x-form-text{height:16px!important;} +.ext-safari .x-small-editor .x-form-field{font:normal 12px arial,tahoma,helvetica,sans-serif;} +.ext-ie .x-small-editor .x-form-text{height:20px;line-height:16px;} +.ext-border-box .x-small-editor .x-form-text{height:20px;} +.x-small-editor .x-form-select-one{height:20px;line-height:16px;vertical-align:middle;} +.x-small-editor .x-form-num-field{text-align:right;} +.x-small-editor .x-form-field-wrap .x-form-trigger{height:19px;} +.x-form-clear{clear:both;height:0;overflow:hidden;line-height:0;font-size:0;} +.x-form-clear-left{clear:left;height:0;overflow:hidden;line-height:0;font-size:0;} +.x-form-cb-label{width:'auto'!important;float:none!important;clear:none!important;display:inline!important;margin-left:4px;} +.x-form-column{float:left;padding:0;margin:0;width:48%;overflow:hidden;zoom:1;} +.x-form .x-form-btns-ct .x-btn{float:right;clear:none;} +.x-form .x-form-btns-ct .x-form-btns td{border:0;padding:0;} +.x-form .x-form-btns-ct .x-form-btns-right table{float:right;clear:none;} +.x-form .x-form-btns-ct .x-form-btns-left table{float:left;clear:none;} +.x-form .x-form-btns-ct .x-form-btns-center{text-align:center;} +.x-form .x-form-btns-ct .x-form-btns-center table{margin:0 auto;} +.x-form .x-form-btns-ct table td.x-form-btn-td{padding:3px;} +.x-form .x-form-btns-ct .x-btn-focus .x-btn-left{background-position:0 -147px;} +.x-form .x-form-btns-ct .x-btn-focus .x-btn-right{background-position:0 -168px;} +.x-form .x-form-btns-ct .x-btn-focus .x-btn-center{background-position:0 -189px;} +.x-form .x-form-btns-ct .x-btn-click .x-btn-center{background-position:0 -126px;} +.x-form .x-form-btns-ct .x-btn-click .x-btn-right{background-position:0 -84px;} +.x-form .x-form-btns-ct .x-btn-click .x-btn-left{background-position:0 -63px;} +.x-form-invalid-icon{width:16px;height:18px;visibility:hidden;position:absolute;left:0;top:0;display:block;background:transparent url(../images/default/form/exclamation.gif) no-repeat 0 2px;} +.x-fieldset{border:1px solid #B5B8C8;padding:10px;margin-bottom:10px;display:block;} +.x-fieldset legend{font:bold 11px tahoma,arial,helvetica,sans-serif;color:#15428b;} +.ext-ie .x-fieldset legend{margin-bottom:10px;} +.ext-ie .x-fieldset{padding-top:0;padding-bottom:10px;} +.x-fieldset legend .x-tool-toggle{margin-right:3px;margin-left:0;float:left!important;} +.x-fieldset legend input{margin-right:3px;float:left!important;height:13px;width:13px;} +fieldset.x-panel-collapsed{padding-bottom:0!important;border-width:1px 0 0 0!important;} +fieldset.x-panel-collapsed .x-fieldset-bwrap{visibility:hidden;position:absolute;left:-1000px;top:-1000px;} +.ext-ie .x-fieldset-bwrap{zoom:1;} +.ext-ie td .x-form-text{position:relative;top:-1px;} +.x-fieldset-noborder{border:0 none transparent;} +.x-fieldset-noborder legend{margin-left:-3px;} +.ext-ie .x-fieldset-noborder legend{position:relative;margin-bottom:23px;} +.ext-ie .x-fieldset-noborder legend span{position:absolute;left:-5px;} +.ext-gecko .x-window-body .x-form-item{-moz-outline:none;overflow:auto;} +.ext-gecko .x-form-item{-moz-outline:none;} +.x-hide-label label.x-form-item-label{display:none;} +.x-hide-label .x-form-element{padding-left:0!important;} +.x-fieldset{overflow:hidden;} +.x-fieldset-bwrap{overflow:hidden;zoom:1;} +.x-fieldset-body{overflow:hidden;} + +.x-btn{font:normal 11px tahoma,verdana,helvetica;cursor:pointer;white-space:nowrap;} +.x-btn button{border:0 none;background:transparent;font:normal 11px tahoma,verdana,helvetica;padding-left:3px;padding-right:3px;cursor:pointer;margin:0;overflow:visible;width:auto;-moz-outline:0 none;outline:0 none;} +* html .ext-ie .x-btn button{width:1px;} +.ext-gecko .x-btn button{padding-left:0;padding-right:0;} +.ext-ie .x-btn button{padding-top:2px;} +.x-btn-icon .x-btn-center .x-btn-text{background-position:center;background-repeat:no-repeat;height:16px;width:16px;cursor:pointer;white-space:nowrap;padding:0;} +.x-btn-icon .x-btn-center{padding:1px;} +.x-btn em{font-style:normal;font-weight:normal;} +.x-btn-text-icon .x-btn-center .x-btn-text{background-position:0 2px;background-repeat:no-repeat;padding-left:18px;padding-top:3px;padding-bottom:2px;padding-right:0;} +.ext-gecko3 .x-btn-text-icon .x-btn-center .x-btn-text{padding-top:2px;} +.x-btn-left,.x-btn-right{font-size:1px;line-height:1px;} +.x-btn-left{width:3px;height:21px;background:url(../images/default/button/btn-sprite.gif) no-repeat 0 0;} +.x-btn-right{width:3px;height:21px;background:url(../images/default/button/btn-sprite.gif) no-repeat 0 -21px;} +.x-btn-left i,.x-btn-right i{display:block;width:3px;overflow:hidden;font-size:1px;line-height:1px;} +.x-btn-center{background:url(../images/default/button/btn-sprite.gif) repeat-x 0 -42px;vertical-align:middle;text-align:center;padding:0 5px;cursor:pointer;white-space:nowrap;} +.x-btn-over .x-btn-left{background-position:0 -63px;} +.x-btn-over .x-btn-right{background-position:0 -84px;} +.x-btn-over .x-btn-center{background-position:0 -105px;} +.x-btn-click .x-btn-center,.x-btn-menu-active .x-btn-center{background-position:0 -126px;} +.x-btn-disabled *{color:gray!important;cursor:default!important;} +.x-btn-menu-text-wrap .x-btn-center{padding:0 3px;} +.ext-gecko .x-btn-menu-text-wrap .x-btn-center{padding:0 1px;} +.x-btn-menu-arrow-wrap .x-btn-center{padding:0;} +.x-btn-menu-arrow-wrap .x-btn-center button{width:12px!important;height:21px;padding:0!important;display:block;background:transparent url(../images/default/button/btn-arrow.gif) no-repeat left 3px;} +.x-btn-with-menu .x-btn-center{padding-right:2px!important;} +.x-btn-with-menu .x-btn-center em{display:block;background:transparent url(../images/default/toolbar/btn-arrow.gif) no-repeat right 0;padding-right:10px;} +.x-btn-text-icon .x-btn-with-menu .x-btn-center em{display:block;background:transparent url(../images/default/toolbar/btn-arrow.gif) no-repeat right 3px;padding-right:10px;} +.x-btn-pressed .x-btn-left{background:url(../images/default/button/btn-sprite.gif) no-repeat 0 -63px;} +.x-btn-pressed .x-btn-right{background:url(../images/default/button/btn-sprite.gif) no-repeat 0 -84px;} +.x-btn-pressed .x-btn-center{background:url(../images/default/button/btn-sprite.gif) repeat-x 0 -126px;} + +.x-toolbar{border-color:#a9bfd3;border-style:solid;border-width:0 0 1px 0;display:block;padding:2px;background:#d0def0 url(../images/default/toolbar/bg.gif) repeat-x top left;position:relative;zoom:1;} +.x-toolbar .x-item-disabled .x-btn-icon{opacity:.35;-moz-opacity:.35;filter:alpha(opacity=35);} +.x-toolbar td{vertical-align:middle;} +.mso .x-toolbar,.x-grid-mso .x-toolbar{border:0 none;background:url(../images/default/grid/mso-hd.gif);} +.x-toolbar td,.x-toolbar span,.x-toolbar input,.x-toolbar div,.x-toolbar select,.x-toolbar label{white-space:nowrap;font:normal 11px tahoma,arial,helvetica,sans-serif;} +.x-toolbar .x-item-disabled{color:gray;cursor:default;opacity:.6;-moz-opacity:.6;filter:alpha(opacity=60);} +.x-toolbar .x-item-disabled *{color:gray;cursor:default;} +.x-toolbar .x-btn-left{background:none;} +.x-toolbar .x-btn-right{background:none;} +.x-toolbar .x-btn-center{background:none;padding:0;} +.x-toolbar .x-btn-menu-text-wrap .x-btn-center button{padding-right:2px;} +.ext-gecko .x-toolbar .x-btn-menu-text-wrap .x-btn-center button{padding-right:0;} +.x-toolbar .x-btn-menu-arrow-wrap .x-btn-center button{padding:0 2px;} +.x-toolbar .x-btn-menu-arrow-wrap .x-btn-center button{width:12px;background:transparent url(../images/default/toolbar/btn-arrow.gif) no-repeat 0 3px;} +.x-toolbar .x-btn-text-icon .x-btn-menu-arrow-wrap .x-btn-center button{width:12px;background:transparent url(../images/default/toolbar/btn-arrow.gif) no-repeat 0 3px;} +.x-toolbar .x-btn-over .x-btn-menu-arrow-wrap .x-btn-center button{background-position:0 -47px;} +.x-toolbar .x-btn-over .x-btn-left{background:url(../images/default/toolbar/tb-btn-sprite.gif) no-repeat 0 0;} +.x-toolbar .x-btn-over .x-btn-right{background:url(../images/default/toolbar/tb-btn-sprite.gif) no-repeat 0 -21px;} +.x-toolbar .x-btn-over .x-btn-center{background:url(../images/default/toolbar/tb-btn-sprite.gif) repeat-x 0 -42px;} +.x-toolbar .x-btn-click .x-btn-left,.x-toolbar .x-btn-pressed .x-btn-left,.x-toolbar .x-btn-menu-active .x-btn-left{background:url(../images/default/toolbar/tb-btn-sprite.gif) no-repeat 0 -63px;} +.x-toolbar .x-btn-click .x-btn-right,.x-toolbar .x-btn-pressed .x-btn-right,.x-toolbar .x-btn-menu-active .x-btn-right{background:url(../images/default/toolbar/tb-btn-sprite.gif) no-repeat 0 -84px;} +.x-toolbar .x-btn-click .x-btn-center,.x-toolbar .x-btn-pressed .x-btn-center,.x-toolbar .x-btn-menu-active .x-btn-center{background:url(../images/default/toolbar/tb-btn-sprite.gif) repeat-x 0 -105px;} +.x-toolbar .x-btn-with-menu .x-btn-center em{padding-right:8px;} +.x-toolbar .ytb-text{padding:2px;} +.x-toolbar .ytb-sep{background-image:url(../images/default/grid/grid-blue-split.gif);background-position:center;background-repeat:no-repeat;display:block;font-size:1px;height:16px;width:4px;overflow:hidden;cursor:default;margin:0 2px 0;border:0;} +.x-toolbar .ytb-spacer{width:2px;} +.x-tbar-page-number{width:24px;height:14px;} +.x-tbar-page-first{background-image:url(../images/default/grid/page-first.gif)!important;} +.x-tbar-loading{background-image:url(../images/default/grid/refresh.gif)!important;} +.x-tbar-page-last{background-image:url(../images/default/grid/page-last.gif)!important;} +.x-tbar-page-next{background-image:url(../images/default/grid/page-next.gif)!important;} +.x-tbar-page-prev{background-image:url(../images/default/grid/page-prev.gif)!important;} +.x-item-disabled .x-tbar-loading{background-image:url(../images/default/grid/loading.gif)!important;} +.x-item-disabled .x-tbar-page-first{background-image:url(../images/default/grid/page-first-disabled.gif)!important;} +.x-item-disabled .x-tbar-page-last{background-image:url(../images/default/grid/page-last-disabled.gif)!important;} +.x-item-disabled .x-tbar-page-next{background-image:url(../images/default/grid/page-next-disabled.gif)!important;} +.x-item-disabled .x-tbar-page-prev{background-image:url(../images/default/grid/page-prev-disabled.gif)!important;} +.x-paging-info{position:absolute;top:5px;right:8px;color:#444;} +.x-statusbar .x-status-text{height:21px;line-height:21px;padding:0 4px;cursor:default;} +.x-statusbar .x-status-busy{padding-left:25px;background:transparent url(../images/default/grid/loading.gif) no-repeat 3px 3px;} +.x-statusbar .x-status-text-panel{border-top:1px solid #99BBE8;border-right:1px solid #fff;border-bottom:1px solid #fff;border-left:1px solid #99BBE8;padding:2px 8px 2px 5px;} + +.x-resizable-handle{position:absolute;z-index:100;font-size:1px;line-height:6px;overflow:hidden;background:white;filter:alpha(opacity=0);opacity:0;zoom:1;} +.x-resizable-handle-east{width:6px;cursor:e-resize;right:0;top:0;height:100%;} +.ext-ie .x-resizable-handle-east{margin-right:-1px;} +.x-resizable-handle-south{width:100%;cursor:s-resize;left:0;bottom:0;height:6px;} +.ext-ie .x-resizable-handle-south{margin-bottom:-1px;} +.x-resizable-handle-west{width:6px;cursor:w-resize;left:0;top:0;height:100%;} +.x-resizable-handle-north{width:100%;cursor:n-resize;left:0;top:0;height:6px;} +.x-resizable-handle-southeast{width:6px;cursor:se-resize;right:0;bottom:0;height:6px;z-index:101;} +.x-resizable-handle-northwest{width:6px;cursor:nw-resize;left:0;top:0;height:6px;z-index:101;} +.x-resizable-handle-northeast{width:6px;cursor:ne-resize;right:0;top:0;height:6px;z-index:101;} +.x-resizable-handle-southwest{width:6px;cursor:sw-resize;left:0;bottom:0;height:6px;z-index:101;} +.x-resizable-over .x-resizable-handle,.x-resizable-pinned .x-resizable-handle{filter:alpha(opacity=100);opacity:1;} +.x-resizable-over .x-resizable-handle-east,.x-resizable-pinned .x-resizable-handle-east{background:url(../images/default/sizer/e-handle.gif);background-position:left;} +.x-resizable-over .x-resizable-handle-west,.x-resizable-pinned .x-resizable-handle-west{background:url(../images/default/sizer/e-handle.gif);background-position:left;} +.x-resizable-over .x-resizable-handle-south,.x-resizable-pinned .x-resizable-handle-south{background:url(../images/default/sizer/s-handle.gif);background-position:top;} +.x-resizable-over .x-resizable-handle-north,.x-resizable-pinned .x-resizable-handle-north{background:url(../images/default/sizer/s-handle.gif);background-position:top;} +.x-resizable-over .x-resizable-handle-southeast,.x-resizable-pinned .x-resizable-handle-southeast{background:url(../images/default/sizer/se-handle.gif);background-position:top left;} +.x-resizable-over .x-resizable-handle-northwest,.x-resizable-pinned .x-resizable-handle-northwest{background:url(../images/default/sizer/nw-handle.gif);background-position:bottom right;} +.x-resizable-over .x-resizable-handle-northeast,.x-resizable-pinned .x-resizable-handle-northeast{background:url(../images/default/sizer/ne-handle.gif);background-position:bottom left;} +.x-resizable-over .x-resizable-handle-southwest,.x-resizable-pinned .x-resizable-handle-southwest{background:url(../images/default/sizer/sw-handle.gif);background-position:top right;} +.x-resizable-proxy{border:1px dashed #3b5a82;position:absolute;overflow:hidden;display:none;left:0;top:0;z-index:50000;} +.x-resizable-overlay{width:100%;height:100%;display:none;position:absolute;left:0;top:0;background:white;z-index:200000;-moz-opacity:0;opacity:0;filter:alpha(opacity=0);} + + .x-grid3{position:relative;overflow:hidden;background-color:#fff;} +.x-grid-panel .x-panel-body{overflow:hidden!important;} +.x-grid-panel .x-panel-mc .x-panel-body{border:1px solid #99bbe8;} +.x-grid3 table{table-layout:fixed;} +.x-grid3-viewport{overflow:hidden;} +.x-grid3-hd-row td,.x-grid3-row td,.x-grid3-summary-row td{font:normal 11px arial,tahoma,helvetica,sans-serif;-moz-outline:none;-moz-user-focus:normal;} +.x-grid3-row td,.x-grid3-summary-row td{line-height:13px;vertical-align:top;padding-left:1px;padding-right:1px;-moz-user-select:none;} +.x-grid3-hd-row td{line-height:15px;vertical-align:middle;border-left:1px solid #eee;border-right:1px solid #d0d0d0;} +.x-grid3-hd-row .x-grid3-marker-hd{padding:3px;} +.x-grid3-row .x-grid3-marker{padding:3px;} +.x-grid3-cell-inner,.x-grid3-hd-inner{overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis;padding:3px 3px 3px 5px;white-space:nowrap;} +.x-grid3-hd-inner{position:relative;cursor:inherit;padding:4px 3px 4px 5px;} +.x-grid3-row-body{white-space:normal;} +.x-grid3-body-cell{-moz-outline:0 none;outline:0 none;} +.ext-ie .x-grid3-cell-inner,.ext-ie .x-grid3-hd-inner{width:100%;} +.ext-strict .x-grid3-cell-inner,.ext-strict .x-grid3-hd-inner{width:auto;} +.x-grid-row-loading{background:#fff url(../images/default/shared/loading-balls.gif) no-repeat center center;} +.x-grid-page{overflow:hidden;} +.x-grid3-row{cursor:default;border:1px solid #ededed;border-top-color:#fff;width:100%;} +.x-grid3-row-alt{background-color:#fafafa;} +.x-grid3-row-over{border:1px solid #ddd;background:#efefef url(../images/default/grid/row-over.gif) repeat-x left top;} +.x-grid3-resize-proxy{width:1px;left:0;background-color:#777;cursor:e-resize;cursor:col-resize;position:absolute;top:0;height:100px;overflow:hidden;visibility:hidden;border:0 none;z-index:7;} +.x-grid3-resize-marker{width:1px;left:0;background-color:#777;position:absolute;top:0;height:100px;overflow:hidden;visibility:hidden;border:0 none;z-index:7;} +.x-grid3-focus{position:absolute;left:0;top:0;width:1px;height:1px;line-height:1px;font-size:1px;-moz-outline:0 none;outline:0 none;-moz-user-select:text;-khtml-user-select:text;} +.x-grid3-header{background:#f9f9f9 url(../images/default/grid/grid3-hrow.gif) repeat-x 0 bottom;cursor:default;zoom:1;padding:1px 0 0 0;} +.x-grid3-header-pop{border-left:1px solid #d0d0d0;float:right;clear:none;} +.x-grid3-header-pop-inner{border-left:1px solid #eee;width:14px;height:19px;background:transparent url(../images/default/grid/hd-pop.gif) no-repeat center center;} +.ext-ie .x-grid3-header-pop-inner{width:15px;} +.ext-strict .x-grid3-header-pop-inner{width:14px;} +.x-grid3-header-inner{overflow:hidden;zoom:1;float:left;} +.x-grid3-header-offset{padding-left:1px;width:10000px;} +td.x-grid3-hd-over,td.sort-desc,td.sort-asc,td.x-grid3-hd-menu-open{border-left:1px solid #aaccf6;border-right:1px solid #aaccf6;} +td.x-grid3-hd-over .x-grid3-hd-inner,td.sort-desc .x-grid3-hd-inner,td.sort-asc .x-grid3-hd-inner,td.x-grid3-hd-menu-open .x-grid3-hd-inner{background:#ebf3fd url(../images/default/grid/grid3-hrow-over.gif) repeat-x left bottom;} +.x-grid3-sort-icon{background-repeat:no-repeat;display:none;height:4px;width:13px;margin-left:3px;vertical-align:middle;} +.sort-asc .x-grid3-sort-icon{background-image:url(../images/default/grid/sort_asc.gif);display:inline;} +.sort-desc .x-grid3-sort-icon{background-image:url(../images/default/grid/sort_desc.gif);display:inline;} +.ext-strict .ext-ie .x-grid3-header-inner{position:relative;} +.ext-strict .ext-ie6 .x-grid3-hd{position:relative;} +.ext-strict .ext-ie6 .x-grid3-hd-inner{position:static;} +.x-grid3-body{zoom:1;} +.x-grid3-scroller{overflow:auto;zoom:1;position:relative;} +.x-grid3-cell-text,.x-grid3-hd-text{display:block;padding:3px 5px 3px 5px;-moz-user-select:none;-khtml-user-select:none;color:black;} +.x-grid3-split{background-image:url(../images/default/grid/grid-split.gif);background-position:center;background-repeat:no-repeat;cursor:e-resize;cursor:col-resize;display:block;font-size:1px;height:16px;overflow:hidden;position:absolute;top:2px;width:6px;z-index:3;} +.x-grid3-hd-text{color:#15428b;} +.x-dd-drag-proxy .x-grid3-hd-inner{background:#ebf3fd url(../images/default/grid/grid3-hrow-over.gif) repeat-x left bottom;width:120px;padding:3px;border:1px solid #aaccf6;overflow:hidden;} +.col-move-top,.col-move-bottom{width:9px;height:9px;position:absolute;top:0;line-height:1px;font-size:1px;overflow:hidden;visibility:hidden;z-index:20000;} +.col-move-top{background:transparent url(../images/default/grid/col-move-top.gif) no-repeat left top;} +.col-move-bottom{background:transparent url(../images/default/grid/col-move-bottom.gif) no-repeat left top;} +.x-grid3-row-selected{background:#DFE8F6!important;border:1px dotted #a3bae9;} +.x-grid3-cell-selected{background-color:#B8CFEE!important;color:black;} +.x-grid3-cell-selected span{color:black!important;} +.x-grid3-cell-selected .x-grid3-cell-text{color:black;} +.x-grid3-locked td.x-grid3-row-marker,.x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker{background:#ebeadb url(../images/default/grid/grid-hrow.gif) repeat-x 0 bottom!important;vertical-align:middle!important;color:black;padding:0;border-top:1px solid white;border-bottom:none!important;border-right:1px solid #6fa0df!important;text-align:center;} +.x-grid3-locked td.x-grid3-row-marker div,.x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker div{padding:0 4px;color:#15428b!important;text-align:center;} +.x-grid3-dirty-cell{background:transparent url(../images/default/grid/dirty.gif) no-repeat 0 0;} +.x-grid3-topbar,.x-grid3-bottombar{font:normal 11px arial,tahoma,helvetica,sans-serif;overflow:hidden;display:none;zoom:1;position:relative;} +.x-grid3-topbar .x-toolbar{border-right:0 none;} +.x-grid3-bottombar .x-toolbar{border-right:0 none;border-bottom:0 none;border-top:1px solid #a9bfd3;} +.x-props-grid .x-grid3-cell{padding:1px;} +.x-props-grid .x-grid3-td-name .x-grid3-cell-inner{background:transparent url(../images/default/grid/grid3-special-col-bg.gif) repeat-y -16px!important;padding-left:12px;color:black!important;} +.x-props-grid .x-grid3-body .x-grid3-td-name{padding:1px;padding-right:0;background:white!important;border:0 none;border-right:1px solid #eee;} +.xg-hmenu-sort-asc .x-menu-item-icon{background-image:url(../images/default/grid/hmenu-asc.gif);} +.xg-hmenu-sort-desc .x-menu-item-icon{background-image:url(../images/default/grid/hmenu-desc.gif);} +.xg-hmenu-lock .x-menu-item-icon{background-image:url(../images/default/grid/hmenu-lock.gif);} +.xg-hmenu-unlock .x-menu-item-icon{background-image:url(../images/default/grid/hmenu-unlock.gif);} +.x-grid3-col-dd{border:0 none;padding:0;background:transparent;} +.x-dd-drag-ghost .x-grid3-dd-wrap{padding:1px 3px 3px 1px;} +.x-grid3-hd{-moz-user-select:none;} +.x-grid3-hd-btn{display:none;position:absolute;width:14px;background:#c3daf9 url(../images/default/grid/grid3-hd-btn.gif) no-repeat left center;right:0;top:0;z-index:2;cursor:pointer;} +.x-grid3-hd-over .x-grid3-hd-btn,.x-grid3-hd-menu-open .x-grid3-hd-btn{display:block;} +a.x-grid3-hd-btn:hover{background-position:-14px center;} +.x-grid3-body .x-grid3-td-expander{background:transparent url(../images/default/grid/grid3-special-col-bg.gif) repeat-y right;} +.x-grid3-body .x-grid3-td-expander .x-grid3-cell-inner{padding:0!important;height:100%;} +.x-grid3-row-expander{width:100%;height:18px;background-position:4px 2px;background-repeat:no-repeat;background-color:transparent;background-image:url(../images/default/grid/row-expand-sprite.gif);} +.x-grid3-row-collapsed .x-grid3-row-expander{background-position:4px 2px;} +.x-grid3-row-expanded .x-grid3-row-expander{background-position:-21px 2px;} +.x-grid3-row-collapsed .x-grid3-row-body{display:none!important;} +.x-grid3-row-expanded .x-grid3-row-body{display:block!important;} +.x-grid3-body .x-grid3-td-checker{background:transparent url(../images/default/grid/grid3-special-col-bg.gif) repeat-y right;} +.x-grid3-body .x-grid3-td-checker .x-grid3-cell-inner,.x-grid3-header .x-grid3-td-checker .x-grid3-hd-inner{padding:0!important;height:100%;} +.x-grid3-row-checker,.x-grid3-hd-checker{width:100%;height:18px;background-position:2px 2px;background-repeat:no-repeat;background-color:transparent;background-image:url(../images/default/grid/row-check-sprite.gif);} +.x-grid3-row .x-grid3-row-checker{background-position:2px 2px;} +.x-grid3-row-selected .x-grid3-row-checker,.x-grid3-hd-checker-on .x-grid3-hd-checker{background-position:-23px 2px;} +.x-grid3-hd-checker{background-position:2px 3px;} +.x-grid3-hd-checker-on .x-grid3-hd-checker{background-position:-23px 3px;} +.x-grid3-body .x-grid3-td-numberer{background:transparent url(../images/default/grid/grid3-special-col-bg.gif) repeat-y right;} +.x-grid3-body .x-grid3-td-numberer .x-grid3-cell-inner{padding:3px 5px 0 0!important;text-align:right;color:#444;} +.x-grid3-body .x-grid3-row-selected .x-grid3-td-numberer,.x-grid3-body .x-grid3-row-selected .x-grid3-td-checker,.x-grid3-body .x-grid3-row-selected .x-grid3-td-expander{background:transparent url(../images/default/grid/grid3-special-col-sel-bg.gif) repeat-y right;} +.x-grid3-body .x-grid3-check-col-td .x-grid3-cell-inner{padding:1px 0 0 0!important;} +.x-grid3-check-col{width:100%;height:16px;background-position:center center;background-repeat:no-repeat;background-color:transparent;background-image:url(../images/default/menu/unchecked.gif);} +.x-grid3-check-col-on{width:100%;height:16px;background-position:center center;background-repeat:no-repeat;background-color:transparent;background-image:url(../images/default/menu/checked.gif);} +.x-grid-group,.x-grid-group-body,.x-grid-group-hd{zoom:1;} +.x-grid-group-hd{border-bottom:2px solid #99bbe8;cursor:pointer;padding-top:6px;} +.x-grid-group-hd div{background:transparent url(../images/default/grid/group-expand-sprite.gif) no-repeat 3px -47px;padding:4px 4px 4px 17px;color:#3764a0;font:bold 11px tahoma,arial,helvetica,sans-serif;} +.x-grid-group-collapsed .x-grid-group-hd div{background-position:3px 3px;} +.x-grid-group-collapsed .x-grid-group-body{display:none;} +.x-group-by-icon{background-image:url(../images/default/grid/group-by.gif);} +.x-cols-icon{background-image:url(../images/default/grid/columns.gif);} +.x-show-groups-icon{background-image:url(../images/default/grid/group-by.gif);} +.ext-ie .x-grid3 .x-editor .x-form-text{position:relative;top:-1px;} +.ext-ie .x-props-grid .x-editor .x-form-text{position:static;top:0;} +.x-grid-empty{padding:10px;color:gray;font:normal 11px tahoma,arial,helvetica,sans-serif;} +.ext-ie7 .x-grid-panel .x-panel-bbar{position:relative;} + +.x-dd-drag-proxy{position:absolute;left:0;top:0;visibility:hidden;z-index:15000;} +.x-dd-drag-ghost{color:black;font:normal 11px arial,helvetica,sans-serif;-moz-opacity:0.85;opacity:.85;filter:alpha(opacity=85);border-top:1px solid #ddd;border-left:1px solid #ddd;border-right:1px solid #bbb;border-bottom:1px solid #bbb;padding:3px;padding-left:20px;background-color:white;white-space:nowrap;} +.x-dd-drag-repair .x-dd-drag-ghost{-moz-opacity:0.4;opacity:.4;filter:alpha(opacity=40);border:0 none;padding:0;background-color:transparent;} +.x-dd-drag-repair .x-dd-drop-icon{visibility:hidden;} +.x-dd-drop-icon{position:absolute;top:3px;left:3px;display:block;width:16px;height:16px;background-color:transparent;background-position:center;background-repeat:no-repeat;z-index:1;} +.x-dd-drop-nodrop .x-dd-drop-icon{background-image:url(../images/default/dd/drop-no.gif);} +.x-dd-drop-ok .x-dd-drop-icon{background-image:url(../images/default/dd/drop-yes.gif);} +.x-dd-drop-ok-add .x-dd-drop-icon{background-image:url(../images/default/dd/drop-add.gif);} +.x-view-selector{position:absolute;left:0;top:0;width:0;background:#c3daf9;border:1px dotted #39b;opacity:.5;-moz-opacity:.5;filter:alpha(opacity=50);zoom:1;} + +.x-tree .x-panel-body{background-color:#fff;} +.ext-strict .ext-ie .x-tree .x-panel-bwrap{position:relative;overflow:hidden;} +.x-tree-icon,.x-tree-ec-icon,.x-tree-elbow-line,.x-tree-elbow,.x-tree-elbow-end,.x-tree-elbow-plus,.x-tree-elbow-minus,.x-tree-elbow-end-plus,.x-tree-elbow-end-minus{border:0 none;height:18px;margin:0;padding:0;vertical-align:top;width:16px;background-repeat:no-repeat;} +.x-tree-node-collapsed .x-tree-node-icon,.x-tree-node-expanded .x-tree-node-icon,.x-tree-node-leaf .x-tree-node-icon{border:0 none;height:18px;margin:0;padding:0;vertical-align:top;width:16px;background-position:center;background-repeat:no-repeat;} +.ext-ie .x-tree-node-indent img,.ext-ie .x-tree-node-icon,.ext-ie .x-tree-ec-icon{vertical-align:middle!important;} +.x-tree-node-expanded .x-tree-node-icon{background-image:url(../images/default/tree/folder-open.gif);} +.x-tree-node-leaf .x-tree-node-icon{background-image:url(../images/default/tree/leaf.gif);} +.x-tree-node-collapsed .x-tree-node-icon{background-image:url(../images/default/tree/folder.gif);} +.ext-ie input.x-tree-node-cb{width:15px;height:15px;} +input.x-tree-node-cb{margin-left:1px;} +.ext-ie input.x-tree-node-cb{margin-left:0;} +.x-tree-noicon .x-tree-node-icon{width:0;height:0;} +.x-tree-node-loading .x-tree-node-icon{background-image:url(../images/default/tree/loading.gif)!important;} +.x-tree-node-loading a span{font-style:italic;color:#444;} +.ext-ie .x-tree-node-el input{width:15px;height:15px;} +.x-tree-lines .x-tree-elbow{background-image:url(../images/default/tree/elbow.gif);} +.x-tree-lines .x-tree-elbow-plus{background-image:url(../images/default/tree/elbow-plus.gif);} +.x-tree-lines .x-tree-elbow-minus{background-image:url(../images/default/tree/elbow-minus.gif);} +.x-tree-lines .x-tree-elbow-end{background-image:url(../images/default/tree/elbow-end.gif);} +.x-tree-lines .x-tree-elbow-end-plus{background-image:url(../images/default/tree/elbow-end-plus.gif);} +.x-tree-lines .x-tree-elbow-end-minus{background-image:url(../images/default/tree/elbow-end-minus.gif);} +.x-tree-lines .x-tree-elbow-line{background-image:url(../images/default/tree/elbow-line.gif);} +.x-tree-no-lines .x-tree-elbow{background:transparent;} +.x-tree-no-lines .x-tree-elbow-plus{background-image:url(../images/default/tree/elbow-plus-nl.gif);} +.x-tree-no-lines .x-tree-elbow-minus{background-image:url(../images/default/tree/elbow-minus-nl.gif);} +.x-tree-no-lines .x-tree-elbow-end{background:transparent;} +.x-tree-no-lines .x-tree-elbow-end-plus{background-image:url(../images/default/tree/elbow-end-plus-nl.gif);} +.x-tree-no-lines .x-tree-elbow-end-minus{background-image:url(../images/default/tree/elbow-end-minus-nl.gif);} +.x-tree-no-lines .x-tree-elbow-line{background:transparent;} +.x-tree-arrows .x-tree-elbow{background:transparent;} +.x-tree-arrows .x-tree-elbow-plus{background:transparent url(../images/default/tree/arrows.gif) no-repeat 0 0;} +.x-tree-arrows .x-tree-elbow-minus{background:transparent url(../images/default/tree/arrows.gif) no-repeat -16px 0;} +.x-tree-arrows .x-tree-elbow-end{background:transparent;} +.x-tree-arrows .x-tree-elbow-end-plus{background:transparent url(../images/default/tree/arrows.gif) no-repeat 0 0;} +.x-tree-arrows .x-tree-elbow-end-minus{background:transparent url(../images/default/tree/arrows.gif) no-repeat -16px 0;} +.x-tree-arrows .x-tree-elbow-line{background:transparent;} +.x-tree-arrows .x-tree-ec-over .x-tree-elbow-plus{background-position:-32px 0;} +.x-tree-arrows .x-tree-ec-over .x-tree-elbow-minus{background-position:-48px 0;} +.x-tree-arrows .x-tree-ec-over .x-tree-elbow-end-plus{background-position:-32px 0;} +.x-tree-arrows .x-tree-ec-over .x-tree-elbow-end-minus{background-position:-48px 0;} +.x-tree-elbow-plus,.x-tree-elbow-minus,.x-tree-elbow-end-plus,.x-tree-elbow-end-minus{cursor:pointer;} +.ext-ie ul.x-tree-node-ct{font-size:0;line-height:0;zoom:1;} +.x-tree-node{color:black;font:normal 11px arial,tahoma,helvetica,sans-serif;white-space:nowrap;} +.x-tree-node-el{line-height:18px;cursor:pointer;} +.x-tree-node a,.x-dd-drag-ghost a{text-decoration:none;color:black;-khtml-user-select:none;-moz-user-select:none;-kthml-user-focus:normal;-moz-user-focus:normal;-moz-outline:0 none;outline:0 none;} +.x-tree-node a span,.x-dd-drag-ghost a span{text-decoration:none;color:black;padding:1px 3px 1px 2px;} +.x-tree-node .x-tree-node-disabled a span{color:gray!important;} +.x-tree-node .x-tree-node-disabled .x-tree-node-icon{-moz-opacity:0.5;opacity:.5;filter:alpha(opacity=50);} +.x-tree-node .x-tree-node-inline-icon{background:transparent;} +.x-tree-node a:hover,.x-dd-drag-ghost a:hover{text-decoration:none;} +.x-tree-node div.x-tree-drag-insert-below{border-bottom:1px dotted #36c;} +.x-tree-node div.x-tree-drag-insert-above{border-top:1px dotted #36c;} +.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-below{border-bottom:0 none;} +.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-above{border-top:0 none;} +.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-below a{border-bottom:2px solid #36c;} +.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-above a{border-top:2px solid #36c;} +.x-tree-node .x-tree-drag-append a span{background:#ddd;border:1px dotted gray;} +.x-tree-node .x-tree-node-over{background-color:#eee;} +.x-tree-node .x-tree-selected{background-color:#d9e8fb;} +.x-dd-drag-ghost .x-tree-node-indent,.x-dd-drag-ghost .x-tree-ec-icon{display:none!important;} +.x-tree-drop-ok-append .x-dd-drop-icon{background-image:url(../images/default/tree/drop-add.gif);} +.x-tree-drop-ok-above .x-dd-drop-icon{background-image:url(../images/default/tree/drop-over.gif);} +.x-tree-drop-ok-below .x-dd-drop-icon{background-image:url(../images/default/tree/drop-under.gif);} +.x-tree-drop-ok-between .x-dd-drop-icon{background-image:url(../images/default/tree/drop-between.gif);} +.x-tree-root-ct{zoom:1;} + +.x-date-picker{border:1px solid #1b376c;border-top:0 none;background:#fff;position:relative;} +.x-date-picker a{-moz-outline:0 none;outline:0 none;} +.x-date-inner,.x-date-inner td,.x-date-inner th{border-collapse:separate;} +.x-date-middle,.x-date-left,.x-date-right{background:url(../images/default/shared/hd-sprite.gif) repeat-x 0 -83px;color:#FFF;font:bold 11px "sans serif",tahoma,verdana,helvetica;overflow:hidden;} +.x-date-middle .x-btn-left,.x-date-middle .x-btn-center,.x-date-middle .x-btn-right{background:transparent!important;vertical-align:middle;} +.x-date-middle .x-btn .x-btn-text{color:#fff;} +.x-date-middle .x-btn-with-menu .x-btn-center em{background:transparent url(../images/default/toolbar/btn-arrow-light.gif) no-repeat right 0;} +.x-date-right,.x-date-left{width:18px;} +.x-date-right{text-align:right;} +.x-date-middle{padding-top:2px;padding-bottom:2px;width:130px;} +.x-date-right a,.x-date-left a{display:block;width:16px;height:16px;background-position:center;background-repeat:no-repeat;cursor:pointer;-moz-opacity:0.6;opacity:.6;filter:alpha(opacity=60);} +.x-date-right a:hover,.x-date-left a:hover{-moz-opacity:1;opacity:1;filter:alpha(opacity=100);} +.x-date-right a{background-image:url(../images/default/shared/right-btn.gif);margin-right:2px;text-decoration:none!important;} +.x-date-left a{background-image:url(../images/default/shared/left-btn.gif);margin-left:2px;text-decoration:none!important;} +table.x-date-inner{width:100%;table-layout:fixed;} +.x-date-inner th{width:25px;} +.x-date-inner th{background:#dfecfb url(../images/default/shared/glass-bg.gif) repeat-x left top;text-align:right!important;border-bottom:1px solid #a3bad9;font:normal 10px arial,helvetica,tahoma,sans-serif;color:#233d6d;cursor:default;padding:0;border-collapse:separate;} +.x-date-inner th span{display:block;padding:2px;padding-right:7px;} +.x-date-inner td{border:1px solid #fff;text-align:right;padding:0;} +.x-date-inner a{padding:2px 5px;display:block;font:normal 11px arial,helvetica,tahoma,sans-serif;text-decoration:none;color:black;text-align:right;zoom:1;} +.x-date-inner .x-date-active{cursor:pointer;color:black;} +.x-date-inner .x-date-selected a{background:#dfecfb url(../images/default/shared/glass-bg.gif) repeat-x left top;border:1px solid #8db2e3;padding:1px 4px;} +.x-date-inner .x-date-today a{border:1px solid darkred;padding:1px 4px;} +.x-date-inner .x-date-selected span{font-weight:bold;} +.x-date-inner .x-date-prevday a,.x-date-inner .x-date-nextday a{color:#aaa;text-decoration:none!important;} +.x-date-bottom{padding:4px;border-top:1px solid #a3bad9;background:#dfecfb url(../images/default/shared/glass-bg.gif) repeat-x left top;} +.x-date-inner a:hover,.x-date-inner .x-date-disabled a:hover{text-decoration:none!important;color:black;background:#ddecfe;} +.x-date-inner .x-date-disabled a{cursor:default;background:#eee;color:#bbb;} +.x-date-mmenu{background:#eee!important;} +.x-date-mmenu .x-menu-item{font-size:10px;padding:1px 24px 1px 4px;white-space:nowrap;color:#000;} +.x-date-mmenu .x-menu-item .x-menu-item-icon{width:10px;height:10px;margin-right:5px;background-position:center -4px!important;} +.x-date-mp{position:absolute;left:0;top:0;background:white;display:none;} +.x-date-mp td{padding:2px;font:normal 11px arial,helvetica,tahoma,sans-serif;} +td.x-date-mp-month,td.x-date-mp-year,td.x-date-mp-ybtn{border:0 none;text-align:center;vertical-align:middle;width:25%;} +.x-date-mp-ok{margin-right:3px;} +.x-date-mp-btns button{text-decoration:none;text-align:center;text-decoration:none!important;background:#083772;color:white;border:1px solid;border-color:#36c #005 #005 #36c;padding:1px 3px 1px;font:normal 11px arial,helvetica,tahoma,sans-serif;cursor:pointer;} +.x-date-mp-btns{background:#dfecfb url(../images/default/shared/glass-bg.gif) repeat-x left top;} +.x-date-mp-btns td{border-top:1px solid #c5d2df;text-align:center;} +td.x-date-mp-month a,td.x-date-mp-year a{display:block;padding:2px 4px;text-decoration:none;text-align:center;color:#15428b;} +td.x-date-mp-month a:hover,td.x-date-mp-year a:hover{color:#15428b;text-decoration:none;cursor:pointer;background:#ddecfe;} +td.x-date-mp-sel a{padding:1px 3px;background:#dfecfb url(../images/default/shared/glass-bg.gif) repeat-x left top;border:1px solid #8db2e3;} +.x-date-mp-ybtn a{overflow:hidden;width:15px;height:15px;cursor:pointer;background:transparent url(../images/default/panel/tool-sprites.gif) no-repeat;display:block;margin:0 auto;} +.x-date-mp-ybtn a.x-date-mp-next{background-position:0 -120px;} +.x-date-mp-ybtn a.x-date-mp-next:hover{background-position:-15px -120px;} +.x-date-mp-ybtn a.x-date-mp-prev{background-position:0 -105px;} +.x-date-mp-ybtn a.x-date-mp-prev:hover{background-position:-15px -105px;} +.x-date-mp-ybtn{text-align:center;} +td.x-date-mp-sep{border-right:1px solid #c5d2df;} + +.x-tip{position:absolute;top:0;left:0;visibility:hidden;z-index:20000;border:0 none;} +.x-tip .x-tip-close{background-image:url(../images/default/qtip/close.gif);height:15px;float:right;width:15px;margin:0 0 2px 2px;cursor:pointer;display:none;} +.x-tip .x-tip-tc{background:transparent url(../images/default/qtip/tip-sprite.gif) no-repeat 0 -62px;padding-top:3px;overflow:hidden;zoom:1;} +.x-tip .x-tip-tl{background:transparent url(../images/default/qtip/tip-sprite.gif) no-repeat 0 0;padding-left:6px;overflow:hidden;zoom:1;} +.x-tip .x-tip-tr{background:transparent url(../images/default/qtip/tip-sprite.gif) no-repeat right 0;padding-right:6px;overflow:hidden;zoom:1;} +.x-tip .x-tip-bc{background:transparent url(../images/default/qtip/tip-sprite.gif) no-repeat 0 -121px;height:3px;overflow:hidden;} +.x-tip .x-tip-bl{background:transparent url(../images/default/qtip/tip-sprite.gif) no-repeat 0 -59px;padding-left:6px;zoom:1;} +.x-tip .x-tip-br{background:transparent url(../images/default/qtip/tip-sprite.gif) no-repeat right -59px;padding-right:6px;zoom:1;} +.x-tip .x-tip-mc{border:0 none;font:normal 11px tahoma,arial,helvetica,sans-serif;} +.x-tip .x-tip-ml{background:#fff url(../images/default/qtip/tip-sprite.gif) no-repeat 0 -124px;padding-left:6px;zoom:1;} +.x-tip .x-tip-mr{background:transparent url(../images/default/qtip/tip-sprite.gif) no-repeat right -124px;padding-right:6px;zoom:1;} +.ext-ie .x-tip .x-tip-header,.ext-ie .x-tip .x-tip-tc{font-size:0;line-height:0;} +.x-tip .x-tip-header-text{font:bold 11px tahoma,arial,helvetica,sans-serif;padding:0;margin:0 0 2px 0;color:#444;} +.x-tip .x-tip-body{font:normal 11px tahoma,arial,helvetica,sans-serif;margin:0!important;line-height:14px;color:#444;padding:0;} +.x-tip .x-tip-body .loading-indicator{margin:0;} +.x-tip-draggable .x-tip-header,.x-tip-draggable .x-tip-header-text{cursor:move;} +.x-form-invalid-tip .x-tip-tc{background:url(../images/default/form/error-tip-corners.gif) repeat-x 0 -12px;padding-top:6px;} +.x-form-invalid-tip .x-tip-tl{background-image:url(../images/default/form/error-tip-corners.gif);} +.x-form-invalid-tip .x-tip-tr{background-image:url(../images/default/form/error-tip-corners.gif);} +.x-form-invalid-tip .x-tip-bc{background:url(../images/default/form/error-tip-corners.gif) repeat-x 0 -18px;height:6px;} +.x-form-invalid-tip .x-tip-bl{background:url(../images/default/form/error-tip-corners.gif) no-repeat 0 -6px;} +.x-form-invalid-tip .x-tip-br{background:url(../images/default/form/error-tip-corners.gif) no-repeat right -6px;} +.x-form-invalid-tip .x-tip-ml{background-image:url(../images/default/form/error-tip-corners.gif);} +.x-form-invalid-tip .x-tip-mr{background-image:url(../images/default/form/error-tip-corners.gif);} +.x-form-invalid-tip .x-tip-body{padding:2px;} +.x-form-invalid-tip .x-tip-body{padding-left:24px;background:transparent url(../images/default/form/exclamation.gif) no-repeat 2px 2px;} + +.x-menu{border:1px solid #718bb7;z-index:15000;zoom:1;background:#f0f0f0 url(../images/default/menu/menu.gif) repeat-y;padding:2px;} +.x-menu a{text-decoration:none!important;} +.ext-ie .x-menu{zoom:1;overflow:hidden;} +.x-menu-list{background:transparent;border:0 none;} +.x-menu li{line-height:100%;} +.x-menu li.x-menu-sep-li{font-size:1px;line-height:1px;} +.x-menu-list-item{font:normal 11px tahoma,arial,sans-serif;white-space:nowrap;-moz-user-select:none;-khtml-user-select:none;display:block;padding:1px;} +.x-menu-item-arrow{background:transparent url(../images/default/menu/menu-parent.gif) no-repeat right;} +.x-menu-sep{display:block;font-size:1px;line-height:1px;margin:2px 3px;background-color:#e0e0e0;border-bottom:1px solid #fff;overflow:hidden;} +.x-menu-focus{position:absolute;left:-1px;top:-1px;width:1px;height:1px;line-height:1px;font-size:1px;-moz-outline:0 none;outline:0 none;-moz-user-select:text;-khtml-user-select:text;overflow:hidden;display:block;} +.x-menu a.x-menu-item{display:block;line-height:16px;padding:3px 21px 3px 3px;white-space:nowrap;text-decoration:none;color:#222;-moz-outline:0 none;outline:0 none;cursor:pointer;} +.x-menu-item-active{background:#ebf3fd url(../images/default/menu/item-over.gif) repeat-x left bottom;border:1px solid #aaccf6;padding:0;} +.x-menu-item-active a.x-menu-item{color:#233d6d;} +.x-menu-item-icon{border:0 none;height:16px;padding:0;vertical-align:top;width:16px;margin:0 8px 0 0;background-position:center;} +.x-menu-check-item .x-menu-item-icon{background:transparent url(../images/default/menu/unchecked.gif) no-repeat center;} +.x-menu-item-checked .x-menu-item-icon{background-image:url(../images/default/menu/checked.gif);} +.x-menu-group-item .x-menu-item-icon{background:transparent;} +.x-menu-item-checked .x-menu-group-item .x-menu-item-icon{background:transparent url(../images/default/menu/group-checked.gif) no-repeat center;} +.x-menu-plain{background:#fff!important;} +.x-menu-date-item{padding:0;} +.x-menu .x-color-palette,.x-menu .x-date-picker{margin-left:26px;margin-right:4px;} +.x-menu .x-date-picker{border:1px solid #a3bad9;margin-top:2px;margin-bottom:2px;} +.x-menu-plain .x-color-palette,.x-menu-plain .x-date-picker{margin:0;border:0 none;} +.x-date-menu{padding:0!important;} +.x-cycle-menu .x-menu-item-checked{border:1px dotted #a3bae9!important;background:#DFE8F6;padding:0;} + + .x-box-tl{background:transparent url(../images/default/box/corners.gif) no-repeat 0 0;zoom:1;} +.x-box-tc{height:8px;background:transparent url(../images/default/box/tb.gif) repeat-x 0 0;overflow:hidden;} +.x-box-tr{background:transparent url(../images/default/box/corners.gif) no-repeat right -8px;} +.x-box-ml{background:transparent url(../images/default/box/l.gif) repeat-y 0;padding-left:4px;overflow:hidden;zoom:1;} +.x-box-mc{background:#eee url(../images/default/box/tb.gif) repeat-x 0 -16px;padding:4px 10px;font-family:"Myriad Pro","Myriad Web","Tahoma","Helvetica","Arial",sans-serif;color:#393939;font-size:12px;} +.x-box-mc h3{font-size:14px;font-weight:bold;margin:0 0 4px 0;zoom:1;} +.x-box-mr{background:transparent url(../images/default/box/r.gif) repeat-y right;padding-right:4px;overflow:hidden;} +.x-box-bl{background:transparent url(../images/default/box/corners.gif) no-repeat 0 -16px;zoom:1;} +.x-box-bc{background:transparent url(../images/default/box/tb.gif) repeat-x 0 -8px;height:8px;overflow:hidden;} +.x-box-br{background:transparent url(../images/default/box/corners.gif) no-repeat right -24px;} +.x-box-tl,.x-box-bl{padding-left:8px;overflow:hidden;} +.x-box-tr,.x-box-br{padding-right:8px;overflow:hidden;} +.x-box-blue .x-box-bl,.x-box-blue .x-box-br,.x-box-blue .x-box-tl,.x-box-blue .x-box-tr{background-image:url(../images/default/box/corners-blue.gif);} +.x-box-blue .x-box-bc,.x-box-blue .x-box-mc,.x-box-blue .x-box-tc{background-image:url(../images/default/box/tb-blue.gif);} +.x-box-blue .x-box-mc{background-color:#c3daf9;} +.x-box-blue .x-box-mc h3{color:#17385b;} +.x-box-blue .x-box-ml{background-image:url(../images/default/box/l-blue.gif);} +.x-box-blue .x-box-mr{background-image:url(../images/default/box/r-blue.gif);} + +#x-debug-browser .x-tree .x-tree-node a span{color:#222297;font-size:11px;padding-top:2px;font-family:"monotype","courier new",sans-serif;line-height:18px;} +#x-debug-browser .x-tree a i{color:#FF4545;font-style:normal;} +#x-debug-browser .x-tree a em{color:#999;} +#x-debug-browser .x-tree .x-tree-node .x-tree-selected a span{background:#c3daf9;} +#x-debug-browser .x-tool-toggle{background-position:0 -75px;} +#x-debug-browser .x-tool-toggle-over{background-position:-15px -75px;} +#x-debug-browser.x-panel-collapsed .x-tool-toggle{background-position:0 -60px;} +#x-debug-browser.x-panel-collapsed .x-tool-toggle-over{background-position:-15px -60px;} + +.x-combo-list{border:1px solid #98c0f4;background:#ddecfe;zoom:1;overflow:hidden;} +.x-combo-list-inner{overflow:auto;background:white;position:relative;zoom:1;overflow-x:hidden;} +.x-combo-list-hd{font:bold 11px tahoma,arial,helvetica,sans-serif;color:#15428b;background-image:url(../images/default/layout/panel-title-light-bg.gif);border-bottom:1px solid #98c0f4;padding:3px;} +.x-resizable-pinned .x-combo-list-inner{border-bottom:1px solid #98c0f4;} +.x-combo-list-item{font:normal 12px tahoma,arial,helvetica,sans-serif;padding:2px;border:1px solid #fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;} +.x-combo-list .x-combo-selected{border:1px dotted #a3bae9!important;background:#DFE8F6;cursor:pointer;} +.x-combo-noedit{cursor:pointer;} +.x-combo-list .x-toolbar{border-top:1px solid #98c0f4;border-bottom:0 none;} +.x-combo-list-small .x-combo-list-item{font:normal 11px tahoma,arial,helvetica,sans-serif;} + +.x-panel{border-style:solid;border-color:#99bbe8;border-width:0;} +.x-panel-header{overflow:hidden;zoom:1;color:#15428b;font:bold 11px tahoma,arial,verdana,sans-serif;padding:5px 3px 4px 5px;border:1px solid #99bbe8;line-height:15px;background:transparent url(../images/default/panel/white-top-bottom.gif) repeat-x 0 -1px;} +.x-panel-body{border:1px solid #99bbe8;border-top:0 none;overflow:hidden;background:white;position:relative;} +.x-panel-bbar .x-toolbar{border:1px solid #99bbe8;border-top:0 none;overflow:hidden;padding:2px;} +.x-panel-tbar .x-toolbar{border:1px solid #99bbe8;border-top:0 none;overflow:hidden;padding:2px;} +.x-panel-tbar-noheader .x-toolbar,.x-panel-mc .x-panel-tbar .x-toolbar{border-top:1px solid #99bbe8;border-bottom:0 none;} +.x-panel-body-noheader,.x-panel-mc .x-panel-body{border-top:1px solid #99bbe8;} +.x-panel-header{overflow:hidden;zoom:1;} +.x-panel-tl .x-panel-header{color:#15428b;font:bold 11px tahoma,arial,verdana,sans-serif;padding:5px 0 4px 0;border:0 none;background:transparent;} +.x-panel-tl .x-panel-icon,.x-window-tl .x-panel-icon{padding-left:20px!important;background-repeat:no-repeat;background-position:0 4px;zoom:1;} +.x-panel-inline-icon{width:16px;height:16px;background-repeat:no-repeat;background-position:0 0;vertical-align:middle;margin-right:4px;margin-top:-1px;margin-bottom:-1px;} +.x-panel-tc{background:transparent url(../images/default/panel/top-bottom.gif) repeat-x 0 0;overflow:hidden;} +.ext-strict .ext-ie7 .x-panel-tc{overflow:visible;} +.x-panel-tl{background:transparent url(../images/default/panel/corners-sprite.gif) no-repeat 0 0;padding-left:6px;zoom:1;border-bottom:1px solid #99bbe8;} +.x-panel-tr{background:transparent url(../images/default/panel/corners-sprite.gif) no-repeat right 0;zoom:1;padding-right:6px;} +.x-panel-bc{background:transparent url(../images/default/panel/top-bottom.gif) repeat-x 0 bottom;zoom:1;} +.x-panel-bc .x-panel-footer{zoom:1;} +.x-panel-bl{background:transparent url(../images/default/panel/corners-sprite.gif) no-repeat 0 bottom;padding-left:6px;zoom:1;} +.x-panel-br{background:transparent url(../images/default/panel/corners-sprite.gif) no-repeat right bottom;padding-right:6px;zoom:1;} +.x-panel-mc{border:0 none;padding:0;margin:0;font:normal 11px tahoma,arial,helvetica,sans-serif;padding-top:6px;background:#dfe8f6;} +.x-panel-mc .x-panel-body{background:transparent;border:0 none;} +.x-panel-ml{background:#fff url(../images/default/panel/left-right.gif) repeat-y 0 0;padding-left:6px;zoom:1;} +.x-panel-mr{background:transparent url(../images/default/panel/left-right.gif) repeat-y right 0;padding-right:6px;zoom:1;} +.x-panel-bc .x-panel-footer{padding-bottom:6px;} +.x-panel-nofooter .x-panel-bc,.x-panel-nofooter .x-window-bc{height:6px;font-size:0;line-height:0;} +.x-panel-bwrap{overflow:hidden;zoom:1;left:0;top:0;} +.x-panel-body{overflow:hidden;zoom:1;} +.x-panel-collapsed .x-resizable-handle{display:none;} +.ext-gecko .x-panel-animated div{overflow:hidden!important;} +.x-plain-body{overflow:hidden;} +.x-plain-bbar .x-toolbar{overflow:hidden;padding:2px;} +.x-plain-tbar .x-toolbar{overflow:hidden;padding:2px;} +.x-plain-bwrap{overflow:hidden;zoom:1;} +.x-plain{overflow:hidden;} +.x-tool{overflow:hidden;width:15px;height:15px;float:right;cursor:pointer;background:transparent url(../images/default/panel/tool-sprites.gif) no-repeat;margin-left:2px;} +.x-tool-toggle{background-position:0 -60px;} +.x-tool-toggle-over{background-position:-15px -60px;} +.x-panel-collapsed .x-tool-toggle{background-position:0 -75px;} +.x-panel-collapsed .x-tool-toggle-over{background-position:-15px -75px;} +.x-tool-close{background-position:0 -0;} +.x-tool-close-over{background-position:-15px 0;} +.x-tool-minimize{background-position:0 -15px;} +.x-tool-minimize-over{background-position:-15px -15px;} +.x-tool-maximize{background-position:0 -30px;} +.x-tool-maximize-over{background-position:-15px -30px;} +.x-tool-restore{background-position:0 -45px;} +.x-tool-restore-over{background-position:-15px -45px;} +.x-tool-gear{background-position:0 -90px;} +.x-tool-gear-over{background-position:-15px -90px;} +.x-tool-pin{background-position:0 -135px;} +.x-tool-pin-over{background-position:-15px -135px;} +.x-tool-unpin{background-position:0 -150px;} +.x-tool-unpin-over{background-position:-15px -150px;} +.x-tool-right{background-position:0 -165px;} +.x-tool-right-over{background-position:-15px -165px;} +.x-tool-left{background-position:0 -180px;} +.x-tool-left-over{background-position:-15px -180px;} +.x-tool-up{background-position:0 -210px;} +.x-tool-up-over{background-position:-15px -210px;} +.x-tool-down{background-position:0 -195px;} +.x-tool-down-over{background-position:-15px -195px;} +.x-tool-refresh{background-position:0 -225px;} +.x-tool-refresh-over{background-position:-15px -225px;} +.x-tool-minus{background-position:0 -255px;} +.x-tool-minus-over{background-position:-15px -255px;} +.x-tool-plus{background-position:0 -240px;} +.x-tool-plus-over{background-position:-15px -240px;} +.x-tool-search{background-position:0 -270px;} +.x-tool-search-over{background-position:-15px -270px;} +.x-tool-save{background-position:0 -285px;} +.x-tool-save-over{background-position:-15px -285px;} +.x-tool-help{background-position:0 -300px;} +.x-tool-help-over{background-position:-15px -300px;} +.x-tool-print{background-position:0 -315px;} +.x-tool-print-over{background-position:-15px -315px;} +.x-panel-ghost{background:#cbddf3;z-index:12000;overflow:hidden;position:absolute;left:0;top:0;opacity:.65;-moz-opacity:.65;filter:alpha(opacity=65);} +.x-panel-ghost ul{margin:0;padding:0;overflow:hidden;font-size:0;line-height:0;border:1px solid #99bbe8;border-top:0 none;display:block;} +.x-panel-ghost *{cursor:move!important;} +.x-panel-dd-spacer{border:2px dashed #99bbe8;} +.x-panel-btns-ct{padding:5px;} +.x-panel-btns-ct .x-btn{float:right;clear:none;} +.x-panel-btns-ct .x-panel-btns td{border:0;padding:0;} +.x-panel-btns-ct .x-panel-btns-right table{float:right;clear:none;} +.x-panel-btns-ct .x-panel-btns-left table{float:left;clear:none;} +.x-panel-btns-ct .x-panel-btns-center{text-align:center;} +.x-panel-btns-ct .x-panel-btns-center table{margin:0 auto;} +.x-panel-btns-ct table td.x-panel-btn-td{padding:3px;} +.x-panel-btns-ct .x-btn-focus .x-btn-left{background-position:0 -147px;} +.x-panel-btns-ct .x-btn-focus .x-btn-right{background-position:0 -168px;} +.x-panel-btns-ct .x-btn-focus .x-btn-center{background-position:0 -189px;} +.x-panel-btns-ct .x-btn-over .x-btn-left{background-position:0 -63px;} +.x-panel-btns-ct .x-btn-over .x-btn-right{background-position:0 -84px;} +.x-panel-btns-ct .x-btn-over .x-btn-center{background-position:0 -105px;} +.x-panel-btns-ct .x-btn-click .x-btn-center{background-position:0 -126px;} +.x-panel-btns-ct .x-btn-click .x-btn-right{background-position:0 -84px;} +.x-panel-btns-ct .x-btn-click .x-btn-left{background-position:0 -63px;} + +.x-window{zoom:1;} +.x-window .x-resizable-handle{opacity:0;-moz-opacity:0;filter:alpha(opacity=0);} +.x-window-proxy{background:#C7DFFC;border:1px solid #99bbe8;z-index:12000;overflow:hidden;position:absolute;left:0;top:0;display:none;opacity:.5;-moz-opacity:.5;filter:alpha(opacity=50);} +.x-window-header{overflow:hidden;zoom:1;} +.x-window-bwrap{z-index:1;position:relative;zoom:1;left:0;top:0;} +.x-window-tl .x-window-header{color:#15428b;font:bold 11px tahoma,arial,verdana,sans-serif;padding:5px 0 4px 0;} +.x-window-header-text{cursor:pointer;} +.x-window-tc{background:transparent url(../images/default/window/top-bottom.png) repeat-x 0 0;overflow:hidden;zoom:1;} +.x-window-tl{background:transparent url(../images/default/window/left-corners.png) no-repeat 0 0;padding-left:6px;zoom:1;z-index:1;position:relative;} +.x-window-tr{background:transparent url(../images/default/window/right-corners.png) no-repeat right 0;padding-right:6px;} +.x-window-bc{background:transparent url(../images/default/window/top-bottom.png) repeat-x 0 bottom;zoom:1;} +.x-window-bc .x-window-footer{padding-bottom:6px;zoom:1;font-size:0;line-height:0;} +.x-window-bl{background:transparent url(../images/default/window/left-corners.png) no-repeat 0 bottom;padding-left:6px;zoom:1;} +.x-window-br{background:transparent url(../images/default/window/right-corners.png) no-repeat right bottom;padding-right:6px;zoom:1;} +.x-window-mc{border:1px solid #99bbe8;padding:0;margin:0;font:normal 11px tahoma,arial,helvetica,sans-serif;background:#dfe8f6;} +.x-window-ml{background:transparent url(../images/default/window/left-right.png) repeat-y 0 0;padding-left:6px;zoom:1;} +.x-window-mr{background:transparent url(../images/default/window/left-right.png) repeat-y right 0;padding-right:6px;zoom:1;} +.x-window-body{overflow:hidden;} +.x-window-bwrap{overflow:hidden;} +.x-window-maximized .x-window-bl,.x-window-maximized .x-window-br,.x-window-maximized .x-window-ml,.x-window-maximized .x-window-mr,.x-window-maximized .x-window-tl,.x-window-maximized .x-window-tr{padding:0;} +.x-window-maximized .x-window-footer{padding-bottom:0;} +.x-window-maximized .x-window-tc{padding-left:3px;padding-right:3px;background-color:white;} +.x-window-maximized .x-window-mc{border-left:0 none;border-right:0 none;} +.x-window-tbar .x-toolbar,.x-window-bbar .x-toolbar{border-left:0 none;border-right:0 none;} +.x-window-bbar .x-toolbar{border-top:1px solid #99bbe8;border-bottom:0 none;} +.x-window-draggable,.x-window-draggable .x-window-header-text{cursor:move;} +.x-window-maximized .x-window-draggable,.x-window-maximized .x-window-draggable .x-window-header-text{cursor:default;} +.x-window-body{background:transparent;} +.x-panel-ghost .x-window-tl{border-bottom:1px solid #99bbe8;} +.x-panel-collapsed .x-window-tl{border-bottom:1px solid #84a0c4;} +.x-window-maximized-ct{overflow:hidden;} +.x-window-maximized .x-resizable-handle{display:none;} +.x-window-sizing-ghost ul{border:0 none!important;} +.x-dlg-focus{-moz-outline:0 none;outline:0 none;width:0;height:0;overflow:hidden;position:absolute;top:0;left:0;} +.x-dlg-mask{z-index:10000;display:none;position:absolute;top:0;left:0;-moz-opacity:0.5;opacity:.50;filter:alpha(opacity=50);background-color:#CCC;} +body.ext-ie6.x-body-masked select{visibility:hidden;} +body.ext-ie6.x-body-masked .x-window select{visibility:visible;} +.x-window-plain .x-window-mc{background:#CAD9EC;border-right:1px solid #DFE8F6;border-bottom:1px solid #DFE8F6;border-top:1px solid #a3bae9;border-left:1px solid #a3bae9;} +.x-window-plain .x-window-body{border-left:1px solid #DFE8F6;border-top:1px solid #DFE8F6;border-bottom:1px solid #a3bae9;border-right:1px solid #a3bae9;background:transparent!important;} +body.x-body-masked .x-window-plain .x-window-mc{background:#C7D6E9;} + +.x-html-editor-wrap{border:1px solid #a9bfd3;background:white;} +.x-html-editor-tb .x-btn-text{background:transparent url(../images/default/editor/tb-sprite.gif) no-repeat;} +.x-html-editor-tb .x-edit-bold .x-btn-text{background-position:0 0;} +.x-html-editor-tb .x-edit-italic .x-btn-text{background-position:-16px 0;} +.x-html-editor-tb .x-edit-underline .x-btn-text{background-position:-32px 0;} +.x-html-editor-tb .x-edit-forecolor .x-btn-text{background-position:-160px 0;} +.x-html-editor-tb .x-edit-backcolor .x-btn-text{background-position:-176px 0;} +.x-html-editor-tb .x-edit-justifyleft .x-btn-text{background-position:-112px 0;} +.x-html-editor-tb .x-edit-justifycenter .x-btn-text{background-position:-128px 0;} +.x-html-editor-tb .x-edit-justifyright .x-btn-text{background-position:-144px 0;} +.x-html-editor-tb .x-edit-insertorderedlist .x-btn-text{background-position:-80px 0;} +.x-html-editor-tb .x-edit-insertunorderedlist .x-btn-text{background-position:-96px 0;} +.x-html-editor-tb .x-edit-increasefontsize .x-btn-text{background-position:-48px 0;} +.x-html-editor-tb .x-edit-decreasefontsize .x-btn-text{background-position:-64px 0;} +.x-html-editor-tb .x-edit-sourceedit .x-btn-text{background-position:-192px 0;} +.x-html-editor-tb .x-edit-createlink .x-btn-text{background-position:-208px 0;} +.x-html-editor-tip .x-tip-bd .x-tip-bd-inner{padding:5px;padding-bottom:1px;} +.x-html-editor-tb .x-toolbar{position:static!important;} + +.x-panel-noborder .x-panel-body-noborder{border-width:0;} +.x-panel-noborder .x-panel-header-noborder{border-width:0;border-bottom:1px solid #99bbe8;} +.x-panel-noborder .x-panel-tbar-noborder .x-toolbar{border-width:0;border-bottom:1px solid #99bbe8;} +.x-panel-noborder .x-panel-bbar-noborder .x-toolbar{border-width:0;border-top:1px solid #99bbe8;} +.x-window-noborder .x-window-mc{border-width:0;} +.x-window-plain .x-window-body-noborder{border-width:0;} +.x-tab-panel-noborder .x-tab-panel-body-noborder{border-width:0;} +.x-tab-panel-noborder .x-tab-panel-header-noborder{border-top-width:0;border-left-width:0;border-right-width:0;} +.x-tab-panel-noborder .x-tab-panel-footer-noborder{border-bottom-width:0;border-left-width:0;border-right-width:0;} +.x-tab-panel-bbar-noborder .x-toolbar{border-width:0;border-top:1px solid #99bbe8;} +.x-tab-panel-tbar-noborder .x-toolbar{border-width:0;border-bottom:1px solid #99bbe8;} + +.x-border-layout-ct{background:#dfe8f6;} +.x-border-panel{position:absolute;left:0;top:0;} +.x-tool-collapse-south{background-position:0 -195px;} +.x-tool-collapse-south-over{background-position:-15px -195px;} +.x-tool-collapse-north{background-position:0 -210px;} +.x-tool-collapse-north-over{background-position:-15px -210px;} +.x-tool-collapse-west{background-position:0 -180px;} +.x-tool-collapse-west-over{background-position:-15px -180px;} +.x-tool-collapse-east{background-position:0 -165px;} +.x-tool-collapse-east-over{background-position:-15px -165px;} +.x-tool-expand-south{background-position:0 -210px;} +.x-tool-expand-south-over{background-position:-15px -210px;} +.x-tool-expand-north{background-position:0 -195px;} +.x-tool-expand-north-over{background-position:-15px -195px;} +.x-tool-expand-west{background-position:0 -165px;} +.x-tool-expand-west-over{background-position:-15px -165px;} +.x-tool-expand-east{background-position:0 -180px;} +.x-tool-expand-east-over{background-position:-15px -180px;} +.x-tool-expand-north,.x-tool-expand-south{float:right;margin:3px;} +.x-tool-expand-east,.x-tool-expand-west{float:none;margin:3px auto;} +.x-accordion-hd .x-tool-toggle{background-position:0 -255px;} +.x-accordion-hd .x-tool-toggle-over{background-position:-15px -255px;} +.x-panel-collapsed .x-accordion-hd .x-tool-toggle{background-position:0 -240px;} +.x-panel-collapsed .x-accordion-hd .x-tool-toggle-over{background-position:-15px -240px;} +.x-accordion-hd{color:#222;padding-top:4px;padding-bottom:3px;border-top:0 none;font-weight:normal;background:transparent url(../images/default/panel/light-hd.gif) repeat-x 0 -9px;} +.x-layout-collapsed{position:absolute;left:-10000px;top:-10000px;visibility:hidden;background-color:#d2e0f2;width:20px;height:20px;overflow:hidden;border:1px solid #98c0f4;z-index:20;} +.ext-border-box .x-layout-collapsed{width:22px;height:22px;} +.x-layout-collapsed-over{cursor:pointer;background-color:#d9e8fb;} +.x-layout-collapsed-west .x-layout-collapsed-tools,.x-layout-collapsed-east .x-layout-collapsed-tools{position:absolute;top:0;left:0;width:20px;height:20px;} +.x-layout-split{position:absolute;height:5px;width:5px;line-height:1px;font-size:1px;z-index:3;background-color:transparent;} +.ext-strict .ext-ie6 .x-layout-split{background-color:#fff!important;filter:alpha(opacity=1);} +.x-layout-split-h{background-image:url(../images/default/s.gif);background-position:left;} +.x-layout-split-v{background-image:url(../images/default/s.gif);background-position:top;} +.x-column-layout-ct{overflow:hidden;zoom:1;} +.x-column{float:left;padding:0;margin:0;overflow:hidden;zoom:1;} +.x-layout-mini{position:absolute;top:0;left:0;display:block;width:5px;height:35px;cursor:pointer;opacity:.5;-moz-opacity:.5;filter:alpha(opacity=50);} +.x-layout-mini-over,.x-layout-collapsed-over .x-layout-mini{opacity:1;-moz-opacity:1;filter:none;} +.x-layout-split-west .x-layout-mini{top:48%;background-image:url(../images/default/layout/mini-left.gif);} +.x-layout-split-east .x-layout-mini{top:48%;background-image:url(../images/default/layout/mini-right.gif);} +.x-layout-split-north .x-layout-mini{left:48%;height:5px;width:35px;background-image:url(../images/default/layout/mini-top.gif);} +.x-layout-split-south .x-layout-mini{left:48%;height:5px;width:35px;background-image:url(../images/default/layout/mini-bottom.gif);} +.x-layout-cmini-west .x-layout-mini{top:48%;background-image:url(../images/default/layout/mini-right.gif);} +.x-layout-cmini-east .x-layout-mini{top:48%;background-image:url(../images/default/layout/mini-left.gif);} +.x-layout-cmini-north .x-layout-mini{left:48%;height:5px;width:35px;background-image:url(../images/default/layout/mini-bottom.gif);} +.x-layout-cmini-south .x-layout-mini{left:48%;height:5px;width:35px;background-image:url(../images/default/layout/mini-top.gif);} +.x-layout-cmini-west,.x-layout-cmini-east{border:0 none;width:5px!important;padding:0;background:transparent;} +.x-layout-cmini-north,.x-layout-cmini-south{border:0 none;height:5px!important;padding:0;background:transparent;} +.x-viewport,.x-viewport body{margin:0;padding:0;border:0 none;overflow:hidden;height:100%;} +.x-abs-layout-item{position:absolute;left:0;top:0;} +.ext-ie input.x-abs-layout-item,.ext-ie textarea.x-abs-layout-item{margin:0;} + +.x-progress-wrap{border:1px solid #6593cf;overflow:hidden;} +.x-progress-inner{height:18px;background:#e0e8f3 url(../images/default/qtip/bg.gif) repeat-x;position:relative;} +.x-progress-bar{height:18px;float:left;width:0;background:#9CBFEE url( ../images/default/progress/progress-bg.gif ) repeat-x left center;border-top:1px solid #D1E4FD;border-bottom:1px solid #7FA9E4;border-right:1px solid #7FA9E4;} +.x-progress-text{font-size:11px;font-weight:bold;color:#fff;padding:1px 5px;overflow:hidden;position:absolute;left:0;text-align:center;} +.x-progress-text-back{color:#396095;line-height:16px;} +.ext-ie .x-progress-text-back{line-height:15px;} + +.x-window-dlg .x-window-body{border:0 none!important;padding:5px 10px;overflow:hidden!important;} +.x-window-dlg .x-window-mc{border:0 none!important;} +.x-window-dlg .ext-mb-text,.x-window-dlg .x-window-header-text{font-size:12px;} +.x-window-dlg .ext-mb-input{margin-top:4px;width:95%;} +.x-window-dlg .ext-mb-textarea{margin-top:4px;font:normal 12px tahoma,arial,helvetica,sans-serif;} +.x-window-dlg .x-progress-wrap{margin-top:4px;} +.ext-ie .x-window-dlg .x-progress-wrap{margin-top:6px;} +.x-window-dlg .x-msg-box-wait{background:transparent url(../images/default/grid/loading.gif) no-repeat left;display:block;width:300px;padding-left:18px;line-height:18px;} +.x-window-dlg .ext-mb-icon{float:left;width:47px;height:32px;} +.x-window-dlg .ext-mb-icon{float:left;width:47px;height:32px;} +.ext-ie .x-window-dlg .ext-mb-icon{width:44px;} +.x-window-dlg .ext-mb-info{background:transparent url(../images/default/window/icon-info.gif) no-repeat top left;} +.x-window-dlg .ext-mb-warning{background:transparent url(../images/default/window/icon-warning.gif) no-repeat top left;} +.x-window-dlg .ext-mb-question{background:transparent url(../images/default/window/icon-question.gif) no-repeat top left;} +.x-window-dlg .ext-mb-error{background:transparent url(../images/default/window/icon-error.gif) no-repeat top left;} +.ext-gecko2 .ext-mb-fix-cursor{overflow:auto;} + + .x-slider{zoom:1;} +.x-slider-inner{position:relative;left:0;top:0;overflow:visible;zoom:1;} +.x-slider-focus{position:absolute;left:0;top:0;width:1px;height:1px;line-height:1px;font-size:1px;-moz-outline:0 none;outline:0 none;-moz-user-select:text;-khtml-user-select:text;} +.x-slider-horz{padding-left:7px;background:transparent url(../images/default/slider/slider-bg.png) no-repeat 0 -22px;} +.x-slider-horz .x-slider-end{padding-right:7px;zoom:1;background:transparent url(../images/default/slider/slider-bg.png) no-repeat right -44px;} +.x-slider-horz .x-slider-inner{background:transparent url(../images/default/slider/slider-bg.png) repeat-x 0 0;height:22px;} +.x-slider-horz .x-slider-thumb{width:14px;height:15px;position:absolute;left:0;top:3px;background:transparent url(../images/default/slider/slider-thumb.png) no-repeat 0 0;} +.x-slider-horz .x-slider-thumb-over{background-position:-14px -15px;} +.x-slider-horz .x-slider-thumb-drag{background-position:-28px -30px;} +.x-slider-vert{padding-top:7px;background:transparent url(../images/default/slider/slider-v-bg.png) no-repeat -44px 0;width:22px;} +.x-slider-vert .x-slider-end{padding-bottom:7px;zoom:1;background:transparent url(../images/default/slider/slider-v-bg.png) no-repeat -22px bottom;} +.x-slider-vert .x-slider-inner{background:transparent url(../images/default/slider/slider-v-bg.png) repeat-y 0 0;} +.x-slider-vert .x-slider-thumb{width:15px;height:14px;position:absolute;left:3px;bottom:0;background:transparent url(../images/default/slider/slider-v-thumb.png) no-repeat 0 0;} +.x-slider-vert .x-slider-thumb-over{background-position:-15px -14px;} +.x-slider-vert .x-slider-thumb-drag{background-position:-30px -28px;} + diff --git a/comet4j-js/generateDoc/template/ext/resources/docs.css b/comet4j-js/generateDoc/template/ext/resources/docs.css new file mode 100644 index 0000000..4d3c5e9 --- /dev/null +++ b/comet4j-js/generateDoc/template/ext/resources/docs.css @@ -0,0 +1,346 @@ +body { + font: normal 12px verdana,arial,tahoma; +} +html, body { + margin:0; + padding:0; + border:0 none; + overflow:hidden; + height:100%; + width:100%; +} +#class .loading-indicator{ + font-size:12px; + height:18px; +} + + +#docs .top-toolbar{ + border:0 none; + border-top:1px solid #d0d0d0; + background:transparent; +} +#docs .top-toolbar button { + +} +.x-panel-noborder { + border: 0 none; +} +#header{ + border:0 none; + background:#1E4176 url(hd-bg.gif) repeat-x 0 0; + padding-top:3px; + padding-left:3px; +} +.docs-header .x-panel-body { + background:transparent; +} + +#header { + +} + +#header .api-title { + font:normal 16px tahoma, arial, sans-serif; + color:white; + margin:5px; +} + +.loading-indicator { + font-size:11px; + background-image:url('../resources/images/default/grid/loading.gif'); + background-repeat: no-repeat; + background-position:top left; + padding-left:20px; + height:18px; + text-align:left; +} + +#doc-body .loading-indicator { + font:bold 13px Tahoma, Verdana, Arial, Helvetica, sans-serif; + position:absolute; + top:35%; + left:43%; + color:#444; + background-image:url(../resources/images/default/shared/large-loading.gif); + background-repeat: no-repeat; + background-position:left 5px; + padding:10px 10px 10px 38px; + text-align:left; +} +a#welcome-link{ + background:#fff url(docs.gif) no-repeat 0px 0px; + padding-left:18px; +} +a#help-forums{ + background:#fff url(forum.gif) no-repeat 16px 0px; + padding-left:34px; + display:block +} +#loading-mask{ + position:absolute; + left:0; + top:0; + width:100%; + height:100%; + z-index:20000; + background-color:white; +} +#loading{ + position:absolute; + left:45%; + top:40%; + padding:2px; + z-index:20001; + height:auto; +} +#loading img { + margin-bottom:5px; +} +#loading .loading-indicator{ + background:white; + color:#555; + font:bold 13px tahoma,arial,helvetica; + padding:10px; + margin:0; + text-align:center; + height:auto; +} +#api-tree a span { + font-family:verdana,arial,tahoma,sans-serif; + font-size:11px; +} +#api-tree .cls a:hover span { + text-decoration:underline; +} +#api-tree .x-panel-body { + background-color:white; + position:relative; + padding:3px; +} +#api-tree .cls{ + border:1px solid #fff; +} + +#api-tree .x-tree-selected { + border:1px dotted #a3bae9; + background:#DFE8F6; +} +#api-tree .x-tree-node .x-tree-selected a span{ + background:transparent; + color:#1E4176; + font-weight:bold; +} + +a { + color: #1E4176; +} +a:link { + color: #1E4176; + text-decoration: none; +} + +a:visited { + color: #555; + text-decoration: none; +} + +a:hover { + text-decoration: underline; + color: #15428b; +} + +#welcome { + position:relative; + top:0; + left: 0; + zoom:1; +} +.col{ + margin:0 250px 0 10px; + zoom:1; + padding: 10px 0; +} + +.col-last { + width: 220px; + position:absolute; + right:10px; + top:10px; +} + +.block{ + margin-bottom:10px; +} +.block-title{ + color: #1E4176; + font:normal 18px tahoma,verdana,sans-serif; + letter-spacing:-1px; + padding: 4px; + padding-left: 8px; +} +.block-body{ + padding:8px; + padding-top:2px; +} +.block-body b{ + color:#333333; + font-size:11px; +} +.block-body em { + display:block; + margin-top:5px; + font-size:11px; + color:gray; + text-align:right; +} +.list{ + list-style: square; + padding-left:20px; + margin-top:5px; +} + +.res-block { + padding-top:5px; + background:transparent url(block-top.gif) no-repeat; + width:210px; + margin-bottom:15px; +} +.res-block-inner { + padding:6px 11px; + background:transparent url(block-bottom.gif) no-repeat left bottom; +} + +.res-block h3 { + font: bold 12px tahoma,arial,sans-serif; + color:#555; + margin-bottom:8px; +} + +.res-block ul { + list-style-type: disc; + margin-left:15px; + font: normal 12px tahoma,arial,sans-serif; + color:#555; +} + +.res-block ul li { + margin:0 0 5px 3px; +} + +.hide-inherited .inherited { + display:none; +} + +#doc-body .x-tab-panel-body { + background:#fff url(../resources/images/default/form/text-bg.gif) repeat-x 0 0; +} +#doc-body .x-panel-body, #doc-body .body-wrap { + background:transparent !important; +} +.icon-cls { + background-image: url(class.gif) !important; +} +.icon-event { + background-image: url(event.gif) !important; +} +.icon-config { + background-image: url(config.gif) !important; +} +.icon-prop { + background-image: url(prop.gif) !important; +} +.icon-method { + background-image: url(method.gif) !important; +} +.icon-cmp { + background-image: url(cmp.gif) !important; +} +.icon-pkg { + background-image: url(pkg.gif) !important; +} +.icon-fav { + background-image: url(fav.gif) !important; +} +.icon-static { + background-image: url(static.gif) !important; +} +.icon-docs { + background-image: url(docs.gif) !important; +} +.icon-expand-all { + background-image: url(expand-all.gif) !important; +} +.icon-collapse-all { + background-image: url(collapse-all.gif) !important; +} +.icon-expand-members { + background-image: url(expand-members.gif) !important; +} +.icon-hide-inherited { + background-image: url(hide-inherited.gif) !important; +} + +#legend li { + line-height:16px; +} +.item-icon { + vertical-align:top; + width:16px; + height:16px; + margin-right:6px; +} +.ext-ie .item-icon { + vertical-align:middle; +} +h3.home-title { + margin:5px 0; + font:bold 13px tahoma,arial,sans-serif; + color:#444; +} + +.search-item { + margin:5px 5px 9px; + padding:0 5px 10px 0; +} + +.search-item .member { + font:bold 12px tahoma,arial,sans-serif; + color:#444; + margin:5px; + overflow:hidden; + white-space:nowrap; + zoom:1; +} + +.search-item .cls { + font:normal 12px tahoma,arial,sans-serif; + color:#444; + margin:5px; + overflow:hidden; + text-align:left; + white-space:nowrap; + zoom:1; +} +.search-item p { + font:normal 11px tahoma,arial,sans-serif; + clear:both; + margin: 0 5px 5px 28px; + color:#444; + zoom:1; +} +#search .loading-indicator { + position:static !important; +} +#search h3 { + font:normal 12px tahoma,arial,sans-serif; + color:#444; + margin:10px; +} +.inner-link .item-icon, .bookmark .item-icon{ + margin-right:3px; +} +.inner-link, .bookmark { + margin-left:10px; +} + diff --git a/comet4j-js/generateDoc/template/ext/resources/docs.gif b/comet4j-js/generateDoc/template/ext/resources/docs.gif new file mode 100644 index 0000000..a915dfb Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/docs.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/docs.js b/comet4j-js/generateDoc/template/ext/resources/docs.js new file mode 100644 index 0000000..7baadc9 --- /dev/null +++ b/comet4j-js/generateDoc/template/ext/resources/docs.js @@ -0,0 +1,632 @@ +Ext.BLANK_IMAGE_URL = 'resources/s.gif'; + +Docs = {}; + +ApiPanel = function() { + ApiPanel.superclass.constructor.call(this, { + id:'api-tree', + region:'west', + split:true, + width: 280, + minSize: 175, + maxSize: 500, + collapsible: true, + margins:'0 0 5 5', + cmargins:'0 0 0 0', + rootVisible:false, + lines:false, + autoScroll:true, + animCollapse:false, + animate: false, + collapseMode:'mini', + loader: new Ext.tree.TreeLoader({ + preloadChildren: true, + clearOnLoad: false + }), + root: new Ext.tree.AsyncTreeNode({ + text:'Ext JS', + id:'root', + expanded:true, + children:[Docs.classData] + }), + collapseFirst:false + }); + // no longer needed! + //new Ext.tree.TreeSorter(this, {folderSort:true,leafAttr:'isClass'}); + + this.getSelectionModel().on('beforeselect', function(sm, node){ + return node.isLeaf(); + }); +}; + +Ext.extend(ApiPanel, Ext.tree.TreePanel, { + selectClass : function(cls){ + if(cls){ + var parts = cls.split('.'); + var last = parts.length-1; + var res = []; + var pkg = []; + for(var i = 0; i < last; i++){ // things get nasty - static classes can have . + var p = parts[i]; + var fc = p.charAt(0); + var staticCls = fc.toUpperCase() == fc; + if(p == 'Ext' || !staticCls){ + pkg.push(p); + res[i] = 'pkg-'+pkg.join('.'); + }else if(staticCls){ + --last; + res.splice(i, 1); + } + } + res[last] = cls; + + this.selectPath('/root/apidocs/'+res.join('/')); + } + } +}); + + +DocPanel = Ext.extend(Ext.Panel, { + closable: true, + autoScroll:true, + + initComponent : function(){ + var ps = this.cclass.split('.'); + this.title = ps[ps.length-1]; + + DocPanel.superclass.initComponent.call(this); + }, + + scrollToMember : function(member){ + var el = Ext.fly(this.cclass + '-' + member); + if(el){ + var top = (el.getOffsetsTo(this.body)[1]) + this.body.dom.scrollTop; + this.body.scrollTo('top', top-25, {duration:.75, callback: this.hlMember.createDelegate(this, [member])}); + } + }, + + scrollToSection : function(id){ + var el = Ext.getDom(id); + if(el){ + var top = (Ext.fly(el).getOffsetsTo(this.body)[1]) + this.body.dom.scrollTop; + this.body.scrollTo('top', top-25, {duration:.5, callback: function(){ + Ext.fly(el).next('h2').pause(.2).highlight('#8DB2E3', {attr:'color'}); + }}); + } + }, + + hlMember : function(member){ + var el = Ext.fly(this.cclass + '-' + member); + if(el){ + el.up('tr').highlight('#cadaf9'); + } + } +}); + + +MainPanel = function(){ + + this.searchStore = new Ext.data.Store({ + proxy: new Ext.data.ScriptTagProxy({ + url: 'http://extjs.com/playpen/api.php' + }), + reader: new Ext.data.JsonReader({ + root: 'data' + }, + ['cls', 'member', 'type', 'doc'] + ), + baseParams: {}, + listeners: { + 'beforeload' : function(){ + this.baseParams.qt = Ext.getCmp('search-type').getValue(); + } + } + }); + + MainPanel.superclass.constructor.call(this, { + id:'doc-body', + region:'center', + margins:'0 5 5 0', + resizeTabs: true, + minTabWidth: 135, + tabWidth: 135, + plugins: new Ext.ux.TabCloseMenu(), + enableTabScroll: true, + activeTab: 0, + + items: { + id:'welcome-panel', + title: 'API Home', + autoLoad: {url: 'welcome.html', callback: this.initSearch, scope: this}, + iconCls:'icon-docs', + autoScroll: true, + tbar: [ + 'Search: ', ' ', + new Ext.ux.SelectBox({ + listClass:'x-combo-list-small', + width:90, + value:'Starts with', + id:'search-type', + store: new Ext.data.SimpleStore({ + fields: ['text'], + expandData: true, + data : ['Starts with', 'Ends with', 'Any match'] + }), + displayField: 'text' + }), ' ', + new Ext.app.SearchField({ + width:240, + store: this.searchStore, + paramName: 'q' + }) + ] + } + }); +}; + +Ext.extend(MainPanel, Ext.TabPanel, { + + initEvents : function(){ + MainPanel.superclass.initEvents.call(this); + this.body.on('click', this.onClick, this); + }, + + onClick: function(e, target){ + if(target = e.getTarget('a:not(.exi)', 3)){ + var cls = Ext.fly(target).getAttributeNS('ext', 'cls'); + e.stopEvent(); + if(cls){ + var member = Ext.fly(target).getAttributeNS('ext', 'member'); + this.loadClass(target.href, cls, member); + }else if(target.className == 'inner-link'){ + this.getActiveTab().scrollToSection(target.href.split('#')[1]); + }else{ + window.open(target.href); + } + }else if(target = e.getTarget('.micon', 2)){ + e.stopEvent(); + var tr = Ext.fly(target.parentNode); + if(tr.hasClass('expandable')){ + tr.toggleClass('expanded'); + } + } + }, + + loadClass : function(href, cls, member){ + var id = 'docs-' + cls; + var tab = this.getComponent(id); + if(tab){ + this.setActiveTab(tab); + if(member){ + tab.scrollToMember(member); + } + }else{ + var autoLoad = {url: href}; + if(member){ + autoLoad.callback = function(){ + Ext.getCmp(id).scrollToMember(member); + } + } + var p = this.add(new DocPanel({ + id: id, + cclass : cls, + autoLoad: autoLoad, + iconCls: Docs.icons[cls] + })); + this.setActiveTab(p); + } + }, + + initSearch : function(){ + // Custom rendering Template for the View + var resultTpl = new Ext.XTemplate( + '', + '
      ', + '', + '{member}', + ' ', + '{cls}', + '

      {doc}

      ', + '
      ' + ); + + var p = new Ext.DataView({ + applyTo: 'search', + tpl: resultTpl, + loadingText:'Searching...', + store: this.searchStore, + itemSelector: 'div.search-item', + emptyText: '

      Use the search field above to search the Ext API for classes, properties, config options, methods and events.

      ' + }); + }, + + doSearch : function(e){ + var k = e.getKey(); + if(!e.isSpecialKey()){ + var text = e.target.value; + if(!text){ + this.searchStore.baseParams.q = ''; + this.searchStore.removeAll(); + }else{ + this.searchStore.baseParams.q = text; + this.searchStore.reload(); + } + } + } +}); + + +Ext.onReady(function(){ + + Ext.QuickTips.init(); + + var api = new ApiPanel(); + var mainPanel = new MainPanel(); + + api.on('click', function(node, e){ + if(node.isLeaf()){ + e.stopEvent(); + mainPanel.loadClass(node.attributes.href, node.id); + } + }); + + mainPanel.on('tabchange', function(tp, tab){ + api.selectClass(tab.cclass); + }); + + var hd = new Ext.Panel({ + border: false, + layout:'anchor', + region:'north', + cls: 'docs-header', + height:60, + items: [{ + xtype:'box', + el:'header', + border:false, + anchor: 'none -25' + }, + new Ext.Toolbar({ + cls:'top-toolbar', + items:[ ' ', + new Ext.form.TextField({ + width: 200, + emptyText:'Find a Class', + listeners:{ + render: function(f){ + f.el.on('keydown', filterTree, f, {buffer: 350}); + } + } + }), ' ', ' ', + { + iconCls: 'icon-expand-all', + tooltip: 'Expand All', + handler: function(){ api.root.expand(true); } + }, '-', { + iconCls: 'icon-collapse-all', + tooltip: 'Collapse All', + handler: function(){ api.root.collapse(true); } + }, '->', { + tooltip:'Hide Inherited Members', + iconCls: 'icon-hide-inherited', + enableToggle: true, + toggleHandler : function(b, pressed){ + mainPanel[pressed ? 'addClass' : 'removeClass']('hide-inherited'); + } + }, '-', { + tooltip:'Expand All Members', + iconCls: 'icon-expand-members', + enableToggle: true, + toggleHandler : function(b, pressed){ + mainPanel[pressed ? 'addClass' : 'removeClass']('full-details'); + } + }] + })] + }) + + var viewport = new Ext.Viewport({ + layout:'border', + items:[ hd, api, mainPanel ] + }); + + api.expandPath('/root/apidocs'); + + // allow for link in + var page = window.location.href.split('?')[1]; + if(page){ + var ps = Ext.urlDecode(page); + var cls = ps['class']; + mainPanel.loadClass('output/' + cls + '.html', cls, ps.member); + } + + viewport.doLayout(); + + setTimeout(function(){ + Ext.get('loading').remove(); + Ext.get('loading-mask').fadeOut({remove:true}); + }, 250); + + var filter = new Ext.tree.TreeFilter(api, { + clearBlank: true, + autoClear: true + }); + var hiddenPkgs = []; + function filterTree(e){ + var text = e.target.value; + Ext.each(hiddenPkgs, function(n){ + n.ui.show(); + }); + if(!text){ + filter.clear(); + return; + } + api.expandAll(); + + var re = new RegExp('^' + Ext.escapeRe(text), 'i'); + filter.filterBy(function(n){ + return !n.attributes.isClass || re.test(n.text); + }); + + // hide empty packages that weren't filtered + hiddenPkgs = []; + api.root.cascade(function(n){ + if(!n.attributes.isClass && n.ui.ctNode.offsetHeight < 3){ + n.ui.hide(); + hiddenPkgs.push(n); + } + }); + } + +}); + + +Ext.app.SearchField = Ext.extend(Ext.form.TwinTriggerField, { + initComponent : function(){ + if(!this.store.baseParams){ + this.store.baseParams = {}; + } + Ext.app.SearchField.superclass.initComponent.call(this); + this.on('specialkey', function(f, e){ + if(e.getKey() == e.ENTER){ + this.onTrigger2Click(); + } + }, this); + }, + + validationEvent:false, + validateOnBlur:false, + trigger1Class:'x-form-clear-trigger', + trigger2Class:'x-form-search-trigger', + hideTrigger1:true, + width:180, + hasSearch : false, + paramName : 'query', + + onTrigger1Click : function(){ + if(this.hasSearch){ + this.store.baseParams[this.paramName] = ''; + this.store.removeAll(); + this.el.dom.value = ''; + this.triggers[0].hide(); + this.hasSearch = false; + this.focus(); + } + }, + + onTrigger2Click : function(){ + var v = this.getRawValue(); + if(v.length < 1){ + this.onTrigger1Click(); + return; + } + if(v.length < 2){ + Ext.Msg.alert('Invalid Search', 'You must enter a minimum of 2 characters to search the API'); + return; + } + this.store.baseParams[this.paramName] = v; + var o = {start: 0}; + this.store.reload({params:o}); + this.hasSearch = true; + this.triggers[0].show(); + this.focus(); + } +}); + + +/** + * Makes a ComboBox more closely mimic an HTML SELECT. Supports clicking and dragging + * through the list, with item selection occurring when the mouse button is released. + * When used will automatically set {@link #editable} to false and call {@link Ext.Element#unselectable} + * on inner elements. Re-enabling editable after calling this will NOT work. + * + * @author Corey Gilmore + * http://extjs.com/forum/showthread.php?t=6392 + * + * @history 2007-07-08 jvs + * Slight mods for Ext 2.0 + */ +Ext.ux.SelectBox = function(config){ + this.searchResetDelay = 1000; + config = config || {}; + config = Ext.apply(config || {}, { + editable: false, + forceSelection: true, + rowHeight: false, + lastSearchTerm: false, + triggerAction: 'all', + mode: 'local' + }); + + Ext.ux.SelectBox.superclass.constructor.apply(this, arguments); + + this.lastSelectedIndex = this.selectedIndex || 0; +}; + +Ext.extend(Ext.ux.SelectBox, Ext.form.ComboBox, { + lazyInit: false, + initEvents : function(){ + Ext.ux.SelectBox.superclass.initEvents.apply(this, arguments); + // you need to use keypress to capture upper/lower case and shift+key, but it doesn't work in IE + this.el.on('keydown', this.keySearch, this, true); + this.cshTask = new Ext.util.DelayedTask(this.clearSearchHistory, this); + }, + + keySearch : function(e, target, options) { + var raw = e.getKey(); + var key = String.fromCharCode(raw); + var startIndex = 0; + + if( !this.store.getCount() ) { + return; + } + + switch(raw) { + case Ext.EventObject.HOME: + e.stopEvent(); + this.selectFirst(); + return; + + case Ext.EventObject.END: + e.stopEvent(); + this.selectLast(); + return; + + case Ext.EventObject.PAGEDOWN: + this.selectNextPage(); + e.stopEvent(); + return; + + case Ext.EventObject.PAGEUP: + this.selectPrevPage(); + e.stopEvent(); + return; + } + + // skip special keys other than the shift key + if( (e.hasModifier() && !e.shiftKey) || e.isNavKeyPress() || e.isSpecialKey() ) { + return; + } + if( this.lastSearchTerm == key ) { + startIndex = this.lastSelectedIndex; + } + this.search(this.displayField, key, startIndex); + this.cshTask.delay(this.searchResetDelay); + }, + + onRender : function(ct, position) { + this.store.on('load', this.calcRowsPerPage, this); + Ext.ux.SelectBox.superclass.onRender.apply(this, arguments); + if( this.mode == 'local' ) { + this.calcRowsPerPage(); + } + }, + + onSelect : function(record, index, skipCollapse){ + if(this.fireEvent('beforeselect', this, record, index) !== false){ + this.setValue(record.data[this.valueField || this.displayField]); + if( !skipCollapse ) { + this.collapse(); + } + this.lastSelectedIndex = index + 1; + this.fireEvent('select', this, record, index); + } + }, + + render : function(ct) { + Ext.ux.SelectBox.superclass.render.apply(this, arguments); + if( Ext.isSafari ) { + this.el.swallowEvent('mousedown', true); + } + this.el.unselectable(); + this.innerList.unselectable(); + this.trigger.unselectable(); + this.innerList.on('mouseup', function(e, target, options) { + if( target.id && target.id == this.innerList.id ) { + return; + } + this.onViewClick(); + }, this); + + this.innerList.on('mouseover', function(e, target, options) { + if( target.id && target.id == this.innerList.id ) { + return; + } + this.lastSelectedIndex = this.view.getSelectedIndexes()[0] + 1; + this.cshTask.delay(this.searchResetDelay); + }, this); + + this.trigger.un('click', this.onTriggerClick, this); + this.trigger.on('mousedown', function(e, target, options) { + e.preventDefault(); + this.onTriggerClick(); + }, this); + + this.on('collapse', function(e, target, options) { + Ext.getDoc().un('mouseup', this.collapseIf, this); + }, this, true); + + this.on('expand', function(e, target, options) { + Ext.getDoc().on('mouseup', this.collapseIf, this); + }, this, true); + }, + + clearSearchHistory : function() { + this.lastSelectedIndex = 0; + this.lastSearchTerm = false; + }, + + selectFirst : function() { + this.focusAndSelect(this.store.data.first()); + }, + + selectLast : function() { + this.focusAndSelect(this.store.data.last()); + }, + + selectPrevPage : function() { + if( !this.rowHeight ) { + return; + } + var index = Math.max(this.selectedIndex-this.rowsPerPage, 0); + this.focusAndSelect(this.store.getAt(index)); + }, + + selectNextPage : function() { + if( !this.rowHeight ) { + return; + } + var index = Math.min(this.selectedIndex+this.rowsPerPage, this.store.getCount() - 1); + this.focusAndSelect(this.store.getAt(index)); + }, + + search : function(field, value, startIndex) { + field = field || this.displayField; + this.lastSearchTerm = value; + var index = this.store.find.apply(this.store, arguments); + if( index !== -1 ) { + this.focusAndSelect(index); + } + }, + + focusAndSelect : function(record) { + var index = typeof record === 'number' ? record : this.store.indexOf(record); + this.select(index, this.isExpanded()); + this.onSelect(this.store.getAt(record), index, this.isExpanded()); + }, + + calcRowsPerPage : function() { + if( this.store.getCount() ) { + this.rowHeight = Ext.fly(this.view.getNode(0)).getHeight(); + this.rowsPerPage = this.maxHeight / this.rowHeight; + } else { + this.rowHeight = false; + } + } + +}); + +Ext.Ajax.on('requestcomplete', function(ajax, xhr, o){ + if(typeof urchinTracker == 'function' && o && o.url){ + urchinTracker(o.url); + } +}); \ No newline at end of file diff --git a/comet4j-js/generateDoc/template/ext/resources/elbow-end.gif b/comet4j-js/generateDoc/template/ext/resources/elbow-end.gif new file mode 100644 index 0000000..f24ddee Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/elbow-end.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/event.gif b/comet4j-js/generateDoc/template/ext/resources/event.gif new file mode 100644 index 0000000..9fb1ba9 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/event.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/example.gif b/comet4j-js/generateDoc/template/ext/resources/example.gif new file mode 100644 index 0000000..ad599cf Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/example.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/expand-all.gif b/comet4j-js/generateDoc/template/ext/resources/expand-all.gif new file mode 100644 index 0000000..3798498 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/expand-all.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/expand-bg-over.gif b/comet4j-js/generateDoc/template/ext/resources/expand-bg-over.gif new file mode 100644 index 0000000..ec3a546 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/expand-bg-over.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/expand-bg.gif b/comet4j-js/generateDoc/template/ext/resources/expand-bg.gif new file mode 100644 index 0000000..135aa89 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/expand-bg.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/expand-members.gif b/comet4j-js/generateDoc/template/ext/resources/expand-members.gif new file mode 100644 index 0000000..14b5437 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/expand-members.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/ext-all.js b/comet4j-js/generateDoc/template/ext/resources/ext-all.js new file mode 100644 index 0000000..9834745 --- /dev/null +++ b/comet4j-js/generateDoc/template/ext/resources/ext-all.js @@ -0,0 +1,162 @@ +/* + * Ext JS Library 2.2 + * Copyright(c) 2006-2008, Ext JS, LLC. + * licensing@extjs.com + * + * http://extjs.com/license + */ + +Ext.DomHelper=function(){var L=null;var F=/^(?:br|frame|hr|img|input|link|meta|range|spacer|wbr|area|param|col)$/i;var B=/^table|tbody|tr|td$/i;var A=function(T){if(typeof T=="string"){return T}var O="";if(Ext.isArray(T)){for(var R=0,P=T.length;R"}else{O+=">";var U=T.children||T.cn;if(U){O+=A(U)}else{if(T.html){O+=T.html}}O+=""}return O};var M=function(T,O){var S;if(Ext.isArray(T)){S=document.createDocumentFragment();for(var R=0,P=T.length;R",K=""+E,H=C+"",D=""+K;var G=function(N,O,Q,P){if(!L){L=document.createElement("div")}var R;var S=null;if(N=="td"){if(O=="afterbegin"||O=="beforeend"){return }if(O=="beforebegin"){S=Q;Q=Q.parentNode}else{S=Q.nextSibling;Q=Q.parentNode}R=I(4,H,P,D)}else{if(N=="tr"){if(O=="beforebegin"){S=Q;Q=Q.parentNode;R=I(3,C,P,K)}else{if(O=="afterend"){S=Q.nextSibling;Q=Q.parentNode;R=I(3,C,P,K)}else{if(O=="afterbegin"){S=Q.firstChild}R=I(4,H,P,D)}}}else{if(N=="tbody"){if(O=="beforebegin"){S=Q;Q=Q.parentNode;R=I(2,J,P,E)}else{if(O=="afterend"){S=Q.nextSibling;Q=Q.parentNode;R=I(2,J,P,E)}else{if(O=="afterbegin"){S=Q.firstChild}R=I(3,C,P,K)}}}else{if(O=="beforebegin"||O=="afterend"){return }if(O=="afterbegin"){S=Q.firstChild}R=I(2,J,P,E)}}}Q.insertBefore(R,S);return R};return{useDom:false,markup:function(N){return A(N)},applyStyles:function(P,Q){if(Q){P=Ext.fly(P);if(typeof Q=="string"){var O=/\s?([a-z\-]*)\:\s?([^;]*);?/gi;var R;while((R=O.exec(Q))!=null){P.setStyle(R[1],R[2])}}else{if(typeof Q=="object"){for(var N in Q){P.setStyle(N,Q[N])}}else{if(typeof Q=="function"){Ext.DomHelper.applyStyles(P,Q.call())}}}}},insertHtml:function(P,R,Q){P=P.toLowerCase();if(R.insertAdjacentHTML){if(B.test(R.tagName)){var O;if(O=G(R.tagName.toLowerCase(),P,R,Q)){return O}}switch(P){case"beforebegin":R.insertAdjacentHTML("BeforeBegin",Q);return R.previousSibling;case"afterbegin":R.insertAdjacentHTML("AfterBegin",Q);return R.firstChild;case"beforeend":R.insertAdjacentHTML("BeforeEnd",Q);return R.lastChild;case"afterend":R.insertAdjacentHTML("AfterEnd",Q);return R.nextSibling}throw"Illegal insertion point -> \""+P+"\""}var N=R.ownerDocument.createRange();var S;switch(P){case"beforebegin":N.setStartBefore(R);S=N.createContextualFragment(Q);R.parentNode.insertBefore(S,R);return R.previousSibling;case"afterbegin":if(R.firstChild){N.setStartBefore(R.firstChild);S=N.createContextualFragment(Q);R.insertBefore(S,R.firstChild);return R.firstChild}else{R.innerHTML=Q;return R.firstChild}case"beforeend":if(R.lastChild){N.setStartAfter(R.lastChild);S=N.createContextualFragment(Q);R.appendChild(S);return R.lastChild}else{R.innerHTML=Q;return R.lastChild}case"afterend":N.setStartAfter(R);S=N.createContextualFragment(Q);R.parentNode.insertBefore(S,R.nextSibling);return R.nextSibling}throw"Illegal insertion point -> \""+P+"\""},insertBefore:function(N,P,O){return this.doInsert(N,P,O,"beforeBegin")},insertAfter:function(N,P,O){return this.doInsert(N,P,O,"afterEnd","nextSibling")},insertFirst:function(N,P,O){return this.doInsert(N,P,O,"afterBegin","firstChild")},doInsert:function(Q,S,R,T,P){Q=Ext.getDom(Q);var O;if(this.useDom){O=M(S,null);(P==="firstChild"?Q:Q.parentNode).insertBefore(O,P?Q[P]:Q)}else{var N=A(S);O=this.insertHtml(T,Q,N)}return R?Ext.get(O,true):O},append:function(P,R,Q){P=Ext.getDom(P);var O;if(this.useDom){O=M(R,null);P.appendChild(O)}else{var N=A(R);O=this.insertHtml("beforeEnd",P,N)}return Q?Ext.get(O,true):O},overwrite:function(N,P,O){N=Ext.getDom(N);N.innerHTML=A(P);return O?Ext.get(N.firstChild,true):N.firstChild},createTemplate:function(O){var N=A(O);return new Ext.Template(N)}}}(); +Ext.Template=function(E){var B=arguments;if(Ext.isArray(E)){E=E.join("")}else{if(B.length>1){var C=[];for(var D=0,A=B.length;D+~]\s?|\s|$)/;var tagTokenRe=/^(#)?([\w-\*]+)/;var nthRe=/(\d*)n\+?(\d*)/,nthRe2=/\D/;function child(p,index){var i=0;var n=p.firstChild;while(n){if(n.nodeType==1){if(++i==index){return n}}n=n.nextSibling}return null}function next(n){while((n=n.nextSibling)&&n.nodeType!=1){}return n}function prev(n){while((n=n.previousSibling)&&n.nodeType!=1){}return n}function children(d){var n=d.firstChild,ni=-1;while(n){var nx=n.nextSibling;if(n.nodeType==3&&!nonSpace.test(n.nodeValue)){d.removeChild(n)}else{n.nodeIndex=++ni}n=nx}return this}function byClassName(c,a,v){if(!v){return c}var r=[],ri=-1,cn;for(var i=0,ci;ci=c[i];i++){if((" "+ci.className+" ").indexOf(v)!=-1){r[++ri]=ci}}return r}function attrValue(n,attr){if(!n.tagName&&typeof n.length!="undefined"){n=n[0]}if(!n){return null}if(attr=="for"){return n.htmlFor}if(attr=="class"||attr=="className"){return n.className}return n.getAttribute(attr)||n[attr]}function getNodes(ns,mode,tagName){var result=[],ri=-1,cs;if(!ns){return result}tagName=tagName||"*";if(typeof ns.getElementsByTagName!="undefined"){ns=[ns]}if(!mode){for(var i=0,ni;ni=ns[i];i++){cs=ni.getElementsByTagName(tagName);for(var j=0,ci;ci=cs[j];j++){result[++ri]=ci}}}else{if(mode=="/"||mode==">"){var utag=tagName.toUpperCase();for(var i=0,ni,cn;ni=ns[i];i++){cn=ni.children||ni.childNodes;for(var j=0,cj;cj=cn[j];j++){if(cj.nodeName==utag||cj.nodeName==tagName||tagName=="*"){result[++ri]=cj}}}}else{if(mode=="+"){var utag=tagName.toUpperCase();for(var i=0,n;n=ns[i];i++){while((n=n.nextSibling)&&n.nodeType!=1){}if(n&&(n.nodeName==utag||n.nodeName==tagName||tagName=="*")){result[++ri]=n}}}else{if(mode=="~"){for(var i=0,n;n=ns[i];i++){while((n=n.nextSibling)&&(n.nodeType!=1||(tagName=="*"||n.tagName.toLowerCase()!=tagName))){}if(n){result[++ri]=n}}}}}}return result}function concat(a,b){if(b.slice){return a.concat(b)}for(var i=0,l=b.length;i1){return nodup(results)}return results},selectNode:function(path,root){return Ext.DomQuery.select(path,root)[0]},selectValue:function(path,root,defaultValue){path=path.replace(trimRe,"");if(!valueCache[path]){valueCache[path]=Ext.DomQuery.compile(path,"select")}var n=valueCache[path](root);n=n[0]?n[0]:n;var v=(n&&n.firstChild?n.firstChild.nodeValue:null);return((v===null||v===undefined||v==="")?defaultValue:v)},selectNumber:function(path,root,defaultValue){var v=Ext.DomQuery.selectValue(path,root,defaultValue||0);return parseFloat(v)},is:function(el,ss){if(typeof el=="string"){el=document.getElementById(el)}var isArray=Ext.isArray(el);var result=Ext.DomQuery.filter(isArray?el:[el],ss);return isArray?(result.length==el.length):(result.length>0)},filter:function(els,ss,nonMatches){ss=ss.replace(trimRe,"");if(!simpleCache[ss]){simpleCache[ss]=Ext.DomQuery.compile(ss,"simple")}var result=simpleCache[ss](els);return nonMatches?quickDiff(result,els):result},matchers:[{re:/^\.([\w-]+)/,select:"n = byClassName(n, null, \" {1} \");"},{re:/^\:([\w-]+)(?:\(((?:[^\s>\/]*|.*?))\))?/,select:"n = byPseudo(n, \"{1}\", \"{2}\");"},{re:/^(?:([\[\{])(?:@)?([\w-]+)\s?(?:(=|.=)\s?['"]?(.*?)["']?)?[\]\}])/,select:"n = byAttribute(n, \"{2}\", \"{4}\", \"{3}\", \"{1}\");"},{re:/^#([\w-]+)/,select:"n = byId(n, null, \"{1}\");"},{re:/^@([\w-]+)/,select:"return {firstChild:{nodeValue:attrValue(n, \"{1}\")}};"}],operators:{"=":function(a,v){return a==v},"!=":function(a,v){return a!=v},"^=":function(a,v){return a&&a.substr(0,v.length)==v},"$=":function(a,v){return a&&a.substr(a.length-v.length)==v},"*=":function(a,v){return a&&a.indexOf(v)!==-1},"%=":function(a,v){return(a%v)==0},"|=":function(a,v){return a&&(a==v||a.substr(0,v.length+1)==v+"-")},"~=":function(a,v){return a&&(" "+a+" ").indexOf(" "+v+" ")!=-1}},pseudos:{"first-child":function(c){var r=[],ri=-1,n;for(var i=0,ci;ci=n=c[i];i++){while((n=n.previousSibling)&&n.nodeType!=1){}if(!n){r[++ri]=ci}}return r},"last-child":function(c){var r=[],ri=-1,n;for(var i=0,ci;ci=n=c[i];i++){while((n=n.nextSibling)&&n.nodeType!=1){}if(!n){r[++ri]=ci}}return r},"nth-child":function(c,a){var r=[],ri=-1;var m=nthRe.exec(a=="even"&&"2n"||a=="odd"&&"2n+1"||!nthRe2.test(a)&&"n+"+a||a);var f=(m[1]||1)-0,l=m[2]-0;for(var i=0,n;n=c[i];i++){var pn=n.parentNode;if(batch!=pn._batch){var j=0;for(var cn=pn.firstChild;cn;cn=cn.nextSibling){if(cn.nodeType==1){cn.nodeIndex=++j}}pn._batch=batch}if(f==1){if(l==0||n.nodeIndex==l){r[++ri]=n}}else{if((n.nodeIndex+l)%f==0){r[++ri]=n}}}return r},"only-child":function(c){var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){if(!prev(ci)&&!next(ci)){r[++ri]=ci}}return r},"empty":function(c){var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){var cns=ci.childNodes,j=0,cn,empty=true;while(cn=cns[j]){++j;if(cn.nodeType==1||cn.nodeType==3){empty=false;break}}if(empty){r[++ri]=ci}}return r},"contains":function(c,v){var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){if((ci.textContent||ci.innerText||"").indexOf(v)!=-1){r[++ri]=ci}}return r},"nodeValue":function(c,v){var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){if(ci.firstChild&&ci.firstChild.nodeValue==v){r[++ri]=ci}}return r},"checked":function(c){var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){if(ci.checked==true){r[++ri]=ci}}return r},"not":function(c,ss){return Ext.DomQuery.filter(c,ss,true)},"any":function(c,selectors){var ss=selectors.split("|");var r=[],ri=-1,s;for(var i=0,ci;ci=c[i];i++){for(var j=0;s=ss[j];j++){if(Ext.DomQuery.is(ci,s)){r[++ri]=ci;break}}}return r},"odd":function(c){return this["nth-child"](c,"odd")},"even":function(c){return this["nth-child"](c,"even")},"nth":function(c,a){return c[a-1]||[]},"first":function(c){return c[0]||[]},"last":function(c){return c[c.length-1]||[]},"has":function(c,ss){var s=Ext.DomQuery.select;var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){if(s(ss,ci).length>0){r[++ri]=ci}}return r},"next":function(c,ss){var is=Ext.DomQuery.is;var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){var n=next(ci);if(n&&is(n,ss)){r[++ri]=ci}}return r},"prev":function(c,ss){var is=Ext.DomQuery.is;var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){var n=prev(ci);if(n&&is(n,ss)){r[++ri]=ci}}return r}}}}();Ext.query=Ext.DomQuery.select; +Ext.util.Observable=function(){if(this.listeners){this.on(this.listeners);delete this.listeners}};Ext.util.Observable.prototype={fireEvent:function(){if(this.eventsSuspended!==true){var A=this.events[arguments[0].toLowerCase()];if(typeof A=="object"){return A.fire.apply(A,Array.prototype.slice.call(arguments,1))}}return true},filterOptRe:/^(?:scope|delay|buffer|single)$/,addListener:function(A,C,B,F){if(typeof A=="object"){F=A;for(var E in F){if(this.filterOptRe.test(E)){continue}if(typeof F[E]=="function"){this.addListener(E,F[E],F.scope,F)}else{this.addListener(E,F[E].fn,F[E].scope,F[E])}}return }F=(!F||typeof F=="boolean")?{}:F;A=A.toLowerCase();var D=this.events[A]||true;if(typeof D=="boolean"){D=new Ext.util.Event(this,A);this.events[A]=D}D.addListener(C,B,F)},removeListener:function(A,C,B){var D=this.events[A.toLowerCase()];if(typeof D=="object"){D.removeListener(C,B)}},purgeListeners:function(){for(var A in this.events){if(typeof this.events[A]=="object"){this.events[A].clearListeners()}}},relayEvents:function(F,D){var E=function(G){return function(){return this.fireEvent.apply(this,Ext.combine(G,Array.prototype.slice.call(arguments,0)))}};for(var C=0,A=D.length;C0},suspendEvents:function(){this.eventsSuspended=true},resumeEvents:function(){this.eventsSuspended=false},getMethodEvent:function(G){if(!this.methodEvents){this.methodEvents={}}var F=this.methodEvents[G];if(!F){F={};this.methodEvents[G]=F;F.originalFn=this[G];F.methodName=G;F.before=[];F.after=[];var C,B,D;var E=this;var A=function(J,I,H){if((B=J.apply(I||E,H))!==undefined){if(typeof B==="object"){if(B.returnValue!==undefined){C=B.returnValue}else{C=B}if(B.cancel===true){D=true}}else{if(B===false){D=true}else{C=B}}}};this[G]=function(){C=B=undefined;D=false;var I=Array.prototype.slice.call(arguments,0);for(var J=0,H=F.before.length;J0){this.firing=true;var G=Array.prototype.slice.call(arguments,0);for(var H=0;H=33&&D<=40)||D==this.RETURN||D==this.TAB||D==this.ESC},isSpecialKey:function(){var D=this.keyCode;return(this.type=="keypress"&&this.ctrlKey)||D==9||D==13||D==40||D==27||(D==16)||(D==17)||(D>=18&&D<=20)||(D>=33&&D<=35)||(D>=36&&D<=39)||(D>=44&&D<=45)},stopPropagation:function(){if(this.browserEvent){if(this.browserEvent.type=="mousedown"){Ext.EventManager.stoppedMouseDownEvent.fire(this)}B.stopPropagation(this.browserEvent)}},getCharCode:function(){return this.charCode||this.keyCode},getKey:function(){var D=this.keyCode||this.charCode;return Ext.isSafari?(A[D]||D):D},getPageX:function(){return this.xy[0]},getPageY:function(){return this.xy[1]},getTime:function(){if(this.browserEvent){return B.getTime(this.browserEvent)}return null},getXY:function(){return this.xy},getTarget:function(E,F,D){return E?Ext.fly(this.target).findParent(E,F,D):(D?Ext.get(this.target):this.target)},getRelatedTarget:function(){if(this.browserEvent){return B.getRelatedTarget(this.browserEvent)}return null},getWheelDelta:function(){var D=this.browserEvent;var E=0;if(D.wheelDelta){E=D.wheelDelta/120}else{if(D.detail){E=-D.detail/3}}return E},hasModifier:function(){return((this.ctrlKey||this.altKey)||this.shiftKey)?true:false},within:function(E,F){var D=this[F?"getRelatedTarget":"getTarget"]();return D&&Ext.fly(E).contains(D)},getPoint:function(){return new Ext.lib.Point(this.xy[0],this.xy[1])}};return new Ext.EventObjectImpl()}(); +(function(){var D=Ext.lib.Dom;var E=Ext.lib.Event;var A=Ext.lib.Anim;var propCache={};var camelRe=/(-[a-z])/gi;var camelFn=function(m,a){return a.charAt(1).toUpperCase()};var view=document.defaultView;Ext.Element=function(element,forceNew){var dom=typeof element=="string"?document.getElementById(element):element;if(!dom){return null}var id=dom.id;if(forceNew!==true&&id&&Ext.Element.cache[id]){return Ext.Element.cache[id]}this.dom=dom;this.id=id||Ext.id(dom)};var El=Ext.Element;El.prototype={originalDisplay:"",visibilityMode:1,defaultUnit:"px",setVisibilityMode:function(visMode){this.visibilityMode=visMode;return this},enableDisplayMode:function(display){this.setVisibilityMode(El.DISPLAY);if(typeof display!="undefined"){this.originalDisplay=display}return this},findParent:function(simpleSelector,maxDepth,returnEl){var p=this.dom,b=document.body,depth=0,dq=Ext.DomQuery,stopEl;maxDepth=maxDepth||50;if(typeof maxDepth!="number"){stopEl=Ext.getDom(maxDepth);maxDepth=10}while(p&&p.nodeType==1&&depthch||tcb){c.scrollTop=b-ch}}c.scrollTop=c.scrollTop;if(hscroll!==false){if(el.offsetWidth>c.clientWidth||lcr){c.scrollLeft=r-c.clientWidth}}c.scrollLeft=c.scrollLeft}return this},scrollChildIntoView:function(child,hscroll){Ext.fly(child,"_scrollChildIntoView").scrollIntoView(this,hscroll)},autoHeight:function(animate,duration,onComplete,easing){var oldHeight=this.getHeight();this.clip();this.setHeight(1);setTimeout(function(){var height=parseInt(this.dom.scrollHeight,10);if(!animate){this.setHeight(height);this.unclip();if(typeof onComplete=="function"){onComplete()}}else{this.setHeight(oldHeight);this.setHeight(height,animate,duration,function(){this.unclip();if(typeof onComplete=="function"){onComplete()}}.createDelegate(this),easing)}}.createDelegate(this),0);return this},contains:function(el){if(!el){return false}return D.isAncestor(this.dom,el.dom?el.dom:el)},isVisible:function(deep){var vis=!(this.getStyle("visibility")=="hidden"||this.getStyle("display")=="none");if(deep!==true||!vis){return vis}var p=this.dom.parentNode;while(p&&p.tagName.toLowerCase()!="body"){if(!Ext.fly(p,"_isVisible").isVisible()){return false}p=p.parentNode}return true},select:function(selector,unique){return El.select(selector,unique,this.dom)},query:function(selector){return Ext.DomQuery.select(selector,this.dom)},child:function(selector,returnDom){var n=Ext.DomQuery.selectNode(selector,this.dom);return returnDom?n:Ext.get(n)},down:function(selector,returnDom){var n=Ext.DomQuery.selectNode(" > "+selector,this.dom);return returnDom?n:Ext.get(n)},initDD:function(group,config,overrides){var dd=new Ext.dd.DD(Ext.id(this.dom),group,config);return Ext.apply(dd,overrides)},initDDProxy:function(group,config,overrides){var dd=new Ext.dd.DDProxy(Ext.id(this.dom),group,config);return Ext.apply(dd,overrides)},initDDTarget:function(group,config,overrides){var dd=new Ext.dd.DDTarget(Ext.id(this.dom),group,config);return Ext.apply(dd,overrides)},setVisible:function(visible,animate){if(!animate||!A){if(this.visibilityMode==El.DISPLAY){this.setDisplayed(visible)}else{this.fixDisplay();this.dom.style.visibility=visible?"visible":"hidden"}}else{var dom=this.dom;var visMode=this.visibilityMode;if(visible){this.setOpacity(0.01);this.setVisible(true)}this.anim({opacity:{to:(visible?1:0)}},this.preanim(arguments,1),null,0.35,"easeIn",function(){if(!visible){if(visMode==El.DISPLAY){dom.style.display="none"}else{dom.style.visibility="hidden"}Ext.get(dom).setOpacity(1)}})}return this},isDisplayed:function(){return this.getStyle("display")!="none"},toggle:function(animate){this.setVisible(!this.isVisible(),this.preanim(arguments,0));return this},setDisplayed:function(value){if(typeof value=="boolean"){value=value?this.originalDisplay:"none"}this.setStyle("display",value);return this},focus:function(){try{this.dom.focus()}catch(e){}return this},blur:function(){try{this.dom.blur()}catch(e){}return this},addClass:function(className){if(Ext.isArray(className)){for(var i=0,len=className.length;idw+scrollX){x=swapX?r.left-w:dw+scrollX-w}if(xdh+scrollY){y=swapY?r.top-h:dh+scrollY-h}if(yvr){x=vr-w;moved=true}if((y+h)>vb){y=vb-h;moved=true}if(x
      ";E.onAvailable(id,function(){var hd=document.getElementsByTagName("head")[0];var re=/(?:]*)?>)((\n|\r|.)*?)(?:<\/script>)/ig;var srcRe=/\ssrc=([\'\"])(.*?)\1/i;var typeRe=/\stype=([\'\"])(.*?)\1/i;var match;while(match=re.exec(html)){var attrs=match[1];var srcMatch=attrs?attrs.match(srcRe):false;if(srcMatch&&srcMatch[2]){var s=document.createElement("script");s.src=srcMatch[2];var typeMatch=attrs.match(typeRe);if(typeMatch&&typeMatch[2]){s.type=typeMatch[2]}hd.appendChild(s)}else{if(match[2]&&match[2].length>0){if(window.execScript){window.execScript(match[2])}else{window.eval(match[2])}}}}var el=document.getElementById(id);if(el){Ext.removeNode(el)}if(typeof callback=="function"){callback()}});dom.innerHTML=html.replace(/(?:)((\n|\r|.)*?)(?:<\/script>)/ig,"");return this},load:function(){var um=this.getUpdater();um.update.apply(um,arguments);return this},getUpdater:function(){if(!this.updateManager){this.updateManager=new Ext.Updater(this)}return this.updateManager},unselectable:function(){this.dom.unselectable="on";this.swallowEvent("selectstart",true);this.applyStyles("-moz-user-select:none;-khtml-user-select:none;");this.addClass("x-unselectable");return this},getCenterXY:function(){return this.getAlignToXY(document,"c-c")},center:function(centerIn){this.alignTo(centerIn||document,"c-c");return this},isBorderBox:function(){return noBoxAdjust[this.dom.tagName.toLowerCase()]||Ext.isBorderBox},getBox:function(contentBox,local){var xy;if(!local){xy=this.getXY()}else{var left=parseInt(this.getStyle("left"),10)||0;var top=parseInt(this.getStyle("top"),10)||0;xy=[left,top]}var el=this.dom,w=el.offsetWidth,h=el.offsetHeight,bx;if(!contentBox){bx={x:xy[0],y:xy[1],0:xy[0],1:xy[1],width:w,height:h}}else{var l=this.getBorderWidth("l")+this.getPadding("l");var r=this.getBorderWidth("r")+this.getPadding("r");var t=this.getBorderWidth("t")+this.getPadding("t");var b=this.getBorderWidth("b")+this.getPadding("b");bx={x:xy[0]+l,y:xy[1]+t,0:xy[0]+l,1:xy[1]+t,width:w-(l+r),height:h-(t+b)}}bx.right=bx.x+bx.width;bx.bottom=bx.y+bx.height;return bx},getFrameWidth:function(sides,onlyContentBox){return onlyContentBox&&Ext.isBorderBox?0:(this.getPadding(sides)+this.getBorderWidth(sides))},setBox:function(box,adjust,animate){var w=box.width,h=box.height;if((adjust&&!this.autoBoxAdjust)&&!this.isBorderBox()){w-=(this.getBorderWidth("lr")+this.getPadding("lr"));h-=(this.getBorderWidth("tb")+this.getPadding("tb"))}this.setBounds(box.x,box.y,w,h,this.preanim(arguments,2));return this},repaint:function(){var dom=this.dom;this.addClass("x-repaint");setTimeout(function(){Ext.get(dom).removeClass("x-repaint")},1);return this},getMargins:function(side){if(!side){return{top:parseInt(this.getStyle("margin-top"),10)||0,left:parseInt(this.getStyle("margin-left"),10)||0,bottom:parseInt(this.getStyle("margin-bottom"),10)||0,right:parseInt(this.getStyle("margin-right"),10)||0}}else{return this.addStyles(side,El.margins)}},addStyles:function(sides,styles){var val=0,v,w;for(var i=0,len=sides.length;i=0?w:-1*w)}}}return val},createProxy:function(config,renderTo,matchBox){config=typeof config=="object"?config:{tag:"div",cls:config};var proxy;if(renderTo){proxy=Ext.DomHelper.append(renderTo,config,true)}else{proxy=Ext.DomHelper.insertBefore(this.dom,config,true)}if(matchBox){proxy.setBox(this.getBox())}return proxy},mask:function(msg,msgCls){if(this.getStyle("position")=="static"){this.setStyle("position","relative")}if(this._maskMsg){this._maskMsg.remove()}if(this._mask){this._mask.remove()}this._mask=Ext.DomHelper.append(this.dom,{cls:"ext-el-mask"},true);this.addClass("x-masked");this._mask.setDisplayed(true);if(typeof msg=="string"){this._maskMsg=Ext.DomHelper.append(this.dom,{cls:"ext-el-mask-msg",cn:{tag:"div"}},true);var mm=this._maskMsg;mm.dom.className=msgCls?"ext-el-mask-msg "+msgCls:"ext-el-mask-msg";mm.dom.firstChild.innerHTML=msg;mm.setDisplayed(true);mm.center(this)}if(Ext.isIE&&!(Ext.isIE7&&Ext.isStrict)&&this.getStyle("height")=="auto"){this._mask.setSize(this.dom.clientWidth,this.getHeight())}return this._mask},unmask:function(){if(this._mask){if(this._maskMsg){this._maskMsg.remove();delete this._maskMsg}this._mask.remove();delete this._mask}this.removeClass("x-masked")},isMasked:function(){return this._mask&&this._mask.isVisible()},createShim:function(){var el=document.createElement("iframe");el.frameBorder="0";el.className="ext-shim";if(Ext.isIE&&Ext.isSecure){el.src=Ext.SSL_SECURE_URL}var shim=Ext.get(this.dom.parentNode.insertBefore(el,this.dom));shim.autoBoxAdjust=false;return shim},remove:function(){Ext.removeNode(this.dom);delete El.cache[this.dom.id]},hover:function(overFn,outFn,scope){var preOverFn=function(e){if(!e.within(this,true)){overFn.apply(scope||this,arguments)}};var preOutFn=function(e){if(!e.within(this,true)){outFn.apply(scope||this,arguments)}};this.on("mouseover",preOverFn,this.dom);this.on("mouseout",preOutFn,this.dom);return this},addClassOnOver:function(className){this.hover(function(){Ext.fly(this,"_internal").addClass(className)},function(){Ext.fly(this,"_internal").removeClass(className)});return this},addClassOnFocus:function(className){this.on("focus",function(){Ext.fly(this,"_internal").addClass(className)},this.dom);this.on("blur",function(){Ext.fly(this,"_internal").removeClass(className)},this.dom);return this},addClassOnClick:function(className){var dom=this.dom;this.on("mousedown",function(){Ext.fly(dom,"_internal").addClass(className);var d=Ext.getDoc();var fn=function(){Ext.fly(dom,"_internal").removeClass(className);d.removeListener("mouseup",fn)};d.on("mouseup",fn)});return this},swallowEvent:function(eventName,preventDefault){var fn=function(e){e.stopPropagation();if(preventDefault){e.preventDefault()}};if(Ext.isArray(eventName)){for(var i=0,len=eventName.length;idom.clientHeight||dom.scrollWidth>dom.clientWidth},scrollTo:function(side,value,animate){var prop=side.toLowerCase()=="left"?"scrollLeft":"scrollTop";if(!animate||!A){this.dom[prop]=value}else{var to=prop=="scrollLeft"?[value,this.dom.scrollTop]:[this.dom.scrollLeft,value];this.anim({scroll:{"to":to}},this.preanim(arguments,2),"scroll")}return this},scroll:function(direction,distance,animate){if(!this.isScrollable()){return }var el=this.dom;var l=el.scrollLeft,t=el.scrollTop;var w=el.scrollWidth,h=el.scrollHeight;var cw=el.clientWidth,ch=el.clientHeight;direction=direction.toLowerCase();var scrolled=false;var a=this.preanim(arguments,2);switch(direction){case"l":case"left":if(w-l>cw){var v=Math.min(l+distance,w-cw);this.scrollTo("left",v,a);scrolled=true}break;case"r":case"right":if(l>0){var v=Math.max(l-distance,0);this.scrollTo("left",v,a);scrolled=true}break;case"t":case"top":case"up":if(t>0){var v=Math.max(t-distance,0);this.scrollTo("top",v,a);scrolled=true}break;case"b":case"bottom":case"down":if(h-t>ch){var v=Math.min(t+distance,h-ch);this.scrollTo("top",v,a);scrolled=true}break}return scrolled},translatePoints:function(x,y){if(typeof x=="object"||Ext.isArray(x)){y=x[1];x=x[0]}var p=this.getStyle("position");var o=this.getXY();var l=parseInt(this.getStyle("left"),10);var t=parseInt(this.getStyle("top"),10);if(isNaN(l)){l=(p=="relative")?0:this.dom.offsetLeft}if(isNaN(t)){t=(p=="relative")?0:this.dom.offsetTop}return{left:(x-o[0]+l),top:(y-o[1]+t)}},getScroll:function(){var d=this.dom,doc=document;if(d==doc||d==doc.body){var l,t;if(Ext.isIE&&Ext.isStrict){l=doc.documentElement.scrollLeft||(doc.body.scrollLeft||0);t=doc.documentElement.scrollTop||(doc.body.scrollTop||0)}else{l=window.pageXOffset||(doc.body.scrollLeft||0);t=window.pageYOffset||(doc.body.scrollTop||0)}return{left:l,top:t}}else{return{left:d.scrollLeft,top:d.scrollTop}}},getColor:function(attr,defaultValue,prefix){var v=this.getStyle(attr);if(!v||v=="transparent"||v=="inherit"){return defaultValue}var color=typeof prefix=="undefined"?"#":prefix;if(v.substr(0,4)=="rgb("){var rvs=v.slice(4,v.length-1).split(",");for(var i=0;i<3;i++){var h=parseInt(rvs[i]);var s=h.toString(16);if(h<16){s="0"+s}color+=s}}else{if(v.substr(0,1)=="#"){if(v.length==4){for(var i=1;i<4;i++){var c=v.charAt(i);color+=c+c}}else{if(v.length==7){color+=v.substr(1)}}}}return(color.length>5?color.toLowerCase():defaultValue)},boxWrap:function(cls){cls=cls||"x-box";var el=Ext.get(this.insertHtml("beforeBegin",String.format("
      "+El.boxMarkup+"
      ",cls)));el.child("."+cls+"-mc").dom.appendChild(this.dom);return el},getAttributeNS:Ext.isIE?function(ns,name){var d=this.dom;var type=typeof d[ns+":"+name];if(type!="undefined"&&type!="unknown"){return d[ns+":"+name]}return d[name]}:function(ns,name){var d=this.dom;return d.getAttributeNS(ns,name)||d.getAttribute(ns+":"+name)||d.getAttribute(name)||d[name]},getTextWidth:function(text,min,max){return(Ext.util.TextMetrics.measure(this.dom,Ext.value(text,this.dom.innerHTML,true)).width).constrain(min||0,max||1000000)}};var ep=El.prototype;ep.on=ep.addListener;ep.mon=ep.addListener;ep.getUpdateManager=ep.getUpdater;ep.un=ep.removeListener;ep.autoBoxAdjust=true;El.unitPattern=/\d+(px|em|%|en|ex|pt|in|cm|mm|pc)$/i;El.addUnits=function(v,defaultUnit){if(v===""||v=="auto"){return v}if(v===undefined){return""}if(typeof v=="number"||!El.unitPattern.test(v)){return v+(defaultUnit||"px")}return v};El.boxMarkup="
      ";El.VISIBILITY=1;El.DISPLAY=2;El.borders={l:"border-left-width",r:"border-right-width",t:"border-top-width",b:"border-bottom-width"};El.paddings={l:"padding-left",r:"padding-right",t:"padding-top",b:"padding-bottom"};El.margins={l:"margin-left",r:"margin-right",t:"margin-top",b:"margin-bottom"};El.cache={};var docEl;El.get=function(el){var ex,elm,id;if(!el){return null}if(typeof el=="string"){if(!(elm=document.getElementById(el))){return null}if(ex=El.cache[el]){ex.dom=elm}else{ex=El.cache[el]=new El(elm)}return ex}else{if(el.tagName){if(!(id=el.id)){id=Ext.id(el)}if(ex=El.cache[id]){ex.dom=el}else{ex=El.cache[id]=new El(el)}return ex}else{if(el instanceof El){if(el!=docEl){el.dom=document.getElementById(el.id)||el.dom;El.cache[el.id]=el}return el}else{if(el.isComposite){return el}else{if(Ext.isArray(el)){return El.select(el)}else{if(el==document){if(!docEl){var f=function(){};f.prototype=El.prototype;docEl=new f();docEl.dom=document}return docEl}}}}}}return null};El.uncache=function(el){for(var i=0,a=arguments,len=a.length;i0){F()}else{B.afterFx(D)}})};F.call(this)});return this},pause:function(C){var A=this.getFxEl();var B={};A.queueFx(B,function(){setTimeout(function(){A.afterFx(B)},C*1000)});return this},fadeIn:function(B){var A=this.getFxEl();B=B||{};A.queueFx(B,function(){this.setOpacity(0);this.fixDisplay();this.dom.style.visibility="visible";var C=B.endOpacity||1;arguments.callee.anim=this.fxanim({opacity:{to:C}},B,null,0.5,"easeOut",function(){if(C==1){this.clearOpacity()}A.afterFx(B)})});return this},fadeOut:function(B){var A=this.getFxEl();B=B||{};A.queueFx(B,function(){arguments.callee.anim=this.fxanim({opacity:{to:B.endOpacity||0}},B,null,0.5,"easeOut",function(){if(this.visibilityMode==Ext.Element.DISPLAY||B.useDisplay){this.dom.style.display="none"}else{this.dom.style.visibility="hidden"}this.clearOpacity();A.afterFx(B)})});return this},scale:function(A,B,C){this.shift(Ext.apply({},C,{width:A,height:B}));return this},shift:function(B){var A=this.getFxEl();B=B||{};A.queueFx(B,function(){var E={},D=B.width,F=B.height,C=B.x,H=B.y,G=B.opacity;if(D!==undefined){E.width={to:this.adjustWidth(D)}}if(F!==undefined){E.height={to:this.adjustHeight(F)}}if(B.left!==undefined){E.left={to:B.left}}if(B.top!==undefined){E.top={to:B.top}}if(B.right!==undefined){E.right={to:B.right}}if(B.bottom!==undefined){E.bottom={to:B.bottom}}if(C!==undefined||H!==undefined){E.points={to:[C!==undefined?C:this.getX(),H!==undefined?H:this.getY()]}}if(G!==undefined){E.opacity={to:G}}if(B.xy!==undefined){E.points={to:B.xy}}arguments.callee.anim=this.fxanim(E,B,"motion",0.35,"easeOut",function(){A.afterFx(B)})});return this},ghost:function(A,C){var B=this.getFxEl();C=C||{};B.queueFx(C,function(){A=A||"b";var H=this.getFxRestore();var E=this.getWidth(),G=this.getHeight();var F=this.dom.style;var J=function(){if(C.useDisplay){B.setDisplayed(false)}else{B.hide()}B.clearOpacity();B.setPositioning(H.pos);F.width=H.width;F.height=H.height;B.afterFx(C)};var D={opacity:{to:0},points:{}},I=D.points;switch(A.toLowerCase()){case"t":I.by=[0,-G];break;case"l":I.by=[-E,0];break;case"r":I.by=[E,0];break;case"b":I.by=[0,G];break;case"tl":I.by=[-E,-G];break;case"bl":I.by=[-E,G];break;case"br":I.by=[E,G];break;case"tr":I.by=[E,-G];break}arguments.callee.anim=this.fxanim(D,C,"motion",0.5,"easeOut",J)});return this},syncFx:function(){this.fxDefaults=Ext.apply(this.fxDefaults||{},{block:false,concurrent:true,stopFx:false});return this},sequenceFx:function(){this.fxDefaults=Ext.apply(this.fxDefaults||{},{block:false,concurrent:false,stopFx:false});return this},nextFx:function(){var A=this.fxQueue[0];if(A){A.call(this)}},hasActiveFx:function(){return this.fxQueue&&this.fxQueue[0]},stopFx:function(){if(this.hasActiveFx()){var A=this.fxQueue[0];if(A&&A.anim&&A.anim.isAnimated()){this.fxQueue=[A];A.anim.stop(true)}}return this},beforeFx:function(A){if(this.hasActiveFx()&&!A.concurrent){if(A.stopFx){this.stopFx();return true}return false}return true},hasFxBlock:function(){var A=this.fxQueue;return A&&A[0]&&A[0].block},queueFx:function(C,A){if(!this.fxQueue){this.fxQueue=[]}if(!this.hasFxBlock()){Ext.applyIf(C,this.fxDefaults);if(!C.concurrent){var B=this.beforeFx(C);A.block=C.block;this.fxQueue.push(A);if(B){this.nextFx()}}else{A.call(this)}}return this},fxWrap:function(F,D,C){var B;if(!D.wrap||!(B=Ext.get(D.wrap))){var A;if(D.fixPosition){A=this.getXY()}var E=document.createElement("div");E.style.visibility=C;B=Ext.get(this.dom.parentNode.insertBefore(E,this.dom));B.setPositioning(F);if(B.getStyle("position")=="static"){B.position("relative")}this.clearPositioning("auto");B.clip();B.dom.appendChild(this.dom);if(A){B.setXY(A)}}return B},fxUnwrap:function(A,C,B){this.clearPositioning();this.setPositioning(C);if(!B.wrap){A.dom.parentNode.insertBefore(this.dom,A.dom);A.remove()}},getFxRestore:function(){var A=this.dom.style;return{pos:this.getPositioning(),width:A.width,height:A.height}},afterFx:function(A){if(A.afterStyle){this.applyStyles(A.afterStyle)}if(A.afterCls){this.addClass(A.afterCls)}if(A.remove===true){this.remove()}Ext.callback(A.callback,A.scope,[this]);if(!A.concurrent){this.fxQueue.shift();this.nextFx()}},getFxEl:function(){return Ext.get(this.dom)},fxanim:function(D,E,B,F,C,A){B=B||"run";E=E||{};var G=Ext.lib.Anim[B](this.dom,D,(E.duration||F)||0.35,(E.easing||C)||"easeOut",function(){Ext.callback(A,this)},this);E.anim=G;return G}};Ext.Fx.resize=Ext.Fx.scale;Ext.apply(Ext.Element.prototype,Ext.Fx); +Ext.CompositeElement=function(A){this.elements=[];this.addElements(A)};Ext.CompositeElement.prototype={isComposite:true,addElements:function(E){if(!E){return this}if(typeof E=="string"){E=Ext.Element.selectorFunction(E)}var D=this.elements;var B=D.length-1;for(var C=0,A=E.length;C"+A.text+""}if(typeof A.scripts!="undefined"){this.loadScripts=A.scripts}if(typeof A.timeout!="undefined"){this.timeout=A.timeout}}this.showLoading();if(!D){this.defaultUrl=B}if(typeof B=="function"){B=B.call(this)}var E=Ext.apply({},{url:B,params:(typeof F=="function"&&C)?F.createDelegate(C):F,success:this.processSuccess,failure:this.processFailure,scope:this,callback:undefined,timeout:(this.timeout*1000),disableCaching:this.disableCaching,argument:{"options":A,"url":B,"form":null,"callback":G,"scope":C||window,"params":F}},A);this.transaction=Ext.Ajax.request(E)}},formUpdate:function(C,A,B,D){if(this.fireEvent("beforeupdate",this.el,C,A)!==false){if(typeof A=="function"){A=A.call(this)}C=Ext.getDom(C);this.transaction=Ext.Ajax.request({form:C,url:A,success:this.processSuccess,failure:this.processFailure,scope:this,timeout:(this.timeout*1000),argument:{"url":A,"form":C,"callback":D,"reset":B}});this.showLoading.defer(1,this)}},refresh:function(A){if(this.defaultUrl==null){return }this.update(this.defaultUrl,null,A,true)},startAutoRefresh:function(B,C,D,E,A){if(A){this.update(C||this.defaultUrl,D,E,true)}if(this.autoRefreshProcId){clearInterval(this.autoRefreshProcId)}this.autoRefreshProcId=setInterval(this.update.createDelegate(this,[C||this.defaultUrl,D,E,true]),B*1000)},stopAutoRefresh:function(){if(this.autoRefreshProcId){clearInterval(this.autoRefreshProcId);delete this.autoRefreshProcId}},isAutoRefreshing:function(){return this.autoRefreshProcId?true:false},showLoading:function(){if(this.showLoadIndicator){this.el.update(this.indicatorText)}},processSuccess:function(A){this.transaction=null;if(A.argument.form&&A.argument.reset){try{A.argument.form.reset()}catch(B){}}if(this.loadScripts){this.renderer.render(this.el,A,this,this.updateComplete.createDelegate(this,[A]))}else{this.renderer.render(this.el,A,this);this.updateComplete(A)}},updateComplete:function(A){this.fireEvent("update",this.el,A);if(typeof A.argument.callback=="function"){A.argument.callback.call(A.argument.scope,this.el,true,A,A.argument.options)}},processFailure:function(A){this.transaction=null;this.fireEvent("failure",this.el,A);if(typeof A.argument.callback=="function"){A.argument.callback.call(A.argument.scope,this.el,false,A,A.argument.options)}},setRenderer:function(A){this.renderer=A},getRenderer:function(){return this.renderer},setDefaultUrl:function(A){this.defaultUrl=A},abort:function(){if(this.transaction){Ext.Ajax.abort(this.transaction)}},isUpdating:function(){if(this.transaction){return Ext.Ajax.isLoading(this.transaction)}return false}});Ext.Updater.defaults={timeout:30,loadScripts:false,sslBlankUrl:(Ext.SSL_SECURE_URL||"javascript:false"),disableCaching:false,showLoadIndicator:true,indicatorText:"
      Loading...
      "};Ext.Updater.updateElement=function(D,C,E,B){var A=Ext.get(D).getUpdater();Ext.apply(A,B);A.update(C,E,B?B.callback:null)};Ext.Updater.BasicRenderer=function(){};Ext.Updater.BasicRenderer.prototype={render:function(C,A,B,D){C.update(A.responseText,B.loadScripts,D)}};Ext.UpdateManager=Ext.Updater; +(function(){Date.formatCodeToRegex=function(character,currentGroup){var p=Date.parseCodes[character];if(p){p=Ext.type(p)=="function"?p():p;Date.parseCodes[character]=p}return p?Ext.applyIf({c:p.c?String.format(p.c,currentGroup||"{0}"):p.c},p):{g:0,c:null,s:Ext.escapeRe(character)}};var $f=Date.formatCodeToRegex;Ext.apply(Date,{parseFunctions:{count:0},parseRegexes:[],formatFunctions:{count:0},daysInMonth:[31,28,31,30,31,30,31,31,30,31,30,31],y2kYear:50,MILLI:"ms",SECOND:"s",MINUTE:"mi",HOUR:"h",DAY:"d",MONTH:"mo",YEAR:"y",dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNumbers:{Jan:0,Feb:1,Mar:2,Apr:3,May:4,Jun:5,Jul:6,Aug:7,Sep:8,Oct:9,Nov:10,Dec:11},getShortMonthName:function(month){return Date.monthNames[month].substring(0,3)},getShortDayName:function(day){return Date.dayNames[day].substring(0,3)},getMonthNumber:function(name){return Date.monthNumbers[name.substring(0,1).toUpperCase()+name.substring(1,3).toLowerCase()]},formatCodes:{d:"String.leftPad(this.getDate(), 2, '0')",D:"Date.getShortDayName(this.getDay())",j:"this.getDate()",l:"Date.dayNames[this.getDay()]",N:"(this.getDay() ? this.getDay() : 7)",S:"this.getSuffix()",w:"this.getDay()",z:"this.getDayOfYear()",W:"String.leftPad(this.getWeekOfYear(), 2, '0')",F:"Date.monthNames[this.getMonth()]",m:"String.leftPad(this.getMonth() + 1, 2, '0')",M:"Date.getShortMonthName(this.getMonth())",n:"(this.getMonth() + 1)",t:"this.getDaysInMonth()",L:"(this.isLeapYear() ? 1 : 0)",o:"(this.getFullYear() + (this.getWeekOfYear() == 1 && this.getMonth() > 0 ? +1 : (this.getWeekOfYear() >= 52 && this.getMonth() < 11 ? -1 : 0)))",Y:"this.getFullYear()",y:"('' + this.getFullYear()).substring(2, 4)",a:"(this.getHours() < 12 ? 'am' : 'pm')",A:"(this.getHours() < 12 ? 'AM' : 'PM')",g:"((this.getHours() % 12) ? this.getHours() % 12 : 12)",G:"this.getHours()",h:"String.leftPad((this.getHours() % 12) ? this.getHours() % 12 : 12, 2, '0')",H:"String.leftPad(this.getHours(), 2, '0')",i:"String.leftPad(this.getMinutes(), 2, '0')",s:"String.leftPad(this.getSeconds(), 2, '0')",u:"String.leftPad(this.getMilliseconds(), 3, '0')",O:"this.getGMTOffset()",P:"this.getGMTOffset(true)",T:"this.getTimezone()",Z:"(this.getTimezoneOffset() * -60)",c:function(){for(var c="Y-m-dTH:i:sP",code=[],i=0,l=c.length;i 0) {";var regex="";var special=false;var ch="";for(var i=0;i= 0 && m >= 0 && d > 0 && h >= 0 && i >= 0 && s >= 0 && ms >= 0){\n"+"v = new Date(y, m, d, h, i, s, ms);\n"+"}else if (y >= 0 && m >= 0 && d > 0 && h >= 0 && i >= 0 && s >= 0){\n"+"v = new Date(y, m, d, h, i, s);\n"+"}else if (y >= 0 && m >= 0 && d > 0 && h >= 0 && i >= 0){\n"+"v = new Date(y, m, d, h, i);\n"+"}else if (y >= 0 && m >= 0 && d > 0 && h >= 0){\n"+"v = new Date(y, m, d, h);\n"+"}else if (y >= 0 && m >= 0 && d > 0){\n"+"v = new Date(y, m, d);\n"+"}else if (y >= 0 && m >= 0){\n"+"v = new Date(y, m);\n"+"}else if (y >= 0){\n"+"v = new Date(y);\n"+"}\n}\nreturn (v && (z || o))?"+" (Ext.type(z) == 'number' ? v.add(Date.SECOND, -v.getTimezoneOffset() * 60 - z) :"+" v.add(Date.MINUTE, -v.getTimezoneOffset() + (sn == '+'? -1 : 1) * (hr * 60 + mn))) : v;\n"+"}";Date.parseRegexes[regexNum]=new RegExp("^"+regex+"$","i");eval(code)},parseCodes:{d:{g:1,c:"d = parseInt(results[{0}], 10);\n",s:"(\\d{2})"},j:{g:1,c:"d = parseInt(results[{0}], 10);\n",s:"(\\d{1,2})"},D:function(){for(var a=[],i=0;i<7;a.push(Date.getShortDayName(i)),++i){}return{g:0,c:null,s:"(?:"+a.join("|")+")"}},l:function(){return{g:0,c:null,s:"(?:"+Date.dayNames.join("|")+")"}},N:{g:0,c:null,s:"[1-7]"},S:{g:0,c:null,s:"(?:st|nd|rd|th)"},w:{g:0,c:null,s:"[0-6]"},z:{g:0,c:null,s:"(?:\\d{1,3}"},W:{g:0,c:null,s:"(?:\\d{2})"},F:function(){return{g:1,c:"m = parseInt(Date.getMonthNumber(results[{0}]), 10);\n",s:"("+Date.monthNames.join("|")+")"}},M:function(){for(var a=[],i=0;i<12;a.push(Date.getShortMonthName(i)),++i){}return Ext.applyIf({s:"("+a.join("|")+")"},$f("F"))},m:{g:1,c:"m = parseInt(results[{0}], 10) - 1;\n",s:"(\\d{2})"},n:{g:1,c:"m = parseInt(results[{0}], 10) - 1;\n",s:"(\\d{1,2})"},t:{g:0,c:null,s:"(?:\\d{2})"},L:{g:0,c:null,s:"(?:1|0)"},o:function(){return $f("Y")},Y:{g:1,c:"y = parseInt(results[{0}], 10);\n",s:"(\\d{4})"},y:{g:1,c:"var ty = parseInt(results[{0}], 10);\n"+"y = ty > Date.y2kYear ? 1900 + ty : 2000 + ty;\n",s:"(\\d{1,2})"},a:{g:1,c:"if (results[{0}] == 'am') {\n"+"if (h == 12) { h = 0; }\n"+"} else { if (h < 12) { h += 12; }}",s:"(am|pm)"},A:{g:1,c:"if (results[{0}] == 'AM') {\n"+"if (h == 12) { h = 0; }\n"+"} else { if (h < 12) { h += 12; }}",s:"(AM|PM)"},g:function(){return $f("G")},G:{g:1,c:"h = parseInt(results[{0}], 10);\n",s:"(\\d{1,2})"},h:function(){return $f("H")},H:{g:1,c:"h = parseInt(results[{0}], 10);\n",s:"(\\d{2})"},i:{g:1,c:"i = parseInt(results[{0}], 10);\n",s:"(\\d{2})"},s:{g:1,c:"s = parseInt(results[{0}], 10);\n",s:"(\\d{2})"},u:{g:1,c:"ms = results[{0}]; ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n",s:"(\\d+)"},O:{g:1,c:["o = results[{0}];","var sn = o.substring(0,1);","var hr = o.substring(1,3)*1 + Math.floor(o.substring(3,5) / 60);","var mn = o.substring(3,5) % 60;","o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + String.leftPad(hr, 2, '0') + String.leftPad(mn, 2, '0')) : null;\n"].join("\n"),s:"([+-]\\d{4})"},P:{g:1,c:["o = results[{0}];","var sn = o.substring(0,1);","var hr = o.substring(1,3)*1 + Math.floor(o.substring(4,6) / 60);","var mn = o.substring(4,6) % 60;","o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + String.leftPad(hr, 2, '0') + String.leftPad(mn, 2, '0')) : null;\n"].join("\n"),s:"([+-]\\d{2}:\\d{2})"},T:{g:0,c:null,s:"[A-Z]{1,4}"},Z:{g:1,c:"z = results[{0}] * 1;\n"+"z = (-43200 <= z && z <= 50400)? z : null;\n",s:"([+-]?\\d{1,5})"},c:function(){var calc=[];var arr=[$f("Y",1),$f("m",2),$f("d",3),$f("h",4),$f("i",5),$f("s",6),{c:"ms = (results[7] || '.0').substring(1); ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n"},{c:"if(results[9] == 'Z'){\no = 0;\n}else{\n"+$f("P",9).c+"\n}"}];for(var i=0,l=arr.length;i0?"-":"+")+String.leftPad(Math.abs(Math.floor(this.getTimezoneOffset()/60)),2,"0")+(A?":":"")+String.leftPad(Math.abs(this.getTimezoneOffset()%60),2,"0")},getDayOfYear:function(){var A=0;Date.daysInMonth[1]=this.isLeapYear()?29:28;for(var B=0;B28){A=Math.min(A,this.getFirstDateOfMonth().add("mo",C).getLastDateOfMonth().getDate())}D.setDate(A);D.setMonth(this.getMonth()+C);break;case Date.YEAR:D.setFullYear(this.getFullYear()+C);break}return D},between:function(C,A){var B=this.getTime();return C.getTime()<=B&&B<=A.getTime()}});Date.prototype.format=Date.prototype.dateFormat;if(Ext.isSafari){Date.brokenSetMonth=Date.prototype.setMonth;Date.prototype.setMonth=function(A){if(A<=-1){var D=Math.ceil(-A);var C=Math.ceil(D/12);var B=(D%12)?12-D%12:0;this.setFullYear(this.getFullYear()-C);return Date.brokenSetMonth.call(this,B)}else{return Date.brokenSetMonth.apply(this,arguments)}}}; +Ext.util.DelayedTask=function(E,D,A){var G=null,F,B;var C=function(){var H=new Date().getTime();if(H-B>=F){clearInterval(G);G=null;E.apply(D,A||[])}};this.delay=function(I,K,J,H){if(G&&I!=F){this.cancel()}F=I;B=new Date().getTime();E=K||E;D=J||D;A=H||A;if(!G){G=setInterval(C,F)}};this.cancel=function(){if(G){clearInterval(G);G=null}}}; +Ext.util.TaskRunner=function(E){E=E||10;var F=[],A=[];var B=0;var G=false;var D=function(){G=false;clearInterval(B);B=0};var H=function(){if(!G){G=true;B=setInterval(I,E)}};var C=function(J){A.push(J);if(J.onStop){J.onStop.apply(J.scope||J)}};var I=function(){if(A.length>0){for(var O=0,K=A.length;O1||Ext.isArray(E)){var B=arguments.length>1?arguments:E;for(var D=0,A=B.length;D=this.length){return this.add(B,C)}this.length++;this.items.splice(A,0,C);if(typeof B!="undefined"&&B!=null){this.map[B]=C}this.keys.splice(A,0,B);this.fireEvent("add",A,C,B);return C},remove:function(A){return this.removeAt(this.indexOf(A))},removeAt:function(A){if(A=0){this.length--;var C=this.items[A];this.items.splice(A,1);var B=this.keys[A];if(typeof B!="undefined"){delete this.map[B]}this.keys.splice(A,1);this.fireEvent("remove",C,B);return C}return false},removeKey:function(A){return this.removeAt(this.indexOfKey(A))},getCount:function(){return this.length},indexOf:function(A){return this.items.indexOf(A)},indexOfKey:function(A){return this.keys.indexOf(A)},item:function(A){var B=typeof this.map[A]!="undefined"?this.map[A]:this.items[A];return typeof B!="function"||this.allowFunctions?B:null},itemAt:function(A){return this.items[A]},key:function(A){return this.map[A]},contains:function(A){return this.indexOf(A)!=-1},containsKey:function(A){return typeof this.map[A]!="undefined"},clear:function(){this.length=0;this.items=[];this.keys=[];this.map={};this.fireEvent("clear")},first:function(){return this.items[0]},last:function(){return this.items[this.length-1]},_sort:function(I,A,H){var C=String(A).toUpperCase()=="DESC"?-1:1;H=H||function(K,J){return K-J};var G=[],B=this.keys,F=this.items;for(var D=0,E=F.length;D=A;C--){D[D.length]=B[C]}}return D},filter:function(C,B,D,A){if(Ext.isEmpty(B,false)){return this.clone()}B=this.createValueMatcher(B,D,A);return this.filterBy(function(E){return E&&B.test(E[C])})},filterBy:function(F,E){var G=new Ext.util.MixedCollection();G.getKey=this.getKey;var B=this.keys,D=this.items;for(var C=0,A=D.length;C0){for(var C=0;Clen){return value.substr(0,len-3)+"..."}return value},undef:function(value){return value!==undefined?value:""},defaultValue:function(value,defaultValue){return value!==undefined&&value!==""?value:defaultValue},htmlEncode:function(value){return !value?value:String(value).replace(/&/g,"&").replace(/>/g,">").replace(/").replace(/</g,"<").replace(/"/g,"\"").replace(/&/g,"&")},trim:function(value){return String(value).replace(trimRe,"")},substr:function(value,start,length){return String(value).substr(start,length)},lowercase:function(value){return String(value).toLowerCase()},uppercase:function(value){return String(value).toUpperCase()},capitalize:function(value){return !value?value:value.charAt(0).toUpperCase()+value.substr(1).toLowerCase()},call:function(value,fn){if(arguments.length>2){var args=Array.prototype.slice.call(arguments,2);args.unshift(value);return eval(fn).apply(window,args)}else{return eval(fn).call(window,value)}},usMoney:function(v){v=(Math.round((v-0)*100))/100;v=(v==Math.floor(v))?v+".00":((v*10==Math.floor(v*10))?v+"0":v);v=String(v);var ps=v.split(".");var whole=ps[0];var sub=ps[1]?"."+ps[1]:".00";var r=/(\d+)(\d{3})/;while(r.test(whole)){whole=whole.replace(r,"$1"+","+"$2")}v=whole+sub;if(v.charAt(0)=="-"){return"-$"+v.substr(1)}return"$"+v},date:function(v,format){if(!v){return""}if(!Ext.isDate(v)){v=new Date(Date.parse(v))}return v.dateFormat(format||"m/d/Y")},dateRenderer:function(format){return function(v){return Ext.util.Format.date(v,format)}},stripTagsRE:/<\/?[^>]+>/gi,stripTags:function(v){return !v?v:String(v).replace(this.stripTagsRE,"")},stripScriptsRe:/(?:)((\n|\r|.)*?)(?:<\/script>)/ig,stripScripts:function(v){return !v?v:String(v).replace(this.stripScriptsRe,"")},fileSize:function(size){if(size<1024){return size+" bytes"}else{if(size<1048576){return(Math.round(((size*10)/1024))/10)+" KB"}else{return(Math.round(((size*10)/1048576))/10)+" MB"}}},math:function(){var fns={};return function(v,a){if(!fns[a]){fns[a]=new Function("v","return v "+a+";")}return fns[a](v)}}(),nl2br:function(v){return v===undefined||v===null?"":v.replace(/\n/g,"
      ")}}}(); +Ext.XTemplate=function(){Ext.XTemplate.superclass.constructor.apply(this,arguments);var P=this.html;P=["",P,""].join("");var O=/]*>((?:(?=([^<]+))\2|<(?!tpl\b[^>]*>))*?)<\/tpl>/;var N=/^]*?for="(.*?)"/;var L=/^]*?if="(.*?)"/;var J=/^]*?exec="(.*?)"/;var C,B=0;var G=[];while(C=P.match(O)){var M=C[0].match(N);var K=C[0].match(L);var I=C[0].match(J);var E=null,H=null,D=null;var A=M&&M[1]?M[1]:"";if(K){E=K&&K[1]?K[1]:null;if(E){H=new Function("values","parent","xindex","xcount","with(values){ return "+(Ext.util.Format.htmlDecode(E))+"; }")}}if(I){E=I&&I[1]?I[1]:null;if(E){D=new Function("values","parent","xindex","xcount","with(values){ "+(Ext.util.Format.htmlDecode(E))+"; }")}}if(A){switch(A){case".":A=new Function("values","parent","with(values){ return values; }");break;case"..":A=new Function("values","parent","with(values){ return parent; }");break;default:A=new Function("values","parent","with(values){ return "+A+"; }")}}G.push({id:B,target:A,exec:D,test:H,body:C[1]||""});P=P.replace(C[0],"{xtpl"+B+"}");++B}for(var F=G.length-1;F>=0;--F){this.compileTpl(G[F])}this.master=G[G.length-1];this.tpls=G};Ext.extend(Ext.XTemplate,Ext.Template,{re:/\{([\w-\.\#]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?(\s?[\+\-\*\\]\s?[\d\.\+\-\*\\\(\)]+)?\}/g,codeRe:/\{\[((?:\\\]|.|\n)*?)\]\}/g,applySubTemplate:function(A,H,G,D,C){var J=this.tpls[A];if(J.test&&!J.test.call(this,H,G,D,C)){return""}if(J.exec&&J.exec.call(this,H,G,D,C)){return""}var I=J.target?J.target.call(this,H,G):H;G=J.target?H:G;if(J.target&&Ext.isArray(I)){var B=[];for(var E=0,F=I.length;E=0;--E){D[H[E].selectorText]=H[E]}}catch(G){}},getRules:function(F){if(D==null||F){D={};var H=C.styleSheets;for(var G=0,E=H.length;G=37&&A<=40){C.stopEvent()}},relay:function(C){var A=C.getKey();var B=this.keyToHandler[A];if(B&&this[B]){if(this.doRelay(C,this[B],B)!==true){C[this.defaultEventAction]()}}},doRelay:function(C,B,A){return B.call(this.scope||this,C)},enter:false,left:false,right:false,up:false,down:false,tab:false,esc:false,pageUp:false,pageDown:false,del:false,home:false,end:false,keyToHandler:{37:"left",39:"right",38:"up",40:"down",33:"pageUp",34:"pageDown",46:"del",36:"home",35:"end",13:"enter",27:"esc",9:"tab"},enable:function(){if(this.disabled){if(this.forceKeyDown||Ext.isIE||Ext.isSafari3||Ext.isAir){this.el.on("keydown",this.relay,this)}else{this.el.on("keydown",this.prepareEvent,this);this.el.on("keypress",this.relay,this)}this.disabled=false}},disable:function(){if(!this.disabled){if(this.forceKeyDown||Ext.isIE||Ext.isSafari3||Ext.isAir){this.el.un("keydown",this.relay)}else{this.el.un("keydown",this.prepareEvent);this.el.un("keypress",this.relay)}this.disabled=true}}}; +Ext.KeyMap=function(C,B,A){this.el=Ext.get(C);this.eventName=A||"keydown";this.bindings=[];if(B){this.addBinding(B)}this.enable()};Ext.KeyMap.prototype={stopEvent:false,addBinding:function(D){if(Ext.isArray(D)){for(var F=0,H=D.length;F=this.minX;D=D-C){if(!E[D]){this.xTicks[this.xTicks.length]=D;E[D]=true}}for(D=this.initPageX;D<=this.maxX;D=D+C){if(!E[D]){this.xTicks[this.xTicks.length]=D;E[D]=true}}this.xTicks.sort(this.DDM.numericSort)},setYTicks:function(F,C){this.yTicks=[];this.yTickSize=C;var E={};for(var D=this.initPageY;D>=this.minY;D=D-C){if(!E[D]){this.yTicks[this.yTicks.length]=D;E[D]=true}}for(D=this.initPageY;D<=this.maxY;D=D+C){if(!E[D]){this.yTicks[this.yTicks.length]=D;E[D]=true}}this.yTicks.sort(this.DDM.numericSort)},setXConstraint:function(E,D,C){this.leftConstraint=E;this.rightConstraint=D;this.minX=this.initPageX-E;this.maxX=this.initPageX+D;if(C){this.setXTicks(this.initPageX,C)}this.constrainX=true},clearConstraints:function(){this.constrainX=false;this.constrainY=false;this.clearTicks()},clearTicks:function(){this.xTicks=null;this.yTicks=null;this.xTickSize=0;this.yTickSize=0},setYConstraint:function(C,E,D){this.topConstraint=C;this.bottomConstraint=E;this.minY=this.initPageY-C;this.maxY=this.initPageY+E;if(D){this.setYTicks(this.initPageY,D)}this.constrainY=true},resetConstraints:function(){if(this.initPageX||this.initPageX===0){var D=(this.maintainOffset)?this.lastPageX-this.initPageX:0;var C=(this.maintainOffset)?this.lastPageY-this.initPageY:0;this.setInitPosition(D,C)}else{this.setInitPosition()}if(this.constrainX){this.setXConstraint(this.leftConstraint,this.rightConstraint,this.xTickSize)}if(this.constrainY){this.setYConstraint(this.topConstraint,this.bottomConstraint,this.yTickSize)}},getTick:function(I,F){if(!F){return I}else{if(F[0]>=I){return F[0]}else{for(var D=0,C=F.length;D=I){var H=I-F[D];var G=F[E]-I;return(G>H)?F[D]:F[E]}}return F[F.length-1]}}},toString:function(){return("DragDrop "+this.id)}}})();if(!Ext.dd.DragDropMgr){Ext.dd.DragDropMgr=function(){var A=Ext.EventManager;return{ids:{},handleIds:{},dragCurrent:null,dragOvers:{},deltaX:0,deltaY:0,preventDefault:true,stopPropagation:true,initialized:false,locked:false,init:function(){this.initialized=true},POINT:0,INTERSECT:1,mode:0,_execOnAll:function(D,C){for(var E in this.ids){for(var B in this.ids[E]){var F=this.ids[E][B];if(!this.isTypeOfDD(F)){continue}F[D].apply(F,C)}}},_onLoad:function(){this.init();A.on(document,"mouseup",this.handleMouseUp,this,true);A.on(document,"mousemove",this.handleMouseMove,this,true);A.on(window,"unload",this._onUnload,this,true);A.on(window,"resize",this._onResize,this,true)},_onResize:function(B){this._execOnAll("resetConstraints",[])},lock:function(){this.locked=true},unlock:function(){this.locked=false},isLocked:function(){return this.locked},locationCache:{},useCache:true,clickPixelThresh:3,clickTimeThresh:350,dragThreshMet:false,clickTimeout:null,startX:0,startY:0,regDragDrop:function(C,B){if(!this.initialized){this.init()}if(!this.ids[B]){this.ids[B]={}}this.ids[B][C.id]=C},removeDDFromGroup:function(D,B){if(!this.ids[B]){this.ids[B]={}}var C=this.ids[B];if(C&&C[D.id]){delete C[D.id]}},_remove:function(C){for(var B in C.groups){if(B&&this.ids[B][C.id]){delete this.ids[B][C.id]}}delete this.handleIds[C.id]},regHandle:function(C,B){if(!this.handleIds[C]){this.handleIds[C]={}}this.handleIds[C][B]=B},isDragDrop:function(B){return(this.getDDById(B))?true:false},getRelated:function(F,C){var E=[];for(var D in F.groups){for(j in this.ids[D]){var B=this.ids[D][j];if(!this.isTypeOfDD(B)){continue}if(!C||B.isTarget){E[E.length]=B}}}return E},isLegalTarget:function(F,E){var C=this.getRelated(F,true);for(var D=0,B=C.length;Dthis.clickPixelThresh||B>this.clickPixelThresh){this.startDrag(this.startX,this.startY)}}if(this.dragThreshMet){this.dragCurrent.b4Drag(D);this.dragCurrent.onDrag(D);if(!this.dragCurrent.moveOnly){this.fireEvents(D,false)}}this.stopEvent(D);return true},fireEvents:function(K,L){var N=this.dragCurrent;if(!N||N.isLocked()){return }var O=K.getPoint();var B=[];var E=[];var I=[];var G=[];var D=[];for(var F in this.dragOvers){var C=this.dragOvers[F];if(!this.isTypeOfDD(C)){continue}if(!this.isOverTarget(O,C,this.mode)){E.push(C)}B[F]=true;delete this.dragOvers[F]}for(var M in N.groups){if("string"!=typeof M){continue}for(F in this.ids[M]){var H=this.ids[M][F];if(!this.isTypeOfDD(H)){continue}if(H.isTarget&&!H.isLocked()&&H!=N){if(this.isOverTarget(O,H,this.mode)){if(L){G.push(H)}else{if(!B[H.id]){D.push(H)}else{I.push(H)}this.dragOvers[H.id]=H}}}}}if(this.mode){if(E.length){N.b4DragOut(K,E);N.onDragOut(K,E)}if(D.length){N.onDragEnter(K,D)}if(I.length){N.b4DragOver(K,I);N.onDragOver(K,I)}if(G.length){N.b4DragDrop(K,G);N.onDragDrop(K,G)}}else{var J=0;for(F=0,J=E.length;F2000){}else{setTimeout(B._addListeners,10);if(document&&document.body){B._timeoutCount+=1}}}},handleWasClicked:function(B,D){if(this.isHandle(D,B.id)){return true}else{var C=B.parentNode;while(C){if(this.isHandle(D,C.id)){return true}else{C=C.parentNode}}}return false}}}();Ext.dd.DDM=Ext.dd.DragDropMgr;Ext.dd.DDM._addListeners()}Ext.dd.DD=function(C,A,B){if(C){this.init(C,A,B)}};Ext.extend(Ext.dd.DD,Ext.dd.DragDrop,{scroll:true,autoOffset:function(C,B){var A=C-this.startPageX;var D=B-this.startPageY;this.setDelta(A,D)},setDelta:function(B,A){this.deltaX=B;this.deltaY=A},setDragElPos:function(C,B){var A=this.getDragEl();this.alignElWithMouse(A,C,B)},alignElWithMouse:function(C,G,F){var E=this.getTargetCoord(G,F);var B=C.dom?C:Ext.fly(C,"_dd");if(!this.deltaSetXY){var H=[E.x,E.y];B.setXY(H);var D=B.getLeft(true);var A=B.getTop(true);this.deltaSetXY=[D-E.x,A-E.y]}else{B.setLeftTop(E.x+this.deltaSetXY[0],E.y+this.deltaSetXY[1])}this.cachePosition(E.x,E.y);this.autoScroll(E.x,E.y,C.offsetHeight,C.offsetWidth);return E},cachePosition:function(B,A){if(B){this.lastPageX=B;this.lastPageY=A}else{var C=Ext.lib.Dom.getXY(this.getEl());this.lastPageX=C[0];this.lastPageY=C[1]}},autoScroll:function(J,I,E,K){if(this.scroll){var L=Ext.lib.Dom.getViewHeight();var B=Ext.lib.Dom.getViewWidth();var N=this.DDM.getScrollTop();var D=this.DDM.getScrollLeft();var H=E+I;var M=K+J;var G=(L+N-I-this.deltaY);var F=(B+D-J-this.deltaX);var C=40;var A=(document.all)?80:30;if(H>L&&G0&&I-NB&&F0&&J-Dthis.maxX){A=this.maxX}}if(this.constrainY){if(Dthis.maxY){D=this.maxY}}A=this.getTick(A,this.xTicks);D=this.getTick(D,this.yTicks);return{x:A,y:D}},applyConfig:function(){Ext.dd.DD.superclass.applyConfig.call(this);this.scroll=(this.config.scroll!==false)},b4MouseDown:function(A){this.autoOffset(A.getPageX(),A.getPageY())},b4Drag:function(A){this.setDragElPos(A.getPageX(),A.getPageY())},toString:function(){return("DD "+this.id)}});Ext.dd.DDProxy=function(C,A,B){if(C){this.init(C,A,B);this.initFrame()}};Ext.dd.DDProxy.dragElId="ygddfdiv";Ext.extend(Ext.dd.DDProxy,Ext.dd.DD,{resizeFrame:true,centerFrame:false,createFrame:function(){var B=this;var A=document.body;if(!A||!A.firstChild){setTimeout(function(){B.createFrame()},50);return }var D=this.getDragEl();if(!D){D=document.createElement("div");D.id=this.dragElId;var C=D.style;C.position="absolute";C.visibility="hidden";C.cursor="move";C.border="2px solid #aaa";C.zIndex=999;A.insertBefore(D,A.firstChild)}},initFrame:function(){this.createFrame()},applyConfig:function(){Ext.dd.DDProxy.superclass.applyConfig.call(this);this.resizeFrame=(this.config.resizeFrame!==false);this.centerFrame=(this.config.centerFrame);this.setDragElId(this.config.dragElId||Ext.dd.DDProxy.dragElId)},showFrame:function(E,D){var C=this.getEl();var A=this.getDragEl();var B=A.style;this._resizeProxy();if(this.centerFrame){this.setDelta(Math.round(parseInt(B.width,10)/2),Math.round(parseInt(B.height,10)/2))}this.setDragElPos(E,D);Ext.fly(A).show()},_resizeProxy:function(){if(this.resizeFrame){var A=this.getEl();Ext.fly(this.getDragEl()).setSize(A.offsetWidth,A.offsetHeight)}},b4MouseDown:function(B){var A=B.getPageX();var C=B.getPageY();this.autoOffset(A,C);this.setDragElPos(A,C)},b4StartDrag:function(A,B){this.showFrame(A,B)},b4EndDrag:function(A){Ext.fly(this.getDragEl()).hide()},endDrag:function(C){var B=this.getEl();var A=this.getDragEl();A.style.visibility="";this.beforeMove();B.style.visibility="hidden";Ext.dd.DDM.moveToEl(B,A);A.style.visibility="hidden";B.style.visibility="";this.afterDrag()},beforeMove:function(){},afterDrag:function(){},toString:function(){return("DDProxy "+this.id)}});Ext.dd.DDTarget=function(C,A,B){if(C){this.initTarget(C,A,B)}};Ext.extend(Ext.dd.DDTarget,Ext.dd.DragDrop,{toString:function(){return("DDTarget "+this.id)}}); +Ext.dd.DragTracker=function(A){Ext.apply(this,A);this.addEvents("mousedown","mouseup","mousemove","dragstart","dragend","drag");this.dragRegion=new Ext.lib.Region(0,0,0,0);if(this.el){this.initEl(this.el)}};Ext.extend(Ext.dd.DragTracker,Ext.util.Observable,{active:false,tolerance:5,autoStart:false,initEl:function(A){this.el=Ext.get(A);A.on("mousedown",this.onMouseDown,this,this.delegate?{delegate:this.delegate}:undefined)},destroy:function(){this.el.un("mousedown",this.onMouseDown,this)},onMouseDown:function(C,B){if(this.fireEvent("mousedown",this,C)!==false&&this.onBeforeStart(C)!==false){this.startXY=this.lastXY=C.getXY();this.dragTarget=this.delegate?B:this.el.dom;C.preventDefault();var A=Ext.getDoc();A.on("mouseup",this.onMouseUp,this);A.on("mousemove",this.onMouseMove,this);A.on("selectstart",this.stopSelect,this);if(this.autoStart){this.timer=this.triggerStart.defer(this.autoStart===true?1000:this.autoStart,this)}}},onMouseMove:function(D,C){D.preventDefault();var B=D.getXY(),A=this.startXY;this.lastXY=B;if(!this.active){if(Math.abs(A[0]-B[0])>this.tolerance||Math.abs(A[1]-B[1])>this.tolerance){this.triggerStart()}else{return }}this.fireEvent("mousemove",this,D);this.onDrag(D);this.fireEvent("drag",this,D)},onMouseUp:function(B){var A=Ext.getDoc();A.un("mousemove",this.onMouseMove,this);A.un("mouseup",this.onMouseUp,this);A.un("selectstart",this.stopSelect,this);B.preventDefault();this.clearStart();this.active=false;delete this.elRegion;this.fireEvent("mouseup",this,B);this.onEnd(B);this.fireEvent("dragend",this,B)},triggerStart:function(A){this.clearStart();this.active=true;this.onStart(this.startXY);this.fireEvent("dragstart",this,this.startXY)},clearStart:function(){if(this.timer){clearTimeout(this.timer);delete this.timer}},stopSelect:function(A){A.stopEvent();return false},onBeforeStart:function(A){},onStart:function(A){},onDrag:function(A){},onEnd:function(A){},getDragTarget:function(){return this.dragTarget},getDragCt:function(){return this.el},getXY:function(A){return A?this.constrainModes[A].call(this,this.lastXY):this.lastXY},getOffset:function(C){var B=this.getXY(C);var A=this.startXY;return[A[0]-B[0],A[1]-B[1]]},constrainModes:{"point":function(B){if(!this.elRegion){this.elRegion=this.getDragCt().getRegion()}var A=this.dragRegion;A.left=B[0];A.top=B[1];A.right=B[0];A.bottom=B[1];A.constrainTo(this.elRegion);return[A.left,A.top]}}}); +Ext.dd.ScrollManager=function(){var C=Ext.dd.DragDropMgr;var E={};var B=null;var H={};var G=function(K){B=null;A()};var I=function(){if(C.dragCurrent){C.refreshCache(C.dragCurrent.groups)}};var D=function(){if(C.dragCurrent){var K=Ext.dd.ScrollManager;var L=H.el.ddScrollConfig?H.el.ddScrollConfig.increment:K.increment;if(!K.animate){if(H.el.scroll(H.dir,L)){I()}}else{H.el.scroll(H.dir,L,true,K.animDuration,I)}}};var A=function(){if(H.id){clearInterval(H.id)}H.id=0;H.el=null;H.dir=""};var F=function(L,K){A();H.el=L;H.dir=K;var M=(L.ddScrollConfig&&L.ddScrollConfig.frequency)?L.ddScrollConfig.frequency:Ext.dd.ScrollManager.frequency;H.id=setInterval(D,M)};var J=function(N,P){if(P||!C.dragCurrent){return }var Q=Ext.dd.ScrollManager;if(!B||B!=C.dragCurrent){B=C.dragCurrent;Q.refreshCache()}var R=Ext.lib.Event.getXY(N);var S=new Ext.lib.Point(R[0],R[1]);for(var L in E){var M=E[L],K=M._region;var O=M.ddScrollConfig?M.ddScrollConfig:Q;if(K&&K.contains(S)&&M.isScrollable()){if(K.bottom-S.y<=O.vthresh){if(H.el!=M){F(M,"down")}return }else{if(K.right-S.x<=O.hthresh){if(H.el!=M){F(M,"left")}return }else{if(S.y-K.top<=O.vthresh){if(H.el!=M){F(M,"up")}return }else{if(S.x-K.left<=O.hthresh){if(H.el!=M){F(M,"right")}return }}}}}}A()};C.fireEvents=C.fireEvents.createSequence(J,C);C.stopDrag=C.stopDrag.createSequence(G,C);return{register:function(M){if(Ext.isArray(M)){for(var L=0,K=M.length;L]+>/gi,asText:function(A){return String(A).replace(this.stripTagsRE,"")},asUCText:function(A){return String(A).toUpperCase().replace(this.stripTagsRE,"")},asUCString:function(A){return String(A).toUpperCase()},asDate:function(A){if(!A){return 0}if(Ext.isDate(A)){return A.getTime()}return Date.parse(String(A))},asFloat:function(A){var B=parseFloat(String(A).replace(/,/g,""));if(isNaN(B)){B=0}return B},asInt:function(A){var B=parseInt(String(A).replace(/,/g,""));if(isNaN(B)){B=0}return B}}; +Ext.data.Record=function(A,B){this.id=(B||B===0)?B:++Ext.data.Record.AUTO_ID;this.data=A};Ext.data.Record.create=function(E){var C=Ext.extend(Ext.data.Record,{});var D=C.prototype;D.fields=new Ext.util.MixedCollection(false,function(F){return F.name});for(var B=0,A=E.length;BG?1:(H0},isExpandable:function(){return this.attributes.expandable||this.hasChildNodes()},appendChild:function(E){var F=false;if(Ext.isArray(E)){F=E}else{if(arguments.length>1){F=arguments}}if(F){for(var D=0,A=F.length;D0){var F=D?function(){E.apply(D,arguments)}:E;C.sort(F);for(var B=0;BG+L.left){H=G-I-this.shadowOffset;E=true}if((F+D)>C+L.top){F=C-D-this.shadowOffset;E=true}if(H=J){F=J-D-5}}K=[H,F];this.storeXY(K);A.setXY.call(this,K);this.sync()}}},isVisible:function(){return this.visible},showAction:function(){this.visible=true;if(this.useDisplay===true){this.setDisplayed("")}else{if(this.lastXY){A.setXY.call(this,this.lastXY)}else{if(this.lastLT){A.setLeftTop.call(this,this.lastLT[0],this.lastLT[1])}}}},hideAction:function(){this.visible=false;if(this.useDisplay===true){this.setDisplayed(false)}else{this.setLeftTop(-10000,-10000)}},setVisible:function(E,D,G,H,F){if(E){this.showAction()}if(D&&E){var C=function(){this.sync(true);if(H){H()}}.createDelegate(this);A.setVisible.call(this,true,true,G,C,F)}else{if(!E){this.hideUnders(true)}var C=H;if(D){C=function(){this.hideAction();if(H){H()}}.createDelegate(this)}A.setVisible.call(this,E,D,G,C,F);if(E){this.sync(true)}else{if(!D){this.hideAction()}}}},storeXY:function(C){delete this.lastLT;this.lastXY=C},storeLeftTop:function(D,C){delete this.lastXY;this.lastLT=[D,C]},beforeFx:function(){this.beforeAction();return Ext.Layer.superclass.beforeFx.apply(this,arguments)},afterFx:function(){Ext.Layer.superclass.afterFx.apply(this,arguments);this.sync(this.isVisible())},beforeAction:function(){if(!this.updating&&this.shadow){this.shadow.hide()}},setLeft:function(C){this.storeLeftTop(C,this.getTop(true));A.setLeft.apply(this,arguments);this.sync()},setTop:function(C){this.storeLeftTop(this.getLeft(true),C);A.setTop.apply(this,arguments);this.sync()},setLeftTop:function(D,C){this.storeLeftTop(D,C);A.setLeftTop.apply(this,arguments);this.sync()},setXY:function(F,D,G,H,E){this.fixDisplay();this.beforeAction();this.storeXY(F);var C=this.createCB(H);A.setXY.call(this,F,D,G,C,E);if(!D){C()}},createCB:function(D){var C=this;return function(){C.constrainXY();C.sync(true);if(D){D()}}},setX:function(C,D,F,G,E){this.setXY([C,this.getY()],D,F,G,E)},setY:function(G,C,E,F,D){this.setXY([this.getX(),G],C,E,F,D)},setSize:function(E,F,D,H,I,G){this.beforeAction();var C=this.createCB(I);A.setSize.call(this,E,F,D,H,C,G);if(!D){C()}},setWidth:function(E,D,G,H,F){this.beforeAction();var C=this.createCB(H);A.setWidth.call(this,E,D,G,C,F);if(!D){C()}},setHeight:function(E,D,G,H,F){this.beforeAction();var C=this.createCB(H);A.setHeight.call(this,E,D,G,C,F);if(!D){C()}},setBounds:function(J,H,K,D,I,F,G,E){this.beforeAction();var C=this.createCB(G);if(!I){this.storeXY([J,H]);A.setXY.call(this,[J,H]);A.setSize.call(this,K,D,I,F,C,E);C()}else{A.setBounds.call(this,J,H,K,D,I,F,C,E)}return this},setZIndex:function(C){this.zindex=C;this.setStyle("z-index",C+2);if(this.shadow){this.shadow.setZIndex(C+1)}if(this.shim){this.shim.setStyle("z-index",C)}}})})(); +Ext.Shadow=function(C){Ext.apply(this,C);if(typeof this.mode!="string"){this.mode=this.defaultMode}var D=this.offset,B={h:0};var A=Math.floor(this.offset/2);switch(this.mode.toLowerCase()){case"drop":B.w=0;B.l=B.t=D;B.t-=1;if(Ext.isIE){B.l-=this.offset+A;B.t-=this.offset+A;B.w-=A;B.h-=A;B.t+=1}break;case"sides":B.w=(D*2);B.l=-D;B.t=D-1;if(Ext.isIE){B.l-=(this.offset-A);B.t-=this.offset+A;B.l+=1;B.w-=(this.offset-A)*2;B.w-=A+1;B.h-=1}break;case"frame":B.w=B.h=(D*2);B.l=B.t=-D;B.t+=1;B.h-=2;if(Ext.isIE){B.l-=(this.offset-A);B.t-=(this.offset-A);B.l+=1;B.w-=(this.offset+A+1);B.h-=(this.offset+A);B.h+=1}break}this.adjusts=B};Ext.Shadow.prototype={offset:4,defaultMode:"drop",show:function(A){A=Ext.get(A);if(!this.el){this.el=Ext.Shadow.Pool.pull();if(this.el.dom.nextSibling!=A.dom){this.el.insertBefore(A)}}this.el.setStyle("z-index",this.zIndex||parseInt(A.getStyle("z-index"),10)-1);if(Ext.isIE){this.el.dom.style.filter="progid:DXImageTransform.Microsoft.alpha(opacity=50) progid:DXImageTransform.Microsoft.Blur(pixelradius="+(this.offset)+")"}this.realign(A.getLeft(true),A.getTop(true),A.getWidth(),A.getHeight());this.el.dom.style.display="block"},isVisible:function(){return this.el?true:false},realign:function(A,M,L,D){if(!this.el){return }var I=this.adjusts,G=this.el.dom,N=G.style;var E=0;N.left=(A+I.l)+"px";N.top=(M+I.t)+"px";var K=(L+I.w),C=(D+I.h),F=K+"px",J=C+"px";if(N.width!=F||N.height!=J){N.width=F;N.height=J;if(!Ext.isIE){var H=G.childNodes;var B=Math.max(0,(K-12))+"px";H[0].childNodes[1].style.width=B;H[1].childNodes[1].style.width=B;H[2].childNodes[1].style.width=B;H[1].style.height=Math.max(0,(C-12))+"px"}}},hide:function(){if(this.el){this.el.dom.style.display="none";Ext.Shadow.Pool.push(this.el);delete this.el}},setZIndex:function(A){this.zIndex=A;if(this.el){this.el.setStyle("z-index",A)}}};Ext.Shadow.Pool=function(){var B=[];var A=Ext.isIE?"
      ":"
      ";return{pull:function(){var C=B.shift();if(!C){C=Ext.get(Ext.DomHelper.insertHtml("beforeBegin",document.body.firstChild,A));C.autoBoxAdjust=false}return C},push:function(C){B.push(C)}}}(); +Ext.BoxComponent=Ext.extend(Ext.Component,{initComponent:function(){Ext.BoxComponent.superclass.initComponent.call(this);this.addEvents("resize","move")},boxReady:false,deferHeight:false,setSize:function(B,D){if(typeof B=="object"){D=B.height;B=B.width}if(!this.boxReady){this.width=B;this.height=D;return this}if(this.lastSize&&this.lastSize.width==B&&this.lastSize.height==D){return this}this.lastSize={width:B,height:D};var C=this.adjustSize(B,D);var F=C.width,A=C.height;if(F!==undefined||A!==undefined){var E=this.getResizeEl();if(!this.deferHeight&&F!==undefined&&A!==undefined){E.setSize(F,A)}else{if(!this.deferHeight&&A!==undefined){E.setHeight(A)}else{if(F!==undefined){E.setWidth(F)}}}this.onResize(F,A,B,D);this.fireEvent("resize",this,F,A,B,D)}return this},setWidth:function(A){return this.setSize(A)},setHeight:function(A){return this.setSize(undefined,A)},getSize:function(){return this.el.getSize()},getPosition:function(A){if(A===true){return[this.el.getLeft(true),this.el.getTop(true)]}return this.xy||this.el.getXY()},getBox:function(A){var B=this.el.getSize();if(A===true){B.x=this.el.getLeft(true);B.y=this.el.getTop(true)}else{var C=this.xy||this.el.getXY();B.x=C[0];B.y=C[1]}return B},updateBox:function(A){this.setSize(A.width,A.height);this.setPagePosition(A.x,A.y);return this},getResizeEl:function(){return this.resizeEl||this.el},getPositionEl:function(){return this.positionEl||this.el},setPosition:function(A,F){if(A&&typeof A[1]=="number"){F=A[1];A=A[0]}this.x=A;this.y=F;if(!this.boxReady){return this}var B=this.adjustPosition(A,F);var E=B.x,D=B.y;var C=this.getPositionEl();if(E!==undefined||D!==undefined){if(E!==undefined&&D!==undefined){C.setLeftTop(E,D)}else{if(E!==undefined){C.setLeft(E)}else{if(D!==undefined){C.setTop(D)}}}this.onPosition(E,D);this.fireEvent("move",this,E,D)}return this},setPagePosition:function(A,C){if(A&&typeof A[1]=="number"){C=A[1];A=A[0]}this.pageX=A;this.pageY=C;if(!this.boxReady){return }if(A===undefined||C===undefined){return }var B=this.el.translatePoints(A,C);this.setPosition(B.left,B.top);return this},onRender:function(B,A){Ext.BoxComponent.superclass.onRender.call(this,B,A);if(this.resizeEl){this.resizeEl=Ext.get(this.resizeEl)}if(this.positionEl){this.positionEl=Ext.get(this.positionEl)}},afterRender:function(){Ext.BoxComponent.superclass.afterRender.call(this);this.boxReady=true;this.setSize(this.width,this.height);if(this.x||this.y){this.setPosition(this.x,this.y)}else{if(this.pageX||this.pageY){this.setPagePosition(this.pageX,this.pageY)}}},syncSize:function(){delete this.lastSize;this.setSize(this.autoWidth?undefined:this.el.getWidth(),this.autoHeight?undefined:this.el.getHeight());return this},onResize:function(D,B,A,C){},onPosition:function(A,B){},adjustSize:function(A,B){if(this.autoWidth){A="auto"}if(this.autoHeight){B="auto"}return{width:A,height:B}},adjustPosition:function(A,B){return{x:A,y:B}}});Ext.reg("box",Ext.BoxComponent); +Ext.SplitBar=function(C,E,B,D,A){this.el=Ext.get(C,true);this.el.dom.unselectable="on";this.resizingEl=Ext.get(E,true);this.orientation=B||Ext.SplitBar.HORIZONTAL;this.minSize=0;this.maxSize=2000;this.animate=false;this.useShim=false;this.shim=null;if(!A){this.proxy=Ext.SplitBar.createProxy(this.orientation)}else{this.proxy=Ext.get(A).dom}this.dd=new Ext.dd.DDProxy(this.el.dom.id,"XSplitBars",{dragElId:this.proxy.id});this.dd.b4StartDrag=this.onStartProxyDrag.createDelegate(this);this.dd.endDrag=this.onEndProxyDrag.createDelegate(this);this.dragSpecs={};this.adapter=new Ext.SplitBar.BasicLayoutAdapter();this.adapter.init(this);if(this.orientation==Ext.SplitBar.HORIZONTAL){this.placement=D||(this.el.getX()>this.resizingEl.getX()?Ext.SplitBar.LEFT:Ext.SplitBar.RIGHT);this.el.addClass("x-splitbar-h")}else{this.placement=D||(this.el.getY()>this.resizingEl.getY()?Ext.SplitBar.TOP:Ext.SplitBar.BOTTOM);this.el.addClass("x-splitbar-v")}this.addEvents("resize","moved","beforeresize","beforeapply");Ext.SplitBar.superclass.constructor.call(this)};Ext.extend(Ext.SplitBar,Ext.util.Observable,{onStartProxyDrag:function(A,E){this.fireEvent("beforeresize",this);this.overlay=Ext.DomHelper.append(document.body,{cls:"x-drag-overlay",html:" "},true);this.overlay.unselectable();this.overlay.setSize(Ext.lib.Dom.getViewWidth(true),Ext.lib.Dom.getViewHeight(true));this.overlay.show();Ext.get(this.proxy).setDisplayed("block");var C=this.adapter.getElementSize(this);this.activeMinSize=this.getMinimumSize();this.activeMaxSize=this.getMaximumSize();var D=C-this.activeMinSize;var B=Math.max(this.activeMaxSize-C,0);if(this.orientation==Ext.SplitBar.HORIZONTAL){this.dd.resetConstraints();this.dd.setXConstraint(this.placement==Ext.SplitBar.LEFT?D:B,this.placement==Ext.SplitBar.LEFT?B:D);this.dd.setYConstraint(0,0)}else{this.dd.resetConstraints();this.dd.setXConstraint(0,0);this.dd.setYConstraint(this.placement==Ext.SplitBar.TOP?D:B,this.placement==Ext.SplitBar.TOP?B:D)}this.dragSpecs.startSize=C;this.dragSpecs.startPoint=[A,E];Ext.dd.DDProxy.prototype.b4StartDrag.call(this.dd,A,E)},onEndProxyDrag:function(C){Ext.get(this.proxy).setDisplayed(false);var B=Ext.lib.Event.getXY(C);if(this.overlay){this.overlay.remove();delete this.overlay}var A;if(this.orientation==Ext.SplitBar.HORIZONTAL){A=this.dragSpecs.startSize+(this.placement==Ext.SplitBar.LEFT?B[0]-this.dragSpecs.startPoint[0]:this.dragSpecs.startPoint[0]-B[0])}else{A=this.dragSpecs.startSize+(this.placement==Ext.SplitBar.TOP?B[1]-this.dragSpecs.startPoint[1]:this.dragSpecs.startPoint[1]-B[1])}A=Math.min(Math.max(A,this.activeMinSize),this.activeMaxSize);if(A!=this.dragSpecs.startSize){if(this.fireEvent("beforeapply",this,A)!==false){this.adapter.setElementSize(this,A);this.fireEvent("moved",this,A);this.fireEvent("resize",this,A)}}},getAdapter:function(){return this.adapter},setAdapter:function(A){this.adapter=A;this.adapter.init(this)},getMinimumSize:function(){return this.minSize},setMinimumSize:function(A){this.minSize=A},getMaximumSize:function(){return this.maxSize},setMaximumSize:function(A){this.maxSize=A},setCurrentSize:function(B){var A=this.animate;this.animate=false;this.adapter.setElementSize(this,B);this.animate=A},destroy:function(A){if(this.shim){this.shim.remove()}this.dd.unreg();Ext.removeNode(this.proxy);if(A){this.el.remove()}}});Ext.SplitBar.createProxy=function(B){var C=new Ext.Element(document.createElement("div"));C.unselectable();var A="x-splitbar-proxy";C.addClass(A+" "+(B==Ext.SplitBar.HORIZONTAL?A+"-h":A+"-v"));document.body.appendChild(C.dom);return C.dom};Ext.SplitBar.BasicLayoutAdapter=function(){};Ext.SplitBar.BasicLayoutAdapter.prototype={init:function(A){},getElementSize:function(A){if(A.orientation==Ext.SplitBar.HORIZONTAL){return A.resizingEl.getWidth()}else{return A.resizingEl.getHeight()}},setElementSize:function(B,A,C){if(B.orientation==Ext.SplitBar.HORIZONTAL){if(!B.animate){B.resizingEl.setWidth(A);if(C){C(B,A)}}else{B.resizingEl.setWidth(A,true,0.1,C,"easeOut")}}else{if(!B.animate){B.resizingEl.setHeight(A);if(C){C(B,A)}}else{B.resizingEl.setHeight(A,true,0.1,C,"easeOut")}}}};Ext.SplitBar.AbsoluteLayoutAdapter=function(A){this.basic=new Ext.SplitBar.BasicLayoutAdapter();this.container=Ext.get(A)};Ext.SplitBar.AbsoluteLayoutAdapter.prototype={init:function(A){this.basic.init(A)},getElementSize:function(A){return this.basic.getElementSize(A)},setElementSize:function(B,A,C){this.basic.setElementSize(B,A,this.moveSplitter.createDelegate(this,[B]))},moveSplitter:function(A){var B=Ext.SplitBar;switch(A.placement){case B.LEFT:A.el.setX(A.resizingEl.getRight());break;case B.RIGHT:A.el.setStyle("right",(this.container.getWidth()-A.resizingEl.getLeft())+"px");break;case B.TOP:A.el.setY(A.resizingEl.getBottom());break;case B.BOTTOM:A.el.setY(A.resizingEl.getTop()-A.el.getHeight());break}}};Ext.SplitBar.VERTICAL=1;Ext.SplitBar.HORIZONTAL=2;Ext.SplitBar.LEFT=1;Ext.SplitBar.RIGHT=2;Ext.SplitBar.TOP=3;Ext.SplitBar.BOTTOM=4; +Ext.Container=Ext.extend(Ext.BoxComponent,{autoDestroy:true,defaultType:"panel",initComponent:function(){Ext.Container.superclass.initComponent.call(this);this.addEvents("afterlayout","beforeadd","beforeremove","add","remove");var A=this.items;if(A){delete this.items;if(Ext.isArray(A)){this.add.apply(this,A)}else{this.add(A)}}},initItems:function(){if(!this.items){this.items=new Ext.util.MixedCollection(false,this.getComponentId);this.getLayout()}},setLayout:function(A){if(this.layout&&this.layout!=A){this.layout.setContainer(null)}this.initItems();this.layout=A;A.setContainer(this)},render:function(){Ext.Container.superclass.render.apply(this,arguments);if(this.layout){if(typeof this.layout=="string"){this.layout=new Ext.Container.LAYOUTS[this.layout.toLowerCase()](this.layoutConfig)}this.setLayout(this.layout);if(this.activeItem!==undefined){var A=this.activeItem;delete this.activeItem;this.layout.setActiveItem(A);return }}if(!this.ownerCt){this.doLayout()}if(this.monitorResize===true){Ext.EventManager.onWindowResize(this.doLayout,this,[false])}},getLayoutTarget:function(){return this.el},getComponentId:function(A){return A.itemId||A.id},add:function(C){if(!this.items){this.initItems()}var B=arguments,A=B.length;if(A>1){for(var D=0;D2){for(var E=A-1;E>=1;--E){this.insert(D,B[E])}return }var F=this.lookupComponent(this.applyDefaults(C));if(F.ownerCt==this&&this.items.indexOf(F)0){B.setSize(A)}}});Ext.Container.LAYOUTS["fit"]=Ext.layout.FitLayout; +Ext.layout.CardLayout=Ext.extend(Ext.layout.FitLayout,{deferredRender:false,renderHidden:true,setActiveItem:function(A){A=this.container.getComponent(A);if(this.activeItem!=A){if(this.activeItem){this.activeItem.hide()}this.activeItem=A;A.show();this.layout()}},renderAll:function(A,B){if(this.deferredRender){this.renderItem(this.activeItem,undefined,B)}else{Ext.layout.CardLayout.superclass.renderAll.call(this,A,B)}}});Ext.Container.LAYOUTS["card"]=Ext.layout.CardLayout; +Ext.layout.AnchorLayout=Ext.extend(Ext.layout.ContainerLayout,{monitorResize:true,getAnchorViewSize:function(A,B){return B.dom==document.body?B.getViewSize():B.getStyleSize()},onLayout:function(F,I){Ext.layout.AnchorLayout.superclass.onLayout.call(this,F,I);var O=this.getAnchorViewSize(F,I);var M=O.width,E=O.height;if(M<20||E<20){return }var B,K;if(F.anchorSize){if(typeof F.anchorSize=="number"){B=F.anchorSize}else{B=F.anchorSize.width;K=F.anchorSize.height}}else{B=F.initialConfig.width;K=F.initialConfig.height}var H=F.items.items,G=H.length,D,J,L,C,A;for(D=0;D ");B.disableFormats=true;B.compile();Ext.layout.BorderLayout.Region.prototype.toolTemplate=B}this.collapsedEl=this.targetEl.createChild({cls:"x-layout-collapsed x-layout-collapsed-"+this.position,id:this.panel.id+"-xcollapsed"});this.collapsedEl.enableDisplayMode("block");if(this.collapseMode=="mini"){this.collapsedEl.addClass("x-layout-cmini-"+this.position);this.miniCollapsedEl=this.collapsedEl.createChild({cls:"x-layout-mini x-layout-mini-"+this.position,html:" "});this.miniCollapsedEl.addClassOnOver("x-layout-mini-over");this.collapsedEl.addClassOnOver("x-layout-collapsed-over");this.collapsedEl.on("click",this.onExpandClick,this,{stopEvent:true})}else{var A=this.toolTemplate.append(this.collapsedEl.dom,{id:"expand-"+this.position},true);A.addClassOnOver("x-tool-expand-"+this.position+"-over");A.on("click",this.onExpandClick,this,{stopEvent:true});if(this.floatable!==false){this.collapsedEl.addClassOnOver("x-layout-collapsed-over");this.collapsedEl.on("click",this.collapseClick,this)}}}return this.collapsedEl},onExpandClick:function(A){if(this.isSlid){this.afterSlideIn();this.panel.expand(false)}else{this.panel.expand()}},onCollapseClick:function(A){this.panel.collapse()},beforeCollapse:function(B,A){this.lastAnim=A;if(this.splitEl){this.splitEl.hide()}this.getCollapsedEl().show();this.panel.el.setStyle("z-index",100);this.isCollapsed=true;this.layout.layout()},onCollapse:function(A){this.panel.el.setStyle("z-index",1);if(this.lastAnim===false||this.panel.animCollapse===false){this.getCollapsedEl().dom.style.visibility="visible"}else{this.getCollapsedEl().slideIn(this.panel.slideAnchor,{duration:0.2})}this.state.collapsed=true;this.panel.saveState()},beforeExpand:function(A){var B=this.getCollapsedEl();this.el.show();if(this.position=="east"||this.position=="west"){this.panel.setSize(undefined,B.getHeight())}else{this.panel.setSize(B.getWidth(),undefined)}B.hide();B.dom.style.visibility="hidden";this.panel.el.setStyle("z-index",100)},onExpand:function(){this.isCollapsed=false;if(this.splitEl){this.splitEl.show()}this.layout.layout();this.panel.el.setStyle("z-index",1);this.state.collapsed=false;this.panel.saveState()},collapseClick:function(A){if(this.isSlid){A.stopPropagation();this.slideIn()}else{A.stopPropagation();this.slideOut()}},onHide:function(){if(this.isCollapsed){this.getCollapsedEl().hide()}else{if(this.splitEl){this.splitEl.hide()}}},onShow:function(){if(this.isCollapsed){this.getCollapsedEl().show()}else{if(this.splitEl){this.splitEl.show()}}},isVisible:function(){return !this.panel.hidden},getMargins:function(){return this.isCollapsed&&this.cmargins?this.cmargins:this.margins},getSize:function(){return this.isCollapsed?this.getCollapsedEl().getSize():this.panel.getSize()},setPanel:function(A){this.panel=A},getMinWidth:function(){return this.minWidth},getMinHeight:function(){return this.minHeight},applyLayoutCollapsed:function(A){var B=this.getCollapsedEl();B.setLeftTop(A.x,A.y);B.setSize(A.width,A.height)},applyLayout:function(A){if(this.isCollapsed){this.applyLayoutCollapsed(A)}else{this.panel.setPosition(A.x,A.y);this.panel.setSize(A.width,A.height)}},beforeSlide:function(){this.panel.beforeEffect()},afterSlide:function(){this.panel.afterEffect()},initAutoHide:function(){if(this.autoHide!==false){if(!this.autoHideHd){var A=new Ext.util.DelayedTask(this.slideIn,this);this.autoHideHd={"mouseout":function(B){if(!B.within(this.el,true)){A.delay(500)}},"mouseover":function(B){A.cancel()},scope:this}}this.el.on(this.autoHideHd)}},clearAutoHide:function(){if(this.autoHide!==false){this.el.un("mouseout",this.autoHideHd.mouseout);this.el.un("mouseover",this.autoHideHd.mouseover)}},clearMonitor:function(){Ext.getDoc().un("click",this.slideInIf,this)},slideOut:function(){if(this.isSlid||this.el.hasActiveFx()){return }this.isSlid=true;var A=this.panel.tools;if(A&&A.toggle){A.toggle.hide()}this.el.show();if(this.position=="east"||this.position=="west"){this.panel.setSize(undefined,this.collapsedEl.getHeight())}else{this.panel.setSize(this.collapsedEl.getWidth(),undefined)}this.restoreLT=[this.el.dom.style.left,this.el.dom.style.top];this.el.alignTo(this.collapsedEl,this.getCollapseAnchor());this.el.setStyle("z-index",102);if(this.animFloat!==false){this.beforeSlide();this.el.slideIn(this.getSlideAnchor(),{callback:function(){this.afterSlide();this.initAutoHide();Ext.getDoc().on("click",this.slideInIf,this)},scope:this,block:true})}else{this.initAutoHide();Ext.getDoc().on("click",this.slideInIf,this)}},afterSlideIn:function(){this.clearAutoHide();this.isSlid=false;this.clearMonitor();this.el.setStyle("z-index","");this.el.dom.style.left=this.restoreLT[0];this.el.dom.style.top=this.restoreLT[1];var A=this.panel.tools;if(A&&A.toggle){A.toggle.show()}},slideIn:function(A){if(!this.isSlid||this.el.hasActiveFx()){Ext.callback(A);return }this.isSlid=false;if(this.animFloat!==false){this.beforeSlide();this.el.slideOut(this.getSlideAnchor(),{callback:function(){this.el.hide();this.afterSlide();this.afterSlideIn();Ext.callback(A)},scope:this,block:true})}else{this.el.hide();this.afterSlideIn()}},slideInIf:function(A){if(!A.within(this.el)){this.slideIn()}},anchors:{"west":"left","east":"right","north":"top","south":"bottom"},sanchors:{"west":"l","east":"r","north":"t","south":"b"},canchors:{"west":"tl-tr","east":"tr-tl","north":"tl-bl","south":"bl-tl"},getAnchor:function(){return this.anchors[this.position]},getCollapseAnchor:function(){return this.canchors[this.position]},getSlideAnchor:function(){return this.sanchors[this.position]},getAlignAdj:function(){var A=this.cmargins;switch(this.position){case"west":return[0,0];break;case"east":return[0,0];break;case"north":return[0,0];break;case"south":return[0,0];break}},getExpandAdj:function(){var B=this.collapsedEl,A=this.cmargins;switch(this.position){case"west":return[-(A.right+B.getWidth()+A.left),0];break;case"east":return[A.right+B.getWidth()+A.left,0];break;case"north":return[0,-(A.top+A.bottom+B.getHeight())];break;case"south":return[0,A.top+A.bottom+B.getHeight()];break}}};Ext.layout.BorderLayout.SplitRegion=function(B,A,C){Ext.layout.BorderLayout.SplitRegion.superclass.constructor.call(this,B,A,C);this.applyLayout=this.applyFns[C]};Ext.extend(Ext.layout.BorderLayout.SplitRegion,Ext.layout.BorderLayout.Region,{splitTip:"Drag to resize.",collapsibleSplitTip:"Drag to resize. Double click to hide.",useSplitTips:false,splitSettings:{north:{orientation:Ext.SplitBar.VERTICAL,placement:Ext.SplitBar.TOP,maxFn:"getVMaxSize",minProp:"minHeight",maxProp:"maxHeight"},south:{orientation:Ext.SplitBar.VERTICAL,placement:Ext.SplitBar.BOTTOM,maxFn:"getVMaxSize",minProp:"minHeight",maxProp:"maxHeight"},east:{orientation:Ext.SplitBar.HORIZONTAL,placement:Ext.SplitBar.RIGHT,maxFn:"getHMaxSize",minProp:"minWidth",maxProp:"maxWidth"},west:{orientation:Ext.SplitBar.HORIZONTAL,placement:Ext.SplitBar.LEFT,maxFn:"getHMaxSize",minProp:"minWidth",maxProp:"maxWidth"}},applyFns:{west:function(C){if(this.isCollapsed){return this.applyLayoutCollapsed(C)}var D=this.splitEl.dom,B=D.style;this.panel.setPosition(C.x,C.y);var A=D.offsetWidth;B.left=(C.x+C.width-A)+"px";B.top=(C.y)+"px";B.height=Math.max(0,C.height)+"px";this.panel.setSize(C.width-A,C.height)},east:function(C){if(this.isCollapsed){return this.applyLayoutCollapsed(C)}var D=this.splitEl.dom,B=D.style;var A=D.offsetWidth;this.panel.setPosition(C.x+A,C.y);B.left=(C.x)+"px";B.top=(C.y)+"px";B.height=Math.max(0,C.height)+"px";this.panel.setSize(C.width-A,C.height)},north:function(C){if(this.isCollapsed){return this.applyLayoutCollapsed(C)}var D=this.splitEl.dom,B=D.style;var A=D.offsetHeight;this.panel.setPosition(C.x,C.y);B.left=(C.x)+"px";B.top=(C.y+C.height-A)+"px";B.width=Math.max(0,C.width)+"px";this.panel.setSize(C.width,C.height-A)},south:function(C){if(this.isCollapsed){return this.applyLayoutCollapsed(C)}var D=this.splitEl.dom,B=D.style;var A=D.offsetHeight;this.panel.setPosition(C.x,C.y+A);B.left=(C.x)+"px";B.top=(C.y)+"px";B.width=Math.max(0,C.width)+"px";this.panel.setSize(C.width,C.height-A)}},render:function(A,C){Ext.layout.BorderLayout.SplitRegion.superclass.render.call(this,A,C);var D=this.position;this.splitEl=A.createChild({cls:"x-layout-split x-layout-split-"+D,html:" ",id:this.panel.id+"-xsplit"});if(this.collapseMode=="mini"){this.miniSplitEl=this.splitEl.createChild({cls:"x-layout-mini x-layout-mini-"+D,html:" "});this.miniSplitEl.addClassOnOver("x-layout-mini-over");this.miniSplitEl.on("click",this.onCollapseClick,this,{stopEvent:true})}var B=this.splitSettings[D];this.split=new Ext.SplitBar(this.splitEl.dom,C.el,B.orientation);this.split.placement=B.placement;this.split.getMaximumSize=this[B.maxFn].createDelegate(this);this.split.minSize=this.minSize||this[B.minProp];this.split.on("beforeapply",this.onSplitMove,this);this.split.useShim=this.useShim===true;this.maxSize=this.maxSize||this[B.maxProp];if(C.hidden){this.splitEl.hide()}if(this.useSplitTips){this.splitEl.dom.title=this.collapsible?this.collapsibleSplitTip:this.splitTip}if(this.collapsible){this.splitEl.on("dblclick",this.onCollapseClick,this)}},getSize:function(){if(this.isCollapsed){return this.collapsedEl.getSize()}var A=this.panel.getSize();if(this.position=="north"||this.position=="south"){A.height+=this.splitEl.dom.offsetHeight}else{A.width+=this.splitEl.dom.offsetWidth}return A},getHMaxSize:function(){var B=this.maxSize||10000;var A=this.layout.center;return Math.min(B,(this.el.getWidth()+A.el.getWidth())-A.getMinWidth())},getVMaxSize:function(){var B=this.maxSize||10000;var A=this.layout.center;return Math.min(B,(this.el.getHeight()+A.el.getHeight())-A.getMinHeight())},onSplitMove:function(B,A){var C=this.panel.getSize();this.lastSplitSize=A;if(this.position=="north"||this.position=="south"){this.panel.setSize(C.width,A);this.state.height=A}else{this.panel.setSize(A,C.height);this.state.width=A}this.layout.layout();this.panel.saveState();return false},getSplitBar:function(){return this.split}});Ext.Container.LAYOUTS["border"]=Ext.layout.BorderLayout; +Ext.layout.FormLayout=Ext.extend(Ext.layout.AnchorLayout,{labelSeparator:":",getAnchorViewSize:function(A,B){return A.body.getStyleSize()},setContainer:function(B){Ext.layout.FormLayout.superclass.setContainer.call(this,B);if(B.labelAlign){B.addClass("x-form-label-"+B.labelAlign)}if(B.hideLabels){this.labelStyle="display:none";this.elementStyle="padding-left:0;";this.labelAdjust=0}else{this.labelSeparator=B.labelSeparator||this.labelSeparator;B.labelWidth=B.labelWidth||100;if(typeof B.labelWidth=="number"){var C=(typeof B.labelPad=="number"?B.labelPad:5);this.labelAdjust=B.labelWidth+C;this.labelStyle="width:"+B.labelWidth+"px;";this.elementStyle="padding-left:"+(B.labelWidth+C)+"px"}if(B.labelAlign=="top"){this.labelStyle="width:auto;";this.labelAdjust=0;this.elementStyle="padding-left:0;"}}if(!this.fieldTpl){var A=new Ext.Template("
      ","","
      ","
      ","
      ");A.disableFormats=true;A.compile();Ext.layout.FormLayout.prototype.fieldTpl=A}},renderItem:function(D,A,C){if(D&&!D.rendered&&D.isFormField&&D.inputType!="hidden"){var B=[D.id,D.fieldLabel,D.labelStyle||this.labelStyle||"",this.elementStyle||"",typeof D.labelSeparator=="undefined"?this.labelSeparator:D.labelSeparator,(D.itemCls||this.container.itemCls||"")+(D.hideLabel?" x-hide-label":""),D.clearCls||"x-form-clear-left"];if(typeof A=="number"){A=C.dom.childNodes[A]||null}if(A){this.fieldTpl.insertBefore(A,B)}else{this.fieldTpl.append(C,B)}D.render("x-form-el-"+D.id)}else{Ext.layout.FormLayout.superclass.renderItem.apply(this,arguments)}},adjustWidthAnchor:function(B,A){return B-(A.isFormField?(A.hideLabel?0:this.labelAdjust):0)},isValidParent:function(B,A){return true}});Ext.Container.LAYOUTS["form"]=Ext.layout.FormLayout; +Ext.layout.Accordion=Ext.extend(Ext.layout.FitLayout,{fill:true,autoWidth:true,titleCollapse:true,hideCollapseTool:false,collapseFirst:false,animate:false,sequence:false,activeOnTop:false,renderItem:function(A){if(this.animate===false){A.animCollapse=false}A.collapsible=true;if(this.autoWidth){A.autoWidth=true}if(this.titleCollapse){A.titleCollapse=true}if(this.hideCollapseTool){A.hideCollapseTool=true}if(this.collapseFirst!==undefined){A.collapseFirst=this.collapseFirst}if(!this.activeItem&&!A.collapsed){this.activeItem=A}else{if(this.activeItem){A.collapsed=true}}Ext.layout.Accordion.superclass.renderItem.apply(this,arguments);A.header.addClass("x-accordion-hd");A.on("beforeexpand",this.beforeExpand,this)},beforeExpand:function(C,B){var A=this.activeItem;if(A){if(this.sequence){delete this.activeItem;if(!A.collapsed){A.collapse({callback:function(){C.expand(B||true)},scope:this});return false}}else{A.collapse(this.animate)}}this.activeItem=C;if(this.activeOnTop){C.el.dom.parentNode.insertBefore(C.el.dom,C.el.dom.parentNode.firstChild)}this.layout()},setItemSize:function(F,E){if(this.fill&&F){var B=this.container.items.items;var D=0;for(var C=0,A=B.length;C=B)||(this.cells[C]&&this.cells[C][A])){if(B&&A>=B){C++;A=0}else{A++}}return[A,C]},renderItem:function(C,A,B){if(C&&!C.rendered){C.render(this.getNextCell(C))}},isValidParent:function(B,A){return true}});Ext.Container.LAYOUTS["table"]=Ext.layout.TableLayout; +Ext.layout.AbsoluteLayout=Ext.extend(Ext.layout.AnchorLayout,{extraCls:"x-abs-layout-item",isForm:false,setContainer:function(A){Ext.layout.AbsoluteLayout.superclass.setContainer.call(this,A);if(A.isXType("form")){this.isForm=true}},onLayout:function(A,B){if(this.isForm){A.body.position()}else{B.position()}Ext.layout.AbsoluteLayout.superclass.onLayout.call(this,A,B)},getAnchorViewSize:function(A,B){return this.isForm?A.body.getStyleSize():Ext.layout.AbsoluteLayout.superclass.getAnchorViewSize.call(this,A,B)},isValidParent:function(B,A){return this.isForm?true:Ext.layout.AbsoluteLayout.superclass.isValidParent.call(this,B,A)},adjustWidthAnchor:function(B,A){return B?B-A.getPosition(true)[0]:B},adjustHeightAnchor:function(B,A){return B?B-A.getPosition(true)[1]:B}});Ext.Container.LAYOUTS["absolute"]=Ext.layout.AbsoluteLayout; +Ext.Viewport=Ext.extend(Ext.Container,{initComponent:function(){Ext.Viewport.superclass.initComponent.call(this);document.getElementsByTagName("html")[0].className+=" x-viewport";this.el=Ext.getBody();this.el.setHeight=Ext.emptyFn;this.el.setWidth=Ext.emptyFn;this.el.setSize=Ext.emptyFn;this.el.dom.scroll="no";this.allowDomMove=false;this.autoWidth=true;this.autoHeight=true;Ext.EventManager.onWindowResize(this.fireResize,this);this.renderTo=this.el},fireResize:function(A,B){this.fireEvent("resize",this,A,B,A,B)}});Ext.reg("viewport",Ext.Viewport); +Ext.Panel=Ext.extend(Ext.Container,{baseCls:"x-panel",collapsedCls:"x-panel-collapsed",maskDisabled:true,animCollapse:Ext.enableFx,headerAsText:true,buttonAlign:"right",collapsed:false,collapseFirst:true,minButtonWidth:75,elements:"body",toolTarget:"header",collapseEl:"bwrap",slideAnchor:"t",disabledClass:"",deferHeight:true,expandDefaults:{duration:0.25},collapseDefaults:{duration:0.25},initComponent:function(){Ext.Panel.superclass.initComponent.call(this);this.addEvents("bodyresize","titlechange","collapse","expand","beforecollapse","beforeexpand","beforeclose","close","activate","deactivate");if(this.tbar){this.elements+=",tbar";if(typeof this.tbar=="object"){this.topToolbar=this.tbar}delete this.tbar}if(this.bbar){this.elements+=",bbar";if(typeof this.bbar=="object"){this.bottomToolbar=this.bbar}delete this.bbar}if(this.header===true){this.elements+=",header";delete this.header}else{if(this.title&&this.header!==false){this.elements+=",header"}}if(this.footer===true){this.elements+=",footer";delete this.footer}if(this.buttons){var C=this.buttons;this.buttons=[];for(var B=0,A=C.length;B"+this.header.dom.innerHTML+"";if(this.iconCls){this.setIconClass(this.iconCls)}}}if(this.floating){this.makeFloating(this.floating)}if(this.collapsible){this.tools=this.tools?this.tools.slice(0):[];if(!this.hideCollapseTool){this.tools[this.collapseFirst?"unshift":"push"]({id:"toggle",handler:this.toggleCollapse,scope:this})}if(this.titleCollapse&&this.header){this.header.on("click",this.toggleCollapse,this);this.header.setStyle("cursor","pointer")}}if(this.tools){var J=this.tools;this.tools={};this.addTool.apply(this,J)}else{this.tools={}}if(this.buttons&&this.buttons.length>0){var D=this.footer.createChild({cls:"x-panel-btns-ct",cn:{cls:"x-panel-btns x-panel-btns-"+this.buttonAlign,html:"
      "}},null,true);var L=D.getElementsByTagName("tr")[0];for(var F=0,I=this.buttons.length;F ");F.disableFormats=true;F.compile();Ext.Panel.prototype.toolTemplate=F}for(var E=0,C=arguments,B=C.length;E0){J.sort(C);var I=J[0].manager.zseed;for(var K=0;K=0;--H){if(!D[H].hidden){B(D[H]);return }}B(null)};return{zseed:9000,register:function(H){F[H.id]=H;D.push(H);H.on("hide",A)},unregister:function(H){delete F[H.id];H.un("hide",A);D.remove(H)},get:function(H){return typeof H=="object"?H:F[H]},bringToFront:function(H){H=this.get(H);if(H!=E){H._lastAccess=new Date().getTime();G();return true}return false},sendToBack:function(H){H=this.get(H);H._lastAccess=-(new Date().getTime());G();return H},hideAll:function(){for(var H in F){if(F[H]&&typeof F[H]!="function"&&F[H].isVisible()){F[H].hide()}}},getActive:function(){return E},getBy:function(J,I){var K=[];for(var H=D.length-1;H>=0;--H){var L=D[H];if(J.call(I||L,L)!==false){K.push(L)}}return K},each:function(I,H){for(var J in F){if(F[J]&&typeof F[J]!="function"){if(I.call(H||F[J],F[J])===false){return }}}}}};Ext.WindowMgr=new Ext.WindowGroup(); +Ext.dd.PanelProxy=function(A,B){this.panel=A;this.id=this.panel.id+"-ddproxy";Ext.apply(this,B)};Ext.dd.PanelProxy.prototype={insertProxy:true,setStatus:Ext.emptyFn,reset:Ext.emptyFn,update:Ext.emptyFn,stop:Ext.emptyFn,sync:Ext.emptyFn,getEl:function(){return this.ghost},getGhost:function(){return this.ghost},getProxy:function(){return this.proxy},hide:function(){if(this.ghost){if(this.proxy){this.proxy.remove();delete this.proxy}this.panel.el.dom.style.display="";this.ghost.remove();delete this.ghost}},show:function(){if(!this.ghost){this.ghost=this.panel.createGhost(undefined,undefined,Ext.getBody());this.ghost.setXY(this.panel.el.getXY());if(this.insertProxy){this.proxy=this.panel.el.insertSibling({cls:"x-panel-dd-spacer"});this.proxy.setSize(this.panel.getSize())}this.panel.el.dom.style.display="none"}},repair:function(B,C,A){this.hide();if(typeof C=="function"){C.call(A||this)}},moveProxy:function(A,B){if(this.proxy){A.insertBefore(this.proxy.dom,B)}}};Ext.Panel.DD=function(B,A){this.panel=B;this.dragData={panel:B};this.proxy=new Ext.dd.PanelProxy(B,A);Ext.Panel.DD.superclass.constructor.call(this,B.el,A);var C=B.header;if(C){this.setHandleElId(C.id)}(C?C:this.panel.body).setStyle("cursor","move");this.scroll=false};Ext.extend(Ext.Panel.DD,Ext.dd.DragSource,{showFrame:Ext.emptyFn,startDrag:Ext.emptyFn,b4StartDrag:function(A,B){this.proxy.show()},b4MouseDown:function(B){var A=B.getPageX();var C=B.getPageY();this.autoOffset(A,C)},onInitDrag:function(A,B){this.onStartDrag(A,B);return true},createFrame:Ext.emptyFn,getDragEl:function(A){return this.proxy.ghost.dom},endDrag:function(A){this.proxy.hide();this.panel.saveState()},autoOffset:function(A,B){A-=this.startPageX;B-=this.startPageY;this.setDelta(A,B)}}); +Ext.state.Provider=function(){this.addEvents("statechange");this.state={};Ext.state.Provider.superclass.constructor.call(this)};Ext.extend(Ext.state.Provider,Ext.util.Observable,{get:function(B,A){return typeof this.state[B]=="undefined"?A:this.state[B]},clear:function(A){delete this.state[A];this.fireEvent("statechange",this,A,null)},set:function(A,B){this.state[A]=B;this.fireEvent("statechange",this,A,B)},decodeValue:function(A){var J=/^(a|n|d|b|s|o)\:(.*)$/;var C=J.exec(unescape(A));if(!C||!C[1]){return }var F=C[1];var H=C[2];switch(F){case"n":return parseFloat(H);case"d":return new Date(Date.parse(H));case"b":return(H=="1");case"a":var G=[];var I=H.split("^");for(var B=0,D=I.length;B0){if(!B){this.selected.removeClass(this.selectedClass)}this.selected.clear();this.last=false;if(!A){this.fireEvent("selectionchange",this,this.selected.elements)}}},isSelected:function(A){return this.selected.contains(this.getNode(A))},deselect:function(A){if(this.isSelected(A)){A=this.getNode(A);this.selected.removeElement(A);if(this.last==A.viewIndex){this.last=false}Ext.fly(A).removeClass(this.selectedClass);this.fireEvent("selectionchange",this,this.selected.elements)}},select:function(D,F,B){if(Ext.isArray(D)){if(!F){this.clearSelections(true)}for(var C=0,A=D.length;C=A&&D[C];C--){B.push(D[C])}}return B},indexOf:function(A){A=this.getNode(A);if(typeof A.viewIndex=="number"){return A.viewIndex}return this.all.indexOf(A)},onBeforeLoad:function(){if(this.loadingText){this.clearSelections(false,true);this.el.update("
      "+this.loadingText+"
      ");this.all.clear()}},onDestroy:function(){Ext.DataView.superclass.onDestroy.call(this);this.setStore(null)}});Ext.reg("dataview",Ext.DataView); +Ext.ColorPalette=function(A){Ext.ColorPalette.superclass.constructor.call(this,A);this.addEvents("select");if(this.handler){this.on("select",this.handler,this.scope,true)}};Ext.extend(Ext.ColorPalette,Ext.Component,{itemCls:"x-color-palette",value:null,clickEvent:"click",ctype:"Ext.ColorPalette",allowReselect:false,colors:["000000","993300","333300","003300","003366","000080","333399","333333","800000","FF6600","808000","008000","008080","0000FF","666699","808080","FF0000","FF9900","99CC00","339966","33CCCC","3366FF","800080","969696","FF00FF","FFCC00","FFFF00","00FF00","00FFFF","00CCFF","993366","C0C0C0","FF99CC","FFCC99","FFFF99","CCFFCC","CCFFFF","99CCFF","CC99FF","FFFFFF"],onRender:function(B,A){var C=this.tpl||new Ext.XTemplate(" ");var D=document.createElement("div");D.className=this.itemCls;C.overwrite(D,this.colors);B.dom.insertBefore(D,A);this.el=Ext.get(D);this.el.on(this.clickEvent,this.handleClick,this,{delegate:"a"});if(this.clickEvent!="click"){this.el.on("click",Ext.emptyFn,this,{delegate:"a",preventDefault:true})}},afterRender:function(){Ext.ColorPalette.superclass.afterRender.call(this);if(this.value){var A=this.value;this.value=null;this.select(A)}},handleClick:function(B,A){B.preventDefault();if(!this.disabled){var C=A.className.match(/(?:^|\s)color-(.{6})(?:\s|$)/)[1];this.select(C.toUpperCase())}},select:function(A){A=A.replace("#","");if(A!=this.value||this.allowReselect){var B=this.el;if(this.value){B.child("a.color-"+this.value).removeClass("x-color-palette-sel")}B.child("a.color-"+A).addClass("x-color-palette-sel");this.value=A;this.fireEvent("select",this,A)}}});Ext.reg("colorpalette",Ext.ColorPalette); +Ext.DatePicker=Ext.extend(Ext.Component,{todayText:"Today",okText:" OK ",cancelText:"Cancel",todayTip:"{0} (Spacebar)",minText:"This date is before the minimum date",maxText:"This date is after the maximum date",format:"m/d/y",disabledDaysText:"Disabled",disabledDatesText:"Disabled",constrainToViewport:true,monthNames:Date.monthNames,dayNames:Date.dayNames,nextText:"Next Month (Control+Right)",prevText:"Previous Month (Control+Left)",monthYearText:"Choose a month (Control+Up/Down to move years)",startDay:0,showToday:true,initComponent:function(){Ext.DatePicker.superclass.initComponent.call(this);this.value=this.value?this.value.clearTime():new Date().clearTime();this.addEvents("select");if(this.handler){this.on("select",this.handler,this.scope||this)}this.initDisabledDays()},initDisabledDays:function(){if(!this.disabledDatesRE&&this.disabledDates){var A=this.disabledDates;var C="(?:";for(var B=0;B","  ",""];var E=this.dayNames;for(var D=0;D<7;D++){var G=this.startDay+D;if(G>6){G=G-7}C.push("")}C[C.length]="";for(var D=0;D<42;D++){if(D%7==0&&D!=0){C[C.length]=""}C[C.length]=""}C.push("
      ",E[G].substr(0,1),"
      ",this.showToday?"":"","
      ");var B=document.createElement("div");B.className="x-date-picker";B.innerHTML=C.join("");A.dom.insertBefore(B,F);this.el=Ext.get(B);this.eventEl=Ext.get(B.firstChild);new Ext.util.ClickRepeater(this.el.child("td.x-date-left a"),{handler:this.showPrevMonth,scope:this,preventDefault:true,stopDefault:true});new Ext.util.ClickRepeater(this.el.child("td.x-date-right a"),{handler:this.showNextMonth,scope:this,preventDefault:true,stopDefault:true});this.eventEl.on("mousewheel",this.handleMouseWheel,this);this.monthPicker=this.el.down("div.x-date-mp");this.monthPicker.enableDisplayMode("block");var I=new Ext.KeyNav(this.eventEl,{"left":function(J){J.ctrlKey?this.showPrevMonth():this.update(this.activeDate.add("d",-1))},"right":function(J){J.ctrlKey?this.showNextMonth():this.update(this.activeDate.add("d",1))},"up":function(J){J.ctrlKey?this.showNextYear():this.update(this.activeDate.add("d",-7))},"down":function(J){J.ctrlKey?this.showPrevYear():this.update(this.activeDate.add("d",7))},"pageUp":function(J){this.showNextMonth()},"pageDown":function(J){this.showPrevMonth()},"enter":function(J){J.stopPropagation();return true},scope:this});this.eventEl.on("click",this.handleDateClick,this,{delegate:"a.x-date-date"});this.el.unselectable();this.cells=this.el.select("table.x-date-inner tbody td");this.textNodes=this.el.query("table.x-date-inner tbody span");this.mbtn=new Ext.Button({text:" ",tooltip:this.monthYearText,renderTo:this.el.child("td.x-date-middle",true)});this.mbtn.on("click",this.showMonthPicker,this);this.mbtn.el.child(this.mbtn.menuClassTarget).addClass("x-btn-with-menu");if(this.showToday){this.todayKeyListener=this.eventEl.addKeyListener(Ext.EventObject.SPACE,this.selectToday,this);var H=(new Date()).dateFormat(this.format);this.todayBtn=new Ext.Button({renderTo:this.el.child("td.x-date-bottom",true),text:String.format(this.todayText,H),tooltip:String.format(this.todayTip,H),handler:this.selectToday,scope:this})}if(Ext.isIE){this.el.repaint()}this.update(this.value)},createMonthPicker:function(){if(!this.monthPicker.dom.firstChild){var A=[""];for(var B=0;B<6;B++){A.push("","",B==0?"":"")}A.push("","
      ",this.monthNames[B].substr(0,3),"",this.monthNames[B+6].substr(0,3),"
      ");this.monthPicker.update(A.join(""));this.monthPicker.on("click",this.onMonthClick,this);this.monthPicker.on("dblclick",this.onMonthDblClick,this);this.mpMonths=this.monthPicker.select("td.x-date-mp-month");this.mpYears=this.monthPicker.select("td.x-date-mp-year");this.mpMonths.each(function(C,D,E){E+=1;if((E%2)==0){C.dom.xmonth=5+Math.round(E*0.5)}else{C.dom.xmonth=Math.round((E-1)*0.5)}})}},showMonthPicker:function(){this.createMonthPicker();var A=this.el.getSize();this.monthPicker.setSize(A);this.monthPicker.child("table").setSize(A);this.mpSelMonth=(this.activeDate||this.value).getMonth();this.updateMPMonth(this.mpSelMonth);this.mpSelYear=(this.activeDate||this.value).getFullYear();this.updateMPYear(this.mpSelYear);this.monthPicker.slideIn("t",{duration:0.2})},updateMPYear:function(E){this.mpyear=E;var C=this.mpYears.elements;for(var B=1;B<=10;B++){var D=C[B-1],A;if((B%2)==0){A=E+Math.round(B*0.5);D.firstChild.innerHTML=A;D.xyear=A}else{A=E-(5-Math.round(B*0.5));D.firstChild.innerHTML=A;D.xyear=A}this.mpYears.item(B-1)[A==this.mpSelYear?"addClass":"removeClass"]("x-date-mp-sel")}},updateMPMonth:function(A){this.mpMonths.each(function(B,C,D){B[B.dom.xmonth==A?"addClass":"removeClass"]("x-date-mp-sel")})},selectMPMonth:function(A){},onMonthClick:function(D,B){D.stopEvent();var C=new Ext.Element(B),A;if(C.is("button.x-date-mp-cancel")){this.hideMonthPicker()}else{if(C.is("button.x-date-mp-ok")){var E=new Date(this.mpSelYear,this.mpSelMonth,(this.activeDate||this.value).getDate());if(E.getMonth()!=this.mpSelMonth){E=new Date(this.mpSelYear,this.mpSelMonth,1).getLastDateOfMonth()}this.update(E);this.hideMonthPicker()}else{if(A=C.up("td.x-date-mp-month",2)){this.mpMonths.removeClass("x-date-mp-sel");A.addClass("x-date-mp-sel");this.mpSelMonth=A.dom.xmonth}else{if(A=C.up("td.x-date-mp-year",2)){this.mpYears.removeClass("x-date-mp-sel");A.addClass("x-date-mp-sel");this.mpSelYear=A.dom.xyear}else{if(C.is("a.x-date-mp-prev")){this.updateMPYear(this.mpyear-10)}else{if(C.is("a.x-date-mp-next")){this.updateMPYear(this.mpyear+10)}}}}}}},onMonthDblClick:function(D,B){D.stopEvent();var C=new Ext.Element(B),A;if(A=C.up("td.x-date-mp-month",2)){this.update(new Date(this.mpSelYear,A.dom.xmonth,(this.activeDate||this.value).getDate()));this.hideMonthPicker()}else{if(A=C.up("td.x-date-mp-year",2)){this.update(new Date(A.dom.xyear,this.mpSelMonth,(this.activeDate||this.value).getDate()));this.hideMonthPicker()}}},hideMonthPicker:function(A){if(this.monthPicker){if(A===true){this.monthPicker.hide()}else{this.monthPicker.slideOut("t",{duration:0.2})}}},showPrevMonth:function(A){this.update(this.activeDate.add("mo",-1))},showNextMonth:function(A){this.update(this.activeDate.add("mo",1))},showPrevYear:function(){this.update(this.activeDate.add("y",-1))},showNextYear:function(){this.update(this.activeDate.add("y",1))},handleMouseWheel:function(A){var B=A.getWheelDelta();if(B>0){this.showPrevMonth();A.stopEvent()}else{if(B<0){this.showNextMonth();A.stopEvent()}}},handleDateClick:function(B,A){B.stopEvent();if(A.dateValue&&!Ext.fly(A.parentNode).hasClass("x-date-disabled")){this.setValue(new Date(A.dateValue));this.fireEvent("select",this,this.value)}},selectToday:function(){if(this.todayBtn&&!this.todayBtn.disabled){this.setValue(new Date().clearTime());this.fireEvent("select",this,this.value)}},update:function(a,U){var A=this.activeDate;this.activeDate=a;if(!U&&A&&this.el){var K=a.getTime();if(A.getMonth()==a.getMonth()&&A.getFullYear()==a.getFullYear()){this.cells.removeClass("x-date-selected");this.cells.each(function(d){if(d.dom.firstChild.dateValue==K){d.addClass("x-date-selected");setTimeout(function(){try{d.dom.firstChild.focus()}catch(f){}},50);return false}});return }}var G=a.getDaysInMonth();var L=a.getFirstDateOfMonth();var D=L.getDay()-this.startDay;if(D<=this.startDay){D+=7}var V=a.add("mo",-1);var E=V.getDaysInMonth()-D;var C=this.cells.elements;var M=this.textNodes;G+=D;var R=86400000;var X=(new Date(V.getFullYear(),V.getMonth(),E)).clearTime();var W=new Date().clearTime().getTime();var P=a.clearTime().getTime();var O=this.minDate?this.minDate.clearTime():Number.NEGATIVE_INFINITY;var S=this.maxDate?this.maxDate.clearTime():Number.POSITIVE_INFINITY;var Z=this.disabledDatesRE;var N=this.disabledDatesText;var c=this.disabledDays?this.disabledDays.join(""):false;var Y=this.disabledDaysText;var T=this.format;if(this.showToday){var I=new Date().clearTime();var B=(IS||(Z&&T&&Z.test(I.dateFormat(T)))||(c&&c.indexOf(I.getDay())!=-1));this.todayBtn.setDisabled(B);this.todayKeyListener[B?"disable":"enable"]()}var H=function(g,d){d.title="";var e=X.getTime();d.firstChild.dateValue=e;if(e==W){d.className+=" x-date-today";d.title=g.todayText}if(e==P){d.className+=" x-date-selected";setTimeout(function(){try{d.firstChild.focus()}catch(h){}},50)}if(eS){d.className=" x-date-disabled";d.title=g.maxText;return }if(c){if(c.indexOf(X.getDay())!=-1){d.title=Y;d.className=" x-date-disabled"}}if(Z&&T){var f=X.dateFormat(T);if(Z.test(f)){d.title=N.replace("%0",f);d.className=" x-date-disabled"}}};var Q=0;for(;Q","","{text}","");D.disableFormats=true;D.compile();Ext.TabPanel.prototype.itemTpl=D}this.items.each(this.initTab,this)},afterRender:function(){Ext.TabPanel.superclass.afterRender.call(this);if(this.autoTabs){this.readTabs(false)}},initEvents:function(){Ext.TabPanel.superclass.initEvents.call(this);this.on("add",this.onAdd,this);this.on("remove",this.onRemove,this);this.strip.on("mousedown",this.onStripMouseDown,this);this.strip.on("contextmenu",this.onStripContextMenu,this);if(this.enableTabScroll){this.strip.on("mousewheel",this.onWheel,this)}},findTargets:function(C){var B=null;var A=C.getTarget("li",this.strip);if(A){B=this.getComponent(A.id.split(this.idDelimiter)[1]);if(B.disabled){return{close:null,item:null,el:null}}}return{close:C.getTarget(".x-tab-strip-close",this.strip),item:B,el:A}},onStripMouseDown:function(B){if(B.button!=0){return }B.preventDefault();var A=this.findTargets(B);if(A.close){this.remove(A.item);return }if(A.item&&A.item!=this.activeTab){this.setActiveTab(A.item)}},onStripContextMenu:function(B){B.preventDefault();var A=this.findTargets(B);if(A.item){this.fireEvent("contextmenu",this,A.item,B)}},readTabs:function(D){if(D===true){this.items.each(function(G){this.remove(G)},this)}var C=this.el.query(this.autoTabSelector);for(var B=0,A=C.length;B20?C:20);if(!this.scrolling){if(!this.scrollLeft){this.createScrollers()}else{this.scrollLeft.show();this.scrollRight.show()}}this.scrolling=true;if(H>(A-C)){E.scrollLeft=A-C}else{this.scrollToTab(this.activeTab,false)}this.updateScrollButtons()}},createScrollers:function(){var C=this.stripWrap.dom.offsetHeight;var A=this.header.insertFirst({cls:"x-tab-scroller-left"});A.setHeight(C);A.addClassOnOver("x-tab-scroller-left-over");this.leftRepeater=new Ext.util.ClickRepeater(A,{interval:this.scrollRepeatInterval,handler:this.onScrollLeft,scope:this});this.scrollLeft=A;var B=this.header.insertFirst({cls:"x-tab-scroller-right"});B.setHeight(C);B.addClassOnOver("x-tab-scroller-right-over");this.rightRepeater=new Ext.util.ClickRepeater(B,{interval:this.scrollRepeatInterval,handler:this.onScrollRight,scope:this});this.scrollRight=B},getScrollWidth:function(){return this.edge.getOffsetsTo(this.stripWrap)[0]+this.getScrollPos()},getScrollPos:function(){return parseInt(this.stripWrap.dom.scrollLeft,10)||0},getScrollArea:function(){return parseInt(this.stripWrap.dom.clientWidth,10)||0},getScrollAnim:function(){return{duration:this.scrollDuration,callback:this.updateScrollButtons,scope:this}},getScrollIncrement:function(){return this.scrollIncrement||(this.resizeTabs?this.lastTabWidth+2:100)},scrollToTab:function(E,A){if(!E){return }var C=this.getTabEl(E);var G=this.getScrollPos(),D=this.getScrollArea();var F=Ext.fly(C).getOffsetsTo(this.stripWrap)[0]+G;var B=F+C.offsetWidth;if(F(G+D)){this.scrollTo(B-D,A)}}},scrollTo:function(B,A){this.stripWrap.scrollTo("left",B,A?this.getScrollAnim():false);if(!A){this.updateScrollButtons()}},onWheel:function(D){var E=D.getWheelDelta()*this.wheelIncrement*-1;D.stopEvent();var F=this.getScrollPos();var C=F+E;var A=this.getScrollWidth()-this.getScrollArea();var B=Math.max(0,Math.min(A,C));if(B!=F){this.scrollTo(B,false)}},onScrollRight:function(){var A=this.getScrollWidth()-this.getScrollArea();var C=this.getScrollPos();var B=Math.min(A,C+this.getScrollIncrement());if(B!=C){this.scrollTo(B,this.animScroll)}},onScrollLeft:function(){var B=this.getScrollPos();var A=Math.max(0,B-this.getScrollIncrement());if(A!=B){this.scrollTo(A,this.animScroll)}},updateScrollButtons:function(){var A=this.getScrollPos();this.scrollLeft[A==0?"addClass":"removeClass"]("x-tab-scroller-left-disabled");this.scrollRight[A>=(this.getScrollWidth()-this.getScrollArea())?"addClass":"removeClass"]("x-tab-scroller-right-disabled")}});Ext.reg("tabpanel",Ext.TabPanel);Ext.TabPanel.prototype.activate=Ext.TabPanel.prototype.setActiveTab;Ext.TabPanel.AccessStack=function(){var A=[];return{add:function(B){A.push(B);if(A.length>10){A.shift()}},remove:function(E){var D=[];for(var C=0,B=A.length;C","  ","")}this.template=Ext.Button.buttonTemplate}var B,E=[this.text||" ",this.type];if(A){B=this.template.insertBefore(A,E,true)}else{B=this.template.append(C,E,true)}var D=B.child(this.buttonSelector);D.on("focus",this.onFocus,this);D.on("blur",this.onBlur,this);this.initButtonEl(B,D);if(this.menu){this.el.child(this.menuClassTarget).addClass("x-btn-with-menu")}Ext.ButtonToggleMgr.register(this)},initButtonEl:function(B,C){this.el=B;B.addClass("x-btn");if(this.icon){C.setStyle("background-image","url("+this.icon+")")}if(this.iconCls){C.addClass(this.iconCls);if(!this.cls){B.addClass(this.text?"x-btn-text-icon":"x-btn-icon")}}if(this.tabIndex!==undefined){C.dom.tabIndex=this.tabIndex}if(this.tooltip){if(typeof this.tooltip=="object"){Ext.QuickTips.register(Ext.apply({target:C.id},this.tooltip))}else{C.dom[this.tooltipType]=this.tooltip}}if(this.pressed){this.el.addClass("x-btn-pressed")}if(this.handleMouseEvents){B.on("mouseover",this.onMouseOver,this);B.on("mousedown",this.onMouseDown,this)}if(this.menu){this.menu.on("show",this.onMenuShow,this);this.menu.on("hide",this.onMenuHide,this)}if(this.id){this.el.dom.id=this.el.id=this.id}if(this.repeat){var A=new Ext.util.ClickRepeater(B,typeof this.repeat=="object"?this.repeat:{});A.on("click",this.onClick,this)}B.on(this.clickEvent,this.onClick,this)},afterRender:function(){Ext.Button.superclass.afterRender.call(this);if(Ext.isIE6){this.autoWidth.defer(1,this)}else{this.autoWidth()}},setIconClass:function(A){if(this.el){this.el.child(this.buttonSelector).replaceClass(this.iconCls,A)}this.iconCls=A},beforeDestroy:function(){if(this.rendered){var A=this.el.child(this.buttonSelector);if(A){A.removeAllListeners()}}if(this.menu){Ext.destroy(this.menu)}},onDestroy:function(){if(this.rendered){Ext.ButtonToggleMgr.unregister(this)}},autoWidth:function(){if(this.el){this.el.setWidth("auto");if(Ext.isIE7&&Ext.isStrict){var A=this.el.child(this.buttonSelector);if(A&&A.getWidth()>20){A.clip();A.setWidth(Ext.util.TextMetrics.measure(A,this.text).width+A.getFrameWidth("lr"))}}if(this.minWidth){if(this.el.getWidth()","","","
       
      ","","","
       
      ");var C,F=[this.text||" ",this.type];if(A){C=B.insertBefore(A,F,true)}else{C=B.append(D,F,true)}var E=C.child(this.buttonSelector);this.initButtonEl(C,E);this.arrowBtnTable=C.child("table:last");if(this.arrowTooltip){C.child(this.arrowSelector).dom[this.tooltipType]=this.arrowTooltip}},autoWidth:function(){if(this.el){var C=this.el.child("table:first");var B=this.el.child("table:last");this.el.setWidth("auto");C.setWidth("auto");if(Ext.isIE7&&Ext.isStrict){var A=this.el.child(this.buttonSelector);if(A&&A.getWidth()>20){A.clip();A.setWidth(Ext.util.TextMetrics.measure(A,this.text).width+A.getFrameWidth("lr"))}}if(this.minWidth){if((C.getWidth()+B.getWidth())"},onRender:function(C,B){this.el=C.createChild(Ext.apply({id:this.id},this.autoCreate),B);this.tr=this.el.child("tr",true)},afterRender:function(){A.superclass.afterRender.call(this);if(this.buttons){this.add.apply(this,this.buttons);delete this.buttons}},add:function(){var C=arguments,B=C.length;for(var D=0;D"){this.addFill()}else{this.addText(E)}}}}else{if(E.tagName){this.addElement(E)}else{if(typeof E=="object"){if(E.xtype){this.addField(Ext.ComponentMgr.create(E,"button"))}else{this.addButton(E)}}}}}}}},addSeparator:function(){return this.addItem(new A.Separator())},addSpacer:function(){return this.addItem(new A.Spacer())},addFill:function(){return this.addItem(new A.Fill())},addElement:function(B){return this.addItem(new A.Item(B))},addItem:function(B){var C=this.nextBlock();this.initMenuTracking(B);B.render(C);this.items.add(B);return B},addButton:function(D){if(Ext.isArray(D)){var F=[];for(var E=0,C=D.length;E=1&C<=E.pages){this.field.dom.value=C}}}}}},beforeLoad:function(){if(this.rendered&&this.loading){this.loading.disable()}},doLoad:function(C){var B={},A=this.paramNames;B[A.start]=C;B[A.limit]=this.pageSize;if(this.fireEvent("beforechange",this,B)!==false){this.store.load({params:B})}},changePage:function(A){this.doLoad(((A-1)*this.pageSize).constrain(0,this.store.getTotalCount()))},onClick:function(E){var B=this.store;switch(E){case"first":this.doLoad(0);break;case"prev":this.doLoad(Math.max(0,this.cursor-this.pageSize));break;case"next":this.doLoad(this.cursor+this.pageSize);break;case"last":var D=B.getTotalCount();var A=D%this.pageSize;var C=A?(D-A):D-this.pageSize;this.doLoad(C);break;case"refresh":this.doLoad(this.cursor);break}},unbind:function(A){A=Ext.StoreMgr.lookup(A);A.un("beforeload",this.beforeLoad,this);A.un("load",this.onLoad,this);A.un("loadexception",this.onLoadError,this);this.store=undefined},bind:function(A){A=Ext.StoreMgr.lookup(A);A.on("beforeload",this.beforeLoad,this);A.on("load",this.onLoad,this);A.on("loadexception",this.onLoadError,this);this.store=A}});Ext.reg("paging",Ext.PagingToolbar); +Ext.Resizable=function(D,E){this.el=Ext.get(D);if(E&&E.wrap){E.resizeChild=this.el;this.el=this.el.wrap(typeof E.wrap=="object"?E.wrap:{cls:"xresizable-wrap"});this.el.id=this.el.dom.id=E.resizeChild.id+"-rzwrap";this.el.setStyle("overflow","hidden");this.el.setPositioning(E.resizeChild.getPositioning());E.resizeChild.clearPositioning();if(!E.width||!E.height){var F=E.resizeChild.getSize();this.el.setSize(F.width,F.height)}if(E.pinned&&!E.adjustments){E.adjustments="auto"}}this.proxy=this.el.createProxy({tag:"div",cls:"x-resizable-proxy",id:this.el.id+"-rzproxy"},Ext.getBody());this.proxy.unselectable();this.proxy.enableDisplayMode("block");Ext.apply(this,E);if(this.pinned){this.disableTrackOver=true;this.el.addClass("x-resizable-pinned")}var I=this.el.getStyle("position");if(I!="absolute"&&I!="fixed"){this.el.setStyle("position","relative")}if(!this.handles){this.handles="s,e,se";if(this.multiDirectional){this.handles+=",n,w"}}if(this.handles=="all"){this.handles="n s e w ne nw se sw"}var M=this.handles.split(/\s*?[,;]\s*?| /);var C=Ext.Resizable.positions;for(var H=0,J=M.length;H0){if(A>(E/2)){D=C+(E-A)}else{D=C-A}}return Math.max(B,D)},resizeElement:function(){var A=this.proxy.getBox();if(this.updateBox){this.el.setBox(A,false,this.animate,this.duration,null,this.easing)}else{this.el.setSize(A.width,A.height,this.animate,this.duration,null,this.easing)}this.updateChildSize();if(!this.dynamic){this.proxy.hide()}return A},constrain:function(B,C,A,D){if(B-CD){C=D-B}}return C},onMouseMove:function(S){if(this.enabled){try{if(this.resizeRegion&&!this.resizeRegion.contains(S.getPoint())){return }var Q=this.curSize||this.startBox;var I=this.startBox.x,H=this.startBox.y;var C=I,B=H;var J=Q.width,R=Q.height;var D=J,L=R;var K=this.minWidth,T=this.minHeight;var P=this.maxWidth,W=this.maxHeight;var F=this.widthIncrement;var A=this.heightIncrement;var U=S.getXY();var O=-(this.startPoint[0]-Math.max(this.minX,U[0]));var M=-(this.startPoint[1]-Math.max(this.minY,U[1]));var G=this.activeHandle.position;switch(G){case"east":J+=O;J=Math.min(Math.max(K,J),P);break;case"south":R+=M;R=Math.min(Math.max(T,R),W);break;case"southeast":J+=O;R+=M;J=Math.min(Math.max(K,J),P);R=Math.min(Math.max(T,R),W);break;case"north":M=this.constrain(R,M,T,W);H+=M;R-=M;break;case"west":O=this.constrain(J,O,K,P);I+=O;J-=O;break;case"northeast":J+=O;J=Math.min(Math.max(K,J),P);M=this.constrain(R,M,T,W);H+=M;R-=M;break;case"northwest":O=this.constrain(J,O,K,P);M=this.constrain(R,M,T,W);H+=M;R-=M;I+=O;J-=O;break;case"southwest":O=this.constrain(J,O,K,P);R+=M;R=Math.min(Math.max(T,R),W);I+=O;J-=O;break}var N=this.snap(J,F,K);var V=this.snap(R,A,T);if(N!=J||V!=R){switch(G){case"northeast":H-=V-R;break;case"north":H-=V-R;break;case"southwest":I-=N-J;break;case"west":I-=N-J;break;case"northwest":I-=N-J;H-=V-R;break}J=N;R=V}if(this.preserveRatio){switch(G){case"southeast":case"east":R=L*(J/D);R=Math.min(Math.max(T,R),W);J=D*(R/L);break;case"south":J=D*(R/L);J=Math.min(Math.max(K,J),P);R=L*(J/D);break;case"northeast":J=D*(R/L);J=Math.min(Math.max(K,J),P);R=L*(J/D);break;case"north":var X=J;J=D*(R/L);J=Math.min(Math.max(K,J),P);R=L*(J/D);I+=(X-J)/2;break;case"southwest":R=L*(J/D);R=Math.min(Math.max(T,R),W);var X=J;J=D*(R/L);I+=X-J;break;case"west":var E=R;R=L*(J/D);R=Math.min(Math.max(T,R),W);H+=(E-R)/2;var X=J;J=D*(R/L);I+=X-J;break;case"northwest":var X=J;var E=R;R=L*(J/D);R=Math.min(Math.max(T,R),W);J=D*(R/L);H+=E-R;I+=X-J;break}}this.proxy.setBounds(I,H,J,R);if(this.dynamic){this.resizeElement()}}catch(S){}}},handleOver:function(){if(this.enabled){this.el.addClass("x-resizable-over")}},handleOut:function(){if(!this.resizing){this.el.removeClass("x-resizable-over")}},getEl:function(){return this.el},getResizeChild:function(){return this.resizeChild},destroy:function(C){this.proxy.remove();if(this.overlay){this.overlay.removeAllListeners();this.overlay.remove()}var D=Ext.Resizable.positions;for(var A in D){if(typeof D[A]!="function"&&this[D[A]]){var B=this[D[A]];B.el.removeAllListeners();B.el.remove()}}if(C){this.el.update("");this.el.remove()}},syncHandleHeight:function(){var A=this.el.getHeight(true);if(this.west){this.west.el.setHeight(A)}if(this.east){this.east.el.setHeight(A)}}});Ext.Resizable.positions={n:"north",s:"south",e:"east",w:"west",se:"southeast",sw:"southwest",nw:"northwest",ne:"northeast"};Ext.Resizable.Handle=function(C,E,B,D){if(!this.tpl){var A=Ext.DomHelper.createTemplate({tag:"div",cls:"x-resizable-handle x-resizable-handle-{0}"});A.compile();Ext.Resizable.Handle.prototype.tpl=A}this.position=E;this.rz=C;this.el=this.tpl.append(C.el.dom,[this.position],true);this.el.unselectable();if(D){this.el.setOpacity(0)}this.el.on("mousedown",this.onMouseDown,this);if(!B){this.el.on("mouseover",this.onMouseOver,this);this.el.on("mouseout",this.onMouseOut,this)}};Ext.Resizable.Handle.prototype={afterResize:function(A){},onMouseDown:function(A){this.rz.onMouseDown(this,A)},onMouseOver:function(A){this.rz.handleOver(this,A)},onMouseOut:function(A){this.rz.handleOut(this,A)}}; +Ext.Editor=function(B,A){this.field=B;Ext.Editor.superclass.constructor.call(this,A)};Ext.extend(Ext.Editor,Ext.Component,{value:"",alignment:"c-c?",shadow:"frame",constrain:false,swallowKeys:true,completeOnEnter:false,cancelOnEsc:false,updateEl:false,initComponent:function(){Ext.Editor.superclass.initComponent.call(this);this.addEvents("beforestartedit","startedit","beforecomplete","complete","canceledit","specialkey")},onRender:function(B,A){this.el=new Ext.Layer({shadow:this.shadow,cls:"x-editor",parentEl:B,shim:this.shim,shadowOffset:4,id:this.id,constrain:this.constrain});this.el.setStyle("overflow",Ext.isGecko?"auto":"hidden");if(this.field.msgTarget!="title"){this.field.msgTarget="qtip"}this.field.inEditor=true;this.field.render(this.el);if(Ext.isGecko){this.field.el.dom.setAttribute("autocomplete","off")}this.field.on("specialkey",this.onSpecialKey,this);if(this.swallowKeys){this.field.el.swallowEvent(["keydown","keypress"])}this.field.show();this.field.on("blur",this.onBlur,this);if(this.field.grow){this.field.on("autosize",this.el.sync,this.el,{delay:1})}},onSpecialKey:function(C,B){var A=B.getKey();if(this.completeOnEnter&&A==B.ENTER){B.stopEvent();this.completeEdit()}else{if(this.cancelOnEsc&&A==B.ESC){this.cancelEdit()}else{this.fireEvent("specialkey",C,B)}}if(this.field.triggerBlur&&(A==B.ENTER||A==B.ESC||A==B.TAB)){this.field.triggerBlur()}},startEdit:function(B,C){if(this.editing){this.completeEdit()}this.boundEl=Ext.get(B);var A=C!==undefined?C:this.boundEl.dom.innerHTML;if(!this.rendered){this.render(this.parentEl||document.body)}if(this.fireEvent("beforestartedit",this,this.boundEl,A)===false){return }this.startValue=A;this.field.setValue(A);this.doAutoSize();this.el.alignTo(this.boundEl,this.alignment);this.editing=true;this.show()},doAutoSize:function(){if(this.autoSize){var A=this.boundEl.getSize();switch(this.autoSize){case"width":this.setSize(A.width,"");break;case"height":this.setSize("",A.height);break;default:this.setSize(A.width,A.height)}}},setSize:function(A,B){delete this.field.lastSize;this.field.setSize(A,B);if(this.el){if(Ext.isGecko2||Ext.isOpera){this.el.setSize(A,B)}this.el.sync()}},realign:function(){this.el.alignTo(this.boundEl,this.alignment)},completeEdit:function(A){if(!this.editing){return }var B=this.getValue();if(this.revertInvalid!==false&&!this.field.isValid()){B=this.startValue;this.cancelEdit(true)}if(String(B)===String(this.startValue)&&this.ignoreNoChange){this.editing=false;this.hide();return }if(this.fireEvent("beforecomplete",this,B,this.startValue)!==false){this.editing=false;if(this.updateEl&&this.boundEl){this.boundEl.update(B)}if(A!==true){this.hide()}this.fireEvent("complete",this,B,this.startValue)}},onShow:function(){this.el.show();if(this.hideEl!==false){this.boundEl.hide()}this.field.show();if(Ext.isIE&&!this.fixIEFocus){this.fixIEFocus=true;this.deferredFocus.defer(50,this)}else{this.field.focus()}this.fireEvent("startedit",this.boundEl,this.startValue)},deferredFocus:function(){if(this.editing){this.field.focus()}},cancelEdit:function(A){if(this.editing){var B=this.getValue();this.setValue(this.startValue);if(A!==true){this.hide()}this.fireEvent("canceledit",this,B,this.startValue)}},onBlur:function(){if(this.allowBlur!==true&&this.editing){this.completeEdit()}},onHide:function(){if(this.editing){this.completeEdit();return }this.field.blur();if(this.field.collapse){this.field.collapse()}this.el.hide();if(this.hideEl!==false){this.boundEl.show()}},setValue:function(A){this.field.setValue(A)},getValue:function(){return this.field.getValue()},beforeDestroy:function(){this.field.destroy();this.field=null}});Ext.reg("editor",Ext.Editor); +Ext.MessageBox=function(){var R,B,N,Q;var G,J,P,A,K,M,H,F;var O,S,L,C="";var D=function(U){if(R.isVisible()){R.hide();Ext.callback(B.fn,B.scope||window,[U,S.dom.value],1)}};var T=function(){if(B&&B.cls){R.el.removeClass(B.cls)}K.reset()};var E=function(W,U,V){if(B&&B.closable!==false){R.hide()}if(V){V.stopEvent()}};var I=function(U){var W=0;if(!U){O["ok"].hide();O["cancel"].hide();O["yes"].hide();O["no"].hide();return W}R.footer.dom.style.display="";for(var V in O){if(typeof O[V]!="function"){if(U[V]){O[V].show();O[V].setText(typeof U[V]=="string"?U[V]:Ext.MessageBox.buttonText[V]);W+=O[V].el.getWidth()+15}else{O[V].hide()}}}return W};return{getDialog:function(U){if(!R){R=new Ext.Window({autoCreate:true,title:U,resizable:false,constrain:true,constrainHeader:true,minimizable:false,maximizable:false,stateful:false,modal:true,shim:true,buttonAlign:"center",width:400,height:100,minHeight:80,plain:true,footer:true,closable:true,close:function(){if(B&&B.buttons&&B.buttons.no&&!B.buttons.cancel){D("no")}else{D("cancel")}}});O={};var V=this.buttonText;O["ok"]=R.addButton(V["ok"],D.createCallback("ok"));O["yes"]=R.addButton(V["yes"],D.createCallback("yes"));O["no"]=R.addButton(V["no"],D.createCallback("no"));O["cancel"]=R.addButton(V["cancel"],D.createCallback("cancel"));O["ok"].hideMode=O["yes"].hideMode=O["no"].hideMode=O["cancel"].hideMode="offsets";R.render(document.body);R.getEl().addClass("x-window-dlg");N=R.mask;G=R.body.createChild({html:"

      "});H=Ext.get(G.dom.firstChild);var W=G.dom.childNodes[1];J=Ext.get(W.firstChild);P=Ext.get(W.childNodes[2].firstChild);P.enableDisplayMode();P.addKeyListener([10,13],function(){if(R.isVisible()&&B&&B.buttons){if(B.buttons.ok){D("ok")}else{if(B.buttons.yes){D("yes")}}}});A=Ext.get(W.childNodes[2].childNodes[1]);A.enableDisplayMode();K=new Ext.ProgressBar({renderTo:G});G.createChild({cls:"x-clear"})}return R},updateText:function(X){if(!R.isVisible()&&!B.width){R.setSize(this.maxWidth,100)}J.update(X||" ");var V=C!=""?(H.getWidth()+H.getMargins("lr")):0;var Z=J.getWidth()+J.getMargins("lr");var W=R.getFrameWidth("lr");var Y=R.body.getFrameWidth("lr");if(Ext.isIE&&V>0){V+=3}var U=Math.max(Math.min(B.width||V+Z+W+Y,this.maxWidth),Math.max(B.minWidth||this.minWidth,L||0));if(B.prompt===true){S.setWidth(U-V-W-Y)}if(B.progress===true||B.wait===true){K.setSize(U-V-W-Y)}R.setSize(U,"auto").center();return this},updateProgress:function(V,U,W){K.updateProgress(V,U);if(W){this.updateText(W)}return this},isVisible:function(){return R&&R.isVisible()},hide:function(){if(this.isVisible()){R.hide();T()}return this},show:function(X){if(this.isVisible()){this.hide()}B=X;var Y=this.getDialog(B.title||" ");Y.setTitle(B.title||" ");var U=(B.closable!==false&&B.progress!==true&&B.wait!==true);Y.tools.close.setDisplayed(U);S=P;B.prompt=B.prompt||(B.multiline?true:false);if(B.prompt){if(B.multiline){P.hide();A.show();A.setHeight(typeof B.multiline=="number"?B.multiline:this.defaultTextHeight);S=A}else{P.show();A.hide()}}else{P.hide();A.hide()}S.dom.value=B.value||"";if(B.prompt){Y.focusEl=S}else{var W=B.buttons;var V=null;if(W&&W.ok){V=O["ok"]}else{if(W&&W.yes){V=O["yes"]}}if(V){Y.focusEl=V}}if(B.iconCls){Y.setIconClass(B.iconCls)}this.setIcon(B.icon);L=I(B.buttons);K.setVisible(B.progress===true||B.wait===true);this.updateProgress(0,B.progressText);this.updateText(B.msg);if(B.cls){Y.el.addClass(B.cls)}Y.proxyDrag=B.proxyDrag===true;Y.modal=B.modal!==false;Y.mask=B.modal!==false?N:false;if(!Y.isVisible()){document.body.appendChild(R.el.dom);Y.setAnimateTarget(B.animEl);Y.show(B.animEl)}Y.on("show",function(){if(U===true){Y.keyMap.enable()}else{Y.keyMap.disable()}},this,{single:true});if(B.wait===true){K.wait(B.waitConfig)}return this},setIcon:function(U){if(U&&U!=""){H.removeClass("x-hidden");H.replaceClass(C,U);C=U}else{H.replaceClass(C,"x-hidden");C=""}return this},progress:function(W,V,U){this.show({title:W,msg:V,buttons:false,progress:true,closable:false,minWidth:this.minProgressWidth,progressText:U});return this},wait:function(W,V,U){this.show({title:V,msg:W,buttons:false,closable:false,wait:true,modal:true,minWidth:this.minProgressWidth,waitConfig:U});return this},alert:function(X,W,V,U){this.show({title:X,msg:W,buttons:this.OK,fn:V,scope:U});return this},confirm:function(X,W,V,U){this.show({title:X,msg:W,buttons:this.YESNO,fn:V,scope:U,icon:this.QUESTION});return this},prompt:function(Z,Y,W,V,U,X){this.show({title:Z,msg:Y,buttons:this.OKCANCEL,fn:W,minWidth:250,scope:V,prompt:true,multiline:U,value:X});return this},OK:{ok:true},CANCEL:{cancel:true},OKCANCEL:{ok:true,cancel:true},YESNO:{yes:true,no:true},YESNOCANCEL:{yes:true,no:true,cancel:true},INFO:"ext-mb-info",WARNING:"ext-mb-warning",QUESTION:"ext-mb-question",ERROR:"ext-mb-error",defaultTextHeight:75,maxWidth:600,minWidth:100,minProgressWidth:250,buttonText:{ok:"OK",cancel:"Cancel",yes:"Yes",no:"No"}}}();Ext.Msg=Ext.MessageBox; +Ext.Tip=Ext.extend(Ext.Panel,{minWidth:40,maxWidth:300,shadow:"sides",defaultAlign:"tl-bl?",autoRender:true,quickShowInterval:250,frame:true,hidden:true,baseCls:"x-tip",floating:{shadow:true,shim:true,useDisplay:true,constrain:false},autoHeight:true,initComponent:function(){Ext.Tip.superclass.initComponent.call(this);if(this.closable&&!this.title){this.elements+=",header"}},afterRender:function(){Ext.Tip.superclass.afterRender.call(this);if(this.closable){this.addTool({id:"close",handler:this.hide,scope:this})}},showAt:function(A){Ext.Tip.superclass.show.call(this);if(this.measureWidth!==false&&(!this.initialConfig||typeof this.initialConfig.width!="number")){this.doAutoWidth()}if(this.constrainPosition){A=this.el.adjustForConstraints(A)}this.setPagePosition(A[0],A[1])},doAutoWidth:function(){var A=this.body.getTextWidth();if(this.title){A=Math.max(A,this.header.child("span").getTextWidth(this.title))}A+=this.getFrameWidth()+(this.closable?20:0)+this.body.getPadding("lr");this.setWidth(A.constrain(this.minWidth,this.maxWidth));if(Ext.isIE7&&!this.repainted){this.el.repaint();this.repainted=true}},showBy:function(A,B){if(!this.rendered){this.render(Ext.getBody())}this.showAt(this.el.getAlignToXY(A,B||this.defaultAlign))},initDraggable:function(){this.dd=new Ext.Tip.DD(this,typeof this.draggable=="boolean"?null:this.draggable);this.header.addClass("x-tip-draggable")}});Ext.Tip.DD=function(B,A){Ext.apply(this,A);this.tip=B;Ext.Tip.DD.superclass.constructor.call(this,B.el.id,"WindowDD-"+B.id);this.setHandleElId(B.header.id);this.scroll=false};Ext.extend(Ext.Tip.DD,Ext.dd.DD,{moveOnly:true,scroll:false,headerOffsets:[100,25],startDrag:function(){this.tip.el.disableShadow()},endDrag:function(A){this.tip.el.enableShadow(true)}}); +Ext.ToolTip=Ext.extend(Ext.Tip,{showDelay:500,hideDelay:200,dismissDelay:5000,mouseOffset:[15,18],trackMouse:false,constrainPosition:true,initComponent:function(){Ext.ToolTip.superclass.initComponent.call(this);this.lastActive=new Date();this.initTarget()},initTarget:function(){if(this.target){this.target=Ext.get(this.target);this.target.on("mouseover",this.onTargetOver,this);this.target.on("mouseout",this.onTargetOut,this);this.target.on("mousemove",this.onMouseMove,this)}},onMouseMove:function(A){this.targetXY=A.getXY();if(!this.hidden&&this.trackMouse){this.setPagePosition(this.getTargetXY())}},getTargetXY:function(){return[this.targetXY[0]+this.mouseOffset[0],this.targetXY[1]+this.mouseOffset[1]]},onTargetOver:function(A){if(this.disabled||A.within(this.target.dom,true)){return }this.clearTimer("hide");this.targetXY=A.getXY();this.delayShow()},delayShow:function(){if(this.hidden&&!this.showTimer){if(this.lastActive.getElapsed()=C){D=C-B-5}return{x:A,y:D}},onDestroy:function(){Ext.ToolTip.superclass.onDestroy.call(this);if(this.target){this.target.un("mouseover",this.onTargetOver,this);this.target.un("mouseout",this.onTargetOut,this);this.target.un("mousemove",this.onMouseMove,this)}}}); +Ext.QuickTip=Ext.extend(Ext.ToolTip,{interceptTitles:false,tagConfig:{namespace:"ext",attribute:"qtip",width:"qwidth",target:"target",title:"qtitle",hide:"hide",cls:"qclass",align:"qalign"},initComponent:function(){this.target=this.target||Ext.getDoc();this.targets=this.targets||{};Ext.QuickTip.superclass.initComponent.call(this)},register:function(D){var F=Ext.isArray(D)?D:arguments;for(var E=0,A=F.length;E0){var D=function(H,G){if(H&&G){var I=G.findChild(A,B);if(I){I.select();if(F){F(true,I)}}else{if(F){F(false,I)}}}else{if(F){F(false,I)}}};this.expandPath(C.join(this.pathSeparator),A,D)}else{this.root.select();if(F){F(true,this.root)}}},getTreeEl:function(){return this.body},onRender:function(B,A){Ext.tree.TreePanel.superclass.onRender.call(this,B,A);this.el.addClass("x-tree");this.innerCt=this.body.createChild({tag:"ul",cls:"x-tree-root-ct "+(this.useArrows?"x-tree-arrows":this.lines?"x-tree-lines":"x-tree-no-lines")})},initEvents:function(){Ext.tree.TreePanel.superclass.initEvents.call(this);if(this.containerScroll){Ext.dd.ScrollManager.register(this.body)}if((this.enableDD||this.enableDrop)&&!this.dropZone){this.dropZone=new Ext.tree.TreeDropZone(this,this.dropConfig||{ddGroup:this.ddGroup||"TreeDD",appendOnly:this.ddAppendOnly===true})}if((this.enableDD||this.enableDrag)&&!this.dragZone){this.dragZone=new Ext.tree.TreeDragZone(this,this.dragConfig||{ddGroup:this.ddGroup||"TreeDD",scroll:this.ddScroll})}this.getSelectionModel().init(this)},afterRender:function(){Ext.tree.TreePanel.superclass.afterRender.call(this);this.root.render();if(!this.rootVisible){this.root.renderChildren()}},onDestroy:function(){if(this.rendered){this.body.removeAllListeners();Ext.dd.ScrollManager.unregister(this.body);if(this.dropZone){this.dropZone.unreg()}if(this.dragZone){this.dragZone.unreg()}}this.root.destroy();this.nodeHash=null;Ext.tree.TreePanel.superclass.onDestroy.call(this)}});Ext.tree.TreePanel.nodeTypes={};Ext.reg("treepanel",Ext.tree.TreePanel); +Ext.tree.TreeEventModel=function(A){this.tree=A;this.tree.on("render",this.initEvents,this)};Ext.tree.TreeEventModel.prototype={initEvents:function(){var A=this.tree.getTreeEl();A.on("click",this.delegateClick,this);if(this.tree.trackMouseOver!==false){A.on("mouseover",this.delegateOver,this);A.on("mouseout",this.delegateOut,this)}A.on("dblclick",this.delegateDblClick,this);A.on("contextmenu",this.delegateContextMenu,this)},getNode:function(B){var A;if(A=B.getTarget(".x-tree-node-el",10)){var C=Ext.fly(A,"_treeEvents").getAttributeNS("ext","tree-node-id");if(C){return this.tree.getNodeById(C)}}return null},getNodeTarget:function(B){var A=B.getTarget(".x-tree-node-icon",1);if(!A){A=B.getTarget(".x-tree-node-el",6)}return A},delegateOut:function(B,A){if(!this.beforeEvent(B)){return }if(B.getTarget(".x-tree-ec-icon",1)){var C=this.getNode(B);this.onIconOut(B,C);if(C==this.lastEcOver){delete this.lastEcOver}}if((A=this.getNodeTarget(B))&&!B.within(A,true)){this.onNodeOut(B,this.getNode(B))}},delegateOver:function(B,A){if(!this.beforeEvent(B)){return }if(this.lastEcOver){this.onIconOut(B,this.lastEcOver);delete this.lastEcOver}if(B.getTarget(".x-tree-ec-icon",1)){this.lastEcOver=this.getNode(B);this.onIconOver(B,this.lastEcOver)}if(A=this.getNodeTarget(B)){this.onNodeOver(B,this.getNode(B))}},delegateClick:function(B,A){if(!this.beforeEvent(B)){return }if(B.getTarget("input[type=checkbox]",1)){this.onCheckboxClick(B,this.getNode(B))}else{if(B.getTarget(".x-tree-ec-icon",1)){this.onIconClick(B,this.getNode(B))}else{if(this.getNodeTarget(B)){this.onNodeClick(B,this.getNode(B))}}}},delegateDblClick:function(B,A){if(this.beforeEvent(B)&&this.getNodeTarget(B)){this.onNodeDblClick(B,this.getNode(B))}},delegateContextMenu:function(B,A){if(this.beforeEvent(B)&&this.getNodeTarget(B)){this.onNodeContextMenu(B,this.getNode(B))}},onNodeClick:function(B,A){A.ui.onClick(B)},onNodeOver:function(B,A){A.ui.onOver(B)},onNodeOut:function(B,A){A.ui.onOut(B)},onIconOver:function(B,A){A.ui.addClass("x-tree-ec-over")},onIconOut:function(B,A){A.ui.removeClass("x-tree-ec-over")},onIconClick:function(B,A){A.ui.ecClick(B)},onCheckboxClick:function(B,A){A.ui.onCheckChange(B)},onNodeDblClick:function(B,A){A.ui.onDblClick(B)},onNodeContextMenu:function(B,A){A.ui.onContextMenu(B)},beforeEvent:function(A){if(this.disabled){A.stopEvent();return false}return true},disable:function(){this.disabled=true},enable:function(){this.disabled=false}}; +Ext.tree.DefaultSelectionModel=function(A){this.selNode=null;this.addEvents("selectionchange","beforeselect");Ext.apply(this,A);Ext.tree.DefaultSelectionModel.superclass.constructor.call(this)};Ext.extend(Ext.tree.DefaultSelectionModel,Ext.util.Observable,{init:function(A){this.tree=A;A.getTreeEl().on("keydown",this.onKeyDown,this);A.on("click",this.onNodeClick,this)},onNodeClick:function(A,B){this.select(A)},select:function(B){var A=this.selNode;if(A!=B&&this.fireEvent("beforeselect",this,B,A)!==false){if(A){A.ui.onSelectedChange(false)}this.selNode=B;B.ui.onSelectedChange(true);this.fireEvent("selectionchange",this,B,A)}return B},unselect:function(A){if(this.selNode==A){this.clearSelections()}},clearSelections:function(){var A=this.selNode;if(A){A.ui.onSelectedChange(false);this.selNode=null;this.fireEvent("selectionchange",this,null)}return A},getSelectedNode:function(){return this.selNode},isSelected:function(A){return this.selNode==A},selectPrevious:function(){var A=this.selNode||this.lastSelNode;if(!A){return null}var C=A.previousSibling;if(C){if(!C.isExpanded()||C.childNodes.length<1){return this.select(C)}else{var B=C.lastChild;while(B&&B.isExpanded()&&B.childNodes.length>0){B=B.lastChild}return this.select(B)}}else{if(A.parentNode&&(this.tree.rootVisible||!A.parentNode.isRoot)){return this.select(A.parentNode)}}return null},selectNext:function(){var B=this.selNode||this.lastSelNode;if(!B){return null}if(B.firstChild&&B.isExpanded()){return this.select(B.firstChild)}else{if(B.nextSibling){return this.select(B.nextSibling)}else{if(B.parentNode){var A=null;B.parentNode.bubble(function(){if(this.nextSibling){A=this.getOwnerTree().selModel.select(this.nextSibling);return false}});return A}}}return null},onKeyDown:function(C){var B=this.selNode||this.lastSelNode;var D=this;if(!B){return }var A=C.getKey();switch(A){case C.DOWN:C.stopEvent();this.selectNext();break;case C.UP:C.stopEvent();this.selectPrevious();break;case C.RIGHT:C.preventDefault();if(B.hasChildNodes()){if(!B.isExpanded()){B.expand()}else{if(B.firstChild){this.select(B.firstChild,C)}}}break;case C.LEFT:C.preventDefault();if(B.hasChildNodes()&&B.isExpanded()){B.collapse()}else{if(B.parentNode&&(this.tree.rootVisible||B.parentNode!=this.tree.getRootNode())){this.select(B.parentNode,C)}}break}}});Ext.tree.MultiSelectionModel=function(A){this.selNodes=[];this.selMap={};this.addEvents("selectionchange");Ext.apply(this,A);Ext.tree.MultiSelectionModel.superclass.constructor.call(this)};Ext.extend(Ext.tree.MultiSelectionModel,Ext.util.Observable,{init:function(A){this.tree=A;A.getTreeEl().on("keydown",this.onKeyDown,this);A.on("click",this.onNodeClick,this)},onNodeClick:function(A,B){this.select(A,B,B.ctrlKey)},select:function(A,C,B){if(B!==true){this.clearSelections(true)}if(this.isSelected(A)){this.lastSelNode=A;return A}this.selNodes.push(A);this.selMap[A.id]=A;this.lastSelNode=A;A.ui.onSelectedChange(true);this.fireEvent("selectionchange",this,this.selNodes);return A},unselect:function(B){if(this.selMap[B.id]){B.ui.onSelectedChange(false);var C=this.selNodes;var A=C.indexOf(B);if(A!=-1){this.selNodes.splice(A,1)}delete this.selMap[B.id];this.fireEvent("selectionchange",this,this.selNodes)}},clearSelections:function(B){var D=this.selNodes;if(D.length>0){for(var C=0,A=D.length;C
      ","",this.indentMarkup,"","","",E?("":"/>")):"","",D.text,"
      ","
        ",""].join("");var A;if(J!==true&&D.nextSibling&&(A=D.nextSibling.ui.getEl())){this.wrap=Ext.DomHelper.insertHtml("beforeBegin",A,C)}else{this.wrap=Ext.DomHelper.insertHtml("beforeEnd",H,C)}this.elNode=this.wrap.childNodes[0];this.ctNode=this.wrap.childNodes[1];var G=this.elNode.childNodes;this.indentNode=G[0];this.ecNode=G[1];this.iconNode=G[2];var F=3;if(E){this.checkbox=G[3];this.checkbox.defaultChecked=this.checkbox.checked;F++}this.anchor=G[F];this.textNode=G[F].firstChild},getAnchor:function(){return this.anchor},getTextEl:function(){return this.textNode},getIconEl:function(){return this.iconNode},isChecked:function(){return this.checkbox?this.checkbox.checked:false},updateExpandIcon:function(){if(this.rendered){var E=this.node,D,C;var A=E.isLast()?"x-tree-elbow-end":"x-tree-elbow";if(E.isExpandable()){if(E.expanded){A+="-minus";D="x-tree-node-collapsed";C="x-tree-node-expanded"}else{A+="-plus";D="x-tree-node-expanded";C="x-tree-node-collapsed"}if(this.wasLeaf){this.removeClass("x-tree-node-leaf");this.wasLeaf=false}if(this.c1!=D||this.c2!=C){Ext.fly(this.elNode).replaceClass(D,C);this.c1=D;this.c2=C}}else{if(!this.wasLeaf){Ext.fly(this.elNode).replaceClass("x-tree-node-expanded","x-tree-node-leaf");delete this.c1;delete this.c2;this.wasLeaf=true}}var B="x-tree-ec-icon "+A;if(this.ecc!=B){this.ecNode.className=B;this.ecc=B}}},getChildIndent:function(){if(!this.childIndent){var A=[];var B=this.node;while(B){if(!B.isRoot||(B.isRoot&&B.ownerTree.rootVisible)){if(!B.isLast()){A.unshift("")}else{A.unshift("")}}B=B.parentNode}this.childIndent=A.join("")}return this.childIndent},renderIndent:function(){if(this.rendered){var A="";var B=this.node.parentNode;if(B){A=B.ui.getChildIndent()}if(this.indentMarkup!=A){this.indentNode.innerHTML=A;this.indentMarkup=A}this.updateExpandIcon()}},destroy:function(){if(this.elNode){Ext.dd.Registry.unregister(this.elNode.id)}delete this.elNode;delete this.ctNode;delete this.indentNode;delete this.ecNode;delete this.iconNode;delete this.checkbox;delete this.anchor;delete this.textNode;Ext.removeNode(this.ctNode)}};Ext.tree.RootTreeNodeUI=Ext.extend(Ext.tree.TreeNodeUI,{render:function(){if(!this.rendered){var A=this.node.ownerTree.innerCt.dom;this.node.expanded=true;A.innerHTML="
        ";this.wrap=this.ctNode=A.firstChild}},collapse:Ext.emptyFn,expand:Ext.emptyFn}); +Ext.tree.TreeLoader=function(A){this.baseParams={};Ext.apply(this,A);this.addEvents("beforeload","load","loadexception");Ext.tree.TreeLoader.superclass.constructor.call(this)};Ext.extend(Ext.tree.TreeLoader,Ext.util.Observable,{uiProviders:{},clearOnLoad:true,load:function(A,B){if(this.clearOnLoad){while(A.firstChild){A.removeChild(A.firstChild)}}if(this.doPreload(A)){if(typeof B=="function"){B()}}else{if(this.dataUrl||this.url){this.requestData(A,B)}}},doPreload:function(D){if(D.attributes.children){if(D.childNodes.length<1){var C=D.attributes.children;D.beginUpdate();for(var B=0,A=C.length;BK){return E?-1:+1}else{return 0}}}};Ext.tree.TreeSorter.prototype={doSort:function(A){A.sort(this.sortFn)},compareNodes:function(B,A){return(B.text.toUpperCase()>A.text.toUpperCase()?1:-1)},updateSort:function(A,B){if(B.childrenRendered){this.doSort.defer(1,this,[B])}},updateSortParent:function(A){var B=A.parentNode;if(B&&B.childrenRendered){this.doSort.defer(1,this,[B])}}}; +if(Ext.dd.DropZone){Ext.tree.TreeDropZone=function(A,B){this.allowParentInsert=false;this.allowContainerDrop=false;this.appendOnly=false;Ext.tree.TreeDropZone.superclass.constructor.call(this,A.innerCt,B);this.tree=A;this.dragOverData={};this.lastInsertClass="x-tree-no-status"};Ext.extend(Ext.tree.TreeDropZone,Ext.dd.DropZone,{ddGroup:"TreeDD",expandDelay:1000,expandNode:function(A){if(A.hasChildNodes()&&!A.isExpanded()){A.expand(false,null,this.triggerCacheRefresh.createDelegate(this))}},queueExpand:function(A){this.expandProcId=this.expandNode.defer(this.expandDelay,this,[A])},cancelExpand:function(){if(this.expandProcId){clearTimeout(this.expandProcId);this.expandProcId=false}},isValidDropPoint:function(A,I,G,D,C){if(!A||!C){return false}var E=A.node;var F=C.node;if(!(E&&E.isTarget&&I)){return false}if(I=="append"&&E.allowChildren===false){return false}if((I=="above"||I=="below")&&(E.parentNode&&E.parentNode.allowChildren===false)){return false}if(F&&(E==F||F.contains(E))){return false}var B=this.dragOverData;B.tree=this.tree;B.target=E;B.data=C;B.point=I;B.source=G;B.rawEvent=D;B.dropNode=F;B.cancel=false;var H=this.tree.fireEvent("nodedragover",B);return B.cancel===false&&H!==false},getDropPoint:function(E,D,I){var J=D.node;if(J.isRoot){return J.allowChildren!==false?"append":false}var B=D.ddel;var K=Ext.lib.Dom.getY(B),G=K+B.offsetHeight;var F=Ext.lib.Event.getPageY(E);var H=J.allowChildren===false||J.isLeaf();if(this.appendOnly||J.parentNode.allowChildren===false){return H?false:"append"}var C=false;if(!this.allowParentInsert){C=J.hasChildNodes()&&J.isExpanded()}var A=(G-K)/(H?2:3);if(F>=K&&F<(K+A)){return"above"}else{if(!C&&(H||F>=G-A&&F<=G)){return"below"}else{return"append"}}},onNodeEnter:function(D,A,C,B){this.cancelExpand()},onNodeOver:function(B,G,F,E){var I=this.getDropPoint(F,B,G);var C=B.node;if(!this.expandProcId&&I=="append"&&C.hasChildNodes()&&!B.node.isExpanded()){this.queueExpand(C)}else{if(I!="append"){this.cancelExpand()}}var D=this.dropNotAllowed;if(this.isValidDropPoint(B,I,G,F,E)){if(I){var A=B.ddel;var H;if(I=="above"){D=B.node.isFirst()?"x-tree-drop-ok-above":"x-tree-drop-ok-between";H="x-tree-drag-insert-above"}else{if(I=="below"){D=B.node.isLast()?"x-tree-drop-ok-below":"x-tree-drop-ok-between";H="x-tree-drag-insert-below"}else{D="x-tree-drop-ok-append";H="x-tree-drag-append"}}if(this.lastInsertClass!=H){Ext.fly(A).replaceClass(this.lastInsertClass,H);this.lastInsertClass=H}}}return D},onNodeOut:function(D,A,C,B){this.cancelExpand();this.removeDropIndicators(D)},onNodeDrop:function(C,I,E,D){var H=this.getDropPoint(E,C,I);var F=C.node;F.ui.startDrop();if(!this.isValidDropPoint(C,H,I,E,D)){F.ui.endDrop();return false}var G=D.node||(I.getTreeNode?I.getTreeNode(D,F,H,E):null);var B={tree:this.tree,target:F,data:D,point:H,source:I,rawEvent:E,dropNode:G,cancel:!G,dropStatus:false};var A=this.tree.fireEvent("beforenodedrop",B);if(A===false||B.cancel===true||!B.dropNode){F.ui.endDrop();return B.dropStatus}F=B.target;if(H=="append"&&!F.isExpanded()){F.expand(false,null,function(){this.completeDrop(B)}.createDelegate(this))}else{this.completeDrop(B)}return true},completeDrop:function(G){var D=G.dropNode,E=G.point,C=G.target;if(!Ext.isArray(D)){D=[D]}var F;for(var B=0,A=D.length;BD.offsetLeft){E.scrollLeft=D.offsetLeft}var A=Math.min(this.maxWidth,(E.clientWidth>20?E.clientWidth:E.offsetWidth)-Math.max(0,D.offsetLeft-E.scrollLeft)-5);this.setSize(A,"")},triggerEdit:function(A,B){this.completeEdit();if(A.attributes.editable!==false){this.editNode=A;if(this.tree.autoScroll){A.ui.getEl().scrollIntoView(this.tree.body)}this.autoEditTimer=this.startEdit.defer(this.editDelay,this,[A.ui.textNode,A.text]);return false}},bindScroll:function(){this.tree.getTreeEl().on("scroll",this.cancelEdit,this)},beforeNodeClick:function(A,B){clearTimeout(this.autoEditTimer);if(this.tree.getSelectionModel().isSelected(A)){B.stopEvent();return this.triggerEdit(A)}},onNodeDblClick:function(A,B){clearTimeout(this.autoEditTimer)},updateNode:function(A,B){this.tree.getTreeEl().un("scroll",this.cancelEdit,this);this.editNode.setText(B)},onHide:function(){Ext.tree.TreeEditor.superclass.onHide.call(this);if(this.editNode){this.editNode.ui.focus.defer(50,this.editNode.ui)}},onSpecialKey:function(C,B){var A=B.getKey();if(A==B.ESC){B.stopEvent();this.cancelEdit()}else{if(A==B.ENTER&&!B.hasModifier()){B.stopEvent();this.completeEdit()}}}}); +Ext.menu.Menu=function(A){if(Ext.isArray(A)){A={items:A}}Ext.apply(this,A);this.id=this.id||Ext.id();this.addEvents("beforeshow","beforehide","show","hide","click","mouseover","mouseout","itemclick");Ext.menu.MenuMgr.register(this);Ext.menu.Menu.superclass.constructor.call(this);var B=this.items;this.items=new Ext.util.MixedCollection();if(B){this.add.apply(this,B)}};Ext.extend(Ext.menu.Menu,Ext.util.Observable,{minWidth:120,shadow:"sides",subMenuAlign:"tl-tr?",defaultAlign:"tl-bl?",allowOtherMenus:false,ignoreParentClicks:false,hidden:true,createEl:function(){return new Ext.Layer({cls:"x-menu",shadow:this.shadow,constrain:false,parentEl:this.parentEl||document.body,zindex:15000})},render:function(){if(this.el){return }var B=this.el=this.createEl();if(!this.keyNav){this.keyNav=new Ext.menu.MenuNav(this)}if(this.plain){B.addClass("x-menu-plain")}if(this.cls){B.addClass(this.cls)}this.focusEl=B.createChild({tag:"a",cls:"x-menu-focus",href:"#",onclick:"return false;",tabIndex:"-1"});var A=B.createChild({tag:"ul",cls:"x-menu-list"});A.on("click",this.onClick,this);A.on("mouseover",this.onMouseOver,this);A.on("mouseout",this.onMouseOut,this);this.items.each(function(D){var C=document.createElement("li");C.className="x-menu-list-item";A.dom.appendChild(C);D.render(C,this)},this);this.ul=A;this.autoWidth()},autoWidth:function(){var D=this.el,C=this.ul;if(!D){return }var A=this.width;if(A){D.setWidth(A)}else{if(Ext.isIE){D.setWidth(this.minWidth);var B=D.dom.offsetWidth;D.setWidth(C.getWidth()+D.getFrameWidth("lr"))}}},delayAutoWidth:function(){if(this.el){if(!this.awTask){this.awTask=new Ext.util.DelayedTask(this.autoWidth,this)}this.awTask.delay(20)}},findTargetItem:function(B){var A=B.getTarget(".x-menu-list-item",this.ul,true);if(A&&A.menuItemId){return this.items.get(A.menuItemId)}},onClick:function(B){var A;if(A=this.findTargetItem(B)){if(A.menu&&this.ignoreParentClicks){A.expandMenu()}else{A.onClick(B);this.fireEvent("click",this,A,B)}}},setActiveItem:function(A,B){if(A!=this.activeItem){if(this.activeItem){this.activeItem.deactivate()}this.activeItem=A;A.activate(B)}else{if(B){A.expandMenu()}}},tryActivate:function(F,E){var B=this.items;for(var C=F,A=B.length;C>=0&&C0){H()}})}function H(){if(D&&D.length>0){var N=D.clone();N.each(function(O){O.hide()})}}function E(N){D.remove(N);if(D.length<1){Ext.getDoc().un("mousedown",L);A=false}}function J(N){var O=D.last();K=new Date();D.add(N);if(!A){Ext.getDoc().on("mousedown",L);A=true}if(N.parentMenu){N.getEl().setZIndex(parseInt(N.parentMenu.getEl().getStyle("z-index"),10)+3);N.parentMenu.activeChild=N}else{if(O&&O.isVisible()){N.getEl().setZIndex(parseInt(O.getEl().getStyle("z-index"),10)+3)}}}function B(N){if(N.activeChild){N.activeChild.hide()}if(N.autoHideTimer){clearTimeout(N.autoHideTimer);delete N.autoHideTimer}}function G(N){var O=N.parentMenu;if(!O&&!N.allowOtherMenus){H()}else{if(O&&O.activeChild){O.activeChild.hide()}}}function L(N){if(K.getElapsed()>50&&D.length>0&&!N.getTarget(".x-menu")){H()}}function I(O,R){if(R){var Q=C[O.group];for(var P=0,N=Q.length;P{1}",this.icon||Ext.BLANK_IMAGE_URL,this.itemText||this.text,this.iconCls||"");this.el=C;Ext.menu.Item.superclass.onRender.call(this,B,A)},setText:function(A){this.text=A;if(this.rendered){this.el.update(String.format("{1}",this.icon||Ext.BLANK_IMAGE_URL,this.text,this.iconCls||""));this.parentMenu.autoWidth()}},setIconClass:function(A){var B=this.iconCls;this.iconCls=A;if(this.rendered){this.el.child("img.x-menu-item-icon").replaceClass(B,this.iconCls)}},handleClick:function(A){if(!this.href){A.stopEvent()}Ext.menu.Item.superclass.handleClick.apply(this,arguments)},activate:function(A){if(Ext.menu.Item.superclass.activate.apply(this,arguments)){this.focus();if(A){this.expandMenu()}}return true},shouldDeactivate:function(A){if(Ext.menu.Item.superclass.shouldDeactivate.call(this,A)){if(this.menu&&this.menu.isVisible()){return !this.menu.getEl().getRegion().contains(A.getPoint())}return true}return false},deactivate:function(){Ext.menu.Item.superclass.deactivate.apply(this,arguments);this.hideMenu()},expandMenu:function(A){if(!this.disabled&&this.menu){clearTimeout(this.hideTimer);delete this.hideTimer;if(!this.menu.isVisible()&&!this.showTimer){this.showTimer=this.deferExpand.defer(this.showDelay,this,[A])}else{if(this.menu.isVisible()&&A){this.menu.tryActivate(0,1)}}}},deferExpand:function(A){delete this.showTimer;this.menu.show(this.container,this.parentMenu.subMenuAlign||"tl-tr?",this.parentMenu);if(A){this.menu.tryActivate(0,1)}},hideMenu:function(){clearTimeout(this.showTimer);delete this.showTimer;if(!this.hideTimer&&this.menu&&this.menu.isVisible()){this.hideTimer=this.deferHide.defer(this.hideDelay,this)}},deferHide:function(){delete this.hideTimer;if(this.menu.over){this.parentMenu.setActiveItem(this,false)}else{this.menu.hide()}}}); +Ext.menu.CheckItem=function(A){Ext.menu.CheckItem.superclass.constructor.call(this,A);this.addEvents("beforecheckchange","checkchange");if(this.checkHandler){this.on("checkchange",this.checkHandler,this.scope)}Ext.menu.MenuMgr.registerCheckable(this)};Ext.extend(Ext.menu.CheckItem,Ext.menu.Item,{itemCls:"x-menu-item x-menu-check-item",groupClass:"x-menu-group-item",checked:false,ctype:"Ext.menu.CheckItem",onRender:function(A){Ext.menu.CheckItem.superclass.onRender.apply(this,arguments);if(this.group){this.el.addClass(this.groupClass)}if(this.checked){this.checked=false;this.setChecked(true,true)}},destroy:function(){Ext.menu.MenuMgr.unregisterCheckable(this);Ext.menu.CheckItem.superclass.destroy.apply(this,arguments)},setChecked:function(B,A){if(this.checked!=B&&this.fireEvent("beforecheckchange",this,B)!==false){if(this.container){this.container[B?"addClass":"removeClass"]("x-menu-item-checked")}this.checked=B;if(A!==true){this.fireEvent("checkchange",this,B)}}},handleClick:function(A){if(!this.disabled&&!(this.checked&&this.group)){this.setChecked(!this.checked)}Ext.menu.CheckItem.superclass.handleClick.apply(this,arguments)}}); +Ext.menu.Adapter=function(B,A){Ext.menu.Adapter.superclass.constructor.call(this,A);this.component=B};Ext.extend(Ext.menu.Adapter,Ext.menu.BaseItem,{canActivate:true,onRender:function(B,A){this.component.render(B);this.el=this.component.getEl()},activate:function(){if(this.disabled){return false}this.component.focus();this.fireEvent("activate",this);return true},deactivate:function(){this.fireEvent("deactivate",this)},disable:function(){this.component.disable();Ext.menu.Adapter.superclass.disable.call(this)},enable:function(){this.component.enable();Ext.menu.Adapter.superclass.enable.call(this)}}); +Ext.menu.DateItem=function(A){Ext.menu.DateItem.superclass.constructor.call(this,new Ext.DatePicker(A),A);this.picker=this.component;this.addEvents("select");this.picker.on("render",function(B){B.getEl().swallowEvent("click");B.container.addClass("x-menu-date-item")});this.picker.on("select",this.onSelect,this)};Ext.extend(Ext.menu.DateItem,Ext.menu.Adapter,{onSelect:function(B,A){this.fireEvent("select",this,A,B);Ext.menu.DateItem.superclass.handleClick.call(this)}}); +Ext.menu.ColorItem=function(A){Ext.menu.ColorItem.superclass.constructor.call(this,new Ext.ColorPalette(A),A);this.palette=this.component;this.relayEvents(this.palette,["select"]);if(this.selectHandler){this.on("select",this.selectHandler,this.scope)}};Ext.extend(Ext.menu.ColorItem,Ext.menu.Adapter); +Ext.menu.DateMenu=function(A){Ext.menu.DateMenu.superclass.constructor.call(this,A);this.plain=true;var B=new Ext.menu.DateItem(A);this.add(B);this.picker=B.picker;this.relayEvents(B,["select"]);this.on("beforeshow",function(){if(this.picker){this.picker.hideMonthPicker(true)}},this)};Ext.extend(Ext.menu.DateMenu,Ext.menu.Menu,{cls:"x-date-menu",beforeDestroy:function(){this.picker.destroy()}}); +Ext.menu.ColorMenu=function(A){Ext.menu.ColorMenu.superclass.constructor.call(this,A);this.plain=true;var B=new Ext.menu.ColorItem(A);this.add(B);this.palette=B.palette;this.relayEvents(B,["select"])};Ext.extend(Ext.menu.ColorMenu,Ext.menu.Menu); +Ext.form.Field=Ext.extend(Ext.BoxComponent,{invalidClass:"x-form-invalid",invalidText:"The value in this field is invalid",focusClass:"x-form-focus",validationEvent:"keyup",validateOnBlur:true,validationDelay:250,defaultAutoCreate:{tag:"input",type:"text",size:"20",autocomplete:"off"},fieldClass:"x-form-field",msgTarget:"qtip",msgFx:"normal",readOnly:false,disabled:false,isFormField:true,hasFocus:false,initComponent:function(){Ext.form.Field.superclass.initComponent.call(this);this.addEvents("focus","blur","specialkey","change","invalid","valid")},getName:function(){return this.rendered&&this.el.dom.name?this.el.dom.name:(this.hiddenName||"")},onRender:function(C,A){Ext.form.Field.superclass.onRender.call(this,C,A);if(!this.el){var B=this.getAutoCreate();if(!B.name){B.name=this.name||this.id}if(this.inputType){B.type=this.inputType}this.el=C.createChild(B,A)}var D=this.el.dom.type;if(D){if(D=="password"){D="text"}this.el.addClass("x-form-"+D)}if(this.readOnly){this.el.dom.readOnly=true}if(this.tabIndex!==undefined){this.el.dom.setAttribute("tabIndex",this.tabIndex)}this.el.addClass([this.fieldClass,this.cls])},initValue:function(){if(this.value!==undefined){this.setValue(this.value)}else{if(this.el.dom.value.length>0&&this.el.dom.value!=this.emptyText){this.setValue(this.el.dom.value)}}this.originalValue=this.getValue()},isDirty:function(){if(this.disabled){return false}return String(this.getValue())!==String(this.originalValue)},afterRender:function(){Ext.form.Field.superclass.afterRender.call(this);this.initEvents();this.initValue()},fireKey:function(A){if(A.isSpecialKey()){this.fireEvent("specialkey",this,A)}},reset:function(){this.setValue(this.originalValue);this.clearInvalid()},initEvents:function(){this.el.on(Ext.isIE||Ext.isSafari3?"keydown":"keypress",this.fireKey,this);this.el.on("focus",this.onFocus,this);var A=this.inEditor&&Ext.isWindows&&Ext.isGecko?{buffer:10}:null;this.el.on("blur",this.onBlur,this,A);this.originalValue=this.getValue()},onFocus:function(){if(!Ext.isOpera&&this.focusClass){this.el.addClass(this.focusClass)}if(!this.hasFocus){this.hasFocus=true;this.startValue=this.getValue();this.fireEvent("focus",this)}},beforeBlur:Ext.emptyFn,onBlur:function(){this.beforeBlur();if(!Ext.isOpera&&this.focusClass){this.el.removeClass(this.focusClass)}this.hasFocus=false;if(this.validationEvent!==false&&this.validateOnBlur&&this.validationEvent!="blur"){this.validate()}var A=this.getValue();if(String(A)!==String(this.startValue)){this.fireEvent("change",this,A,this.startValue)}this.fireEvent("blur",this)},isValid:function(A){if(this.disabled){return true}var C=this.preventMark;this.preventMark=A===true;var B=this.validateValue(this.processValue(this.getRawValue()));this.preventMark=C;return B},validate:function(){if(this.disabled||this.validateValue(this.processValue(this.getRawValue()))){this.clearInvalid();return true}return false},processValue:function(A){return A},validateValue:function(A){return true},markInvalid:function(C){if(!this.rendered||this.preventMark){return }this.el.addClass(this.invalidClass);C=C||this.invalidText;switch(this.msgTarget){case"qtip":this.el.dom.qtip=C;this.el.dom.qclass="x-form-invalid-tip";if(Ext.QuickTips){Ext.QuickTips.enable()}break;case"title":this.el.dom.title=C;break;case"under":if(!this.errorEl){var B=this.getErrorCt();if(!B){this.el.dom.title=C;break}this.errorEl=B.createChild({cls:"x-form-invalid-msg"});this.errorEl.setWidth(B.getWidth(true)-20)}this.errorEl.update(C);Ext.form.Field.msgFx[this.msgFx].show(this.errorEl,this);break;case"side":if(!this.errorIcon){var B=this.getErrorCt();if(!B){this.el.dom.title=C;break}this.errorIcon=B.createChild({cls:"x-form-invalid-icon"})}this.alignErrorIcon();this.errorIcon.dom.qtip=C;this.errorIcon.dom.qclass="x-form-invalid-tip";this.errorIcon.show();this.on("resize",this.alignErrorIcon,this);break;default:var A=Ext.getDom(this.msgTarget);A.innerHTML=C;A.style.display=this.msgDisplay;break}this.fireEvent("invalid",this,C)},getErrorCt:function(){return this.el.findParent(".x-form-element",5,true)||this.el.findParent(".x-form-field-wrap",5,true)},alignErrorIcon:function(){this.errorIcon.alignTo(this.el,"tl-tr",[2,0])},clearInvalid:function(){if(!this.rendered||this.preventMark){return }this.el.removeClass(this.invalidClass);switch(this.msgTarget){case"qtip":this.el.dom.qtip="";break;case"title":this.el.dom.title="";break;case"under":if(this.errorEl){Ext.form.Field.msgFx[this.msgFx].hide(this.errorEl,this)}break;case"side":if(this.errorIcon){this.errorIcon.dom.qtip="";this.errorIcon.hide();this.un("resize",this.alignErrorIcon,this)}break;default:var A=Ext.getDom(this.msgTarget);A.innerHTML="";A.style.display="none";break}this.fireEvent("valid",this)},getRawValue:function(){var A=this.rendered?this.el.getValue():Ext.value(this.value,"");if(A===this.emptyText){A=""}return A},getValue:function(){if(!this.rendered){return this.value}var A=this.el.getValue();if(A===this.emptyText||A===undefined){A=""}return A},setRawValue:function(A){return this.el.dom.value=(A===null||A===undefined?"":A)},setValue:function(A){this.value=A;if(this.rendered){this.el.dom.value=(A===null||A===undefined?"":A);this.validate()}},adjustSize:function(A,C){var B=Ext.form.Field.superclass.adjustSize.call(this,A,C);B.width=this.adjustWidth(this.el.dom.tagName,B.width);return B},adjustWidth:function(A,B){A=A.toLowerCase();if(typeof B=="number"&&!Ext.isSafari){if(Ext.isIE&&(A=="input"||A=="textarea")){if(A=="input"&&!Ext.isStrict){return this.inEditor?B:B-3}if(A=="input"&&Ext.isStrict){return B-(Ext.isIE6?4:1)}if(A=="textarea"&&Ext.isStrict){return B-2}}else{if(Ext.isOpera&&Ext.isStrict){if(A=="input"){return B+2}if(A=="textarea"){return B-2}}}}return B}});Ext.form.MessageTargets={"qtip":{mark:function(A){this.el.dom.qtip=msg;this.el.dom.qclass="x-form-invalid-tip";if(Ext.QuickTips){Ext.QuickTips.enable()}},clear:function(A){this.el.dom.qtip=""}},"title":{mark:function(A){this.el.dom.title=msg},clear:function(A){this.el.dom.title=""}},"under":{mark:function(B){if(!this.errorEl){var A=this.getErrorCt();if(!A){this.el.dom.title=msg;return }this.errorEl=A.createChild({cls:"x-form-invalid-msg"});this.errorEl.setWidth(A.getWidth(true)-20)}this.errorEl.update(msg);Ext.form.Field.msgFx[this.msgFx].show(this.errorEl,this)},clear:function(A){if(this.errorEl){Ext.form.Field.msgFx[this.msgFx].hide(this.errorEl,this)}else{this.el.dom.title=""}}},"side":{mark:function(B){if(!this.errorIcon){var A=this.getErrorCt();if(!A){this.el.dom.title=msg;return }this.errorIcon=A.createChild({cls:"x-form-invalid-icon"})}this.alignErrorIcon();this.errorIcon.dom.qtip=msg;this.errorIcon.dom.qclass="x-form-invalid-tip";this.errorIcon.show();this.on("resize",this.alignErrorIcon,this)},clear:function(A){if(this.errorIcon){this.errorIcon.dom.qtip="";this.errorIcon.hide();this.un("resize",this.alignErrorIcon,this)}else{this.el.dom.title=""}}},"around":{mark:function(A){},clear:function(A){}}};Ext.form.Field.msgFx={normal:{show:function(A,B){A.setDisplayed("block")},hide:function(A,B){A.setDisplayed(false).update("")}},slide:{show:function(A,B){A.slideIn("t",{stopFx:true})},hide:function(A,B){A.slideOut("t",{stopFx:true,useDisplay:true})}},slideRight:{show:function(A,B){A.fixDisplay();A.alignTo(B.el,"tl-tr");A.slideIn("l",{stopFx:true})},hide:function(A,B){A.slideOut("l",{stopFx:true,useDisplay:true})}}};Ext.reg("field",Ext.form.Field); +Ext.form.TextField=Ext.extend(Ext.form.Field,{grow:false,growMin:30,growMax:800,vtype:null,maskRe:null,disableKeyFilter:false,allowBlank:true,minLength:0,maxLength:Number.MAX_VALUE,minLengthText:"The minimum length for this field is {0}",maxLengthText:"The maximum length for this field is {0}",selectOnFocus:false,blankText:"This field is required",validator:null,regex:null,regexText:"",emptyText:null,emptyClass:"x-form-empty-field",initComponent:function(){Ext.form.TextField.superclass.initComponent.call(this);this.addEvents("autosize","keydown","keyup","keypress")},initEvents:function(){Ext.form.TextField.superclass.initEvents.call(this);if(this.validationEvent=="keyup"){this.validationTask=new Ext.util.DelayedTask(this.validate,this);this.el.on("keyup",this.filterValidation,this)}else{if(this.validationEvent!==false){this.el.on(this.validationEvent,this.validate,this,{buffer:this.validationDelay})}}if(this.selectOnFocus||this.emptyText){this.on("focus",this.preFocus,this);this.el.on("mousedown",function(){if(!this.hasFocus){this.el.on("mouseup",function(A){A.preventDefault()},this,{single:true})}},this);if(this.emptyText){this.on("blur",this.postBlur,this);this.applyEmptyText()}}if(this.maskRe||(this.vtype&&this.disableKeyFilter!==true&&(this.maskRe=Ext.form.VTypes[this.vtype+"Mask"]))){this.el.on("keypress",this.filterKeys,this)}if(this.grow){this.el.on("keyup",this.onKeyUpBuffered,this,{buffer:50});this.el.on("click",this.autoSize,this)}if(this.enableKeyEvents){this.el.on("keyup",this.onKeyUp,this);this.el.on("keydown",this.onKeyDown,this);this.el.on("keypress",this.onKeyPress,this)}},processValue:function(A){if(this.stripCharsRe){var B=A.replace(this.stripCharsRe,"");if(B!==A){this.setRawValue(B);return B}}return A},filterValidation:function(A){if(!A.isNavKeyPress()){this.validationTask.delay(this.validationDelay)}},onKeyUpBuffered:function(A){if(!A.isNavKeyPress()){this.autoSize()}},onKeyUp:function(A){this.fireEvent("keyup",this,A)},onKeyDown:function(A){this.fireEvent("keydown",this,A)},onKeyPress:function(A){this.fireEvent("keypress",this,A)},reset:function(){Ext.form.TextField.superclass.reset.call(this);this.applyEmptyText()},applyEmptyText:function(){if(this.rendered&&this.emptyText&&this.getRawValue().length<1){this.setRawValue(this.emptyText);this.el.addClass(this.emptyClass)}},preFocus:function(){if(this.emptyText){if(this.el.dom.value==this.emptyText){this.setRawValue("")}this.el.removeClass(this.emptyClass)}if(this.selectOnFocus){this.el.dom.select()}},postBlur:function(){this.applyEmptyText()},filterKeys:function(B){if(B.ctrlKey){return }var A=B.getKey();if(Ext.isGecko&&(B.isNavKeyPress()||A==B.BACKSPACE||(A==B.DELETE&&B.button==-1))){return }var D=B.getCharCode(),C=String.fromCharCode(D);if(!Ext.isGecko&&B.isSpecialKey()&&!C){return }if(!this.maskRe.test(C)){B.stopEvent()}},setValue:function(A){if(this.emptyText&&this.el&&A!==undefined&&A!==null&&A!==""){this.el.removeClass(this.emptyClass)}Ext.form.TextField.superclass.setValue.apply(this,arguments);this.applyEmptyText();this.autoSize()},validateValue:function(A){if(A.length<1||A===this.emptyText){if(this.allowBlank){this.clearInvalid();return true}else{this.markInvalid(this.blankText);return false}}if(A.lengththis.maxLength){this.markInvalid(String.format(this.maxLengthText,this.maxLength));return false}if(this.vtype){var C=Ext.form.VTypes;if(!C[this.vtype](A,this)){this.markInvalid(this.vtypeText||C[this.vtype+"Text"]);return false}}if(typeof this.validator=="function"){var B=this.validator(A);if(B!==true){this.markInvalid(B);return false}}if(this.regex&&!this.regex.test(A)){this.markInvalid(this.regexText);return false}return true},selectText:function(E,A){var C=this.getRawValue();if(C.length>0){E=E===undefined?0:E;A=A===undefined?C.length:A;var D=this.el.dom;if(D.setSelectionRange){D.setSelectionRange(E,A)}else{if(D.createTextRange){var B=D.createTextRange();B.moveStart("character",E);B.moveEnd("character",A-C.length);B.select()}}}},autoSize:function(){if(!this.grow||!this.rendered){return }if(!this.metrics){this.metrics=Ext.util.TextMetrics.createInstance(this.el)}var C=this.el;var B=C.dom.value;var D=document.createElement("div");D.appendChild(document.createTextNode(B));B=D.innerHTML;D=null;B+=" ";var A=Math.min(this.growMax,Math.max(this.metrics.getWidth(B)+10,this.growMin));this.el.setWidth(A);this.fireEvent("autosize",this,A)}});Ext.reg("textfield",Ext.form.TextField); +Ext.form.TriggerField=Ext.extend(Ext.form.TextField,{defaultAutoCreate:{tag:"input",type:"text",size:"16",autocomplete:"off"},hideTrigger:false,autoSize:Ext.emptyFn,monitorTab:true,deferHeight:true,mimicing:false,onResize:function(A,B){Ext.form.TriggerField.superclass.onResize.call(this,A,B);if(typeof A=="number"){this.el.setWidth(this.adjustWidth("input",A-this.trigger.getWidth()))}this.wrap.setWidth(this.el.getWidth()+this.trigger.getWidth())},adjustSize:Ext.BoxComponent.prototype.adjustSize,getResizeEl:function(){return this.wrap},getPositionEl:function(){return this.wrap},alignErrorIcon:function(){if(this.wrap){this.errorIcon.alignTo(this.wrap,"tl-tr",[2,0])}},onRender:function(B,A){Ext.form.TriggerField.superclass.onRender.call(this,B,A);this.wrap=this.el.wrap({cls:"x-form-field-wrap"});this.trigger=this.wrap.createChild(this.triggerConfig||{tag:"img",src:Ext.BLANK_IMAGE_URL,cls:"x-form-trigger "+this.triggerClass});if(this.hideTrigger){this.trigger.setDisplayed(false)}this.initTrigger();if(!this.width){this.wrap.setWidth(this.el.getWidth()+this.trigger.getWidth())}},afterRender:function(){Ext.form.TriggerField.superclass.afterRender.call(this);var A;if(Ext.isIE&&this.el.getY()!=(A=this.trigger.getY())){this.el.position();this.el.setY(A)}},initTrigger:function(){this.trigger.on("click",this.onTriggerClick,this,{preventDefault:true});this.trigger.addClassOnOver("x-form-trigger-over");this.trigger.addClassOnClick("x-form-trigger-click")},onDestroy:function(){if(this.trigger){this.trigger.removeAllListeners();this.trigger.remove()}if(this.wrap){this.wrap.remove()}Ext.form.TriggerField.superclass.onDestroy.call(this)},onFocus:function(){Ext.form.TriggerField.superclass.onFocus.call(this);if(!this.mimicing){this.wrap.addClass("x-trigger-wrap-focus");this.mimicing=true;Ext.get(Ext.isIE?document.body:document).on("mousedown",this.mimicBlur,this,{delay:10});if(this.monitorTab){this.el.on("keydown",this.checkTab,this)}}},checkTab:function(A){if(A.getKey()==A.TAB){this.triggerBlur()}},onBlur:function(){},mimicBlur:function(A){if(!this.wrap.contains(A.target)&&this.validateBlur(A)){this.triggerBlur()}},triggerBlur:function(){this.mimicing=false;Ext.get(Ext.isIE?document.body:document).un("mousedown",this.mimicBlur,this);if(this.monitorTab){this.el.un("keydown",this.checkTab,this)}this.beforeBlur();this.wrap.removeClass("x-trigger-wrap-focus");Ext.form.TriggerField.superclass.onBlur.call(this)},beforeBlur:Ext.emptyFn,validateBlur:function(A){return true},onDisable:function(){Ext.form.TriggerField.superclass.onDisable.call(this);if(this.wrap){this.wrap.addClass(this.disabledClass);this.el.removeClass(this.disabledClass)}},onEnable:function(){Ext.form.TriggerField.superclass.onEnable.call(this);if(this.wrap){this.wrap.removeClass(this.disabledClass)}},onShow:function(){if(this.wrap){this.wrap.dom.style.display="";this.wrap.dom.style.visibility="visible"}},onHide:function(){this.wrap.dom.style.display="none"},onTriggerClick:Ext.emptyFn});Ext.form.TwinTriggerField=Ext.extend(Ext.form.TriggerField,{initComponent:function(){Ext.form.TwinTriggerField.superclass.initComponent.call(this);this.triggerConfig={tag:"span",cls:"x-form-twin-triggers",cn:[{tag:"img",src:Ext.BLANK_IMAGE_URL,cls:"x-form-trigger "+this.trigger1Class},{tag:"img",src:Ext.BLANK_IMAGE_URL,cls:"x-form-trigger "+this.trigger2Class}]}},getTrigger:function(A){return this.triggers[A]},initTrigger:function(){var A=this.trigger.select(".x-form-trigger",true);this.wrap.setStyle("overflow","hidden");var B=this;A.each(function(D,F,C){D.hide=function(){var G=B.wrap.getWidth();this.dom.style.display="none";B.el.setWidth(G-B.trigger.getWidth())};D.show=function(){var G=B.wrap.getWidth();this.dom.style.display="";B.el.setWidth(G-B.trigger.getWidth())};var E="Trigger"+(C+1);if(this["hide"+E]){D.dom.style.display="none"}D.on("click",this["on"+E+"Click"],this,{preventDefault:true});D.addClassOnOver("x-form-trigger-over");D.addClassOnClick("x-form-trigger-click")},this);this.triggers=A.elements},onTrigger1Click:Ext.emptyFn,onTrigger2Click:Ext.emptyFn});Ext.reg("trigger",Ext.form.TriggerField); +Ext.form.TextArea=Ext.extend(Ext.form.TextField,{growMin:60,growMax:1000,growAppend:" \n ",growPad:0,enterIsSpecial:false,preventScrollbars:false,onRender:function(B,A){if(!this.el){this.defaultAutoCreate={tag:"textarea",style:"width:100px;height:60px;",autocomplete:"off"}}Ext.form.TextArea.superclass.onRender.call(this,B,A);if(this.grow){this.textSizeEl=Ext.DomHelper.append(document.body,{tag:"pre",cls:"x-form-grow-sizer"});if(this.preventScrollbars){this.el.setStyle("overflow","hidden")}this.el.setHeight(this.growMin)}},onDestroy:function(){if(this.textSizeEl){Ext.removeNode(this.textSizeEl)}Ext.form.TextArea.superclass.onDestroy.call(this)},fireKey:function(A){if(A.isSpecialKey()&&(this.enterIsSpecial||(A.getKey()!=A.ENTER||A.hasModifier()))){this.fireEvent("specialkey",this,A)}},onKeyUp:function(A){if(!A.isNavKeyPress()||A.getKey()==A.ENTER){this.autoSize()}Ext.form.TextArea.superclass.onKeyUp.call(this,A)},autoSize:function(){if(!this.grow||!this.textSizeEl){return }var C=this.el;var A=C.dom.value;var D=this.textSizeEl;D.innerHTML="";D.appendChild(document.createTextNode(A));A=D.innerHTML;Ext.fly(D).setWidth(this.el.getWidth());if(A.length<1){A="  "}else{if(Ext.isIE){A=A.replace(/\n/g,"

         

        ")}A+=this.growAppend}D.innerHTML=A;var B=Math.min(this.growMax,Math.max(D.offsetHeight,this.growMin)+this.growPad);if(B!=this.lastHeight){this.lastHeight=B;this.el.setHeight(B);this.fireEvent("autosize",this,B)}}});Ext.reg("textarea",Ext.form.TextArea); +Ext.form.NumberField=Ext.extend(Ext.form.TextField,{fieldClass:"x-form-field x-form-num-field",allowDecimals:true,decimalSeparator:".",decimalPrecision:2,allowNegative:true,minValue:Number.NEGATIVE_INFINITY,maxValue:Number.MAX_VALUE,minText:"The minimum value for this field is {0}",maxText:"The maximum value for this field is {0}",nanText:"{0} is not a valid number",baseChars:"0123456789",initEvents:function(){Ext.form.NumberField.superclass.initEvents.call(this);var B=this.baseChars+"";if(this.allowDecimals){B+=this.decimalSeparator}if(this.allowNegative){B+="-"}this.stripCharsRe=new RegExp("[^"+B+"]","gi");var A=function(D){var C=D.getKey();if(!Ext.isIE&&(D.isSpecialKey()||C==D.BACKSPACE||C==D.DELETE)){return }var E=D.getCharCode();if(B.indexOf(String.fromCharCode(E))===-1){D.stopEvent()}};this.el.on("keypress",A,this)},validateValue:function(B){if(!Ext.form.NumberField.superclass.validateValue.call(this,B)){return false}if(B.length<1){return true}B=String(B).replace(this.decimalSeparator,".");if(isNaN(B)){this.markInvalid(String.format(this.nanText,B));return false}var A=this.parseValue(B);if(Athis.maxValue){this.markInvalid(String.format(this.maxText,this.maxValue));return false}return true},getValue:function(){return this.fixPrecision(this.parseValue(Ext.form.NumberField.superclass.getValue.call(this)))},setValue:function(A){A=typeof A=="number"?A:parseFloat(String(A).replace(this.decimalSeparator,"."));A=isNaN(A)?"":String(A).replace(".",this.decimalSeparator);Ext.form.NumberField.superclass.setValue.call(this,A)},parseValue:function(A){A=parseFloat(String(A).replace(this.decimalSeparator,"."));return isNaN(A)?"":A},fixPrecision:function(B){var A=isNaN(B);if(!this.allowDecimals||this.decimalPrecision==-1||A||!B){return A?"":B}return parseFloat(parseFloat(B).toFixed(this.decimalPrecision))},beforeBlur:function(){var A=this.parseValue(this.getRawValue());if(A){this.setValue(this.fixPrecision(A))}}});Ext.reg("numberfield",Ext.form.NumberField); +Ext.form.DateField=Ext.extend(Ext.form.TriggerField,{format:"m/d/Y",altFormats:"m/d/Y|n/j/Y|n/j/y|m/j/y|n/d/y|m/j/Y|n/d/Y|m-d-y|m-d-Y|m/d|m-d|md|mdy|mdY|d|Y-m-d",disabledDaysText:"Disabled",disabledDatesText:"Disabled",minText:"The date in this field must be equal to or after {0}",maxText:"The date in this field must be equal to or before {0}",invalidText:"{0} is not a valid date - it must be in the format {1}",triggerClass:"x-form-date-trigger",showToday:true,defaultAutoCreate:{tag:"input",type:"text",size:"10",autocomplete:"off"},initComponent:function(){Ext.form.DateField.superclass.initComponent.call(this);if(typeof this.minValue=="string"){this.minValue=this.parseDate(this.minValue)}if(typeof this.maxValue=="string"){this.maxValue=this.parseDate(this.maxValue)}this.ddMatch=null;this.initDisabledDays()},initDisabledDays:function(){if(this.disabledDates){var A=this.disabledDates;var C="(?:";for(var B=0;Bthis.maxValue.getTime()){this.markInvalid(String.format(this.maxText,this.formatDate(this.maxValue)));return false}if(this.disabledDays){var A=E.getDay();for(var B=0;B
        {"+this.displayField+"}
        "}this.view=new Ext.DataView({applyTo:this.innerList,tpl:this.tpl,singleSelect:true,selectedClass:this.selectedClass,itemSelector:this.itemSelector||"."+A+"-item"});this.view.on("click",this.onViewClick,this);this.bindStore(this.store,true);if(this.resizable){this.resizer=new Ext.Resizable(this.list,{pinned:true,handles:"se"});this.resizer.on("resize",function(E,C,D){this.maxHeight=D-this.handleHeight-this.list.getFrameWidth("tb")-this.assetHeight;this.listWidth=C;this.innerList.setWidth(C-this.list.getFrameWidth("lr"));this.restrictHeight()},this);this[this.pageSize?"footer":"innerList"].setStyle("margin-bottom",this.handleHeight+"px")}}},bindStore:function(A,B){if(this.store&&!B){this.store.un("beforeload",this.onBeforeLoad,this);this.store.un("load",this.onLoad,this);this.store.un("loadexception",this.collapse,this);if(!A){this.store=null;if(this.view){this.view.setStore(null)}}}if(A){this.store=Ext.StoreMgr.lookup(A);this.store.on("beforeload",this.onBeforeLoad,this);this.store.on("load",this.onLoad,this);this.store.on("loadexception",this.collapse,this);if(this.view){this.view.setStore(A)}}},initEvents:function(){Ext.form.ComboBox.superclass.initEvents.call(this);this.keyNav=new Ext.KeyNav(this.el,{"up":function(A){this.inKeyMode=true;this.selectPrev()},"down":function(A){if(!this.isExpanded()){this.onTriggerClick()}else{this.inKeyMode=true;this.selectNext()}},"enter":function(A){this.onViewClick();this.delayedCheck=true;this.unsetDelayCheck.defer(10,this)},"esc":function(A){this.collapse()},"tab":function(A){this.onViewClick(false);return true},scope:this,doRelay:function(C,B,A){if(A=="down"||this.scope.isExpanded()){return Ext.KeyNav.prototype.doRelay.apply(this,arguments)}return true},forceKeyDown:true});this.queryDelay=Math.max(this.queryDelay||10,this.mode=="local"?10:250);this.dqTask=new Ext.util.DelayedTask(this.initQuery,this);if(this.typeAhead){this.taTask=new Ext.util.DelayedTask(this.onTypeAhead,this)}if(this.editable!==false){this.el.on("keyup",this.onKeyUp,this)}if(this.forceSelection){this.on("blur",this.doForce,this)}},onDestroy:function(){if(this.view){this.view.el.removeAllListeners();this.view.el.remove();this.view.purgeListeners()}if(this.list){this.list.destroy()}this.bindStore(null);Ext.form.ComboBox.superclass.onDestroy.call(this)},unsetDelayCheck:function(){delete this.delayedCheck},fireKey:function(A){if(A.isNavKeyPress()&&!this.isExpanded()&&!this.delayedCheck){this.fireEvent("specialkey",this,A)}},onResize:function(A,B){Ext.form.ComboBox.superclass.onResize.apply(this,arguments);if(this.list&&this.listWidth===undefined){var C=Math.max(A,this.minListWidth);this.list.setWidth(C);this.innerList.setWidth(C-this.list.getFrameWidth("lr"))}},onEnable:function(){Ext.form.ComboBox.superclass.onEnable.apply(this,arguments);if(this.hiddenField){this.hiddenField.disabled=false}},onDisable:function(){Ext.form.ComboBox.superclass.onDisable.apply(this,arguments);if(this.hiddenField){this.hiddenField.disabled=true}},setEditable:function(A){if(A==this.editable){return }this.editable=A;if(!A){this.el.dom.setAttribute("readOnly",true);this.el.on("mousedown",this.onTriggerClick,this);this.el.addClass("x-combo-noedit")}else{this.el.dom.setAttribute("readOnly",false);this.el.un("mousedown",this.onTriggerClick,this);this.el.removeClass("x-combo-noedit")}},onBeforeLoad:function(){if(!this.hasFocus){return }this.innerList.update(this.loadingText?"
        "+this.loadingText+"
        ":"");this.restrictHeight();this.selectedIndex=-1},onLoad:function(){if(!this.hasFocus){return }if(this.store.getCount()>0){this.expand();this.restrictHeight();if(this.lastQuery==this.allQuery){if(this.editable){this.el.dom.select()}if(!this.selectByValue(this.value,true)){this.select(0,true)}}else{this.selectNext();if(this.typeAhead&&this.lastKey!=Ext.EventObject.BACKSPACE&&this.lastKey!=Ext.EventObject.DELETE){this.taTask.delay(this.typeAheadDelay)}}}else{this.onEmptyResults()}},onTypeAhead:function(){if(this.store.getCount()>0){var B=this.store.getAt(0);var C=B.data[this.displayField];var A=C.length;var D=this.getRawValue().length;if(D!=A){this.setRawValue(C);this.selectText(D,C.length)}}},onSelect:function(A,B){if(this.fireEvent("beforeselect",this,A,B)!==false){this.setValue(A.data[this.valueField||this.displayField]);this.collapse();this.fireEvent("select",this,A,B)}},getValue:function(){if(this.valueField){return typeof this.value!="undefined"?this.value:""}else{return Ext.form.ComboBox.superclass.getValue.call(this)}},clearValue:function(){if(this.hiddenField){this.hiddenField.value=""}this.setRawValue("");this.lastSelectionText="";this.applyEmptyText();this.value=""},setValue:function(A){var C=A;if(this.valueField){var B=this.findRecord(this.valueField,A);if(B){C=B.data[this.displayField]}else{if(this.valueNotFoundText!==undefined){C=this.valueNotFoundText}}}this.lastSelectionText=C;if(this.hiddenField){this.hiddenField.value=A}Ext.form.ComboBox.superclass.setValue.call(this,C);this.value=A},findRecord:function(C,B){var A;if(this.store.getCount()>0){this.store.each(function(D){if(D.data[C]==B){A=D;return false}})}return A},onViewMove:function(B,A){this.inKeyMode=false},onViewOver:function(D,B){if(this.inKeyMode){return }var C=this.view.findItemFromChild(B);if(C){var A=this.view.indexOf(C);this.select(A,false)}},onViewClick:function(B){var A=this.view.getSelectedIndexes()[0];var C=this.store.getAt(A);if(C){this.onSelect(C,A)}if(B!==false){this.el.focus()}},restrictHeight:function(){this.innerList.dom.style.height="";var B=this.innerList.dom;var E=this.list.getFrameWidth("tb")+(this.resizable?this.handleHeight:0)+this.assetHeight;var C=Math.max(B.clientHeight,B.offsetHeight,B.scrollHeight);var A=this.getPosition()[1]-Ext.getBody().getScroll().top;var F=Ext.lib.Dom.getViewHeight()-A-this.getSize().height;var D=Math.max(A,F,this.minHeight||0)-this.list.shadowOffset-E-5;C=Math.min(C,D,this.maxHeight);this.innerList.setHeight(C);this.list.beginUpdate();this.list.setHeight(C+E);this.list.alignTo(this.wrap,this.listAlign);this.list.endUpdate()},onEmptyResults:function(){this.collapse()},isExpanded:function(){return this.list&&this.list.isVisible()},selectByValue:function(A,C){if(A!==undefined&&A!==null){var B=this.findRecord(this.valueField||this.displayField,A);if(B){this.select(this.store.indexOf(B),C);return true}}return false},select:function(A,C){this.selectedIndex=A;this.view.select(A);if(C!==false){var B=this.view.getNode(A);if(B){this.innerList.scrollChildIntoView(B,false)}}},selectNext:function(){var A=this.store.getCount();if(A>0){if(this.selectedIndex==-1){this.select(0)}else{if(this.selectedIndex0){if(this.selectedIndex==-1){this.select(0)}else{if(this.selectedIndex!=0){this.select(this.selectedIndex-1)}}}},onKeyUp:function(A){if(this.editable!==false&&!A.isSpecialKey()){this.lastKey=A.getKey();this.dqTask.delay(this.queryDelay)}},validateBlur:function(){return !this.list||!this.list.isVisible()},initQuery:function(){this.doQuery(this.getRawValue())},doForce:function(){if(this.el.dom.value.length>0){this.el.dom.value=this.lastSelectionText===undefined?"":this.lastSelectionText;this.applyEmptyText()}},doQuery:function(C,B){if(C===undefined||C===null){C=""}var A={query:C,forceAll:B,combo:this,cancel:false};if(this.fireEvent("beforequery",A)===false||A.cancel){return false}C=A.query;B=A.forceAll;if(B===true||(C.length>=this.minChars)){if(this.lastQuery!==C){this.lastQuery=C;if(this.mode=="local"){this.selectedIndex=-1;if(B){this.store.clearFilter()}else{this.store.filter(this.displayField,C)}this.onLoad()}else{this.store.baseParams[this.queryParam]=C;this.store.load({params:this.getParams(C)});this.expand()}}else{this.selectedIndex=-1;this.onLoad()}}},getParams:function(A){var B={};if(this.pageSize){B.start=0;B.limit=this.pageSize}return B},collapse:function(){if(!this.isExpanded()){return }this.list.hide();Ext.getDoc().un("mousewheel",this.collapseIf,this);Ext.getDoc().un("mousedown",this.collapseIf,this);this.fireEvent("collapse",this)},collapseIf:function(A){if(!A.within(this.wrap)&&!A.within(this.list)){this.collapse()}},expand:function(){if(this.isExpanded()||!this.hasFocus){return }this.list.alignTo(this.wrap,this.listAlign);this.list.show();this.innerList.setOverflow("auto");Ext.getDoc().on("mousewheel",this.collapseIf,this);Ext.getDoc().on("mousedown",this.collapseIf,this);this.fireEvent("expand",this)},onTriggerClick:function(){if(this.disabled){return }if(this.isExpanded()){this.collapse();this.el.focus()}else{this.onFocus({});if(this.triggerAction=="all"){this.doQuery(this.allQuery,true)}else{this.doQuery(this.getRawValue())}this.el.focus()}}});Ext.reg("combo",Ext.form.ComboBox); +Ext.form.Checkbox=Ext.extend(Ext.form.Field,{checkedCls:"x-form-check-checked",focusCls:"x-form-check-focus",overCls:"x-form-check-over",mouseDownCls:"x-form-check-down",tabIndex:0,checked:false,defaultAutoCreate:{tag:"input",type:"checkbox",autocomplete:"off"},baseCls:"x-form-check",initComponent:function(){Ext.form.Checkbox.superclass.initComponent.call(this);this.addEvents("check")},initEvents:function(){Ext.form.Checkbox.superclass.initEvents.call(this);this.initCheckEvents()},initCheckEvents:function(){this.innerWrap.removeAllListeners();this.innerWrap.addClassOnOver(this.overCls);this.innerWrap.addClassOnClick(this.mouseDownCls);this.innerWrap.on("click",this.onClick,this);this.innerWrap.on("keyup",this.onKeyUp,this)},onRender:function(B,A){Ext.form.Checkbox.superclass.onRender.call(this,B,A);if(this.inputValue!==undefined){this.el.dom.value=this.inputValue}this.el.addClass("x-hidden");this.innerWrap=this.el.wrap({tabIndex:this.tabIndex,cls:this.baseCls+"-wrap-inner"});this.wrap=this.innerWrap.wrap({cls:this.baseCls+"-wrap"});if(this.boxLabel){this.labelEl=this.innerWrap.createChild({tag:"label",htmlFor:this.el.id,cls:"x-form-cb-label",html:this.boxLabel})}this.imageEl=this.innerWrap.createChild({tag:"img",src:Ext.BLANK_IMAGE_URL,cls:this.baseCls},this.el);if(this.checked){this.setValue(true)}else{this.checked=this.el.dom.checked}this.originalValue=this.checked},onDestroy:function(){if(this.rendered){Ext.destroy(this.imageEl,this.labelEl,this.innerWrap,this.wrap)}Ext.form.Checkbox.superclass.onDestroy.call(this)},onFocus:function(A){Ext.form.Checkbox.superclass.onFocus.call(this,A);this.el.addClass(this.focusCls)},onBlur:function(A){Ext.form.Checkbox.superclass.onBlur.call(this,A);this.el.removeClass(this.focusCls)},onResize:function(){Ext.form.Checkbox.superclass.onResize.apply(this,arguments);if(!this.boxLabel&&!this.fieldLabel){this.el.alignTo(this.wrap,"c-c")}},onKeyUp:function(A){if(A.getKey()==Ext.EventObject.SPACE){this.onClick(A)}},onClick:function(A){if(!this.disabled&&!this.readOnly){this.toggleValue()}A.stopEvent()},onEnable:function(){Ext.form.Checkbox.superclass.onEnable.call(this);this.initCheckEvents()},onDisable:function(){Ext.form.Checkbox.superclass.onDisable.call(this);this.innerWrap.removeAllListeners()},toggleValue:function(){this.setValue(!this.checked)},getResizeEl:function(){if(!this.resizeEl){this.resizeEl=Ext.isSafari?this.wrap:(this.wrap.up(".x-form-element",5)||this.wrap)}return this.resizeEl},getPositionEl:function(){return this.wrap},getActionEl:function(){return this.wrap},markInvalid:Ext.emptyFn,clearInvalid:Ext.emptyFn,initValue:Ext.emptyFn,getValue:function(){if(this.rendered){return this.el.dom.checked}return false},setValue:function(A){var B=this.checked;this.checked=(A===true||A==="true"||A=="1"||String(A).toLowerCase()=="on");if(this.el&&this.el.dom){this.el.dom.checked=this.checked;this.el.dom.defaultChecked=this.checked}this.wrap[this.checked?"addClass":"removeClass"](this.checkedCls);if(B!=this.checked){this.fireEvent("check",this,this.checked);if(this.handler){this.handler.call(this.scope||this,this,this.checked)}}}});Ext.reg("checkbox",Ext.form.Checkbox); +Ext.form.CheckboxGroup=Ext.extend(Ext.form.Field,{columns:"auto",vertical:false,allowBlank:true,blankText:"You must select at least one item in this group",defaultType:"checkbox",groupCls:"x-form-check-group",onRender:function(H,F){if(!this.el){var M={cls:this.groupCls,layout:"column",border:false,renderTo:H};var A={defaultType:this.defaultType,layout:"form",border:false,defaults:{hideLabel:true,anchor:"100%"}};if(this.items[0].items){Ext.apply(M,{layoutConfig:{columns:this.items.length},defaults:this.defaults,items:this.items});for(var E=0,J=this.items.length;E0&&E%O==0){L++}if(this.items[E].fieldLabel){this.items[E].hideLabel=false}K[L].items.push(this.items[E])}}else{for(var E=0,J=this.items.length;E":">"),C,"")}return D.join("")},createToolbar:function(D){var A=Ext.QuickTips&&Ext.QuickTips.isEnabled();function C(G,E,F){return{itemId:G,cls:"x-btn-icon x-edit-"+G,enableToggle:E!==false,scope:D,handler:F||D.relayBtnCmd,clickEvent:"mousedown",tooltip:A?D.buttonTips[G]||undefined:undefined,tabIndex:-1}}var B=new Ext.Toolbar({renderTo:this.wrap.dom.firstChild});B.el.on("click",function(E){E.preventDefault()});if(this.enableFont&&!Ext.isSafari2){this.fontSelect=B.el.createChild({tag:"select",cls:"x-font-select",html:this.createFontOptions()});this.fontSelect.on("change",function(){var E=this.fontSelect.dom.value;this.relayCmd("fontname",E);this.deferFocus()},this);B.add(this.fontSelect.dom,"-")}if(this.enableFormat){B.add(C("bold"),C("italic"),C("underline"))}if(this.enableFontSize){B.add("-",C("increasefontsize",false,this.adjustFont),C("decreasefontsize",false,this.adjustFont))}if(this.enableColors){B.add("-",{itemId:"forecolor",cls:"x-btn-icon x-edit-forecolor",clickEvent:"mousedown",tooltip:A?D.buttonTips["forecolor"]||undefined:undefined,tabIndex:-1,menu:new Ext.menu.ColorMenu({allowReselect:true,focus:Ext.emptyFn,value:"000000",plain:true,selectHandler:function(F,E){this.execCmd("forecolor",Ext.isSafari||Ext.isIE?"#"+E:E);this.deferFocus()},scope:this,clickEvent:"mousedown"})},{itemId:"backcolor",cls:"x-btn-icon x-edit-backcolor",clickEvent:"mousedown",tooltip:A?D.buttonTips["backcolor"]||undefined:undefined,tabIndex:-1,menu:new Ext.menu.ColorMenu({focus:Ext.emptyFn,value:"FFFFFF",plain:true,allowReselect:true,selectHandler:function(F,E){if(Ext.isGecko){this.execCmd("useCSS",false);this.execCmd("hilitecolor",E);this.execCmd("useCSS",true);this.deferFocus()}else{this.execCmd(Ext.isOpera?"hilitecolor":"backcolor",Ext.isSafari||Ext.isIE?"#"+E:E);this.deferFocus()}},scope:this,clickEvent:"mousedown"})})}if(this.enableAlignments){B.add("-",C("justifyleft"),C("justifycenter"),C("justifyright"))}if(!Ext.isSafari2){if(this.enableLinks){B.add("-",C("createlink",false,this.createLink))}if(this.enableLists){B.add("-",C("insertorderedlist"),C("insertunorderedlist"))}if(this.enableSourceEdit){B.add("-",C("sourceedit",true,function(E){this.toggleSourceEdit(E.pressed)}))}}this.tb=B},getDocMarkup:function(){return""},getEditorBody:function(){return this.doc.body||this.doc.documentElement},getDoc:function(){return Ext.isIE?this.getWin().document:(this.iframe.contentDocument||this.getWin().document)},getWin:function(){return Ext.isIE?this.iframe.contentWindow:window.frames[this.iframe.name]},onRender:function(B,A){Ext.form.HtmlEditor.superclass.onRender.call(this,B,A);this.el.dom.style.border="0 none";this.el.dom.setAttribute("tabIndex",-1);this.el.addClass("x-hidden");if(Ext.isIE){this.el.applyStyles("margin-top:-1px;margin-bottom:-1px;")}this.wrap=this.el.wrap({cls:"x-html-editor-wrap",cn:{cls:"x-html-editor-tb"}});this.createToolbar(this);this.tb.items.each(function(E){if(E.itemId!="sourceedit"){E.disable()}});var C=document.createElement("iframe");C.name=Ext.id();C.frameBorder="0";C.src=Ext.isIE?Ext.SSL_SECURE_URL:"javascript:;";this.wrap.dom.appendChild(C);this.iframe=C;this.initFrame();if(this.autoMonitorDesignMode!==false){this.monitorTask=Ext.TaskMgr.start({run:this.checkDesignMode,scope:this,interval:100})}if(!this.width){var D=this.el.getSize();this.setSize(D.width,this.height||D.height)}},initFrame:function(){this.doc=this.getDoc();this.win=this.getWin();this.doc.open();this.doc.write(this.getDocMarkup());this.doc.close();var A={run:function(){if(this.doc.body||this.doc.readyState=="complete"){Ext.TaskMgr.stop(A);this.doc.designMode="on";this.initEditor.defer(10,this)}},interval:10,duration:10000,scope:this};Ext.TaskMgr.start(A)},checkDesignMode:function(){if(this.wrap&&this.wrap.dom.offsetWidth){var A=this.getDoc();if(!A){return }if(!A.editorInitialized||String(A.designMode).toLowerCase()!="on"){this.initFrame()}}},onResize:function(B,C){Ext.form.HtmlEditor.superclass.onResize.apply(this,arguments);if(this.el&&this.iframe){if(typeof B=="number"){var D=B-this.wrap.getFrameWidth("lr");this.el.setWidth(this.adjustWidth("textarea",D));this.iframe.style.width=D+"px"}if(typeof C=="number"){var A=C-this.wrap.getFrameWidth("tb")-this.tb.el.getHeight();this.el.setHeight(this.adjustWidth("textarea",A));this.iframe.style.height=A+"px";if(this.doc){this.getEditorBody().style.height=(A-(this.iframePad*2))+"px"}}}},toggleSourceEdit:function(A){if(A===undefined){A=!this.sourceEditMode}this.sourceEditMode=A===true;var C=this.tb.items.get("sourceedit");if(C.pressed!==this.sourceEditMode){C.toggle(this.sourceEditMode);return }if(this.sourceEditMode){this.tb.items.each(function(D){if(D.itemId!="sourceedit"){D.disable()}});this.syncValue();this.iframe.className="x-hidden";this.el.removeClass("x-hidden");this.el.dom.removeAttribute("tabIndex");this.el.focus()}else{if(this.initialized){this.tb.items.each(function(D){D.enable()})}this.pushValue();this.iframe.className="";this.el.addClass("x-hidden");this.el.dom.setAttribute("tabIndex",-1);this.deferFocus()}var B=this.lastSize;if(B){delete this.lastSize;this.setSize(B)}this.fireEvent("editmodechange",this,this.sourceEditMode)},createLink:function(){var A=prompt(this.createLinkText,this.defaultLinkValue);if(A&&A!="http:/"+"/"){this.relayCmd("createlink",A)}},adjustSize:Ext.BoxComponent.prototype.adjustSize,getResizeEl:function(){return this.wrap},getPositionEl:function(){return this.wrap},initEvents:function(){this.originalValue=this.getValue()},markInvalid:Ext.emptyFn,clearInvalid:Ext.emptyFn,setValue:function(A){Ext.form.HtmlEditor.superclass.setValue.call(this,A);this.pushValue()},cleanHtml:function(A){A=String(A);if(A.length>5){if(Ext.isSafari){A=A.replace(/\sclass="(?:Apple-style-span|khtml-block-placeholder)"/gi,"")}}if(A==" "){A=""}return A},syncValue:function(){if(this.initialized){var D=this.getEditorBody();var C=D.innerHTML;if(Ext.isSafari){var B=D.getAttribute("style");var A=B.match(/text-align:(.*?);/i);if(A&&A[1]){C="
        "+C+"
        "}}C=this.cleanHtml(C);if(this.fireEvent("beforesync",this,C)!==false){this.el.dom.value=C;this.fireEvent("sync",this,C)}}},pushValue:function(){if(this.initialized){var A=this.el.dom.value;if(!this.activated&&A.length<1){A=" "}if(this.fireEvent("beforepush",this,A)!==false){this.getEditorBody().innerHTML=A;this.fireEvent("push",this,A)}}},deferFocus:function(){this.focus.defer(10,this)},focus:function(){if(this.win&&!this.sourceEditMode){this.win.focus()}else{this.el.focus()}},initEditor:function(){var B=this.getEditorBody();var A=this.el.getStyles("font-size","font-family","background-image","background-repeat");A["background-attachment"]="fixed";B.bgProperties="fixed";Ext.DomHelper.applyStyles(B,A);if(this.doc){try{Ext.EventManager.removeAll(this.doc)}catch(C){}}this.doc=this.getDoc();Ext.EventManager.on(this.doc,{"mousedown":this.onEditorEvent,"dblclick":this.onEditorEvent,"click":this.onEditorEvent,"keyup":this.onEditorEvent,buffer:100,scope:this});if(Ext.isGecko){Ext.EventManager.on(this.doc,"keypress",this.applyCommand,this)}if(Ext.isIE||Ext.isSafari||Ext.isOpera){Ext.EventManager.on(this.doc,"keydown",this.fixKeys,this)}this.initialized=true;this.fireEvent("initialize",this);this.doc.editorInitialized=true;this.pushValue()},onDestroy:function(){if(this.monitorTask){Ext.TaskMgr.stop(this.monitorTask)}if(this.rendered){this.tb.items.each(function(A){if(A.menu){A.menu.removeAll();if(A.menu.el){A.menu.el.destroy()}}A.destroy()});this.wrap.dom.innerHTML="";this.wrap.remove()}},onFirstFocus:function(){this.activated=true;this.tb.items.each(function(D){D.enable()});if(Ext.isGecko){this.win.focus();var A=this.win.getSelection();if(!A.focusNode||A.focusNode.nodeType!=3){var B=A.getRangeAt(0);B.selectNodeContents(this.getEditorBody());B.collapse(true);this.deferFocus()}try{this.execCmd("useCSS",true);this.execCmd("styleWithCSS",false)}catch(C){}}this.fireEvent("activate",this)},adjustFont:function(B){var C=B.itemId=="increasefontsize"?1:-1;var A=parseInt(this.doc.queryCommandValue("FontSize")||2,10);if(Ext.isSafari3||Ext.isAir){if(A<=10){A=1+C}else{if(A<=13){A=2+C}else{if(A<=16){A=3+C}else{if(A<=18){A=4+C}else{if(A<=24){A=5+C}else{A=6+C}}}}}A=A.constrain(1,6)}else{if(Ext.isSafari){C*=2}A=Math.max(1,A+C)+(Ext.isSafari?"px":0)}this.execCmd("FontSize",A)},onEditorEvent:function(A){this.updateToolbar()},updateToolbar:function(){if(!this.activated){this.onFirstFocus();return }var B=this.tb.items.map,C=this.doc;if(this.enableFont&&!Ext.isSafari2){var A=(this.doc.queryCommandValue("FontName")||this.defaultFont).toLowerCase();if(A!=this.fontSelect.dom.value){this.fontSelect.dom.value=A}}if(this.enableFormat){B.bold.toggle(C.queryCommandState("bold"));B.italic.toggle(C.queryCommandState("italic"));B.underline.toggle(C.queryCommandState("underline"))}if(this.enableAlignments){B.justifyleft.toggle(C.queryCommandState("justifyleft"));B.justifycenter.toggle(C.queryCommandState("justifycenter"));B.justifyright.toggle(C.queryCommandState("justifyright"))}if(!Ext.isSafari2&&this.enableLists){B.insertorderedlist.toggle(C.queryCommandState("insertorderedlist"));B.insertunorderedlist.toggle(C.queryCommandState("insertunorderedlist"))}Ext.menu.MenuMgr.hideAll();this.syncValue()},relayBtnCmd:function(A){this.relayCmd(A.itemId)},relayCmd:function(B,A){(function(){this.focus();this.execCmd(B,A);this.updateToolbar()}).defer(10,this)},execCmd:function(B,A){this.doc.execCommand(B,false,A===undefined?null:A);this.syncValue()},applyCommand:function(B){if(B.ctrlKey){var C=B.getCharCode(),A;if(C>0){C=String.fromCharCode(C);switch(C){case"b":A="bold";break;case"i":A="italic";break;case"u":A="underline";break}if(A){this.win.focus();this.execCmd(A);this.deferFocus();B.preventDefault()}}}},insertAtCursor:function(B){if(!this.activated){return }if(Ext.isIE){this.win.focus();var A=this.doc.selection.createRange();if(A){A.collapse(true);A.pasteHTML(B);this.syncValue();this.deferFocus()}}else{if(Ext.isGecko||Ext.isOpera){this.win.focus();this.execCmd("InsertHTML",B);this.deferFocus()}else{if(Ext.isSafari){this.execCmd("InsertText",B);this.deferFocus()}}}},fixKeys:function(){if(Ext.isIE){return function(D){var A=D.getKey(),B;if(A==D.TAB){D.stopEvent();B=this.doc.selection.createRange();if(B){B.collapse(true);B.pasteHTML("    ");this.deferFocus()}}else{if(A==D.ENTER){B=this.doc.selection.createRange();if(B){var C=B.parentElement();if(!C||C.tagName.toLowerCase()!="li"){D.stopEvent();B.pasteHTML("
        ");B.collapse(false);B.select()}}}}}}else{if(Ext.isOpera){return function(B){var A=B.getKey();if(A==B.TAB){B.stopEvent();this.win.focus();this.execCmd("InsertHTML","    ");this.deferFocus()}}}else{if(Ext.isSafari){return function(B){var A=B.getKey();if(A==B.TAB){B.stopEvent();this.execCmd("InsertText","\t");this.deferFocus()}}}}}}(),getToolbar:function(){return this.tb},buttonTips:{bold:{title:"Bold (Ctrl+B)",text:"Make the selected text bold.",cls:"x-html-editor-tip"},italic:{title:"Italic (Ctrl+I)",text:"Make the selected text italic.",cls:"x-html-editor-tip"},underline:{title:"Underline (Ctrl+U)",text:"Underline the selected text.",cls:"x-html-editor-tip"},increasefontsize:{title:"Grow Text",text:"Increase the font size.",cls:"x-html-editor-tip"},decreasefontsize:{title:"Shrink Text",text:"Decrease the font size.",cls:"x-html-editor-tip"},backcolor:{title:"Text Highlight Color",text:"Change the background color of the selected text.",cls:"x-html-editor-tip"},forecolor:{title:"Font Color",text:"Change the color of the selected text.",cls:"x-html-editor-tip"},justifyleft:{title:"Align Text Left",text:"Align text to the left.",cls:"x-html-editor-tip"},justifycenter:{title:"Center Text",text:"Center text in the editor.",cls:"x-html-editor-tip"},justifyright:{title:"Align Text Right",text:"Align text to the right.",cls:"x-html-editor-tip"},insertunorderedlist:{title:"Bullet List",text:"Start a bulleted list.",cls:"x-html-editor-tip"},insertorderedlist:{title:"Numbered List",text:"Start a numbered list.",cls:"x-html-editor-tip"},createlink:{title:"Hyperlink",text:"Make the selected text a hyperlink.",cls:"x-html-editor-tip"},sourceedit:{title:"Source Edit",text:"Switch to source editing mode.",cls:"x-html-editor-tip"}}});Ext.reg("htmleditor",Ext.form.HtmlEditor); +Ext.form.TimeField=Ext.extend(Ext.form.ComboBox,{minValue:null,maxValue:null,minText:"The time in this field must be equal to or after {0}",maxText:"The time in this field must be equal to or before {0}",invalidText:"{0} is not a valid time",format:"g:i A",altFormats:"g:ia|g:iA|g:i a|g:i A|h:i|g:i|H:i|ga|ha|gA|h a|g a|g A|gi|hi|gia|hia|g|H",increment:15,mode:"local",triggerAction:"all",typeAhead:false,initDate:"1/1/2008",initComponent:function(){Ext.form.TimeField.superclass.initComponent.call(this);if(typeof this.minValue=="string"){this.minValue=this.parseDate(this.minValue)}if(typeof this.maxValue=="string"){this.maxValue=this.parseDate(this.maxValue)}if(!this.store){var B=this.parseDate(this.minValue);if(!B){B=new Date(this.initDate).clearTime()}var A=this.parseDate(this.maxValue);if(!A){A=new Date(this.initDate).clearTime().add("mi",(24*60)-1)}var C=[];while(B<=A){C.push([B.dateFormat(this.format)]);B=B.add("mi",this.increment)}this.store=new Ext.data.SimpleStore({fields:["text"],data:C});this.displayField="text"}},getValue:function(){var A=Ext.form.TimeField.superclass.getValue.call(this);return this.formatDate(this.parseDate(A))||""},setValue:function(A){Ext.form.TimeField.superclass.setValue.call(this,this.formatDate(this.parseDate(A)))},validateValue:Ext.form.DateField.prototype.validateValue,parseDate:Ext.form.DateField.prototype.parseDate,formatDate:Ext.form.DateField.prototype.formatDate,beforeBlur:function(){var A=this.parseDate(this.getRawValue());if(A){this.setValue(A.dateFormat(this.format))}}});Ext.reg("timefield",Ext.form.TimeField); +Ext.form.Label=Ext.extend(Ext.BoxComponent,{onRender:function(B,A){if(!this.el){this.el=document.createElement("label");this.el.id=this.getId();this.el.innerHTML=this.text?Ext.util.Format.htmlEncode(this.text):(this.html||"");if(this.forId){this.el.setAttribute("htmlFor",this.forId)}}Ext.form.Label.superclass.onRender.call(this,B,A)},setText:function(A,B){this.text=A;if(this.rendered){this.el.dom.innerHTML=B!==false?Ext.util.Format.htmlEncode(A):A}return this}});Ext.reg("label",Ext.form.Label); +Ext.form.Action=function(B,A){this.form=B;this.options=A||{}};Ext.form.Action.CLIENT_INVALID="client";Ext.form.Action.SERVER_INVALID="server";Ext.form.Action.CONNECT_FAILURE="connect";Ext.form.Action.LOAD_FAILURE="load";Ext.form.Action.prototype={type:"default",run:function(A){},success:function(A){},handleResponse:function(A){},failure:function(A){this.response=A;this.failureType=Ext.form.Action.CONNECT_FAILURE;this.form.afterAction(this,false)},processResponse:function(A){this.response=A;if(!A.responseText){return true}this.result=this.handleResponse(A);return this.result},getUrl:function(C){var A=this.options.url||this.form.url||this.form.el.dom.action;if(C){var B=this.getParams();if(B){A+=(A.indexOf("?")!=-1?"&":"?")+B}}return A},getMethod:function(){return(this.options.method||this.form.method||this.form.el.dom.method||"POST").toUpperCase()},getParams:function(){var A=this.form.baseParams;var B=this.options.params;if(B){if(typeof B=="object"){B=Ext.urlEncode(Ext.applyIf(B,A))}else{if(typeof B=="string"&&A){B+="&"+Ext.urlEncode(A)}}}else{if(A){B=Ext.urlEncode(A)}}return B},createCallback:function(A){var A=A||{};return{success:this.success,failure:this.failure,scope:this,timeout:(A.timeout*1000)||(this.form.timeout*1000),upload:this.form.fileUpload?this.success:undefined}}};Ext.form.Action.Submit=function(B,A){Ext.form.Action.Submit.superclass.constructor.call(this,B,A)};Ext.extend(Ext.form.Action.Submit,Ext.form.Action,{type:"submit",run:function(){var B=this.options;var C=this.getMethod();var A=C=="GET";if(B.clientValidation===false||this.form.isValid()){Ext.Ajax.request(Ext.apply(this.createCallback(B),{form:this.form.el.dom,url:this.getUrl(A),method:C,headers:B.headers,params:!A?this.getParams():null,isUpload:this.form.fileUpload}))}else{if(B.clientValidation!==false){this.failureType=Ext.form.Action.CLIENT_INVALID;this.form.afterAction(this,false)}}},success:function(B){var A=this.processResponse(B);if(A===true||A.success){this.form.afterAction(this,true);return }if(A.errors){this.form.markInvalid(A.errors);this.failureType=Ext.form.Action.SERVER_INVALID}this.form.afterAction(this,false)},handleResponse:function(C){if(this.form.errorReader){var B=this.form.errorReader.read(C);var F=[];if(B.records){for(var D=0,A=B.records.length;D=0){if(!D){C=F-1}D=false;while(C>=0){if(E.call(I||this,J,C,H)===true){return[J,C]}C--}J--}}else{if(C>=F){J++;D=false}while(J","
        ","
        {header}
        ","
        {body}
        ","
        ","
         
        ","
         
        ","")}if(!C.header){C.header=new Ext.Template("","{cells}","
        ")}if(!C.hcell){C.hcell=new Ext.Template("
        ",this.grid.enableHdMenu?"":"","{value}","
        ")}if(!C.body){C.body=new Ext.Template("{rows}")}if(!C.row){C.row=new Ext.Template("
        ","{cells}",(this.enableRowBody?"":""),"
        {body}
        ")}if(!C.cell){C.cell=new Ext.Template("","
        {value}
        ","")}for(var A in C){var B=C[A];if(B&&typeof B.compile=="function"&&!B.compiled){B.disableFormats=true;B.compile()}}this.templates=C;this.colRe=new RegExp("x-grid3-td-([^\\s]+)","")},fly:function(A){if(!this._flyweight){this._flyweight=new Ext.Element.Flyweight(document.body)}this._flyweight.dom=A;return this._flyweight},getEditorParent:function(A){return this.scroller.dom},initElements:function(){var C=Ext.Element;var B=this.grid.getGridEl().dom.firstChild;var A=B.childNodes;this.el=new C(B);this.mainWrap=new C(A[0]);this.mainHd=new C(this.mainWrap.dom.firstChild);if(this.grid.hideHeaders){this.mainHd.setDisplayed(false)}this.innerHd=this.mainHd.dom.firstChild;this.scroller=new C(this.mainWrap.dom.childNodes[1]);if(this.forceFit){this.scroller.setStyle("overflow-x","hidden")}this.mainBody=new C(this.scroller.dom.firstChild);this.focusEl=new C(this.scroller.dom.childNodes[1]);this.focusEl.swallowEvent("click",true);this.resizeMarker=new C(A[1]);this.resizeProxy=new C(A[2])},getRows:function(){return this.hasRows()?this.mainBody.dom.childNodes:[]},findCell:function(A){if(!A){return false}return this.fly(A).findParent(this.cellSelector,this.cellSelectorDepth)},findCellIndex:function(C,B){var A=this.findCell(C);if(A&&(!B||this.fly(A).hasClass(B))){return this.getCellIndex(A)}return false},getCellIndex:function(B){if(B){var A=B.className.match(this.colRe);if(A&&A[1]){return this.cm.getIndexById(A[1])}}return false},findHeaderCell:function(B){var A=this.findCell(B);return A&&this.fly(A).hasClass(this.hdCls)?A:null},findHeaderIndex:function(A){return this.findCellIndex(A,this.hdCls)},findRow:function(A){if(!A){return false}return this.fly(A).findParent(this.rowSelector,this.rowSelectorDepth)},findRowIndex:function(A){var B=this.findRow(A);return B?B.rowIndex:false},getRow:function(A){return this.getRows()[A]},getCell:function(B,A){return this.getRow(B).getElementsByTagName("td")[A]},getHeaderCell:function(A){return this.mainHd.dom.getElementsByTagName("td")[A]},addRowClass:function(C,A){var B=this.getRow(C);if(B){this.fly(B).addClass(A)}},removeRowClass:function(C,A){var B=this.getRow(C);if(B){this.fly(B).removeClass(A)}},removeRow:function(A){Ext.removeNode(this.getRow(A));this.focusRow(A)},removeRows:function(C,A){var B=this.mainBody.dom;for(var D=C;D<=A;D++){Ext.removeNode(B.childNodes[C])}this.focusRow(C)},getScrollState:function(){var A=this.scroller.dom;return{left:A.scrollLeft,top:A.scrollTop}},restoreScroll:function(A){var B=this.scroller.dom;B.scrollLeft=A.left;B.scrollTop=A.top},scrollToTop:function(){this.scroller.dom.scrollTop=0;this.scroller.dom.scrollLeft=0},syncScroll:function(){this.syncHeaderScroll();var A=this.scroller.dom;this.grid.fireEvent("bodyscroll",A.scrollLeft,A.scrollTop)},syncHeaderScroll:function(){var A=this.scroller.dom;this.innerHd.scrollLeft=A.scrollLeft;this.innerHd.scrollLeft=A.scrollLeft},updateSortIcon:function(B,A){var D=this.sortClasses;var C=this.mainHd.select("td").removeClass(D);C.item(B).addClass(D[A=="DESC"?1:0])},updateAllColumnWidths:function(){var D=this.getTotalWidth();var H=this.cm.getColumnCount();var F=[];for(var B=0;B=this.ds.getCount()){return }E=(E!==undefined?E:0);var I=this.getRow(P),F;if(!(D===false&&E===0)){while(this.cm.isHidden(E)){E++}F=this.getCell(P,E)}if(!I){return }var L=this.scroller.dom;var O=0;var C=I,M=this.el.dom;while(C&&C!=M){O+=C.offsetTop;C=C.offsetParent}O-=this.mainHd.dom.offsetHeight;var N=O+I.offsetHeight;var A=L.clientHeight;var M=parseInt(L.scrollTop,10);var K=M+A;if(OK){L.scrollTop=N-A}}if(D!==false){var J=parseInt(F.offsetLeft,10);var H=J+F.offsetWidth;var G=parseInt(L.scrollLeft,10);var B=G+L.clientWidth;if(JB){L.scrollLeft=H-L.clientWidth}}}return F?Ext.fly(F).getXY():[L.scrollLeft+this.el.getX(),Ext.fly(I).getY()]},insertRows:function(A,F,C,E){if(!E&&F===0&&C>=A.getCount()-1){this.refresh()}else{if(!E){this.fireEvent("beforerowsinserted",this,F,C)}var B=this.renderRows(F,C);var D=this.getRow(F);if(D){Ext.DomHelper.insertHtml("beforeBegin",D,B)}else{Ext.DomHelper.insertHtml("beforeEnd",this.mainBody.dom,B)}if(!E){this.fireEvent("rowsinserted",this,F,C);this.processRows(F)}}this.focusRow(F)},deleteRows:function(A,C,B){if(A.getRowCount()<1){this.refresh()}else{this.fireEvent("beforerowsdeleted",this,C,B);this.removeRows(C,B);this.processRows(C);this.fireEvent("rowsdeleted",this,C,B)}},getColumnStyle:function(A,C){var B=!C?(this.cm.config[A].css||""):"";B+="width:"+this.getColumnWidth(A)+";";if(this.cm.isHidden(A)){B+="display:none;"}var D=this.cm.config[A].align;if(D){B+="text-align:"+D+";"}return B},getColumnWidth:function(B){var A=this.cm.getColumnWidth(B);if(typeof A=="number"){return(Ext.isBorderBox?A:(A-this.borderWidth>0?A-this.borderWidth:0))+"px"}return A},getTotalWidth:function(){return this.cm.getTotalWidth()+"px"},fitColumns:function(D,G,E){var F=this.cm,S,L,O;var R=F.getTotalWidth(false);var J=this.grid.getGridEl().getWidth(true)-this.scrollOffset;if(J<20){return }var B=J-R;if(B===0){return false}var A=F.getColumnCount(true);var P=A-(typeof E=="number"?1:0);if(P===0){P=1;E=undefined}var K=F.getColumnCount();var I=[];var N=0;var M=0;var H;for(O=0;OJ){var Q=P!=A?E:N;F.setColumnWidth(Q,Math.max(1,F.getColumnWidth(Q)-(R-J)),true)}if(D!==true){this.updateAllColumnWidths()}return true},autoExpand:function(B){var G=this.grid,A=this.cm;if(!this.userResized&&G.autoExpandColumn){var D=A.getTotalWidth(false);var H=this.grid.getGridEl().getWidth(true)-this.scrollOffset;if(D!=H){var F=A.getIndexById(G.autoExpandColumn);var E=A.getColumnWidth(F);var C=Math.min(Math.max(((H-D)+E),G.autoExpandMin),G.autoExpandMax);if(C!=E){A.setColumnWidth(F,C,true);if(B!==true){this.updateColumnWidth(F,C)}}}}},getColumnData:function(){var D=[],A=this.cm,E=A.getColumnCount();for(var C=0;C"+this.emptyText+"")}},updateHeaderSortState:function(){var B=this.ds.getSortState();if(!B){return }if(!this.sortState||(this.sortState.field!=B.field||this.sortState.direction!=B.direction)){this.grid.fireEvent("sortchange",this.grid,B)}this.sortState=B;var C=this.cm.findColumnIndex(B.field);if(C!=-1){var A=B.direction;this.updateSortIcon(C,A)}},destroy:function(){if(this.colMenu){this.colMenu.removeAll();Ext.menu.MenuMgr.unregister(this.colMenu);this.colMenu.getEl().remove();delete this.colMenu}if(this.hmenu){this.hmenu.removeAll();Ext.menu.MenuMgr.unregister(this.hmenu);this.hmenu.getEl().remove();delete this.hmenu}if(this.grid.enableColumnMove){var C=Ext.dd.DDM.ids["gridHeader"+this.grid.getGridEl().id];if(C){for(var A in C){if(!C[A].config.isTarget&&C[A].dragElId){var B=C[A].dragElId;C[A].unreg();Ext.get(B).remove()}else{if(C[A].config.isTarget){C[A].proxyTop.remove();C[A].proxyBottom.remove();C[A].unreg()}}if(Ext.dd.DDM.locationCache[A]){delete Ext.dd.DDM.locationCache[A]}}delete Ext.dd.DDM.ids["gridHeader"+this.grid.getGridEl().id]}}Ext.destroy(this.resizeMarker,this.resizeProxy);if(this.dragZone){this.dragZone.unreg()}this.initData(null,null);Ext.EventManager.removeResizeListener(this.onWindowResize,this)},onDenyColumnHide:function(){},render:function(){if(this.autoFill){this.fitColumns(true,true)}else{if(this.forceFit){this.fitColumns(true,false)}else{if(this.grid.autoExpandColumn){this.autoExpand(true)}}}this.renderUI()},initData:function(B,A){if(this.ds){this.ds.un("load",this.onLoad,this);this.ds.un("datachanged",this.onDataChange,this);this.ds.un("add",this.onAdd,this);this.ds.un("remove",this.onRemove,this);this.ds.un("update",this.onUpdate,this);this.ds.un("clear",this.onClear,this)}if(B){B.on("load",this.onLoad,this);B.on("datachanged",this.onDataChange,this);B.on("add",this.onAdd,this);B.on("remove",this.onRemove,this);B.on("update",this.onUpdate,this);B.on("clear",this.onClear,this)}this.ds=B;if(this.cm){this.cm.un("configchange",this.onColConfigChange,this);this.cm.un("widthchange",this.onColWidthChange,this);this.cm.un("headerchange",this.onHeaderChange,this);this.cm.un("hiddenchange",this.onHiddenChange,this);this.cm.un("columnmoved",this.onColumnMove,this);this.cm.un("columnlockchange",this.onColumnLock,this)}if(A){delete this.lastViewWidth;A.on("configchange",this.onColConfigChange,this);A.on("widthchange",this.onColWidthChange,this);A.on("headerchange",this.onHeaderChange,this);A.on("hiddenchange",this.onHiddenChange,this);A.on("columnmoved",this.onColumnMove,this);A.on("columnlockchange",this.onColumnLock,this)}this.cm=A},onDataChange:function(){this.refresh();this.updateHeaderSortState()},onClear:function(){this.refresh()},onUpdate:function(B,A){this.refreshRow(A)},onAdd:function(C,A,B){this.insertRows(C,B,B+(A.length-1))},onRemove:function(D,A,B,C){if(C!==true){this.fireEvent("beforerowremoved",this,B,A)}this.removeRow(B);if(C!==true){this.processRows(B);this.applyEmptyText();this.fireEvent("rowremoved",this,B,A)}},onLoad:function(){this.scrollToTop()},onColWidthChange:function(A,B,C){this.updateColumnWidth(B,C)},onHeaderChange:function(A,B,C){this.updateHeaders()},onHiddenChange:function(A,B,C){this.updateColumnHidden(B,C)},onColumnMove:function(A,D,B){this.indexMap=null;var C=this.getScrollState();this.refresh(true);this.restoreScroll(C);this.afterMove(B)},onColConfigChange:function(){delete this.lastViewWidth;this.indexMap=null;this.refresh(true)},initUI:function(A){A.on("headerclick",this.onHeaderClick,this);if(A.trackMouseOver){A.on("mouseover",this.onRowOver,this);A.on("mouseout",this.onRowOut,this)}},initEvents:function(){},onHeaderClick:function(B,A){if(this.headersDisabled||!this.cm.isSortable(A)){return }B.stopEditing(true);B.store.sort(this.cm.getDataIndex(A))},onRowOver:function(B,A){var C;if((C=this.findRowIndex(A))!==false){this.addRowClass(C,"x-grid3-row-over")}},onRowOut:function(B,A){var C;if((C=this.findRowIndex(A))!==false&&C!==this.findRowIndex(B.getRelatedTarget())){this.removeRowClass(C,"x-grid3-row-over")}},handleWheel:function(A){A.stopPropagation()},onRowSelect:function(A){this.addRowClass(A,"x-grid3-row-selected")},onRowDeselect:function(A){this.removeRowClass(A,"x-grid3-row-selected")},onCellSelect:function(C,B){var A=this.getCell(C,B);if(A){this.fly(A).addClass("x-grid3-cell-selected")}},onCellDeselect:function(C,B){var A=this.getCell(C,B);if(A){this.fly(A).removeClass("x-grid3-cell-selected")}},onColumnSplitterMoved:function(C,B){this.userResized=true;var A=this.grid.colModel;A.setColumnWidth(C,B,true);if(this.forceFit){this.fitColumns(true,false,C);this.updateAllColumnWidths()}else{this.updateColumnWidth(C,B)}this.grid.fireEvent("columnresize",C,B)},handleHdMenuClick:function(C){var B=this.hdCtxIndex;var A=this.cm,D=this.ds;switch(C.id){case"asc":D.sort(A.getDataIndex(B),"ASC");break;case"desc":D.sort(A.getDataIndex(B),"DESC");break;default:B=A.getIndexById(C.id.substr(4));if(B!=-1){if(C.checked&&A.getColumnsBy(this.isHideableColumn,this).length<=1){this.onDenyColumnHide();return false}A.setHidden(B,C.checked)}}return true},isHideableColumn:function(A){return !A.hidden&&!A.fixed},beforeColMenuShow:function(){var A=this.cm,C=A.getColumnCount();this.colMenu.removeAll();for(var B=0;B","
        ",this.groupTextTpl,"
        ","
        ")}this.startGroup.compile();this.endGroup="
        "},findGroup:function(A){return Ext.fly(A).up(".x-grid-group",this.mainBody.dom)},getGroups:function(){return this.hasRows()?this.mainBody.dom.childNodes:[]},onAdd:function(){if(this.enableGrouping&&!this.ignoreAdd){var A=this.getScrollState();this.refresh();this.restoreScroll(A)}else{if(!this.enableGrouping){Ext.grid.GroupingView.superclass.onAdd.apply(this,arguments)}}},onRemove:function(E,A,B,D){Ext.grid.GroupingView.superclass.onRemove.apply(this,arguments);var C=document.getElementById(A._groupId);if(C&&C.childNodes[1].childNodes.length<1){Ext.removeNode(C)}this.applyEmptyText()},refreshRow:function(A){if(this.ds.getCount()==1){this.refresh()}else{this.isUpdating=true;Ext.grid.GroupingView.superclass.refreshRow.apply(this,arguments);this.isUpdating=false}},beforeMenuShow:function(){var C=this.getGroupField();var B=this.hmenu.items.get("groupBy");if(B){B.setDisabled(this.cm.config[this.hdCtxIndex].groupable===false)}var A=this.hmenu.items.get("showGroups");if(A){A.setDisabled(!C&&this.cm.config[this.hdCtxIndex].groupable===false);A.setChecked(!!C,true)}},renderUI:function(){Ext.grid.GroupingView.superclass.renderUI.call(this);this.mainBody.on("mousedown",this.interceptMouse,this);if(this.enableGroupingMenu&&this.hmenu){this.hmenu.add("-",{id:"groupBy",text:this.groupByText,handler:this.onGroupByClick,scope:this,iconCls:"x-group-by-icon"});if(this.enableNoGroups){this.hmenu.add({id:"showGroups",text:this.showGroupsText,checked:true,checkHandler:this.onShowGroupsClick,scope:this})}this.hmenu.on("beforeshow",this.beforeMenuShow,this)}},onGroupByClick:function(){this.grid.store.groupBy(this.cm.getDataIndex(this.hdCtxIndex));this.beforeMenuShow()},onShowGroupsClick:function(A,B){if(B){this.onGroupByClick()}else{this.grid.store.clearGrouping()}},toggleGroup:function(C,B){this.grid.stopEditing(true);C=Ext.getDom(C);var A=Ext.fly(C);B=B!==undefined?B:A.hasClass("x-grid-group-collapsed");this.state[A.dom.id]=B;A[B?"removeClass":"addClass"]("x-grid-group-collapsed")},toggleAllGroups:function(C){var B=this.getGroups();for(var D=0,A=B.length;D=0&&this.config[A].resizable!==false&&this.config[A].fixed!==true},setHidden:function(A,B){var C=this.config[A];if(C.hidden!==B){C.hidden=B;this.totalWidth=null;this.fireEvent("hiddenchange",this,A,B)}},setEditor:function(A,B){this.config[A].editor=B}});Ext.grid.ColumnModel.defaultRenderer=function(A){if(typeof A=="string"&&A.length<1){return" "}return A};Ext.grid.DefaultColumnModel=Ext.grid.ColumnModel; +Ext.grid.AbstractSelectionModel=function(){this.locked=false;Ext.grid.AbstractSelectionModel.superclass.constructor.call(this)};Ext.extend(Ext.grid.AbstractSelectionModel,Ext.util.Observable,{init:function(A){this.grid=A;this.initEvents()},lock:function(){this.locked=true},unlock:function(){this.locked=false},isLocked:function(){return this.locked}}); +Ext.grid.RowSelectionModel=function(A){Ext.apply(this,A);this.selections=new Ext.util.MixedCollection(false,function(B){return B.id});this.last=false;this.lastActive=false;this.addEvents("selectionchange","beforerowselect","rowselect","rowdeselect");Ext.grid.RowSelectionModel.superclass.constructor.call(this)};Ext.extend(Ext.grid.RowSelectionModel,Ext.grid.AbstractSelectionModel,{singleSelect:false,initEvents:function(){if(!this.grid.enableDragDrop&&!this.grid.enableDrag){this.grid.on("rowmousedown",this.handleMouseDown,this)}else{this.grid.on("rowclick",function(B,D,C){if(C.button===0&&!C.shiftKey&&!C.ctrlKey){this.selectRow(D,false);B.view.focusRow(D)}},this)}this.rowNav=new Ext.KeyNav(this.grid.getGridEl(),{"up":function(C){if(!C.shiftKey){this.selectPrevious(C.shiftKey)}else{if(this.last!==false&&this.lastActive!==false){var B=this.last;this.selectRange(this.last,this.lastActive-1);this.grid.getView().focusRow(this.lastActive);if(B!==false){this.last=B}}else{this.selectFirstRow()}}},"down":function(C){if(!C.shiftKey){this.selectNext(C.shiftKey)}else{if(this.last!==false&&this.lastActive!==false){var B=this.last;this.selectRange(this.last,this.lastActive+1);this.grid.getView().focusRow(this.lastActive);if(B!==false){this.last=B}}else{this.selectFirstRow()}}},scope:this});var A=this.grid.view;A.on("refresh",this.onRefresh,this);A.on("rowupdated",this.onRowUpdated,this);A.on("rowremoved",this.onRemove,this)},onRefresh:function(){var F=this.grid.store,B;var D=this.getSelections();this.clearSelections(true);for(var C=0,A=D.length;C0},isSelected:function(A){var B=typeof A=="number"?this.grid.store.getAt(A):A;return(B&&this.selections.key(B.id)?true:false)},isIdSelected:function(A){return(this.selections.key(A)?true:false)},handleMouseDown:function(D,F,E){if(E.button!==0||this.isLocked()){return }var A=this.grid.getView();if(E.shiftKey&&this.last!==false){var C=this.last;this.selectRange(C,F,E.ctrlKey);this.last=C;A.focusRow(F)}else{var B=this.isSelected(F);if(E.ctrlKey&&B){this.deselectRow(F)}else{if(!B||this.getCount()>1){this.selectRow(F,E.ctrlKey||E.shiftKey);A.focusRow(F)}}}},selectRows:function(C,D){if(!D){this.clearSelections()}for(var B=0,A=C.length;B=A;C--){this.selectRow(C,true)}}},deselectRange:function(C,B,A){if(this.locked){return }for(var D=C;D<=B;D++){this.deselectRow(D,A)}},selectRow:function(B,D,A){if(this.locked||(B<0||B>=this.grid.store.getCount())||this.isSelected(B)){return }var C=this.grid.store.getAt(B);if(C&&this.fireEvent("beforerowselect",this,B,D,C)!==false){if(!D||this.singleSelect){this.clearSelections()}this.selections.add(C);this.last=this.lastActive=B;if(!A){this.grid.getView().onRowSelect(B)}this.fireEvent("rowselect",this,B,C);this.fireEvent("selectionchange",this)}},deselectRow:function(B,A){if(this.locked){return }if(this.last==B){this.last=false}if(this.lastActive==B){this.lastActive=false}var C=this.grid.store.getAt(B);if(C){this.selections.remove(C);if(!A){this.grid.getView().onRowDeselect(B)}this.fireEvent("rowdeselect",this,B,C);this.fireEvent("selectionchange",this)}},restoreLast:function(){if(this._last){this.last=this._last}},acceptsNav:function(C,B,A){return !A.isHidden(B)&&A.isCellEditable(B,C)},onEditorKey:function(F,E){var C=E.getKey(),G,D=this.grid,B=D.activeEditor;var A=E.shiftKey;if(C==E.TAB){E.stopEvent();B.completeEdit();if(A){G=D.walkCells(B.row,B.col-1,-1,this.acceptsNav,this)}else{G=D.walkCells(B.row,B.col+1,1,this.acceptsNav,this)}}else{if(C==E.ENTER){E.stopEvent();B.completeEdit();if(this.moveEditorOnEnter!==false){if(A){G=D.walkCells(B.row-1,B.col,-1,this.acceptsNav,this)}else{G=D.walkCells(B.row+1,B.col,1,this.acceptsNav,this)}}}else{if(C==E.ESC){B.cancelEdit()}}}if(G){D.startEditing(G[0],G[1])}}}); +Ext.grid.CellSelectionModel=function(A){Ext.apply(this,A);this.selection=null;this.addEvents("beforecellselect","cellselect","selectionchange");Ext.grid.CellSelectionModel.superclass.constructor.call(this)};Ext.extend(Ext.grid.CellSelectionModel,Ext.grid.AbstractSelectionModel,{initEvents:function(){this.grid.on("cellmousedown",this.handleMouseDown,this);this.grid.getGridEl().on(Ext.isIE||Ext.isSafari3?"keydown":"keypress",this.handleKeyDown,this);var A=this.grid.view;A.on("refresh",this.onViewChange,this);A.on("rowupdated",this.onRowUpdated,this);A.on("beforerowremoved",this.clearSelections,this);A.on("beforerowsinserted",this.clearSelections,this);if(this.grid.isEditor){this.grid.on("beforeedit",this.beforeEdit,this)}},beforeEdit:function(A){this.select(A.row,A.column,false,true,A.record)},onRowUpdated:function(A,B,C){if(this.selection&&this.selection.record==C){A.onCellSelect(B,this.selection.cell[1])}},onViewChange:function(){this.clearSelections(true)},getSelectedCell:function(){return this.selection?this.selection.cell:null},clearSelections:function(B){var A=this.selection;if(A){if(B!==true){this.grid.view.onCellDeselect(A.cell[0],A.cell[1])}this.selection=null;this.fireEvent("selectionchange",this,null)}},hasSelection:function(){return this.selection?true:false},handleMouseDown:function(B,D,A,C){if(C.button!==0||this.isLocked()){return }this.select(D,A)},select:function(F,C,B,E,D){if(this.fireEvent("beforecellselect",this,F,C)!==false){this.clearSelections();D=D||this.grid.store.getAt(F);this.selection={record:D,cell:[F,C]};if(!B){var A=this.grid.getView();A.onCellSelect(F,C);if(E!==true){A.focusCell(F,C)}}this.fireEvent("cellselect",this,F,C);this.fireEvent("selectionchange",this,this.selection)}},isSelectable:function(C,B,A){return !A.isHidden(B)},handleKeyDown:function(F){if(!F.isNavKeyPress()){return }var E=this.grid,J=this.selection;if(!J){F.stopEvent();var I=E.walkCells(0,0,1,this.isSelectable,this);if(I){this.select(I[0],I[1])}return }var B=this;var H=function(M,K,L){return E.walkCells(M,K,L,B.isSelectable,B)};var C=F.getKey(),A=J.cell[0],G=J.cell[1];var D;switch(C){case F.TAB:if(F.shiftKey){D=H(A,G-1,-1)}else{D=H(A,G+1,1)}break;case F.DOWN:D=H(A+1,G,1);break;case F.UP:D=H(A-1,G,-1);break;case F.RIGHT:D=H(A,G+1,1);break;case F.LEFT:D=H(A,G-1,-1);break;case F.ENTER:if(E.isEditor&&!E.editing){E.startEditing(A,G);F.stopEvent();return }break}if(D){this.select(D[0],D[1]);F.stopEvent()}},acceptsNav:function(C,B,A){return !A.isHidden(B)&&A.isCellEditable(B,C)},onEditorKey:function(E,D){var B=D.getKey(),F,C=this.grid,A=C.activeEditor;if(B==D.TAB){if(D.shiftKey){F=C.walkCells(A.row,A.col-1,-1,this.acceptsNav,this)}else{F=C.walkCells(A.row,A.col+1,1,this.acceptsNav,this)}D.stopEvent()}else{if(B==D.ENTER){A.completeEdit();D.stopEvent()}else{if(B==D.ESC){D.stopEvent();A.cancelEdit()}}}if(F){C.startEditing(F[0],F[1])}}}); +Ext.grid.EditorGridPanel=Ext.extend(Ext.grid.GridPanel,{clicksToEdit:2,isEditor:true,detectEdit:false,autoEncode:false,trackMouseOver:false,initComponent:function(){Ext.grid.EditorGridPanel.superclass.initComponent.call(this);if(!this.selModel){this.selModel=new Ext.grid.CellSelectionModel()}this.activeEditor=null;this.addEvents("beforeedit","afteredit","validateedit")},initEvents:function(){Ext.grid.EditorGridPanel.superclass.initEvents.call(this);this.on("bodyscroll",this.stopEditing,this,[true]);if(this.clicksToEdit==1){this.on("cellclick",this.onCellDblClick,this)}else{if(this.clicksToEdit=="auto"&&this.view.mainBody){this.view.mainBody.on("mousedown",this.onAutoEditClick,this)}this.on("celldblclick",this.onCellDblClick,this)}this.getGridEl().addClass("xedit-grid")},onCellDblClick:function(B,C,A){this.startEditing(C,A)},onAutoEditClick:function(C,B){if(C.button!==0){return }var E=this.view.findRowIndex(B);var A=this.view.findCellIndex(B);if(E!==false&&A!==false){this.stopEditing();if(this.selModel.getSelectedCell){var D=this.selModel.getSelectedCell();if(D&&D.cell[0]===E&&D.cell[1]===A){this.startEditing(E,A)}}else{if(this.selModel.isSelected(E)){this.startEditing(E,A)}}}},onEditComplete:function(B,D,A){this.editing=false;this.activeEditor=null;B.un("specialkey",this.selModel.onEditorKey,this.selModel);var C=B.record;var F=this.colModel.getDataIndex(B.col);D=this.postEditValue(D,A,C,F);if(String(D)!==String(A)){var E={grid:this,record:C,field:F,originalValue:A,value:D,row:B.row,column:B.col,cancel:false};if(this.fireEvent("validateedit",E)!==false&&!E.cancel){C.set(F,E.value);delete E.cancel;this.fireEvent("afteredit",E)}}this.view.focusCell(B.row,B.col)},startEditing:function(F,B){this.stopEditing();if(this.colModel.isCellEditable(B,F)){this.view.ensureVisible(F,B,true);var C=this.store.getAt(F);var E=this.colModel.getDataIndex(B);var D={grid:this,record:C,field:E,value:C.data[E],row:F,column:B,cancel:false};if(this.fireEvent("beforeedit",D)!==false&&!D.cancel){this.editing=true;var A=this.colModel.getCellEditor(B,F);if(!A.rendered){A.render(this.view.getEditorParent(A))}(function(){A.row=F;A.col=B;A.record=C;A.on("complete",this.onEditComplete,this,{single:true});A.on("specialkey",this.selModel.onEditorKey,this.selModel);this.activeEditor=A;var G=this.preEditValue(C,E);A.startEdit(this.view.getCell(F,B).firstChild,G)}).defer(50,this)}}},preEditValue:function(A,C){var B=A.data[C];return this.autoEncode&&typeof B=="string"?Ext.util.Format.htmlDecode(B):B},postEditValue:function(C,A,B,D){return this.autoEncode&&typeof C=="string"?Ext.util.Format.htmlEncode(C):C},stopEditing:function(A){if(this.activeEditor){this.activeEditor[A===true?"cancelEdit":"completeEdit"]()}this.activeEditor=null},onDestroy:function(){if(this.rendered){var C=this.colModel.config;for(var B=0,A=C.length;B ",width:20,sortable:false,menuDisabled:true,fixed:true,dataIndex:"",id:"checker",initEvents:function(){Ext.grid.CheckboxSelectionModel.superclass.initEvents.call(this);this.grid.on("render",function(){var A=this.grid.getView();A.mainBody.on("mousedown",this.onMouseDown,this);Ext.fly(A.innerHd).on("mousedown",this.onHdMouseDown,this)},this)},onMouseDown:function(C,B){if(C.button===0&&B.className=="x-grid3-row-checker"){C.stopEvent();var D=C.getTarget(".x-grid3-row");if(D){var A=D.rowIndex;if(this.isSelected(A)){this.deselectRow(A)}else{this.selectRow(A,true)}}}},onHdMouseDown:function(C,A){if(A.className=="x-grid3-hd-checker"){C.stopEvent();var B=Ext.fly(A.parentNode);var D=B.hasClass("x-grid3-hd-checker-on");if(D){B.removeClass("x-grid3-hd-checker-on");this.clearSelections()}else{B.addClass("x-grid3-hd-checker-on");this.selectAll()}}},renderer:function(B,C,A){return"
         
        "}}); +Ext.LoadMask=function(C,B){this.el=Ext.get(C);Ext.apply(this,B);if(this.store){this.store.on("beforeload",this.onBeforeLoad,this);this.store.on("load",this.onLoad,this);this.store.on("loadexception",this.onLoad,this);this.removeMask=Ext.value(this.removeMask,false)}else{var A=this.el.getUpdater();A.showLoadIndicator=false;A.on("beforeupdate",this.onBeforeLoad,this);A.on("update",this.onLoad,this);A.on("failure",this.onLoad,this);this.removeMask=Ext.value(this.removeMask,true)}};Ext.LoadMask.prototype={msg:"Loading...",msgCls:"x-mask-loading",disabled:false,disable:function(){this.disabled=true},enable:function(){this.disabled=false},onLoad:function(){this.el.unmask(this.removeMask)},onBeforeLoad:function(){if(!this.disabled){this.el.mask(this.msg,this.msgCls)}},show:function(){this.onBeforeLoad()},hide:function(){this.onLoad()},destroy:function(){if(this.store){this.store.un("beforeload",this.onBeforeLoad,this);this.store.un("load",this.onLoad,this);this.store.un("loadexception",this.onLoad,this)}else{var A=this.el.getUpdater();A.un("beforeupdate",this.onBeforeLoad,this);A.un("update",this.onLoad,this);A.un("failure",this.onLoad,this)}}}; +Ext.ProgressBar=Ext.extend(Ext.BoxComponent,{baseCls:"x-progress",waitTimer:null,initComponent:function(){Ext.ProgressBar.superclass.initComponent.call(this);this.addEvents("update")},onRender:function(D,A){Ext.ProgressBar.superclass.onRender.call(this,D,A);var C=new Ext.Template("
        ","
        ","
        ","
        ","
         
        ","
        ","
        ","
        ","
         
        ","
        ","
        ","
        ");if(A){this.el=C.insertBefore(A,{cls:this.baseCls},true)}else{this.el=C.append(D,{cls:this.baseCls},true)}if(this.id){this.el.dom.id=this.id}var B=this.el.dom.firstChild;this.progressBar=Ext.get(B.firstChild);if(this.textEl){this.textEl=Ext.get(this.textEl);delete this.textTopEl}else{this.textTopEl=Ext.get(this.progressBar.dom.firstChild);var E=Ext.get(B.childNodes[1]);this.textTopEl.setStyle("z-index",99).addClass("x-hidden");this.textEl=new Ext.CompositeElement([this.textTopEl.dom.firstChild,E.dom.firstChild]);this.textEl.setWidth(B.offsetWidth)}this.progressBar.setHeight(B.offsetHeight)},afterRender:function(){Ext.ProgressBar.superclass.afterRender.call(this);if(this.value){this.updateProgress(this.value,this.text)}else{this.updateText(this.text)}},updateProgress:function(B,C){this.value=B||0;if(C){this.updateText(C)}if(this.rendered){var A=Math.floor(B*this.el.dom.firstChild.offsetWidth);this.progressBar.setWidth(A);if(this.textTopEl){this.textTopEl.removeClass("x-hidden").setWidth(A)}}this.fireEvent("update",this,B,C);return this},wait:function(B){if(!this.waitTimer){var A=this;B=B||{};this.updateText(B.text);this.waitTimer=Ext.TaskMgr.start({run:function(C){var D=B.increment||10;this.updateProgress(((((C+D)%D)+1)*(100/D))*0.01)},interval:B.interval||1000,duration:B.duration,onStop:function(){if(B.fn){B.fn.apply(B.scope||this)}this.reset()},scope:A})}return this},isWaiting:function(){return this.waitTimer!=null},updateText:function(A){this.text=A||" ";if(this.rendered){this.textEl.update(this.text)}return this},syncProgressBar:function(){if(this.value){this.updateProgress(this.value,this.text)}return this},setSize:function(A,C){Ext.ProgressBar.superclass.setSize.call(this,A,C);if(this.textTopEl){var B=this.el.dom.firstChild;this.textEl.setSize(B.offsetWidth,B.offsetHeight)}this.syncProgressBar();return this},reset:function(A){this.updateProgress(0);if(this.textTopEl){this.textTopEl.addClass("x-hidden")}if(this.waitTimer){this.waitTimer.onStop=null;Ext.TaskMgr.stop(this.waitTimer);this.waitTimer=null}if(A===true){this.hide()}return this}});Ext.reg("progress",Ext.ProgressBar); +Ext.Slider=Ext.extend(Ext.BoxComponent,{vertical:false,minValue:0,maxValue:100,keyIncrement:1,increment:0,clickRange:[5,15],clickToChange:true,animate:true,dragging:false,initComponent:function(){if(this.value===undefined){this.value=this.minValue}Ext.Slider.superclass.initComponent.call(this);this.keyIncrement=Math.max(this.increment,this.keyIncrement);this.addEvents("beforechange","change","changecomplete","dragstart","drag","dragend");if(this.vertical){Ext.apply(this,Ext.Slider.Vertical)}},onRender:function(){this.autoEl={cls:"x-slider "+(this.vertical?"x-slider-vert":"x-slider-horz"),cn:{cls:"x-slider-end",cn:{cls:"x-slider-inner",cn:[{cls:"x-slider-thumb"},{tag:"a",cls:"x-slider-focus",href:"#",tabIndex:"-1",hidefocus:"on"}]}}};Ext.Slider.superclass.onRender.apply(this,arguments);this.endEl=this.el.first();this.innerEl=this.endEl.first();this.thumb=this.innerEl.first();this.halfThumb=(this.vertical?this.thumb.getHeight():this.thumb.getWidth())/2;this.focusEl=this.thumb.next();this.initEvents()},initEvents:function(){this.thumb.addClassOnOver("x-slider-thumb-over");this.mon(this.el,"mousedown",this.onMouseDown,this);this.mon(this.el,"keydown",this.onKeyDown,this);this.focusEl.swallowEvent("click",true);this.tracker=new Ext.dd.DragTracker({onBeforeStart:this.onBeforeDragStart.createDelegate(this),onStart:this.onDragStart.createDelegate(this),onDrag:this.onDrag.createDelegate(this),onEnd:this.onDragEnd.createDelegate(this),tolerance:3,autoStart:300});this.tracker.initEl(this.thumb);this.on("beforedestroy",this.tracker.destroy,this.tracker)},onMouseDown:function(B){if(this.disabled){return }if(this.clickToChange&&B.target!=this.thumb.dom){var A=this.innerEl.translatePoints(B.getXY());this.onClickChange(A)}this.focus()},onClickChange:function(A){if(A.top>this.clickRange[0]&&A.top0){if(A>(C/2)){D=B+(C-A)}else{D=B-A}}return D.constrain(this.minValue,this.maxValue)},afterRender:function(){Ext.Slider.superclass.afterRender.apply(this,arguments);if(this.value!==undefined){var A=this.normalizeValue(this.value);if(A!==this.value){delete this.value;this.setValue(A,false)}else{this.moveThumb(this.translateValue(A),false)}}},getRatio:function(){var A=this.innerEl.getWidth();var B=this.maxValue-this.minValue;return B==0?A:(A/B)},normalizeValue:function(A){if(typeof A!="number"){A=parseInt(A)}A=Math.round(A);A=this.doSnap(A);A=A.constrain(this.minValue,this.maxValue);return A},setValue:function(B,A,C){B=this.normalizeValue(B);if(B!==this.value&&this.fireEvent("beforechange",this,B,this.value)!==false){this.value=B;this.moveThumb(this.translateValue(B),A!==false);this.fireEvent("change",this,B);if(C){this.fireEvent("changecomplete",this,B)}}},translateValue:function(A){var B=this.getRatio();return(A*B)-(this.minValue*B)-this.halfThumb},reverseValue:function(B){var A=this.getRatio();return(B+this.halfThumb+(this.minValue*A))/A},moveThumb:function(B,A){if(!A||this.animate===false){this.thumb.setLeft(B)}else{this.thumb.shift({left:B,stopFx:true,duration:0.35})}},focus:function(){this.focusEl.focus(10)},onBeforeDragStart:function(A){return !this.disabled},onDragStart:function(A){this.thumb.addClass("x-slider-thumb-drag");this.dragging=true;this.dragStartValue=this.value;this.fireEvent("dragstart",this,A)},onDrag:function(A){var B=this.innerEl.translatePoints(this.tracker.getXY());this.setValue(Math.round(this.reverseValue(B.left)),false);this.fireEvent("drag",this,A)},onDragEnd:function(A){this.thumb.removeClass("x-slider-thumb-drag");this.dragging=false;this.fireEvent("dragend",this,A);if(this.dragStartValue!=this.value){this.fireEvent("changecomplete",this,this.value)}},onResize:function(A,B){this.innerEl.setWidth(A-(this.el.getPadding("l")+this.endEl.getPadding("r")));this.syncThumb()},syncThumb:function(){if(this.rendered){this.moveThumb(this.translateValue(this.value))}},getValue:function(){return this.value}});Ext.reg("slider",Ext.Slider);Ext.Slider.Vertical={onResize:function(A,B){this.innerEl.setHeight(B-(this.el.getPadding("t")+this.endEl.getPadding("b")));this.syncThumb()},getRatio:function(){var B=this.innerEl.getHeight();var A=this.maxValue-this.minValue;return B/A},moveThumb:function(B,A){if(!A||this.animate===false){this.thumb.setBottom(B)}else{this.thumb.shift({bottom:B,stopFx:true,duration:0.35})}},onDrag:function(B){var C=this.innerEl.translatePoints(this.tracker.getXY());var A=this.innerEl.getHeight()-C.top;this.setValue(Math.round(A/this.getRatio()),false);this.fireEvent("drag",this,B)},onClickChange:function(B){if(B.left>this.clickRange[0]&&B.left0){this.statusEl.addClass(A);this.currIconCls=A}}else{this.currIconCls=A}return this},showBusy:function(A){if(typeof A=="string"){A={text:A}}A=Ext.applyIf(A||{},{text:this.busyText,iconCls:this.busyIconCls});return this.setStatus(A)}});Ext.reg("statusbar",Ext.StatusBar); +Ext.History=(function(){var E,C;var J=false;var D;function F(){var K=top.location.href,L=K.indexOf("#");return L>=0?K.substr(L+1):null}function A(){C.value=D}function G(K){D=K;Ext.History.fireEvent("change",K)}function H(L){var K=["
        ",L,"
        "].join("");try{var N=E.contentWindow.document;N.open();N.write(K);N.close();return true}catch(M){return false}}function B(){if(!E.contentWindow||!E.contentWindow.document){setTimeout(B,10);return }var N=E.contentWindow.document;var L=N.getElementById("state");var K=L?L.innerText:null;var M=F();setInterval(function(){N=E.contentWindow.document;L=N.getElementById("state");var P=L?L.innerText:null;var O=F();if(P!==K){K=P;G(K);top.location.hash=K;M=K;A()}else{if(O!==M){M=O;H(O)}}},50);J=true;Ext.History.fireEvent("ready",Ext.History)}function I(){D=C.value;if(Ext.isIE){B()}else{var K=F();setInterval(function(){var L=F();if(L!==K){K=L;G(K);A()}},50);J=true;Ext.History.fireEvent("ready",Ext.History)}}return{fieldId:"x-history-field",iframeId:"x-history-frame",events:{},init:function(L,K){if(J){Ext.callback(L,K,[this]);return }if(!Ext.isReady){Ext.onReady(function(){Ext.History.init(L,K)});return }C=Ext.getDom(Ext.History.fieldId);if(Ext.isIE){E=Ext.getDom(Ext.History.iframeId)}this.addEvents("ready","change");if(L){this.on("ready",L,K,{single:true})}I()},add:function(K,L){if(L!==false){if(this.getToken()==K){return true}}if(Ext.isIE){return H(K)}else{top.location.hash=K;return true}},back:function(){history.go(-1)},forward:function(){history.go(1)},getToken:function(){return J?D:F()}}})();Ext.apply(Ext.History,new Ext.util.Observable()); diff --git a/comet4j-js/generateDoc/template/ext/resources/ext-base.js b/comet4j-js/generateDoc/template/ext/resources/ext-base.js new file mode 100644 index 0000000..fedb877 --- /dev/null +++ b/comet4j-js/generateDoc/template/ext/resources/ext-base.js @@ -0,0 +1,10 @@ +/* + * Ext JS Library 2.2 + * Copyright(c) 2006-2008, Ext JS, LLC. + * licensing@extjs.com + * + * http://extjs.com/license + */ + +Ext={version:"2.2"};window["undefined"]=window["undefined"];Ext.apply=function(C,D,B){if(B){Ext.apply(C,B)}if(C&&D&&typeof D=="object"){for(var A in D){C[A]=D[A]}}return C};(function(){var idSeed=0;var ua=navigator.userAgent.toLowerCase();var isStrict=document.compatMode=="CSS1Compat",isOpera=ua.indexOf("opera")>-1,isSafari=(/webkit|khtml/).test(ua),isSafari3=isSafari&&ua.indexOf("webkit/5")!=-1,isIE=!isOpera&&ua.indexOf("msie")>-1,isIE7=!isOpera&&ua.indexOf("msie 7")>-1,isGecko=!isSafari&&ua.indexOf("gecko")>-1,isGecko3=!isSafari&&ua.indexOf("rv:1.9")>-1,isBorderBox=isIE&&!isStrict,isWindows=(ua.indexOf("windows")!=-1||ua.indexOf("win32")!=-1),isMac=(ua.indexOf("macintosh")!=-1||ua.indexOf("mac os x")!=-1),isAir=(ua.indexOf("adobeair")!=-1),isLinux=(ua.indexOf("linux")!=-1),isSecure=window.location.href.toLowerCase().indexOf("https")===0;if(isIE&&!isIE7){try{document.execCommand("BackgroundImageCache",false,true)}catch(e){}}Ext.apply(Ext,{isStrict:isStrict,isSecure:isSecure,isReady:false,enableGarbageCollector:true,enableListenerCollection:false,SSL_SECURE_URL:"javascript:false",BLANK_IMAGE_URL:"http:/"+"/extjs.com/s.gif",emptyFn:function(){},applyIf:function(o,c){if(o&&c){for(var p in c){if(typeof o[p]=="undefined"){o[p]=c[p]}}}return o},addBehaviors:function(o){if(!Ext.isReady){Ext.onReady(function(){Ext.addBehaviors(o)});return }var cache={};for(var b in o){var parts=b.split("@");if(parts[1]){var s=parts[0];if(!cache[s]){cache[s]=Ext.select(s)}cache[s].on(parts[1],o[b])}}cache=null},id:function(el,prefix){prefix=prefix||"ext-gen";el=Ext.getDom(el);var id=prefix+(++idSeed);return el?(el.id?el.id:(el.id=id)):id},extend:function(){var io=function(o){for(var m in o){this[m]=o[m]}};var oc=Object.prototype.constructor;return function(sb,sp,overrides){if(typeof sp=="object"){overrides=sp;sp=sb;sb=overrides.constructor!=oc?overrides.constructor:function(){sp.apply(this,arguments)}}var F=function(){},sbp,spp=sp.prototype;F.prototype=spp;sbp=sb.prototype=new F();sbp.constructor=sb;sb.superclass=spp;if(spp.constructor==oc){spp.constructor=sp}sb.override=function(o){Ext.override(sb,o)};sbp.override=io;Ext.override(sb,overrides);sb.extend=function(o){Ext.extend(sb,o)};return sb}}(),override:function(origclass,overrides){if(overrides){var p=origclass.prototype;for(var method in overrides){p[method]=overrides[method]}}},namespace:function(){var a=arguments,o=null,i,j,d,rt;for(i=0;i=0){L=G[P]}if(!S||!L){return false}this.doRemove(S,O,L[this.WFN],false);delete G[P][this.WFN];delete G[P][this.FN];G.splice(P,1);return true},getTarget:function(N,M){N=N.browserEvent||N;var L=N.target||N.srcElement;return this.resolveTextNode(L)},resolveTextNode:function(L){if(Ext.isSafari&&L&&3==L.nodeType){return L.parentNode}else{return L}},getPageX:function(M){M=M.browserEvent||M;var L=M.pageX;if(!L&&0!==L){L=M.clientX||0;if(Ext.isIE){L+=this.getScroll()[1]}}return L},getPageY:function(L){L=L.browserEvent||L;var M=L.pageY;if(!M&&0!==M){M=L.clientY||0;if(Ext.isIE){M+=this.getScroll()[0]}}return M},getXY:function(L){L=L.browserEvent||L;return[this.getPageX(L),this.getPageY(L)]},getRelatedTarget:function(M){M=M.browserEvent||M;var L=M.relatedTarget;if(!L){if(M.type=="mouseout"){L=M.toElement}else{if(M.type=="mouseover"){L=M.fromElement}}}return this.resolveTextNode(L)},getTime:function(N){N=N.browserEvent||N;if(!N.time){var M=new Date().getTime();try{N.time=M}catch(L){this.lastError=L;return M}}return N.time},stopEvent:function(L){this.stopPropagation(L);this.preventDefault(L)},stopPropagation:function(L){L=L.browserEvent||L;if(L.stopPropagation){L.stopPropagation()}else{L.cancelBubble=true}},preventDefault:function(L){L=L.browserEvent||L;if(L.preventDefault){L.preventDefault()}else{L.returnValue=false}},getEvent:function(M){var L=M||window.event;if(!L){var N=this.getEvent.caller;while(N){L=N.arguments[0];if(L&&Event==L.constructor){break}N=N.caller}}return L},getCharCode:function(L){L=L.browserEvent||L;return L.charCode||L.keyCode||0},_getCacheIndex:function(Q,N,P){for(var O=0,M=G.length;O0)}var Q=[];for(var M=0,L=H.length;M0){for(var Q=0,S=T.length;Q0){O=G.length;while(O){N=O-1;M=G[N];if(M){R.removeListener(M[R.EL],M[R.TYPE],M[R.FN],N)}O=O-1}M=null;R.clearCache()}R.doRemove(window,"unload",R._unload)},getScroll:function(){var L=document.documentElement,M=document.body;if(L&&(L.scrollTop||L.scrollLeft)){return[L.scrollTop,L.scrollLeft]}else{if(M){return[M.scrollTop,M.scrollLeft]}else{return[0,0]}}},doAdd:function(){if(window.addEventListener){return function(O,M,N,L){O.addEventListener(M,N,(L))}}else{if(window.attachEvent){return function(O,M,N,L){O.attachEvent("on"+M,N)}}else{return function(){}}}}(),doRemove:function(){if(window.removeEventListener){return function(O,M,N,L){O.removeEventListener(M,N,(L))}}else{if(window.detachEvent){return function(N,L,M){N.detachEvent("on"+L,M)}}else{return function(){}}}}()}}();var D=Ext.lib.Event;D.on=D.addListener;D.un=D.removeListener;if(document&&document.body){D._load()}else{D.doAdd(window,"load",D._load)}D.doAdd(window,"unload",D._unload);D._tryPreloadAttach();Ext.lib.Ajax={request:function(K,I,E,J,F){if(F){var G=F.headers;if(G){for(var H in G){if(G.hasOwnProperty(H)){this.initHeader(H,G[H],false)}}}if(F.xmlData){if(!G||!G["Content-Type"]){this.initHeader("Content-Type","text/xml",false)}K=(K?K:(F.method?F.method:"POST"));J=F.xmlData}else{if(F.jsonData){if(!G||!G["Content-Type"]){this.initHeader("Content-Type","application/json",false)}K=(K?K:(F.method?F.method:"POST"));J=typeof F.jsonData=="object"?Ext.encode(F.jsonData):F.jsonData}}}return this.asyncRequest(K,I,E,J)},serializeForm:function(F){if(typeof F=="string"){F=(document.getElementById(F)||document.forms[F])}var G,E,H,J,K="",M=false;for(var L=0;L=200&&G<300){F=this.createResponseObject(I,J.argument);if(J.success){if(!J.scope){J.success(F)}else{J.success.apply(J.scope,[F])}}}else{switch(G){case 12002:case 12029:case 12030:case 12031:case 12152:case 13030:F=this.createExceptionObject(I.tId,J.argument,(E?E:false));if(J.failure){if(!J.scope){J.failure(F)}else{J.failure.apply(J.scope,[F])}}break;default:F=this.createResponseObject(I,J.argument);if(J.failure){if(!J.scope){J.failure(F)}else{J.failure.apply(J.scope,[F])}}}}this.releaseObject(I);F=null},createResponseObject:function(E,K){var H={};var M={};try{var G=E.conn.getAllResponseHeaders();var J=G.split("\n");for(var I=0;I=this.left&&E.right<=this.right&&E.top>=this.top&&E.bottom<=this.bottom)},getArea:function(){return((this.bottom-this.top)*(this.right-this.left))},intersect:function(I){var G=Math.max(this.top,I.top);var H=Math.min(this.right,I.right);var E=Math.min(this.bottom,I.bottom);var F=Math.max(this.left,I.left);if(E>=G&&H>=F){return new Ext.lib.Region(G,H,E,F)}else{return null}},union:function(I){var G=Math.min(this.top,I.top);var H=Math.max(this.right,I.right);var E=Math.max(this.bottom,I.bottom);var F=Math.min(this.left,I.left);return new Ext.lib.Region(G,H,E,F)},constrainTo:function(E){this.top=this.top.constrain(E.top,E.bottom);this.bottom=this.bottom.constrain(E.top,E.bottom);this.left=this.left.constrain(E.left,E.right);this.right=this.right.constrain(E.left,E.right);return this},adjust:function(G,F,E,H){this.top+=G;this.left+=F;this.right+=H;this.bottom+=E;return this}};Ext.lib.Region.getRegion=function(H){var J=Ext.lib.Dom.getXY(H);var G=J[1];var I=J[0]+H.offsetWidth;var E=J[1]+H.offsetHeight;var F=J[0];return new Ext.lib.Region(G,I,E,F)};Ext.lib.Point=function(E,F){if(Ext.isArray(E)){F=E[1];E=E[0]}this.x=this.right=this.left=this[0]=E;this.y=this.top=this.bottom=this[1]=F};Ext.lib.Point.prototype=new Ext.lib.Region();Ext.lib.Anim={scroll:function(H,F,I,J,E,G){return this.run(H,F,I,J,E,G,Ext.lib.Scroll)},motion:function(H,F,I,J,E,G){return this.run(H,F,I,J,E,G,Ext.lib.Motion)},color:function(H,F,I,J,E,G){return this.run(H,F,I,J,E,G,Ext.lib.ColorAnim)},run:function(I,F,K,L,E,H,G){G=G||Ext.lib.AnimBase;if(typeof L=="string"){L=Ext.lib.Easing[L]}var J=new G(I,F,K,L);J.animateX(function(){Ext.callback(E,H)});return J}};function C(E){if(!B){B=new Ext.Element.Flyweight()}B.dom=E;return B}if(Ext.isIE){function A(){var E=Function.prototype;delete E.createSequence;delete E.defer;delete E.createDelegate;delete E.createCallback;delete E.createInterceptor;window.detachEvent("onunload",A)}window.attachEvent("onunload",A)}Ext.lib.AnimBase=function(F,E,G,H){if(F){this.init(F,E,G,H)}};Ext.lib.AnimBase.prototype={toString:function(){var E=this.getEl();var F=E.id||E.tagName;return("Anim "+F)},patterns:{noNegatives:/width|height|opacity|padding/i,offsetAttribute:/^((width|height)|(top|left))$/,defaultUnit:/width|height|top$|bottom$|left$|right$/i,offsetUnit:/\d+(em|%|en|ex|pt|in|cm|mm|pc)$/i},doMethod:function(E,G,F){return this.method(this.currentFrame,G,F-G,this.totalFrames)},setAttribute:function(E,G,F){if(this.patterns.noNegatives.test(E)){G=(G>0)?G:0}Ext.fly(this.getEl(),"_anim").setStyle(E,G+F)},getAttribute:function(E){var G=this.getEl();var I=C(G).getStyle(E);if(I!=="auto"&&!this.patterns.offsetUnit.test(I)){return parseFloat(I)}var F=this.patterns.offsetAttribute.exec(E)||[];var J=!!(F[3]);var H=!!(F[2]);if(H||(C(G).getStyle("position")=="absolute"&&J)){I=G["offset"+F[0].charAt(0).toUpperCase()+F[0].substr(1)]}else{I=0}return I},getDefaultUnit:function(E){if(this.patterns.defaultUnit.test(E)){return"px"}return""},animateX:function(G,E){var F=function(){this.onComplete.removeListener(F);if(typeof G=="function"){G.call(E||this,this)}};this.onComplete.addListener(F,this);this.animate()},setRuntimeAttribute:function(F){var K;var G;var H=this.attributes;this.runtimeAttributes[F]={};var J=function(L){return(typeof L!=="undefined")};if(!J(H[F]["to"])&&!J(H[F]["by"])){return false}K=(J(H[F]["from"]))?H[F]["from"]:this.getAttribute(F);if(J(H[F]["to"])){G=H[F]["to"]}else{if(J(H[F]["by"])){if(K.constructor==Array){G=[];for(var I=0,E=K.length;I0&&isFinite(O)){if(K.currentFrame+O>=N){O=N-(M+1)}K.currentFrame+=O}}};Ext.lib.Bezier=new function(){this.getPosition=function(I,H){var J=I.length;var G=[];for(var F=0;F0&&!Ext.isArray(O[0])){O=[O]}else{var N=[];for(P=0,R=O.length;P0){this.runtimeAttributes[S]=this.runtimeAttributes[S].concat(O)}this.runtimeAttributes[S][this.runtimeAttributes[S].length]=L}else{I.setRuntimeAttribute.call(this,S)}};var E=function(J,L){var K=Ext.lib.Dom.getXY(this.getEl());J=[J[0]-K[0]+L[0],J[1]-K[1]+L[1]];return J};var G=function(J){return(typeof J!=="undefined")}})();(function(){Ext.lib.Scroll=function(I,H,J,K){if(I){Ext.lib.Scroll.superclass.constructor.call(this,I,H,J,K)}};Ext.extend(Ext.lib.Scroll,Ext.lib.ColorAnim);var F=Ext.lib;var G=F.Scroll.superclass;var E=F.Scroll.prototype;E.toString=function(){var H=this.getEl();var I=H.id||H.tagName;return("Scroll "+I)};E.doMethod=function(H,K,I){var J=null;if(H=="scroll"){J=[this.method(this.currentFrame,K[0],I[0]-K[0],this.totalFrames),this.method(this.currentFrame,K[1],I[1]-K[1],this.totalFrames)]}else{J=G.doMethod.call(this,H,K,I)}return J};E.getAttribute=function(H){var J=null;var I=this.getEl();if(H=="scroll"){J=[I.scrollLeft,I.scrollTop]}else{J=G.getAttribute.call(this,H)}return J};E.setAttribute=function(H,K,J){var I=this.getEl();if(H=="scroll"){I.scrollLeft=K[0];I.scrollTop=K[1]}else{G.setAttribute.call(this,H,K,J)}}})()})(); diff --git a/comet4j-js/generateDoc/template/ext/resources/extanim32.gif b/comet4j-js/generateDoc/template/ext/resources/extanim32.gif new file mode 100644 index 0000000..effe7c9 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/extanim32.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/extanim64.gif b/comet4j-js/generateDoc/template/ext/resources/extanim64.gif new file mode 100644 index 0000000..07a6862 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/extanim64.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/extjs.gif b/comet4j-js/generateDoc/template/ext/resources/extjs.gif new file mode 100644 index 0000000..724796d Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/extjs.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/fav.gif b/comet4j-js/generateDoc/template/ext/resources/fav.gif new file mode 100644 index 0000000..abe3cf0 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/fav.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/folder.gif b/comet4j-js/generateDoc/template/ext/resources/folder.gif new file mode 100644 index 0000000..2064442 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/folder.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/folder_open.gif b/comet4j-js/generateDoc/template/ext/resources/folder_open.gif new file mode 100644 index 0000000..ba4c657 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/folder_open.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/form.png b/comet4j-js/generateDoc/template/ext/resources/form.png new file mode 100644 index 0000000..f0945cf Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/form.png differ diff --git a/comet4j-js/generateDoc/template/ext/resources/forum.gif b/comet4j-js/generateDoc/template/ext/resources/forum.gif new file mode 100644 index 0000000..21d7268 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/forum.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/hd-bg.gif b/comet4j-js/generateDoc/template/ext/resources/hd-bg.gif new file mode 100644 index 0000000..310102a Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/hd-bg.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/hide-inherited.gif b/comet4j-js/generateDoc/template/ext/resources/hide-inherited.gif new file mode 100644 index 0000000..eae8e54 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/hide-inherited.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/icon-grid.gif b/comet4j-js/generateDoc/template/ext/resources/icon-grid.gif new file mode 100644 index 0000000..6b64286 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/icon-grid.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/box/corners-blue.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/box/corners-blue.gif new file mode 100644 index 0000000..fa419b5 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/box/corners-blue.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/box/corners.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/box/corners.gif new file mode 100644 index 0000000..8aa8cae Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/box/corners.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/box/l-blue.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/box/l-blue.gif new file mode 100644 index 0000000..5ed7f00 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/box/l-blue.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/box/l.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/box/l.gif new file mode 100644 index 0000000..0160f97 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/box/l.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/box/r-blue.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/box/r-blue.gif new file mode 100644 index 0000000..3ea5cae Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/box/r-blue.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/box/r.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/box/r.gif new file mode 100644 index 0000000..34237f6 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/box/r.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/box/tb-blue.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/box/tb-blue.gif new file mode 100644 index 0000000..562fecc Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/box/tb-blue.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/box/tb.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/box/tb.gif new file mode 100644 index 0000000..435889b Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/box/tb.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/button/btn-arrow.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/button/btn-arrow.gif new file mode 100644 index 0000000..f90d5df Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/button/btn-arrow.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/button/btn-sprite.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/button/btn-sprite.gif new file mode 100644 index 0000000..b52e0ce Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/button/btn-sprite.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/dd/drop-add.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/dd/drop-add.gif new file mode 100644 index 0000000..b22cd14 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/dd/drop-add.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/dd/drop-no.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/dd/drop-no.gif new file mode 100644 index 0000000..08d0833 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/dd/drop-no.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/dd/drop-yes.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/dd/drop-yes.gif new file mode 100644 index 0000000..8aacb30 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/dd/drop-yes.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/editor/tb-sprite.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/editor/tb-sprite.gif new file mode 100644 index 0000000..fb70577 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/editor/tb-sprite.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/form/checkbox.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/form/checkbox.gif new file mode 100644 index 0000000..835b346 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/form/checkbox.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/form/clear-trigger.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/form/clear-trigger.gif new file mode 100644 index 0000000..da78d45 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/form/clear-trigger.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/form/clear-trigger.psd b/comet4j-js/generateDoc/template/ext/resources/images/default/form/clear-trigger.psd new file mode 100644 index 0000000..f637fa5 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/form/clear-trigger.psd differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/form/date-trigger.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/form/date-trigger.gif new file mode 100644 index 0000000..25ef7b3 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/form/date-trigger.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/form/date-trigger.psd b/comet4j-js/generateDoc/template/ext/resources/images/default/form/date-trigger.psd new file mode 100644 index 0000000..74883b2 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/form/date-trigger.psd differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/form/error-tip-corners.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/form/error-tip-corners.gif new file mode 100644 index 0000000..6ea4c38 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/form/error-tip-corners.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/form/exclamation.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/form/exclamation.gif new file mode 100644 index 0000000..ea31a30 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/form/exclamation.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/form/radio.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/form/radio.gif new file mode 100644 index 0000000..36bb91d Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/form/radio.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/form/search-trigger.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/form/search-trigger.gif new file mode 100644 index 0000000..db8802b Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/form/search-trigger.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/form/search-trigger.psd b/comet4j-js/generateDoc/template/ext/resources/images/default/form/search-trigger.psd new file mode 100644 index 0000000..b11f273 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/form/search-trigger.psd differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/form/text-bg.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/form/text-bg.gif new file mode 100644 index 0000000..4179607 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/form/text-bg.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/form/trigger-tpl.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/form/trigger-tpl.gif new file mode 100644 index 0000000..e3701a3 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/form/trigger-tpl.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/form/trigger.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/form/trigger.gif new file mode 100644 index 0000000..b220bbe Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/form/trigger.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/form/trigger.psd b/comet4j-js/generateDoc/template/ext/resources/images/default/form/trigger.psd new file mode 100644 index 0000000..1f1ed64 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/form/trigger.psd differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/gradient-bg.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/gradient-bg.gif new file mode 100644 index 0000000..8134e49 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/gradient-bg.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/arrow-left-white.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/arrow-left-white.gif new file mode 100644 index 0000000..63088f5 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/arrow-left-white.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/arrow-right-white.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/arrow-right-white.gif new file mode 100644 index 0000000..e9e0678 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/arrow-right-white.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/col-move-bottom.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/col-move-bottom.gif new file mode 100644 index 0000000..cc1e473 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/col-move-bottom.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/col-move-top.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/col-move-top.gif new file mode 100644 index 0000000..58ff32c Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/col-move-top.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/columns.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/columns.gif new file mode 100644 index 0000000..2d3a823 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/columns.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/dirty.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/dirty.gif new file mode 100644 index 0000000..4f217a4 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/dirty.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/done.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/done.gif new file mode 100644 index 0000000..a937cb2 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/done.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/drop-no.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/drop-no.gif new file mode 100644 index 0000000..31a332b Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/drop-no.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/drop-yes.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/drop-yes.gif new file mode 100644 index 0000000..926010e Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/drop-yes.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/footer-bg.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/footer-bg.gif new file mode 100644 index 0000000..126120f Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/footer-bg.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/grid-blue-hd.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/grid-blue-hd.gif new file mode 100644 index 0000000..862094e Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/grid-blue-hd.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/grid-blue-split.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/grid-blue-split.gif new file mode 100644 index 0000000..5286f58 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/grid-blue-split.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/grid-hrow.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/grid-hrow.gif new file mode 100644 index 0000000..6374104 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/grid-hrow.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/grid-loading.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/grid-loading.gif new file mode 100644 index 0000000..d112c54 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/grid-loading.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/grid-split.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/grid-split.gif new file mode 100644 index 0000000..c76a16e Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/grid-split.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/grid-vista-hd.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/grid-vista-hd.gif new file mode 100644 index 0000000..d097263 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/grid-vista-hd.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/grid3-hd-btn.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/grid3-hd-btn.gif new file mode 100644 index 0000000..2112607 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/grid3-hd-btn.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/grid3-hrow-over.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/grid3-hrow-over.gif new file mode 100644 index 0000000..f9c07af Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/grid3-hrow-over.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/grid3-hrow.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/grid3-hrow.gif new file mode 100644 index 0000000..8d459a3 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/grid3-hrow.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/grid3-special-col-bg.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/grid3-special-col-bg.gif new file mode 100644 index 0000000..0b4d6ca Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/grid3-special-col-bg.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/grid3-special-col-sel-bg.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/grid3-special-col-sel-bg.gif new file mode 100644 index 0000000..1dfe9a6 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/grid3-special-col-sel-bg.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/group-by.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/group-by.gif new file mode 100644 index 0000000..d6075bb Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/group-by.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/group-expand-sprite.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/group-expand-sprite.gif new file mode 100644 index 0000000..9c1653b Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/group-expand-sprite.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/hd-pop.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/hd-pop.gif new file mode 100644 index 0000000..eb8ba79 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/hd-pop.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/hmenu-asc.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/hmenu-asc.gif new file mode 100644 index 0000000..8917e0e Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/hmenu-asc.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/hmenu-desc.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/hmenu-desc.gif new file mode 100644 index 0000000..f26b7c2 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/hmenu-desc.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/hmenu-lock.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/hmenu-lock.gif new file mode 100644 index 0000000..1596126 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/hmenu-lock.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/hmenu-lock.png b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/hmenu-lock.png new file mode 100644 index 0000000..8b81e7f Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/hmenu-lock.png differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/hmenu-unlock.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/hmenu-unlock.gif new file mode 100644 index 0000000..af59cf9 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/hmenu-unlock.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/hmenu-unlock.png b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/hmenu-unlock.png new file mode 100644 index 0000000..9dd5df3 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/hmenu-unlock.png differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/invalid_line.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/invalid_line.gif new file mode 100644 index 0000000..fb7e0f3 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/invalid_line.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/loading.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/loading.gif new file mode 100644 index 0000000..e846e1d Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/loading.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/mso-hd.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/mso-hd.gif new file mode 100644 index 0000000..669f3cf Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/mso-hd.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/nowait.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/nowait.gif new file mode 100644 index 0000000..4c5862c Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/nowait.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/page-first-disabled.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/page-first-disabled.gif new file mode 100644 index 0000000..1e02c41 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/page-first-disabled.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/page-first.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/page-first.gif new file mode 100644 index 0000000..d84f41a Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/page-first.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/page-last-disabled.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/page-last-disabled.gif new file mode 100644 index 0000000..8697067 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/page-last-disabled.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/page-last.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/page-last.gif new file mode 100644 index 0000000..3df5c2b Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/page-last.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/page-next-disabled.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/page-next-disabled.gif new file mode 100644 index 0000000..90a7756 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/page-next-disabled.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/page-next.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/page-next.gif new file mode 100644 index 0000000..9601635 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/page-next.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/page-prev-disabled.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/page-prev-disabled.gif new file mode 100644 index 0000000..37154d6 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/page-prev-disabled.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/page-prev.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/page-prev.gif new file mode 100644 index 0000000..eb70cf8 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/page-prev.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/pick-button.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/pick-button.gif new file mode 100644 index 0000000..6957924 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/pick-button.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/refresh.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/refresh.gif new file mode 100644 index 0000000..110f684 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/refresh.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/row-check-sprite.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/row-check-sprite.gif new file mode 100644 index 0000000..6101164 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/row-check-sprite.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/row-expand-sprite.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/row-expand-sprite.gif new file mode 100644 index 0000000..6f4d874 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/row-expand-sprite.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/row-over.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/row-over.gif new file mode 100644 index 0000000..b288e38 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/row-over.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/row-sel.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/row-sel.gif new file mode 100644 index 0000000..98209e6 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/row-sel.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/sort_asc.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/sort_asc.gif new file mode 100644 index 0000000..67a2a4c Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/sort_asc.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/sort_desc.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/sort_desc.gif new file mode 100644 index 0000000..34db47c Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/sort_desc.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/grid/wait.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/wait.gif new file mode 100644 index 0000000..471c1a4 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/grid/wait.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/layout/collapse.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/layout/collapse.gif new file mode 100644 index 0000000..d87b0a9 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/layout/collapse.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/layout/expand.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/layout/expand.gif new file mode 100644 index 0000000..7b6e1c1 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/layout/expand.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/layout/gradient-bg.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/layout/gradient-bg.gif new file mode 100644 index 0000000..8134e49 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/layout/gradient-bg.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/layout/mini-bottom.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/layout/mini-bottom.gif new file mode 100644 index 0000000..c18f9e3 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/layout/mini-bottom.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/layout/mini-left.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/layout/mini-left.gif new file mode 100644 index 0000000..99f7993 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/layout/mini-left.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/layout/mini-right.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/layout/mini-right.gif new file mode 100644 index 0000000..5b13c5a Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/layout/mini-right.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/layout/mini-top.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/layout/mini-top.gif new file mode 100644 index 0000000..a4ca2bb Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/layout/mini-top.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/layout/ns-collapse.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/layout/ns-collapse.gif new file mode 100644 index 0000000..df2a77e Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/layout/ns-collapse.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/layout/ns-expand.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/layout/ns-expand.gif new file mode 100644 index 0000000..77ab9da Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/layout/ns-expand.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/layout/panel-close.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/layout/panel-close.gif new file mode 100644 index 0000000..2bdd623 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/layout/panel-close.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/layout/panel-title-bg.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/layout/panel-title-bg.gif new file mode 100644 index 0000000..d1daef5 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/layout/panel-title-bg.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/layout/panel-title-light-bg.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/layout/panel-title-light-bg.gif new file mode 100644 index 0000000..8c2c83d Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/layout/panel-title-light-bg.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/layout/stick.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/layout/stick.gif new file mode 100644 index 0000000..5a1e8ba Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/layout/stick.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/layout/stuck.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/layout/stuck.gif new file mode 100644 index 0000000..0a8de4d Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/layout/stuck.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/layout/tab-close-on.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/layout/tab-close-on.gif new file mode 100644 index 0000000..eacea39 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/layout/tab-close-on.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/layout/tab-close.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/layout/tab-close.gif new file mode 100644 index 0000000..45db61e Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/layout/tab-close.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/menu/checked.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/menu/checked.gif new file mode 100644 index 0000000..fad5893 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/menu/checked.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/menu/group-checked.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/menu/group-checked.gif new file mode 100644 index 0000000..d30b3e5 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/menu/group-checked.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/menu/item-over.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/menu/item-over.gif new file mode 100644 index 0000000..0167839 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/menu/item-over.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/menu/menu-parent.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/menu/menu-parent.gif new file mode 100644 index 0000000..1e37562 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/menu/menu-parent.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/menu/menu.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/menu/menu.gif new file mode 100644 index 0000000..30a2c4b Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/menu/menu.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/menu/unchecked.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/menu/unchecked.gif new file mode 100644 index 0000000..43823e5 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/menu/unchecked.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/panel/corners-sprite.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/panel/corners-sprite.gif new file mode 100644 index 0000000..aa0d0ed Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/panel/corners-sprite.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/panel/left-right.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/panel/left-right.gif new file mode 100644 index 0000000..9fae2d5 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/panel/left-right.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/panel/light-hd.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/panel/light-hd.gif new file mode 100644 index 0000000..58d6747 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/panel/light-hd.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/panel/tool-sprite-tpl.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/panel/tool-sprite-tpl.gif new file mode 100644 index 0000000..e647867 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/panel/tool-sprite-tpl.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/panel/tool-sprites.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/panel/tool-sprites.gif new file mode 100644 index 0000000..cca91e8 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/panel/tool-sprites.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/panel/tools-sprites-trans.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/panel/tools-sprites-trans.gif new file mode 100644 index 0000000..e58bf20 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/panel/tools-sprites-trans.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/panel/top-bottom.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/panel/top-bottom.gif new file mode 100644 index 0000000..be6c50e Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/panel/top-bottom.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/panel/top-bottom.png b/comet4j-js/generateDoc/template/ext/resources/images/default/panel/top-bottom.png new file mode 100644 index 0000000..578ffb6 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/panel/top-bottom.png differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/panel/white-corners-sprite.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/panel/white-corners-sprite.gif new file mode 100644 index 0000000..22d4bba Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/panel/white-corners-sprite.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/panel/white-left-right.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/panel/white-left-right.gif new file mode 100644 index 0000000..d82c337 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/panel/white-left-right.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/panel/white-top-bottom.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/panel/white-top-bottom.gif new file mode 100644 index 0000000..fe7dd1c Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/panel/white-top-bottom.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/progress/progress-bg.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/progress/progress-bg.gif new file mode 100644 index 0000000..1c1abeb Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/progress/progress-bg.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/qtip/bg.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/qtip/bg.gif new file mode 100644 index 0000000..43488af Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/qtip/bg.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/qtip/close.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/qtip/close.gif new file mode 100644 index 0000000..69ab915 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/qtip/close.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/qtip/tip-sprite.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/qtip/tip-sprite.gif new file mode 100644 index 0000000..9810aca Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/qtip/tip-sprite.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/s.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/s.gif new file mode 100644 index 0000000..1d11fa9 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/s.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/shadow-c.png b/comet4j-js/generateDoc/template/ext/resources/images/default/shadow-c.png new file mode 100644 index 0000000..d435f80 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/shadow-c.png differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/shadow-c.psd b/comet4j-js/generateDoc/template/ext/resources/images/default/shadow-c.psd new file mode 100644 index 0000000..28bbe69 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/shadow-c.psd differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/shadow-lr.png b/comet4j-js/generateDoc/template/ext/resources/images/default/shadow-lr.png new file mode 100644 index 0000000..bb88b6f Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/shadow-lr.png differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/shadow.png b/comet4j-js/generateDoc/template/ext/resources/images/default/shadow.png new file mode 100644 index 0000000..75c0eba Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/shadow.png differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/shared/blue-loading.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/shared/blue-loading.gif new file mode 100644 index 0000000..3bbf639 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/shared/blue-loading.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/shared/calendar.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/shared/calendar.gif new file mode 100644 index 0000000..133cf23 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/shared/calendar.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/shared/glass-bg.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/shared/glass-bg.gif new file mode 100644 index 0000000..26fbbae Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/shared/glass-bg.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/shared/hd-sprite.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/shared/hd-sprite.gif new file mode 100644 index 0000000..42da1ea Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/shared/hd-sprite.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/shared/large-loading.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/shared/large-loading.gif new file mode 100644 index 0000000..b36b555 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/shared/large-loading.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/shared/left-btn.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/shared/left-btn.gif new file mode 100644 index 0000000..a0ddd9e Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/shared/left-btn.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/shared/loading-balls.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/shared/loading-balls.gif new file mode 100644 index 0000000..9ce214b Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/shared/loading-balls.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/shared/right-btn.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/shared/right-btn.gif new file mode 100644 index 0000000..dee63e2 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/shared/right-btn.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/shared/warning.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/shared/warning.gif new file mode 100644 index 0000000..806d4bc Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/shared/warning.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/sizer/e-handle-dark.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/sizer/e-handle-dark.gif new file mode 100644 index 0000000..b5486c1 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/sizer/e-handle-dark.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/sizer/e-handle.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/sizer/e-handle.gif new file mode 100644 index 0000000..00ba835 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/sizer/e-handle.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/sizer/ne-handle-dark.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/sizer/ne-handle-dark.gif new file mode 100644 index 0000000..04e5ecf Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/sizer/ne-handle-dark.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/sizer/ne-handle.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/sizer/ne-handle.gif new file mode 100644 index 0000000..09405c7 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/sizer/ne-handle.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/sizer/nw-handle-dark.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/sizer/nw-handle-dark.gif new file mode 100644 index 0000000..6e49d69 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/sizer/nw-handle-dark.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/sizer/nw-handle.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/sizer/nw-handle.gif new file mode 100644 index 0000000..2fcea8a Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/sizer/nw-handle.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/sizer/s-handle-dark.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/sizer/s-handle-dark.gif new file mode 100644 index 0000000..4eb5f0f Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/sizer/s-handle-dark.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/sizer/s-handle.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/sizer/s-handle.gif new file mode 100644 index 0000000..bf069c2 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/sizer/s-handle.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/sizer/se-handle-dark.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/sizer/se-handle-dark.gif new file mode 100644 index 0000000..c4c1087 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/sizer/se-handle-dark.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/sizer/se-handle.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/sizer/se-handle.gif new file mode 100644 index 0000000..972055e Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/sizer/se-handle.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/sizer/square.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/sizer/square.gif new file mode 100644 index 0000000..14ce6f7 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/sizer/square.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/sizer/sw-handle-dark.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/sizer/sw-handle-dark.gif new file mode 100644 index 0000000..77224b0 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/sizer/sw-handle-dark.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/sizer/sw-handle.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/sizer/sw-handle.gif new file mode 100644 index 0000000..3ca0ed9 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/sizer/sw-handle.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/slider/slider-bg.png b/comet4j-js/generateDoc/template/ext/resources/images/default/slider/slider-bg.png new file mode 100644 index 0000000..9999194 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/slider/slider-bg.png differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/slider/slider-thumb.png b/comet4j-js/generateDoc/template/ext/resources/images/default/slider/slider-thumb.png new file mode 100644 index 0000000..cd654a4 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/slider/slider-thumb.png differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/slider/slider-v-bg.png b/comet4j-js/generateDoc/template/ext/resources/images/default/slider/slider-v-bg.png new file mode 100644 index 0000000..121450c Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/slider/slider-v-bg.png differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/slider/slider-v-thumb.png b/comet4j-js/generateDoc/template/ext/resources/images/default/slider/slider-v-thumb.png new file mode 100644 index 0000000..7b3d725 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/slider/slider-v-thumb.png differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/tabs/scroll-left.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/tabs/scroll-left.gif new file mode 100644 index 0000000..9f2f6d1 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/tabs/scroll-left.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/tabs/scroll-right.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/tabs/scroll-right.gif new file mode 100644 index 0000000..4c5e7e3 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/tabs/scroll-right.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/tabs/scroller-bg.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/tabs/scroller-bg.gif new file mode 100644 index 0000000..099b90d Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/tabs/scroller-bg.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/tabs/tab-btm-inactive-left-bg.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/tabs/tab-btm-inactive-left-bg.gif new file mode 100644 index 0000000..188bf94 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/tabs/tab-btm-inactive-left-bg.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/tabs/tab-btm-inactive-right-bg.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/tabs/tab-btm-inactive-right-bg.gif new file mode 100644 index 0000000..e1f5e3c Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/tabs/tab-btm-inactive-right-bg.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/tabs/tab-btm-left-bg.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/tabs/tab-btm-left-bg.gif new file mode 100644 index 0000000..e695186 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/tabs/tab-btm-left-bg.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/tabs/tab-btm-right-bg.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/tabs/tab-btm-right-bg.gif new file mode 100644 index 0000000..dde7968 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/tabs/tab-btm-right-bg.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/tabs/tab-close.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/tabs/tab-close.gif new file mode 100644 index 0000000..e699878 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/tabs/tab-close.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/tabs/tab-strip-bg.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/tabs/tab-strip-bg.gif new file mode 100644 index 0000000..34f1333 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/tabs/tab-strip-bg.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/tabs/tab-strip-bg.png b/comet4j-js/generateDoc/template/ext/resources/images/default/tabs/tab-strip-bg.png new file mode 100644 index 0000000..fa8ab3f Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/tabs/tab-strip-bg.png differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/tabs/tab-strip-btm-bg.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/tabs/tab-strip-btm-bg.gif new file mode 100644 index 0000000..5eaba1e Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/tabs/tab-strip-btm-bg.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/tabs/tabs-sprite.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/tabs/tabs-sprite.gif new file mode 100644 index 0000000..e969fb0 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/tabs/tabs-sprite.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/toolbar/bg.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/toolbar/bg.gif new file mode 100644 index 0000000..0b085bf Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/toolbar/bg.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/toolbar/btn-arrow-light.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/toolbar/btn-arrow-light.gif new file mode 100644 index 0000000..b0e24b5 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/toolbar/btn-arrow-light.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/toolbar/btn-arrow.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/toolbar/btn-arrow.gif new file mode 100644 index 0000000..8acb460 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/toolbar/btn-arrow.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/toolbar/btn-over-bg.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/toolbar/btn-over-bg.gif new file mode 100644 index 0000000..ee2dd98 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/toolbar/btn-over-bg.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/toolbar/gray-bg.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/toolbar/gray-bg.gif new file mode 100644 index 0000000..bd49438 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/toolbar/gray-bg.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/toolbar/tb-bg.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/toolbar/tb-bg.gif new file mode 100644 index 0000000..4969e4e Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/toolbar/tb-bg.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/toolbar/tb-btn-sprite.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/toolbar/tb-btn-sprite.gif new file mode 100644 index 0000000..19bbef3 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/toolbar/tb-btn-sprite.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/tree/arrows.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/arrows.gif new file mode 100644 index 0000000..f8ff7b8 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/arrows.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/tree/drop-add.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/drop-add.gif new file mode 100644 index 0000000..b22cd14 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/drop-add.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/tree/drop-between.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/drop-between.gif new file mode 100644 index 0000000..5c6c09d Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/drop-between.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/tree/drop-no.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/drop-no.gif new file mode 100644 index 0000000..9d9c6a9 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/drop-no.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/tree/drop-over.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/drop-over.gif new file mode 100644 index 0000000..30d1ca7 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/drop-over.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/tree/drop-under.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/drop-under.gif new file mode 100644 index 0000000..85f66b1 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/drop-under.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/tree/drop-yes.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/drop-yes.gif new file mode 100644 index 0000000..8aacb30 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/drop-yes.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/tree/elbow-end-minus-nl.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/elbow-end-minus-nl.gif new file mode 100644 index 0000000..928779e Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/elbow-end-minus-nl.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/tree/elbow-end-minus.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/elbow-end-minus.gif new file mode 100644 index 0000000..9a8d727 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/elbow-end-minus.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/tree/elbow-end-plus-nl.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/elbow-end-plus-nl.gif new file mode 100644 index 0000000..9f7f698 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/elbow-end-plus-nl.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/tree/elbow-end-plus.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/elbow-end-plus.gif new file mode 100644 index 0000000..5943a01 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/elbow-end-plus.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/tree/elbow-end.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/elbow-end.gif new file mode 100644 index 0000000..f24ddee Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/elbow-end.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/tree/elbow-line.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/elbow-line.gif new file mode 100644 index 0000000..75e6da4 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/elbow-line.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/tree/elbow-minus-nl.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/elbow-minus-nl.gif new file mode 100644 index 0000000..928779e Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/elbow-minus-nl.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/tree/elbow-minus.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/elbow-minus.gif new file mode 100644 index 0000000..97dcc71 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/elbow-minus.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/tree/elbow-plus-nl.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/elbow-plus-nl.gif new file mode 100644 index 0000000..9f7f698 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/elbow-plus-nl.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/tree/elbow-plus.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/elbow-plus.gif new file mode 100644 index 0000000..698de47 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/elbow-plus.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/tree/elbow.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/elbow.gif new file mode 100644 index 0000000..b8f4208 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/elbow.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/tree/folder-open.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/folder-open.gif new file mode 100644 index 0000000..56ba737 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/folder-open.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/tree/folder.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/folder.gif new file mode 100644 index 0000000..20412f7 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/folder.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/tree/leaf.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/leaf.gif new file mode 100644 index 0000000..445769d Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/leaf.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/tree/loading.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/loading.gif new file mode 100644 index 0000000..e846e1d Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/loading.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/tree/s.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/s.gif new file mode 100644 index 0000000..1d11fa9 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/tree/s.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/window/icon-error.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/window/icon-error.gif new file mode 100644 index 0000000..397b655 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/window/icon-error.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/window/icon-info.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/window/icon-info.gif new file mode 100644 index 0000000..58281c3 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/window/icon-info.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/window/icon-question.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/window/icon-question.gif new file mode 100644 index 0000000..08abd82 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/window/icon-question.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/window/icon-warning.gif b/comet4j-js/generateDoc/template/ext/resources/images/default/window/icon-warning.gif new file mode 100644 index 0000000..27ff98b Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/window/icon-warning.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/window/left-corners.png b/comet4j-js/generateDoc/template/ext/resources/images/default/window/left-corners.png new file mode 100644 index 0000000..18e215d Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/window/left-corners.png differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/window/left-corners.psd b/comet4j-js/generateDoc/template/ext/resources/images/default/window/left-corners.psd new file mode 100644 index 0000000..3d7f062 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/window/left-corners.psd differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/window/left-right.png b/comet4j-js/generateDoc/template/ext/resources/images/default/window/left-right.png new file mode 100644 index 0000000..97d04f3 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/window/left-right.png differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/window/left-right.psd b/comet4j-js/generateDoc/template/ext/resources/images/default/window/left-right.psd new file mode 100644 index 0000000..f490c5e Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/window/left-right.psd differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/window/right-corners.png b/comet4j-js/generateDoc/template/ext/resources/images/default/window/right-corners.png new file mode 100644 index 0000000..101118b Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/window/right-corners.png differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/window/right-corners.psd b/comet4j-js/generateDoc/template/ext/resources/images/default/window/right-corners.psd new file mode 100644 index 0000000..86d5095 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/window/right-corners.psd differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/window/top-bottom.png b/comet4j-js/generateDoc/template/ext/resources/images/default/window/top-bottom.png new file mode 100644 index 0000000..a739234 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/window/top-bottom.png differ diff --git a/comet4j-js/generateDoc/template/ext/resources/images/default/window/top-bottom.psd b/comet4j-js/generateDoc/template/ext/resources/images/default/window/top-bottom.psd new file mode 100644 index 0000000..d2b2302 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/images/default/window/top-bottom.psd differ diff --git a/comet4j-js/generateDoc/template/ext/resources/inherited.gif b/comet4j-js/generateDoc/template/ext/resources/inherited.gif new file mode 100644 index 0000000..63039d9 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/inherited.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/localXHR.js b/comet4j-js/generateDoc/template/ext/resources/localXHR.js new file mode 100644 index 0000000..563c904 --- /dev/null +++ b/comet4j-js/generateDoc/template/ext/resources/localXHR.js @@ -0,0 +1,309 @@ + +Ext.apply( Ext.lib.Ajax , +{ forceActiveX:false, + createXhrObject:function(transactionId) + { + var obj={ status:{isError:false} + , tId:transactionId}, http; + try + { + + if(Ext.isIE7 && !!this.forceActiveX){throw("IE7forceActiveX");} + + obj.conn= new XMLHttpRequest(); + + } + catch(e) + { + for (var i = 0; i < this.activeX.length; ++i) { + try + { + obj.conn= new ActiveXObject(this.activeX[i]); + + break; + } + catch(e) { + } + } + } + finally + { + obj.status.isError = typeof(obj.conn) === undefined; + } + return obj; + + }, + + getHttpStatus: function(reqObj){ + + var statObj = { status:0 + ,statusText:'' + ,isError:false + ,isLocal:false + ,isOK:false + ,error:null}; + + try { + if(!reqObj)throw('noobj'); + statObj.status = reqObj.status; + + statObj.isLocal = !reqObj.status && location.protocol == "file:" || + Ext.isSafari && reqObj.status === undefined; + + statObj.isOK = (statObj.isLocal || (statObj.status > 199 && statObj.status < 300)); + statObj.statusText = reqObj.statusText || ''; + } catch(e){ //status may not avail/valid yet (or called too early). + } + + return statObj; + + }, + handleTransactionResponse:function(o, callback, isAbort) + { + + + callback = callback || {}; + var responseObject=null; + + if(!o.status.isError){ + o.status = this.getHttpStatus(o.conn); + /* create and enhance the response with proper status and XMLDOM if necessary */ + responseObject = this.createResponseObject(o, callback.argument); + } + + if(o.status.isError){ /* checked again in case exception was raised - ActiveX was disabled during XML-DOM creation? */ + // And mixin everything the XHR object had to offer as well + responseObject = Ext.applyIf(responseObject||{},this.createExceptionObject(o.tId, callback.argument, (isAbort ? isAbort : false))); + + } + + responseObject.options = o.options; + responseObject.stat = o.status; + + if (o.status.isOK && !o.status.isError) { + if (callback.success) { + if (!callback.scope) { + callback.success(responseObject); + } + else { + callback.success.apply(callback.scope, [responseObject]); + } + } + } else { + + if (callback.failure) { + if (!callback.scope) { + callback.failure(responseObject); + } + else { + callback.failure.apply(callback.scope, [responseObject]); + } + } + + } + + if(o.options.async){ + this.releaseObject(o); + responseObject = null; + }else{ + this.releaseObject(o); + return responseObject; + } + + }, + createResponseObject:function(o, callbackArg) + { + var obj = {}; + var headerObj = {},headerStr=''; + + try{ //to catch bad encoding problems here + obj.responseText = o.conn.responseText; + }catch(e){obj.responseText ='';} + + obj.responseXML = o.conn.responseXML; + + try{ + headerStr = o.conn.getAllResponseHeaders()||''; + } catch(e){} + + if(o.status.isLocal){ + + o.status.isOK = ((o.status.status = (!!obj.responseText.length)?200:404) == 200); + + if(o.status.isOK && (!obj.responseXML || obj.responseXML.childNodes.length == 0)){ + + var xdoc=null; + try{ //ActiveX may be disabled + if(typeof(DOMParser) == 'undefined'){ + xdoc=new ActiveXObject("Microsoft.XMLDOM"); + xdoc.async="false"; + xdoc.loadXML(obj.responseText); + + }else{ + try{ //Opera 9 will fail parsing non-XML content, so trap here. + var domParser = new DOMParser(); + xdoc = domParser.parseFromString(obj.responseText, 'application\/xml'); + }catch(ex){} + finally{domParser = null;} + + } + } catch(ex){ + o.status.isError = true; + o.status.error = ex; + + } + + obj.responseXML = xdoc; + } + + if(obj.responseXML){ + + var parseBad = (obj.responseXML.parseError || 0) != 0 || obj.responseXML.childNodes.length == 0; + if(!parseBad){ + headerStr = 'Content-Type: ' + (obj.responseXML.contentType || 'text\/xml') + '\n' + headerStr ; + } + } + + + } + + var header = headerStr.split('\n'); + for (var i = 0; i < header.length; i++) { + var delimitPos = header[i].indexOf(':'); + if (delimitPos != -1) { + headerObj[header[i].substring(0, delimitPos)] = header[i].substring(delimitPos + 2); + } + } + + obj.tId = o.tId; + obj.status = o.status.status; + obj.statusText = o.status.statusText; + obj.getResponseHeader = headerObj; + obj.getAllResponseHeaders = headerStr; + obj.stat = o.status + + if (typeof callbackArg !== undefined) { + obj.argument = callbackArg; + } + + return obj; + }, + + request : function(method, uri, cb, data, options) { + + options = Ext.apply({async:true, + headers:false, + userId:null, + password:null, + xmlData:null }, options||{}); + + var hs = options.headers; + if(hs){ + for(var h in hs){ + if(hs.hasOwnProperty(h)){ + this.initHeader(h, hs[h], false); + } + } + } + if(options.xmlData){ + this.initHeader('Content-Type', 'text/xml', false); + method = 'POST'; + data = options.xmlData; + } + + return this.makeRequest(method, uri, cb, data, options); + + }, + asyncRequest:function(method, uri, callback, postData) + { + var o = this.getConnectionObject(); + + if (!o || o.status.isError) { + return null; + } + else { + o.options = options; + try{ + o.conn.open(method, uri, true); + } catch(ex){ + o.status.isError = true; + o.status.error = ex; + return Ext.apply(o,this.handleTransactionResponse(o, callback)); + + } + + + if (this.useDefaultXhrHeader) { + if (!this.defaultHeaders['X-Requested-With']) { + this.initHeader('X-Requested-With', this.defaultXhrHeader, true); + } + } + + if(postData && this.useDefaultHeader){ + this.initHeader('Content-Type', this.defaultPostHeader); + } + + if (this.hasDefaultHeaders || this.hasHeaders) { + this.setHeader(o); + } + + this.handleReadyState(o, callback); + + try{ o.conn.send(postData || null); + } catch(ex){ + o.status.isError=true; + o.status.error = ex; + return Ext.apply(o,this.handleTransactionResponse(o, callback)); + } + + + return o; + } + }, + + makeRequest:function(method, uri, callback, postData, options) + { + var o = this.getConnectionObject(); + + if (!o || o.status.isError) { + return null; + } + else { + o.options = options; + try{ + o.conn.open(method, uri, options.async, options.userId, options.password); + } catch(ex){ + o.status.isError = true; + o.status.error = ex; + var r=this.handleTransactionResponse(o, callback); + return Ext.apply(o,r); + } + + if (this.useDefaultXhrHeader) { + if (!this.defaultHeaders['X-Requested-With']) { + this.initHeader('X-Requested-With', this.defaultXhrHeader, true); + } + } + + if(postData && this.useDefaultHeader){ + this.initHeader('Content-Type', this.defaultPostHeader); + } + + if (this.hasDefaultHeaders || this.hasHeaders) { + this.setHeader(o); + } + + if(o.options.async){ //Timers won't work here as it's a blocking call + this.handleReadyState(o, callback); + } + + try{ o.conn.send(postData || null); + } catch(ex){ + //Ext.apply(o,this.handleTransactionResponse(o, callback)); + } + + return options.async?o:Ext.apply(o,this.handleTransactionResponse(o, callback)); + } + }}); + +Ext.lib.Ajax.forceActiveX = (document.location.protocol == 'file:');/* or other true/false mechanism */ \ No newline at end of file diff --git a/comet4j-js/generateDoc/template/ext/resources/member-collapsed.gif b/comet4j-js/generateDoc/template/ext/resources/member-collapsed.gif new file mode 100644 index 0000000..16bce1d Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/member-collapsed.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/member-expanded.gif b/comet4j-js/generateDoc/template/ext/resources/member-expanded.gif new file mode 100644 index 0000000..d72c132 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/member-expanded.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/member-hover.gif b/comet4j-js/generateDoc/template/ext/resources/member-hover.gif new file mode 100644 index 0000000..9b53390 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/member-hover.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/method.gif b/comet4j-js/generateDoc/template/ext/resources/method.gif new file mode 100644 index 0000000..af74265 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/method.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/minus.gif b/comet4j-js/generateDoc/template/ext/resources/minus.gif new file mode 100644 index 0000000..2c63585 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/minus.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/pkg-closed.gif b/comet4j-js/generateDoc/template/ext/resources/pkg-closed.gif new file mode 100644 index 0000000..71139cb Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/pkg-closed.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/pkg-open.gif b/comet4j-js/generateDoc/template/ext/resources/pkg-open.gif new file mode 100644 index 0000000..ffd18a3 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/pkg-open.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/pkg.gif b/comet4j-js/generateDoc/template/ext/resources/pkg.gif new file mode 100644 index 0000000..d3d3448 Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/pkg.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/plus.gif b/comet4j-js/generateDoc/template/ext/resources/plus.gif new file mode 100644 index 0000000..c09f82e Binary files /dev/null and b/comet4j-js/generateDoc/template/ext/resources/plus.gif differ diff --git a/comet4j-js/generateDoc/template/ext/resources/prettify/prettify.css b/comet4j-js/generateDoc/template/ext/resources/prettify/prettify.css new file mode 100644 index 0000000..0f1ed75 --- /dev/null +++ b/comet4j-js/generateDoc/template/ext/resources/prettify/prettify.css @@ -0,0 +1 @@ +.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun{color:#660}.pln{color:#000}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec{color:#606}pre.prettyprint{padding:2px;border:1px solid #888}@media print{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun{color:#440}.pln{color:#000}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}} \ No newline at end of file diff --git a/comet4j-js/generateDoc/template/ext/resources/prettify/prettify.js b/comet4j-js/generateDoc/template/ext/resources/prettify/prettify.js new file mode 100644 index 0000000..f8f4f7f --- /dev/null +++ b/comet4j-js/generateDoc/template/ext/resources/prettify/prettify.js @@ -0,0 +1,25 @@ +function _pr_isIE6(){var F=navigator&&navigator.userAgent&&/\bMSIE 6\./.test(navigator.userAgent);_pr_isIE6=function(){return F};return F}var aa="break continue do else for if return while ",ba="auto case char const default double enum extern float goto int long register short signed sizeof static struct switch typedef union unsigned void volatile ",ca="catch class delete false import new operator private protected public this throw true try ",da="alignof align_union asm axiom bool concept concept_map const_cast constexpr decltype dynamic_cast explicit export friend inline late_check mutable namespace nullptr reinterpret_cast static_assert static_cast template typeid typename typeof using virtual wchar_t where ", +ea="boolean byte extends final finally implements import instanceof null native package strictfp super synchronized throws transient ",fa="as base by checked decimal delegate descending event fixed foreach from group implicit in interface internal into is lock object out override orderby params readonly ref sbyte sealed stackalloc string select uint ulong unchecked unsafe ushort var ",ga="debugger eval export function get null set undefined var with Infinity NaN ",ha="caller delete die do dump elsif eval exit foreach for goto if import last local my next no our print package redo require sub undef unless until use wantarray while BEGIN END ", +ia="and as assert class def del elif except exec finally from global import in is lambda nonlocal not or pass print raise try with yield False True None ",ja="alias and begin case class def defined elsif end ensure false in module next nil not or redo rescue retry self super then true undef unless until when yield BEGIN END ",ka="case done elif esac eval fi function in local set then until ",la="a",ma="z",na="A",oa="Z",pa="!",qa="!=",ra="!==",s="#",sa="%",Ha="%=",v="&",Ia="&&",Ja="&&=",Ka="&=",La= +"(",Ma="*",Na="*=",Oa="+=",Pa=",",Qa="-=",Ra="->",w="/",Sa="/=",Ta=":",Ua="::",y=";",z="<",Va="<<",Wa="<<=",Xa="<=",Ya="=",Za="==",$a="===",A=">",ab=">=",bb=">>",cb=">>=",db=">>>",eb=">>>=",fb="?",C="@",gb="[",hb="^",ib="^=",jb="^^",kb="^^=",lb="{",mb="|",nb="|=",ob="||",pb="||=",qb="~",rb="break",sb="case",tb="continue",ub="delete",vb="do",wb="else",xb="finally",yb="instanceof",zb="return",Ab="throw",Bb="try",Cb="typeof",Db="(?:(?:(?:^|[^0-9.])\\.{1,3})|(?:(?:^|[^\\+])\\+)|(?:(?:^|[^\\-])-)",Eb= +"|\\b",Fb="\\$1",Gb="|^)\\s*$",Hb="&",Ib="<",Jb=">",Kb=""",Lb="&#",Mb="x",Nb="'",G='"',Ob=" ",Pb="XMP",Qb="\n',I="",Tb="\t",Ub="\n",Vb="nocode",Wb=' $1="$2$3$4"',J="pln",O="com",Xb="dec",P="src",Q="tag",R="atv",S="pun",Yb="<>/=",X="atn",Zb=" \t\r\n",Y="str",$b="'\"",ac="'\"`",bc="\"'",cc=" \r\n",Z="lit",dc="123456789",ec=".",fc="kwd",gc="typ",$="",hc='',jc="$1 ",kc="
        ",lc="console",mc= +"cannot override language handler %s",nc="default-code",oc="default-markup",pc="html",qc="htm",rc="xhtml",sc="xml",tc="xsl",uc="c",vc="cc",wc="cpp",xc="cs",yc="cxx",zc="cyc",Ac="java",Bc="bsh",Cc="csh",Dc="sh",Ec="cv",Fc="py",Gc="perl",Hc="pl",Ic="pm",Jc="rb",Kc="js",Lc="pre",Mc="code",Nc="xmp",Oc="prettyprint",Pc="class",Qc="br",Rc="\r\n";(function(){function F(b){b=b.split(/ /g);var a={};for(var c=b.length;--c>=0;){var d=b[c];if(d)a[d]=null}return a}var K=aa,Sc=K+ba,T=Sc+ca,ta=T+da,ua=T+ea,Tc=ua+ +fa,va=T+ga,wa=ha,xa=K+ia,ya=K+ja,za=K+ka,Uc=ta+Tc+va+wa+xa+ya+za;function Vc(b){return b>=la&&b<=ma||b>=na&&b<=oa}function D(b,a,c,d){b.unshift(c,d||0);try{a.splice.apply(a,b)}finally{b.splice(0,2)}}var Wc=(function(){var b=[pa,qa,ra,s,sa,Ha,v,Ia,Ja,Ka,La,Ma,Na,Oa,Pa,Qa,Ra,w,Sa,Ta,Ua,y,z,Va,Wa,Xa,Ya,Za,$a,A,ab,bb,cb,db,eb,fb,C,gb,hb,ib,jb,kb,lb,mb,nb,ob,pb,qb,rb,sb,tb,ub,vb,wb,xb,yb,zb,Ab,Bb,Cb],a=Db;for(var c=0;c:&])/g,Fb)}a+= +Gb;return new RegExp(a)})(),Aa=/&/g,Ba=//g,Xc=/\"/g;function Yc(b){return b.replace(Aa,Hb).replace(Ba,Ib).replace(Ca,Jb).replace(Xc,Kb)}function U(b){return b.replace(Aa,Hb).replace(Ba,Ib).replace(Ca,Jb)}var Zc=/</g,$c=/>/g,ad=/'/g,bd=/"/g,cd=/&/g,dd=/ /g;function ed(b){var a=b.indexOf(v);if(a<0)return b;for(--a;(a=b.indexOf(Lb,a+1))>=0;){var c=b.indexOf(y,a);if(c>=0){var d=b.substring(a+3,c),g=10;if(d&&d.charAt(0)===Mb){d=d.substring(1);g=16}var e=parseInt(d,g); +if(!isNaN(e))b=b.substring(0,a)+String.fromCharCode(e)+b.substring(c+1)}}return b.replace(Zc,z).replace($c,A).replace(ad,Nb).replace(bd,G).replace(cd,v).replace(dd,Ob)}function Da(b){return Pb===b.tagName}function L(b,a){switch(b.nodeType){case 1:var c=b.tagName.toLowerCase();a.push(z,c);for(var d=0;d=0;i-=" ".length)d.push(" ".substring(0,i));g=e+1;break;case Ub:a=0;break;default:++a}}if(!d)return c;d.push(c.substring(g));return d.join(I)}}var hd=/(?:[^<]+| +
        + + + + +

        Class

        + + + + + + + + + + + + + + +
        Package: + + + Global + +
        Defined In:
        Class:
        Extends: + + + + + Object + +
        +
        + +

        This class is a singleton and cannot be created directly.
        +
        +
        + + + + +

        Config Options

        + + + + + + + + + inherited + + + expandable + + + + + + + + + + +
        Config OptionsDefined By
          + + : +
        + + +
        +
        +
        + +
        +
        +
        +
        + + + +

        Public Properties

        + + + + + + + + + + + inherited + + + expandable + + + + + + + + + + +
        PropertyDefined By
          + + : +
        + + +
        +
        +
        + +
        +
        +
        +
        +
        This class has no public properties.
        +
        + + + +

        Public Methods

        + + + + + + + + + + + + + + inherited + + + + + + + + + + +
        MethodDefined By
        +
        +
        This class has no public methods.
        +
        + + + +

        Public Events

        + + + + + + + + + + + inherited + + + + + + + + + + +
        EventDefined By
        +
        +
        This class has no public events.
        +
        + +
        + + + + + + + + + + + + + + + + + + + + + +   + + + + +
        +
        +
        + + + +
        +
        + + + + + +
        + + + (  + + [ ] +   + + +  ) + + + + + + +
        + Parameters: +
          + +
        • None.
        • +
          + +
        • + : +
          +
        • +
        + Returns: +
          +
        • + + + +
          +
          + void +
          +
        • +
        +
        +
        + + + + <static>  + + + + +
        +
        +                
        +                    
        +                    
        +                        
        +                    
        +                    
        +                
        +                
        +            
        +
        +
        + + + + + +    + + + + + + + + + + Subclasses: + + + + , + + + + + + + + + + : + + + + + + + + + + + + + + + +
        :
        +
        +
        + + diff --git a/comet4j-js/generateDoc/template/ext/tpl/tree.xsl b/comet4j-js/generateDoc/template/ext/tpl/tree.xsl new file mode 100644 index 0000000..fef2256 --- /dev/null +++ b/comet4j-js/generateDoc/template/ext/tpl/tree.xsl @@ -0,0 +1,45 @@ + + + + + + Docs.classData ={"id":"apidocs","iconCls":"icon-docs","text":"API Documentation","singleClickExpand":true,"children":[]}; + Docs.icons = { + + + + icon-static + icon-cmp + icon-cls + + + "":"" + , + }; + + + + + {"id":"pkg-","text":"","iconCls":"icon-pkg","cls":"package","singleClickExpand":true, children:[]} + , + + , + + + + icon-static + icon-cmp + icon-cls + + + {"href":"output/.html","text":"","id":"","isClass":true,"iconCls":"","cls":"cls","leaf":true} + , + + + + + + + + + diff --git a/comet4j-js/generateDoc/template/ext/welcome.html b/comet4j-js/generateDoc/template/ext/welcome.html new file mode 100644 index 0000000..0e44af3 --- /dev/null +++ b/comet4j-js/generateDoc/template/ext/welcome.html @@ -0,0 +1,48 @@ +
        +
        + +
        +
        +
        +
        +

        Additional Resources

        +
          +
        +
        +
        +
        +
        +

        Support

        +
          + +
        +
        +
        +
        +
        +

        Icon Legend

        +
          +
        • Package
        • +
        • Class
        • +
        • Singleton
        • +
        • Component
        • +
        • Method
        • +
        • Property
        • +
        • Config Option
        • +
        • Event
        • +
        +
        +
        +
        +
        \ No newline at end of file diff --git a/comet4j-js/src/AJAX.js b/comet4j-js/src/AJAX.js new file mode 100644 index 0000000..7545201 --- /dev/null +++ b/comet4j-js/src/AJAX.js @@ -0,0 +1,127 @@ +/** + * @class JS.AJAX + * AJAX常用方法封装 + * @singleton + * @author jinghai.xiao@gmail.com + */ +JS.ns("JS.AJAX"); + +JS.AJAX = (function(){ + var xhr = new JS.XMLHttpRequest(); + return { + dataFormatError : '服务器返回的数据格式有误', + urlError : '未指定url', + /** + * 以POST方式向服务器发送请求,并得到服务返回的xhr对象。
        + *
        如:JS.Ajax.post('/someurl.do','keyword=xxx',function(xhr){
        +			alert(xhr.responseText);
        +		   });
        + * @method + * @param {String} url 网址 + * @param {String|DOM} param 参数 + * @param {Function} callback 回调函数 function(xhr){alert(xhr.responseText)} + * @param {Object} scope 作用域 + * @param {Boolean} asyn 是否异步调用,默认true + */ + post : function(url,param,callback,scope,asyn){ + if(typeof url!=='string'){ + throw new Error(this.urlError); + } + //默认为异步请求 + var asynchronous = true; + if(asyn===false){ + asynchronous = false; + } + xhr.onreadystatechange = function(){ + if(xhr.readyState==4 && asynchronous){ + JS.callBack(callback,scope,[xhr]); + } + }; + xhr.open('POST', url, asynchronous); + xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=UTF8"); + xhr.send(param || null); + if(!asynchronous){ + JS.callBack(callback,scope,[xhr]); + } + + }, + /** + * 以GET方式向服务器发送请求,并得到服务返回的xhr对象。
        + *
        如:JS.Ajax.get('/someurl.do','keyword=xxx',function(xhr){
        +			alert(xhr.responseText);
        +		   });
        + * @method + * @param {String} url 网址 + * @param {String|DOM} param 参数 + * @param {Function} callback 回调函数 function(xhr){alert(xhr.responseText)} + * @param {Object} scope 作用域 + * @param {Boolean} asyn 是否异步调用,默认true + */ + get : function(url,param,callback,scope,asyn){ + if(typeof url!=='string'){ + throw new Error(this.urlError); + } + //默认为异步请求 + var asynchronous = true; + if(asyn===false){ + asynchronous = false; + } + xhr.onreadystatechange = function(){ + if(xhr.readyState==4 && asynchronous){ + JS.callBack(callback,scope,[xhr]); + } + }; + xhr.open('GET', url, asynchronous); + xhr.setRequestHeader("Content-Type","html/text;charset=UTF8"); + xhr.send(param || null); + if(!asynchronous){ + JS.callBack(callback,scope,[xhr]); + } + + }, + /** + * 以GET方式向服务器发送请求,并得到服务返回的文本信息。
        + *
        如:JS.Ajax.getText('/someurl.do','keyword=xxx',function(text){
        +			alert(text);
        +		   });
        + * @method + * @param {String} url 网址 + * @param {String|DOM} param 参数 + * @param {Function} callback 回调函数 function(text){alert(text)} + * @param {Object} asyn 作用域 + * @param {Boolean} asyn 是否异步调用,默认true + */ + getText : function(url,jsonData,callback,scope,asyn){ + this.get(url,jsonData,function(xhr){ + if(scope){ + callback.call(scope,xhr.responseText); + }else{ + callback(xhr.responseText); + } + },this,asyn); + }, + /** + * 以GET方式向服务器发送请求,并得到服务返回的JSON对象。
        + *
        如:JS.Ajax.getJson('/someurl.do','keyword=xxx',function(obj){
        +			alert(obj.someField);
        +		   });
        + * @method + * @param {String} url 网址 + * @param {String|DOM} param 参数 + * @param {Function} callback 回调函数 function(obj){alert(alert(obj.someField);)} + * @param {Object} scope 作用域 + * @param {Boolean} asyn 是否异步调用,默认true + */ + getJson : function(url,jsonData,callback,scope,asyn){ + this.get(url,jsonData,function(xhr){ + var json = null; + try{ + json = eval("("+xhr.responseText+")"); + }catch(e){ + throw new Error(this.dataFormatError); + } + JS.callBack(callback,scope,[json]); + },this,asyn); + } + }; +})(); \ No newline at end of file diff --git a/comet4j-js/src/Connector.js b/comet4j-js/src/Connector.js new file mode 100644 index 0000000..2003e37 --- /dev/null +++ b/comet4j-js/src/Connector.js @@ -0,0 +1,406 @@ +/** + * @class JS.Connector + * @extends JS.Observable + * 连接器,负责建立并维持连接,接收服务器端推送的数据。 + * @author jinghai.xiao@gmail.com + */ +JS.ns("JS.Connector"); +JS.Connector = JS.extend(JS.Observable,{ + /** + * 版本 + * @property + * @type String + */ + version : JS.version, + SYSCHANNEL:'c4j', //协议常量 + /** + * 长轮询工作模式常量 + * @property + * @type String + */ + LLOOPSTYLE : 'lpool',//协议常量 + /** + * 长连接工作模式常量 + * @property + * @type String + */ + STREAMSTYLE : 'stream',//协议常量 + CMDTAG : 'cmd', + /** + * @cfg {String} retryCount + * 重试次数,连续重试指定次数仍无法正常工作则stop. + */ + retryCount : 3, + /** + * @cfg {String} retryCount + * 重试延迟,重试时间隔指定时间执行 + */ + retryDelay : 1000, + currRetry : 0, + /** + * @cfg {String} url + * 连接地址,若使用start方法中带有url,则此配置项将被覆盖。 + */ + url : '', + /** + * @cfg {Object} param + * 连接参数,若使用start方法中带有param,则此配置项将被覆盖。 + */ + param : '', + /** + * @cfg {Object} revivalDelay + * 复活请求延时毫秒数,默认为100 + */ + revivalDelay : 100, + /** + * 连接ID,连接后有效 + * @property + * @type String + */ + cId : '', + /** + * 通道列表,连接后有效 + * @property + * @type Array + */ + channels : [], + /** + * 连接工作模式,连接后有效。值为:LLOOPSTYLE或STREAMSTYLE + * @property + * @type String + */ + workStyle : '', + emptyUrlError : 'URL为空', + runningError : '连接正在运行', + dataFormatError : '数据格式有误', + /** + * 连接器是否处于运行状态 + * @property + * @type String + */ + running : false, + _xhr : null, + lastReceiveMessage : '', + constructor:function(){ + JS.Connector.superclass.constructor.apply(this,arguments); + this.addEvents([ + /** + * @event beforeConnect 即将连接 + * @param {String} url 连接地址 + * @param {Connector} conn 连接器 + */ + 'beforeConnect', + /** + * @event connect 已连接 + * @param {String} cId 连接ID + * @param {Array} channels 通道列表 + * @param {String} workStyle 工作模式 + * @param {Number} timeout 连接超时时间 + * @param {Connector} conn 连接器 + */ + 'connect', + /** + * @event beforeStop 即将停止 + * @param {String} cause 停止原因 + * @param {String} cId 连接ID + * @param {String} url 连接地址 + * @param {Connector} conn 连接器 + */ + 'beforeStop', + /** + * @event stop 已停止 + * @param {String} cause 停止原因 + * @param {String} cId 连接ID + * @param {String} url 连接地址 + * @param {Connector} conn 连接器 + */ + 'stop', + /** + * @event message 接收到推送数据 + * @param {String} channel 通道标识 + * @param {Object} data 数据对象 + * @param {Number} time 发送时间,距1970-01-01 00:00:00毫秒数 + * @param {Connector} conn 连接器 + */ + 'message', + /** + * @event revival 请求复活,用于保持连接。 + * @param {String} url 连接地址 + * @param {String} cId 连接ID + * @param {Connector} conn 连接器 + */ + 'revival' + ]); + if(JS.isIE7){ + this._xhr = new JS.XMLHttpRequest({ + specialXHR : 'Msxml2.XMLHTTP.6.0' + }); + }else{ + this._xhr = new JS.XMLHttpRequest(); + } + //this._xhr.addListener('readyStateChange',this.onReadyStateChange,this); + + this._xhr.addListener('progress',this.doOnProgress,this); + this._xhr.addListener('load',this.doOnLoad,this); + this._xhr.addListener('error',this.doOnError,this); + this._xhr.addListener('timeout',this.doOnTimeout,this); + + this.addListener('beforeStop',this.doDrop,this); + JS.on(window,'beforeunload',this.doDrop,this); + + }, + //private + doDrop : function(url,cId,conn,xhr){ + if(!this.running || !this.cId){ + return; + } + try { + var xhr = new JS.XMLHttpRequest(); + var param = this.perfectParam(this.param); + var url = this.url + '?'+this.CMDTAG+'=drop&cid=' + this.cId + param; + xhr.open('GET', url, true); + xhr.send(null); + xhr = null; + }catch(e){}; + }, + //private distributed 派发服务器消息 + dispatchServerEvent : function(msg){ + this.fireEvent('message', msg.channel, msg.data, msg.time, this); + }, + //private 长连接信息转换 + translateStreamData : function(responseText){ + var str = responseText; + if(this.lastReceiveMessage && str){//剥离出接收到的数据 + str = str.split(this.lastReceiveMessage); + str = str.length ? str[str.length-1] : ""; + } + this.lastReceiveMessage = responseText; + return str; + }, + //private 消息解码 + decodeMessage : function(msg){ + var json = null; + if(JS.isString(msg) && msg!=""){ + //解析数据格式 + if(msg.charAt(0)=="<" ){ + msg = msg.substring(1,msg.length); + } + if(msg.charAt(msg.length-1)==">"){ + msg = msg.substring(0,msg.length-1); + } + msg = decodeURIComponent(msg); + try{ + json = eval("("+msg+")"); + }catch(e){ + this.stop('JSON转换异常'); + } + } + return json; + }, + //private + doOnProgress : function(xhr){ + if(this.workStyle === this.STREAMSTYLE){ + var str = this.translateStreamData(xhr.responseText); + var msglist = str.split(">"); + if(msglist.length > 0){ + for(var i=0, len=msglist.length; i this.retryCount){ + this.stop('服务器异常'); + }else{ + this.retryRevivalConnect(); + } + } + } + } + } + }, + //private + doOnLoad : function(xhr){ + if(this.workStyle === this.LLOOPSTYLE){ + var json = this.decodeMessage(xhr.responseText); + if(json){ + this.currRetry = 0; + this.dispatchServerEvent(json); + this.revivalConnect(); + }else{//非正常情况,状态为4,200并且还没有收到任何数据 + this.currRetry++; + if(this.currRetry > this.retryCount){ + this.stop('服务器异常'); + }else{ + this.retryRevivalConnect(); + } + } + } + }, + //private + doOnError : function(xhr){ + this.currRetry++; + if(this.currRetry > this.retryCount){ + this.stop('服务器异常'); + }else{ + this.retryRevivalConnect(); + } + + }, + //private + doOnTimeout : function(xhr){ + this.currRetry++; + if(this.currRetry > this.retryCount){ + this.stop('请求超时'); + }else{ + this.retryRevivalConnect(); + } + }, + //private + startConnect : function(url){ + if(this.running){ + var connXhr = new JS.XMLHttpRequest(); + connXhr.addListener('error',function(xhr){ + this.stop("连接时发生错误"); + },this); + connXhr.addListener('timeout',function(xhr){ + this.stop("连接超时"); + },this); + connXhr.addListener('load',function(xhr){ + var msg = this.decodeMessage(xhr.responseText); + if(!msg){ + this.stop('连接失败'); + return; + } + var data = msg.data; + this.cId = data.cId; + this.channels = data.channels; + this.workStyle = data.ws; + this._xhr.setTimeout(data.timeout + 1000/*网络延迟误差*/); + this.fireEvent('connect', data.cId, data.channels, data.ws, data.timeout, this); + this.revivalConnect(); + },this); + connXhr.open('GET', url, true); + connXhr.send(null); + /* + JS.AJAX.get(url,'',function(xhr){ + var msg = this.decodeMessage(xhr.responseText); + if(!msg){ + this.stop('连接失败'); + return; + } + var data = msg.data; + this.cId = data.cId; + this.channels = data.channels; + this.workStyle = data.ws; + this._xhr.setTimeout(data.timeout + 1000); + this.fireEvent('connect', data.cId, data.channels, data.ws, data.timeout, this); + this.revivalConnect(); + },this);*/ + } + }, + + //private 重试复活连接 + retryRevivalConnect : function(){ + var self = this; + if(this.running){ + setTimeout(function(){ + self.revivalConnect(); + },this.retryDelay); + } + }, + + //private + revivalConnect : function(){ + var self = this; + if(this.running){ + setTimeout(revival,this.revivalDelay); + } + function revival(){ + var xhr = self._xhr; + var param = self.perfectParam(self.param); + var url = self.url + '?'+self.CMDTAG+'=revival&cid=' + self.cId + param; + xhr.open('GET', url, true); + xhr.send(null); + self.fireEvent('revival',self.url, self.cId, self); + } + + }, + /** + * 开始连接 + * @method + * @param {String} url 连接地址 + * @param {String|DOM} param 连接参数 + */ + start : function(url,param){ + if(this.running){ + return; + } + + this.url = url || this.url; + if(!this.url){ + throw new Error(this.emptyUrlError); + } + + if(this.fireEvent('beforeConnect', this.url, this) === false){ + return; + } + + this.param = param || this.param; + param = this.perfectParam(this.param); + var url = this.url+'?'+this.CMDTAG+'=conn&cv='+this.version+param; + + this.running = true; + this.currRetry = 0; + var self = this; + setTimeout(function(){ + self.startConnect(url); + },1000); + }, + // 完善参数 + perfectParam : function(param){ + if(param && JS.isString(param)){ + if(param.charAt(0) != '&'){ + param = '&'+param; + } + } + return param; + }, + /** + * 停止连接 + * @method + * @param {String} cause 停止原因 + */ + stop : function(cause){ + if(!this.running){ + return; + } + if(this.fireEvent('beforeStop',cause,this.cId, this.url, this) === false){ + return; + } + this.running = false; + var cId = this.cId; + this.cId = ''; + this.channels = []; + this.workStyle = ''; + try{ + this._xhr.abort(); + }catch(e){}; + this.fireEvent('stop',cause, cId, this.url, this); + }, + /** + * 获得连接ID + * @method + * @return {String} 连接ID + */ + getId : function(){ + return this.cId; + } +}); \ No newline at end of file diff --git a/comet4j-js/src/Engine.js b/comet4j-js/src/Engine.js new file mode 100644 index 0000000..98e0c18 --- /dev/null +++ b/comet4j-js/src/Engine.js @@ -0,0 +1,138 @@ +/** + * 消息引擎, + * 负责将服务器推送的通道数据,以事件的方式触发,事件名称与通道名称相同。 + * @class JS.Engine + * @singleton + * @extends JS.Observable + * @author jinghai.xiao@gmail.com + */ +JS.ns("JS.Engine"); +JS.Engine = (function(){ + var Engine = JS.extend(JS.Observable,{ + lStore : [],//用于存放没启动状态下用户增加的侦听 + /** + * 引擎是否处于工作状态 + * @property + * @type Boolean + */ + running : false, + /** + * 引擎所使用的连接器 + * @property + * @type JS.Connector + */ + connector : null, + constructor:function(){ + this.addEvents([ + /** + * @event start 开始事件 + * @param {String} cId 连接ID + * @param {Array} channels 通道列表 + * @param {JS.Engine} engine 事件引擎 + */ + 'start', + /*** + * @event stop 停止事件 + * @param {String} cause 停止原因 + * @param {String} cId 连接ID + * @param {String} url 连接地址 + * @param {JS.Engine} engine 事件引擎 + */ + 'stop' + ]); + Engine.superclass.constructor.apply(this,arguments); + this.connector = new JS.Connector(); + this.initEvent(); + }, + /** + * 注册通道侦听 + * @method on + * @param {String | Map} channelName 通道名称或多个通道名称和侦听函数的键值对 + * @param {Function} fn 侦听函数 + * @param {Object} scope 侦听函数作用域 + */ + //重载addListener函数 + addListener : function(eventName, fn, scope, o){ + if(this.running){ + Engine.superclass.addListener.apply(this,arguments); + }else{ + this.lStore.push({ + eventName : eventName, + fn : fn, + scope : scope, + o : o + }); + } + }, + //private + initEvent : function(){ + var self = this; + this.connector.on({ + connect : function(cId, aml, conn){ + //self.running = true; + self.addEvents(aml); + for(var i=0,len=self.lStore.length; iReturns true if the passed value is empty.

        + *

        The value is deemed to be empty if it is

          + *
        • null
        • + *
        • undefined
        • + *
        • an empty array
        • + *
        • a zero length string (Unless the allowBlank parameter is true)
        • + *
        + * @param {Mixed} value The value to test + * @param {Boolean} allowBlank (optional) true to allow empty strings (defaults to false) + * @return {Boolean} + */ + isEmpty : function(v, allowBlank){ + return v === null || v === undefined || ((Ext.isArray(v) && !v.length)) || (!allowBlank ? v === '' : false); + }, + + /** + * Returns true if the passed value is a JavaScript array, otherwise false. + * @param {Mixed} value The value to test + * @return {Boolean} + */ + isArray : function(v){ + return Object.prototype.toString.apply(v) === '[object Array]'; + }, + + /** + * Returns true if the passed object is a JavaScript date object, otherwise false. + * @param {Object} object The object to test + * @return {Boolean} + */ + isDate : function(v){ + return Object.prototype.toString.apply(v) === '[object Date]'; + }, + + /** + * Returns true if the passed value is a JavaScript Object, otherwise false. + * @param {Mixed} value The value to test + * @return {Boolean} + */ + isObject : function(v){ + return !!v && Object.prototype.toString.call(v) === '[object Object]'; + }, + + /** + * Returns true if the passed value is a JavaScript 'primitive', a string, number or boolean. + * @param {Mixed} value The value to test + * @return {Boolean} + */ + isPrimitive : function(v){ + return Ext.isString(v) || Ext.isNumber(v) || Ext.isBoolean(v); + }, + + /** + * Returns true if the passed value is a JavaScript Function, otherwise false. + * @param {Mixed} value The value to test + * @return {Boolean} + */ + isFunction : function(v){ + return Object.prototype.toString.apply(v) === '[object Function]'; + }, + + /** + * Returns true if the passed value is a number. Returns false for non-finite numbers. + * @param {Mixed} value The value to test + * @return {Boolean} + */ + isNumber : function(v){ + return typeof v === 'number' && isFinite(v); + }, + + /** + * Returns true if the passed value is a string. + * @param {Mixed} value The value to test + * @return {Boolean} + */ + isString : function(v){ + return typeof v === 'string'; + }, + + /** + * Returns true if the passed value is a boolean. + * @param {Mixed} value The value to test + * @return {Boolean} + */ + isBoolean : function(v){ + return typeof v === 'boolean'; + }, + + /** + * Returns true if the passed value is an HTMLElement + * @param {Mixed} value The value to test + * @return {Boolean} + */ + isElement : function(v) { + return !!v && v.tagName; + }, + + /** + * Returns true if the passed value is not undefined. + * @param {Mixed} value The value to test + * @return {Boolean} + */ + isDefined : function(v){ + return typeof v !== 'undefined'; + }, + /** + * 将任何可迭代(带有length属性)的对象转换成Array对象 + * 不要用它转换字符串.IE doesn't support "abc"[0] which this implementation depends on. + * For strings, use this instead: "abc".match(/./g) => [a,b,c]; + * @param {Iterable} the iterable object to be turned into a true Array. + * @return (Array) array + */ + toArray : function(){ + return JS.isIE ? + function(a, i, j, res){ + res = []; + for(var x = 0, len = a.length; x < len; x++) { + res.push(a[x]); + } + return res.slice(i || 0, j || res.length); + } : + function(a, i, j){ + return Array.prototype.slice.call(a, i || 0, j || a.length); + }; + }() +}; +JS.log = JS.Syntax.log; +JS.ns = JS.Syntax.nameSpace; +JS.apply = JS.Syntax.apply; +JS.override = JS.Syntax.override; +JS.extend = JS.Syntax.extend; +JS.callBack = JS.Syntax.callBack; +JS.isEmpty = JS.Syntax.isEmpty; +JS.isArray = JS.Syntax.isArray; +JS.isDate = JS.Syntax.isDate; +JS.isObject = JS.Syntax.isObject; +JS.isPrimitive = JS.Syntax.isPrimitive; +JS.isFunction = JS.Syntax.isFunction; +JS.isNumber = JS.Syntax.isNumber; +JS.isString = JS.Syntax.isString; +JS.isBoolean = JS.Syntax.isBoolean; +JS.isElement = JS.Syntax.isElement; +JS.isDefined = JS.Syntax.isDefined; +JS.toArray = JS.Syntax.toArray; + +JS.DomEvent = { + /** + * @method + * @param {DOM} el + * @param {String} name + * @param {Function} fun + * @param {Object} scope + */ + on: function(el, name, fun, scope){ + if (el.addEventListener) { + //el.addEventListener(name, fun, false); + //TODO:若封闭成带有作用域的功能,如何删除事件,是否自己要记一下on的函数,然后在un下删除它 + + el.addEventListener(name, function(){ + JS.callBack(fun,scope,arguments); + }, false); + + } else { + //el.attachEvent('on' + name, fun); + + el.attachEvent('on' + name, function(){ + JS.callBack(fun,scope,arguments); + }); + + } + }, + /** + * @method + * @param {DOM} el + * @param {String} name + * @param {Function} fun + * @param {Object} scope + */ + un: function(el, name, fun,scope){ + if (el.removeEventListener){ + el.removeEventListener(name, fun, false); + } else { + el.detachEvent('on' + name, fun); + } + }, + /** + * @method + * @param {DOMEvent} e + */ + stop: function(e){ + e.returnValue = false; + if (e.preventDefault) { + e.preventDefault(); + } + JS.DomEvent.stopPropagation(e); + }, + /** + * @method + * @param {DOMEvent} e + */ + stopPropagation: function(e){ + e.cancelBubble = true; + if (e.stopPropagation) { + e.stopPropagation(); + } + } +}; +JS.on = JS.DomEvent.on; +JS.un = JS.DomEvent.un; +/** + *
        
        +	var task = new Ext.util.DelayedTask(function(){
        +	    alert(Ext.getDom('myInputField').value.length);
        +	});
        +	Ext.get('myInputField').on('keypress', function(){
        +	    task.delay(500); 
        +	});
        + * 
        + */ +JS.DelayedTask = function(fn, scope, args){ + var me = this, + id, + call = function(){ + clearInterval(id); + id = null; + fn.apply(scope, args || []); + }; + + /** + * Cancels any pending timeout and queues a new one + * @param {Number} delay The milliseconds to delay + * @param {Function} newFn (optional) Overrides function passed to constructor + * @param {Object} newScope (optional) Overrides scope passed to constructor. Remember that if no scope + * is specified, this will refer to the browser window. + * @param {Array} newArgs (optional) Overrides args passed to constructor + */ + me.delay = function(delay, newFn, newScope, newArgs){ + me.cancel(); + fn = newFn || fn; + scope = newScope || scope; + args = newArgs || args; + id = setInterval(call, delay); + }; + + /** + * Cancel the last queued timeout + */ + me.cancel = function(){ + if(id){ + clearInterval(id); + id = null; + } + }; +}; diff --git a/comet4j-js/src/Observable.js b/comet4j-js/src/Observable.js new file mode 100644 index 0000000..9b12257 --- /dev/null +++ b/comet4j-js/src/Observable.js @@ -0,0 +1,327 @@ +/** + * @class JS.Observable + * 事件模型 + * @author jinghai.xiao@gmail.com + */ +JS.ns("JS.Observable"); +JS.Observable = function(o){ + JS.apply(this,o || JS.toArray(arguments)[0]); + if(this.events){ + this.addEvents(this.events); + } + if(this.listeners){ + this.on(this.listeners); + delete this.listeners; + } +}; +JS.Observable.prototype = { + /** + * 添加侦听 + * @method + * @param {String | Map} channelName 事件名称或多个事件名称和侦听函数的键值对 + * @param {Function} fn 侦听函数 + * @param {Object} scope 侦听函数作用域 + */ + on : function(eventName, fn, scope, o){ + if(JS.isString(eventName)){ + this.addListener(eventName, fn, scope, o); + }else if(JS.isObject(eventName)){ + this.addListeners(eventName,scope, o); + } + }, + /** + * 触发事件 + * @method + * @param {String} eventName 事件名称 + * @param {[AnyType0~n...]} eventParam 事件参数,可以是0到N个 + * @return {Boolean} + */ + fireEvent : function(){ + var arg = JS.toArray(arguments), + eventName = arg[0].toLowerCase(), + e = this.events[eventName]; + if(e && !JS.isBoolean(e)){ + return e.fire.apply(e,arg.slice(1)); + } + }, + /** + * 注册事件类型 + * @method + * @param {String} eventName 事件名称 + */ + addEvent : function(eventName){ + if(!JS.isObject(this.events)){ + this.events = {}; + } + if(this.events[eventName]){ + return; + } + if(JS.isString(eventName)){ + this.events[eventName.toLowerCase()] = true; + }else if(eventName instanceof JS.Event){ + this.events[eventName.name.toLowerCase()] = eventName; + } + }, + /** + * 批量注册事件类型 + * @method + * @param {Array} eventNames 事件名称 + */ + addEvents : function(arr){ + if(JS.isArray(arr)){ + for(var i = 0,len = arr.length; i < len; i++){ + this.addEvent(arr[i]); + } + } + }, + /** + * 注册事件侦听 + * @method + * @param {String} eventName 事件名称 + * @param {Function} fn 侦听函数 + * @param {Object} scope 侦听函数作用域 + */ + addListener : function(eventName, fn, scope, o){//o配置项尚未实现 + eventName = eventName.toLowerCase(); + this.addEvent(eventName); + var e = this.events[eventName]; + if(e){ + if(JS.isBoolean(e)){ + e = this.events[eventName] = new JS.Event(eventName,this); + } + e.addListener(fn, scope , o); + } + }, + /** + * 批量注册事件侦听 + * @method + * @param {Map} eventMap 事件名称与侦听函数的键值对 + * @param {Function} fn 侦听函数 + * @param {Object} scope 侦听函数作用域 + */ + addListeners : function(obj,scope, o){ + if(JS.isObject(obj)){ + for(var p in obj){ + this.addListener(p,obj[p],scope, o); + } + } + }, + /** + * 移除事件侦听 + * @method + * @param {String} eventName 事件名称 + * @param {Function} fn 侦听函数 + * @param {Object} scope 侦听函数作用域 + */ + removeListener : function(eventName, fn, scope){ + eventName = eventName.toLowerCase(); + var e = this.events[eventName]; + if(e && !JS.isBoolean(e)){ + e.removeListener(fn, scope); + } + }, + /** + * 移除所有事件侦听 + * @method + */ + clearListeners : function(){ + var events = this.events, + e; + for(var p in events){ + e = events[p]; + if(!JS.isBoolean(e)){ + e.clearListeners(); + } + } + }, + /** + * 移除所有事件类型及事件侦听 + * @method + */ + clearEvents : function(){ + var events = this.events; + this.clearListeners(); + for(var p in events){ + this.removeEvent(p); + } + }, + /** + * 移除事件类型 + * @method + * @param {String} eventName 事件类型名称 + */ + removeEvent : function(eventName){ + var events = this.events, + e; + if(events[eventName]){ + e = events[eventName]; + if(!JS.isBoolean(e)){ + e.clearListeners(); + } + delete events[eventName]; + } + + }, + /** + * 批量移除事件类型 + * @method + * @param {Array} 事件类型名称列表 + */ + removeEvents : function(eventName){ + if(JS.isString(eventName)){ + this.removeEvent(eventName); + }else if(JS.isArray(eventName) && eventName.length > 0){ + for(var i=0, len=eventName.length; i -1; i--){//TODO:fix 倒序 + if(listeners[i].execute.apply(listeners[i],arguments) === false){ + return false; + } + } + return true; + }, + /** + * @method + * @param {Function} fn + * @param {Object} scope + */ + addListener : function(fn, scope,o){ + scope = scope || this.caller; + if(this.hasListener(fn, scope) == -1){ + this.listeners.push(new JS.Listener(fn, scope ,o)); + } + }, + /** + * + * @method + * @param {Function} fn + * @param {Object} scope + */ + removeListener : function(fn, scope){ + var index = this.hasListener(fn, scope); + if(index!=-1){ + this.listeners.splice(index, 1); + } + }, + /** + * + * @method + * @param {Function} fn + * @param {Object} scope + */ + hasListener : function(fn, scope){ + var i = 0, + listeners = this.listeners, + len = listeners.length; + for(; i= 200 && this.status < 300)){ + this.fireEvent('progress', this, xhr); + } + + if(this.readyState == 4){ + this.cancelTimeout(); + var status = this.status ; + if(status == 0 || status == ""){ + this.fireEvent('error', this, xhr); + }else if(status >= 200 && status < 300){ + this.fireEvent('load', this, xhr); + }else if(status >= 400 && status != 408){ + this.fireEvent('error', this, xhr); + }else if(status == 408){ + this.fireEvent('timeout', this, xhr); + } + + } + this.onreadystatechange(); + }, + /** + * 兼容标准的onreadystatechange + * @method + */ + onreadystatechange : function(){ + }, + //--------request-------- + /** + * 兼容标准的open方法 + * @method + */ + open : function(method, url, async, username, password){ + if(!url){ + return; + } + if(!this.enableCache){ + if(url.indexOf('?') != -1){ + url += '&ram='+Math.random(); + }else{ + url += '?ram='+Math.random(); + } + } + this._xhr.open(method, url, async, username, password); + }, + /** + * 兼容标准的send方法 + * @method + */ + send : function(content){ + this.delayTimeout(); + this.isAbort = false; + this._xhr.send(content); + }, + /** + * 兼容标准的abort方法 + * @method + */ + abort : function(){ + this.isAbort = true; + this.cancelTimeout(); + this._xhr.abort(); + if(JS.isIE){//IE在abort后会清空侦听 + var self = this; + self._xhr.onreadystatechange = function(){ + self.doReadyStateChange(); + }; + } + this.fireEvent('abort',this,this._xhr); + }, + /** + * 兼容标准的setRequestHeader方法 + * @method + */ + setRequestHeader : function(header, value){ + this._xhr.setRequestHeader(header,value); + }, + //--------request-------- + /** + * 兼容标准的getResponseHeader方法 + * @method + */ + getResponseHeader : function(header){ + return this._xhr.getResponseHeader(header); + }, + /** + * 兼容标准的getAllResponseHeaders方法 + * @method + */ + getAllResponseHeaders : function(){ + return this._xhr.getAllResponseHeaders(); + }, + /** + * 设置客户端超时时间 + * @method + */ + setTimeout : function(t){ + this.timeout = t; + } + +}); \ No newline at end of file diff --git a/comet4j-test/.classpath b/comet4j-test/.classpath new file mode 100644 index 0000000..7f0842d --- /dev/null +++ b/comet4j-test/.classpath @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/comet4j-test/.project b/comet4j-test/.project new file mode 100644 index 0000000..efe6c14 --- /dev/null +++ b/comet4j-test/.project @@ -0,0 +1,42 @@ + + + comet4j-test + + + + + + org.eclipse.wst.jsdt.core.javascriptValidator + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + org.maven.ide.eclipse.maven2Builder + + + + + + org.maven.ide.eclipse.maven2Nature + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.wst.common.project.facet.core.nature + org.eclipse.jdt.core.javanature + org.eclipse.wst.jsdt.core.jsNature + + diff --git a/comet4j-test/RoadMap.txt b/comet4j-test/RoadMap.txt new file mode 100644 index 0000000..4ff1d7a --- /dev/null +++ b/comet4j-test/RoadMap.txt @@ -0,0 +1,3 @@ +V0.1.1 +新增: +全自动化测试程序 \ No newline at end of file diff --git a/comet4j-test/WebContent/META-INF/MANIFEST.MF b/comet4j-test/WebContent/META-INF/MANIFEST.MF new file mode 100644 index 0000000..254272e --- /dev/null +++ b/comet4j-test/WebContent/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Class-Path: + diff --git a/comet4j-test/WebContent/WEB-INF/lib/javamelody-1.26.0.jar b/comet4j-test/WebContent/WEB-INF/lib/javamelody-1.26.0.jar new file mode 100644 index 0000000..41a66c2 Binary files /dev/null and b/comet4j-test/WebContent/WEB-INF/lib/javamelody-1.26.0.jar differ diff --git a/comet4j-test/WebContent/WEB-INF/lib/jira-javamelody-1.26.0.jar b/comet4j-test/WebContent/WEB-INF/lib/jira-javamelody-1.26.0.jar new file mode 100644 index 0000000..b47bc98 Binary files /dev/null and b/comet4j-test/WebContent/WEB-INF/lib/jira-javamelody-1.26.0.jar differ diff --git a/comet4j-test/WebContent/WEB-INF/web.xml b/comet4j-test/WebContent/WEB-INF/web.xml new file mode 100644 index 0000000..39ef3c6 --- /dev/null +++ b/comet4j-test/WebContent/WEB-INF/web.xml @@ -0,0 +1,117 @@ + + + Comet4J Test + + talk.html + + + air + application/air + + + 编码过滤 + encodingfilter + org.comet4j.core.util.CharacterEncodingFilter + + encoding + utf-8 + + + + encodingfilter + /* + + + + + + monitoring + net.bull.javamelody.MonitoringFilter + + + monitoring + /* + + + net.bull.javamelody.SessionListener + + + + + + 应用程序事件监听 + org.comet4j.core.CometAppListener + + + Comet连接[默认:org.comet4j.core.CometServletTomcat7] + CometServlet + CometServlet + org.comet4j.core.CometServletTomcat7 + + + CometServlet + /conn + + + + 语言[目前只支持:zh,en两种,默认:zh,详细http://www.loc.gov/standards/iso639-2/php/English_list.php] + Comet.Language + zh + + + 请求超时时间/微妙[默认:60000,1分钟,建议最小设置3秒] + Comet.Timeout + 5000 + + + 连接空闲过期时间/微妙[默认:60000,1分钟] + Comet.ConnExpires + 5000 + + + 连接检查频率/微妙[默认:60000,1分钟] + Comet.ConnFrequency + 5000 + + + 缓存信息过期时间/微妙[默认:3600000,1小时] + Comet.CacheExpires + 3600000 + + + 缓存信息过期检查频率/微妙[默认:3600000,1小时] + Comet.CacheFrequency + 5000 + + + 连接模式[auto(默认)/stream/lpool] + Comet.WorkStyle + auto + + + 开启调试[false(默认)/true] + Comet.Debug + true + + + + + + 信息发送器 + org.comet4j.demo.sender.AppInit + + + + 请求监视 + org.comet4j.demo.requestmonitor.AppInit + + + 事件监视 + org.comet4j.demo.eventmonitor.AppInit + + + + \ No newline at end of file diff --git a/comet4j-test/WebContent/XHRTest.html b/comet4j-test/WebContent/XHRTest.html new file mode 100644 index 0000000..176f9f4 --- /dev/null +++ b/comet4j-test/WebContent/XHRTest.html @@ -0,0 +1,120 @@ + + + + +JS.XMLHttpRequest测试 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        连接器测试 
          +
        XMLHttpRequest onReadyStateChange Event :
        +
        +
        Connector Events :
        测试指导:
        + + + diff --git a/comet4j-test/WebContent/connectorTest.html b/comet4j-test/WebContent/connectorTest.html new file mode 100644 index 0000000..141b0c0 --- /dev/null +++ b/comet4j-test/WebContent/connectorTest.html @@ -0,0 +1,189 @@ + + + + +连接器测试 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        连接器测试 
         
        XMLHttpRequest onReadyStateChange Event :
        +
        +
        Connector Events :
        +
        +
        测试指导:
        [1].测试无信息接收连接的状态是否稳定。
        + [2].测试有信息接收连接的状态是否稳定。
        [3].正在连接时断开连接,尝试是否可以再次连接。
        + [4].正在连接时服务器突然停止,连接是否会自动停止。
        + + + diff --git a/comet4j-test/WebContent/engineTest.html b/comet4j-test/WebContent/engineTest.html new file mode 100644 index 0000000..78a6d08 --- /dev/null +++ b/comet4j-test/WebContent/engineTest.html @@ -0,0 +1,110 @@ + + + + +消息引擎测试 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        消息引擎 
          +
        JS.Engine Events :
        +
        +
        测试指导:
        +
        + + + diff --git a/comet4j-test/WebContent/js/comet4j-0.1.7-debug.js b/comet4j-test/WebContent/js/comet4j-0.1.7-debug.js new file mode 100644 index 0000000..3fc838f --- /dev/null +++ b/comet4j-test/WebContent/js/comet4j-0.1.7-debug.js @@ -0,0 +1,1299 @@ +/* + * Comet4J JavaScript Client V0.1.7 + * Copyright(c) 2011, jinghai.xiao@gamil.com. + * http://code.google.com/p/comet4j/ + * This code is licensed under BSD license. Use it as you wish, + * but keep this copyright intact. + */ + + +var JS = { + version : '0.1.7' +}; + +JS.Runtime = (function(){ + var ua = navigator.userAgent.toLowerCase(), + check = function(r){ + return r.test(ua); + }, + + isOpera = check(/opera/), + + isFirefox = check(/firefox/), + + isChrome = check(/chrome/), + + isWebKit = check(/webkit/), + + isSafari = !isChrome && check(/safari/), + + isSafari2 = isSafari && check(/applewebkit\/4/), + + isSafari3 = isSafari && check(/version\/3/), + + isSafari4 = isSafari && check(/version\/4/), + + isIE = !isOpera && check(/msie/), + + isIE7 = isIE && check(/msie 7/), + + isIE8 = isIE && check(/msie 8/), + + isIE6 = isIE && !isIE7 && !isIE8, + + isGecko = !isWebKit && check(/gecko/), + + isGecko2 = isGecko && check(/rv:1\.8/), + + isGecko3 = isGecko && check(/rv:1\.9/), + + isWindows = check(/windows|win32/), + + isMac = check(/macintosh|mac os x/), + + isAir = check(/adobeair/), + + isLinux = check(/linux/); + return { + isOpera : isOpera, + isFirefox : isFirefox, + isChrome : isChrome, + isWebKit : isWebKit, + isSafari : isSafari, + isSafari2 : isSafari2, + isSafari3 : isSafari3, + isSafari4 : isSafari4, + isIE : isIE, + isIE7 : isIE7, + isIE8 : isIE8, + isIE6 : isIE6, + isGecko : isGecko, + isGecko2 : isGecko2, + isGecko3 : isGecko3, + isWindows :isWindows, + isMac : isMac, + isAir : isAir, + isLinux : isLinux + }; +}()); +JS.isOpera = JS.Runtime.isOpera; +JS.isFirefox = JS.Runtime.isFirefox; +JS.isChrome = JS.Runtime.isChrome; +JS.isWebKit = JS.Runtime.isWebKit; +JS.isSafari = JS.Runtime.isSafari; +JS.isSafari2 = JS.Runtime.isSafari2; +JS.isSafari3 = JS.Runtime.isSafari3; +JS.isSafari4 = JS.Runtime.isSafari4; +JS.isIE = JS.Runtime.isIE; +JS.isIE7 = JS.Runtime.isIE7; +JS.isIE8 = JS.Runtime.isIE8; +JS.isIE6 = JS.Runtime.isIE6; +JS.isGecko = JS.Runtime.isGecko; +JS.isGecko2 = JS.Runtime.isGecko2; +JS.isGecko3 = JS.Runtime.isGecko3; +JS.isWindows =JS.Runtime.isWindows; +JS.isMac = JS.Runtime.isMac; +JS.isAir = JS.Runtime.isAir; +JS.isLinux = JS.Runtime.isLinux; + +JS.Syntax = { + log : function(str){ + if(typeof console!="undefined"){ + console.log(str); + } + }, + nameSpace : function(){ + if(arguments.length){ + var o, d, v; + for(var i=0,len=arguments.length; i 0){ + for(var i=0, len=eventName.length; i -1; i--){//TODO:fix 倒序 + if(listeners[i].execute.apply(listeners[i],arguments) === false){ + return false; + } + } + return true; + }, + + addListener : function(fn, scope,o){ + scope = scope || this.caller; + if(this.hasListener(fn, scope) == -1){ + this.listeners.push(new JS.Listener(fn, scope ,o)); + } + }, + + removeListener : function(fn, scope){ + var index = this.hasListener(fn, scope); + if(index!=-1){ + this.listeners.splice(index, 1); + } + }, + + hasListener : function(fn, scope){ + var i = 0, + listeners = this.listeners, + len = listeners.length; + for(; i= 200 && this.status < 300)){ + this.fireEvent('progress', this, xhr); + } + + if(this.readyState == 4){ + this.cancelTimeout(); + var status = this.status ; + if(status == 0 || status == ""){ + this.fireEvent('error', this, xhr); + }else if(status >= 200 && status < 300){ + this.fireEvent('load', this, xhr); + }else if(status >= 400 && status != 408){ + this.fireEvent('error', this, xhr); + }else if(status == 408){ + this.fireEvent('timeout', this, xhr); + } + + } + this.onreadystatechange(); + }, + + onreadystatechange : function(){ + }, + //--------request-------- + + open : function(method, url, async, username, password){ + if(!url){ + return; + } + if(!this.enableCache){ + if(url.indexOf('?') != -1){ + url += '&ram='+Math.random(); + }else{ + url += '?ram='+Math.random(); + } + } + this._xhr.open(method, url, async, username, password); + }, + + send : function(content){ + this.delayTimeout(); + this.isAbort = false; + this._xhr.send(content); + }, + + abort : function(){ + this.isAbort = true; + this.cancelTimeout(); + this._xhr.abort(); + if(JS.isIE){//IE在abort后会清空侦听 + var self = this; + self._xhr.onreadystatechange = function(){ + self.doReadyStateChange(); + }; + } + this.fireEvent('abort',this,this._xhr); + }, + + setRequestHeader : function(header, value){ + this._xhr.setRequestHeader(header,value); + }, + //--------request-------- + + getResponseHeader : function(header){ + return this._xhr.getResponseHeader(header); + }, + + getAllResponseHeaders : function(){ + return this._xhr.getAllResponseHeaders(); + }, + + setTimeout : function(t){ + this.timeout = t; + } + +}); + +JS.ns("JS.AJAX"); + +JS.AJAX = (function(){ + var xhr = new JS.XMLHttpRequest(); + return { + dataFormatError : '服务器返回的数据格式有误', + urlError : '未指定url', + + post : function(url,param,callback,scope,asyn){ + if(typeof url!=='string'){ + throw new Error(this.urlError); + } + //默认为异步请求 + var asynchronous = true; + if(asyn===false){ + asynchronous = false; + } + xhr.onreadystatechange = function(){ + if(xhr.readyState==4 && asynchronous){ + JS.callBack(callback,scope,[xhr]); + } + }; + xhr.open('POST', url, asynchronous); + xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=UTF8"); + xhr.send(param || null); + if(!asynchronous){ + JS.callBack(callback,scope,[xhr]); + } + + }, + + get : function(url,param,callback,scope,asyn){ + if(typeof url!=='string'){ + throw new Error(this.urlError); + } + //默认为异步请求 + var asynchronous = true; + if(asyn===false){ + asynchronous = false; + } + xhr.onreadystatechange = function(){ + if(xhr.readyState==4 && asynchronous){ + JS.callBack(callback,scope,[xhr]); + } + }; + xhr.open('GET', url, asynchronous); + xhr.setRequestHeader("Content-Type","html/text;charset=UTF8"); + xhr.send(param || null); + if(!asynchronous){ + JS.callBack(callback,scope,[xhr]); + } + + }, + + getText : function(url,jsonData,callback,scope,asyn){ + this.get(url,jsonData,function(xhr){ + if(scope){ + callback.call(scope,xhr.responseText); + }else{ + callback(xhr.responseText); + } + },this,asyn); + }, + + getJson : function(url,jsonData,callback,scope,asyn){ + this.get(url,jsonData,function(xhr){ + var json = null; + try{ + json = eval("("+xhr.responseText+")"); + }catch(e){ + throw new Error(this.dataFormatError); + } + JS.callBack(callback,scope,[json]); + },this,asyn); + } + }; +})(); + +JS.ns("JS.Connector"); +JS.Connector = JS.extend(JS.Observable,{ + + version : JS.version, + SYSCHANNEL:'c4j', //协议常量 + + LLOOPSTYLE : 'lpool',//协议常量 + + STREAMSTYLE : 'stream',//协议常量 + CMDTAG : 'cmd', + + retryCount : 3, + + retryDelay : 1000, + currRetry : 0, + + url : '', + + param : '', + + revivalDelay : 100, + + cId : '', + + channels : [], + + workStyle : '', + emptyUrlError : 'URL为空', + runningError : '连接正在运行', + dataFormatError : '数据格式有误', + + running : false, + _xhr : null, + lastReceiveMessage : '', + constructor:function(){ + JS.Connector.superclass.constructor.apply(this,arguments); + this.addEvents([ + + 'beforeConnect', + + 'connect', + + 'beforeStop', + + 'stop', + + 'message', + + 'revival' + ]); + if(JS.isIE7){ + this._xhr = new JS.XMLHttpRequest({ + specialXHR : 'Msxml2.XMLHTTP.6.0' + }); + }else{ + this._xhr = new JS.XMLHttpRequest(); + } + //this._xhr.addListener('readyStateChange',this.onReadyStateChange,this); + + this._xhr.addListener('progress',this.doOnProgress,this); + this._xhr.addListener('load',this.doOnLoad,this); + this._xhr.addListener('error',this.doOnError,this); + this._xhr.addListener('timeout',this.doOnTimeout,this); + + this.addListener('beforeStop',this.doDrop,this); + JS.on(window,'beforeunload',this.doDrop,this); + + }, + //private + doDrop : function(url,cId,conn,xhr){ + if(!this.running || !this.cId){ + return; + } + try { + var xhr = new JS.XMLHttpRequest(); + var param = this.perfectParam(this.param); + var url = this.url + '?'+this.CMDTAG+'=drop&cid=' + this.cId + param; + xhr.open('GET', url, false); + xhr.send(null); + xhr = null; + }catch(e){}; + }, + //private distributed 派发服务器消息 + dispatchServerEvent : function(msg){ + this.fireEvent('message', msg.channel, msg.data, msg.time, this); + }, + //private 长连接信息转换 + translateStreamData : function(responseText){ + var str = responseText; + if(this.lastReceiveMessage && str){//剥离出接收到的数据 + str = str.split(this.lastReceiveMessage); + str = str.length ? str[str.length-1] : ""; + } + this.lastReceiveMessage = responseText; + return str; + }, + //private 消息解码 + decodeMessage : function(msg){ + var json = null; + if(JS.isString(msg) && msg!=""){ + //解析数据格式 + if(msg.charAt(0)=="<" ){ + msg = msg.substring(1,msg.length); + } + if(msg.charAt(msg.length-1)==">"){ + msg = msg.substring(0,msg.length-1); + } + msg = decodeURIComponent(msg); + try{ + json = eval("("+msg+")"); + }catch(e){ + this.stop('JSON转换异常'); + } + } + return json; + }, + //private + doOnProgress : function(xhr){ + if(this.workStyle === this.STREAMSTYLE){ + var str = this.translateStreamData(xhr.responseText); + var msglist = str.split(">"); + if(msglist.length > 0){ + for(var i=0, len=msglist.length; i this.retryCount){ + this.stop('服务器异常'); + }else{ + this.retryRevivalConnect(); + } + } + } + } + } + }, + //private + doOnLoad : function(xhr){ + if(this.workStyle === this.LLOOPSTYLE){ + var json = this.decodeMessage(xhr.responseText); + if(json){ + this.currRetry = 0; + this.dispatchServerEvent(json); + this.revivalConnect(); + }else{//非正常情况,状态为4,200并且还没有收到任何数据 + this.currRetry++; + if(this.currRetry > this.retryCount){ + this.stop('服务器异常'); + }else{ + this.retryRevivalConnect(); + } + } + } + }, + //private + doOnError : function(xhr){ + this.currRetry++; + if(this.currRetry > this.retryCount){ + this.stop('服务器异常'); + }else{ + this.retryRevivalConnect(); + } + + }, + //private + doOnTimeout : function(xhr){ + this.currRetry++; + if(this.currRetry > this.retryCount){ + this.stop('请求超时'); + }else{ + this.retryRevivalConnect(); + } + }, + //private + startConnect : function(url){ + if(this.running){ + var connXhr = new JS.XMLHttpRequest(); + connXhr.addListener('error',function(xhr){ + this.stop("连接时发生错误"); + },this); + connXhr.addListener('timeout',function(xhr){ + this.stop("连接超时"); + },this); + connXhr.addListener('load',function(xhr){ + var msg = this.decodeMessage(xhr.responseText); + if(!msg){ + this.stop('连接失败'); + return; + } + var data = msg.data; + this.cId = data.cId; + this.channels = data.channels; + this.workStyle = data.ws; + this._xhr.setTimeout(data.timeout + 1000); + this.fireEvent('connect', data.cId, data.channels, data.ws, data.timeout, this); + this.revivalConnect(); + },this); + connXhr.open('GET', url, true); + connXhr.send(null); + + } + }, + + //private 重试复活连接 + retryRevivalConnect : function(){ + var self = this; + if(this.running){ + setTimeout(function(){ + self.revivalConnect(); + },this.retryDelay); + } + }, + + //private + revivalConnect : function(){ + var self = this; + if(this.running){ + setTimeout(revival,this.revivalDelay); + } + function revival(){ + var xhr = self._xhr; + var param = self.perfectParam(self.param); + var url = self.url + '?'+self.CMDTAG+'=revival&cid=' + self.cId + param; + xhr.open('GET', url, true); + xhr.send(null); + self.fireEvent('revival',self.url, self.cId, self); + } + + }, + + start : function(url,param){ + if(this.running){ + return; + } + + this.url = url || this.url; + if(!this.url){ + throw new Error(this.emptyUrlError); + } + + if(this.fireEvent('beforeConnect', this.url, this) === false){ + return; + } + + this.param = param || this.param; + param = this.perfectParam(this.param); + var url = this.url+'?'+this.CMDTAG+'=conn&cv='+this.version+param; + + this.running = true; + this.currRetry = 0; + var self = this; + setTimeout(function(){ + self.startConnect(url); + },1000); + }, + // 完善参数 + perfectParam : function(param){ + if(param && JS.isString(param)){ + if(param.charAt(0) != '&'){ + param = '&'+param; + } + } + return param; + }, + + stop : function(cause){ + if(!this.running){ + return; + } + if(this.fireEvent('beforeStop',cause,this.cId, this.url, this) === false){ + return; + } + this.running = false; + var cId = this.cId; + this.cId = ''; + this.channels = []; + this.workStyle = ''; + try{ + this._xhr.abort(); + }catch(e){}; + this.fireEvent('stop',cause, cId, this.url, this); + }, + + getId : function(){ + return this.cId; + } +}); + +JS.ns("JS.Engine"); +JS.Engine = (function(){ + var Engine = JS.extend(JS.Observable,{ + lStore : [],//用于存放没启动状态下用户增加的侦听 + + running : false, + + connector : null, + constructor:function(){ + this.addEvents([ + + 'start', + + 'stop' + ]); + Engine.superclass.constructor.apply(this,arguments); + this.connector = new JS.Connector(); + this.initEvent(); + }, + + //重载addListener函数 + addListener : function(eventName, fn, scope, o){ + if(this.running){ + Engine.superclass.addListener.apply(this,arguments); + }else{ + this.lStore.push({ + eventName : eventName, + fn : fn, + scope : scope, + o : o + }); + } + }, + //private + initEvent : function(){ + var self = this; + this.connector.on({ + connect : function(cId, aml, conn){ + //self.running = true; + self.addEvents(aml); + for(var i=0,len=self.lStore.length; i0){for(var i=0,len=eventName.length;i-1;i--){if(listeners[i].execute.apply(listeners[i],arguments)===false){return false;}} +return true;},addListener:function(fn,scope,o){scope=scope||this.caller;if(this.hasListener(fn,scope)==-1){this.listeners.push(new JS.Listener(fn,scope,o));}},removeListener:function(fn,scope){var index=this.hasListener(fn,scope);if(index!=-1){this.listeners.splice(index,1);}},hasListener:function(fn,scope){var i=0,listeners=this.listeners,len=listeners.length;for(;i=200&&this.status<300)){this.fireEvent('progress',this,xhr);} +if(this.readyState==4){this.cancelTimeout();var status=this.status;if(status==0||status==""){this.fireEvent('error',this,xhr);}else if(status>=200&&status<300){this.fireEvent('load',this,xhr);}else if(status>=400&&status!=408){this.fireEvent('error',this,xhr);}else if(status==408){this.fireEvent('timeout',this,xhr);}} +this.onreadystatechange();},onreadystatechange:function(){},open:function(method,url,async,username,password){if(!url){return;} +if(!this.enableCache){if(url.indexOf('?')!=-1){url+='&ram='+Math.random();}else{url+='?ram='+Math.random();}} +this._xhr.open(method,url,async,username,password);},send:function(content){this.delayTimeout();this.isAbort=false;this._xhr.send(content);},abort:function(){this.isAbort=true;this.cancelTimeout();this._xhr.abort();if(JS.isIE){var self=this;self._xhr.onreadystatechange=function(){self.doReadyStateChange();};} +this.fireEvent('abort',this,this._xhr);},setRequestHeader:function(header,value){this._xhr.setRequestHeader(header,value);},getResponseHeader:function(header){return this._xhr.getResponseHeader(header);},getAllResponseHeaders:function(){return this._xhr.getAllResponseHeaders();},setTimeout:function(t){this.timeout=t;}}); + +JS.ns("JS.AJAX");JS.AJAX=(function(){var xhr=new JS.XMLHttpRequest();return{dataFormatError:'服务器返回的数据格式有误',urlError:'未指定url',post:function(url,param,callback,scope,asyn){if(typeof url!=='string'){throw new Error(this.urlError);} +var asynchronous=true;if(asyn===false){asynchronous=false;} +xhr.onreadystatechange=function(){if(xhr.readyState==4&&asynchronous){JS.callBack(callback,scope,[xhr]);}};xhr.open('POST',url,asynchronous);xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=UTF8");xhr.send(param||null);if(!asynchronous){JS.callBack(callback,scope,[xhr]);}},get:function(url,param,callback,scope,asyn){if(typeof url!=='string'){throw new Error(this.urlError);} +var asynchronous=true;if(asyn===false){asynchronous=false;} +xhr.onreadystatechange=function(){if(xhr.readyState==4&&asynchronous){JS.callBack(callback,scope,[xhr]);}};xhr.open('GET',url,asynchronous);xhr.setRequestHeader("Content-Type","html/text;charset=UTF8");xhr.send(param||null);if(!asynchronous){JS.callBack(callback,scope,[xhr]);}},getText:function(url,jsonData,callback,scope,asyn){this.get(url,jsonData,function(xhr){if(scope){callback.call(scope,xhr.responseText);}else{callback(xhr.responseText);}},this,asyn);},getJson:function(url,jsonData,callback,scope,asyn){this.get(url,jsonData,function(xhr){var json=null;try{json=eval("("+xhr.responseText+")");}catch(e){throw new Error(this.dataFormatError);} +JS.callBack(callback,scope,[json]);},this,asyn);}};})(); + +JS.ns("JS.Connector");JS.Connector=JS.extend(JS.Observable,{version:JS.version,SYSCHANNEL:'c4j',LLOOPSTYLE:'lpool',STREAMSTYLE:'stream',CMDTAG:'cmd',retryCount:3,retryDelay:1000,currRetry:0,url:'',param:'',revivalDelay:100,cId:'',channels:[],workStyle:'',emptyUrlError:'URL为空',runningError:'连接正在运行',dataFormatError:'数据格式有误',running:false,_xhr:null,lastReceiveMessage:'',constructor:function(){JS.Connector.superclass.constructor.apply(this,arguments);this.addEvents(['beforeConnect','connect','beforeStop','stop','message','revival']);if(JS.isIE7){this._xhr=new JS.XMLHttpRequest({specialXHR:'Msxml2.XMLHTTP.6.0'});}else{this._xhr=new JS.XMLHttpRequest();} +this._xhr.addListener('progress',this.doOnProgress,this);this._xhr.addListener('load',this.doOnLoad,this);this._xhr.addListener('error',this.doOnError,this);this._xhr.addListener('timeout',this.doOnTimeout,this);this.addListener('beforeStop',this.doDrop,this);JS.on(window,'beforeunload',this.doDrop,this);},doDrop:function(url,cId,conn,xhr){if(!this.running||!this.cId){return;} +try{var xhr=new JS.XMLHttpRequest();var param=this.perfectParam(this.param);var url=this.url+'?'+this.CMDTAG+'=drop&cid='+this.cId+param;xhr.open('GET',url,false);xhr.send(null);xhr=null;}catch(e){};},dispatchServerEvent:function(msg){this.fireEvent('message',msg.channel,msg.data,msg.time,this);},translateStreamData:function(responseText){var str=responseText;if(this.lastReceiveMessage&&str){str=str.split(this.lastReceiveMessage);str=str.length?str[str.length-1]:"";} +this.lastReceiveMessage=responseText;return str;},decodeMessage:function(msg){var json=null;if(JS.isString(msg)&&msg!=""){if(msg.charAt(0)=="<"){msg=msg.substring(1,msg.length);} +if(msg.charAt(msg.length-1)==">"){msg=msg.substring(0,msg.length-1);} +msg=decodeURIComponent(msg);try{json=eval("("+msg+")");}catch(e){this.stop('JSON转换异常');}} +return json;},doOnProgress:function(xhr){if(this.workStyle===this.STREAMSTYLE){var str=this.translateStreamData(xhr.responseText);var msglist=str.split(">");if(msglist.length>0){for(var i=0,len=msglist.length;ithis.retryCount){this.stop('服务器异常');}else{this.retryRevivalConnect();}}}}}},doOnLoad:function(xhr){if(this.workStyle===this.LLOOPSTYLE){var json=this.decodeMessage(xhr.responseText);if(json){this.currRetry=0;this.dispatchServerEvent(json);this.revivalConnect();}else{this.currRetry++;if(this.currRetry>this.retryCount){this.stop('服务器异常');}else{this.retryRevivalConnect();}}}},doOnError:function(xhr){this.currRetry++;if(this.currRetry>this.retryCount){this.stop('服务器异常');}else{this.retryRevivalConnect();}},doOnTimeout:function(xhr){this.currRetry++;if(this.currRetry>this.retryCount){this.stop('请求超时');}else{this.retryRevivalConnect();}},startConnect:function(url){if(this.running){var connXhr=new JS.XMLHttpRequest();connXhr.addListener('error',function(xhr){this.stop("连接时发生错误");},this);connXhr.addListener('timeout',function(xhr){this.stop("连接超时");},this);connXhr.addListener('load',function(xhr){var msg=this.decodeMessage(xhr.responseText);if(!msg){this.stop('连接失败');return;} +var data=msg.data;this.cId=data.cId;this.channels=data.channels;this.workStyle=data.ws;this._xhr.setTimeout(data.timeout+1000);this.fireEvent('connect',data.cId,data.channels,data.ws,data.timeout,this);this.revivalConnect();},this);connXhr.open('GET',url,true);connXhr.send(null);}},retryRevivalConnect:function(){var self=this;if(this.running){setTimeout(function(){self.revivalConnect();},this.retryDelay);}},revivalConnect:function(){var self=this;if(this.running){setTimeout(revival,this.revivalDelay);} +function revival(){var xhr=self._xhr;var param=self.perfectParam(self.param);var url=self.url+'?'+self.CMDTAG+'=revival&cid='+self.cId+param;xhr.open('GET',url,true);xhr.send(null);self.fireEvent('revival',self.url,self.cId,self);}},start:function(url,param){if(this.running){return;} +this.url=url||this.url;if(!this.url){throw new Error(this.emptyUrlError);} +if(this.fireEvent('beforeConnect',this.url,this)===false){return;} +this.param=param||this.param;param=this.perfectParam(this.param);var url=this.url+'?'+this.CMDTAG+'=conn&cv='+this.version+param;this.running=true;this.currRetry=0;var self=this;setTimeout(function(){self.startConnect(url);},1000);},perfectParam:function(param){if(param&&JS.isString(param)){if(param.charAt(0)!='&'){param='&'+param;}} +return param;},stop:function(cause){if(!this.running){return;} +if(this.fireEvent('beforeStop',cause,this.cId,this.url,this)===false){return;} +this.running=false;var cId=this.cId;this.cId='';this.channels=[];this.workStyle='';try{this._xhr.abort();}catch(e){};this.fireEvent('stop',cause,cId,this.url,this);},getId:function(){return this.cId;}}); + +JS.ns("JS.Engine");JS.Engine=(function(){var Engine=JS.extend(JS.Observable,{lStore:[],running:false,connector:null,constructor:function(){this.addEvents(['start','stop']);Engine.superclass.constructor.apply(this,arguments);this.connector=new JS.Connector();this.initEvent();},addListener:function(eventName,fn,scope,o){if(this.running){Engine.superclass.addListener.apply(this,arguments);}else{this.lStore.push({eventName:eventName,fn:fn,scope:scope,o:o});}},initEvent:function(){var self=this;this.connector.on({connect:function(cId,aml,conn){self.addEvents(aml);for(var i=0,len=self.lStore.length;i + + 4.0.0 + + Comet4j-Test + org.comet4j + comet4j-test + 0.1.7 + + war + + + + src + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.6 + 1.6 + UTF-8 + + + + org.apache.maven.plugins + maven-war-plugin + + WebContent + + + + + + + + + + + + org.comet4j + comet4j + 0.1.7 + + + javax.servlet + servlet-api + 2.5 + provided + + + \ No newline at end of file diff --git a/comet4j-test/src/org/comet4j/demo/eventmonitor/AppInit.java b/comet4j-test/src/org/comet4j/demo/eventmonitor/AppInit.java new file mode 100644 index 0000000..e1a8c0a --- /dev/null +++ b/comet4j-test/src/org/comet4j/demo/eventmonitor/AppInit.java @@ -0,0 +1,49 @@ +package org.comet4j.demo.eventmonitor; + +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; + +import org.comet4j.core.CometContext; +import org.comet4j.core.CometEngine; +import org.comet4j.core.event.BeforeConnectEvent; +import org.comet4j.core.event.BeforeDropEvent; +import org.comet4j.core.event.BeforeRemoveEvent; +import org.comet4j.core.event.CometContextEvent; +import org.comet4j.core.event.ConnectEvent; +import org.comet4j.core.event.DropEvent; +import org.comet4j.core.event.DyingEvent; +import org.comet4j.core.event.MessageEvent; +import org.comet4j.core.event.RemovedEvent; +import org.comet4j.core.event.RevivalEvent; + +/** + * 应用初始化 + * @author jinghai.xiao@gmail.com + * @date 2011-2-25 + */ + +public class AppInit implements ServletContextListener { + + // ServletContextListener + @SuppressWarnings("unchecked") + public void contextInitialized(ServletContextEvent event) { + CometContext cc = CometContext.getInstance(); + cc.registChannel(Constant.AppChannel); + cc.addListener(CometContextEvent.class, new CometContextEventListener()); + CometEngine engine = cc.getEngine(); + engine.addListener(BeforeConnectEvent.class, new BeforeConnectEventListener()); + engine.addListener(ConnectEvent.class, new ConnectEventListener()); + engine.addListener(DyingEvent.class, new DyingEventListener()); + engine.addListener(RevivalEvent.class, new RevivalEventListener()); + engine.addListener(MessageEvent.class, new MessageEventListener()); + engine.addListener(BeforeDropEvent.class, new BeforeDropEventListener()); + engine.addListener(BeforeRemoveEvent.class, new BeforeRemoveEventListener()); + engine.addListener(RemovedEvent.class, new RemovedEventListener()); + engine.addListener(DropEvent.class, new DropEventListener()); + } + + public void contextDestroyed(ServletContextEvent event) { + + } + +} diff --git a/comet4j-test/src/org/comet4j/demo/eventmonitor/BeforeConnectEventListener.java b/comet4j-test/src/org/comet4j/demo/eventmonitor/BeforeConnectEventListener.java new file mode 100644 index 0000000..f946f21 --- /dev/null +++ b/comet4j-test/src/org/comet4j/demo/eventmonitor/BeforeConnectEventListener.java @@ -0,0 +1,24 @@ +package org.comet4j.demo.eventmonitor; + +import org.comet4j.core.event.BeforeConnectEvent; +import org.comet4j.core.listener.BeforeConnectListener; + +/** + * (用一句话描述类的主要功能) + * @author xiaojinghai + * @date 2011-3-9 + */ + +public class BeforeConnectEventListener extends BeforeConnectListener { + + /* + * (non-Jsdoc) + * @see org.comet4j.event.Listener#handleEvent(org.comet4j.event.Event) + */ + @Override + public boolean handleEvent(BeforeConnectEvent anEvent) { + System.out.println("[BeforeConnectEvent]:"); + return true; + } + +} diff --git a/comet4j-test/src/org/comet4j/demo/eventmonitor/BeforeDropEventListener.java b/comet4j-test/src/org/comet4j/demo/eventmonitor/BeforeDropEventListener.java new file mode 100644 index 0000000..915db65 --- /dev/null +++ b/comet4j-test/src/org/comet4j/demo/eventmonitor/BeforeDropEventListener.java @@ -0,0 +1,29 @@ +/** + * @(#)BeforeDropEventListener.java 2011-3-9 Copyright 2011 it.kedacom.com, Inc. + * All rights reserved. + */ + +package org.comet4j.demo.eventmonitor; + +import org.comet4j.core.event.BeforeDropEvent; +import org.comet4j.core.listener.BeforeDropListener; + +/** + * (用一句话描述类的主要功能) + * @author xiaojinghai + * @date 2011-3-9 + */ + +public class BeforeDropEventListener extends BeforeDropListener { + + /* + * (non-Jsdoc) + * @see org.comet4j.event.Listener#handleEvent(org.comet4j.event.Event) + */ + @Override + public boolean handleEvent(BeforeDropEvent anEvent) { + System.out.println("[BeforeDropEvent]:cId=" + anEvent.getRequest().getParameter("cid")); + return true; + } + +} diff --git a/comet4j-test/src/org/comet4j/demo/eventmonitor/BeforeRemoveEventListener.java b/comet4j-test/src/org/comet4j/demo/eventmonitor/BeforeRemoveEventListener.java new file mode 100644 index 0000000..3657734 --- /dev/null +++ b/comet4j-test/src/org/comet4j/demo/eventmonitor/BeforeRemoveEventListener.java @@ -0,0 +1,29 @@ +/** + * @(#)BeforeRemoveEventListener.java 2011-3-9 Copyright 2011 it.kedacom.com, + * Inc. All rights reserved. + */ + +package org.comet4j.demo.eventmonitor; + +import org.comet4j.core.event.BeforeRemoveEvent; +import org.comet4j.core.listener.BeforeRemoveListener; + +/** + * (用一句话描述类的主要功能) + * @author xiaojinghai + * @date 2011-3-9 + */ + +public class BeforeRemoveEventListener extends BeforeRemoveListener { + + /* + * (non-Jsdoc) + * @see org.comet4j.event.Listener#handleEvent(org.comet4j.event.Event) + */ + @Override + public boolean handleEvent(BeforeRemoveEvent anEvent) { + System.out.println("[BeforeRemoveEvent]:cId=" + anEvent.getConn().getId()); + return true; + } + +} diff --git a/comet4j-test/src/org/comet4j/demo/eventmonitor/CometContextEventListener.java b/comet4j-test/src/org/comet4j/demo/eventmonitor/CometContextEventListener.java new file mode 100644 index 0000000..dbd13c4 --- /dev/null +++ b/comet4j-test/src/org/comet4j/demo/eventmonitor/CometContextEventListener.java @@ -0,0 +1,43 @@ +/** + * @(#)CometContextEventListener.java 2011-3-9 Copyright 2011 it.kedacom.com, + * Inc. All rights reserved. + */ + +package org.comet4j.demo.eventmonitor; + +import org.comet4j.core.event.CometContextEvent; +import org.comet4j.core.listener.CometContextListener; + +/** + * (用一句话描述类的主要功能) + * @author xiaojinghai + * @date 2011-3-9 + */ + +public class CometContextEventListener extends CometContextListener { + + /* + * (non-Jsdoc) + * @see + * org.comet4j.core.listener.CometContextListener#onInitialized(org.comet4j + * .core.event.CometContextEvent) + */ + @Override + public boolean onInitialized(CometContextEvent event) { + System.out.println("[CometContextEvent]:subType=" + event.getSubType()); + return false; + } + + /* + * (non-Jsdoc) + * @see + * org.comet4j.core.listener.CometContextListener#onDestroyed(org.comet4j + * .core.event.CometContextEvent) + */ + @Override + public boolean onDestroyed(CometContextEvent event) { + // TODO 该方法尚未实现 + return false; + } + +} diff --git a/comet4j-test/src/org/comet4j/demo/eventmonitor/ConnectEventListener.java b/comet4j-test/src/org/comet4j/demo/eventmonitor/ConnectEventListener.java new file mode 100644 index 0000000..b38282f --- /dev/null +++ b/comet4j-test/src/org/comet4j/demo/eventmonitor/ConnectEventListener.java @@ -0,0 +1,29 @@ +/** + * @(#)ConnectEventListener.java 2011-3-9 Copyright 2011 it.kedacom.com, Inc. + * All rights reserved. + */ + +package org.comet4j.demo.eventmonitor; + +import org.comet4j.core.event.ConnectEvent; +import org.comet4j.core.listener.ConnectListener; + +/** + * (用一句话描述类的主要功能) + * @author xiaojinghai + * @date 2011-3-9 + */ + +public class ConnectEventListener extends ConnectListener { + + /* + * (non-Jsdoc) + * @see org.comet4j.event.Listener#handleEvent(org.comet4j.event.Event) + */ + @Override + public boolean handleEvent(ConnectEvent anEvent) { + System.out.println("[ConnectEvent]:cId=" + anEvent.getConn().getId()); + return false; + } + +} diff --git a/comet4j-test/src/org/comet4j/demo/eventmonitor/Constant.java b/comet4j-test/src/org/comet4j/demo/eventmonitor/Constant.java new file mode 100644 index 0000000..775bb18 --- /dev/null +++ b/comet4j-test/src/org/comet4j/demo/eventmonitor/Constant.java @@ -0,0 +1,6 @@ +package org.comet4j.demo.eventmonitor; + +public class Constant { + + public static final String AppChannel = "emonitor"; +} diff --git a/comet4j-test/src/org/comet4j/demo/eventmonitor/DropEventListener.java b/comet4j-test/src/org/comet4j/demo/eventmonitor/DropEventListener.java new file mode 100644 index 0000000..93e1ee6 --- /dev/null +++ b/comet4j-test/src/org/comet4j/demo/eventmonitor/DropEventListener.java @@ -0,0 +1,29 @@ +/** + * @(#)DropEventListener.java 2011-3-9 Copyright 2011 it.kedacom.com, Inc. All + * rights reserved. + */ + +package org.comet4j.demo.eventmonitor; + +import org.comet4j.core.event.DropEvent; +import org.comet4j.core.listener.DropListener; + +/** + * (用一句话描述类的主要功能) + * @author xiaojinghai + * @date 2011-3-9 + */ + +public class DropEventListener extends DropListener { + + /* + * (non-Jsdoc) + * @see org.comet4j.event.Listener#handleEvent(org.comet4j.event.Event) + */ + @Override + public boolean handleEvent(DropEvent anEvent) { + System.out.println("[DropEvent]:cId=" + anEvent.getConn().getId()); + return false; + } + +} diff --git a/comet4j-test/src/org/comet4j/demo/eventmonitor/DyingEventListener.java b/comet4j-test/src/org/comet4j/demo/eventmonitor/DyingEventListener.java new file mode 100644 index 0000000..8602ed1 --- /dev/null +++ b/comet4j-test/src/org/comet4j/demo/eventmonitor/DyingEventListener.java @@ -0,0 +1,29 @@ +/** + * @(#)DyingEventListener.java 2011-3-9 Copyright 2011 it.kedacom.com, Inc. All + * rights reserved. + */ + +package org.comet4j.demo.eventmonitor; + +import org.comet4j.core.event.DyingEvent; +import org.comet4j.core.listener.DyingListener; + +/** + * (用一句话描述类的主要功能) + * @author xiaojinghai + * @date 2011-3-9 + */ + +public class DyingEventListener extends DyingListener { + + /* + * (non-Jsdoc) + * @see org.comet4j.event.Listener#handleEvent(org.comet4j.event.Event) + */ + @Override + public boolean handleEvent(DyingEvent anEvent) { + System.out.println("[DyingEvent]:cId=" + anEvent.getConn().getId()); + return false; + } + +} diff --git a/comet4j-test/src/org/comet4j/demo/eventmonitor/MessageEventListener.java b/comet4j-test/src/org/comet4j/demo/eventmonitor/MessageEventListener.java new file mode 100644 index 0000000..51fb5c1 --- /dev/null +++ b/comet4j-test/src/org/comet4j/demo/eventmonitor/MessageEventListener.java @@ -0,0 +1,31 @@ +/** + * @(#)MessageEventListener.java 2011-3-9 Copyright 2011 it.kedacom.com, Inc. + * All rights reserved. + */ + +package org.comet4j.demo.eventmonitor; + +import org.comet4j.core.event.MessageEvent; +import org.comet4j.core.listener.MessageListener; +import org.comet4j.core.util.JSONUtil; + +/** + * (用一句话描述类的主要功能) + * @author xiaojinghai + * @date 2011-3-9 + */ + +public class MessageEventListener extends MessageListener { + + /* + * (non-Jsdoc) + * @see org.comet4j.event.Listener#handleEvent(org.comet4j.event.Event) + */ + @Override + public boolean handleEvent(MessageEvent anEvent) { + System.out.println("[MessageEvent]:cId=" + anEvent.getConn().getId() + "\ndata=" + + JSONUtil.object2json(anEvent.getData())); + return false; + } + +} diff --git a/comet4j-test/src/org/comet4j/demo/eventmonitor/RemovedEventListener.java b/comet4j-test/src/org/comet4j/demo/eventmonitor/RemovedEventListener.java new file mode 100644 index 0000000..86fe20b --- /dev/null +++ b/comet4j-test/src/org/comet4j/demo/eventmonitor/RemovedEventListener.java @@ -0,0 +1,29 @@ +/** + * @(#)RemovedEventListener.java 2011-3-9 Copyright 2011 it.kedacom.com, Inc. + * All rights reserved. + */ + +package org.comet4j.demo.eventmonitor; + +import org.comet4j.core.event.RemovedEvent; +import org.comet4j.core.listener.RemovedListener; + +/** + * (用一句话描述类的主要功能) + * @author xiaojinghai + * @date 2011-3-9 + */ + +public class RemovedEventListener extends RemovedListener { + + /* + * (non-Jsdoc) + * @see org.comet4j.event.Listener#handleEvent(org.comet4j.event.Event) + */ + @Override + public boolean handleEvent(RemovedEvent anEvent) { + System.out.println("[RemovedEvent]:cId=" + anEvent.getConn().getId()); + return false; + } + +} diff --git a/comet4j-test/src/org/comet4j/demo/eventmonitor/RevivalEventListener.java b/comet4j-test/src/org/comet4j/demo/eventmonitor/RevivalEventListener.java new file mode 100644 index 0000000..856eff8 --- /dev/null +++ b/comet4j-test/src/org/comet4j/demo/eventmonitor/RevivalEventListener.java @@ -0,0 +1,29 @@ +/** + * @(#)RevivalEventListener.java 2011-3-9 Copyright 2011 it.kedacom.com, Inc. + * All rights reserved. + */ + +package org.comet4j.demo.eventmonitor; + +import org.comet4j.core.event.RevivalEvent; +import org.comet4j.core.listener.RevivalListener; + +/** + * (用一句话描述类的主要功能) + * @author xiaojinghai + * @date 2011-3-9 + */ + +public class RevivalEventListener extends RevivalListener { + + /* + * (non-Jsdoc) + * @see org.comet4j.event.Listener#handleEvent(org.comet4j.event.Event) + */ + @Override + public boolean handleEvent(RevivalEvent anEvent) { + System.out.println("[RevivalEvent]:cId=" + anEvent.getConn().getId()); + return false; + } + +} diff --git a/comet4j-test/src/org/comet4j/demo/eventmonitor/Ӧ˵.txt b/comet4j-test/src/org/comet4j/demo/eventmonitor/Ӧ˵.txt new file mode 100644 index 0000000..eb1e6b3 --- /dev/null +++ b/comet4j-test/src/org/comet4j/demo/eventmonitor/Ӧ˵.txt @@ -0,0 +1 @@ +服务端事件监视器,监视服务器组件的事件是否正确触发。 \ No newline at end of file diff --git a/comet4j-test/src/org/comet4j/demo/requestmonitor/AppInit.java b/comet4j-test/src/org/comet4j/demo/requestmonitor/AppInit.java new file mode 100644 index 0000000..43dfc33 --- /dev/null +++ b/comet4j-test/src/org/comet4j/demo/requestmonitor/AppInit.java @@ -0,0 +1,73 @@ +package org.comet4j.demo.requestmonitor; + +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; +import javax.servlet.ServletRequestEvent; +import javax.servlet.ServletRequestListener; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; +import javax.servlet.http.HttpSessionAttributeListener; +import javax.servlet.http.HttpSessionBindingEvent; +import javax.servlet.http.HttpSessionEvent; +import javax.servlet.http.HttpSessionListener; + +import org.comet4j.core.CometContext; +import org.comet4j.core.CometProtocol; + +/** + * 应用初始化 + * @author jinghai.xiao@gmail.com + * @date 2011-2-25 + */ + +public class AppInit implements ServletContextListener, HttpSessionListener, HttpSessionAttributeListener, + ServletRequestListener { + + // ServletContextListener + public void contextInitialized(ServletContextEvent event) { + CometContext cc = CometContext.getInstance(); + cc.registChannel(Constant.AppChannel); + } + + public void contextDestroyed(ServletContextEvent event) { + + } + + // HttpSessionListener + public void sessionCreated(HttpSessionEvent event) { + HttpSession session = event.getSession(); + // System.out.println("Session:" + session.getId() + "创建了"); + } + + public void sessionDestroyed(HttpSessionEvent event) { + HttpSession session = event.getSession(); + // System.out.println("Session:" + session.getId() + "销毁了"); + } + + // HttpSessionAttributeListener + public void attributeAdded(HttpSessionBindingEvent event) { + // System.out.println("Session中增加了:" + event.getName() + "属性"); + } + + public void attributeRemoved(HttpSessionBindingEvent event) { + // System.out.println("Session中删除了:" + event.getName() + "属性"); + } + + public void attributeReplaced(HttpSessionBindingEvent event) { + // System.out.println("Session中修改了:" + event.getName() + "属性"); + } + + // ServletRequestListener + public void requestInitialized(ServletRequestEvent event) { + HttpServletRequest request = (HttpServletRequest) event.getServletRequest(); + System.out.println("请求:" + request.getRequestURI() + ","+CometProtocol.FLAG_ACTION+":" + request.getParameter(CometProtocol.FLAG_ACTION) + ",cId:" + + request.getParameter("cid")); + + } + + public void requestDestroyed(ServletRequestEvent event) { + HttpServletRequest request = (HttpServletRequest) event.getServletRequest(); + // System.out.println("请求完毕:" + request.getRequestURI()); + } + +} diff --git a/comet4j-test/src/org/comet4j/demo/requestmonitor/Constant.java b/comet4j-test/src/org/comet4j/demo/requestmonitor/Constant.java new file mode 100644 index 0000000..15b901a --- /dev/null +++ b/comet4j-test/src/org/comet4j/demo/requestmonitor/Constant.java @@ -0,0 +1,6 @@ +package org.comet4j.demo.requestmonitor; + +public class Constant { + + public static final String AppChannel = "rmonitor"; +} diff --git a/comet4j-test/src/org/comet4j/demo/requestmonitor/Ӧ˵.txt b/comet4j-test/src/org/comet4j/demo/requestmonitor/Ӧ˵.txt new file mode 100644 index 0000000..3ad0566 --- /dev/null +++ b/comet4j-test/src/org/comet4j/demo/requestmonitor/Ӧ˵.txt @@ -0,0 +1 @@ +用于显示每一个请求,帮助排查问题。 \ No newline at end of file diff --git a/comet4j-test/src/org/comet4j/demo/sender/AppInit.java b/comet4j-test/src/org/comet4j/demo/sender/AppInit.java new file mode 100644 index 0000000..34180c5 --- /dev/null +++ b/comet4j-test/src/org/comet4j/demo/sender/AppInit.java @@ -0,0 +1,65 @@ +/** + * @(#)WalleAPPListenner.java 2011-2-25 Copyright 2011 it.kedacom.com, Inc. All + * rights reserved. + */ + +package org.comet4j.demo.sender; + +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; + +import org.comet4j.core.CometContext; +import org.comet4j.core.CometEngine; + +/** + * (用一句话描述类的主要功能) + * @author xiaojinghai + * @date 2011-2-25 + */ + +public class AppInit implements ServletContextListener { + + /** + * @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent) + */ + + // ServletContextListener + public void contextInitialized(ServletContextEvent arg0) { + CometContext cc = CometContext.getInstance(); + cc.registChannel(Constant.AppChannel); + Thread helloAppModule = new Thread(new HelloAppModule(), "Sender App Module"); + helloAppModule.setDaemon(true); + helloAppModule.start(); + + } + + class HelloAppModule implements Runnable { + + private int inc = 0; + + public void run() { + while (true) { + try { + Thread.sleep(5000); + } catch (Exception ex) { + ex.printStackTrace(); + } + CometEngine engine = CometContext.getInstance().getEngine(); + engine.sendTo(Constant.AppChannel, engine.getConnections(), "This is the SenderAppModule Test,来自Sender" + + inc); + inc++; + } + } + } + + /** + * @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet.ServletContextEvent) + */ + + // ServletContextListener + public void contextDestroyed(ServletContextEvent arg0) { + // TODO 该方法尚未实现 + + } + +} diff --git a/comet4j-test/src/org/comet4j/demo/sender/Constant.java b/comet4j-test/src/org/comet4j/demo/sender/Constant.java new file mode 100644 index 0000000..7c7a77c --- /dev/null +++ b/comet4j-test/src/org/comet4j/demo/sender/Constant.java @@ -0,0 +1,6 @@ +package org.comet4j.demo.sender; + +public class Constant { + + public static final String AppChannel = "sender"; +} diff --git a/comet4j-test/src/org/comet4j/demo/sender/Ӧ˵.txt b/comet4j-test/src/org/comet4j/demo/sender/Ӧ˵.txt new file mode 100644 index 0000000..e232a10 --- /dev/null +++ b/comet4j-test/src/org/comet4j/demo/sender/Ӧ˵.txt @@ -0,0 +1 @@ +用于模拟用户使用框架发送信息 \ No newline at end of file