-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
- <classpathentry kind="src" path="src"/>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
- <classpathentry kind="lib" path="war/WEB-INF/lib/appengine-api-1.0-sdk-1.2.0.jar"/>
- <classpathentry kind="lib" path="war/WEB-INF/lib/cglib-2.2.jar"/>
- <classpathentry kind="lib" path="war/WEB-INF/lib/datanucleus-appengine-1.0.0.final.jar"/>
- <classpathentry kind="lib" path="war/WEB-INF/lib/datanucleus-core-1.1.0.jar"/>
- <classpathentry kind="lib" path="war/WEB-INF/lib/datanucleus-jpa-1.1.0.jar"/>
- <classpathentry kind="lib" path="war/WEB-INF/lib/geronimo-jpa_3.0_spec-1.1.1.jar"/>
- <classpathentry kind="lib" path="war/WEB-INF/lib/geronimo-jta_1.1_spec-1.1.1.jar"/>
- <classpathentry kind="lib" path="war/WEB-INF/lib/guice-1.0.jar"/>
- <classpathentry kind="lib" path="war/WEB-INF/lib/jdo2-api-2.3-SNAPSHOT.jar"/>
- <classpathentry kind="lib" path="war/WEB-INF/lib/logback-classic-0.9.15.jar"/>
- <classpathentry kind="lib" path="war/WEB-INF/lib/logback-core-0.9.15.jar"/>
- <classpathentry kind="lib" path="war/WEB-INF/lib/slf4j-api-1.5.6.jar"/>
- <classpathentry kind="lib" path="war/WEB-INF/lib/wicket-1.3.5.jar"/>
- <classpathentry kind="lib" path="war/WEB-INF/lib/wicket-extensions-1.3.5.jar"/>
- <classpathentry kind="lib" path="war/WEB-INF/lib/wicket-guice-1.3.5.jar"/>
- <classpathentry kind="lib" path="war/WEB-INF/lib/wicket-ioc-1.3.5.jar"/>
- <classpathentry kind="con" path="com.google.appengine.eclipse.core.GAE_CONTAINER"/>
- <classpathentry kind="output" path="war/WEB-INF/classes"/>
-</classpath>
+<?xml version="1.0" encoding="UTF-8"?>\r
+<classpath>\r
+ <classpathentry kind="src" path="src"/>\r
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>\r
+ <classpathentry kind="lib" path="war/WEB-INF/lib/appengine-api-1.0-sdk-1.2.0.jar"/>\r
+ <classpathentry kind="lib" path="war/WEB-INF/lib/cglib-2.2.jar"/>\r
+ <classpathentry kind="lib" path="war/WEB-INF/lib/datanucleus-appengine-1.0.0.final.jar"/>\r
+ <classpathentry kind="lib" path="war/WEB-INF/lib/datanucleus-core-1.1.0.jar"/>\r
+ <classpathentry kind="lib" path="war/WEB-INF/lib/datanucleus-jpa-1.1.0.jar"/>\r
+ <classpathentry kind="lib" path="war/WEB-INF/lib/geronimo-jpa_3.0_spec-1.1.1.jar"/>\r
+ <classpathentry kind="lib" path="war/WEB-INF/lib/geronimo-jta_1.1_spec-1.1.1.jar"/>\r
+ <classpathentry kind="lib" path="war/WEB-INF/lib/guice-1.0.jar"/>\r
+ <classpathentry kind="lib" path="war/WEB-INF/lib/jdo2-api-2.3-SNAPSHOT.jar"/>\r
+ <classpathentry kind="lib" path="war/WEB-INF/lib/logback-classic-0.9.15.jar"/>\r
+ <classpathentry kind="lib" path="war/WEB-INF/lib/logback-core-0.9.15.jar"/>\r
+ <classpathentry kind="lib" path="war/WEB-INF/lib/slf4j-api-1.5.6.jar"/>\r
+ <classpathentry kind="lib" path="war/WEB-INF/lib/wicket-1.3.5.jar"/>\r
+ <classpathentry kind="lib" path="war/WEB-INF/lib/wicket-extensions-1.3.5.jar"/>\r
+ <classpathentry kind="lib" path="war/WEB-INF/lib/wicket-guice-1.3.5.jar"/>\r
+ <classpathentry kind="lib" path="war/WEB-INF/lib/wicket-ioc-1.3.5.jar"/>\r
+ <classpathentry kind="con" path="com.google.appengine.eclipse.core.GAE_CONTAINER"/>\r
+ <classpathentry kind="output" path="war/WEB-INF/classes"/>\r
+</classpath>\r
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
- <name>CloudMangaNetwork</name>
- <comment></comment>
- <projects>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>com.google.appengine.eclipse.core.enhancerbuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>com.google.appengine.eclipse.core.projectValidator</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>com.google.gdt.eclipse.core.webAppProjectValidator</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>wicketbench.associatedMarkupAuditor</name>
- <arguments>
- </arguments>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.jdt.core.javanature</nature>
- <nature>com.google.appengine.eclipse.core.gaeNature</nature>
- <nature>com.google.gdt.eclipse.core.webAppNature</nature>
- <nature>wicketbench.wicketnature</nature>
- <nature>com.sysdeo.eclipse.tomcat.tomcatnature</nature>
- </natures>
-</projectDescription>
+<?xml version="1.0" encoding="UTF-8"?>\r
+<projectDescription>\r
+ <name>CloudMangaNetwork</name>\r
+ <comment></comment>\r
+ <projects>\r
+ </projects>\r
+ <buildSpec>\r
+ <buildCommand>\r
+ <name>org.eclipse.jdt.core.javabuilder</name>\r
+ <arguments>\r
+ </arguments>\r
+ </buildCommand>\r
+ <buildCommand>\r
+ <name>com.google.appengine.eclipse.core.enhancerbuilder</name>\r
+ <arguments>\r
+ </arguments>\r
+ </buildCommand>\r
+ <buildCommand>\r
+ <name>com.google.appengine.eclipse.core.projectValidator</name>\r
+ <arguments>\r
+ </arguments>\r
+ </buildCommand>\r
+ <buildCommand>\r
+ <name>com.google.gdt.eclipse.core.webAppProjectValidator</name>\r
+ <arguments>\r
+ </arguments>\r
+ </buildCommand>\r
+ <buildCommand>\r
+ <name>wicketbench.associatedMarkupAuditor</name>\r
+ <arguments>\r
+ </arguments>\r
+ </buildCommand>\r
+ </buildSpec>\r
+ <natures>\r
+ <nature>org.eclipse.jdt.core.javanature</nature>\r
+ <nature>com.google.appengine.eclipse.core.gaeNature</nature>\r
+ <nature>com.google.gdt.eclipse.core.webAppNature</nature>\r
+ <nature>wicketbench.wicketnature</nature>\r
+ <nature>com.sysdeo.eclipse.tomcat.tomcatnature</nature>\r
+ </natures>\r
+</projectDescription>\r
-#Sat May 16 21:17:03 JST 2009
-eclipse.preferences.version=1
-encoding//src/jp/sourceforge/manganetwork/page/HomePage.html=UTF-8
-encoding//src/jp/sourceforge/manganetwork/page/LoginPage.html=UTF-8
-encoding//src/jp/sourceforge/manganetwork/page/LoginPage.java=UTF-8
-encoding//src/jp/sourceforge/manganetwork/page/MenuApplicationPage.html=UTF-8
-encoding/<project>=UTF-8
+#Sat May 16 21:17:03 JST 2009\r
+eclipse.preferences.version=1\r
+encoding//src/jp/sourceforge/manganetwork/page/HomePage.html=UTF-8\r
+encoding//src/jp/sourceforge/manganetwork/page/LoginPage.html=UTF-8\r
+encoding//src/jp/sourceforge/manganetwork/page/LoginPage.java=UTF-8\r
+encoding//src/jp/sourceforge/manganetwork/page/MenuApplicationPage.html=UTF-8\r
+encoding/<project>=UTF-8\r
-#Sat May 16 19:00:18 JST 2009
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.5
+#Sat May 16 19:00:18 JST 2009\r
+eclipse.preferences.version=1\r
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled\r
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5\r
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve\r
+org.eclipse.jdt.core.compiler.compliance=1.5\r
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate\r
+org.eclipse.jdt.core.compiler.debug.localVariable=generate\r
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate\r
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error\r
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error\r
+org.eclipse.jdt.core.compiler.source=1.5\r
-<?xml version="1.0" encoding="utf-8"?>
-<jdoconfig xmlns="http://java.sun.com/xml/ns/jdo/jdoconfig"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:noNamespaceSchemaLocation="http://java.sun.com/xml/ns/jdo/jdoconfig">
-
- <persistence-manager-factory name="transactions-optional">
- <property name="javax.jdo.PersistenceManagerFactoryClass"
- value="org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManagerFactory"/>
- <property name="javax.jdo.option.ConnectionURL" value="appengine"/>
- <property name="javax.jdo.option.NontransactionalRead" value="true"/>
- <property name="javax.jdo.option.NontransactionalWrite" value="true"/>
- <property name="javax.jdo.option.RetainValues" value="true"/>
- <property name="datanucleus.appengine.autoCreateDatastoreTxns" value="true"/>
- </persistence-manager-factory>
-</jdoconfig>
+<?xml version="1.0" encoding="utf-8"?>\r
+<jdoconfig xmlns="http://java.sun.com/xml/ns/jdo/jdoconfig"\r
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\r
+ xsi:noNamespaceSchemaLocation="http://java.sun.com/xml/ns/jdo/jdoconfig">\r
+\r
+ <persistence-manager-factory name="transactions-optional">\r
+ <property name="javax.jdo.PersistenceManagerFactoryClass"\r
+ value="org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManagerFactory"/>\r
+ <property name="javax.jdo.option.ConnectionURL" value="appengine"/>\r
+ <property name="javax.jdo.option.NontransactionalRead" value="true"/>\r
+ <property name="javax.jdo.option.NontransactionalWrite" value="true"/>\r
+ <property name="javax.jdo.option.RetainValues" value="true"/>\r
+ <property name="datanucleus.appengine.autoCreateDatastoreTxns" value="true"/>\r
+ </persistence-manager-factory>\r
+</jdoconfig>\r
-package jp.sourceforge.manganetwork;
-
-import java.io.IOException;
-import javax.servlet.http.*;
-
-@SuppressWarnings("serial")
-public class CloudMangaNetworkServlet extends HttpServlet {
- public void doGet(HttpServletRequest req, HttpServletResponse resp)
- throws IOException {
- resp.setContentType("text/plain");
- resp.getWriter().println("Hello, world");
- }
-}
+package jp.sourceforge.manganetwork;\r
+\r
+import java.io.IOException;\r
+import javax.servlet.http.*;\r
+\r
+@SuppressWarnings("serial")\r
+public class CloudMangaNetworkServlet extends HttpServlet {\r
+ public void doGet(HttpServletRequest req, HttpServletResponse resp)\r
+ throws IOException {\r
+ resp.setContentType("text/plain");\r
+ resp.getWriter().println("Hello, world");\r
+ }\r
+}\r
-package jp.sourceforge.manganetwork;
-
-import org.apache.wicket.application.ReloadingClassLoader;
-
-public class ReloadingWicketFilter extends org.apache.wicket.protocol.http.ReloadingWicketFilter {
- static
- {
- ReloadingClassLoader.includePattern("jp.sourceforge.*");
- }
-
-}
+package jp.sourceforge.manganetwork;\r
+\r
+import org.apache.wicket.application.ReloadingClassLoader;\r
+\r
+public class ReloadingWicketFilter extends org.apache.wicket.protocol.http.ReloadingWicketFilter {\r
+ static\r
+ {\r
+ ReloadingClassLoader.includePattern("jp.sourceforge.*");\r
+ }\r
+\r
+}\r
-package jp.sourceforge.manganetwork;
-
-import jp.sourceforge.manganetwork.page.AdminHomePage;
-import jp.sourceforge.manganetwork.page.LoginPage;
-
-import org.apache.wicket.protocol.http.HttpSessionStore;
-import org.apache.wicket.protocol.http.WebApplication;
-import org.apache.wicket.session.ISessionStore;
-
-public class WicketApplication extends WebApplication {
- @Override
- public Class getHomePage() {
- return LoginPage.class;
- }
-
- @Override
- protected ISessionStore newSessionStore() {
- return new HttpSessionStore(this);
- }
-
- @Override
- protected void init() {
- super.init();
- setEncoding();
-
- mountBookmarkablePage("/admin", AdminHomePage.class);
- }
-
- private void setEncoding() {
- getRequestCycleSettings().setResponseRequestEncoding("UTF-8");
- getMarkupSettings().setDefaultMarkupEncoding("UTF-8");
- }
-
-
-}
+package jp.sourceforge.manganetwork;\r
+\r
+import jp.sourceforge.manganetwork.page.AdminHomePage;\r
+import jp.sourceforge.manganetwork.page.LoginPage;\r
+\r
+import org.apache.wicket.protocol.http.HttpSessionStore;\r
+import org.apache.wicket.protocol.http.WebApplication;\r
+import org.apache.wicket.session.ISessionStore;\r
+\r
+public class WicketApplication extends WebApplication {\r
+ @Override\r
+ public Class getHomePage() {\r
+ return LoginPage.class;\r
+ }\r
+\r
+ @Override\r
+ protected ISessionStore newSessionStore() {\r
+ return new HttpSessionStore(this);\r
+ }\r
+\r
+ @Override\r
+ protected void init() {\r
+ super.init();\r
+ setEncoding();\r
+\r
+ mountBookmarkablePage("/admin", AdminHomePage.class);\r
+ }\r
+\r
+ private void setEncoding() {\r
+ getRequestCycleSettings().setResponseRequestEncoding("UTF-8");\r
+ getMarkupSettings().setDefaultMarkupEncoding("UTF-8");\r
+ }\r
+ \r
+ \r
+}\r
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
- <link rel="stylesheet" type="text/css" href="layout/style.css">
- <title></title>
- </head>
- <body>
- <div id="header">
- <h1>マンガネットワーク</h1>
- </div>
- <p />
- <div id="menu">
- <ul class="menu">
- <li><a href="/UserListPage">ユーザマスタ管理</a></li>
- <li>グループマスタ管理</li>
- <li>マンガマスタ管理</li>
- </ul>
- <p style="clear: both;"/>
- </div>
- <hr style="border: #00306b 1px solid;"/>
- <div id="body">
- <wicket:child />
- </div>
- <p/>
- <div id="footer">
- <span style="text-align: center;">powered by Wicket</span>
- </div>
- </body>
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"\r
+ "http://www.w3.org/TR/html4/loose.dtd">\r
+<html>\r
+ <head>\r
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">\r
+ <link rel="stylesheet" type="text/css" href="layout/style.css">\r
+ <title></title>\r
+ </head>\r
+ <body>\r
+ <div id="header">\r
+ <h1>マンガネットワーク</h1>\r
+ </div>\r
+ <p />\r
+ <div id="menu">\r
+ <ul class="menu">\r
+ <li><a href="/UserListPage">ユーザマスタ管理</a></li>\r
+ <li>グループマスタ管理</li>\r
+ <li>マンガマスタ管理</li>\r
+ </ul>\r
+ <p style="clear: both;"/>\r
+ </div>\r
+ <hr style="border: #00306b 1px solid;"/>\r
+ <div id="body"> \r
+ <wicket:child />\r
+ </div>\r
+ <p/>\r
+ <div id="footer">\r
+ <span style="text-align: center;">powered by Wicket</span>\r
+ </div>\r
+ </body>\r
</html>
\ No newline at end of file
-package jp.sourceforge.manganetwork.page;
-
-
-/**
- * @author nobu
- */
-public class AdminHomePage extends ApplicationPage {
-
-}
-
+package jp.sourceforge.manganetwork.page;\r
+\r
+\r
+/**\r
+ * @author nobu\r
+ */\r
+public class AdminHomePage extends ApplicationPage {\r
+\r
+}\r
+\r
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
- <wicket:link>
- <link rel="stylesheet" type="text/css" href="stylesheets/style.css">
- </wicket:link>
- <title></title>
- </head>
- <body>
- <div id="feedback" wicket:id="feedback" />
- <div id="header">
- <h1>マンガネットワーク</h1>
- </div>
- <div id="body">
- <wicket:child />
- </div>
- <p/>
- <div id="footer">
- <span style="text-align: center;">powered by Wicket</span>
- </div>
- </body>
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"\r
+ "http://www.w3.org/TR/html4/loose.dtd">\r
+<html>\r
+ <head>\r
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">\r
+ <wicket:link>\r
+ <link rel="stylesheet" type="text/css" href="stylesheets/style.css">\r
+ </wicket:link>\r
+ <title></title>\r
+ </head>\r
+ <body>\r
+ <div id="feedback" wicket:id="feedback" />\r
+ <div id="header">\r
+ <h1>マンガネットワーク</h1>\r
+ </div>\r
+ <div id="body"> \r
+ <wicket:child />\r
+ </div>\r
+ <p/>\r
+ <div id="footer">\r
+ <span style="text-align: center;">powered by Wicket</span>\r
+ </div>\r
+ </body>\r
</html>
\ No newline at end of file
-package jp.sourceforge.manganetwork.page;
-
-import org.apache.wicket.markup.html.WebPage;
-import org.apache.wicket.markup.html.panel.FeedbackPanel;
-
-public class ApplicationPage extends WebPage {
-
- public ApplicationPage()
- {
- add( new FeedbackPanel("feedback") );
- }
-
-}
+package jp.sourceforge.manganetwork.page;\r
+\r
+import org.apache.wicket.markup.html.WebPage;\r
+import org.apache.wicket.markup.html.panel.FeedbackPanel;\r
+\r
+public class ApplicationPage extends WebPage {\r
+\r
+ public ApplicationPage()\r
+ {\r
+ add( new FeedbackPanel("feedback") );\r
+ }\r
+ \r
+}\r
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-<body>
- <wicket:extend>
- Home
- <span wicket:id="label" />
- </wicket:extend>
-</body>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"\r
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
+\r
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<body>\r
+ <wicket:extend>\r
+ Home\r
+ <span wicket:id="label" />\r
+ </wicket:extend>\r
+</body>\r
</html>
\ No newline at end of file
-package jp.sourceforge.manganetwork.page;
-
-import org.apache.wicket.markup.html.basic.Label;
-
-/**
- * @author nobu
- */
-public class HomePage extends MenuApplicationPage {
-
- public HomePage()
- {
- add(new Label("label", "Hello1"));
- }
-}
-
+package jp.sourceforge.manganetwork.page;\r
+\r
+import org.apache.wicket.markup.html.basic.Label;\r
+\r
+/**\r
+ * @author nobu\r
+ */\r
+public class HomePage extends MenuApplicationPage {\r
+\r
+ public HomePage()\r
+ {\r
+ add(new Label("label", "Hello1"));\r
+ }\r
+}\r
+\r
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-<body>
- <wicket:extend>
-
- <form wicket:id="form">
- <table border="0">
- <tr>
- <td>ユーザ名</td>
- <td><input type="text" wicket:id="userName" /></td>
- </tr>
- <tr>
- <td>パスワード</td>
- <td><input type="password" wicket:id="password" /></td>
- </tr>
- <tr>
- <td colspan="2"><input type="submit" value="ログイン" /></td>
- </tr>
- </table>
- </form>
- </wicket:extend>
-</body>
-</html>
-
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"\r
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
+\r
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<body>\r
+ <wicket:extend>\r
+ \r
+ <form wicket:id="form">\r
+ <table border="0">\r
+ <tr>\r
+ <td>ユーザ名</td>\r
+ <td><input type="text" wicket:id="userName" /></td>\r
+ </tr>\r
+ <tr>\r
+ <td>パスワード</td>\r
+ <td><input type="password" wicket:id="password" /></td>\r
+ </tr>\r
+ <tr>\r
+ <td colspan="2"><input type="submit" value="ログイン" /></td>\r
+ </tr>\r
+ </table>\r
+ </form> \r
+ </wicket:extend>\r
+</body>\r
+</html>\r
+\r
-package jp.sourceforge.manganetwork.page;
-
-import org.apache.wicket.markup.html.form.Form;
-import org.apache.wicket.markup.html.form.PasswordTextField;
-import org.apache.wicket.markup.html.form.TextField;
-import org.apache.wicket.model.Model;
-
-/**
- * @author nobu
- */
-public class LoginPage extends ApplicationPage {
-
- public LoginPage()
- {
- final TextField userNameTextField = new TextField("userName", new Model());
- final PasswordTextField passwordTextField = new PasswordTextField("password", new Model());
-
- Form form = new Form("form")
- {
- @Override
- protected void onSubmit() {
- super.onSubmit();
-
- if (userNameTextField.getModelObjectAsString().equals("admin") &&
- passwordTextField.getModelObjectAsString().equals("admin") )
- {
- setResponsePage(HomePage.class);
- }
- else
- {
- error("ログインに失敗しました。");
- }
- }
- };
- this.add(form);
-
- form.add(userNameTextField);
- form.add(passwordTextField);
- }
-}
-
+package jp.sourceforge.manganetwork.page;\r
+\r
+import org.apache.wicket.markup.html.form.Form;\r
+import org.apache.wicket.markup.html.form.PasswordTextField;\r
+import org.apache.wicket.markup.html.form.TextField;\r
+import org.apache.wicket.model.Model;\r
+\r
+/**\r
+ * @author nobu\r
+ */\r
+public class LoginPage extends ApplicationPage {\r
+\r
+ public LoginPage()\r
+ {\r
+ final TextField userNameTextField = new TextField("userName", new Model());\r
+ final PasswordTextField passwordTextField = new PasswordTextField("password", new Model());\r
+\r
+ Form form = new Form("form")\r
+ {\r
+ @Override\r
+ protected void onSubmit() {\r
+ super.onSubmit();\r
+ \r
+ if (userNameTextField.getModelObjectAsString().equals("admin") &&\r
+ passwordTextField.getModelObjectAsString().equals("admin") )\r
+ {\r
+ setResponsePage(HomePage.class);\r
+ }\r
+ else\r
+ {\r
+ error("ログインに失敗しました。");\r
+ }\r
+ } \r
+ };\r
+ this.add(form);\r
+\r
+ form.add(userNameTextField);\r
+ form.add(passwordTextField);\r
+ }\r
+}\r
+\r
-<html>
- <title>マンガネットワーク</title>
- <head>
- <wicket:link>
- <script type="text/javascript" src="javascripts/spinelz_lib/prototype.js"></script>
- <script type="text/javascript" src="javascripts/spinelz_lib/scriptaculous.js"></script>
- <script type="text/javascript" src="javascripts/spinelz_lib/spinelz_util.js"></script>
- <script type="text/javascript" src="javascripts/spinelz/menubar.js"></script>
- <link rel="stylesheet" href="stylesheets/spinelz/menubar.css" type="text/css" />
- </wicket:link>
- </head>
- <body>
- <div id="header">
- <h1>マンガネットワーク</h1>
- </div>
- <div id="menucontents">
- <div>ホーム</div>
- <div>本
- <div>検索</div>
- <div>登録</div>
- </div>
- <div>ワークフロー
- <div>検索</div>
- <div>登録</div>
- </div>
- <div>連絡
- <div>登録</div>
- </div>
- <div>ユーザ情報
- <div>参照</div>
- </div>
- </div>
-
- <script type="text/javascript">
- var menubar = new MenuBar('menucontents');
- var foo = function() {
- alert('foo function was called.');
- }
- </script>
-
- <wicket:child />
-
- </body>
-</html>
+<html>\r
+ <title>マンガネットワーク</title>\r
+ <head>\r
+ <wicket:link>\r
+ <script type="text/javascript" src="javascripts/spinelz_lib/prototype.js"></script>\r
+ <script type="text/javascript" src="javascripts/spinelz_lib/scriptaculous.js"></script>\r
+ <script type="text/javascript" src="javascripts/spinelz_lib/spinelz_util.js"></script>\r
+ <script type="text/javascript" src="javascripts/spinelz/menubar.js"></script>\r
+ <link rel="stylesheet" href="stylesheets/spinelz/menubar.css" type="text/css" />\r
+ </wicket:link>\r
+ </head>\r
+ <body>\r
+ <div id="header">\r
+ <h1>マンガネットワーク</h1>\r
+ </div>\r
+ <div id="menucontents">\r
+ <div>ホーム</div>\r
+ <div>本\r
+ <div>検索</div>\r
+ <div>登録</div>\r
+ </div>\r
+ <div>ワークフロー\r
+ <div>検索</div>\r
+ <div>登録</div>\r
+ </div>\r
+ <div>連絡\r
+ <div>登録</div>\r
+ </div>\r
+ <div>ユーザ情報\r
+ <div>参照</div>\r
+ </div>\r
+ </div>\r
+\r
+ <script type="text/javascript">\r
+ var menubar = new MenuBar('menucontents');\r
+ var foo = function() {\r
+ alert('foo function was called.');\r
+ }\r
+ </script>\r
+\r
+ <wicket:child />\r
+\r
+ </body>\r
+</html>\r
-package jp.sourceforge.manganetwork.page;
-
-import org.apache.wicket.markup.html.WebPage;
-
-public class MenuApplicationPage extends WebPage {
-
-}
+package jp.sourceforge.manganetwork.page;\r
+\r
+import org.apache.wicket.markup.html.WebPage;\r
+\r
+public class MenuApplicationPage extends WebPage {\r
+\r
+}\r
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
- <link rel="stylesheet" type="text/css" href="css/test.css">
- <title></title>
- </head>
- <body>
- <div id="header">
- <h1>マンガネットワーク</h1>
- </div>
- <div id="menu">
- <ul class="menu">
- <li><a href="/UserListPage">ユーザマスタ管理</a></li>
- <li>グループマスタ管理</li>
- <li>マンガマスタ管理</li>
- </ul>
- <p style="clear: both;"/>
- </div>
- <p />
- <div id="body">
- <wicket:child />
- </div>
-
- <div id="footer">
-
- </div>
- </body>
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"\r
+ "http://www.w3.org/TR/html4/loose.dtd">\r
+<html>\r
+ <head>\r
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">\r
+ <link rel="stylesheet" type="text/css" href="css/test.css">\r
+ <title></title>\r
+ </head>\r
+ <body>\r
+ <div id="header">\r
+ <h1>マンガネットワーク</h1>\r
+ </div>\r
+ <div id="menu">\r
+ <ul class="menu">\r
+ <li><a href="/UserListPage">ユーザマスタ管理</a></li>\r
+ <li>グループマスタ管理</li>\r
+ <li>マンガマスタ管理</li>\r
+ </ul>\r
+ <p style="clear: both;"/>\r
+ </div>\r
+ <p />\r
+ <div id="body"> \r
+ <wicket:child />\r
+ </div>\r
+ \r
+ <div id="footer">\r
+ \r
+ </div>\r
+ </body>\r
</html>
\ No newline at end of file
-// Copyright (c) 2005 spinelz.org (http://script.spinelz.org)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-
-Accordion = Class.create();
-Accordion.className = {
- accordion : 'accordion',
- panel: 'accordion_panel',
- tab : 'accordion_tab',
- tabLeftInactive : 'accordion_tabLeftInactive',
- tabLeftActive: 'accordion_tabLeftActive',
- tabMiddleInactive : 'accordion_tabMiddleInactive',
- tabMiddleActive : 'accordion_tabMiddleActive',
- tabRightInactive : 'accordion_tabRightInactive',
- tabRightActive : 'accordion_tabRightActive'
-}
-
-Accordion.prototype = {
-
- initialize: function(element) {
- var options = Object.extend({
- cssPrefix: 'custom_',
- selected: 1,
- duration: 0.5
- }, arguments[1] || {});
-
- this.options = options;
- this.element = $(element);
- Element.setStyle(this.element, {visibility: 'hidden'});
- Element.hide(this.element);
-
- var customCss = CssUtil.appendPrefix(this.options.cssPrefix, Accordion.className);
- this.classNames = new CssUtil([Accordion.className, customCss]);
-
- this.classNames.addClassNames(this.element, 'accordion');
-
- this.selected = (this.options.selected > 0) ? this.options.selected - 1 : 0 ;
- this.start();
-
- Element.setStyle(this.element, {visibility: 'visible'});
- Element.show(this.element);
- this.effecting = false;
- },
-
- start: function() {
- this.tabs = [];
- this.panels = [];
- this.panelList = [];
-
- this.tabId = this.element.id + '_tab';
- this.tabLeftId = this.tabId + '_left';
- this.tabMiddleId = this.tabId + '_middle';
- this.tabRightId = this.tabId + '_right';
- this.panelId = this.element.id + '_panel';
-
- this.build();
- },
-
- build: function() {
- Element.cleanWhitespace(this.element);
- this.panelList = this.element.childNodes;
-
- for (var i = 0; i < this.panelList.length; i++) {
- if (this.panelList[i].nodeType != 1) {
- Element.remove(this.panelList[i]);
- i--;
- continue;
- }
- Element.cleanWhitespace(this.panelList[i]);
- var navSet = this.panelList[i].childNodes;
- this.buildTab(navSet[0], i);
- this.buildPanel(navSet[0], i);
- }
- this.selectTab();
- },
-
-
- buildTab: function(tabTitle, i) {
- var tab = Builder.node('div', {id:this.tabId + i});
- this.classNames.addClassNames(tab, 'tab');
- var tabLeft = Builder.node('div', {id:this.tabLeftId + i});
- var tabMiddle = Builder.node('div', {id:this.tabMiddleId + i});
- tabMiddle.appendChild(tabTitle);
- var tabRight = Builder.node('div', {id:this.tabRightId + i});
-
- tab.appendChild(tabLeft);
- tab.appendChild(tabMiddle);
- tab.appendChild(tabRight);
- Event.observe(tab, 'click', this.selectTab.bindAsEventListener(this));
-
- this.tabs[i] = tab;
- this.setTabInactive(tab);
- this.panelList[i].appendChild(tab);
- },
-
- buildPanel: function(panelContent, i) {
- var panel = Builder.node('div', {id:this.panelId + i});
- this.classNames.addClassNames(panel, 'panel');
-
- panel.appendChild(panelContent);
- Element.hide(panel);
- this.panels[i] = panel;
- this.panelList[i].appendChild(panel);
- },
-
- selectTab: function(e) {
- if (this.effecting) return;
- if (!e) {
- if (!this.panels[this.selected]) this.selected = 0;
- Element.show(this.panels[this.selected]);
- this.setTabActive(this.tabs[this.selected]);
- return;
- }
-
- var targetElement = Event.element(e);
- var targetIndex = this.getTargetIndex(targetElement);
- if (targetIndex == this.selected) return;
-
- var currentPanel = this.panels[this.selected];
- var targetPanel = this.panels[targetIndex];
- this.setTabInactive(this.tabs[this.selected]);
- this.setTabActive(this.tabs[targetIndex]);
-
- this.effecting = true;
- new Effect.Parallel(
- [
- new Effect.BlindUp(currentPanel, {sync: true}),
- new Effect.BlindDown(targetPanel, {sync: true})
- ],
- {
- duration: this.options.duration,
- beforeStart: function() { this.effecting = true; }.bind(this),
- afterFinish: function() { this.effecting = false; }.bind(this)
- }
- );
-
- this.selected = targetIndex;
- },
-
- setTabActive: function(tab) {
- var tabChildren = tab.childNodes;
-
- this.classNames.refreshClassNames(tabChildren[0], 'tabLeftActive');
- this.classNames.refreshClassNames(tabChildren[1], 'tabMiddleActive');
- this.classNames.refreshClassNames(tabChildren[2], 'tabRightActive');
- },
-
- setTabInactive: function(tab) {
- var tabChildren = tab.childNodes;
-
- this.classNames.refreshClassNames(tabChildren[0], 'tabLeftInactive');
- this.classNames.refreshClassNames(tabChildren[1], 'tabMiddleInactive');
- this.classNames.refreshClassNames(tabChildren[2], 'tabRightInactive');
- },
-
- getTargetIndex: function(element) {
- while(element) {
- if (element.id && element.id.indexOf(this.tabId, 0) >= 0) {
- var index = element.id.substring(this.tabId.length);
- if (!isNaN(index)) {
- return index;
- }
- }
- element = element.parentNode;
- }
- }
-}
+// Copyright (c) 2005 spinelz.org (http://script.spinelz.org)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+\r
+Accordion = Class.create();\r
+Accordion.className = {\r
+ accordion : 'accordion',\r
+ panel: 'accordion_panel',\r
+ tab : 'accordion_tab',\r
+ tabLeftInactive : 'accordion_tabLeftInactive',\r
+ tabLeftActive: 'accordion_tabLeftActive',\r
+ tabMiddleInactive : 'accordion_tabMiddleInactive',\r
+ tabMiddleActive : 'accordion_tabMiddleActive',\r
+ tabRightInactive : 'accordion_tabRightInactive',\r
+ tabRightActive : 'accordion_tabRightActive'\r
+}\r
+\r
+Accordion.prototype = {\r
+ \r
+ initialize: function(element) {\r
+ var options = Object.extend({\r
+ cssPrefix: 'custom_',\r
+ selected: 1,\r
+ duration: 0.5\r
+ }, arguments[1] || {});\r
+ \r
+ this.options = options;\r
+ this.element = $(element);\r
+ Element.setStyle(this.element, {visibility: 'hidden'});\r
+ Element.hide(this.element);\r
+\r
+ var customCss = CssUtil.appendPrefix(this.options.cssPrefix, Accordion.className);\r
+ this.classNames = new CssUtil([Accordion.className, customCss]);\r
+ \r
+ this.classNames.addClassNames(this.element, 'accordion');\r
+ \r
+ this.selected = (this.options.selected > 0) ? this.options.selected - 1 : 0 ;\r
+ this.start();\r
+ \r
+ Element.setStyle(this.element, {visibility: 'visible'});\r
+ Element.show(this.element);\r
+ this.effecting = false;\r
+ },\r
+ \r
+ start: function() {\r
+ this.tabs = [];\r
+ this.panels = [];\r
+ this.panelList = [];\r
+\r
+ this.tabId = this.element.id + '_tab';\r
+ this.tabLeftId = this.tabId + '_left';\r
+ this.tabMiddleId = this.tabId + '_middle';\r
+ this.tabRightId = this.tabId + '_right';\r
+ this.panelId = this.element.id + '_panel';\r
+ \r
+ this.build(); \r
+ }, \r
+ \r
+ build: function() {\r
+ Element.cleanWhitespace(this.element);\r
+ this.panelList = this.element.childNodes;\r
+ \r
+ for (var i = 0; i < this.panelList.length; i++) {\r
+ if (this.panelList[i].nodeType != 1) {\r
+ Element.remove(this.panelList[i]);\r
+ i--;\r
+ continue;\r
+ }\r
+ Element.cleanWhitespace(this.panelList[i]);\r
+ var navSet = this.panelList[i].childNodes;\r
+ this.buildTab(navSet[0], i);\r
+ this.buildPanel(navSet[0], i);\r
+ }\r
+ this.selectTab();\r
+ },\r
+ \r
+ \r
+ buildTab: function(tabTitle, i) { \r
+ var tab = Builder.node('div', {id:this.tabId + i});\r
+ this.classNames.addClassNames(tab, 'tab'); \r
+ var tabLeft = Builder.node('div', {id:this.tabLeftId + i});\r
+ var tabMiddle = Builder.node('div', {id:this.tabMiddleId + i});\r
+ tabMiddle.appendChild(tabTitle);\r
+ var tabRight = Builder.node('div', {id:this.tabRightId + i});\r
+ \r
+ tab.appendChild(tabLeft);\r
+ tab.appendChild(tabMiddle);\r
+ tab.appendChild(tabRight);\r
+ Event.observe(tab, 'click', this.selectTab.bindAsEventListener(this));\r
+\r
+ this.tabs[i] = tab;\r
+ this.setTabInactive(tab);\r
+ this.panelList[i].appendChild(tab);\r
+ },\r
+ \r
+ buildPanel: function(panelContent, i) {\r
+ var panel = Builder.node('div', {id:this.panelId + i});\r
+ this.classNames.addClassNames(panel, 'panel');\r
+ \r
+ panel.appendChild(panelContent);\r
+ Element.hide(panel);\r
+ this.panels[i] = panel;\r
+ this.panelList[i].appendChild(panel);\r
+ },\r
+ \r
+ selectTab: function(e) {\r
+ if (this.effecting) return;\r
+ if (!e) {\r
+ if (!this.panels[this.selected]) this.selected = 0;\r
+ Element.show(this.panels[this.selected]);\r
+ this.setTabActive(this.tabs[this.selected]);\r
+ return;\r
+ }\r
+\r
+ var targetElement = Event.element(e);\r
+ var targetIndex = this.getTargetIndex(targetElement);\r
+ if (targetIndex == this.selected) return;\r
+ \r
+ var currentPanel = this.panels[this.selected];\r
+ var targetPanel = this.panels[targetIndex];\r
+ this.setTabInactive(this.tabs[this.selected]);\r
+ this.setTabActive(this.tabs[targetIndex]);\r
+\r
+ this.effecting = true;\r
+ new Effect.Parallel(\r
+ [\r
+ new Effect.BlindUp(currentPanel, {sync: true}),\r
+ new Effect.BlindDown(targetPanel, {sync: true})\r
+ ],\r
+ {\r
+ duration: this.options.duration,\r
+ beforeStart: function() { this.effecting = true; }.bind(this),\r
+ afterFinish: function() { this.effecting = false; }.bind(this)\r
+ }\r
+ );\r
+\r
+ this.selected = targetIndex; \r
+ },\r
+ \r
+ setTabActive: function(tab) {\r
+ var tabChildren = tab.childNodes;\r
+\r
+ this.classNames.refreshClassNames(tabChildren[0], 'tabLeftActive');\r
+ this.classNames.refreshClassNames(tabChildren[1], 'tabMiddleActive');\r
+ this.classNames.refreshClassNames(tabChildren[2], 'tabRightActive');\r
+ },\r
+ \r
+ setTabInactive: function(tab) {\r
+ var tabChildren = tab.childNodes;\r
+ \r
+ this.classNames.refreshClassNames(tabChildren[0], 'tabLeftInactive');\r
+ this.classNames.refreshClassNames(tabChildren[1], 'tabMiddleInactive');\r
+ this.classNames.refreshClassNames(tabChildren[2], 'tabRightInactive');\r
+ },\r
+\r
+ getTargetIndex: function(element) {\r
+ while(element) {\r
+ if (element.id && element.id.indexOf(this.tabId, 0) >= 0) {\r
+ var index = element.id.substring(this.tabId.length);\r
+ if (!isNaN(index)) {\r
+ return index;\r
+ }\r
+ }\r
+ element = element.parentNode;\r
+ }\r
+ }\r
+}\r
-// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-var AjaxHistory = {
- _callback: null,
- _currentIframeHash: '',
- _currentLocationHash: '',
- _prefix: 'ajax_history_',
- add: function(hash) {
- AjaxHistoryPageManager.setHash(this._prefix + hash);
- },
- checkIframeHash: function() {
- var iframeHash = AjaxHistoryIframeManager.getHash().substr(this._prefix.length);
- if(this._currentIframeHash != iframeHash) {
- this._currentIframeHash = iframeHash;
- this._currentLocationHash = iframeHash;
- AjaxHistoryPageManager.setHash((iframeHash) ? this._prefix + iframeHash : '');
- this.doEvent(iframeHash);
- } else {
- this.checkLocationHash();
- }
- },
- checkHash: function() {
- if(UserAgent.isIE()) {
- this.checkIframeHash();
- } else {
- this.checkLocationHash();
- }
- },
- checkLocationHash: function() {
- var locationHash = AjaxHistoryPageManager.getHash().substr(this._prefix.length);
- if(this._currentLocationHash != locationHash) {
- this._currentLocationHash = locationHash;
- if(UserAgent.isIE()) {
- AjaxHistoryIframeManager.setHash(this._prefix + locationHash);
- } else {
- this.doEvent(locationHash);
- }
- }
- },
- doEvent: function(hash) {
- if(this._callback) {
- this._callback.call(null, hash);
- }
- },
- init: function(callback) {
- this._callback = callback;
- if(UserAgent.isIE()) {
- AjaxHistoryIframeManager.create();
- }
- var self = this;
- var hashHandler = function() {self.checkHash();}
- setInterval(hashHandler, 100);
- }
-}
-
-var AjaxHistoryIframeManager = {
- _id : 'ajax_history_frame',
- _element: null,
- _src: IECover.src,
- create: function() {
- document.write('<iframe id="' + this._id + '" src="' + this._src + '" style="display: none;"></iframe>');
- this._element = $(this._id);
- },
- getHash: function() {
- var iframeDocument = this._element.contentWindow.document;
- return iframeDocument.location.hash.replace(/^#/, '');
- },
- setHash: function(query) {
- var iframeDocument = this._element.contentWindow.document;
- iframeDocument.open();
- iframeDocument.close();
- iframeDocument.location.hash = query;
- }
-}
-
-var AjaxHistoryPageManager = {
- _delimiter: '#',
- _location: 'window.location.href',
- _query: '',
- getLocation: function() {
- return eval(this._location);
- },
- getHash: function() {
- var url_elements = this.getLocation().split(this._delimiter);
- return (url_elements.length > 1) ? url_elements[url_elements.length - 1] : this._query;
- },
- getUrl: function() {
- var url_elements = this.getLocation().split(this._delimiter);
- return url_elements[0];
- },
- setHash: function(query) {
- window.location.hash = query;
- }
-}
+// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+var AjaxHistory = {\r
+ _callback: null,\r
+ _currentIframeHash: '',\r
+ _currentLocationHash: '',\r
+ _prefix: 'ajax_history_',\r
+ add: function(hash) {\r
+ AjaxHistoryPageManager.setHash(this._prefix + hash);\r
+ },\r
+ checkIframeHash: function() {\r
+ var iframeHash = AjaxHistoryIframeManager.getHash().substr(this._prefix.length);\r
+ if(this._currentIframeHash != iframeHash) {\r
+ this._currentIframeHash = iframeHash;\r
+ this._currentLocationHash = iframeHash;\r
+ AjaxHistoryPageManager.setHash((iframeHash) ? this._prefix + iframeHash : '');\r
+ this.doEvent(iframeHash);\r
+ } else {\r
+ this.checkLocationHash();\r
+ }\r
+ },\r
+ checkHash: function() {\r
+ if(UserAgent.isIE()) {\r
+ this.checkIframeHash();\r
+ } else {\r
+ this.checkLocationHash();\r
+ }\r
+ },\r
+ checkLocationHash: function() {\r
+ var locationHash = AjaxHistoryPageManager.getHash().substr(this._prefix.length);\r
+ if(this._currentLocationHash != locationHash) {\r
+ this._currentLocationHash = locationHash;\r
+ if(UserAgent.isIE()) {\r
+ AjaxHistoryIframeManager.setHash(this._prefix + locationHash);\r
+ } else {\r
+ this.doEvent(locationHash);\r
+ }\r
+ }\r
+ },\r
+ doEvent: function(hash) {\r
+ if(this._callback) {\r
+ this._callback.call(null, hash);\r
+ }\r
+ },\r
+ init: function(callback) {\r
+ this._callback = callback;\r
+ if(UserAgent.isIE()) {\r
+ AjaxHistoryIframeManager.create();\r
+ }\r
+ var self = this;\r
+ var hashHandler = function() {self.checkHash();}\r
+ setInterval(hashHandler, 100);\r
+ }\r
+}\r
+\r
+var AjaxHistoryIframeManager = {\r
+ _id : 'ajax_history_frame',\r
+ _element: null,\r
+ _src: IECover.src,\r
+ create: function() {\r
+ document.write('<iframe id="' + this._id + '" src="' + this._src + '" style="display: none;"></iframe>');\r
+ this._element = $(this._id);\r
+ },\r
+ getHash: function() {\r
+ var iframeDocument = this._element.contentWindow.document;\r
+ return iframeDocument.location.hash.replace(/^#/, '');\r
+ },\r
+ setHash: function(query) {\r
+ var iframeDocument = this._element.contentWindow.document;\r
+ iframeDocument.open();\r
+ iframeDocument.close();\r
+ iframeDocument.location.hash = query;\r
+ }\r
+}\r
+\r
+var AjaxHistoryPageManager = {\r
+ _delimiter: '#',\r
+ _location: 'window.location.href',\r
+ _query: '',\r
+ getLocation: function() {\r
+ return eval(this._location);\r
+ },\r
+ getHash: function() {\r
+ var url_elements = this.getLocation().split(this._delimiter);\r
+ return (url_elements.length > 1) ? url_elements[url_elements.length - 1] : this._query;\r
+ },\r
+ getUrl: function() {\r
+ var url_elements = this.getLocation().split(this._delimiter);\r
+ return url_elements[0];\r
+ },\r
+ setHash: function(query) {\r
+ window.location.hash = query;\r
+ }\r
+}\r
-// Copyright (c) 2006 spinelz.org (http://script.spinelz.org/)
-//
-// This code is substantially based on code from script.aculo.us which has the
-// following copyright and permission notice
-//
-// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
-
-var Balloon = Class.create()
-Balloon.classNames = {
- tooltip: 'balloon_tooltip',
- top: 'balloon_top',
- topLeft: 'balloon_top_left',
- topMiddle: 'balloon_top_middle',
- topRight: 'balloon_top_right',
- middle: 'balloon_middle',
- middleLeft: 'balloon_middle_left',
- middleRight: 'balloon_middle_right',
- middleLeftRowT: 'balloon_middle_left_row',
- middleLeftRowB: 'balloon_middle_left_row',
- middleRightRowT: 'balloon_middle_right_row',
- middleRightRowB: 'balloon_middle_right_row',
- leftArrow: 'balloon_left_arrow',
- rightArrow: 'balloon_right_arrow',
- leftUpArrow: 'balloon_left_up_arrow',
- leftDownArrow: 'balloon_left_down_arrow',
- rightUpArrow: 'balloon_right_up_arrow',
- rightDownArrow: 'balloon_right_down_arrow',
- body: 'balloon_body',
- bottom: 'balloon_bottom',
- bottomLeft: 'balloon_bottom_left',
- bottomMiddle: 'balloon_bottom_middle',
- bottomRight: 'balloon_bottom_right'
-}
-Balloon.allBalloons = [];
-Balloon.closeAll = function(){
- Balloon.allBalloons.each(function(b){
- b.close();
- });
-}
-Balloon.eventSetting = false;
-Balloon.prototype = {
- initialize : function (target, message){
- this.target = $(target);
-
- this.options = Object.extend({
- cssPrefix: 'custom_',
- trigger: this.target,
- tipId: this.target.id + '_balloon',
- events: ['click'],
- width: 300,
- height: 200
- }, arguments[2] || {});
-
- var customCss = CssUtil.appendPrefix(this.options.cssPrefix, Balloon.classNames);
- this.classNames = new CssUtil([Balloon.classNames, customCss]);
-
- this.tipNode = this._buildTipNode(message);
- Element.hide(this.tipNode);
- this._setMessage(message);
- document.body.appendChild(this.tipNode);
- this._setEvent();
- Balloon.allBalloons.push(this)
- this._setSize();
- },
-
- _setEvent: function() {
- var self = this;
- this.options.events.each(function(e) {
- Event.observe(self.options.trigger, e, self.open.bindAsEventListener(self));
- });
-
- Event.observe(this.tipNode, 'click', this.close.bind(this), true)
-
- if (!Balloon.eventSetting) {
- Event.observe(document, 'click', Balloon.closeAll, true);
- Balloon.eventSetting = true;
- }
- },
-
- _buildTipNode : function() {
- var tipNode = Builder.node('div', {id: this.options.tipId});
- this.classNames.addClassNames(tipNode, 'tooltip');
- tipNode.appendChild(this._buildTop());
- tipNode.appendChild(this._buildMiddle());
- tipNode.appendChild(this._buildBottom());
- return tipNode;
- },
-
- _setMessage: function(message) {
- var type = message.constructor;
- if (type == String) {
- this.body.innerHTML = message;
- } else if (type == Object) {
- this.body.appendChild(message);
- }
- },
-
- _buildTop: function() {
- return this._buildMulti('top', ['topLeft', 'topMiddle', 'topRight'], true);
- },
-
- _buildBottom: function() {
- return this._buildMulti('bottom', ['bottomLeft', 'bottomMiddle', 'bottomRight'], true);
- },
-
- _buildMiddle: function() {
- this.middle = Builder.node('div');
- this.classNames.addClassNames(this.middle, 'middle');
- this.middle.appendChild(
- this._buildMulti('middleLeft', ['middleLeftRowT', 'leftArrow', 'middleLeftRowB'], true));
- this.middle.appendChild(this._buildMulti('body', [], true));
- this.middle.appendChild(
- this._buildMulti('middleRight', ['middleRightRowT', 'rightArrow', 'middleRightRowB'], true));
- return this.middle;
- },
-
- _buildMulti: function(main, subs, hold) {
- var topNode = Builder.node('div');
- this.classNames.addClassNames(topNode, main);
- if (hold) this[main] = topNode;
- var self = this;
- var node = null;
- subs.each(function(s) {
- node = Builder.node('div');
- self.classNames.addClassNames(node, s);
- topNode.appendChild(node);
- if (hold) self[s] = node;
- });
- return topNode;
- },
-
- _setPosition: function() {
- var scrollPosition = Position.realOffset(this.tipNode);
- var screenWidth = document.documentElement.clientWidth;
- var screenHeight = document.documentElement.clientHeight;
-
- var positionList = Position.cumulativeOffset(this.target);
- var dimension = Element.getDimensions(this.target);
- var tipNodeLeft = Math.round(positionList[0] + dimension.width);
- var tipDimension = Element.getDimensions(this.tipNode);
- var tipNodeTop = Math.round(positionList[1] - tipDimension.height / 2);
-
- var addLR = 'left';
- var remLR = 'right';
-
- if((tmpY = tipNodeTop - scrollPosition[1]) < 0) {
- tipNodeTop -= tmpY;
- }
- if( (tipNodeLeft+tipDimension.width) > (screenWidth+scrollPosition[0]) ) {
- tipNodeLeft = Math.round(positionList[0] - tipDimension.width);
- addLR = 'right';
- remLR = 'left';
- }
-
- var y = positionList[1] - tipNodeTop;
- this._setArrow(addLR, y);
- this._unsetArrow(remLR);
-
- Element.setStyle(this.tipNode, {
- top: tipNodeTop + 'px',
- left: tipNodeLeft + 'px',
- zIndex: ZindexManager.getIndex()
- });
- },
-
- _setArrow: function(lr, y) {
- var headerH = (this.options.height - this.middleH) / 2;
- var topH, bottomH, h, ud;
- var minH = 10; // for ie
- if (lr == 'left') {
- h = this.middleH - this.leftArrowH;
- } else {
- h = this.middleH - this.rightArrowH;
- }
- if (headerH > y) {
- topH = minH;
- bottomH = h - topH;
- ud = 'up';
- } else if ((this.middleH + headerH) < y) {
- bottomH = minH;
- topH = h - bottomH;
- ud = 'down';
- } else {
- topH = y - headerH;
- topH = (topH < minH) ? minH : topH;
- bottomH = h - topH;
- ud = 'up';
- }
- if (lr == 'left') {
- if (ud == 'up') {
- this.classNames.refreshClassNames(this.leftArrow, 'leftUpArrow');
- Element.setStyle(this.leftArrow, {height: this.leftArrowH + 'px'});
- Element.setStyle(this.middleLeftRowT, {height: topH + 'px'});
- Element.setStyle(this.middleLeftRowB, {height: bottomH + 'px'});
- } else {
- this.classNames.refreshClassNames(this.leftArrow, 'leftDownArrow');
- Element.setStyle(this.leftArrow, {height: this.leftArrowH + 'px'});
- Element.setStyle(this.middleLeftRowT, {height: topH + 'px'});
- Element.setStyle(this.middleLeftRowB, {height: bottomH + 'px'});
- }
- } else {
- if (ud == 'up') {
- this.classNames.refreshClassNames(this.rightArrow, 'rightUpArrow');
- Element.setStyle(this.rightArrow, {height: this.rightArrowH + 'px'});
- Element.setStyle(this.middleRightRowT, {height: topH + 'px'});
- Element.setStyle(this.middleRightRowB, {height: bottomH + 'px'});
- } else {
- this.classNames.refreshClassNames(this.rightArrow, 'rightDownArrow');
- Element.setStyle(this.rightArrow, {height: this.rightArrowH + 'px'});
- Element.setStyle(this.middleRightRowT, {height: topH + 'px'});
- Element.setStyle(this.middleRightRowB, {height: bottomH + 'px'});
- }
- }
- },
-
- _unsetArrow: function(direction) {
- if (direction == 'left') {
- var h = (this.middleH - this.leftArrowH) / 2;
- this.classNames.refreshClassNames(this.leftArrow, 'middleLeftRowB');
- Element.setStyle(this.leftArrow, {height: this.leftArrowH + 'px'});
- Element.setStyle(this.middleLeftRowT, {height: h + 'px'});
- Element.setStyle(this.middleLeftRowB, {height: h + 'px'});
- } else {
- var h = (this.middleH - this.rightArrowH) / 2;
- this.classNames.refreshClassNames(this.rightArrow, 'middleRightRowB');
- Element.setStyle(this.rightArrow, {height: this.rightArrowH + 'px'});
- Element.setStyle(this.middleRightRowT, {height: h + 'px'});
- Element.setStyle(this.middleRightRowB, {height: h + 'px'});
- }
- },
-
- _setSize: function() {
- var width = this.options.width;
- var height = this.options.height;
- Element.setStyle(this.tipNode, {
- width: width + 'px',
- height: height + 'px'
- });
-
- var topH = parseInt(Element.getStyle(this.top, 'height'));
- var bottomH = parseInt(Element.getStyle(this.bottom, 'height'));
- var middleH = this.options.height - topH - bottomH;
-
- var style = {height: middleH + 'px'};
- Element.setStyle(this.middle, style);
- Element.setStyle(this.middleLeft, style);
- Element.setStyle(this.middleRight, style);
- Element.setStyle(this.body, style);
-
- this.leftArrowH = parseInt(Element.getStyle(this.leftArrow, 'height'));
- this.rightArrowH = parseInt(Element.getStyle(this.rightArrow, 'height'));
- this.middleH = middleH;
- },
-
- open : function() {
- if (!Element.visible(this.tipNode)) {
- this._setPosition();
- Effect.Appear(this.tipNode);
- }
- },
-
- close : function(){
- if (Element.visible(this.tipNode)) {
- this._setPosition();
- Effect.Fade(this.tipNode);
- }
- }
-}
+// Copyright (c) 2006 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// This code is substantially based on code from script.aculo.us which has the \r
+// following copyright and permission notice\r
+//\r
+// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE\r
+\r
+var Balloon = Class.create()\r
+Balloon.classNames = {\r
+ tooltip: 'balloon_tooltip',\r
+ top: 'balloon_top',\r
+ topLeft: 'balloon_top_left',\r
+ topMiddle: 'balloon_top_middle',\r
+ topRight: 'balloon_top_right',\r
+ middle: 'balloon_middle',\r
+ middleLeft: 'balloon_middle_left',\r
+ middleRight: 'balloon_middle_right',\r
+ middleLeftRowT: 'balloon_middle_left_row',\r
+ middleLeftRowB: 'balloon_middle_left_row',\r
+ middleRightRowT: 'balloon_middle_right_row',\r
+ middleRightRowB: 'balloon_middle_right_row',\r
+ leftArrow: 'balloon_left_arrow',\r
+ rightArrow: 'balloon_right_arrow',\r
+ leftUpArrow: 'balloon_left_up_arrow',\r
+ leftDownArrow: 'balloon_left_down_arrow',\r
+ rightUpArrow: 'balloon_right_up_arrow',\r
+ rightDownArrow: 'balloon_right_down_arrow',\r
+ body: 'balloon_body',\r
+ bottom: 'balloon_bottom',\r
+ bottomLeft: 'balloon_bottom_left',\r
+ bottomMiddle: 'balloon_bottom_middle',\r
+ bottomRight: 'balloon_bottom_right'\r
+}\r
+Balloon.allBalloons = [];\r
+Balloon.closeAll = function(){\r
+ Balloon.allBalloons.each(function(b){\r
+ b.close();\r
+ });\r
+}\r
+Balloon.eventSetting = false;\r
+Balloon.prototype = {\r
+ initialize : function (target, message){\r
+ this.target = $(target);\r
+\r
+ this.options = Object.extend({\r
+ cssPrefix: 'custom_',\r
+ trigger: this.target,\r
+ tipId: this.target.id + '_balloon',\r
+ events: ['click'],\r
+ width: 300,\r
+ height: 200\r
+ }, arguments[2] || {});\r
+ \r
+ var customCss = CssUtil.appendPrefix(this.options.cssPrefix, Balloon.classNames);\r
+ this.classNames = new CssUtil([Balloon.classNames, customCss]);\r
+\r
+ this.tipNode = this._buildTipNode(message);\r
+ Element.hide(this.tipNode);\r
+ this._setMessage(message);\r
+ document.body.appendChild(this.tipNode);\r
+ this._setEvent();\r
+ Balloon.allBalloons.push(this)\r
+ this._setSize();\r
+ },\r
+\r
+ _setEvent: function() {\r
+ var self = this;\r
+ this.options.events.each(function(e) {\r
+ Event.observe(self.options.trigger, e, self.open.bindAsEventListener(self));\r
+ });\r
+\r
+ Event.observe(this.tipNode, 'click', this.close.bind(this), true) \r
+\r
+ if (!Balloon.eventSetting) {\r
+ Event.observe(document, 'click', Balloon.closeAll, true);\r
+ Balloon.eventSetting = true;\r
+ }\r
+ },\r
+\r
+ _buildTipNode : function() {\r
+ var tipNode = Builder.node('div', {id: this.options.tipId});\r
+ this.classNames.addClassNames(tipNode, 'tooltip');\r
+ tipNode.appendChild(this._buildTop());\r
+ tipNode.appendChild(this._buildMiddle());\r
+ tipNode.appendChild(this._buildBottom());\r
+ return tipNode;\r
+ },\r
+\r
+ _setMessage: function(message) {\r
+ var type = message.constructor;\r
+ if (type == String) {\r
+ this.body.innerHTML = message;\r
+ } else if (type == Object) {\r
+ this.body.appendChild(message);\r
+ }\r
+ },\r
+\r
+ _buildTop: function() {\r
+ return this._buildMulti('top', ['topLeft', 'topMiddle', 'topRight'], true);\r
+ },\r
+\r
+ _buildBottom: function() {\r
+ return this._buildMulti('bottom', ['bottomLeft', 'bottomMiddle', 'bottomRight'], true);\r
+ },\r
+\r
+ _buildMiddle: function() {\r
+ this.middle = Builder.node('div');\r
+ this.classNames.addClassNames(this.middle, 'middle');\r
+ this.middle.appendChild(\r
+ this._buildMulti('middleLeft', ['middleLeftRowT', 'leftArrow', 'middleLeftRowB'], true));\r
+ this.middle.appendChild(this._buildMulti('body', [], true));\r
+ this.middle.appendChild(\r
+ this._buildMulti('middleRight', ['middleRightRowT', 'rightArrow', 'middleRightRowB'], true));\r
+ return this.middle;\r
+ },\r
+\r
+ _buildMulti: function(main, subs, hold) {\r
+ var topNode = Builder.node('div');\r
+ this.classNames.addClassNames(topNode, main);\r
+ if (hold) this[main] = topNode;\r
+ var self = this;\r
+ var node = null;\r
+ subs.each(function(s) {\r
+ node = Builder.node('div');\r
+ self.classNames.addClassNames(node, s);\r
+ topNode.appendChild(node);\r
+ if (hold) self[s] = node;\r
+ });\r
+ return topNode;\r
+ },\r
+\r
+ _setPosition: function() {\r
+ var scrollPosition = Position.realOffset(this.tipNode);\r
+ var screenWidth = document.documentElement.clientWidth;\r
+ var screenHeight = document.documentElement.clientHeight;\r
+ \r
+ var positionList = Position.cumulativeOffset(this.target);\r
+ var dimension = Element.getDimensions(this.target);\r
+ var tipNodeLeft = Math.round(positionList[0] + dimension.width);\r
+ var tipDimension = Element.getDimensions(this.tipNode);\r
+ var tipNodeTop = Math.round(positionList[1] - tipDimension.height / 2);\r
+\r
+ var addLR = 'left';\r
+ var remLR = 'right';\r
+\r
+ if((tmpY = tipNodeTop - scrollPosition[1]) < 0) {\r
+ tipNodeTop -= tmpY;\r
+ }\r
+ if( (tipNodeLeft+tipDimension.width) > (screenWidth+scrollPosition[0]) ) {\r
+ tipNodeLeft = Math.round(positionList[0] - tipDimension.width);\r
+ addLR = 'right';\r
+ remLR = 'left';\r
+ }\r
+ \r
+ var y = positionList[1] - tipNodeTop;\r
+ this._setArrow(addLR, y);\r
+ this._unsetArrow(remLR);\r
+\r
+ Element.setStyle(this.tipNode, {\r
+ top: tipNodeTop + 'px',\r
+ left: tipNodeLeft + 'px',\r
+ zIndex: ZindexManager.getIndex()\r
+ });\r
+ },\r
+\r
+ _setArrow: function(lr, y) {\r
+ var headerH = (this.options.height - this.middleH) / 2;\r
+ var topH, bottomH, h, ud;\r
+ var minH = 10; // for ie\r
+ if (lr == 'left') {\r
+ h = this.middleH - this.leftArrowH;\r
+ } else {\r
+ h = this.middleH - this.rightArrowH;\r
+ }\r
+ if (headerH > y) {\r
+ topH = minH;\r
+ bottomH = h - topH;\r
+ ud = 'up';\r
+ } else if ((this.middleH + headerH) < y) {\r
+ bottomH = minH;\r
+ topH = h - bottomH;\r
+ ud = 'down';\r
+ } else {\r
+ topH = y - headerH;\r
+ topH = (topH < minH) ? minH : topH;\r
+ bottomH = h - topH;\r
+ ud = 'up';\r
+ }\r
+ if (lr == 'left') {\r
+ if (ud == 'up') {\r
+ this.classNames.refreshClassNames(this.leftArrow, 'leftUpArrow');\r
+ Element.setStyle(this.leftArrow, {height: this.leftArrowH + 'px'});\r
+ Element.setStyle(this.middleLeftRowT, {height: topH + 'px'});\r
+ Element.setStyle(this.middleLeftRowB, {height: bottomH + 'px'});\r
+ } else {\r
+ this.classNames.refreshClassNames(this.leftArrow, 'leftDownArrow');\r
+ Element.setStyle(this.leftArrow, {height: this.leftArrowH + 'px'});\r
+ Element.setStyle(this.middleLeftRowT, {height: topH + 'px'});\r
+ Element.setStyle(this.middleLeftRowB, {height: bottomH + 'px'});\r
+ }\r
+ } else {\r
+ if (ud == 'up') {\r
+ this.classNames.refreshClassNames(this.rightArrow, 'rightUpArrow');\r
+ Element.setStyle(this.rightArrow, {height: this.rightArrowH + 'px'});\r
+ Element.setStyle(this.middleRightRowT, {height: topH + 'px'});\r
+ Element.setStyle(this.middleRightRowB, {height: bottomH + 'px'});\r
+ } else {\r
+ this.classNames.refreshClassNames(this.rightArrow, 'rightDownArrow');\r
+ Element.setStyle(this.rightArrow, {height: this.rightArrowH + 'px'});\r
+ Element.setStyle(this.middleRightRowT, {height: topH + 'px'});\r
+ Element.setStyle(this.middleRightRowB, {height: bottomH + 'px'});\r
+ }\r
+ }\r
+ },\r
+\r
+ _unsetArrow: function(direction) {\r
+ if (direction == 'left') {\r
+ var h = (this.middleH - this.leftArrowH) / 2;\r
+ this.classNames.refreshClassNames(this.leftArrow, 'middleLeftRowB');\r
+ Element.setStyle(this.leftArrow, {height: this.leftArrowH + 'px'});\r
+ Element.setStyle(this.middleLeftRowT, {height: h + 'px'});\r
+ Element.setStyle(this.middleLeftRowB, {height: h + 'px'});\r
+ } else {\r
+ var h = (this.middleH - this.rightArrowH) / 2;\r
+ this.classNames.refreshClassNames(this.rightArrow, 'middleRightRowB');\r
+ Element.setStyle(this.rightArrow, {height: this.rightArrowH + 'px'});\r
+ Element.setStyle(this.middleRightRowT, {height: h + 'px'});\r
+ Element.setStyle(this.middleRightRowB, {height: h + 'px'});\r
+ }\r
+ },\r
+\r
+ _setSize: function() {\r
+ var width = this.options.width;\r
+ var height = this.options.height;\r
+ Element.setStyle(this.tipNode, {\r
+ width: width + 'px',\r
+ height: height + 'px'\r
+ });\r
+\r
+ var topH = parseInt(Element.getStyle(this.top, 'height'));\r
+ var bottomH = parseInt(Element.getStyle(this.bottom, 'height'));\r
+ var middleH = this.options.height - topH - bottomH;\r
+\r
+ var style = {height: middleH + 'px'};\r
+ Element.setStyle(this.middle, style);\r
+ Element.setStyle(this.middleLeft, style);\r
+ Element.setStyle(this.middleRight, style);\r
+ Element.setStyle(this.body, style);\r
+\r
+ this.leftArrowH = parseInt(Element.getStyle(this.leftArrow, 'height'));\r
+ this.rightArrowH = parseInt(Element.getStyle(this.rightArrow, 'height'));\r
+ this.middleH = middleH;\r
+ },\r
+\r
+ open : function() {\r
+ if (!Element.visible(this.tipNode)) {\r
+ this._setPosition();\r
+ Effect.Appear(this.tipNode);\r
+ }\r
+ },\r
+\r
+ close : function(){\r
+ if (Element.visible(this.tipNode)) {\r
+ this._setPosition();\r
+ Effect.Fade(this.tipNode);\r
+ }\r
+ }\r
+}\r
-// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-var AbstractBarChart = Class.create();
-AbstractBarChart.prototype = {
-
- initialize: function(element, params) {
- this.options = Object.extend({
- title: '',
- graduation: true,
- graduationMin: 0,
- graduationMax: 30,
- graduationInterval: 10,
- graduationRange: 50,
- titleFont: 'normal bold 20px serif'
- }, arguments[2] || {});
-
- this.fontSize = 'normal normal 12px serif';
- this.graduationLine = '2px solid gray';
- this.element = $(element);
- Element.setStyle(this.element, {visibility: 'hidden'});
- Element.hide(this.element);
- this.params = params;
-
- this.init();
-
- this.hide();
- this.refresh();
- Element.setStyle(this.element, {visibility: 'visible'});
- Element.show(this.element);
- },
-
- build: function() {
- return Builder.node(
- 'DIV',
- [this.buildTitle(), this.buildGraduationLine(), this.buildContent()]);
- },
-
- buildTitle: function() {
- return Builder.node(
- 'DIV',
- {style: 'font: ' + this.options.titleFont + '; margin-bottom: 5px; text-align: center;'},
- [this.options.title]
- );
- },
-
- show: function() {
- Element.show(this.element);
- },
-
- hide: function() {
- Element.hide(this.element);
- },
-
- refresh: function(subject) {
- if (this.chart) this.remove();
-
- this.chart = this.build();
- this.element.appendChild(this.chart);
- },
-
- getParam: function(name) {
- return this.params.detect(function(child) {
- return (child.getName() == name);
- });
- },
-
- remove: function() {
- var chart = this.chart;
- var element = this.element;
-
- $A(this.element.childNodes).any(function(child) {
- if (child == chart) {
- element.removeChild(child);
- return true;
- }
- return false;
- });
-
- this.chart = null;
- },
-
- getChartSize: function() {
- return this.getPlusChartSize() + this.getMinusChartSize();
- },
-
- getPlusChartSize: function() {
- if (this.options.graduationMax <= 0) return 0;
- return this.options.graduationMax / this.options.graduationInterval * this.options.graduationRange;
- },
-
- getMinusChartSize: function() {
- if (this.options.graduationMin >= 0) return 0;
- return Math.abs(this.options.graduationMin) / this.options.graduationInterval * this.options.graduationRange;
- },
-
- getBarSize: function(param) {
- var size = param.getValue() / this.options.graduationInterval * this.options.graduationRange;
- return Math.abs(size);
- },
-
- getFontSize: function() {
- var arr = this.fontSize.split(' ');
- if (arr.length == 0) return 0;
-
- var size = arr.detect(function(child) {
- return child.match(/px$/);
- });
- if (!size) return 0;
-
- var index = size.indexOf('px');
- if (index < 1) return 0;
-
- size = size.substring(0, index);
- if (isNaN(size)) return 0;
-
- return parseInt(size);
- }
-}
-
-var HorizontalBarChart = Class.create();
-Object.extend(Object.extend(HorizontalBarChart.prototype, AbstractBarChart.prototype), {
-
- init: function() {
- this.nameWidth = 125;
- this.valueWidth = 50;
- this.itemInterval = 35;
- this.adjustWidth = (document.all) ? 5 : 0;
- },
-
- buildGraduationLine: function() {
- if (!this.options.graduation)
- return Builder.node('DIV', {style: 'margin-bottom: 5px; text-align: center;'});
-
- var array = new Array();
- var i = this.options.graduationMin;
- //var width = (document.all) ? this.options.graduationRange : this.options.graduationRange - 2;
- var width = this.options.graduationRange;
-
- var style = new StyleManager();
- style.cache('border-left', this.graduationLine);
- style.cache('height', '5px');
- style.cache('font-size', '5px');
-
- while (i <= this.options.graduationMax) {
-
- var j = i + this.options.graduationInterval;
- if (j <= this.options.graduationMax)
- style.add('border-top', this.graduationLine);
-
- var elm = Builder.node(
- 'DIV',
- {style: 'float: left; font: ' + this.fontSize + '; width: ' + width + 'px;'},
- [
- Builder.node('DIV', [i]),
- Builder.node('DIV', {style: style.output()})
- ]
- );
-
- array.push(elm);
- i = j;
- style.clear();
- }
- return Builder.node('DIV', {style: 'margin-left: ' + (this.nameWidth + this.valueWidth) + 'px; padding-bottom: ' + this.itemInterval + 'px;'}, array);
- },
-
- buildContent: function() {
- var nodes = new Array();
-
- var valueStyle = new StyleManager();
- valueStyle.cache('font', this.fontSize);
- valueStyle.cache('text-align', 'right');
-
- for (var i = 0; i < this.params.length; i++) {
- var child = this.params[i];
-
- var maxSize;
- if (child.getValue() > 0) maxSize = this.getPlusChartSize();
- else maxSize = this.getMinusChartSize();
-
- var barSize = this.getBarSize(child);
- barSize = (barSize > maxSize) ? maxSize : barSize;
-
- var barNode;
- if (child.options.image) {
- if (child.getValue() > 0) {
-
- barNode = Builder.node('DIV',
- [
- Builder.node(
- 'IMG',
- {
- src: child.options.image,
- alt: 'bar',
- width: barSize + 'px',
- height: child.options.imageHeight + 'px',
- style: 'float: left; margin-left: ' + (this.getMinusChartSize() + this.valueWidth) + 'px;'
- }),
- Builder.node(
- 'DIV',
- {style: 'font: ' + this.fontSize + ';'},
- [child.getValue()])
- ]);
- } else {
- // IE fix
- var leftMargin = this.getMinusChartSize() - barSize;
- var width;
- if (document.all && leftMargin > 125) {
- width = leftMargin + this.valueWidth;
- leftMargin = 0;
- } else {
- width = this.valueWidth;
- }
-
- valueStyle.add('margin-left', leftMargin + 'px');
- valueStyle.add('width', width + 'px');
- valueStyle.add('float', 'left');
-
- barNode = Builder.node(
- 'DIV',
- [
- Builder.node('DIV', {style: valueStyle.output()}, [child.getValue()]),
- Builder.node('IMG', {src: child.options.image, alt: 'bar', width: barSize + 'px', height: child.options.imageHeight + 'px'})
- ]);
- }
-
- } else {
- if (child.getValue() > 0) {
- barNode = Builder.node(
- 'DIV',
- {style: 'font: ' + this.fontSize + '; margin-left: ' + (this.getMinusChartSize() + this.nameWidth + this.valueWidth + this.adjustWidth) + 'px; border-left: ' + barSize + 'px solid ' + child.options.color + ';'},
- [child.getValue()]
- );
- } else {
- var width = (document.all) ? (this.valueWidth + barSize) : this.valueWidth;
-
- valueStyle.add('margin-left', (this.nameWidth + this.getMinusChartSize() - barSize) + 'px');
- valueStyle.add('width', width + 'px');
- valueStyle.add('border-right', barSize + 'px solid ' + child.options.color);
-
- barNode = Builder.node(
- 'DIV',
- [
- Builder.node('DIV', {style: valueStyle.output()}, [child.getValue()])
- ]
- );
- }
- }
-
- var elm = Builder.node(
- 'DIV',
- {style: 'margin-bottom: 10px;'},
- [
- Builder.node('DIV', {style: 'text-align: right; font: ' + this.fontSize + ';float: left; width: ' + this.nameWidth + 'px;'}, [child.getName()]),
- barNode
- ]);
-
- nodes.push(elm);
- valueStyle.clear();
- }
-
- return nodes;
- }
-});
-
-var VerticalBarChart = Class.create();
-Object.extend(Object.extend(VerticalBarChart.prototype, AbstractBarChart.prototype), {
-
- init: function() {
- },
-
- buildGraduationLine: function() {
- if (!this.options.graduation) return Builder.node('DIV');
-
- var numberArray = new Array();
- var lineArray = new Array();
- var i = this.options.graduationMax;
- var next;
- var lineHeight = (document.all) ? this.options.graduationRange : this.options.graduationRange - 2;
- var marginTop = lineHeight - this.getFontSize();
-
- var numberStyle = new StyleManager();
- numberStyle.cache('font', this.fontSize);
-
- var lineStyle = new StyleManager();
- lineStyle.cache('font', this.fontSize);
-
- while (i >= this.options.graduationMin) {
- next = i - this.options.graduationInterval;
- lineHeight = (document.all) ? lineHeight - 0.3: lineHeight - 0.1;
-
- if (i == this.options.graduationMax) {
- lineStyle.add('margin-top', '0px');
-
- } else if (next < this.options.graduationMin) {
- numberStyle.add('margin-top', marginTop + 'px');
- lineStyle.add('border-left', this.graduationLine);
- lineStyle.add('border-top', this.graduationLine);
- lineStyle.add('border-bottom', this.graduationLine)
- lineStyle.add('height', lineHeight + 'px');
- lineStyle.add('width', '100%');
-
- } else {
- numberStyle.add('margin-top', marginTop + 'px');
- lineStyle.add('border-left', this.graduationLine);
- lineStyle.add('border-top', this.graduationLine);
- lineStyle.add('height', lineHeight + 'px');
- lineStyle.add('width', '100%');
- }
-
- numberArray.push(Builder.node('DIV', {style: numberStyle.output()}, [i]));
-
- if (i == this.options.graduationMax) {
- lineArray.push(Builder.node('DIV', {style: lineStyle.output()}, [Builder.node('BR')]));
- } else {
- lineArray.push(Builder.node('DIV', {style: lineStyle.output()}));
- }
-
- numberStyle.clear();
- lineStyle.clear();
-
- marginTop -= (document.all) ? 0.05 : 0.1;
- i = next;
- }
-
- return [
- Builder.node('DIV', {style: 'float: left; margin-left: 10px; width: 25px; text-align: right;'}, numberArray),
- Builder.node('DIV', {style: 'float: left; margin-right: 10px; margin-left: 10px; width: 5px;'}, lineArray)
- ];
- },
-
- buildContent: function() {
- var nodes = new Array();
-
- for (var i = 0; i < this.params.length; i++) {
- var child = this.params[i];
-
- var maxSize;
- if (child.getValue() > 0) maxSize = this.getPlusChartSize();
- else maxSize = this.getMinusChartSize();
-
- var barSize = this.getBarSize(child);
- barSize = (barSize > maxSize) ? maxSize : barSize;
-
- var bar;
- if (child.options.image) {
- bar = Builder.node('IMG', {src: child.getImage(), alt: 'bar', width: '10px', height: barSize + 'px'});
- } else {
- bar = Builder.node('DIV', {style: 'border-top: ' + barSize + 'px solid ' + child.options.color + '; width: 10px; font-size: 0;'});
- }
-
- var elm;
- if (child.getValue() > 0) {
- elm = Builder.node(
- 'DIV',
- {style: 'float: left; margin-right: 10px; width: 25px;'},
- [
- Builder.node('DIV', {style: 'margin-top: ' + (maxSize - barSize) + 'px; font: ' + this.fontSize + ';'}, [child.getValue()]),
- bar,
- Builder.node('DIV', {style: 'margin-top: ' + (this.getMinusChartSize() + 15) + 'px; font: ' + this.fontSize + '; padding-top: 5px; width: 10px;'}, [child.getName()])
- ]);
- } else {
- elm = Builder.node(
- 'DIV',
- {style: 'float: left; margin-right: 10px; width: 25px;'},
- [
- Builder.node('DIV', {style: 'margin-top: ' + (this.getPlusChartSize() + this.getFontSize()) + 'px'}),
- bar,
- Builder.node('DIV', {style: 'font: ' + this.fontSize + ';'}, [child.getValue()]),
- Builder.node('DIV', {style: 'margin-top: ' + (maxSize + 15 - (this.getFontSize() + barSize)) + 'px; font: ' + this.fontSize + '; padding-top: 5px; width: 10px;'}, [child.getName()])
- ]);
- }
-
- nodes.push(elm);
- }
-
- nodes.push(Builder.node('DIV', {style: 'clear: left;'}));
- return nodes;
- }
-});
-
-var ChartParameter = Class.create();
-ChartParameter.prototype = {
-
- initialize: function(name, value) {
- if (isNaN(value)) throw '[ChartParameter] value property must be number!(' + value + ')';
-
- this.name = name;
- this.value = value;
-
- this.options = Object.extend({
- color: '#FF0000',
- barHeight: '15',
- image: false,
- imageHeight: '15',
- action: false
- }, arguments[2] || {});
- },
-
- getName: function() {
- return this.name;
- },
-
- getValue: function() {
- return this.value;
- },
-
- setValue: function(value) {
- if (!value || isNaN(value)) this.value = 0;
- else this.value = value;
- },
-
- getImage: function() {
- return this.options.image;
- }
-}
-
-var StyleManager = Class.create();
-StyleManager.prototype = {
-
- initialize: function() {
- this.cacheItems = new Array();
- this.items = new Array();
- },
-
- cache: function(style) {
- if (typeof(style) == 'object')
- this.cacheItems.push(style);
- else if (arguments[1])
- this.cacheItems.push(new StyleItem(style, arguments[1]));
- },
-
- add: function(style) {
- if (typeof(style) == 'object')
- this.items.push(style);
- else if (arguments[1])
- this.items.push(new StyleItem(style, arguments[1]));
- },
-
- get: function(name) {
- return this.items.detect(function(child) {
- return child.getName() == name;
- });
- },
-
- remove: function(name) {
- this.items = this.items.findAll(function(child) {
- return child.getName() != name;
- });
- },
-
- clear: function(name) {
- this.items = new Array();
- },
-
- modify: function(name, value) {
- var item = this.get(name);
-
- if (item) item.setValue(value);
- else this.add(name, value);
- },
-
- output: function() {
- var style = '';
-
- this.cacheItems.each(function(child) {
- style += child.toString();
- });
-
- this.items.each(function(child) {
- style += child.toString();
- });
-
- return style;
- }
-}
-
-var StyleItem = Class.create();
-StyleItem.prototype = {
-
- initialize: function(name, value) {
- this.name = name;
- this.value = value;
- },
-
- setName: function(name) {
- this.name = name;
- },
-
- setValue: function(value) {
- this.value = value;
- },
-
- getName: function() {
- return this.name;
- },
-
- getValue: function() {
- return this.value;
- },
-
- toString: function() {
- return this.getName() + ':' + this.getValue() + '; ';
- }
-}
-
+// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+var AbstractBarChart = Class.create();\r
+AbstractBarChart.prototype = {\r
+\r
+ initialize: function(element, params) {\r
+ this.options = Object.extend({\r
+ title: '',\r
+ graduation: true,\r
+ graduationMin: 0,\r
+ graduationMax: 30,\r
+ graduationInterval: 10, \r
+ graduationRange: 50,\r
+ titleFont: 'normal bold 20px serif'\r
+ }, arguments[2] || {});\r
+ \r
+ this.fontSize = 'normal normal 12px serif';\r
+ this.graduationLine = '2px solid gray';\r
+ this.element = $(element);\r
+ Element.setStyle(this.element, {visibility: 'hidden'});\r
+ Element.hide(this.element);\r
+ this.params = params;\r
+ \r
+ this.init();\r
+ \r
+ this.hide();\r
+ this.refresh();\r
+ Element.setStyle(this.element, {visibility: 'visible'});\r
+ Element.show(this.element);\r
+ },\r
+ \r
+ build: function() {\r
+ return Builder.node(\r
+ 'DIV',\r
+ [this.buildTitle(), this.buildGraduationLine(), this.buildContent()]);\r
+ },\r
+ \r
+ buildTitle: function() {\r
+ return Builder.node(\r
+ 'DIV', \r
+ {style: 'font: ' + this.options.titleFont + '; margin-bottom: 5px; text-align: center;'},\r
+ [this.options.title]\r
+ );\r
+ },\r
+ \r
+ show: function() {\r
+ Element.show(this.element);\r
+ }, \r
+ \r
+ hide: function() {\r
+ Element.hide(this.element);\r
+ },\r
+ \r
+ refresh: function(subject) {\r
+ if (this.chart) this.remove();\r
+ \r
+ this.chart = this.build();\r
+ this.element.appendChild(this.chart);\r
+ },\r
+ \r
+ getParam: function(name) {\r
+ return this.params.detect(function(child) {\r
+ return (child.getName() == name);\r
+ });\r
+ },\r
+ \r
+ remove: function() {\r
+ var chart = this.chart;\r
+ var element = this.element;\r
+ \r
+ $A(this.element.childNodes).any(function(child) {\r
+ if (child == chart) {\r
+ element.removeChild(child);\r
+ return true;\r
+ }\r
+ return false;\r
+ });\r
+ \r
+ this.chart = null;\r
+ },\r
+ \r
+ getChartSize: function() {\r
+ return this.getPlusChartSize() + this.getMinusChartSize();\r
+ },\r
+ \r
+ getPlusChartSize: function() {\r
+ if (this.options.graduationMax <= 0) return 0;\r
+ return this.options.graduationMax / this.options.graduationInterval * this.options.graduationRange;\r
+ },\r
+ \r
+ getMinusChartSize: function() {\r
+ if (this.options.graduationMin >= 0) return 0;\r
+ return Math.abs(this.options.graduationMin) / this.options.graduationInterval * this.options.graduationRange;\r
+ },\r
+ \r
+ getBarSize: function(param) {\r
+ var size = param.getValue() / this.options.graduationInterval * this.options.graduationRange;\r
+ return Math.abs(size);\r
+ },\r
+ \r
+ getFontSize: function() {\r
+ var arr = this.fontSize.split(' ');\r
+ if (arr.length == 0) return 0;\r
+ \r
+ var size = arr.detect(function(child) {\r
+ return child.match(/px$/);\r
+ });\r
+ if (!size) return 0;\r
+ \r
+ var index = size.indexOf('px');\r
+ if (index < 1) return 0;\r
+ \r
+ size = size.substring(0, index);\r
+ if (isNaN(size)) return 0;\r
+ \r
+ return parseInt(size);\r
+ }\r
+}\r
+\r
+var HorizontalBarChart = Class.create();\r
+Object.extend(Object.extend(HorizontalBarChart.prototype, AbstractBarChart.prototype), {\r
+ \r
+ init: function() {\r
+ this.nameWidth = 125;\r
+ this.valueWidth = 50;\r
+ this.itemInterval = 35;\r
+ this.adjustWidth = (document.all) ? 5 : 0;\r
+ },\r
+ \r
+ buildGraduationLine: function() {\r
+ if (!this.options.graduation)\r
+ return Builder.node('DIV', {style: 'margin-bottom: 5px; text-align: center;'});\r
+ \r
+ var array = new Array();\r
+ var i = this.options.graduationMin;\r
+ //var width = (document.all) ? this.options.graduationRange : this.options.graduationRange - 2;\r
+ var width = this.options.graduationRange;\r
+ \r
+ var style = new StyleManager();\r
+ style.cache('border-left', this.graduationLine);\r
+ style.cache('height', '5px');\r
+ style.cache('font-size', '5px');\r
+ \r
+ while (i <= this.options.graduationMax) {\r
+ \r
+ var j = i + this.options.graduationInterval; \r
+ if (j <= this.options.graduationMax)\r
+ style.add('border-top', this.graduationLine);\r
+ \r
+ var elm = Builder.node(\r
+ 'DIV', \r
+ {style: 'float: left; font: ' + this.fontSize + '; width: ' + width + 'px;'}, \r
+ [\r
+ Builder.node('DIV', [i]),\r
+ Builder.node('DIV', {style: style.output()})\r
+ ]\r
+ );\r
+ \r
+ array.push(elm);\r
+ i = j;\r
+ style.clear();\r
+ }\r
+ return Builder.node('DIV', {style: 'margin-left: ' + (this.nameWidth + this.valueWidth) + 'px; padding-bottom: ' + this.itemInterval + 'px;'}, array);\r
+ },\r
+ \r
+ buildContent: function() {\r
+ var nodes = new Array();\r
+ \r
+ var valueStyle = new StyleManager();\r
+ valueStyle.cache('font', this.fontSize);\r
+ valueStyle.cache('text-align', 'right');\r
+ \r
+ for (var i = 0; i < this.params.length; i++) {\r
+ var child = this.params[i];\r
+ \r
+ var maxSize;\r
+ if (child.getValue() > 0) maxSize = this.getPlusChartSize();\r
+ else maxSize = this.getMinusChartSize();\r
+ \r
+ var barSize = this.getBarSize(child);\r
+ barSize = (barSize > maxSize) ? maxSize : barSize;\r
+ \r
+ var barNode;\r
+ if (child.options.image) {\r
+ if (child.getValue() > 0) {\r
+ \r
+ barNode = Builder.node('DIV', \r
+ [\r
+ Builder.node(\r
+ 'IMG', \r
+ {\r
+ src: child.options.image,\r
+ alt: 'bar',\r
+ width: barSize + 'px', \r
+ height: child.options.imageHeight + 'px', \r
+ style: 'float: left; margin-left: ' + (this.getMinusChartSize() + this.valueWidth) + 'px;'\r
+ }),\r
+ Builder.node(\r
+ 'DIV', \r
+ {style: 'font: ' + this.fontSize + ';'}, \r
+ [child.getValue()])\r
+ ]);\r
+ } else {\r
+ // IE fix\r
+ var leftMargin = this.getMinusChartSize() - barSize;\r
+ var width;\r
+ if (document.all && leftMargin > 125) {\r
+ width = leftMargin + this.valueWidth;\r
+ leftMargin = 0;\r
+ } else {\r
+ width = this.valueWidth;\r
+ }\r
+ \r
+ valueStyle.add('margin-left', leftMargin + 'px');\r
+ valueStyle.add('width', width + 'px');\r
+ valueStyle.add('float', 'left');\r
+ \r
+ barNode = Builder.node(\r
+ 'DIV', \r
+ [\r
+ Builder.node('DIV', {style: valueStyle.output()}, [child.getValue()]),\r
+ Builder.node('IMG', {src: child.options.image, alt: 'bar', width: barSize + 'px', height: child.options.imageHeight + 'px'})\r
+ ]);\r
+ }\r
+ \r
+ } else {\r
+ if (child.getValue() > 0) {\r
+ barNode = Builder.node(\r
+ 'DIV', \r
+ {style: 'font: ' + this.fontSize + '; margin-left: ' + (this.getMinusChartSize() + this.nameWidth + this.valueWidth + this.adjustWidth) + 'px; border-left: ' + barSize + 'px solid ' + child.options.color + ';'},\r
+ [child.getValue()]\r
+ );\r
+ } else {\r
+ var width = (document.all) ? (this.valueWidth + barSize) : this.valueWidth;\r
+ \r
+ valueStyle.add('margin-left', (this.nameWidth + this.getMinusChartSize() - barSize) + 'px');\r
+ valueStyle.add('width', width + 'px');\r
+ valueStyle.add('border-right', barSize + 'px solid ' + child.options.color);\r
+ \r
+ barNode = Builder.node(\r
+ 'DIV', \r
+ [\r
+ Builder.node('DIV', {style: valueStyle.output()}, [child.getValue()])\r
+ ]\r
+ );\r
+ }\r
+ }\r
+ \r
+ var elm = Builder.node(\r
+ 'DIV', \r
+ {style: 'margin-bottom: 10px;'}, \r
+ [\r
+ Builder.node('DIV', {style: 'text-align: right; font: ' + this.fontSize + ';float: left; width: ' + this.nameWidth + 'px;'}, [child.getName()]),\r
+ barNode\r
+ ]);\r
+ \r
+ nodes.push(elm);\r
+ valueStyle.clear();\r
+ }\r
+ \r
+ return nodes;\r
+ }\r
+});\r
+\r
+var VerticalBarChart = Class.create();\r
+Object.extend(Object.extend(VerticalBarChart.prototype, AbstractBarChart.prototype), {\r
+ \r
+ init: function() {\r
+ },\r
+ \r
+ buildGraduationLine: function() {\r
+ if (!this.options.graduation) return Builder.node('DIV');\r
+ \r
+ var numberArray = new Array();\r
+ var lineArray = new Array();\r
+ var i = this.options.graduationMax;\r
+ var next;\r
+ var lineHeight = (document.all) ? this.options.graduationRange : this.options.graduationRange - 2;\r
+ var marginTop = lineHeight - this.getFontSize();\r
+ \r
+ var numberStyle = new StyleManager();\r
+ numberStyle.cache('font', this.fontSize);\r
+ \r
+ var lineStyle = new StyleManager();\r
+ lineStyle.cache('font', this.fontSize);\r
+ \r
+ while (i >= this.options.graduationMin) {\r
+ next = i - this.options.graduationInterval;\r
+ lineHeight = (document.all) ? lineHeight - 0.3: lineHeight - 0.1;\r
+ \r
+ if (i == this.options.graduationMax) {\r
+ lineStyle.add('margin-top', '0px');\r
+ \r
+ } else if (next < this.options.graduationMin) {\r
+ numberStyle.add('margin-top', marginTop + 'px');\r
+ lineStyle.add('border-left', this.graduationLine);\r
+ lineStyle.add('border-top', this.graduationLine);\r
+ lineStyle.add('border-bottom', this.graduationLine)\r
+ lineStyle.add('height', lineHeight + 'px');\r
+ lineStyle.add('width', '100%');\r
+ \r
+ } else {\r
+ numberStyle.add('margin-top', marginTop + 'px');\r
+ lineStyle.add('border-left', this.graduationLine);\r
+ lineStyle.add('border-top', this.graduationLine);\r
+ lineStyle.add('height', lineHeight + 'px');\r
+ lineStyle.add('width', '100%');\r
+ } \r
+ \r
+ numberArray.push(Builder.node('DIV', {style: numberStyle.output()}, [i]));\r
+ \r
+ if (i == this.options.graduationMax) {\r
+ lineArray.push(Builder.node('DIV', {style: lineStyle.output()}, [Builder.node('BR')]));\r
+ } else {\r
+ lineArray.push(Builder.node('DIV', {style: lineStyle.output()}));\r
+ }\r
+ \r
+ numberStyle.clear();\r
+ lineStyle.clear();\r
+ \r
+ marginTop -= (document.all) ? 0.05 : 0.1; \r
+ i = next;\r
+ }\r
+ \r
+ return [\r
+ Builder.node('DIV', {style: 'float: left; margin-left: 10px; width: 25px; text-align: right;'}, numberArray),\r
+ Builder.node('DIV', {style: 'float: left; margin-right: 10px; margin-left: 10px; width: 5px;'}, lineArray)\r
+ ];\r
+ },\r
+ \r
+ buildContent: function() {\r
+ var nodes = new Array();\r
+ \r
+ for (var i = 0; i < this.params.length; i++) {\r
+ var child = this.params[i];\r
+ \r
+ var maxSize;\r
+ if (child.getValue() > 0) maxSize = this.getPlusChartSize();\r
+ else maxSize = this.getMinusChartSize();\r
+ \r
+ var barSize = this.getBarSize(child);\r
+ barSize = (barSize > maxSize) ? maxSize : barSize;\r
+ \r
+ var bar;\r
+ if (child.options.image) {\r
+ bar = Builder.node('IMG', {src: child.getImage(), alt: 'bar', width: '10px', height: barSize + 'px'});\r
+ } else {\r
+ bar = Builder.node('DIV', {style: 'border-top: ' + barSize + 'px solid ' + child.options.color + '; width: 10px; font-size: 0;'});\r
+ }\r
+ \r
+ var elm;\r
+ if (child.getValue() > 0) {\r
+ elm = Builder.node(\r
+ 'DIV', \r
+ {style: 'float: left; margin-right: 10px; width: 25px;'},\r
+ [\r
+ Builder.node('DIV', {style: 'margin-top: ' + (maxSize - barSize) + 'px; font: ' + this.fontSize + ';'}, [child.getValue()]),\r
+ bar,\r
+ Builder.node('DIV', {style: 'margin-top: ' + (this.getMinusChartSize() + 15) + 'px; font: ' + this.fontSize + '; padding-top: 5px; width: 10px;'}, [child.getName()])\r
+ ]);\r
+ } else {\r
+ elm = Builder.node(\r
+ 'DIV', \r
+ {style: 'float: left; margin-right: 10px; width: 25px;'},\r
+ [\r
+ Builder.node('DIV', {style: 'margin-top: ' + (this.getPlusChartSize() + this.getFontSize()) + 'px'}),\r
+ bar,\r
+ Builder.node('DIV', {style: 'font: ' + this.fontSize + ';'}, [child.getValue()]),\r
+ Builder.node('DIV', {style: 'margin-top: ' + (maxSize + 15 - (this.getFontSize() + barSize)) + 'px; font: ' + this.fontSize + '; padding-top: 5px; width: 10px;'}, [child.getName()])\r
+ ]);\r
+ }\r
+ \r
+ nodes.push(elm);\r
+ }\r
+ \r
+ nodes.push(Builder.node('DIV', {style: 'clear: left;'}));\r
+ return nodes;\r
+ }\r
+});\r
+\r
+var ChartParameter = Class.create();\r
+ChartParameter.prototype = {\r
+\r
+ initialize: function(name, value) {\r
+ if (isNaN(value)) throw '[ChartParameter] value property must be number!(' + value + ')';\r
+ \r
+ this.name = name;\r
+ this.value = value;\r
+ \r
+ this.options = Object.extend({\r
+ color: '#FF0000',\r
+ barHeight: '15',\r
+ image: false,\r
+ imageHeight: '15',\r
+ action: false\r
+ }, arguments[2] || {});\r
+ },\r
+ \r
+ getName: function() {\r
+ return this.name;\r
+ },\r
+ \r
+ getValue: function() {\r
+ return this.value;\r
+ },\r
+ \r
+ setValue: function(value) {\r
+ if (!value || isNaN(value)) this.value = 0;\r
+ else this.value = value;\r
+ },\r
+ \r
+ getImage: function() {\r
+ return this.options.image;\r
+ }\r
+}\r
+\r
+var StyleManager = Class.create();\r
+StyleManager.prototype = {\r
+ \r
+ initialize: function() {\r
+ this.cacheItems = new Array();\r
+ this.items = new Array();\r
+ },\r
+ \r
+ cache: function(style) {\r
+ if (typeof(style) == 'object') \r
+ this.cacheItems.push(style);\r
+ else if (arguments[1])\r
+ this.cacheItems.push(new StyleItem(style, arguments[1]));\r
+ },\r
+ \r
+ add: function(style) {\r
+ if (typeof(style) == 'object') \r
+ this.items.push(style);\r
+ else if (arguments[1]) \r
+ this.items.push(new StyleItem(style, arguments[1]));\r
+ },\r
+ \r
+ get: function(name) {\r
+ return this.items.detect(function(child) {\r
+ return child.getName() == name;\r
+ });\r
+ },\r
+ \r
+ remove: function(name) {\r
+ this.items = this.items.findAll(function(child) {\r
+ return child.getName() != name;\r
+ });\r
+ },\r
+ \r
+ clear: function(name) {\r
+ this.items = new Array();\r
+ },\r
+ \r
+ modify: function(name, value) {\r
+ var item = this.get(name);\r
+ \r
+ if (item) item.setValue(value);\r
+ else this.add(name, value);\r
+ },\r
+ \r
+ output: function() {\r
+ var style = '';\r
+ \r
+ this.cacheItems.each(function(child) {\r
+ style += child.toString();\r
+ });\r
+ \r
+ this.items.each(function(child) {\r
+ style += child.toString();\r
+ });\r
+ \r
+ return style;\r
+ }\r
+}\r
+\r
+var StyleItem = Class.create();\r
+StyleItem.prototype = {\r
+ \r
+ initialize: function(name, value) {\r
+ this.name = name;\r
+ this.value = value;\r
+ },\r
+ \r
+ setName: function(name) {\r
+ this.name = name;\r
+ },\r
+ \r
+ setValue: function(value) {\r
+ this.value = value;\r
+ },\r
+ \r
+ getName: function() {\r
+ return this.name;\r
+ },\r
+ \r
+ getValue: function() {\r
+ return this.value;\r
+ },\r
+ \r
+ toString: function() {\r
+ return this.getName() + ':' + this.getValue() + '; ';\r
+ }\r
+}\r
+\r
-// Copyright (c) 2006 spinelz.org (http://script.spinelz.org/)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-var Calendar = Class.create();
-Calendar.className = {
- container: 'calendar',
- header: 'calendar_header',
- preYears: 'calendar_preYears',
- nextYears: 'calendar_nextYears',
- years: 'calendar_years',
- mark: 'calendar_mark',
- ym: 'calendar_ym',
- table: 'calendar_table',
- thRight: 'right',
- tdRight: 'right',
- tdBottom: 'bottom',
- date: 'calendar_date',
- holiday: 'calendar_holiday',
- regularHoliday: 'calendar_regularHoliday',
- schedule: 'calendar_schedule',
- highlightDay: 'calendar_highlightDay',
- scheduleListContainer: 'calendar_scheduleListContainer',
- scheduleItem: 'calendar_scheduleItem',
- scheduleTimeArea: 'calendar_scheduleItemTimeArea',
- scheduleHandler: 'calendar_scheduleHandler',
- holidayName: 'calendar_holidayName',
-// holidayContainer: 'calendar_holidayContainer',
- dateContainer: 'calendar_dateContainer',
- tableHeader: 'calendar_tableHeader',
- rowContent: 'calendar_rowContent',
- selected: 'calendar_selected',
-
- nextYearMark: 'calendar_nextYearMark',
- nextMonthMark: 'calendar_nextMonthMark',
- nextWeekMark: 'calendar_nextWeekMark',
- preYearMark: 'calendar_preYearMark',
- preMonthMark: 'calendar_preMonthMark',
- preWeekMark: 'calendar_preWeekMark',
-
- weekTable: 'calendar_weekContainerTable',
- weekMainTable: 'calendar_weekMainTable',
- timeLine: 'calendar_timeline',
- timeLineTimeTop: 'calendar_timelineTimeTop',
- timeLineTime: 'calendar_timelineTime',
- headerColumn: 'calendar_headerColumn',
- columnTopDate: 'calendar_columnTopDate',
- columnDate: 'calendar_columnDate',
- columnDateOdd: 'calendar_columnOddDate',
- scheduleItemSamll: 'calendar_scheduleItemSmall',
- scheduleItemLarge: 'calendar_scheduleItemLarge',
- scheduleItemNoBorder: 'calendar_scheduleItemNoBorder',
- scheduleItemSelect: 'calendar_scheduleItemSelect',
- deleteImg: 'calendar_deleteImage',
- privateImg: 'calendar_privateImage',
- scheduleContainer: 'calendar_weekScheduleContainer',
- selector: 'calendar_selector',
- cover: 'calendar_cover'
-}
-
-Calendar.smallClassName = {
- container: 'calendar_small',
- header: 'calendar_header_small',
- calendar: 'calendar_calendar_small',
- table: 'calendar_tableSmall'
-}
-
-Calendar.size = {
- large: 'large',
- small: 'small'
-}
-
-/**
- * Calendar Class
- */
-Calendar.prototype = {
-
- initialize: function(element) {
- this.building = true;
- this.element = $(element);
- Element.setStyle(this.element, {visibility: 'hidden'});
- Element.hide(this.element);
-
- this.options = Object.extend({
- initDate: new Date(),
- cssPrefix: 'custom_',
- holidays: [],
- schedules: [],
- size: Calendar.size.large,
- regularHoliday: [0, 6],
- displayIndexes: [0, 1, 2, 3, 4, 5, 6],
- displayTime: [{hour: 0, min: 0}, {hour: 24, min: 0}],
- weekIndex: 0,
- dblclickListener: null,
- afterSelect: Prototype.emptyFunction,
- beforeRefresh: Prototype.emptyFunction,
- changeSchedule: Prototype.emptyFunction,
- changeCalendar: Prototype.emptyFunction,
- displayType: 'month',
- highlightDay: true,
- beforeRemoveSchedule: function() {return true;},
- dblclickSchedule: null,
- updateTirm: Prototype.emptyFunction,
- displayTimeLine: true,
- clickDateText: null,
- monthHeaderFormat: null,
- weekHeaderFormat: null,
- weekSubHeaderFormat: null,
- dayHeaderFormat: null,
- dayOfWeek: DateUtil.dayOfWeek
- }, arguments[1] || {});
-
- this.options.holidays = this.toHolidayHash(this.options.holidays);
-// this.options.schedules = this.toScheduleHash(this.options.schedules);
-
- this.setIndex();
-
- this.classNames = null;
- if (this.options.size == Calendar.size.large) {
- this.classNames = Calendar.className;
- } else {
- this.classNames = $H({}).merge(Calendar.className);
- this.classNames = this.classNames.merge(Calendar.smallClassName);
- }
- var customCss = CssUtil.appendPrefix(this.options.cssPrefix, this.classNames);
- this.classNames = new CssUtil([this.classNames, customCss]);
-
- this.date = this.options.initDate;
-
- this.calendar = this.build();
- this.element.appendChild(this.calendar);
-
- Event.observe(document, "mouseup", this.onMouseUp.bindAsEventListener(this));
- Element.setStyle(this.element, {visibility: 'visible'});
- Element.show(this.element);
- this.builder.afterBuild();
- this.windowResize = this.onResize.bind(this);
- if (this.options.size != 'small') Event.observe(window, "resize", this.windowResize);
- this.building = false;
- },
-
- onResize: function() {
- try {
- var oldDimentions = this.builder.containerDimensions;
- var dimentions = Element.getDimensions(this.builder.container);
- if (dimentions.height != oldDimentions.height || dimentions.width != oldDimentions.width) {
- this.refresh();
- }
- } catch(e) {}
- },
-
- destroy: function() {
- Event.stopObserving(window, 'resize', this.windowResize);
- },
-
- setIndex: function() {
- var options = this.options;
- var bottom = [];
- var up = [];
- var index = null;
- options.displayIndexes.sort();
- options.displayIndexes.each(function(i) {
- if (index == null) {
- if (options.weekIndex <= i) {
- index = i;
- up.push(i);
- } else {
- bottom.push(i);
- }
- } else {
- up.push(i);
- }
- });
- options.displayIndexes = up.concat(bottom);
- this.setLastWday();
- },
-
- setLastWday: function() {
- var firstIndex = this.options.weekIndex;
- var sat = 6;
- var sun = 0;
- var week = $R(firstIndex, sat, false).toArray();
- if (firstIndex != sun) {
- week = week.concat($R(sun, firstIndex - 1, false).toArray());
- }
- this.lastWday = week.last();
- this.wdays = week;
- },
-
- build: function() {
- if (this.builder) {
- this.builder.destroy();
- }
-
- if (this.options.displayType == 'week') {
- this.builder = new CalendarWeek(this);
- } else if (this.options.displayType == 'day') {
- this.builder = new CalendarDay(this);
- } else {
- this.builder = new CalendarMonth(this);
- }
-
- this.builder.beforeBuild();
- return this.builder.build();
- },
-
- /*** Calendar ***/
- /********************************** public method **********************************/
- undo: function() {
- if (this.cached) {
- this.cached.start = this.cached.start_old;
- this.cached.finish = this.cached.finish_old;
- this.cached = null;
- this.refreshSchedule();
- }
- },
-
- hideSatSun: function() {
- var sun = 0;
- var sat = 6;
- this.options.displayIndexes = this.options.displayIndexes.without(sun, sat);
- this.setIndex();
- this.refresh();
- },
-
- showSatSun: function() {
- var sun = 0;
- var sat = 6;
- var indexes = this.options.displayIndexes;
- if (!indexes.include(sun)) {
- indexes.push(sun);
- }
- if (!indexes.include(sat)) {
- indexes.push(sat);
- }
- this.setIndex();
- this.refresh();
- },
-
- changeDisplayIndexes: function(indexes) {
- this.options.displayIndexes = indexes;
- this.setIndex();
- this.refresh();
- },
-
- changeDisplayTime: function(time) {
- this.options.displayTime = time;
- this.refresh();
- },
-
- refresh: function() {
- try {
- if (!this.building) {
- this.building = true;
- this.options.beforeRefresh(this);
- this.destroy();
- this.selectedBase = null;
- Element.remove(this.calendar);
- this.calendar = this.build();
- this.element.appendChild(this.calendar);
- this.builder.afterBuild();
- if (this.options.size != 'small') Event.observe(window, 'resize', this.windowResize);
- this.building = false;
- }
- } catch (e) {}
- },
-
- changeCalendar: function(event) {
- this.builder.changeCalendar(event);
- },
-
- changeDisplayType: function(type) {
- this.options.displayType = type;
- this.refresh();
- },
-
- selectDate: function(event) {
- var calendar = this;
- this.abstractSelect(event, function(date, element) {
- if (calendar.selectedBase || calendar.hasSelectedDate()) {
- if (event.ctrlKey) {
- if (Element.hasClassName(element, Calendar.className.selected)) {
- calendar.addSelectedClass(element);
- return;
- }
- } else if (calendar.selectedBase) {
- var selectedId = calendar.selectedBase.id;
- $(selectedId).className = calendar.selectedBase.className;
- calendar.clearSelected();
- if (selectedId == element.id) {
- calendar.selectedBase = null;
- return;
- }
- }
- }
-
- calendar.selectedBase = {id: element.id, date: date, className: element.className};
- calendar.addSelectedClass(element);
- if (date && calendar.options.displayType == 'month' && calendar.options.size == Calendar.size.small) {
- calendar.options.afterSelect(date, calendar);
- }
- });
-
- if (calendar.options.displayType != 'month' || calendar.options.size != Calendar.size.small) {
- this.mouseDown = true;
- }
- },
-
- clearSelect: function() {
- // BETA
- this.selectedBase = null;
- this.clearSelected();
- },
-
- showDayOfWeek: function(dayOfWeek) {
- var indexes = this.options.displayIndexes;
- this.recurrence(dayOfWeek, function(d) {
- if (!indexes.include(d)) {
- indexes.push(d);
- }
- });
- this.setIndex();
- this.refresh();
- },
-
- hideDayOfWeek: function(dayOfWeek) {
- var indexes = this.options.displayIndexes;
- var self = this;
- this.recurrence(dayOfWeek, function(d) {
- var index = self.findIndex(indexes, d);
- if (index) {
- indexes.remove(index);
- } else if (!index.isNaN) {
- indexes.shift();
- }
- });
- this.refresh();
- },
-
- addHoliday: function(object) {
- object = this.inspectArgument(object);
- var newHash = this.toHolidayHash(object);
- this.options.holidays = this.options.holidays.merge(newHash);
- this.refresh();
- },
-
- removeHoliday: function(date) {
- var calendar = this;
- date = calendar.inspectDateArgument(date);
- if (!date) return;
-
- this.recurrence(date, function(d) {
- var key = d.toDateString();
- if (calendar.options.holidays[key])
- delete calendar.options.holidays[key];
- });
- this.refresh();
- },
-
- refreshHoliday: function(object, rebuild) {
- object = this.inspectArgument(object);
- this.options.holidays = this.toHolidayHash(object);
- if (rebuild) this.refresh();
- },
-
- clearHoliday: function() {
- this.refreshHoliday([], true);
- },
-
- getHoliday: function(date) {
- date = this.inspectDateArgument(date);
- if (!date) return;
-
- var calendar = this;
- var holidays = [];
- this.recurrence(date, function(o) {
- var h = calendar.options.holidays[o.toDateString()];
- if (h) holidays.push(h);
- });
-
- return holidays;
- },
-
- addSchedule: function(schedule) {
- var schedules = this.options.schedules;
- if (schedule.constructor == Array) {
- schedule.each(function(s) {
- var find = schedules.detect(function(tmp) {return s.id == tmp.id});
- if (!find) schedules.push(s);
- });
- } else {
- var find = schedules.detect(function(tmp) {return tmp.id == schedule.id});
- if (!find) schedules.push(schedule);
- }
- this.refreshSchedule();
- },
-
- replaceSchedule: function(schedules) {
- this.options.schedules = schedules;
- this.refreshSchedule();
- },
-
- removeSchedule: function(ids, refresh) {
- if (ids.constructor != Array) ids = [ids];
- var self = this;
- ids.each(function(id) {
- var index = null;
- self.options.schedules.each(function(s, i) {
- if (s.id == id) {
- index = i;
- throw $break;
- }
- });
-
- if (index != null) {
- var schedule = self.options.schedules[index];
- if (schedule) {
- self.options.schedules.remove(index);
- }
- }
- });
- if (refresh) this.refreshSchedule();
- },
-
- refreshSchedule: function() {
- this.builder.scheduleNodes.each(function(node) {
- Element.remove(node);
- });
- this.builder.afterBuild();
- },
-
- mergeSchedule: function(schedule) {
- var index = -1;
- this.options.schedules.each(function(s, i) {
- if (s.id == schedule.id) {
- index = i;
- throw $break;
- }
- });
- if (index != -1) {
- this.options.schedules[index] = schedule;
- this.refreshSchedule();
- } else {
- this.addSchedule(schedule);
- }
- },
-
- clearSchedule: function() {
- this.options.schedules = [];
- this.refreshSchedule();
- },
-
- getSchedule: function(object) {
- var result = [];
- var calendar = this;
- object = this.inspectArgument(object || {});
-
- this.recurrence(object, function(o) {
- var schedule = calendar.options.schedules[o.date.toDateString()];
- if (!schedule) return;
-
- if (o.start) {
- schedule = schedule.detect(function(s) {
- return ((s.start.hour == o.start.hour) && (s.start.min == o.start.min));
- });
- if (schedule) result.push(schedule);
- } else if (o.number) {
- schedule = schedule[o.number];
- if (schedule) result.push(schedule);
- } else {
- result = result.concat(schedule);
- }
- });
-
- return result;
- },
-
- getSelected: function() {
- return this.element.getElementsByClassName(Calendar.className.selected, this.element);
- },
-
- changeSchedule: function() {
- var calendar = this;
- return function(drag, drop) {
- var array = drag.id.split('_');
- var i = array.pop();
- var date = array.pop();
-
- date = calendar.getDate(date);
- var newDate = calendar.getDate(drop);
-
- var schedule = calendar.getSchedule({date: date, number: i});
- if (schedule.length != 1) return;
-
- schedule = schedule.pop();
- schedule.date = newDate;
- calendar.removeSchedule({date: date, number: i}, false);
- calendar.addSchedule(schedule);
-
- calendar.options.changeSchedule(schedule);
- }
- },
-
- getSelectedDates: function() {
- return this.builder.getSelectedDates();
- },
-
- getSelectedTerm: function() {
- return this.builder.getSelectedTerm();
- },
-
- /********************************** private method **********************************/
- abstractSelect: function(event, method) {
- this.builder.abstractSelect(event, method);
- },
-
- createRange: function(a, b) {
- var range = null;
- if (a <= b)
- range = $R(a, b);
- else
- range = $R(b, a);
- return range;
- },
-
- formatTime: function(time) {
- var hour = (time.hour < 10) ? '0' + time.hour : time.hour;
- var min = (time.min < 10) ? '0' + time.min : time.min;
- return hour + ':' + min;
- },
-
- clearSelected: function() {
- var elements = this.getSelected();
- var self = this;
- elements.each(function(e) {
- if (Element.hasClassName(e, Calendar.className.selected))
- self.removeSelectedClass(e);
- });
- },
-
- onDblClick: function(event) {
- this.abstractSelect(event, this.options.dblclickListener);
- },
-
- onMouseUp: function(event) {
- var e = event || window.event;
- var calendar = this;
- if (calendar.mouseDown) {
- setTimeout(function() {
- calendar.mouseDown = false;
- calendar.options.afterSelect(event);
- }, 10);
- }
- },
-
- setRegularHolidayClass: function(node) {
- this.classNames.refreshClassNames(node, 'regularHoliday');
- },
-
- setHolidayClass: function(node) {
- this.classNames.refreshClassNames(node, 'holiday');
- },
-
- setWorkdayClass: function(node) {
- this.classNames.refreshClassNames(node, 'date');
- },
-
- setScheduleClass: function(node) {
- this.classNames.refreshClassNames(node, 'schedule');
- },
-
- addHighlightClass: function(node) {
- Element.addClassName(node, Calendar.className.highlightDay);
- },
-
- addSelectedClass: function(node) {
- Element.addClassName(node, Calendar.className.selected);
- },
-
- removeSelectedClass: function(node) {
- Element.removeClassName(node, Calendar.className.selected);
- },
-
- getDatasWithMonthAndYear: function(array) {
- var calendar = this;
- var result = array.findAll(function(h) {
- return calendar.isSameYearAndMonth(h.date);
- });
-
- return result;
- },
-
- isSameYearAndMonth: function(a, b) {
- if (a.constructor == Date) {
- if (!b) b = this.date;
- return ((a.getYear() == b.getYear()) && (a.getMonth() == b.getMonth()));
- } else {
- return (a.year == b.year && a.month == b.month && a.day == a.day);
- }
- },
-
- isSameDate: function(a, b) {
- if (a.constructor == Date) {
- if (!b) b = this.date;
- return (this.isSameYearAndMonth(a, b) && (a.getDate() == b.getDate()));
- } else {
- return (this.isSameYearAndMonth(a, b) && a.day == b.day);
- }
- },
-
- isSameTime: function(a, b) {
- return ((a.hour == b.hour) && (a.min == b.min));
- },
-
- betweenDate: function(schedule, date) {
- var start = this.toDateNumber(schedule.start);
- var finish = this.toDateNumber(schedule.finish);
- date = this.toDateNumber(date);
- return start <= date && date <= finish;
- },
-
- toDateNumber: function(date) {
- if (date.constructor == Date) {
- return date.getFullYear() * 10000 + date.getMonth() * 100 + date.getDate();
- } else {
- return date.year * 10000 + date.month * 100 + date.day;
- }
- },
-
- getTimeDiff: function(a, b) {
- var time = {hour: b.hour - a.hour, min: b.min - a.min};
- if (time.min >= 60) {
- time.hour++;
- time.min -= 60;
- } else if (time.min < 0) {
- time.hour--;
- time.min += 60;
- }
- return time;
- },
-
- findIndex: function(array, value) {
- var index = null;
- array.each(function(v, i) {
- if (v == value) {
- index = i;
- throw $break;
- }
- });
- return index;
- },
-
- recurrence: function(object, method) {
- var calendar = this;
- if (object.constructor == Array) {
- object.each(function(o) {calendar.recurrence(o, method)});
- } else if (object.keys) {
- object.each(function(pair) {calendar.recurrence(pair[1], method)});
- } else {
- method(object);
- }
- },
-
- toHolidayHash: function(object) {
- var calendar = this;
- var hash = {};
-
- this.recurrence(object, function(o) {
- if (!o.name) return;
- if (o.date.constructor == Object)
- o.date = new Date(o.date.year, o.date.month, o.date.day);
-
- hash[o.date.toDateString()] = o;
- });
- return $H(hash);
- },
-
-// toScheduleHash: function(object) {
-// var calendar = this;
-// var hash = {};
-//
-// this.recurrence(object, function(o) {
-// if (!o.description) return;
-// if (o.date.constructor == Object)
-// o.date = new Date(o.date.year, o.date.month, o.date.day);
-//
-// var date = o.date.toDateString();
-// o.date = date;
-//
-// if (hash[date]) {
-// hash[date].push(o);
-// hash[date].sort(calendar.sortSchedule);
-// } else {
-// hash[date] = [o];
-// }
-// });
-// return $H(hash);
-// },
-
- inspectArgument: function(object, time) {
- return this.builder.inspectArgument(object, time);
- },
-
- inspectDateArgument: function(date) {
- return this.builder.inspectDateArgument(date);
- },
-
- sortSchedule: function(a, b) {
- if (a.start.hour == b.start.hour) {
- if (a.start.min == b.start.min)
- return 0;
- if (a.start.min < b.start.min)
- return -1;
- return 1;
- }
- if (a.start.hour < b.start.hour) return -1;
-
- return 1;
- },
-
- hasSelectedDate: function() {
- return (this.getSelected().length != 0);
- },
-
- getDate: function(element) {
- return this.builder.getDate(element);
- },
-
- isRegularHoliday: function(day) {
- return this.options.regularHoliday.include(day);
- },
-
- isHoliday: function(date) {
- return this.options.holidays[date.toDateString()];
- },
-
- isScheduleDay: function(date) {
- return this.options.schedules[date.toDateString()];
- },
-
- cacheSchedule: function(schedule) {
- this.cached = schedule;
- schedule.start_old = Object.clone(schedule.start);
- schedule.finish_old = Object.clone(schedule.finish);
- }
-}
-
-
-/**
- * AbstractCalendar Class
- */
-var AbstractCalendar = Class.create();
-AbstractCalendar.id = {
- container: 'container',
- scheduleContainer: 'scheduleContainer',
- selector: 'selector'
-}
-AbstractCalendar.prototype = {
- destroy: Prototype.emptyFunction,
- beforeBuild: Prototype.emptyFunction,
-
- build: function() {
- this.header = this.buildHeader();
- var node = Builder.node(
- 'DIV',
- {
- id: this.getContainerId(),
- className: this.calendar.classNames.joinClassNames('container')
- },
- [this.header, this.buildCalendar()]);
-
- return node;
- },
-
- buildHeader: function() {
- var headerNodes = Builder.node('TR');
- headerNodes.appendChild(this.buildHeaderLeft());
- headerNodes.appendChild(this.buildHeaderCenter());
- headerNodes.appendChild(this.buildHeaderRight());
-
- className = this.calendar.classNames.joinClassNames('header');
- var tbody = Builder.node('TBODY', [headerNodes]);
- return Builder.node('TABLE', {className: className}, [tbody]);
- },
-
- buildSelector: function() {
- // create selector
- var selector = Builder.node('DIV', {id: this.getSelectorId()});
- this.calendar.classNames.addClassNames(selector, 'selector');
- Element.setOpacity(selector, 0.6);
- Element.hide(selector);
- Element.setStyle(selector, {zIndex: ZindexManager.getIndex()})
- return selector;
- },
-
- buildCover: function() {
- this.cover = Builder.node('div', {id: this.calendar.element.id.appendSuffix('cover')});
- this.calendar.classNames.addClassNames(this.cover, 'cover');
- Event.observe(this.cover, 'mousedown', this.calendar.selectDate.bindAsEventListener(this.calendar));
- if (this.calendar.options.displayType != 'month' || this.calendar.options.size != 'samll') {
- Event.observe(this.cover, 'mousemove', this.multipleSelection.bindAsEventListener(this));
- }
- return this.cover;
- },
-
- buildScheduleContainer: function() {
- this.container = Builder.node('DIV', {style: 'position: relative', id: this.getScheduleContainerId()});
- return this.container;
- },
-
- // the default is empty.
- // overwride this method.
- setScheduleContainerEvent: Prototype.emptyFunction,
-
- changeCalendar: function(event) {
- var element = Event.element(event);
- var date = this.calendar.date;
- var oldDate = new Date(date.toDateString());
-
- if (Element.hasClassName(element, Calendar.className.preYearMark)) {
- date.setFullYear(date.getFullYear() - 1);
- } else if (Element.hasClassName(element, Calendar.className.preMonthMark)) {
- date.setDate(1);
- date.setMonth(date.getMonth() - 1);
- } else if (Element.hasClassName(element, Calendar.className.preWeekMark)) {
- date.setDate(date.getDate() - 7);
- } else if (Element.hasClassName(element, Calendar.className.nextYearMark)) {
- date.setFullYear(date.getFullYear() + 1);
- } else if (Element.hasClassName(element, Calendar.className.nextMonthMark)) {
- date.setDate(1);
- date.setMonth(date.getMonth() + 1);
- } else if (Element.hasClassName(element, Calendar.className.nextWeekMark)) {
- date.setDate(date.getDate() + 7);
- }
-
- this.calendar.options.changeCalendar(date, oldDate);
- this.calendar.refresh();
- },
-
- clickDeleteImage: function(schedule) {
- if (this.calendar.options.beforeRemoveSchedule(schedule)) {
- this.calendar.removeSchedule(schedule.id, true);
- }
- },
-
- showDeleteImage: function(img) {
- Element.show(img);
- },
-
- hideDeleteImage: function(img) {
- Element.hide(img);
- },
-
- _constrain: function(n, lower, upper) {
- if (n > upper) return upper;
- else if (n < lower) return lower;
- else return n;
- },
-
- getContainerId: function() {
- return this.calendar.element.id.appendSuffix(AbstractCalendar.id.container);
- },
-
- getScheduleContainerId: function() {
- return this.calendar.element.id.appendSuffix(AbstractCalendar.id.scheduleContainer);
- },
-
- setColumnWidth: function() {
- var adjustSize = this.getAdjustSize();
- var container = $(this.getScheduleContainerId()) || this.container;
- var indexes = this.calendar.options.displayIndexes;
- this.column.width = container.offsetWidth / indexes.length - adjustSize;
- if (this.column.width < 0) this.column.width = 0;
- },
-
- setCover: function() {
- var container = $(this.getScheduleContainerId()) || this.container;
- if (!this.cover) {
- container.appendChild(this.buildCover());
- }
- Element.setStyle(this.cover, {height: Element.getHeight(container) + 'px'});
- },
-
- getDragDistance: function() {
- var adjustSize = this.getAdjustSize();
-// return [this.column.width + adjustSize, this.column.height];
- return [this.column.width + adjustSize, this.column.height / 2];
- },
-
- getWeek: function() {
- var date = this.calendar.date;
- var baseDay = date.getDay();
- var baseDayIndex = date.getDay();
- var findBaseDay = false;
-
- return this.calendar.options.displayIndexes.map(function(week, i) {
- var diff = week - baseDay;
- if (!findBaseDay && (diff > 0)) diff -= 7;
- if (baseDayIndex == week) findBaseDay = true;
- return DateUtil.afterDays(date, diff);
- });
- },
-
- isSameStartDate: function(schedule, date) {
- return ((date.getFullYear() == schedule.start.year) &&
- (date.getMonth() == schedule.start.month) && (date.getDate() == schedule.start.day));
- },
-
- isSameFinishDate: function(schedule, date) {
- return ((date.getFullYear() == schedule.finish.year) &&
- (date.getMonth() == schedule.finish.month) && (date.getDate() == schedule.finish.day));
- },
-
- getSelectorId: function() {
- return this.calendar.element.id.appendSuffix(AbstractCalendar.id.selector);
- },
-
- clickDateText: function(event, date) {
- Event.stop(event);
- this.calendar.date = date;
- this.calendar.options.displayType = 'day';
- this.calendar.refresh();
- },
-
- getAdjustSize: function() {
- return UserAgent.isIE() ? 3 : 3;
- },
-
- setContainerInfo: function() {
- this.container = $(this.getScheduleContainerId());
- this.containerDimensions = Element.getDimensions(this.container);
- this.containerOffset = Position.cumulativeOffset(this.container);
- },
-
- mouseOverSubSchedule: function(items) {
- items.each(function(item) {
- Element.addClassName(item, Calendar.className.scheduleItemSelect);
- });
- },
-
- mouseOutSubSchedule: function(items) {
- items.each(function(item) {
- Element.removeClassName(item, Calendar.className.scheduleItemSelect);
- });
- },
-
- toDate: function(hash) {
- return DateUtil.toDate(hash);
- }
-}
-
-
-/**
- * CalenderMonth Class
- */
-var CalendarMonth = Class.create();
-CalendarMonth.id = {
- year: 'year',
- month: 'month',
- column: 'column',
- nextYear: 'nextYear',
- nextMonth: 'nextMonth',
- preYear: 'preYear',
- preMonth: 'preMonth',
- calTable: 'calTable',
- scheduleContainer: 'scheduleContainer',
- container: 'container'
-}
-Object.extend(CalendarMonth.prototype, AbstractCalendar.prototype);
-Object.extend(CalendarMonth.prototype, {
-
- initialize: function(calendar) {
- this.calendar = calendar;
- this.week = this.getWeek();
- },
-
- /*** Month ***/
- /********************************** build functions **********************************/
- buildHeaderLeft: function() {
- var container = Builder.node('TD');
- this.calendar.classNames.addClassNames(container, 'preYears');
-
- var id = this.calendar.element.id.appendSuffix(CalendarMonth.id.preYear);
- var node = Builder.node('DIV', {id: id});
- this.calendar.classNames.addClassNames(node, 'preYearMark');
- Event.observe(node, "click", this.calendar.changeCalendar.bindAsEventListener(this.calendar));
- container.appendChild(node);
-
- id = this.calendar.element.id.appendSuffix(CalendarMonth.id.preMonth);
- node = Builder.node('DIV', {id: id});
- this.calendar.classNames.addClassNames(node, 'preMonthMark');
- Event.observe(node, "click", this.calendar.changeCalendar.bindAsEventListener(this.calendar));
- container.appendChild(node);
-
- return container;
- },
-
- buildHeaderCenter: function() {
- var text = [];
- if (this.calendar.options.monthHeaderFormat) {
- var date = this.calendar.date;
- var templ = new Template(this.calendar.options.monthHeaderFormat);
- text = [templ.evaluate({year: date.getFullYear(), month: date.getMonth() + 1}), ' '];
- }
- var contents = [];
-
- var id = this.calendar.element.id.appendSuffix(CalendarMonth.id.month);
- var node = Builder.node('SPAN', {id: id}, [text[0] || DateUtil.months[this.calendar.date.getMonth()]]);
- this.calendar.classNames.addClassNames(node, 'ym');
- contents.push(node);
-
- id = this.calendar.element.id.appendSuffix(CalendarMonth.id.year);
- node = Builder.node('SPAN', {id: id}, [text[1] || this.calendar.date.getFullYear()]);
- this.calendar.classNames.addClassNames(node, 'ym');
- contents.push(node);
-
- var container = Builder.node('TD', contents);
- this.calendar.classNames.addClassNames(container, 'years');
-
- return container;
- },
-
- buildHeaderRight: function() {
- var container = Builder.node('TD');
- this.calendar.classNames.addClassNames(container, 'nextYears');
-
- var id = this.calendar.element.id.appendSuffix(CalendarMonth.id.nextMonth);
- var node = Builder.node('DIV', {id: id});
- this.calendar.classNames.addClassNames(node, 'nextMonthMark');
- Event.observe(node, "click", this.calendar.changeCalendar.bindAsEventListener(this.calendar));
- container.appendChild(node);
-
- id = this.calendar.element.id.appendSuffix(CalendarMonth.id.nextYear);
- node = Builder.node('DIV', {id: id});
- this.calendar.classNames.addClassNames(node, 'nextYearMark');
- Event.observe(node, "click", this.calendar.changeCalendar.bindAsEventListener(this.calendar));
- container.appendChild(node);
-
- return container;
- },
-
- buildCalendar: function() {
- var container = Builder.node('DIV');
- var scheduleContainer = Builder.node('DIV',
- {id: this.getScheduleContainerId(), style: 'position: relative'},
- [this.buildTableData()]);
- this.setScheduleContainerEvent(scheduleContainer);
-
- // create selector
- var selector = this.buildSelector();
- scheduleContainer.appendChild(selector);
- return Builder.node('DIV', [this.buildTableHeader(), scheduleContainer]);
- },
-
- buildTableHeader: function() {
- var weekArray = new Array();
- var self = this;
- var tbody = Builder.node('TBODY');
- var tr = Builder.node('TR', weekArray);
- var width = 100 / this.calendar.options.displayIndexes.length + '%';
- var lastIndex = this.calendar.options.displayIndexes.last();
-
- tbody.appendChild(tr);
-
- this.calendar.options.displayIndexes.each(function(i) {
- var id = self.calendar.element.id.appendSuffix(CalendarMonth.id.column);
- var text = self.calendar.options.dayOfWeek[i];
- var node = Builder.node('TH', {id: id.appendSuffix(i)}, [text]);
- node.width = width;
- weekArray.push(node);
- if (lastIndex == i) {
- self.calendar.classNames.addClassNames(node, 'thRight');
- }
- Event.observe(node, 'click', self.selectDay.bindAsEventListener(self));
- tr.appendChild(node);
- });
-
- return Builder.node('TABLE',
- {className: this.calendar.classNames.joinClassNames('table')}, [tbody]);
- },
-
- buildTableData: function() {
- var indexes = this.calendar.options.displayIndexes;
- var today = new Date();
- var year = this.calendar.date.getFullYear();
- var month = this.calendar.date.getMonth();
- var firstDay = DateUtil.getFirstDate(year, month).getDay();
- var lastDate = DateUtil.getLastDate(year, month).getDate();
- var trs = new Array();
- var tds = new Array();
- var width = 100 / indexes.length + '%';
- var lastIndex = indexes.last();
- var node, hday, sday, tmp_date, isOutside, i = null;
-
- // set start index
- var weekIndex = this.calendar.options.weekIndex;
- var length = DateUtil.dayOfWeek.length * 5;
- var i = null;
- var day = 1;
- if (weekIndex <= firstDay) {
- i = weekIndex;
- length += i;
- } else {
- i = weekIndex - 7;
- length -= i;
- }
-
- var diff = firstDay - weekIndex;
- if (diff < 0) diff + indexes.length;
- if ((lastDate + diff) > length) {
- length += indexes.length;
- }
-
- var wday = weekIndex;
-
- var find = 0;
- for (; i < length; i++) {
- if (indexes.include(wday)) {
- if (i < firstDay) {
- tmp_date = new Date(
- this.calendar.date.getFullYear(),
- this.calendar.date.getMonth(),
- i - firstDay + 1
- );
- node = Builder.node('TD');
- node.innerHTML = ' ';
- node.date = tmp_date;
- node.width = width;
- tds.push(node);
- } else if (day > lastDate) {
- tmp_date = new Date(
- this.calendar.date.getFullYear(),
- this.calendar.date.getMonth(),
- day
- );
- node = Builder.node('TD');
- node.innerHTML = ' ';
- node.date = tmp_date;
- tds.push(node);
- } else {
- if (i == firstDay) length += find;
- tmp_date = new Date(
- this.calendar.date.getFullYear(),
- this.calendar.date.getMonth(),
- day
- );
- hday = this.calendar.options.holidays[tmp_date.toDateString()];
-
- if (this.calendar.options.size == Calendar.size.large) {
- node = this.buildLargeRow(tmp_date, hday, sday, today);
- if (this.calendar.options.dblclickListener) {
- Event.observe(node, 'dblclick', this.calendar.onDblClick.bindAsEventListener(this.calendar));
- }
- } else {
- sday = this.calendar.options.schedules.detect(function(schedule) {
- var startDate = DateUtil.toDate(schedule.start);
- return tmp_date.sameDate(startDate)
- });
- node = this.buildSmallRow(tmp_date, hday, sday, today);
- Event.observe(node, 'mousedown', this.calendar.selectDate.bindAsEventListener(this.calendar));
- }
-
- node.width = width;
- node.date = tmp_date;
-
- tds.push(node);
- }
- find++;
- }
-
- if (i >= firstDay) {
- day++;
- }
-
- if (wday == lastIndex) {
- trs.push(Builder.node('TR', tds));
- this.calendar.classNames.addClassNames(tds[tds.length - 1], 'tdRight');
- tds = new Array();
- }
-
- if (wday >= 6) {
- wday = 0;
- } else {
- wday++;
- }
- }
-
- this.rowMax = trs.length - 1;
- var tbody = Builder.node('TBODY', [trs]);
- this.calendarTable = Builder.node(
- 'TABLE',
- {
- id: this.getCalendarTableId(),
- className: this.calendar.classNames.joinClassNames('table')
- },
- [tbody]);
- return this.calendarTable;
- },
-
- buildLargeRow: function(date, holiday, schedule, today) {
- var calendar = this;
- var row = Builder.node('TD', {id: this.getDateId(date)});
- var dateContainer = Builder.node('DIV');
-
- this.calendar.classNames.addClassNames(dateContainer, 'dateContainer');
- row.appendChild(dateContainer);
-
- var dateNode = null;
- var clickDateText = this.calendar.options.clickDateText;
- if (clickDateText) {
- dateNode = Builder.node('A', {href: '#'}, [date.getDate()]);
- Event.observe(dateContainer, 'mousedown', clickDateText.bindAsEventListener(this, date));
- } else if (clickDateText == null) {
- dateNode = Builder.node('A', {href: '#'}, [date.getDate()]);
- Event.observe(dateContainer, 'mousedown', this.clickDateText.bindAsEventListener(this, date));
- } else {
- dateNode = Builder.node('SPAN', [date.getDate()]);
- Element.setStyle(dateNode, {textDecoration: 'none'});
- }
- if (date.days() == today.days()) {
- this.calendar.addHighlightClass(dateNode);
- }
- dateContainer.appendChild(dateNode);
-
- if (holiday) {
- this.calendar.setHolidayClass(row);
- var name = Builder.node(
- 'SPAN',
- {className: this.calendar.classNames.joinClassNames('holidayName')},
- holiday.name
- );
- dateContainer.appendChild(name);
- if (holiday.onclick) {
- Event.observe(name, "click", holiday.onclick.bindAsEventListener(this));
- }
- } else if (this.calendar.isRegularHoliday(date.getDay())) {
- this.calendar.setRegularHolidayClass(row);
- } else {
- this.calendar.setWorkdayClass(row);
- }
-
- return row;
- },
-
- buildSmallRow: function(date, holiday, schedule, today) {
- var row = Builder.node('TD', {id: this.getDateId(date)}, [date.getDate()]);
- if (schedule) {
- this.calendar.setScheduleClass(row);
- var first = schedule[0];
- if (first) row.title = first.description.stripTags();
- } else if (holiday) {
- this.calendar.setHolidayClass(row);
- row.title = holiday.name.stripTags();
- } else if (this.calendar.isRegularHoliday(date.getDay())) {
- this.calendar.setRegularHolidayClass(row);
- } else {
- this.calendar.setWorkdayClass(row);
- }
-
- if (date.days() == today.days()) {
- this.calendar.addHighlightClass(row);
- }
- return row;
- },
-
- beforeBuild: function() {
- this.column = {};
- var rule = CssUtil.getCssRuleBySelectorText('.' + Calendar.className.table + ' td');
- this.column.height = parseInt(rule.style['height'], 10);
-
- rule = CssUtil.getCssRuleBySelectorText('.' + Calendar.className.dateContainer);
- this.column.dateTextHeight = parseInt(rule.style['height'], 10);
- },
-
- /**********************************
- ***** for make schedule item *****
- **********************************/
- buildSchedule: function(schedule) {
- var id = 'scheduleItem_' + schedule.id;
- var canEdit = (schedule.edit == undefined || schedule.edit);
- var item = Builder.node('DIV', {id: id});
- var start = DateUtil.toDate(schedule.start);
- var finish = DateUtil.toDate(schedule.finish);
- if (start.sameDate(finish)) {
- this.calendar.classNames.addClassNames(item, 'scheduleItemNoBorder');
- } else {
- this.calendar.classNames.addClassNames(item, 'scheduleItemLarge');
- }
-
- if (canEdit) {
- var deleteImg = Builder.node('DIV',
- {
- id: 'scheduleDeleteImg_' + schedule.id,
- className: this.calendar.classNames.joinClassNames('deleteImg')
- }
- );
- Element.hide(deleteImg);
- item.appendChild(deleteImg);
-
- // set click event on a image.
- Event.observe(deleteImg, 'click', this.clickDeleteImage.bind(this, schedule));
- Event.observe(item, 'mouseover', this.showDeleteImage.bind(this, deleteImg));
- Event.observe(item, 'mouseout', this.hideDeleteImage.bind(this, deleteImg));
- }
-
- // set dblclick event on a schedule item.
- if (this.calendar.options.dblclickSchedule) {
- Event.observe(
- item, 'dblclick', this.calendar.options.dblclickSchedule.bind(this, schedule));
- }
-
- // drag handler
- var handler = null;
- if (canEdit) {
- handler = Builder.node('DIV', {className: this.calendar.classNames.joinClassNames('scheduleHandler')});
- item.appendChild(handler);
- }
-
- var icon = null;
- if (schedule.icon) {
- icon = Builder.node('IMG', {src: schedule.icon, alt: 'icon', style: 'float: left;'});
- item.appendChild(icon);
- }
-
- // private mark
- if (!schedule.publicity) {
- icon = Builder.node('DIV', {id: 'private_img_' + schedule.id});
- this.calendar.classNames.addClassNames(icon, 'privateImg');
- item.appendChild(icon);
- }
-
- var body = Builder.node('DIV');
- var text = this.getTimeText(schedule.start, schedule.finish);
- text = Builder.node('DIV', {id: id + '_text', style: 'float: left;'}, [text]);
- this.calendar.classNames.addClassNames(text, 'scheduleTimeArea');
- item.appendChild(text);
- var description = schedule.description.unescapeHTML();
- item.appendChild(Builder.node('DIV', {id: id + '_description'}, [description]));
-
- item.title = description;
- item.schedule = schedule;
-
- return [item, handler];
- },
-
- adjustScheduleStyle: function(item, rowIndex, cellIndex, holder) {
- var self = this;
- var height = parseInt(Element.getStyle(item, 'height'), 10);
- var top = parseInt(Element.getStyle(item, 'top'), 10);
- var range = this.getScheduleRange(item);
- var tops = [];
-
- holder.each(function(holded) {
- var holdedRange = self.getScheduleRange(holded);
- if (range.any(function(r) {return holdedRange.include(r)})) {
- tops.push(holded.topIndex);
- }
- });
-
- var index = $R(0, tops.length, true).detect(function(i) {return !tops.include(i)});
- if (isNaN(index)) index = tops.length;
- item.topIndex = index;
- Element.setStyle(item, {top: top + (height + 2) * index + 'px'});
- },
-
- getScheduleRange: function(item) {
- return $R(0, item.length, true).map(function(i) {return item.cellIndex + i});
- },
-
- setScheduleBaseStyle: function(item, rowIndex, cellIndex, length) {
- var oneDay = this.column.height;
- var top = oneDay * rowIndex + this.column.dateTextHeight;
- var adjustSize = this.getAdjustSize();
- Element.setStyle(item, {
- top: top + 'px',
- width: this.column.width * length + adjustSize * (length - 1) + 'px',
- left: this.column.width * cellIndex + cellIndex * adjustSize + 'px'
- });
- },
-
- afterBuild: function() {
- this.scheduleNodes = [];
- if (this.calendar.options.size != Calendar.size.small) {
- this.setContainerInfo();
- this.setColumnWidth();
- this.setCover();
- this.setSelector();
- var self = this;
- var indexes = this.calendar.options.displayIndexes;
- var distance = this.getDragDistance();
- var holders = $R(0, $(this.getCalendarTableId()).rows.length).map(function() {return []});
- var date = this.calendar.date;
- var calStartDate = DateUtil.getFirstDate(date.getFullYear(), date.getMonth());
- var calStart = calStartDate.days();
- var calFinish = DateUtil.getLastDate(date.getFullYear(), date.getMonth()).days();
-
- self.calendar.options.schedules.each(function(schedule, index) {
- var startDate = self.toDate(schedule.start);
- var start = startDate.days();
- var finishDate = self.toDate(schedule.finish);
- var finish = finishDate.days();
- var days = self.getDayDiff(schedule);
-
- if ((start >= calStart && start <= calFinish) || (finish >= calStart && finish <= calFinish)) {
- if (!calStartDate.sameMonth(startDate)) startDate = calStartDate;
- self.setSchedule(schedule, holders, distance, days);
- }
- });
- }
- },
-
- setSchedule: function(schedule, holders, distance, days) {
- var items = [];
- var rowMax = 6;
- var startDate = DateUtil.toDate(schedule.start);
- var date = startDate;
- var indexes = this.calendar.options.displayIndexes;
- var targetDate = this.calendar.options.initDate;
-
- while (days >= 0) {
- if (date.getMonth() != startDate.getMonth()) break;
- var lastWday = this.getLastWday(date);
-
- var length = days + 1;
- var firstDay = date.getDay();
- var finishDate = date.advance({days: length - 1});
-
- if (finishDate.getTime() > lastWday.getTime()) {
- finishDate = lastWday;
- length = finishDate.days() - date.days() + 1;
- }
- var finishDay = finishDate.getDay();
- var wdays = null;
- if (firstDay <= finishDay) {
- wdays = $R(firstDay, finishDay, false);
- } else {
- wdays = $R(0, finishDay, false).toArray().concat($R(firstDay, rowMax, false).toArray());
- }
- var itemLength = wdays.findAll(function(day) {
- return indexes.include(day);
- }).length;
-
- var cellDate = new Date(date.getTime());
- while (cellDate.days() <= finishDate.days()) {
- if (cellDate.getMonth() == targetDate.getMonth()) {
- var cellPosition = this.getCellPosition(cellDate.getDate());
- if (cellPosition) {
- var rowIndex = cellPosition.rowIndex;
- var cellIndex = cellPosition.cellIndex;
-
- // create a schedule node.
- var result = this.buildSchedule(schedule);
- var item = result.first();
- item.length = itemLength;
- item.cellIndex = cellIndex;
- this.container.appendChild(item);
-
- // set style(position and size) of a schedule item.
- this.setScheduleBaseStyle(item, rowIndex, cellIndex, itemLength);
- var left = this.adjustScheduleStyle(item, rowIndex, cellIndex, holders[rowIndex]);
-
- if (schedule.edit == undefined || schedule.edit) {
- this.setDraggable(item, result.last(), distance);
- this.setResize(item);
- }
-
- holders[rowIndex].push(item);
- this.scheduleNodes.push(item);
- break;
- } else if (indexes.include(cellDate.getDay())) {
- itemLength--;
- }
- } else if (indexes.include(cellDate.getDay())) {
- itemLength--;
- }
- cellDate = cellDate.advance({days: 1});
- }
-
- if (items.length == 0) {
- days -= length;
- } else {
- days =- 7;
- }
-
- var date = finishDate.advance({days: 1});
- if (item) items.push(item);
- }
-
- var self = this;
- items.each(function(item) {
- Event.observe(item, 'mouseover', self.mouseOverSubSchedule.bind(this, items));
- Event.observe(item, 'mouseout', self.mouseOutSubSchedule.bind(this, items));
- });
- },
-
- getLastWday: function(date) {
- var index = this.calendar.wdays.indexOf(date.getDay()) + 1;
- return date.advance({days: this.calendar.wdays.length - index});
- },
-
- setSelector: function() {
- var selector = $(this.getSelectorId());
- Element.setStyle(selector, {
- width: this.column.width + 'px',
- height: this.column.height - 2 + 'px'
- });
- },
-
- // set draggalbe event
- setDraggable: function(item, handle, distance) {
- var self = this;
- var offset = Position.cumulativeOffset(this.container);
- var selector = $(this.getSelectorId());
- var cWidth = this.column.width;
- var cHeight = this.column.height;
- var rowMax = this.rowMax;
- var cellMax = this.calendar.options.displayIndexes.length - 1;
- var adjustSize = this.getAdjustSize();
-
- new Draggable(item,
- {
- handle: handle,
- scroll: window,
- starteffect: Prototype.emptyFunction,
- endeffect: Prototype.emptyFunction,
- onStart: function(draggalbe) {
- Element.show(selector);
- },
- onDrag: function(draggable, event) {
- var element = draggable.element;
- var top = parseInt(Element.getStyle(element, 'top'), 10);
- var rowIndex = Math.floor(top / cHeight);
- var left = parseInt(Element.getStyle(element, 'left'), 10);
- var cellIndex = Math.floor(left / cWidth);
-
- if ((cellIndex >= 0 && rowIndex >= 0) &&
- (cellIndex <= cellMax && rowIndex <= rowMax)) {
- Element.setStyle(selector, {
- left: cWidth * cellIndex + adjustSize * cellIndex + 'px',
- top: cHeight * rowIndex + 'px'
- });
- }
- },
- onEnd: function(draggable) {
- Element.hide(selector);
- self.changeSchedule(draggable);
- }
- }
- );
- },
-
- // set resize event
- setResize: function(item) {
- var self = this;
- new CalendarResizeableEx(item, {
- left: 0,
- top: 0,
- bottom: 0,
- distance: this.column.width,
- restriction: true,
- resize: function(element) {
- self.updateTirm(element);
- }
- });
- },
-
- /********************************** public method **********************************/
- getDate: function(element) {
- if (!element) return;
- var date = this.calendar.date;
- if (element.constructor == String)
- return new Date(date.getFullYear(), date.getMonth(), element);
- else
- return new Date(date.getFullYear(), date.getMonth(), element.id.getSuffix());
- },
-
- abstractSelect: function(event, method) {
- var element = null;
- if (this.calendar.options.size == 'large') {
- element = this.findClickedElement(event);
- } else {
- element = Event.element(event);
- if (element.tagName != 'TD') {
- element = Element.getParentByTagName(['TD'], element);
- }
- }
- if (element && element.id) {
- var date = this.getDate(element);
- method(date, element);
- }
- },
-
- getSelectedTerm: function() {
- var self = this;
- var elements = this.calendar.getSelected();
- if (elements && elements.length > 0) {
- return [elements.first(), elements.last()].map(function(e) {
- return self.getDate(e);
- });
- }
- return null;
- },
-
- /********************************** private method **********************************/
- selectDay: function(event) {
- var calendar = this.calendar;
- var th = Event.element(event);
- if (th.tagName != 'TH')
- th = Element.getParentByTagName('TH', th);
-
- this.iterateTable({doCell: function(cell) {
- if ((cell.cellIndex == th.cellIndex) && cell.id)
- calendar.addSelectedClass(cell);
- }});
- },
-
- inspectArgument: function(object, time) {
- var self = this;
- var dates = this.calendar.getSelected();
- var result = [];
-
- self.calendar.recurrence(object, function(o) {
- if (!o.date) {
- dates.each(function(d) {
- var param = {};
- if (!o.date) {
- param = {date: self.getDate(d)};
- if (time) {
- param.start = {hour: 0, min: 0};
- param.finish = {hour: 0, min: 0};
- }
- }
- Object.extend(param, o);
- result.push(param);
- });
- } else if (o.date.constructor == Object) {
- o.date = new Date(o.date.year, o.date.month, o.date.day);
- result.push(o);
- } else {
- result.push(o);
- }
- });
- return result;
- },
-
- inspectDateArgument: function(date) {
- if (date) {
- map = [];
- this.calendar.recurrence(date, function(d) {
- if (d.constructor == Object)
- map.push(new Date(d.year, d.month, d.day));
- else
- map.push(d);
- });
- return map;
- } else {
- var calendar = this;
- var dates = this.calendar.getSelected();
- if (dates.length == 0) return null;
-
- return dates.collect(function(d) {
- return calendar.getDate(d);
- });
- }
- },
-
- findClickedElement: function(event) {
- var container = $(this.getScheduleContainerId());
- var position = Position.cumulativeOffset(container);
- var scrollTop = Position.realOffset(container).last();
- scrollTop -= document.documentElement.scrollTop || document.body.scrollTop;
- var x = Event.pointerX(event) - position[0];
- var y = Event.pointerY(event) - position[1] + scrollTop;
- var rowIndex = Math.floor(y / this.column.height);
- var cellIndex = Math.floor(x / this.column.width);
- return $(this.calendarTable.rows[rowIndex].cells[cellIndex]);
- },
-
- multipleSelection: function(event) {
- if (!this.calendar.selectedBase || !this.calendar.mouseDown) return;
- var self = this;
- var calendar = this.calendar;
- var selected = this.calendar.selectedBase;
-
- this.abstractSelect(event, function(date, element) {
- var selectedElement = $(selected.id);
-
- var range = calendar.createRange(
- parseInt(selectedElement.id.getSuffix()),
- parseInt(element.id.getSuffix())
- );
-
- self.iterateTable({doCell: function(cell) {
- if (cell.tagName != 'TD' || !cell.id) throw $continue;
- var id = parseInt(cell.id.getSuffix());
-
- if (range.include(id)) {
- calendar.addSelectedClass(cell);
- } else {
- calendar.removeSelectedClass(cell);
- }
- }});
- });
- },
-
- iterateTable: function() {
- var options = Object.extend({
- doTable: null,
- doRow: null,
- doCell: null
- }, arguments[0]);
-
- var calendar = $(this.getCalendarTableId());
- if (options.doTable) {
- options.doTable(calendar)
- };
-
- $A(calendar.rows).each(function(row) {
- if (options.doRow) {
- options.doRow(row);
- }
- $A(row.cells).each(function(cell) {
- if (options.doCell) {
- options.doCell(cell);
- }
- });
- });
- },
-
- findRow: function(rowIndex) {
- var table = $(this.getCalendarTableId());
- return $A(table.rows).detect(function(row) {
- return row.rowIndex == rowIndex;
- });
- },
-
- findCell: function(rowIndex, cellIndex) {
- return $A(this.findRow(rowIndex).cells).detect(function(cell) {
- return cell.cellIndex == cellIndex;
- });
- },
-
- getCalendarTableId: function() {
- return this.calendar.element.id.appendSuffix(CalendarMonth.id.calTable);
- },
-
- getDateId: function(date) {
- var day = null;
- if (date.constructor == Date) {
- day = date.getDate();
- } else {
- day = date;
- }
- return this.calendar.element.id.appendSuffix(day);
- },
-
- getCell: function(day) {
- return $(this.getDateId(day));
- },
-
- getCellPosition: function(day) {
- var cell = this.getCell(day);
- if (cell) {
- var row = Element.getParentByTagName(['tr'], cell);
- return {cellIndex: cell.cellIndex, rowIndex: row.rowIndex};
- }
- },
-
- changeSchedule: function(draggable) {
- var element = draggable.element;
- var schedule = element.schedule;
-
- var top = parseInt(Element.getStyle(element, 'top'), 10);
- var rowIndex = Math.floor(top / this.column.height);
- var left = parseInt(Element.getStyle(element, 'left'), 10);
- var cellIndex = Math.floor(left / this.column.width);
- var table = $(this.getCalendarTableId());
- var rowMax = table.rows.length - 1;
- var cellMax = this.calendar.options.displayIndexes.length - 1;
-
- if ((cellIndex >= 0 && rowIndex >= 0) &&
- (cellIndex <= cellMax && rowIndex <= rowMax)) {
- var cell = this.findCell(rowIndex, cellIndex);
- var date = cell.date;
- var diff = this.getDayDiff(schedule);
-
- var finish = date.advance({days: diff});
- if (
- schedule.start.month == date.getMonth() &&
- schedule.start.day == date.getDate() &&
- schedule.finish.month == finish.getMonth() &&
- schedule.finish.day == finish.getDate()
- ) {this.calendar.refreshSchedule(); return;}
-
- schedule.start.month = date.getMonth();
- schedule.start.day = date.getDate();
- schedule.finish.month = finish.getMonth();
- schedule.finish.day = finish.getDate();
-
- this.calendar.refreshSchedule();
- this.calendar.options.changeSchedule(schedule);
- } else {
- this.calendar.refreshSchedule();
- }
- },
-
- updateTirm: function(element) {
- var schedule = element.schedule;
- var width = parseInt(Element.getStyle(element, 'width'));
- var top = parseInt(Element.getStyle(element, 'top'));
- var left = parseInt(Element.getStyle(element, 'left'));
- var cellIndex = Math.round((left + width) / this.column.width) - 1;
- var rowIndex = Math.round(top / this.column.height);
- var cell = this.findCell(rowIndex, cellIndex);
-
- var oldFinish = schedule.finish;
- var newFinish = cell.date.toHash();
- newFinish.hour = oldFinish.hour;
- newFinish.min = oldFinish.min;
-
- if (DateUtil.toDate(schedule.start).getTime() >= DateUtil.toDate(newFinish).getTime()) {
- var maxHour = 23;
- var maxMin = 55;
- if (schedule.start.hour == maxHour && schedule.start.min == maxMin) {
- this.calendar.refreshSchedule();
- this.calendar.options.updateTirm();
- return;
- } else {
- newFinish.hour = maxHour;
- newFinish.min = maxMin;
- }
- }
- schedule.finish = newFinish;
-
- this.calendar.refreshSchedule();
- this.calendar.options.updateTirm(schedule);
- },
-
- getTimeText: function(start, finish) {
- var calendar = this.calendar;
- return calendar.formatTime(start);
- },
-
- getDayDiff: function(schedule) {
- return DateUtil.numberOfDays(this.toDate(schedule.start), this.toDate(schedule.finish));
- }
-});
-
-
-/**
- * CalendarWeek Class
- */
-var CalendarWeek= Class.create();
-CalendarWeek.id = {
- columnContainer: 'columnContainer',
- columnHeader: 'columnHeader',
- column: 'column',
- next: 'next',
- pre: 'pre'
-}
-Object.extend(CalendarWeek.prototype, AbstractCalendar.prototype);
-Object.extend(CalendarWeek.prototype, {
-
- initialize: function(calendar) {
- this.calendar = calendar;
- this.week = this.getWeek();
- this.setDisplayTime();
- },
-
- /*** Week ***/
- /********************************** build functions **********************************/
- buildHeaderLeft: function() {
- var container = Builder.node('TD');
- this.calendar.classNames.addClassNames(container, 'preYears');
-
- var id = this.calendar.element.id.appendSuffix(CalendarWeek.id.pre);
- var node = Builder.node('DIV', {id: id});
- this.calendar.classNames.addClassNames(node, 'preWeekMark');
- Event.observe(node, "click", this.calendar.changeCalendar.bindAsEventListener(this.calendar));
- container.appendChild(node);
-
- return container;
- },
-
- buildHeaderCenter: function() {
- var contents = [];
- var texts = [];
- if (this.calendar.options.weekHeaderFormat) {
- texts = [this.formatHeaderDate(this.week.first()), '-', this.formatHeaderDate(this.week.last())];
- }(this.week[0], this.week.last()) || [];
-
- var node = Builder.node('SPAN', [texts[0] || this.week[0].toDateString()]);
- this.calendar.classNames.addClassNames(node, 'ym');
- contents.push(node);
-
- node = Builder.node('SPAN', [texts[1] || '-']);
- this.calendar.classNames.addClassNames(node, 'ym');
- contents.push(node);
-
- node = Builder.node('SPAN', [texts.last() || this.week.last().toDateString()]);
- this.calendar.classNames.addClassNames(node, 'ym');
- contents.push(node);
-
- var container = Builder.node('TD', contents);
- this.calendar.classNames.addClassNames(container, 'years');
-
- return container;
- },
-
- formatHeaderDate: function(date) {
- if (this.calendar.options.weekHeaderFormat) {
- return new Template(this.calendar.options.weekHeaderFormat).
- evaluate({year: date.getFullYear(), month: date.getMonth() + 1, day: date.getDate()});
- }
- return '';
- },
-
- buildHeaderRight: function() {
- var container = Builder.node('TD', {align: 'right'});
- this.calendar.classNames.addClassNames(container, 'nextYears');
-
- var id = this.calendar.element.id.appendSuffix(CalendarWeek.id.next);
- var node = Builder.node('DIV', {id: id});
- this.calendar.classNames.addClassNames(node, 'nextWeekMark');
- Event.observe(node, "click", this.calendar.changeCalendar.bindAsEventListener(this.calendar));
- container.appendChild(node);
-
- return container;
- },
-
- buildCalendar: function() {
- var table = Builder.node('TABLE', {id: CalendarWeek.id.columnContainer});
- var tbody = Builder.node('TBODY');
-
- this.calendar.classNames.addClassNames(table, 'weekTable');
- table.appendChild(tbody);
- var tr = Builder.node('TR');
- tbody.appendChild(tr);
-
- if (this.calendar.options.displayTimeLine) {
- tr.appendChild(this.buildTimeLine());
- }
- tr.appendChild(this.buildCalendarContainer());
-
- return table;
- },
-
- buildTimeLine: function() {
- var time = new Date();
- var hour = 0, hoursOfDay = 24;
- time.setHours(hour);
- time.setMinutes(0);
- var nodes = [];
-
- var node = Builder.node('DIV');
- this.calendar.classNames.addClassNames(node, 'timeLineTimeTop');
- nodes.push(node);
- while (hour < hoursOfDay) {
- if (this.includeDisplayTime(hour)) {
- node = Builder.node('DIV', [this.formatTime(time)]);
- this.calendar.classNames.addClassNames(node, 'timeLineTime');
- nodes.push(node);
- }
- hour++;
- time.setHours(hour);
- }
-
- var td = Builder.node('TD', nodes);
- this.calendar.classNames.addClassNames(td, 'timeLine');
- return td;
- },
-
- buildCalendarContainer: function() {
- var table = Builder.node('TABLE');
- var tbody = Builder.node('TBODY');
- table.appendChild(tbody);
- this.calendar.classNames.addClassNames(table, 'weekMainTable');
-
- tbody.appendChild(this.buildCalendarHeader());
- tbody.appendChild(this.buildCalendarMain());
-
- return Builder.node('TD', [table]);
- },
-
- buildCalendarHeader: function() {
- var indexes = this.calendar.options.displayIndexes;
- var ths = [];
- var self = this;
- var today = new Date().days();
- var width = 100 / indexes.length + '%';
- var clickDateText = this.calendar.options.clickDateText;
- var subHeaderTempl = (this.calendar.options.weekSubHeaderFormat) ? new Template(this.calendar.options.weekSubHeaderFormat) : null;
-
- this.week.each(function(w, index) {
- var text = null;
- if (subHeaderTempl) {
- text = subHeaderTempl.evaluate({month: w.getMonth() + 1, day: w.getDate(), wday: self.calendar.options.dayOfWeek[w.getDay()]});
- } else {
- text = w.toDateString().split(' ');
- text.pop();
- text = text.join(' ');
- }
- var link = Builder.node('A', {href: '#'}, [text]);
- if (w.days() == today) self.calendar.addHighlightClass(link);
- var node = Builder.node('DIV', [link]);
- self.calendar.classNames.addClassNames(node, 'headerColumn');
-
- if (clickDateText) {
- Event.observe(node, 'mousedown', clickDateText.bindAsEventListener(self, w));
- } else {
- Event.observe(node, 'mousedown', self.clickDateText.bindAsEventListener(self, w));
- }
-
- var id = self.calendar.element.id.appendSuffix(CalendarWeek.id.column);
- var th = Builder.node('TH', {id: id.appendSuffix(index)}, [node]);
- th.width = width;
- ths.push(th);
- });
-
- var table = Builder.node('TABLE');
- var tbody = Builder.node('TBODY');
- table.appendChild(tbody);
- tbody.appendChild(Builder.node('TR', ths));
- this.calendar.classNames.addClassNames(table, 'weekMainTable');
- return Builder.node('TR', [Builder.node('TD', [table])]);
- },
-
- buildCalendarMain: function() {
- var indexes = this.calendar.options.displayIndexes;
- var self = this;
- var tds = [];
- var width = 100.0 / indexes.length + '%';
-
- this.week.each(function(w, index) {
- var schedules = self.calendar.options.schedules[w.toDateString()];
- var nodes = [];
- var i = 0, j = 0;
-
- while (i < 24) {
- if (self.includeDisplayTime(i)) {
- var node = Builder.node('DIV', {id: self.getDateId(w, i)});
- var hour = i / 1;
- var min = i % 1 * 60;
- node.date = new Date(w.getFullYear(), w.getMonth(), w.getDate(), hour, min, 0);
-
- if (nodes.length == 0) {
- self.calendar.classNames.addClassNames(node, 'columnTopDate');
- } else if (i % 1 == 0) {
- self.calendar.classNames.addClassNames(node, 'columnDate');
- } else {
- self.calendar.classNames.addClassNames(node, 'columnDateOdd');
- }
- self.setColumnEvent(node);
- nodes.push(node);
- }
- i += 0.5;
- }
-
- var td = Builder.node('TD', nodes);
- td.width = width;
- tds.push(td);
- });
-
- this.calendarTable = Builder.node('TABLE', {style: 'position: relative'});
- var tbody = Builder.node('TBODY');
- this.calendarTable.appendChild(tbody);
- tbody.appendChild(Builder.node('TR', tds));
- this.calendar.classNames.addClassNames(this.calendarTable, 'weekMainTable');
- var container = this.buildScheduleContainer();
- container.appendChild(this.calendarTable);
- this.setScheduleContainerEvent(container);
- this.calendar.classNames.addClassNames(container, 'scheduleContainer');
- return Builder.node('TR', [Builder.node('TD', [container])]);
- },
-
- setColumnEvent: function(node) {
- // do nothing
- },
-
- beforeBuild: function() {
- this.column = {};
- var rule = CssUtil.getCssRuleBySelectorText('.' + Calendar.className.columnDate);
- this.column.height = parseInt(rule.style['height'], 10) + 1;
- },
-
- /**********************************
- ***** for make schedule item *****
- **********************************/
- buildSchedule: function(schedule) {
- var id = 'scheduleItem_' + schedule.id;
- var canEdit = (schedule.edit == undefined || schedule.edit);
- var item = Builder.node('DIV', {id: id});
- this.calendar.classNames.addClassNames(item, 'scheduleItemLarge');
-
- if (canEdit) {
- var deleteImg = Builder.node('DIV',
- {
- id: 'scheduleDeleteImg_' + schedule.id,
- className: this.calendar.classNames.joinClassNames('deleteImg')
- });
- Element.hide(deleteImg);
- item.appendChild(deleteImg);
-
- // set event on a image.
- Event.observe(deleteImg, 'click', this.clickDeleteImage.bind(this, schedule));
- Event.observe(item, 'mouseover', this.showDeleteImage.bind(this, deleteImg));
- Event.observe(item, 'mouseout', this.hideDeleteImage.bind(this, deleteImg));
- }
-
- // set dblclick event on a schedule item.
- if (this.calendar.options.dblclickSchedule) {
- Event.observe(
- item, 'dblclick', this.calendar.options.dblclickSchedule.bind(this, schedule));
- }
-
- // drag handler
- var handler = null;
- if (canEdit) {
- handler = Builder.node('DIV', {className: this.calendar.classNames.joinClassNames('scheduleHandler')});
- item.appendChild(handler);
- }
-
- var icon = null;
- if (schedule.icon) {
- icon = Builder.node('IMG', {src: schedule.icon, alt: 'icon', style: 'float: left;'});
- item.appendChild(icon);
- }
-
- // private mark
- if (!schedule.publicity) {
- icon = Builder.node('DIV', {id: 'private_img_' + schedule.id});
- this.calendar.classNames.addClassNames(icon, 'privateImg');
- item.appendChild(icon);
- }
-
- var text = this.getTimeText(schedule.start, schedule.finish);
- text = Builder.node('DIV', {id: id + '_text'}, [text]);
- this.calendar.classNames.addClassNames(text, 'scheduleTimeArea');
-
- item.appendChild(text);
- var description = schedule.description.unescapeHTML();
- item.appendChild(Builder.node('DIV', {id: id + '_description'}, [description]));
- item.title = description;
- item.schedule = schedule;
-
- return [item, handler];
- },
-
- adjustScheduleStyle: function(item, index, holder) {
- var schedule = item.schedule;
- var time = this.convertHours(schedule);
- var start = time[0];
- var finish = time[1];
- var same = [];
- var self = this;
-
- holder.each(function(h) {
- var hTime = self.convertHours(h.schedule);
- var hStart = hTime[0];
- var hFinish = hTime[1];
-
- if (
- ((hStart <= start) && (hFinish > start)) || ((hStart < finish) && (hFinish >= finish)) ||
- ((start <= hStart) && (finish > hStart)) || ((start < hFinish) && (finish >= hFinish))
- ) {
- same.push(h);
- }
- });
-
- var adjustSize = index * this.getAdjustSize();
- var left = this.column.width * index + adjustSize;
- if (same.length == 0) {
- Element.setStyle(item, {left: left + 'px'});
- } else {
- same.push(item);
- var width = parseInt(Element.getStyle(item, 'width'), 10) / (same.length) - 2;
- same.each(function(s, i) {
- var adjustLeft = left + width * i + (2 * i);
-// if (i != 0) adjustLeft += 2;
- Element.setStyle(s, {
- width: width + 'px',
- left: adjustLeft + 'px'
- });
- });
- }
- return left;
- },
-
- setScheduleBaseStyle: function(item) {
- var schedule = item.schedule;
- if (!this.calendar.isSameDate(schedule.start, schedule.finish)) {
- schedule.finish.hour = 24;
- schedule.finish.min = 0;
- }
-
- var time = this.convertHours(schedule);
- var startTime = time.first();
- var finishTime = time.last();
- var oneHour = this.column.height * 2;
- var diff = this.calendar.getTimeDiff(schedule.start, schedule.finish);
- var rate = (diff.hour + (diff.min / 60)) || 1;
-
- var over = 0;
- var top = 0;
- var height = 0;
-
- var includeStart = this.includeDisplayTime(startTime);
- var includeFinish = this.includeDisplayTime(finishTime);
- if (!includeStart && !includeFinish) {
- if ((this.startTime <= startTime && this.startTime <= finishTime) ||
- (startTime < this.finishTime && finishTime < this.finishTime)) {
- top = height = 0;
- Element.hide(item);
- } else {
- top = 0;
- height = oneHour * (this.finishTime - this.startTime) - 3;
- }
- } else {
- if (includeStart) {
- top = oneHour * (startTime - this.startTime);
- height = oneHour * rate - 3;
- } else {
- top = 0;
- over = this.startTime - startTime;
- height = oneHour * (rate - over);
- }
-
- if (includeFinish) {
- } else {
- over = finishTime - this.finishTime;
- height -= oneHour * over;
- }
- }
-
- try {
- Element.setStyle(item, {
- top: top + 'px',
- width: this.column.width + 'px',
- height: height + 'px'
- });
- } catch (e) {}
- },
-
- afterBuild: function() {
- this.setContainerInfo();
- this.setColumnWidth();
- this.setCover();
- var self = this;
- var container = $(this.getScheduleContainerId());
- var distance = this.getDragDistance();
- this.scheduleNodes = [];
- var holders = this.week.map(function() {return []});
- var weekSize = this.week.legth - 1;
-
- this.calendar.options.schedules.each(function(schedule) {
- var items = [];
- var sub, subItem = null;
- self.week.each(function(date, index) {
- if (self.calendar.betweenDate(schedule, date)) {
- if (self.isSameStartDate(schedule, date) && self.isSameFinishDate(schedule, date)) {
- items.push(self.setSchedule(schedule, index, holders, container, distance));
- } else {
- sub = self.copyOneDaySchedule(schedule, date);
- subItem = self.setSchedule(sub, index, holders, container, distance);
- subItem.originalSchedule = schedule;
- items.push(subItem);
- }
- } else if (sub) {
- throw $break;
- }
- });
-
- items.each(function(item) {
- Event.observe(item, 'mouseover', self.mouseOverSubSchedule.bind(this, items));
- Event.observe(item, 'mouseout', self.mouseOutSubSchedule.bind(this, items));
- });
- });
- },
-
- copyOneDaySchedule: function(schedule, date) {
- var sub = null;
- if (this.isSameStartDate(schedule, date)) {
- sub = this.copySchedule(schedule, date);
- sub.finish.hour = 24;
- sub.finish.min = 0;
- } else if (this.isSameFinishDate(schedule, date)) {
- sub = this.copySchedule(schedule, date);
- sub.start.hour = 0;
- sub.start.min = 0;
- } else {
- sub = this.copySchedule(schedule, date);
- sub.start.hour = 0;
- sub.start.min = 0;
- sub.finish.hour = 24;
- sub.finish.min = 0;
- }
- return sub;
- },
-
- copySchedule: function(schedule, date) {
- sub = Object.extend({}, schedule);
- sub.start = {
- year: date.getFullYear(),
- month: date.getMonth(),
- day: date.getDate(),
- hour: schedule.start.hour,
- min: schedule.start.min
- }
- sub.finish = {
- year: date.getFullYear(),
- month: date.getMonth(),
- day: date.getDate(),
- hour: schedule.finish.hour,
- min: schedule.finish.min
- }
- return sub;
- },
-
- setSchedule: function(schedule, index, holders, container, distance) {
- // create a schedule node.
- var result = this.buildSchedule(schedule);
- var item = result.first();
- container.appendChild(item);
-
- // set style(position and size) of a schedule item.
- this.setScheduleBaseStyle(item);
- var left = this.adjustScheduleStyle(item, index, holders[index]);
- var adjustSize = index * this.getAdjustSize();
- var snapLeft = this.column.width + adjustSize + 'px';
-
- if (schedule.edit == undefined || schedule.edit) {
- this.setDraggable(item, result.last(), container, distance);
- this.setResize(item);
- }
-
- holders[index].push(item);
- this.scheduleNodes.push(item);
- return item;
- },
-
- getDragDistance: function() {
- var adjustSize = this.getAdjustSize();
- return [this.column.width + adjustSize, this.column.height / 2];
- },
-
- // set draggalbe event
- setDraggable: function(item, handle, container, distance) {
- var self = this;
- new Draggable(item,
- {
- handle: handle,
- scroll: window,
- starteffect: Prototype.emptyFunction,
- endeffect: Prototype.emptyFunction,
- snap: function(x, y) {
- var eDimensions = Element.getDimensions(item);
- var pDimensions = Element.getDimensions(container);
- var xy = [x, y].map(function(v, i) { return Math.floor(v/distance[i]) * distance[i] });
- xy = [
- self._constrain(xy[0], 0, pDimensions.width - eDimensions.width),
- self._constrain(xy[1], 0, pDimensions.height - eDimensions.height)
- ];
- return xy;
- },
- onEnd: function(draggable, event) {
- self.changeSchedule(draggable, event);
- },
- change: function(draggable) {
- self.changeTimeDisplay(draggable.element);
- }
- }
- );
- },
-
- // set resize event
- setResize: function(item) {
- new CalendarResizeableEx(item, {
- left: 0,
- right: 0,
- distance: this.column.height / 2,
- restriction: true,
- resize: function(element) {
- this.updateTirm(element);
- }.bind(this),
- change: function(element) {
- this.changeTimeDisplay(element);
- }.bind(this)
- });
- },
-
- /********************************** public method **********************************/
- getDate: function(element) {
- return element.date;
- },
-
- abstractSelect: function(event, method) {
- var element = this.findClickedElement(event);
- if (element) {
- if (Element.hasClassName(element, Calendar.className.columnDate) ||
- Element.hasClassName(element, Calendar.className.columnDateOdd) ||
- Element.hasClassName(element, Calendar.className.columnTopDate)) {
-
- var date = this.getDate(element);
- method(date, element);
- }
- }
- },
-
- getSelectedTerm: function() {
- var self = this;
- var elements = this.calendar.getSelected();
- if (elements && elements.length > 0) {
- var last = elements.last();
- if (last) {
- last = last.date;
- } else {
- last = elements.first().date;
- }
- last = new Date(last.getFullYear(), last.getMonth(),
- last.getDate(), last.getHours(), last.getMinutes(), 0);
- last.setMinutes(last.getMinutes() + 30);
-
- return [elements.first().date, last];
- }
- },
-
- /*** Week ***/
- /********************************** private method **********************************/
- setWidth: function(node) {
- Element.setStyle(node, {width: this.column.width + 'px'});
- },
-
- inspectArgument: function(object, time) {
- if (object.date) return object;
-
- var self = this;
- var dates = this.calendar.getSelected();
- var result = [];
- this.calendar.recurrence(object, function(o) {
- var param = {};
- if (!o.date) {
- param = {date: self.getDate(dates[0])};
- if (!o.start)
- param.start = dates[0].time;
- if (!o.finish)
- param.finish = dates[dates.length - 1].time;
- }
- Object.extend(param, o);
- result.push(param);
- });
-
- return result;
- },
-
- inspectDateArgument: function(date) {
- if (date) return date;
-
- var calendar = this;
- var dates = this.getSelected();
- if (dates.length == 0) return null;
-
- return dates.collect(function(d) {
- return calendar.getDate(d);
- });
- },
-
- addColumnClass: function(element) {
- if (document.all)
- this.calendar.classNames.addClassNames(element, 'columnWin');
- else
- this.calendar.classNames.addClassNames(element, 'column');
- },
-
- getHeaderId: function() {
- return this.calendar.element.id.appendSuffix(CalendarWeek.id.columnHeader);
- },
-
- getColumnId: function(i) {
- return this.calendar.element.id.appendSuffix(CalendarWeek.id.column + '_' + i);
- },
-
- changeSchedule: function(draggable, event) {
- var element = draggable.element;
- var schedule = element.schedule;
- var time = this.getTimeByElement(element);
- this.calendar.cacheSchedule(schedule);
-
- var container = $(this.getScheduleContainerId());
- var dimensions = Element.getDimensions(container);
- var offset = Position.cumulativeOffset(container);
- var scroll = Position.realOffset(container);
- var scrollLeft = scroll[0] - (document.documentElement.scrollLeft || document.body.scrollLeft || 0);
- var scrollTop = scroll[1] - (document.documentElement.scrollTop || document.body.scrollTop || 0);
-
- var x = Event.pointerX(event) + scrollLeft;
- var y = Event.pointerY(event) + scrollTop;
-
- if (
- offset[0] > x ||
- (offset[0] + dimensions.width) < x ||
- offset[1] > y ||
- (offset[1] + dimensions.height) < y
- ) {this.calendar.refreshSchedule(); return};
-
- var left = parseInt(Element.getStyle(element, 'left'));
- var weekIndex = Math.round(left / this.column.width);
- var date = this.week[weekIndex];
-
- if (
- schedule.start.year == date.getFullYear() &&
- schedule.start.month == date.getMonth() &&
- schedule.start.day == date.getDate() &&
- schedule.start.hour == time[0].hour &&
- schedule.start.min == time[0].min &&
- schedule.finish.year == date.getFullYear() &&
- schedule.finish.month == date.getMonth() &&
- schedule.finish.day == date.getDate() &&
- schedule.finish.hour == time[1].hour &&
- schedule.finish.min == time[1].min
- ) {this.calendar.refreshSchedule(); return};
-
- if (element.originalSchedule) schedule = element.originalSchedule;
- var newStart = {
- year: date.getFullYear(),
- month: date.getMonth(),
- day: date.getDate(),
- hour: time[0].hour,
- min: time[0].min
- }
- var diff = DateUtil.toDate(newStart).getTime() - DateUtil.toDate(schedule.start).getTime();
- schedule.start = newStart;
- schedule.finish = new Date(DateUtil.toDate(schedule.finish).getTime() + diff).toHash();
-
- this.calendar.refreshSchedule();
- this.calendar.options.changeSchedule(schedule);
- },
-
- updateTirm: function(element) {
- var schedule = element.schedule;
- var time = this.getTimeByElement(element);
- this.calendar.cacheSchedule(schedule);
-
- var left = parseInt(Element.getStyle(element, 'left'));
- var weekIndex = Math.round(left / this.column.width);
- var date = this.week[weekIndex];
-
- var isChange = this.isChengeSchedule(element, time);
- if (element.originalSchedule) schedule = element.originalSchedule;
-
- if (isChange.start) {
- schedule.start.year = date.getFullYear();
- schedule.start.month = date.getMonth();
- schedule.start.day = date.getDate();
- schedule.start.hour = time[0].hour;
- schedule.start.min = time[0].min;
- } else if (isChange.finish) {
- schedule.finish.year = date.getFullYear();
- schedule.finish.month = date.getMonth();
- schedule.finish.day = date.getDate();
- schedule.finish.hour = time[1].hour;
- schedule.finish.min = time[1].min;
- } else {
- return;
- }
-
- this.calendar.refreshSchedule();
- this.calendar.options.updateTirm(schedule);
- },
-
- changeTimeDisplay: function(element) {
- var schedule = element.schedule;
- var time = this.getTimeByElement(element);
-
- var textNode = Element.getElementsByClassName(element, Calendar.className.scheduleTimeArea)[0];
- var text = this.getTimeText(time[0], time[1]);
- textNode.innerHTML = text;
- },
-
- findClickedElement: function(event) {
- var container = $(this.getScheduleContainerId());
- var position = Position.cumulativeOffset(container);
- var scrollTop = Position.realOffset(container).last();
- scrollTop -= document.documentElement.scrollTop || document.body.scrollTop;
- var x = Event.pointerX(event) - position[0];
- var y = Event.pointerY(event) - position[1] + scrollTop;
-
- var cellIndex = Math.floor(y / this.column.height);
- var rowIndex = Math.floor(x / this.column.width);
- return $(this.calendarTable.rows[0].cells[rowIndex]).down(cellIndex);
- },
-
- multipleSelection: function(event) {
- if (!this.calendar.selectedBase || !this.calendar.mouseDown) return;
- var self = this;
- var calendar = this.calendar;
- var selected = this.calendar.selectedBase;
-
- this.abstractSelect(event, function(date, element) {
- var selectedElement = $(selected.id);
- if (selectedElement.date.getDate() != element.date.getDate()) return;
-
- var nodes = $A(selectedElement.parentNode.childNodes);
- var ids = [parseInt(selected.id.getSuffix()), parseInt(element.id.getSuffix())];
- ids.sort(function(a, b) {return a - b;});
-
- nodes.each(function(n) {
- if (!n.id) throw $continue;
- var id = parseInt(n.id.getSuffix());
- if ((id < ids[0]) || (ids[1] < id)) {
- calendar.removeSelectedClass(n);
- } else if (!Element.hasClassName(n, Calendar.className.selected)) {
- calendar.addSelectedClass(n);
- }
- });
- });
- },
-
- getTimeByElement: function(element) {
- var schedule = element.schedule;
- var top = parseInt(Element.getStyle(element, 'top'), 10);
- var height = parseInt(Element.getStyle(element, 'height'), 10);
- var oneHour = this.column.height * 2;
- var distance = 0.25;
-
- var startTime = top / oneHour + this.startTime;
- startTime = Math.round(startTime / distance) * distance;
-
- var finishTime = height / oneHour + startTime;
- finishTime = Math.round(finishTime / distance) * distance;
-
- var start = {};
- start.hour = Math.floor(startTime);
- start.min = (startTime - start.hour) * 60;
-
- var finish = {};
- finish.hour = Math.floor(finishTime);
- finish.min = (finishTime - finish.hour) * 60;
-
- if (finish.min == 60) {
- finish.hour += 1;
- finish.min = 0;
- }
-
- return [start, finish];
- },
-
- getDateId: function(date, i) {
- var id = this.calendar.element.id.appendSuffix(date.getDate());
- return id.appendSuffix(i * 10);
- },
-
- dateIdToTime: function(id) {
- id = id.getSuffix() / 10;
- var hour = Math.floor(id);
- return {hour: hour, min: (id - hour) * 60};
- },
-
- formatTime: function(date) {
- var time = date.toTimeString();
- time = time.split(' ');
- time = time[0].split(':');
- time.pop();
- return time.join(':');
- },
-
- /**
- * hours are 0, 0.5, 1, ..., 23.5, 24
- */
- includeDisplayTime: function(hours) {
- return (this.startTime <= hours) && (hours < this.finishTime);
- },
-
- /**
- * exsample
- *
- * {hour: 1, min: 30} => 1.5
- */
- convertHours: function(schedule) {
- return [
- schedule.start.hour + schedule.start.min / 60,
- schedule.finish.hour + schedule.finish.min / 60
- ];
- },
-
- setDisplayTime: function() {
- this.startTime = this.calendar.options.displayTime.first().hour;
- var finishTime = this.calendar.options.displayTime.last();
- this.finishTime = Math.ceil(finishTime.hour + finishTime.min / 60);
- },
-
- getTimeText: function(start, finish) {
- var calendar = this.calendar;
- return calendar.formatTime(start) + ' - ' + calendar.formatTime(finish);
- },
-
- isChengeSchedule: function(scheduleElement, newTime) {
- var schedule = scheduleElement.schedule;
- var changeStart = ((schedule.start.hour != newTime[0].hour) || (schedule.start.min != newTime[0].min));
- var changeFinish = ((schedule.finish.hour != newTime[1].hour) || (schedule.finish.min != newTime[1].min));
-
- if (scheduleElement.originalSchedule) {
- if (changeStart && changeFinish) {
- var currentDateStart = DateUtil.toDate(schedule.start).getTime();
- var OriginalDateStart = DateUtil.toDate(scheduleElement.originalSchedule.start).getTime();
- if (currentDateStart == OriginalDateStart) {
- changeFinish = false;
- } else {
- changeStart = false;
- }
- }
- }
- return {start: changeStart, finish: changeFinish};
- }
-});
-
-
-/**
- * CalendarDay Class
- */
-var CalendarDay = Class.create();
-CalendarDay.id = {
- header: 'dayHeader'
-}
-Object.extend(CalendarDay.prototype, CalendarWeek.prototype);
-Object.extend(CalendarDay.prototype, {
-
- initialize: function(calendar) {
- var day = calendar.date.getDay();
- this.calendar = calendar;
- this.setDisplayTime();
-
- this.calendar.options.displayIndexesOld = this.calendar.options.displayIndexes;
- this.calendar.options.displayIndexes = [day];
- this.calendar.options.weekIndexOld = this.calendar.options.weekIndex;
- this.calendar.options.weekIndex = day;
- this.week = this.getWeek();
- },
-
- destroy: function() {
- this.calendar.options.displayIndexes = this.calendar.options.displayIndexesOld;
- this.calendar.options.weekIndex = this.calendar.options.weekIndexOld;
- delete this.calendar.options.displayIndexesOld;
- delete this.calendar.options.weekIndexOld;
- },
-
- /*** Day ***/
- /********************************** build functions **********************************/
- buildHeaderCenter: function() {
- var headerText = this.calendar.date.toDateString();
- if (this.calendar.options.dayHeaderFormat) {
- var date = this.calendar.date;
- headerText = new Template(this.calendar.options.dayHeaderFormat).evaluate(
- {year: date.getFullYear(), month: date.getMonth() + 1, day: date.getDate()});
- }
- var container = Builder.node('TD');
- this.calendar.classNames.addClassNames(container, 'years');
-
- var id = this.calendar.element.id.appendSuffix(CalendarDay.id.header);
- var node = Builder.node('SPAN', {id: id}, [headerText]);
- this.calendar.classNames.addClassNames(node, 'ym');
- container.appendChild(node);
-
- return container;
- },
-
- /*** Day ***/
- /********************************** private method **********************************/
- changeCalendar: function(event) {
- var element = Event.element(event);
- var oldDate = new Date(this.calendar.date.toDateString());
-
- if (Element.hasClassName(element, Calendar.className.preWeekMark)) {
- this.calendar.date.setDate(this.calendar.date.getDate() - 1);
- } else if (Element.hasClassName(element, Calendar.className.nextWeekMark)) {
- this.calendar.date.setDate(this.calendar.date.getDate() + 1);
- }
-
- this.calendar.options.changeCalendar(this.calendar.date, oldDate);
- this.calendar.refresh();
- }
-});
-
-
-//
-// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-var CalendarResizeableEx = Class.create();
-Object.extend(CalendarResizeableEx.prototype, Resizeable.prototype);
-Object.extend(CalendarResizeableEx.prototype, {
- initialize: function(element) {
- var options = Object.extend({
- top: 6,
- bottom: 6,
- left: 6,
- right: 6,
- minHeight: 0,
- minWidth: 0,
- zindex: 1000,
- resize: null,
- distance: 1, // add by spinelz
- change: Prototype.emptyFunction,
- restriction: true
- }, arguments[1] || {});
-
- this.element = $(element);
- this.handle = this.element;
-
- Element.makePositioned(this.element); // fix IE
-
- this.options = options;
-
- this.active = false;
- this.resizing = false;
- this.currentDirection = '';
-
- this.eventMouseDown = this.startResize.bindAsEventListener(this);
- this.eventMouseUp = this.endResize.bindAsEventListener(this);
- this.eventMouseMove = this.update.bindAsEventListener(this);
- this.eventCursorCheck = this.cursor.bindAsEventListener(this);
- this.eventKeypress = this.keyPress.bindAsEventListener(this);
-
- this.registerEvents();
- },
-
- startResize: function(event) {
- Event.stop(event);
- if(Event.isLeftClick(event)) {
-
- // abort on form elements, fixes a Firefox issue
- var src = Event.element(event);
- if(src.tagName && (
- src.tagName=='INPUT' ||
- src.tagName=='SELECT' ||
- src.tagName=='BUTTON' ||
- src.tagName=='TEXTAREA')) return;
-
- var dir = this.directions(event);
- if (dir.length > 0) {
- this.active = true;
-// var offsets = Position.cumulativeOffset(this.element);
- this.startTop = parseInt(Element.getStyle(this.element, 'top'), 10);
- this.startLeft = parseInt(Element.getStyle(this.element, 'left'), 10);
- this.startWidth = parseInt(Element.getStyle(this.element, 'width'), 10);
- this.startHeight = parseInt(Element.getStyle(this.element, 'height'), 10);
- this.startX = event.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
- this.startY = event.clientY + document.body.scrollTop + document.documentElement.scrollTop;
-
- this.currentDirection = dir;
-
- if (this.options.restriction) {
- var container = this.element.parentNode;
- this.restDimensions = Element.getDimensions(container);
- this.restOffset = Position.cumulativeOffset(container);
- }
- }
- }
- },
-
- draw: function(event) {
- Event.stop(event);
- var pointer = [Event.pointerX(event), Event.pointerY(event)];
- var style = this.element.style;
-
- if (this.currentDirection.indexOf('n') != -1) {
- if (this.restOffset[1] >= pointer[1]) return;
- var pointerMoved = this.startY - pointer[1];
-// var margin = Element.getStyle(this.element, 'margin-top') || "0";
- var newHeight = this.map(this.startHeight + pointerMoved);
- if (newHeight > this.options.minHeight) {
- style.height = newHeight + "px";
- style.top = this.map(this.startTop - pointerMoved) + "px";
- }
- }
- if (this.currentDirection.indexOf('w') != -1) {
- var pointerMoved = this.map(this.startX - pointer[0]);
- var margin = Element.getStyle(this.element, 'margin-left') || "0";
- var newWidth = this.startWidth + pointerMoved;
- if (newWidth > this.options.minWidth) {
- style.left = (this.startLeft - pointerMoved - parseInt(margin)) + "px";
- style.width = newWidth + "px";
- }
- }
- if (this.currentDirection.indexOf('s') != -1) {
- var bottom = this.restDimensions.height + this.restOffset[1];
- var pointerMoved = pointer[1] - this.startY;
- if (bottom <= pointer[1]) return;
- var newHeight = this.map(this.startHeight + pointer[1] - this.startY);
- if (newHeight > this.options.minHeight) {
- style.height = newHeight + "px";
-// style.top = this.startTop + "px";
- }
- }
- if (this.currentDirection.indexOf('e') != -1) {
- var newWidth = this.map(this.startWidth + pointer[0] - this.startX);
- if (newWidth > this.options.minWidth) {
- style.width = newWidth + "px";
- }
- }
- if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering
- this.options.change(this.element);
- },
-
- directions: function(event) {
- var pointer = [Event.pointerX(event), Event.pointerY(event)];
- var offsets = Position.cumulativeOffset(this.element);
- var bodyScrollTop = document.documentElement.scrollTop || document.body.scrollTop;
- var scroll = Position.realOffset(this.element)[1] - bodyScrollTop;
-
- var cursor = '';
- if (this.between(pointer[1] - offsets[1] + scroll, 0, this.options.top)) cursor += 'n';
- if (this.between((offsets[1] + this.element.offsetHeight) - pointer[1] - scroll, 0, this.options.bottom)) cursor += 's';
- if (this.between(pointer[0] - offsets[0], 0, this.options.left)) cursor += 'w';
- if (this.between((offsets[0] + this.element.offsetWidth) - pointer[0], 0, this.options.right)) cursor += 'e';
-
- return cursor;
- },
-
- map: function(length) {
- return Math.round(length / this.options.distance) * this.options.distance;
- }
-});
+// Copyright (c) 2006 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+var Calendar = Class.create();\r
+Calendar.className = {\r
+ container: 'calendar',\r
+ header: 'calendar_header',\r
+ preYears: 'calendar_preYears',\r
+ nextYears: 'calendar_nextYears',\r
+ years: 'calendar_years',\r
+ mark: 'calendar_mark',\r
+ ym: 'calendar_ym',\r
+ table: 'calendar_table',\r
+ thRight: 'right',\r
+ tdRight: 'right',\r
+ tdBottom: 'bottom',\r
+ date: 'calendar_date',\r
+ holiday: 'calendar_holiday',\r
+ regularHoliday: 'calendar_regularHoliday',\r
+ schedule: 'calendar_schedule',\r
+ highlightDay: 'calendar_highlightDay',\r
+ scheduleListContainer: 'calendar_scheduleListContainer',\r
+ scheduleItem: 'calendar_scheduleItem',\r
+ scheduleTimeArea: 'calendar_scheduleItemTimeArea',\r
+ scheduleHandler: 'calendar_scheduleHandler',\r
+ holidayName: 'calendar_holidayName',\r
+// holidayContainer: 'calendar_holidayContainer',\r
+ dateContainer: 'calendar_dateContainer',\r
+ tableHeader: 'calendar_tableHeader',\r
+ rowContent: 'calendar_rowContent',\r
+ selected: 'calendar_selected',\r
+\r
+ nextYearMark: 'calendar_nextYearMark',\r
+ nextMonthMark: 'calendar_nextMonthMark',\r
+ nextWeekMark: 'calendar_nextWeekMark',\r
+ preYearMark: 'calendar_preYearMark',\r
+ preMonthMark: 'calendar_preMonthMark',\r
+ preWeekMark: 'calendar_preWeekMark',\r
+ \r
+ weekTable: 'calendar_weekContainerTable',\r
+ weekMainTable: 'calendar_weekMainTable',\r
+ timeLine: 'calendar_timeline',\r
+ timeLineTimeTop: 'calendar_timelineTimeTop',\r
+ timeLineTime: 'calendar_timelineTime',\r
+ headerColumn: 'calendar_headerColumn',\r
+ columnTopDate: 'calendar_columnTopDate',\r
+ columnDate: 'calendar_columnDate',\r
+ columnDateOdd: 'calendar_columnOddDate',\r
+ scheduleItemSamll: 'calendar_scheduleItemSmall',\r
+ scheduleItemLarge: 'calendar_scheduleItemLarge',\r
+ scheduleItemNoBorder: 'calendar_scheduleItemNoBorder',\r
+ scheduleItemSelect: 'calendar_scheduleItemSelect',\r
+ deleteImg: 'calendar_deleteImage',\r
+ privateImg: 'calendar_privateImage',\r
+ scheduleContainer: 'calendar_weekScheduleContainer',\r
+ selector: 'calendar_selector',\r
+ cover: 'calendar_cover'\r
+}\r
+\r
+Calendar.smallClassName = {\r
+ container: 'calendar_small',\r
+ header: 'calendar_header_small',\r
+ calendar: 'calendar_calendar_small',\r
+ table: 'calendar_tableSmall'\r
+}\r
+\r
+Calendar.size = {\r
+ large: 'large',\r
+ small: 'small'\r
+}\r
+\r
+/**\r
+ * Calendar Class\r
+ */\r
+Calendar.prototype = {\r
+ \r
+ initialize: function(element) {\r
+ this.building = true;\r
+ this.element = $(element);\r
+ Element.setStyle(this.element, {visibility: 'hidden'});\r
+ Element.hide(this.element);\r
+\r
+ this.options = Object.extend({\r
+ initDate: new Date(),\r
+ cssPrefix: 'custom_',\r
+ holidays: [],\r
+ schedules: [],\r
+ size: Calendar.size.large,\r
+ regularHoliday: [0, 6],\r
+ displayIndexes: [0, 1, 2, 3, 4, 5, 6],\r
+ displayTime: [{hour: 0, min: 0}, {hour: 24, min: 0}],\r
+ weekIndex: 0,\r
+ dblclickListener: null,\r
+ afterSelect: Prototype.emptyFunction,\r
+ beforeRefresh: Prototype.emptyFunction,\r
+ changeSchedule: Prototype.emptyFunction,\r
+ changeCalendar: Prototype.emptyFunction,\r
+ displayType: 'month',\r
+ highlightDay: true,\r
+ beforeRemoveSchedule: function() {return true;},\r
+ dblclickSchedule: null,\r
+ updateTirm: Prototype.emptyFunction,\r
+ displayTimeLine: true,\r
+ clickDateText: null,\r
+ monthHeaderFormat: null,\r
+ weekHeaderFormat: null,\r
+ weekSubHeaderFormat: null,\r
+ dayHeaderFormat: null,\r
+ dayOfWeek: DateUtil.dayOfWeek\r
+ }, arguments[1] || {});\r
+\r
+ this.options.holidays = this.toHolidayHash(this.options.holidays);\r
+// this.options.schedules = this.toScheduleHash(this.options.schedules);\r
+ \r
+ this.setIndex();\r
+ \r
+ this.classNames = null;\r
+ if (this.options.size == Calendar.size.large) {\r
+ this.classNames = Calendar.className;\r
+ } else {\r
+ this.classNames = $H({}).merge(Calendar.className);\r
+ this.classNames = this.classNames.merge(Calendar.smallClassName);\r
+ }\r
+ var customCss = CssUtil.appendPrefix(this.options.cssPrefix, this.classNames);\r
+ this.classNames = new CssUtil([this.classNames, customCss]);\r
+ \r
+ this.date = this.options.initDate;\r
+ \r
+ this.calendar = this.build();\r
+ this.element.appendChild(this.calendar);\r
+\r
+ Event.observe(document, "mouseup", this.onMouseUp.bindAsEventListener(this));\r
+ Element.setStyle(this.element, {visibility: 'visible'});\r
+ Element.show(this.element);\r
+ this.builder.afterBuild();\r
+ this.windowResize = this.onResize.bind(this);\r
+ if (this.options.size != 'small') Event.observe(window, "resize", this.windowResize);\r
+ this.building = false;\r
+ },\r
+\r
+ onResize: function() {\r
+ try {\r
+ var oldDimentions = this.builder.containerDimensions;\r
+ var dimentions = Element.getDimensions(this.builder.container);\r
+ if (dimentions.height != oldDimentions.height || dimentions.width != oldDimentions.width) {\r
+ this.refresh();\r
+ }\r
+ } catch(e) {}\r
+ },\r
+\r
+ destroy: function() {\r
+ Event.stopObserving(window, 'resize', this.windowResize);\r
+ },\r
+\r
+ setIndex: function() {\r
+ var options = this.options;\r
+ var bottom = [];\r
+ var up = [];\r
+ var index = null;\r
+ options.displayIndexes.sort();\r
+ options.displayIndexes.each(function(i) {\r
+ if (index == null) {\r
+ if (options.weekIndex <= i) {\r
+ index = i;\r
+ up.push(i);\r
+ } else {\r
+ bottom.push(i);\r
+ }\r
+ } else {\r
+ up.push(i);\r
+ }\r
+ });\r
+ options.displayIndexes = up.concat(bottom);\r
+ this.setLastWday();\r
+ },\r
+\r
+ setLastWday: function() {\r
+ var firstIndex = this.options.weekIndex;\r
+ var sat = 6;\r
+ var sun = 0;\r
+ var week = $R(firstIndex, sat, false).toArray();\r
+ if (firstIndex != sun) {\r
+ week = week.concat($R(sun, firstIndex - 1, false).toArray());\r
+ }\r
+ this.lastWday = week.last();\r
+ this.wdays = week;\r
+ },\r
+ \r
+ build: function() {\r
+ if (this.builder) {\r
+ this.builder.destroy();\r
+ }\r
+ \r
+ if (this.options.displayType == 'week') {\r
+ this.builder = new CalendarWeek(this);\r
+ } else if (this.options.displayType == 'day') {\r
+ this.builder = new CalendarDay(this);\r
+ } else {\r
+ this.builder = new CalendarMonth(this);\r
+ }\r
+\r
+ this.builder.beforeBuild();\r
+ return this.builder.build();\r
+ },\r
+ \r
+ /*** Calendar ***/\r
+ /********************************** public method **********************************/\r
+ undo: function() {\r
+ if (this.cached) {\r
+ this.cached.start = this.cached.start_old;\r
+ this.cached.finish = this.cached.finish_old;\r
+ this.cached = null;\r
+ this.refreshSchedule();\r
+ }\r
+ },\r
+\r
+ hideSatSun: function() {\r
+ var sun = 0;\r
+ var sat = 6;\r
+ this.options.displayIndexes = this.options.displayIndexes.without(sun, sat);\r
+ this.setIndex();\r
+ this.refresh();\r
+ },\r
+\r
+ showSatSun: function() {\r
+ var sun = 0;\r
+ var sat = 6;\r
+ var indexes = this.options.displayIndexes;\r
+ if (!indexes.include(sun)) {\r
+ indexes.push(sun);\r
+ }\r
+ if (!indexes.include(sat)) {\r
+ indexes.push(sat);\r
+ }\r
+ this.setIndex();\r
+ this.refresh();\r
+ },\r
+\r
+ changeDisplayIndexes: function(indexes) {\r
+ this.options.displayIndexes = indexes;\r
+ this.setIndex();\r
+ this.refresh();\r
+ },\r
+\r
+ changeDisplayTime: function(time) {\r
+ this.options.displayTime = time;\r
+ this.refresh();\r
+ },\r
+\r
+ refresh: function() {\r
+ try {\r
+ if (!this.building) {\r
+ this.building = true;\r
+ this.options.beforeRefresh(this);\r
+ this.destroy();\r
+ this.selectedBase = null;\r
+ Element.remove(this.calendar);\r
+ this.calendar = this.build();\r
+ this.element.appendChild(this.calendar);\r
+ this.builder.afterBuild();\r
+ if (this.options.size != 'small') Event.observe(window, 'resize', this.windowResize);\r
+ this.building = false;\r
+ }\r
+ } catch (e) {}\r
+ },\r
+ \r
+ changeCalendar: function(event) {\r
+ this.builder.changeCalendar(event);\r
+ },\r
+\r
+ changeDisplayType: function(type) {\r
+ this.options.displayType = type;\r
+ this.refresh();\r
+ },\r
+\r
+ selectDate: function(event) {\r
+ var calendar = this;\r
+ this.abstractSelect(event, function(date, element) {\r
+ if (calendar.selectedBase || calendar.hasSelectedDate()) {\r
+ if (event.ctrlKey) {\r
+ if (Element.hasClassName(element, Calendar.className.selected)) {\r
+ calendar.addSelectedClass(element);\r
+ return;\r
+ }\r
+ } else if (calendar.selectedBase) {\r
+ var selectedId = calendar.selectedBase.id;\r
+ $(selectedId).className = calendar.selectedBase.className;\r
+ calendar.clearSelected();\r
+ if (selectedId == element.id) {\r
+ calendar.selectedBase = null;\r
+ return;\r
+ }\r
+ }\r
+ }\r
+\r
+ calendar.selectedBase = {id: element.id, date: date, className: element.className};\r
+ calendar.addSelectedClass(element);\r
+ if (date && calendar.options.displayType == 'month' && calendar.options.size == Calendar.size.small) {\r
+ calendar.options.afterSelect(date, calendar);\r
+ }\r
+ });\r
+\r
+ if (calendar.options.displayType != 'month' || calendar.options.size != Calendar.size.small) {\r
+ this.mouseDown = true;\r
+ }\r
+ },\r
+\r
+ clearSelect: function() {\r
+ // BETA\r
+ this.selectedBase = null;\r
+ this.clearSelected();\r
+ },\r
+\r
+ showDayOfWeek: function(dayOfWeek) {\r
+ var indexes = this.options.displayIndexes;\r
+ this.recurrence(dayOfWeek, function(d) {\r
+ if (!indexes.include(d)) {\r
+ indexes.push(d);\r
+ }\r
+ });\r
+ this.setIndex();\r
+ this.refresh();\r
+ },\r
+\r
+ hideDayOfWeek: function(dayOfWeek) {\r
+ var indexes = this.options.displayIndexes;\r
+ var self = this;\r
+ this.recurrence(dayOfWeek, function(d) {\r
+ var index = self.findIndex(indexes, d);\r
+ if (index) {\r
+ indexes.remove(index);\r
+ } else if (!index.isNaN) {\r
+ indexes.shift();\r
+ }\r
+ });\r
+ this.refresh();\r
+ },\r
+\r
+ addHoliday: function(object) {\r
+ object = this.inspectArgument(object);\r
+ var newHash = this.toHolidayHash(object);\r
+ this.options.holidays = this.options.holidays.merge(newHash);\r
+ this.refresh();\r
+ },\r
+\r
+ removeHoliday: function(date) {\r
+ var calendar = this;\r
+ date = calendar.inspectDateArgument(date);\r
+ if (!date) return;\r
+\r
+ this.recurrence(date, function(d) {\r
+ var key = d.toDateString();\r
+ if (calendar.options.holidays[key])\r
+ delete calendar.options.holidays[key];\r
+ });\r
+ this.refresh();\r
+ },\r
+\r
+ refreshHoliday: function(object, rebuild) {\r
+ object = this.inspectArgument(object);\r
+ this.options.holidays = this.toHolidayHash(object);\r
+ if (rebuild) this.refresh();\r
+ },\r
+\r
+ clearHoliday: function() {\r
+ this.refreshHoliday([], true);\r
+ },\r
+\r
+ getHoliday: function(date) {\r
+ date = this.inspectDateArgument(date);\r
+ if (!date) return;\r
+\r
+ var calendar = this;\r
+ var holidays = [];\r
+ this.recurrence(date, function(o) {\r
+ var h = calendar.options.holidays[o.toDateString()];\r
+ if (h) holidays.push(h);\r
+ });\r
+\r
+ return holidays; \r
+ },\r
+\r
+ addSchedule: function(schedule) {\r
+ var schedules = this.options.schedules;\r
+ if (schedule.constructor == Array) {\r
+ schedule.each(function(s) {\r
+ var find = schedules.detect(function(tmp) {return s.id == tmp.id});\r
+ if (!find) schedules.push(s);\r
+ });\r
+ } else {\r
+ var find = schedules.detect(function(tmp) {return tmp.id == schedule.id});\r
+ if (!find) schedules.push(schedule);\r
+ }\r
+ this.refreshSchedule();\r
+ },\r
+\r
+ replaceSchedule: function(schedules) {\r
+ this.options.schedules = schedules;\r
+ this.refreshSchedule();\r
+ },\r
+\r
+ removeSchedule: function(ids, refresh) {\r
+ if (ids.constructor != Array) ids = [ids];\r
+ var self = this;\r
+ ids.each(function(id) {\r
+ var index = null;\r
+ self.options.schedules.each(function(s, i) {\r
+ if (s.id == id) {\r
+ index = i;\r
+ throw $break;\r
+ }\r
+ });\r
+\r
+ if (index != null) {\r
+ var schedule = self.options.schedules[index];\r
+ if (schedule) {\r
+ self.options.schedules.remove(index);\r
+ }\r
+ }\r
+ });\r
+ if (refresh) this.refreshSchedule();\r
+ },\r
+\r
+ refreshSchedule: function() {\r
+ this.builder.scheduleNodes.each(function(node) {\r
+ Element.remove(node);\r
+ });\r
+ this.builder.afterBuild();\r
+ },\r
+\r
+ mergeSchedule: function(schedule) {\r
+ var index = -1;\r
+ this.options.schedules.each(function(s, i) {\r
+ if (s.id == schedule.id) {\r
+ index = i;\r
+ throw $break;\r
+ }\r
+ });\r
+ if (index != -1) {\r
+ this.options.schedules[index] = schedule;\r
+ this.refreshSchedule();\r
+ } else {\r
+ this.addSchedule(schedule);\r
+ }\r
+ },\r
+\r
+ clearSchedule: function() {\r
+ this.options.schedules = [];\r
+ this.refreshSchedule();\r
+ },\r
+\r
+ getSchedule: function(object) {\r
+ var result = [];\r
+ var calendar = this;\r
+ object = this.inspectArgument(object || {});\r
+\r
+ this.recurrence(object, function(o) {\r
+ var schedule = calendar.options.schedules[o.date.toDateString()];\r
+ if (!schedule) return;\r
+\r
+ if (o.start) {\r
+ schedule = schedule.detect(function(s) {\r
+ return ((s.start.hour == o.start.hour) && (s.start.min == o.start.min));\r
+ });\r
+ if (schedule) result.push(schedule);\r
+ } else if (o.number) {\r
+ schedule = schedule[o.number];\r
+ if (schedule) result.push(schedule);\r
+ } else {\r
+ result = result.concat(schedule);\r
+ }\r
+ });\r
+\r
+ return result;\r
+ },\r
+\r
+ getSelected: function() {\r
+ return this.element.getElementsByClassName(Calendar.className.selected, this.element);\r
+ },\r
+\r
+ changeSchedule: function() {\r
+ var calendar = this;\r
+ return function(drag, drop) {\r
+ var array = drag.id.split('_');\r
+ var i = array.pop();\r
+ var date = array.pop();\r
+ \r
+ date = calendar.getDate(date); \r
+ var newDate = calendar.getDate(drop);\r
+ \r
+ var schedule = calendar.getSchedule({date: date, number: i});\r
+ if (schedule.length != 1) return;\r
+\r
+ schedule = schedule.pop();\r
+ schedule.date = newDate;\r
+ calendar.removeSchedule({date: date, number: i}, false);\r
+ calendar.addSchedule(schedule);\r
+\r
+ calendar.options.changeSchedule(schedule);\r
+ }\r
+ },\r
+\r
+ getSelectedDates: function() {\r
+ return this.builder.getSelectedDates();\r
+ },\r
+\r
+ getSelectedTerm: function() {\r
+ return this.builder.getSelectedTerm();\r
+ },\r
+ \r
+ /********************************** private method **********************************/\r
+ abstractSelect: function(event, method) {\r
+ this.builder.abstractSelect(event, method);\r
+ },\r
+\r
+ createRange: function(a, b) {\r
+ var range = null;\r
+ if (a <= b)\r
+ range = $R(a, b);\r
+ else\r
+ range = $R(b, a);\r
+ return range;\r
+ },\r
+\r
+ formatTime: function(time) {\r
+ var hour = (time.hour < 10) ? '0' + time.hour : time.hour;\r
+ var min = (time.min < 10) ? '0' + time.min : time.min;\r
+ return hour + ':' + min;\r
+ },\r
+\r
+ clearSelected: function() {\r
+ var elements = this.getSelected();\r
+ var self = this;\r
+ elements.each(function(e) {\r
+ if (Element.hasClassName(e, Calendar.className.selected))\r
+ self.removeSelectedClass(e);\r
+ });\r
+ },\r
+\r
+ onDblClick: function(event) {\r
+ this.abstractSelect(event, this.options.dblclickListener);\r
+ },\r
+\r
+ onMouseUp: function(event) {\r
+ var e = event || window.event;\r
+ var calendar = this;\r
+ if (calendar.mouseDown) {\r
+ setTimeout(function() {\r
+ calendar.mouseDown = false;\r
+ calendar.options.afterSelect(event);\r
+ }, 10);\r
+ }\r
+ },\r
+\r
+ setRegularHolidayClass: function(node) {\r
+ this.classNames.refreshClassNames(node, 'regularHoliday');\r
+ },\r
+\r
+ setHolidayClass: function(node) {\r
+ this.classNames.refreshClassNames(node, 'holiday');\r
+ },\r
+\r
+ setWorkdayClass: function(node) {\r
+ this.classNames.refreshClassNames(node, 'date');\r
+ },\r
+\r
+ setScheduleClass: function(node) {\r
+ this.classNames.refreshClassNames(node, 'schedule');\r
+ },\r
+\r
+ addHighlightClass: function(node) {\r
+ Element.addClassName(node, Calendar.className.highlightDay);\r
+ },\r
+\r
+ addSelectedClass: function(node) {\r
+ Element.addClassName(node, Calendar.className.selected);\r
+ },\r
+\r
+ removeSelectedClass: function(node) {\r
+ Element.removeClassName(node, Calendar.className.selected);\r
+ },\r
+\r
+ getDatasWithMonthAndYear: function(array) {\r
+ var calendar = this;\r
+ var result = array.findAll(function(h) {\r
+ return calendar.isSameYearAndMonth(h.date);\r
+ });\r
+\r
+ return result;\r
+ },\r
+\r
+ isSameYearAndMonth: function(a, b) {\r
+ if (a.constructor == Date) {\r
+ if (!b) b = this.date;\r
+ return ((a.getYear() == b.getYear()) && (a.getMonth() == b.getMonth()));\r
+ } else {\r
+ return (a.year == b.year && a.month == b.month && a.day == a.day);\r
+ }\r
+ }, \r
+\r
+ isSameDate: function(a, b) {\r
+ if (a.constructor == Date) {\r
+ if (!b) b = this.date;\r
+ return (this.isSameYearAndMonth(a, b) && (a.getDate() == b.getDate()));\r
+ } else {\r
+ return (this.isSameYearAndMonth(a, b) && a.day == b.day);\r
+ }\r
+ }, \r
+\r
+ isSameTime: function(a, b) {\r
+ return ((a.hour == b.hour) && (a.min == b.min));\r
+ },\r
+\r
+ betweenDate: function(schedule, date) {\r
+ var start = this.toDateNumber(schedule.start);\r
+ var finish = this.toDateNumber(schedule.finish);\r
+ date = this.toDateNumber(date);\r
+ return start <= date && date <= finish;\r
+ },\r
+\r
+ toDateNumber: function(date) {\r
+ if (date.constructor == Date) {\r
+ return date.getFullYear() * 10000 + date.getMonth() * 100 + date.getDate();\r
+ } else {\r
+ return date.year * 10000 + date.month * 100 + date.day;\r
+ }\r
+ },\r
+\r
+ getTimeDiff: function(a, b) {\r
+ var time = {hour: b.hour - a.hour, min: b.min - a.min};\r
+ if (time.min >= 60) {\r
+ time.hour++;\r
+ time.min -= 60;\r
+ } else if (time.min < 0) {\r
+ time.hour--;\r
+ time.min += 60;\r
+ }\r
+ return time;\r
+ },\r
+\r
+ findIndex: function(array, value) {\r
+ var index = null;\r
+ array.each(function(v, i) {\r
+ if (v == value) {\r
+ index = i;\r
+ throw $break;\r
+ }\r
+ });\r
+ return index;\r
+ },\r
+\r
+ recurrence: function(object, method) {\r
+ var calendar = this;\r
+ if (object.constructor == Array) {\r
+ object.each(function(o) {calendar.recurrence(o, method)});\r
+ } else if (object.keys) {\r
+ object.each(function(pair) {calendar.recurrence(pair[1], method)});\r
+ } else {\r
+ method(object);\r
+ }\r
+ },\r
+\r
+ toHolidayHash: function(object) {\r
+ var calendar = this;\r
+ var hash = {};\r
+\r
+ this.recurrence(object, function(o) {\r
+ if (!o.name) return;\r
+ if (o.date.constructor == Object)\r
+ o.date = new Date(o.date.year, o.date.month, o.date.day);\r
+\r
+ hash[o.date.toDateString()] = o;\r
+ });\r
+ return $H(hash);\r
+ },\r
+\r
+// toScheduleHash: function(object) {\r
+// var calendar = this;\r
+// var hash = {};\r
+//\r
+// this.recurrence(object, function(o) {\r
+// if (!o.description) return;\r
+// if (o.date.constructor == Object)\r
+// o.date = new Date(o.date.year, o.date.month, o.date.day);\r
+//\r
+// var date = o.date.toDateString();\r
+// o.date = date;\r
+//\r
+// if (hash[date]) {\r
+// hash[date].push(o);\r
+// hash[date].sort(calendar.sortSchedule);\r
+// } else {\r
+// hash[date] = [o];\r
+// }\r
+// });\r
+// return $H(hash);\r
+// },\r
+\r
+ inspectArgument: function(object, time) {\r
+ return this.builder.inspectArgument(object, time);\r
+ },\r
+\r
+ inspectDateArgument: function(date) {\r
+ return this.builder.inspectDateArgument(date);\r
+ },\r
+\r
+ sortSchedule: function(a, b) {\r
+ if (a.start.hour == b.start.hour) {\r
+ if (a.start.min == b.start.min)\r
+ return 0;\r
+ if (a.start.min < b.start.min)\r
+ return -1;\r
+ return 1;\r
+ }\r
+ if (a.start.hour < b.start.hour) return -1;\r
+\r
+ return 1;\r
+ },\r
+\r
+ hasSelectedDate: function() {\r
+ return (this.getSelected().length != 0);\r
+ },\r
+\r
+ getDate: function(element) {\r
+ return this.builder.getDate(element);\r
+ },\r
+\r
+ isRegularHoliday: function(day) {\r
+ return this.options.regularHoliday.include(day);\r
+ },\r
+\r
+ isHoliday: function(date) {\r
+ return this.options.holidays[date.toDateString()];\r
+ },\r
+\r
+ isScheduleDay: function(date) {\r
+ return this.options.schedules[date.toDateString()];\r
+ },\r
+\r
+ cacheSchedule: function(schedule) {\r
+ this.cached = schedule;\r
+ schedule.start_old = Object.clone(schedule.start);\r
+ schedule.finish_old = Object.clone(schedule.finish);\r
+ }\r
+}\r
+\r
+\r
+/**\r
+ * AbstractCalendar Class\r
+ */\r
+var AbstractCalendar = Class.create();\r
+AbstractCalendar.id = {\r
+ container: 'container',\r
+ scheduleContainer: 'scheduleContainer',\r
+ selector: 'selector'\r
+}\r
+AbstractCalendar.prototype = {\r
+ destroy: Prototype.emptyFunction,\r
+ beforeBuild: Prototype.emptyFunction,\r
+\r
+ build: function() {\r
+ this.header = this.buildHeader();\r
+ var node = Builder.node(\r
+ 'DIV', \r
+ {\r
+ id: this.getContainerId(),\r
+ className: this.calendar.classNames.joinClassNames('container')\r
+ },\r
+ [this.header, this.buildCalendar()]);\r
+\r
+ return node;\r
+ },\r
+\r
+ buildHeader: function() {\r
+ var headerNodes = Builder.node('TR');\r
+ headerNodes.appendChild(this.buildHeaderLeft());\r
+ headerNodes.appendChild(this.buildHeaderCenter());\r
+ headerNodes.appendChild(this.buildHeaderRight());\r
+ \r
+ className = this.calendar.classNames.joinClassNames('header');\r
+ var tbody = Builder.node('TBODY', [headerNodes]);\r
+ return Builder.node('TABLE', {className: className}, [tbody]);\r
+ },\r
+\r
+ buildSelector: function() {\r
+ // create selector\r
+ var selector = Builder.node('DIV', {id: this.getSelectorId()});\r
+ this.calendar.classNames.addClassNames(selector, 'selector');\r
+ Element.setOpacity(selector, 0.6);\r
+ Element.hide(selector);\r
+ Element.setStyle(selector, {zIndex: ZindexManager.getIndex()})\r
+ return selector;\r
+ },\r
+\r
+ buildCover: function() {\r
+ this.cover = Builder.node('div', {id: this.calendar.element.id.appendSuffix('cover')});\r
+ this.calendar.classNames.addClassNames(this.cover, 'cover');\r
+ Event.observe(this.cover, 'mousedown', this.calendar.selectDate.bindAsEventListener(this.calendar));\r
+ if (this.calendar.options.displayType != 'month' || this.calendar.options.size != 'samll') {\r
+ Event.observe(this.cover, 'mousemove', this.multipleSelection.bindAsEventListener(this));\r
+ }\r
+ return this.cover;\r
+ },\r
+\r
+ buildScheduleContainer: function() {\r
+ this.container = Builder.node('DIV', {style: 'position: relative', id: this.getScheduleContainerId()});\r
+ return this.container;\r
+ },\r
+\r
+ // the default is empty.\r
+ // overwride this method.\r
+ setScheduleContainerEvent: Prototype.emptyFunction,\r
+\r
+ changeCalendar: function(event) {\r
+ var element = Event.element(event);\r
+ var date = this.calendar.date;\r
+ var oldDate = new Date(date.toDateString());\r
+\r
+ if (Element.hasClassName(element, Calendar.className.preYearMark)) {\r
+ date.setFullYear(date.getFullYear() - 1);\r
+ } else if (Element.hasClassName(element, Calendar.className.preMonthMark)) {\r
+ date.setDate(1);\r
+ date.setMonth(date.getMonth() - 1);\r
+ } else if (Element.hasClassName(element, Calendar.className.preWeekMark)) {\r
+ date.setDate(date.getDate() - 7);\r
+ } else if (Element.hasClassName(element, Calendar.className.nextYearMark)) {\r
+ date.setFullYear(date.getFullYear() + 1);\r
+ } else if (Element.hasClassName(element, Calendar.className.nextMonthMark)) {\r
+ date.setDate(1);\r
+ date.setMonth(date.getMonth() + 1);\r
+ } else if (Element.hasClassName(element, Calendar.className.nextWeekMark)) {\r
+ date.setDate(date.getDate() + 7);\r
+ }\r
+\r
+ this.calendar.options.changeCalendar(date, oldDate);\r
+ this.calendar.refresh();\r
+ },\r
+\r
+ clickDeleteImage: function(schedule) {\r
+ if (this.calendar.options.beforeRemoveSchedule(schedule)) {\r
+ this.calendar.removeSchedule(schedule.id, true);\r
+ }\r
+ },\r
+\r
+ showDeleteImage: function(img) {\r
+ Element.show(img);\r
+ },\r
+\r
+ hideDeleteImage: function(img) {\r
+ Element.hide(img);\r
+ },\r
+\r
+ _constrain: function(n, lower, upper) {\r
+ if (n > upper) return upper; \r
+ else if (n < lower) return lower;\r
+ else return n;\r
+ },\r
+\r
+ getContainerId: function() {\r
+ return this.calendar.element.id.appendSuffix(AbstractCalendar.id.container);\r
+ },\r
+\r
+ getScheduleContainerId: function() {\r
+ return this.calendar.element.id.appendSuffix(AbstractCalendar.id.scheduleContainer);\r
+ },\r
+\r
+ setColumnWidth: function() {\r
+ var adjustSize = this.getAdjustSize();\r
+ var container = $(this.getScheduleContainerId()) || this.container;\r
+ var indexes = this.calendar.options.displayIndexes;\r
+ this.column.width = container.offsetWidth / indexes.length - adjustSize;\r
+ if (this.column.width < 0) this.column.width = 0;\r
+ },\r
+\r
+ setCover: function() {\r
+ var container = $(this.getScheduleContainerId()) || this.container;\r
+ if (!this.cover) {\r
+ container.appendChild(this.buildCover());\r
+ }\r
+ Element.setStyle(this.cover, {height: Element.getHeight(container) + 'px'});\r
+ },\r
+\r
+ getDragDistance: function() {\r
+ var adjustSize = this.getAdjustSize();\r
+// return [this.column.width + adjustSize, this.column.height];\r
+ return [this.column.width + adjustSize, this.column.height / 2];\r
+ },\r
+\r
+ getWeek: function() {\r
+ var date = this.calendar.date;\r
+ var baseDay = date.getDay();\r
+ var baseDayIndex = date.getDay();\r
+ var findBaseDay = false;\r
+\r
+ return this.calendar.options.displayIndexes.map(function(week, i) {\r
+ var diff = week - baseDay;\r
+ if (!findBaseDay && (diff > 0)) diff -= 7;\r
+ if (baseDayIndex == week) findBaseDay = true;\r
+ return DateUtil.afterDays(date, diff);\r
+ });\r
+ },\r
+\r
+ isSameStartDate: function(schedule, date) {\r
+ return ((date.getFullYear() == schedule.start.year) &&\r
+ (date.getMonth() == schedule.start.month) && (date.getDate() == schedule.start.day));\r
+ },\r
+\r
+ isSameFinishDate: function(schedule, date) {\r
+ return ((date.getFullYear() == schedule.finish.year) &&\r
+ (date.getMonth() == schedule.finish.month) && (date.getDate() == schedule.finish.day));\r
+ },\r
+\r
+ getSelectorId: function() {\r
+ return this.calendar.element.id.appendSuffix(AbstractCalendar.id.selector);\r
+ },\r
+\r
+ clickDateText: function(event, date) {\r
+ Event.stop(event);\r
+ this.calendar.date = date;\r
+ this.calendar.options.displayType = 'day';\r
+ this.calendar.refresh();\r
+ },\r
+\r
+ getAdjustSize: function() {\r
+ return UserAgent.isIE() ? 3 : 3;\r
+ },\r
+\r
+ setContainerInfo: function() {\r
+ this.container = $(this.getScheduleContainerId());\r
+ this.containerDimensions = Element.getDimensions(this.container);\r
+ this.containerOffset = Position.cumulativeOffset(this.container);\r
+ },\r
+\r
+ mouseOverSubSchedule: function(items) {\r
+ items.each(function(item) {\r
+ Element.addClassName(item, Calendar.className.scheduleItemSelect);\r
+ });\r
+ },\r
+\r
+ mouseOutSubSchedule: function(items) {\r
+ items.each(function(item) {\r
+ Element.removeClassName(item, Calendar.className.scheduleItemSelect);\r
+ });\r
+ },\r
+\r
+ toDate: function(hash) {\r
+ return DateUtil.toDate(hash);\r
+ }\r
+}\r
+\r
+\r
+/**\r
+ * CalenderMonth Class\r
+ */\r
+var CalendarMonth = Class.create();\r
+CalendarMonth.id = {\r
+ year: 'year',\r
+ month: 'month',\r
+ column: 'column',\r
+ nextYear: 'nextYear',\r
+ nextMonth: 'nextMonth',\r
+ preYear: 'preYear',\r
+ preMonth: 'preMonth',\r
+ calTable: 'calTable',\r
+ scheduleContainer: 'scheduleContainer',\r
+ container: 'container'\r
+}\r
+Object.extend(CalendarMonth.prototype, AbstractCalendar.prototype);\r
+Object.extend(CalendarMonth.prototype, {\r
+\r
+ initialize: function(calendar) {\r
+ this.calendar = calendar;\r
+ this.week = this.getWeek();\r
+ },\r
+\r
+ /*** Month ***/\r
+ /********************************** build functions **********************************/\r
+ buildHeaderLeft: function() {\r
+ var container = Builder.node('TD');\r
+ this.calendar.classNames.addClassNames(container, 'preYears');\r
+\r
+ var id = this.calendar.element.id.appendSuffix(CalendarMonth.id.preYear);\r
+ var node = Builder.node('DIV', {id: id});\r
+ this.calendar.classNames.addClassNames(node, 'preYearMark');\r
+ Event.observe(node, "click", this.calendar.changeCalendar.bindAsEventListener(this.calendar));\r
+ container.appendChild(node);\r
+\r
+ id = this.calendar.element.id.appendSuffix(CalendarMonth.id.preMonth);\r
+ node = Builder.node('DIV', {id: id});\r
+ this.calendar.classNames.addClassNames(node, 'preMonthMark');\r
+ Event.observe(node, "click", this.calendar.changeCalendar.bindAsEventListener(this.calendar));\r
+ container.appendChild(node);\r
+\r
+ return container;\r
+ },\r
+\r
+ buildHeaderCenter: function() {\r
+ var text = [];\r
+ if (this.calendar.options.monthHeaderFormat) {\r
+ var date = this.calendar.date;\r
+ var templ = new Template(this.calendar.options.monthHeaderFormat);\r
+ text = [templ.evaluate({year: date.getFullYear(), month: date.getMonth() + 1}), ' '];\r
+ }\r
+ var contents = [];\r
+\r
+ var id = this.calendar.element.id.appendSuffix(CalendarMonth.id.month);\r
+ var node = Builder.node('SPAN', {id: id}, [text[0] || DateUtil.months[this.calendar.date.getMonth()]]);\r
+ this.calendar.classNames.addClassNames(node, 'ym');\r
+ contents.push(node);\r
+\r
+ id = this.calendar.element.id.appendSuffix(CalendarMonth.id.year);\r
+ node = Builder.node('SPAN', {id: id}, [text[1] || this.calendar.date.getFullYear()]);\r
+ this.calendar.classNames.addClassNames(node, 'ym');\r
+ contents.push(node);\r
+\r
+ var container = Builder.node('TD', contents);\r
+ this.calendar.classNames.addClassNames(container, 'years');\r
+\r
+ return container;\r
+ },\r
+\r
+ buildHeaderRight: function() {\r
+ var container = Builder.node('TD');\r
+ this.calendar.classNames.addClassNames(container, 'nextYears');\r
+\r
+ var id = this.calendar.element.id.appendSuffix(CalendarMonth.id.nextMonth);\r
+ var node = Builder.node('DIV', {id: id});\r
+ this.calendar.classNames.addClassNames(node, 'nextMonthMark');\r
+ Event.observe(node, "click", this.calendar.changeCalendar.bindAsEventListener(this.calendar));\r
+ container.appendChild(node);\r
+\r
+ id = this.calendar.element.id.appendSuffix(CalendarMonth.id.nextYear);\r
+ node = Builder.node('DIV', {id: id});\r
+ this.calendar.classNames.addClassNames(node, 'nextYearMark');\r
+ Event.observe(node, "click", this.calendar.changeCalendar.bindAsEventListener(this.calendar));\r
+ container.appendChild(node);\r
+\r
+ return container;\r
+ },\r
+ \r
+ buildCalendar: function() {\r
+ var container = Builder.node('DIV');\r
+ var scheduleContainer = Builder.node('DIV',\r
+ {id: this.getScheduleContainerId(), style: 'position: relative'},\r
+ [this.buildTableData()]);\r
+ this.setScheduleContainerEvent(scheduleContainer);\r
+\r
+ // create selector\r
+ var selector = this.buildSelector();\r
+ scheduleContainer.appendChild(selector);\r
+ return Builder.node('DIV', [this.buildTableHeader(), scheduleContainer]);\r
+ },\r
+ \r
+ buildTableHeader: function() {\r
+ var weekArray = new Array();\r
+ var self = this;\r
+ var tbody = Builder.node('TBODY');\r
+ var tr = Builder.node('TR', weekArray);\r
+ var width = 100 / this.calendar.options.displayIndexes.length + '%';\r
+ var lastIndex = this.calendar.options.displayIndexes.last();\r
+\r
+ tbody.appendChild(tr);\r
+\r
+ this.calendar.options.displayIndexes.each(function(i) {\r
+ var id = self.calendar.element.id.appendSuffix(CalendarMonth.id.column);\r
+ var text = self.calendar.options.dayOfWeek[i];\r
+ var node = Builder.node('TH', {id: id.appendSuffix(i)}, [text]);\r
+ node.width = width;\r
+ weekArray.push(node);\r
+ if (lastIndex == i) {\r
+ self.calendar.classNames.addClassNames(node, 'thRight');\r
+ }\r
+ Event.observe(node, 'click', self.selectDay.bindAsEventListener(self));\r
+ tr.appendChild(node);\r
+ });\r
+ \r
+ return Builder.node('TABLE', \r
+ {className: this.calendar.classNames.joinClassNames('table')}, [tbody]);\r
+ },\r
+ \r
+ buildTableData: function() {\r
+ var indexes = this.calendar.options.displayIndexes;\r
+ var today = new Date();\r
+ var year = this.calendar.date.getFullYear();\r
+ var month = this.calendar.date.getMonth();\r
+ var firstDay = DateUtil.getFirstDate(year, month).getDay();\r
+ var lastDate = DateUtil.getLastDate(year, month).getDate();\r
+ var trs = new Array();\r
+ var tds = new Array();\r
+ var width = 100 / indexes.length + '%';\r
+ var lastIndex = indexes.last();\r
+ var node, hday, sday, tmp_date, isOutside, i = null;\r
+\r
+ // set start index\r
+ var weekIndex = this.calendar.options.weekIndex;\r
+ var length = DateUtil.dayOfWeek.length * 5;\r
+ var i = null;\r
+ var day = 1;\r
+ if (weekIndex <= firstDay) {\r
+ i = weekIndex;\r
+ length += i;\r
+ } else {\r
+ i = weekIndex - 7;\r
+ length -= i;\r
+ }\r
+\r
+ var diff = firstDay - weekIndex;\r
+ if (diff < 0) diff + indexes.length;\r
+ if ((lastDate + diff) > length) {\r
+ length += indexes.length;\r
+ }\r
+\r
+ var wday = weekIndex;\r
+ \r
+ var find = 0;\r
+ for (; i < length; i++) {\r
+ if (indexes.include(wday)) {\r
+ if (i < firstDay) {\r
+ tmp_date = new Date(\r
+ this.calendar.date.getFullYear(),\r
+ this.calendar.date.getMonth(),\r
+ i - firstDay + 1\r
+ );\r
+ node = Builder.node('TD');\r
+ node.innerHTML = ' ';\r
+ node.date = tmp_date;\r
+ node.width = width;\r
+ tds.push(node);\r
+ } else if (day > lastDate) {\r
+ tmp_date = new Date(\r
+ this.calendar.date.getFullYear(),\r
+ this.calendar.date.getMonth(),\r
+ day\r
+ );\r
+ node = Builder.node('TD');\r
+ node.innerHTML = ' ';\r
+ node.date = tmp_date;\r
+ tds.push(node);\r
+ } else {\r
+ if (i == firstDay) length += find;\r
+ tmp_date = new Date(\r
+ this.calendar.date.getFullYear(),\r
+ this.calendar.date.getMonth(),\r
+ day\r
+ );\r
+ hday = this.calendar.options.holidays[tmp_date.toDateString()];\r
+\r
+ if (this.calendar.options.size == Calendar.size.large) {\r
+ node = this.buildLargeRow(tmp_date, hday, sday, today);\r
+ if (this.calendar.options.dblclickListener) {\r
+ Event.observe(node, 'dblclick', this.calendar.onDblClick.bindAsEventListener(this.calendar));\r
+ }\r
+ } else {\r
+ sday = this.calendar.options.schedules.detect(function(schedule) {\r
+ var startDate = DateUtil.toDate(schedule.start);\r
+ return tmp_date.sameDate(startDate)\r
+ });\r
+ node = this.buildSmallRow(tmp_date, hday, sday, today);\r
+ Event.observe(node, 'mousedown', this.calendar.selectDate.bindAsEventListener(this.calendar));\r
+ }\r
+\r
+ node.width = width;\r
+ node.date = tmp_date;\r
+\r
+ tds.push(node);\r
+ }\r
+ find++;\r
+ }\r
+\r
+ if (i >= firstDay) {\r
+ day++;\r
+ }\r
+\r
+ if (wday == lastIndex) {\r
+ trs.push(Builder.node('TR', tds));\r
+ this.calendar.classNames.addClassNames(tds[tds.length - 1], 'tdRight');\r
+ tds = new Array();\r
+ }\r
+\r
+ if (wday >= 6) {\r
+ wday = 0;\r
+ } else {\r
+ wday++;\r
+ }\r
+ }\r
+\r
+ this.rowMax = trs.length - 1;\r
+ var tbody = Builder.node('TBODY', [trs]);\r
+ this.calendarTable = Builder.node(\r
+ 'TABLE', \r
+ {\r
+ id: this.getCalendarTableId(),\r
+ className: this.calendar.classNames.joinClassNames('table')\r
+ },\r
+ [tbody]);\r
+ return this.calendarTable;\r
+ },\r
+\r
+ buildLargeRow: function(date, holiday, schedule, today) {\r
+ var calendar = this;\r
+ var row = Builder.node('TD', {id: this.getDateId(date)});\r
+ var dateContainer = Builder.node('DIV');\r
+\r
+ this.calendar.classNames.addClassNames(dateContainer, 'dateContainer');\r
+ row.appendChild(dateContainer);\r
+\r
+ var dateNode = null;\r
+ var clickDateText = this.calendar.options.clickDateText;\r
+ if (clickDateText) {\r
+ dateNode = Builder.node('A', {href: '#'}, [date.getDate()]);\r
+ Event.observe(dateContainer, 'mousedown', clickDateText.bindAsEventListener(this, date));\r
+ } else if (clickDateText == null) {\r
+ dateNode = Builder.node('A', {href: '#'}, [date.getDate()]);\r
+ Event.observe(dateContainer, 'mousedown', this.clickDateText.bindAsEventListener(this, date));\r
+ } else {\r
+ dateNode = Builder.node('SPAN', [date.getDate()]);\r
+ Element.setStyle(dateNode, {textDecoration: 'none'});\r
+ }\r
+ if (date.days() == today.days()) {\r
+ this.calendar.addHighlightClass(dateNode);\r
+ }\r
+ dateContainer.appendChild(dateNode);\r
+\r
+ if (holiday) {\r
+ this.calendar.setHolidayClass(row);\r
+ var name = Builder.node(\r
+ 'SPAN', \r
+ {className: this.calendar.classNames.joinClassNames('holidayName')},\r
+ holiday.name\r
+ );\r
+ dateContainer.appendChild(name);\r
+ if (holiday.onclick) {\r
+ Event.observe(name, "click", holiday.onclick.bindAsEventListener(this));\r
+ }\r
+ } else if (this.calendar.isRegularHoliday(date.getDay())) {\r
+ this.calendar.setRegularHolidayClass(row);\r
+ } else {\r
+ this.calendar.setWorkdayClass(row);\r
+ }\r
+\r
+ return row;\r
+ },\r
+\r
+ buildSmallRow: function(date, holiday, schedule, today) {\r
+ var row = Builder.node('TD', {id: this.getDateId(date)}, [date.getDate()]);\r
+ if (schedule) {\r
+ this.calendar.setScheduleClass(row);\r
+ var first = schedule[0];\r
+ if (first) row.title = first.description.stripTags();\r
+ } else if (holiday) {\r
+ this.calendar.setHolidayClass(row);\r
+ row.title = holiday.name.stripTags();\r
+ } else if (this.calendar.isRegularHoliday(date.getDay())) {\r
+ this.calendar.setRegularHolidayClass(row);\r
+ } else {\r
+ this.calendar.setWorkdayClass(row);\r
+ }\r
+\r
+ if (date.days() == today.days()) {\r
+ this.calendar.addHighlightClass(row);\r
+ }\r
+ return row;\r
+ },\r
+\r
+ beforeBuild: function() {\r
+ this.column = {};\r
+ var rule = CssUtil.getCssRuleBySelectorText('.' + Calendar.className.table + ' td');\r
+ this.column.height = parseInt(rule.style['height'], 10);\r
+ \r
+ rule = CssUtil.getCssRuleBySelectorText('.' + Calendar.className.dateContainer);\r
+ this.column.dateTextHeight = parseInt(rule.style['height'], 10);\r
+ },\r
+\r
+ /**********************************\r
+ ***** for make schedule item *****\r
+ **********************************/\r
+ buildSchedule: function(schedule) {\r
+ var id = 'scheduleItem_' + schedule.id;\r
+ var canEdit = (schedule.edit == undefined || schedule.edit);\r
+ var item = Builder.node('DIV', {id: id});\r
+ var start = DateUtil.toDate(schedule.start);\r
+ var finish = DateUtil.toDate(schedule.finish);\r
+ if (start.sameDate(finish)) {\r
+ this.calendar.classNames.addClassNames(item, 'scheduleItemNoBorder');\r
+ } else {\r
+ this.calendar.classNames.addClassNames(item, 'scheduleItemLarge');\r
+ }\r
+\r
+ if (canEdit) {\r
+ var deleteImg = Builder.node('DIV',\r
+ {\r
+ id: 'scheduleDeleteImg_' + schedule.id,\r
+ className: this.calendar.classNames.joinClassNames('deleteImg')\r
+ }\r
+ );\r
+ Element.hide(deleteImg);\r
+ item.appendChild(deleteImg);\r
+\r
+ // set click event on a image.\r
+ Event.observe(deleteImg, 'click', this.clickDeleteImage.bind(this, schedule));\r
+ Event.observe(item, 'mouseover', this.showDeleteImage.bind(this, deleteImg));\r
+ Event.observe(item, 'mouseout', this.hideDeleteImage.bind(this, deleteImg));\r
+ }\r
+\r
+ // set dblclick event on a schedule item.\r
+ if (this.calendar.options.dblclickSchedule) {\r
+ Event.observe(\r
+ item, 'dblclick', this.calendar.options.dblclickSchedule.bind(this, schedule));\r
+ }\r
+\r
+ // drag handler\r
+ var handler = null;\r
+ if (canEdit) {\r
+ handler = Builder.node('DIV', {className: this.calendar.classNames.joinClassNames('scheduleHandler')});\r
+ item.appendChild(handler);\r
+ }\r
+\r
+ var icon = null;\r
+ if (schedule.icon) {\r
+ icon = Builder.node('IMG', {src: schedule.icon, alt: 'icon', style: 'float: left;'});\r
+ item.appendChild(icon);\r
+ }\r
+\r
+ // private mark\r
+ if (!schedule.publicity) {\r
+ icon = Builder.node('DIV', {id: 'private_img_' + schedule.id});\r
+ this.calendar.classNames.addClassNames(icon, 'privateImg');\r
+ item.appendChild(icon);\r
+ }\r
+\r
+ var body = Builder.node('DIV');\r
+ var text = this.getTimeText(schedule.start, schedule.finish);\r
+ text = Builder.node('DIV', {id: id + '_text', style: 'float: left;'}, [text]);\r
+ this.calendar.classNames.addClassNames(text, 'scheduleTimeArea');\r
+ item.appendChild(text);\r
+ var description = schedule.description.unescapeHTML();\r
+ item.appendChild(Builder.node('DIV', {id: id + '_description'}, [description]));\r
+\r
+ item.title = description;\r
+ item.schedule = schedule;\r
+\r
+ return [item, handler];\r
+ },\r
+\r
+ adjustScheduleStyle: function(item, rowIndex, cellIndex, holder) {\r
+ var self = this;\r
+ var height = parseInt(Element.getStyle(item, 'height'), 10);\r
+ var top = parseInt(Element.getStyle(item, 'top'), 10);\r
+ var range = this.getScheduleRange(item);\r
+ var tops = [];\r
+\r
+ holder.each(function(holded) {\r
+ var holdedRange = self.getScheduleRange(holded);\r
+ if (range.any(function(r) {return holdedRange.include(r)})) {\r
+ tops.push(holded.topIndex);\r
+ }\r
+ });\r
+\r
+ var index = $R(0, tops.length, true).detect(function(i) {return !tops.include(i)});\r
+ if (isNaN(index)) index = tops.length;\r
+ item.topIndex = index;\r
+ Element.setStyle(item, {top: top + (height + 2) * index + 'px'});\r
+ },\r
+\r
+ getScheduleRange: function(item) {\r
+ return $R(0, item.length, true).map(function(i) {return item.cellIndex + i});\r
+ },\r
+\r
+ setScheduleBaseStyle: function(item, rowIndex, cellIndex, length) {\r
+ var oneDay = this.column.height;\r
+ var top = oneDay * rowIndex + this.column.dateTextHeight;\r
+ var adjustSize = this.getAdjustSize();\r
+ Element.setStyle(item, {\r
+ top: top + 'px',\r
+ width: this.column.width * length + adjustSize * (length - 1) + 'px',\r
+ left: this.column.width * cellIndex + cellIndex * adjustSize + 'px'\r
+ });\r
+ },\r
+\r
+ afterBuild: function() {\r
+ this.scheduleNodes = [];\r
+ if (this.calendar.options.size != Calendar.size.small) {\r
+ this.setContainerInfo();\r
+ this.setColumnWidth();\r
+ this.setCover();\r
+ this.setSelector();\r
+ var self = this;\r
+ var indexes = this.calendar.options.displayIndexes;\r
+ var distance = this.getDragDistance();\r
+ var holders = $R(0, $(this.getCalendarTableId()).rows.length).map(function() {return []});\r
+ var date = this.calendar.date;\r
+ var calStartDate = DateUtil.getFirstDate(date.getFullYear(), date.getMonth());\r
+ var calStart = calStartDate.days();\r
+ var calFinish = DateUtil.getLastDate(date.getFullYear(), date.getMonth()).days();\r
+ \r
+ self.calendar.options.schedules.each(function(schedule, index) {\r
+ var startDate = self.toDate(schedule.start);\r
+ var start = startDate.days();\r
+ var finishDate = self.toDate(schedule.finish);\r
+ var finish = finishDate.days();\r
+ var days = self.getDayDiff(schedule);\r
+ \r
+ if ((start >= calStart && start <= calFinish) || (finish >= calStart && finish <= calFinish)) {\r
+ if (!calStartDate.sameMonth(startDate)) startDate = calStartDate;\r
+ self.setSchedule(schedule, holders, distance, days);\r
+ }\r
+ });\r
+ }\r
+ },\r
+\r
+ setSchedule: function(schedule, holders, distance, days) {\r
+ var items = [];\r
+ var rowMax = 6;\r
+ var startDate = DateUtil.toDate(schedule.start);\r
+ var date = startDate;\r
+ var indexes = this.calendar.options.displayIndexes;\r
+ var targetDate = this.calendar.options.initDate;\r
+\r
+ while (days >= 0) {\r
+ if (date.getMonth() != startDate.getMonth()) break;\r
+ var lastWday = this.getLastWday(date);\r
+\r
+ var length = days + 1;\r
+ var firstDay = date.getDay();\r
+ var finishDate = date.advance({days: length - 1});\r
+\r
+ if (finishDate.getTime() > lastWday.getTime()) {\r
+ finishDate = lastWday; \r
+ length = finishDate.days() - date.days() + 1;\r
+ }\r
+ var finishDay = finishDate.getDay();\r
+ var wdays = null;\r
+ if (firstDay <= finishDay) {\r
+ wdays = $R(firstDay, finishDay, false);\r
+ } else {\r
+ wdays = $R(0, finishDay, false).toArray().concat($R(firstDay, rowMax, false).toArray());\r
+ }\r
+ var itemLength = wdays.findAll(function(day) {\r
+ return indexes.include(day);\r
+ }).length;\r
+\r
+ var cellDate = new Date(date.getTime());\r
+ while (cellDate.days() <= finishDate.days()) {\r
+ if (cellDate.getMonth() == targetDate.getMonth()) {\r
+ var cellPosition = this.getCellPosition(cellDate.getDate());\r
+ if (cellPosition) {\r
+ var rowIndex = cellPosition.rowIndex;\r
+ var cellIndex = cellPosition.cellIndex;\r
+ \r
+ // create a schedule node.\r
+ var result = this.buildSchedule(schedule);\r
+ var item = result.first();\r
+ item.length = itemLength;\r
+ item.cellIndex = cellIndex;\r
+ this.container.appendChild(item);\r
+ \r
+ // set style(position and size) of a schedule item.\r
+ this.setScheduleBaseStyle(item, rowIndex, cellIndex, itemLength);\r
+ var left = this.adjustScheduleStyle(item, rowIndex, cellIndex, holders[rowIndex]);\r
+ \r
+ if (schedule.edit == undefined || schedule.edit) {\r
+ this.setDraggable(item, result.last(), distance);\r
+ this.setResize(item);\r
+ }\r
+ \r
+ holders[rowIndex].push(item);\r
+ this.scheduleNodes.push(item);\r
+ break;\r
+ } else if (indexes.include(cellDate.getDay())) {\r
+ itemLength--;\r
+ }\r
+ } else if (indexes.include(cellDate.getDay())) {\r
+ itemLength--;\r
+ }\r
+ cellDate = cellDate.advance({days: 1});\r
+ }\r
+ \r
+ if (items.length == 0) {\r
+ days -= length;\r
+ } else {\r
+ days =- 7;\r
+ }\r
+\r
+ var date = finishDate.advance({days: 1});\r
+ if (item) items.push(item);\r
+ }\r
+\r
+ var self = this;\r
+ items.each(function(item) {\r
+ Event.observe(item, 'mouseover', self.mouseOverSubSchedule.bind(this, items));\r
+ Event.observe(item, 'mouseout', self.mouseOutSubSchedule.bind(this, items));\r
+ });\r
+ },\r
+\r
+ getLastWday: function(date) {\r
+ var index = this.calendar.wdays.indexOf(date.getDay()) + 1;\r
+ return date.advance({days: this.calendar.wdays.length - index});\r
+ },\r
+\r
+ setSelector: function() {\r
+ var selector = $(this.getSelectorId());\r
+ Element.setStyle(selector, {\r
+ width: this.column.width + 'px',\r
+ height: this.column.height - 2 + 'px'\r
+ });\r
+ },\r
+\r
+ // set draggalbe event\r
+ setDraggable: function(item, handle, distance) {\r
+ var self = this;\r
+ var offset = Position.cumulativeOffset(this.container);\r
+ var selector = $(this.getSelectorId());\r
+ var cWidth = this.column.width;\r
+ var cHeight = this.column.height;\r
+ var rowMax = this.rowMax;\r
+ var cellMax = this.calendar.options.displayIndexes.length - 1;\r
+ var adjustSize = this.getAdjustSize();\r
+\r
+ new Draggable(item, \r
+ {\r
+ handle: handle,\r
+ scroll: window,\r
+ starteffect: Prototype.emptyFunction,\r
+ endeffect: Prototype.emptyFunction,\r
+ onStart: function(draggalbe) {\r
+ Element.show(selector);\r
+ },\r
+ onDrag: function(draggable, event) {\r
+ var element = draggable.element;\r
+ var top = parseInt(Element.getStyle(element, 'top'), 10);\r
+ var rowIndex = Math.floor(top / cHeight);\r
+ var left = parseInt(Element.getStyle(element, 'left'), 10);\r
+ var cellIndex = Math.floor(left / cWidth);\r
+\r
+ if ((cellIndex >= 0 && rowIndex >= 0) &&\r
+ (cellIndex <= cellMax && rowIndex <= rowMax)) {\r
+ Element.setStyle(selector, {\r
+ left: cWidth * cellIndex + adjustSize * cellIndex + 'px',\r
+ top: cHeight * rowIndex + 'px'\r
+ });\r
+ }\r
+ },\r
+ onEnd: function(draggable) {\r
+ Element.hide(selector);\r
+ self.changeSchedule(draggable);\r
+ }\r
+ }\r
+ );\r
+ },\r
+\r
+ // set resize event\r
+ setResize: function(item) {\r
+ var self = this;\r
+ new CalendarResizeableEx(item, {\r
+ left: 0,\r
+ top: 0,\r
+ bottom: 0,\r
+ distance: this.column.width,\r
+ restriction: true,\r
+ resize: function(element) {\r
+ self.updateTirm(element);\r
+ }\r
+ });\r
+ },\r
+\r
+ /********************************** public method **********************************/\r
+ getDate: function(element) {\r
+ if (!element) return;\r
+ var date = this.calendar.date;\r
+ if (element.constructor == String)\r
+ return new Date(date.getFullYear(), date.getMonth(), element);\r
+ else\r
+ return new Date(date.getFullYear(), date.getMonth(), element.id.getSuffix());\r
+ },\r
+\r
+ abstractSelect: function(event, method) {\r
+ var element = null;\r
+ if (this.calendar.options.size == 'large') {\r
+ element = this.findClickedElement(event);\r
+ } else {\r
+ element = Event.element(event);\r
+ if (element.tagName != 'TD') {\r
+ element = Element.getParentByTagName(['TD'], element);\r
+ }\r
+ }\r
+ if (element && element.id) {\r
+ var date = this.getDate(element);\r
+ method(date, element);\r
+ }\r
+ },\r
+\r
+ getSelectedTerm: function() {\r
+ var self = this;\r
+ var elements = this.calendar.getSelected();\r
+ if (elements && elements.length > 0) {\r
+ return [elements.first(), elements.last()].map(function(e) {\r
+ return self.getDate(e);\r
+ });\r
+ }\r
+ return null;\r
+ },\r
+\r
+ /********************************** private method **********************************/\r
+ selectDay: function(event) {\r
+ var calendar = this.calendar;\r
+ var th = Event.element(event);\r
+ if (th.tagName != 'TH')\r
+ th = Element.getParentByTagName('TH', th);\r
+\r
+ this.iterateTable({doCell: function(cell) {\r
+ if ((cell.cellIndex == th.cellIndex) && cell.id)\r
+ calendar.addSelectedClass(cell);\r
+ }});\r
+ },\r
+\r
+ inspectArgument: function(object, time) {\r
+ var self = this;\r
+ var dates = this.calendar.getSelected();\r
+ var result = [];\r
+\r
+ self.calendar.recurrence(object, function(o) {\r
+ if (!o.date) {\r
+ dates.each(function(d) {\r
+ var param = {};\r
+ if (!o.date) {\r
+ param = {date: self.getDate(d)};\r
+ if (time) {\r
+ param.start = {hour: 0, min: 0};\r
+ param.finish = {hour: 0, min: 0};\r
+ }\r
+ }\r
+ Object.extend(param, o);\r
+ result.push(param);\r
+ });\r
+ } else if (o.date.constructor == Object) {\r
+ o.date = new Date(o.date.year, o.date.month, o.date.day);\r
+ result.push(o);\r
+ } else {\r
+ result.push(o);\r
+ }\r
+ });\r
+ return result;\r
+ },\r
+\r
+ inspectDateArgument: function(date) {\r
+ if (date) {\r
+ map = [];\r
+ this.calendar.recurrence(date, function(d) {\r
+ if (d.constructor == Object) \r
+ map.push(new Date(d.year, d.month, d.day));\r
+ else \r
+ map.push(d);\r
+ });\r
+ return map;\r
+ } else {\r
+ var calendar = this;\r
+ var dates = this.calendar.getSelected();\r
+ if (dates.length == 0) return null;\r
+\r
+ return dates.collect(function(d) {\r
+ return calendar.getDate(d);\r
+ });\r
+ }\r
+ },\r
+\r
+ findClickedElement: function(event) {\r
+ var container = $(this.getScheduleContainerId());\r
+ var position = Position.cumulativeOffset(container);\r
+ var scrollTop = Position.realOffset(container).last();\r
+ scrollTop -= document.documentElement.scrollTop || document.body.scrollTop;\r
+ var x = Event.pointerX(event) - position[0];\r
+ var y = Event.pointerY(event) - position[1] + scrollTop;\r
+ var rowIndex = Math.floor(y / this.column.height);\r
+ var cellIndex = Math.floor(x / this.column.width);\r
+ return $(this.calendarTable.rows[rowIndex].cells[cellIndex]);\r
+ },\r
+\r
+ multipleSelection: function(event) {\r
+ if (!this.calendar.selectedBase || !this.calendar.mouseDown) return;\r
+ var self = this;\r
+ var calendar = this.calendar;\r
+ var selected = this.calendar.selectedBase;\r
+\r
+ this.abstractSelect(event, function(date, element) {\r
+ var selectedElement = $(selected.id);\r
+\r
+ var range = calendar.createRange(\r
+ parseInt(selectedElement.id.getSuffix()),\r
+ parseInt(element.id.getSuffix())\r
+ );\r
+\r
+ self.iterateTable({doCell: function(cell) {\r
+ if (cell.tagName != 'TD' || !cell.id) throw $continue;\r
+ var id = parseInt(cell.id.getSuffix());\r
+ \r
+ if (range.include(id)) {\r
+ calendar.addSelectedClass(cell);\r
+ } else {\r
+ calendar.removeSelectedClass(cell);\r
+ }\r
+ }});\r
+ });\r
+ },\r
+\r
+ iterateTable: function() {\r
+ var options = Object.extend({\r
+ doTable: null,\r
+ doRow: null,\r
+ doCell: null\r
+ }, arguments[0]);\r
+ \r
+ var calendar = $(this.getCalendarTableId());\r
+ if (options.doTable) {\r
+ options.doTable(calendar)\r
+ };\r
+\r
+ $A(calendar.rows).each(function(row) {\r
+ if (options.doRow) {\r
+ options.doRow(row);\r
+ }\r
+ $A(row.cells).each(function(cell) {\r
+ if (options.doCell) {\r
+ options.doCell(cell);\r
+ }\r
+ });\r
+ });\r
+ },\r
+\r
+ findRow: function(rowIndex) {\r
+ var table = $(this.getCalendarTableId());\r
+ return $A(table.rows).detect(function(row) {\r
+ return row.rowIndex == rowIndex;\r
+ });\r
+ },\r
+\r
+ findCell: function(rowIndex, cellIndex) {\r
+ return $A(this.findRow(rowIndex).cells).detect(function(cell) {\r
+ return cell.cellIndex == cellIndex;\r
+ });\r
+ },\r
+\r
+ getCalendarTableId: function() {\r
+ return this.calendar.element.id.appendSuffix(CalendarMonth.id.calTable);\r
+ },\r
+\r
+ getDateId: function(date) {\r
+ var day = null;\r
+ if (date.constructor == Date) {\r
+ day = date.getDate();\r
+ } else {\r
+ day = date;\r
+ }\r
+ return this.calendar.element.id.appendSuffix(day);\r
+ },\r
+\r
+ getCell: function(day) {\r
+ return $(this.getDateId(day));\r
+ },\r
+\r
+ getCellPosition: function(day) {\r
+ var cell = this.getCell(day);\r
+ if (cell) {\r
+ var row = Element.getParentByTagName(['tr'], cell);\r
+ return {cellIndex: cell.cellIndex, rowIndex: row.rowIndex};\r
+ }\r
+ },\r
+\r
+ changeSchedule: function(draggable) {\r
+ var element = draggable.element;\r
+ var schedule = element.schedule;\r
+\r
+ var top = parseInt(Element.getStyle(element, 'top'), 10);\r
+ var rowIndex = Math.floor(top / this.column.height);\r
+ var left = parseInt(Element.getStyle(element, 'left'), 10);\r
+ var cellIndex = Math.floor(left / this.column.width);\r
+ var table = $(this.getCalendarTableId());\r
+ var rowMax = table.rows.length - 1;\r
+ var cellMax = this.calendar.options.displayIndexes.length - 1;\r
+\r
+ if ((cellIndex >= 0 && rowIndex >= 0) &&\r
+ (cellIndex <= cellMax && rowIndex <= rowMax)) {\r
+ var cell = this.findCell(rowIndex, cellIndex);\r
+ var date = cell.date;\r
+ var diff = this.getDayDiff(schedule);\r
+\r
+ var finish = date.advance({days: diff});\r
+ if (\r
+ schedule.start.month == date.getMonth() &&\r
+ schedule.start.day == date.getDate() &&\r
+ schedule.finish.month == finish.getMonth() &&\r
+ schedule.finish.day == finish.getDate()\r
+ ) {this.calendar.refreshSchedule(); return;}\r
+\r
+ schedule.start.month = date.getMonth();\r
+ schedule.start.day = date.getDate();\r
+ schedule.finish.month = finish.getMonth();\r
+ schedule.finish.day = finish.getDate();\r
+\r
+ this.calendar.refreshSchedule();\r
+ this.calendar.options.changeSchedule(schedule);\r
+ } else {\r
+ this.calendar.refreshSchedule();\r
+ }\r
+ },\r
+\r
+ updateTirm: function(element) {\r
+ var schedule = element.schedule;\r
+ var width = parseInt(Element.getStyle(element, 'width'));\r
+ var top = parseInt(Element.getStyle(element, 'top'));\r
+ var left = parseInt(Element.getStyle(element, 'left'));\r
+ var cellIndex = Math.round((left + width) / this.column.width) - 1;\r
+ var rowIndex = Math.round(top / this.column.height);\r
+ var cell = this.findCell(rowIndex, cellIndex);\r
+\r
+ var oldFinish = schedule.finish;\r
+ var newFinish = cell.date.toHash();\r
+ newFinish.hour = oldFinish.hour;\r
+ newFinish.min = oldFinish.min;\r
+\r
+ if (DateUtil.toDate(schedule.start).getTime() >= DateUtil.toDate(newFinish).getTime()) {\r
+ var maxHour = 23;\r
+ var maxMin = 55;\r
+ if (schedule.start.hour == maxHour && schedule.start.min == maxMin) {\r
+ this.calendar.refreshSchedule();\r
+ this.calendar.options.updateTirm();\r
+ return;\r
+ } else {\r
+ newFinish.hour = maxHour;\r
+ newFinish.min = maxMin;\r
+ }\r
+ }\r
+ schedule.finish = newFinish;\r
+\r
+ this.calendar.refreshSchedule();\r
+ this.calendar.options.updateTirm(schedule);\r
+ },\r
+\r
+ getTimeText: function(start, finish) {\r
+ var calendar = this.calendar;\r
+ return calendar.formatTime(start);\r
+ },\r
+\r
+ getDayDiff: function(schedule) {\r
+ return DateUtil.numberOfDays(this.toDate(schedule.start), this.toDate(schedule.finish));\r
+ }\r
+});\r
+\r
+\r
+/**\r
+ * CalendarWeek Class\r
+ */\r
+var CalendarWeek= Class.create();\r
+CalendarWeek.id = {\r
+ columnContainer: 'columnContainer',\r
+ columnHeader: 'columnHeader',\r
+ column: 'column',\r
+ next: 'next',\r
+ pre: 'pre'\r
+}\r
+Object.extend(CalendarWeek.prototype, AbstractCalendar.prototype);\r
+Object.extend(CalendarWeek.prototype, {\r
+\r
+ initialize: function(calendar) {\r
+ this.calendar = calendar;\r
+ this.week = this.getWeek();\r
+ this.setDisplayTime();\r
+ },\r
+\r
+ /*** Week ***/\r
+ /********************************** build functions **********************************/\r
+ buildHeaderLeft: function() {\r
+ var container = Builder.node('TD');\r
+ this.calendar.classNames.addClassNames(container, 'preYears');\r
+\r
+ var id = this.calendar.element.id.appendSuffix(CalendarWeek.id.pre);\r
+ var node = Builder.node('DIV', {id: id});\r
+ this.calendar.classNames.addClassNames(node, 'preWeekMark');\r
+ Event.observe(node, "click", this.calendar.changeCalendar.bindAsEventListener(this.calendar));\r
+ container.appendChild(node);\r
+\r
+ return container;\r
+ },\r
+\r
+ buildHeaderCenter: function() {\r
+ var contents = [];\r
+ var texts = [];\r
+ if (this.calendar.options.weekHeaderFormat) {\r
+ texts = [this.formatHeaderDate(this.week.first()), '-', this.formatHeaderDate(this.week.last())];\r
+ }(this.week[0], this.week.last()) || [];\r
+\r
+ var node = Builder.node('SPAN', [texts[0] || this.week[0].toDateString()]);\r
+ this.calendar.classNames.addClassNames(node, 'ym');\r
+ contents.push(node);\r
+\r
+ node = Builder.node('SPAN', [texts[1] || '-']);\r
+ this.calendar.classNames.addClassNames(node, 'ym');\r
+ contents.push(node);\r
+\r
+ node = Builder.node('SPAN', [texts.last() || this.week.last().toDateString()]);\r
+ this.calendar.classNames.addClassNames(node, 'ym');\r
+ contents.push(node);\r
+\r
+ var container = Builder.node('TD', contents);\r
+ this.calendar.classNames.addClassNames(container, 'years');\r
+\r
+ return container;\r
+ },\r
+\r
+ formatHeaderDate: function(date) {\r
+ if (this.calendar.options.weekHeaderFormat) {\r
+ return new Template(this.calendar.options.weekHeaderFormat).\r
+ evaluate({year: date.getFullYear(), month: date.getMonth() + 1, day: date.getDate()});\r
+ }\r
+ return '';\r
+ },\r
+\r
+ buildHeaderRight: function() {\r
+ var container = Builder.node('TD', {align: 'right'});\r
+ this.calendar.classNames.addClassNames(container, 'nextYears');\r
+\r
+ var id = this.calendar.element.id.appendSuffix(CalendarWeek.id.next);\r
+ var node = Builder.node('DIV', {id: id});\r
+ this.calendar.classNames.addClassNames(node, 'nextWeekMark');\r
+ Event.observe(node, "click", this.calendar.changeCalendar.bindAsEventListener(this.calendar));\r
+ container.appendChild(node);\r
+\r
+ return container;\r
+ },\r
+\r
+ buildCalendar: function() {\r
+ var table = Builder.node('TABLE', {id: CalendarWeek.id.columnContainer});\r
+ var tbody = Builder.node('TBODY');\r
+\r
+ this.calendar.classNames.addClassNames(table, 'weekTable');\r
+ table.appendChild(tbody);\r
+ var tr = Builder.node('TR');\r
+ tbody.appendChild(tr);\r
+\r
+ if (this.calendar.options.displayTimeLine) {\r
+ tr.appendChild(this.buildTimeLine());\r
+ }\r
+ tr.appendChild(this.buildCalendarContainer());\r
+\r
+ return table;\r
+ },\r
+\r
+ buildTimeLine: function() {\r
+ var time = new Date();\r
+ var hour = 0, hoursOfDay = 24;\r
+ time.setHours(hour);\r
+ time.setMinutes(0);\r
+ var nodes = [];\r
+\r
+ var node = Builder.node('DIV');\r
+ this.calendar.classNames.addClassNames(node, 'timeLineTimeTop');\r
+ nodes.push(node);\r
+ while (hour < hoursOfDay) {\r
+ if (this.includeDisplayTime(hour)) {\r
+ node = Builder.node('DIV', [this.formatTime(time)]);\r
+ this.calendar.classNames.addClassNames(node, 'timeLineTime');\r
+ nodes.push(node);\r
+ }\r
+ hour++;\r
+ time.setHours(hour);\r
+ }\r
+\r
+ var td = Builder.node('TD', nodes);\r
+ this.calendar.classNames.addClassNames(td, 'timeLine');\r
+ return td;\r
+ },\r
+ \r
+ buildCalendarContainer: function() {\r
+ var table = Builder.node('TABLE');\r
+ var tbody = Builder.node('TBODY');\r
+ table.appendChild(tbody);\r
+ this.calendar.classNames.addClassNames(table, 'weekMainTable');\r
+\r
+ tbody.appendChild(this.buildCalendarHeader());\r
+ tbody.appendChild(this.buildCalendarMain());\r
+ \r
+ return Builder.node('TD', [table]);\r
+ },\r
+\r
+ buildCalendarHeader: function() {\r
+ var indexes = this.calendar.options.displayIndexes;\r
+ var ths = [];\r
+ var self = this;\r
+ var today = new Date().days();\r
+ var width = 100 / indexes.length + '%';\r
+ var clickDateText = this.calendar.options.clickDateText;\r
+ var subHeaderTempl = (this.calendar.options.weekSubHeaderFormat) ? new Template(this.calendar.options.weekSubHeaderFormat) : null;\r
+\r
+ this.week.each(function(w, index) {\r
+ var text = null;\r
+ if (subHeaderTempl) {\r
+ text = subHeaderTempl.evaluate({month: w.getMonth() + 1, day: w.getDate(), wday: self.calendar.options.dayOfWeek[w.getDay()]});\r
+ } else {\r
+ text = w.toDateString().split(' ');\r
+ text.pop();\r
+ text = text.join(' ');\r
+ }\r
+ var link = Builder.node('A', {href: '#'}, [text]);\r
+ if (w.days() == today) self.calendar.addHighlightClass(link);\r
+ var node = Builder.node('DIV', [link]);\r
+ self.calendar.classNames.addClassNames(node, 'headerColumn');\r
+\r
+ if (clickDateText) {\r
+ Event.observe(node, 'mousedown', clickDateText.bindAsEventListener(self, w));\r
+ } else {\r
+ Event.observe(node, 'mousedown', self.clickDateText.bindAsEventListener(self, w));\r
+ }\r
+\r
+ var id = self.calendar.element.id.appendSuffix(CalendarWeek.id.column);\r
+ var th = Builder.node('TH', {id: id.appendSuffix(index)}, [node]);\r
+ th.width = width;\r
+ ths.push(th);\r
+ });\r
+\r
+ var table = Builder.node('TABLE');\r
+ var tbody = Builder.node('TBODY');\r
+ table.appendChild(tbody);\r
+ tbody.appendChild(Builder.node('TR', ths));\r
+ this.calendar.classNames.addClassNames(table, 'weekMainTable');\r
+ return Builder.node('TR', [Builder.node('TD', [table])]);\r
+ },\r
+\r
+ buildCalendarMain: function() {\r
+ var indexes = this.calendar.options.displayIndexes;\r
+ var self = this;\r
+ var tds = [];\r
+ var width = 100.0 / indexes.length + '%';\r
+\r
+ this.week.each(function(w, index) {\r
+ var schedules = self.calendar.options.schedules[w.toDateString()];\r
+ var nodes = [];\r
+ var i = 0, j = 0;\r
+\r
+ while (i < 24) {\r
+ if (self.includeDisplayTime(i)) {\r
+ var node = Builder.node('DIV', {id: self.getDateId(w, i)});\r
+ var hour = i / 1;\r
+ var min = i % 1 * 60;\r
+ node.date = new Date(w.getFullYear(), w.getMonth(), w.getDate(), hour, min, 0);\r
+\r
+ if (nodes.length == 0) {\r
+ self.calendar.classNames.addClassNames(node, 'columnTopDate');\r
+ } else if (i % 1 == 0) {\r
+ self.calendar.classNames.addClassNames(node, 'columnDate');\r
+ } else {\r
+ self.calendar.classNames.addClassNames(node, 'columnDateOdd');\r
+ }\r
+ self.setColumnEvent(node);\r
+ nodes.push(node);\r
+ }\r
+ i += 0.5;\r
+ }\r
+\r
+ var td = Builder.node('TD', nodes);\r
+ td.width = width;\r
+ tds.push(td);\r
+ });\r
+\r
+ this.calendarTable = Builder.node('TABLE', {style: 'position: relative'});\r
+ var tbody = Builder.node('TBODY');\r
+ this.calendarTable.appendChild(tbody);\r
+ tbody.appendChild(Builder.node('TR', tds));\r
+ this.calendar.classNames.addClassNames(this.calendarTable, 'weekMainTable');\r
+ var container = this.buildScheduleContainer();\r
+ container.appendChild(this.calendarTable);\r
+ this.setScheduleContainerEvent(container);\r
+ this.calendar.classNames.addClassNames(container, 'scheduleContainer');\r
+ return Builder.node('TR', [Builder.node('TD', [container])]);\r
+ },\r
+\r
+ setColumnEvent: function(node) {\r
+ // do nothing\r
+ },\r
+\r
+ beforeBuild: function() {\r
+ this.column = {};\r
+ var rule = CssUtil.getCssRuleBySelectorText('.' + Calendar.className.columnDate);\r
+ this.column.height = parseInt(rule.style['height'], 10) + 1;\r
+ },\r
+\r
+ /**********************************\r
+ ***** for make schedule item *****\r
+ **********************************/\r
+ buildSchedule: function(schedule) {\r
+ var id = 'scheduleItem_' + schedule.id;\r
+ var canEdit = (schedule.edit == undefined || schedule.edit);\r
+ var item = Builder.node('DIV', {id: id});\r
+ this.calendar.classNames.addClassNames(item, 'scheduleItemLarge');\r
+\r
+ if (canEdit) {\r
+ var deleteImg = Builder.node('DIV',\r
+ {\r
+ id: 'scheduleDeleteImg_' + schedule.id,\r
+ className: this.calendar.classNames.joinClassNames('deleteImg')\r
+ });\r
+ Element.hide(deleteImg);\r
+ item.appendChild(deleteImg);\r
+ \r
+ // set event on a image.\r
+ Event.observe(deleteImg, 'click', this.clickDeleteImage.bind(this, schedule));\r
+ Event.observe(item, 'mouseover', this.showDeleteImage.bind(this, deleteImg));\r
+ Event.observe(item, 'mouseout', this.hideDeleteImage.bind(this, deleteImg));\r
+ }\r
+\r
+ // set dblclick event on a schedule item.\r
+ if (this.calendar.options.dblclickSchedule) {\r
+ Event.observe(\r
+ item, 'dblclick', this.calendar.options.dblclickSchedule.bind(this, schedule));\r
+ }\r
+\r
+ // drag handler\r
+ var handler = null;\r
+ if (canEdit) {\r
+ handler = Builder.node('DIV', {className: this.calendar.classNames.joinClassNames('scheduleHandler')});\r
+ item.appendChild(handler);\r
+ }\r
+\r
+ var icon = null;\r
+ if (schedule.icon) {\r
+ icon = Builder.node('IMG', {src: schedule.icon, alt: 'icon', style: 'float: left;'});\r
+ item.appendChild(icon);\r
+ }\r
+\r
+ // private mark\r
+ if (!schedule.publicity) {\r
+ icon = Builder.node('DIV', {id: 'private_img_' + schedule.id});\r
+ this.calendar.classNames.addClassNames(icon, 'privateImg');\r
+ item.appendChild(icon);\r
+ }\r
+\r
+ var text = this.getTimeText(schedule.start, schedule.finish);\r
+ text = Builder.node('DIV', {id: id + '_text'}, [text]);\r
+ this.calendar.classNames.addClassNames(text, 'scheduleTimeArea');\r
+\r
+ item.appendChild(text);\r
+ var description = schedule.description.unescapeHTML();\r
+ item.appendChild(Builder.node('DIV', {id: id + '_description'}, [description]));\r
+ item.title = description;\r
+ item.schedule = schedule;\r
+\r
+ return [item, handler];\r
+ },\r
+\r
+ adjustScheduleStyle: function(item, index, holder) {\r
+ var schedule = item.schedule;\r
+ var time = this.convertHours(schedule);\r
+ var start = time[0];\r
+ var finish = time[1];\r
+ var same = [];\r
+ var self = this;\r
+\r
+ holder.each(function(h) {\r
+ var hTime = self.convertHours(h.schedule);\r
+ var hStart = hTime[0];\r
+ var hFinish = hTime[1];\r
+\r
+ if (\r
+ ((hStart <= start) && (hFinish > start)) || ((hStart < finish) && (hFinish >= finish)) ||\r
+ ((start <= hStart) && (finish > hStart)) || ((start < hFinish) && (finish >= hFinish))\r
+ ) {\r
+ same.push(h);\r
+ }\r
+ });\r
+\r
+ var adjustSize = index * this.getAdjustSize();\r
+ var left = this.column.width * index + adjustSize;\r
+ if (same.length == 0) {\r
+ Element.setStyle(item, {left: left + 'px'});\r
+ } else {\r
+ same.push(item);\r
+ var width = parseInt(Element.getStyle(item, 'width'), 10) / (same.length) - 2;\r
+ same.each(function(s, i) {\r
+ var adjustLeft = left + width * i + (2 * i);\r
+// if (i != 0) adjustLeft += 2;\r
+ Element.setStyle(s, {\r
+ width: width + 'px',\r
+ left: adjustLeft + 'px'\r
+ });\r
+ });\r
+ }\r
+ return left;\r
+ },\r
+\r
+ setScheduleBaseStyle: function(item) {\r
+ var schedule = item.schedule;\r
+ if (!this.calendar.isSameDate(schedule.start, schedule.finish)) {\r
+ schedule.finish.hour = 24;\r
+ schedule.finish.min = 0;\r
+ }\r
+\r
+ var time = this.convertHours(schedule);\r
+ var startTime = time.first();\r
+ var finishTime = time.last();\r
+ var oneHour = this.column.height * 2;\r
+ var diff = this.calendar.getTimeDiff(schedule.start, schedule.finish);\r
+ var rate = (diff.hour + (diff.min / 60)) || 1;\r
+\r
+ var over = 0;\r
+ var top = 0;\r
+ var height = 0;\r
+\r
+ var includeStart = this.includeDisplayTime(startTime);\r
+ var includeFinish = this.includeDisplayTime(finishTime);\r
+ if (!includeStart && !includeFinish) {\r
+ if ((this.startTime <= startTime && this.startTime <= finishTime) ||\r
+ (startTime < this.finishTime && finishTime < this.finishTime)) {\r
+ top = height = 0;\r
+ Element.hide(item);\r
+ } else {\r
+ top = 0;\r
+ height = oneHour * (this.finishTime - this.startTime) - 3;\r
+ }\r
+ } else {\r
+ if (includeStart) {\r
+ top = oneHour * (startTime - this.startTime);\r
+ height = oneHour * rate - 3;\r
+ } else {\r
+ top = 0;\r
+ over = this.startTime - startTime;\r
+ height = oneHour * (rate - over);\r
+ }\r
+\r
+ if (includeFinish) {\r
+ } else {\r
+ over = finishTime - this.finishTime;\r
+ height -= oneHour * over;\r
+ }\r
+ }\r
+\r
+ try {\r
+ Element.setStyle(item, {\r
+ top: top + 'px',\r
+ width: this.column.width + 'px',\r
+ height: height + 'px'\r
+ });\r
+ } catch (e) {}\r
+ },\r
+\r
+ afterBuild: function() {\r
+ this.setContainerInfo();\r
+ this.setColumnWidth();\r
+ this.setCover();\r
+ var self = this;\r
+ var container = $(this.getScheduleContainerId());\r
+ var distance = this.getDragDistance();\r
+ this.scheduleNodes = [];\r
+ var holders = this.week.map(function() {return []});\r
+ var weekSize = this.week.legth - 1;\r
+\r
+ this.calendar.options.schedules.each(function(schedule) {\r
+ var items = [];\r
+ var sub, subItem = null;\r
+ self.week.each(function(date, index) {\r
+ if (self.calendar.betweenDate(schedule, date)) {\r
+ if (self.isSameStartDate(schedule, date) && self.isSameFinishDate(schedule, date)) {\r
+ items.push(self.setSchedule(schedule, index, holders, container, distance));\r
+ } else {\r
+ sub = self.copyOneDaySchedule(schedule, date);\r
+ subItem = self.setSchedule(sub, index, holders, container, distance);\r
+ subItem.originalSchedule = schedule;\r
+ items.push(subItem);\r
+ }\r
+ } else if (sub) {\r
+ throw $break;\r
+ }\r
+ });\r
+\r
+ items.each(function(item) {\r
+ Event.observe(item, 'mouseover', self.mouseOverSubSchedule.bind(this, items));\r
+ Event.observe(item, 'mouseout', self.mouseOutSubSchedule.bind(this, items));\r
+ });\r
+ });\r
+ },\r
+\r
+ copyOneDaySchedule: function(schedule, date) {\r
+ var sub = null;\r
+ if (this.isSameStartDate(schedule, date)) {\r
+ sub = this.copySchedule(schedule, date);\r
+ sub.finish.hour = 24;\r
+ sub.finish.min = 0;\r
+ } else if (this.isSameFinishDate(schedule, date)) {\r
+ sub = this.copySchedule(schedule, date);\r
+ sub.start.hour = 0;\r
+ sub.start.min = 0;\r
+ } else {\r
+ sub = this.copySchedule(schedule, date);\r
+ sub.start.hour = 0;\r
+ sub.start.min = 0;\r
+ sub.finish.hour = 24;\r
+ sub.finish.min = 0;\r
+ }\r
+ return sub;\r
+ },\r
+\r
+ copySchedule: function(schedule, date) {\r
+ sub = Object.extend({}, schedule);\r
+ sub.start = {\r
+ year: date.getFullYear(),\r
+ month: date.getMonth(),\r
+ day: date.getDate(),\r
+ hour: schedule.start.hour,\r
+ min: schedule.start.min\r
+ }\r
+ sub.finish = {\r
+ year: date.getFullYear(),\r
+ month: date.getMonth(),\r
+ day: date.getDate(),\r
+ hour: schedule.finish.hour,\r
+ min: schedule.finish.min\r
+ }\r
+ return sub;\r
+ },\r
+\r
+ setSchedule: function(schedule, index, holders, container, distance) {\r
+ // create a schedule node.\r
+ var result = this.buildSchedule(schedule);\r
+ var item = result.first();\r
+ container.appendChild(item);\r
+\r
+ // set style(position and size) of a schedule item.\r
+ this.setScheduleBaseStyle(item);\r
+ var left = this.adjustScheduleStyle(item, index, holders[index]);\r
+ var adjustSize = index * this.getAdjustSize();\r
+ var snapLeft = this.column.width + adjustSize + 'px';\r
+\r
+ if (schedule.edit == undefined || schedule.edit) {\r
+ this.setDraggable(item, result.last(), container, distance);\r
+ this.setResize(item);\r
+ }\r
+\r
+ holders[index].push(item);\r
+ this.scheduleNodes.push(item);\r
+ return item;\r
+ },\r
+\r
+ getDragDistance: function() {\r
+ var adjustSize = this.getAdjustSize();\r
+ return [this.column.width + adjustSize, this.column.height / 2];\r
+ },\r
+\r
+ // set draggalbe event\r
+ setDraggable: function(item, handle, container, distance) {\r
+ var self = this;\r
+ new Draggable(item, \r
+ {\r
+ handle: handle,\r
+ scroll: window,\r
+ starteffect: Prototype.emptyFunction,\r
+ endeffect: Prototype.emptyFunction,\r
+ snap: function(x, y) {\r
+ var eDimensions = Element.getDimensions(item);\r
+ var pDimensions = Element.getDimensions(container);\r
+ var xy = [x, y].map(function(v, i) { return Math.floor(v/distance[i]) * distance[i] });\r
+ xy = [\r
+ self._constrain(xy[0], 0, pDimensions.width - eDimensions.width),\r
+ self._constrain(xy[1], 0, pDimensions.height - eDimensions.height)\r
+ ];\r
+ return xy;\r
+ },\r
+ onEnd: function(draggable, event) {\r
+ self.changeSchedule(draggable, event);\r
+ },\r
+ change: function(draggable) {\r
+ self.changeTimeDisplay(draggable.element);\r
+ }\r
+ }\r
+ );\r
+ },\r
+\r
+ // set resize event\r
+ setResize: function(item) {\r
+ new CalendarResizeableEx(item, {\r
+ left: 0,\r
+ right: 0,\r
+ distance: this.column.height / 2,\r
+ restriction: true,\r
+ resize: function(element) {\r
+ this.updateTirm(element);\r
+ }.bind(this),\r
+ change: function(element) {\r
+ this.changeTimeDisplay(element);\r
+ }.bind(this)\r
+ });\r
+ },\r
+\r
+ /********************************** public method **********************************/\r
+ getDate: function(element) {\r
+ return element.date;\r
+ },\r
+\r
+ abstractSelect: function(event, method) {\r
+ var element = this.findClickedElement(event);\r
+ if (element) {\r
+ if (Element.hasClassName(element, Calendar.className.columnDate) ||\r
+ Element.hasClassName(element, Calendar.className.columnDateOdd) ||\r
+ Element.hasClassName(element, Calendar.className.columnTopDate)) {\r
+\r
+ var date = this.getDate(element);\r
+ method(date, element);\r
+ }\r
+ }\r
+ }, \r
+\r
+ getSelectedTerm: function() {\r
+ var self = this;\r
+ var elements = this.calendar.getSelected();\r
+ if (elements && elements.length > 0) {\r
+ var last = elements.last();\r
+ if (last) {\r
+ last = last.date;\r
+ } else {\r
+ last = elements.first().date;\r
+ }\r
+ last = new Date(last.getFullYear(), last.getMonth(),\r
+ last.getDate(), last.getHours(), last.getMinutes(), 0);\r
+ last.setMinutes(last.getMinutes() + 30);\r
+ \r
+ return [elements.first().date, last];\r
+ }\r
+ },\r
+\r
+ /*** Week ***/\r
+ /********************************** private method **********************************/\r
+ setWidth: function(node) {\r
+ Element.setStyle(node, {width: this.column.width + 'px'});\r
+ },\r
+\r
+ inspectArgument: function(object, time) {\r
+ if (object.date) return object;\r
+\r
+ var self = this;\r
+ var dates = this.calendar.getSelected();\r
+ var result = [];\r
+ this.calendar.recurrence(object, function(o) {\r
+ var param = {};\r
+ if (!o.date) {\r
+ param = {date: self.getDate(dates[0])};\r
+ if (!o.start)\r
+ param.start = dates[0].time;\r
+ if (!o.finish)\r
+ param.finish = dates[dates.length - 1].time;\r
+ }\r
+ Object.extend(param, o);\r
+ result.push(param);\r
+ });\r
+\r
+ return result;\r
+ },\r
+\r
+ inspectDateArgument: function(date) {\r
+ if (date) return date;\r
+\r
+ var calendar = this;\r
+ var dates = this.getSelected();\r
+ if (dates.length == 0) return null;\r
+\r
+ return dates.collect(function(d) {\r
+ return calendar.getDate(d);\r
+ });\r
+ },\r
+\r
+ addColumnClass: function(element) {\r
+ if (document.all)\r
+ this.calendar.classNames.addClassNames(element, 'columnWin');\r
+ else\r
+ this.calendar.classNames.addClassNames(element, 'column');\r
+ },\r
+\r
+ getHeaderId: function() {\r
+ return this.calendar.element.id.appendSuffix(CalendarWeek.id.columnHeader);\r
+ },\r
+\r
+ getColumnId: function(i) {\r
+ return this.calendar.element.id.appendSuffix(CalendarWeek.id.column + '_' + i);\r
+ },\r
+\r
+ changeSchedule: function(draggable, event) {\r
+ var element = draggable.element;\r
+ var schedule = element.schedule;\r
+ var time = this.getTimeByElement(element);\r
+ this.calendar.cacheSchedule(schedule);\r
+\r
+ var container = $(this.getScheduleContainerId());\r
+ var dimensions = Element.getDimensions(container);\r
+ var offset = Position.cumulativeOffset(container);\r
+ var scroll = Position.realOffset(container);\r
+ var scrollLeft = scroll[0] - (document.documentElement.scrollLeft || document.body.scrollLeft || 0);\r
+ var scrollTop = scroll[1] - (document.documentElement.scrollTop || document.body.scrollTop || 0);\r
+\r
+ var x = Event.pointerX(event) + scrollLeft;\r
+ var y = Event.pointerY(event) + scrollTop;\r
+\r
+ if (\r
+ offset[0] > x ||\r
+ (offset[0] + dimensions.width) < x ||\r
+ offset[1] > y ||\r
+ (offset[1] + dimensions.height) < y\r
+ ) {this.calendar.refreshSchedule(); return};\r
+\r
+ var left = parseInt(Element.getStyle(element, 'left'));\r
+ var weekIndex = Math.round(left / this.column.width);\r
+ var date = this.week[weekIndex];\r
+\r
+ if (\r
+ schedule.start.year == date.getFullYear() &&\r
+ schedule.start.month == date.getMonth() &&\r
+ schedule.start.day == date.getDate() &&\r
+ schedule.start.hour == time[0].hour &&\r
+ schedule.start.min == time[0].min &&\r
+ schedule.finish.year == date.getFullYear() &&\r
+ schedule.finish.month == date.getMonth() &&\r
+ schedule.finish.day == date.getDate() &&\r
+ schedule.finish.hour == time[1].hour &&\r
+ schedule.finish.min == time[1].min\r
+ ) {this.calendar.refreshSchedule(); return};\r
+\r
+ if (element.originalSchedule) schedule = element.originalSchedule; \r
+ var newStart = {\r
+ year: date.getFullYear(),\r
+ month: date.getMonth(),\r
+ day: date.getDate(),\r
+ hour: time[0].hour,\r
+ min: time[0].min\r
+ }\r
+ var diff = DateUtil.toDate(newStart).getTime() - DateUtil.toDate(schedule.start).getTime();\r
+ schedule.start = newStart;\r
+ schedule.finish = new Date(DateUtil.toDate(schedule.finish).getTime() + diff).toHash();\r
+\r
+ this.calendar.refreshSchedule();\r
+ this.calendar.options.changeSchedule(schedule);\r
+ },\r
+\r
+ updateTirm: function(element) {\r
+ var schedule = element.schedule;\r
+ var time = this.getTimeByElement(element);\r
+ this.calendar.cacheSchedule(schedule);\r
+\r
+ var left = parseInt(Element.getStyle(element, 'left'));\r
+ var weekIndex = Math.round(left / this.column.width);\r
+ var date = this.week[weekIndex];\r
+\r
+ var isChange = this.isChengeSchedule(element, time);\r
+ if (element.originalSchedule) schedule = element.originalSchedule;\r
+\r
+ if (isChange.start) {\r
+ schedule.start.year = date.getFullYear();\r
+ schedule.start.month = date.getMonth();\r
+ schedule.start.day = date.getDate();\r
+ schedule.start.hour = time[0].hour;\r
+ schedule.start.min = time[0].min;\r
+ } else if (isChange.finish) {\r
+ schedule.finish.year = date.getFullYear();\r
+ schedule.finish.month = date.getMonth();\r
+ schedule.finish.day = date.getDate();\r
+ schedule.finish.hour = time[1].hour;\r
+ schedule.finish.min = time[1].min;\r
+ } else {\r
+ return;\r
+ }\r
+\r
+ this.calendar.refreshSchedule();\r
+ this.calendar.options.updateTirm(schedule);\r
+ },\r
+\r
+ changeTimeDisplay: function(element) {\r
+ var schedule = element.schedule;\r
+ var time = this.getTimeByElement(element);\r
+\r
+ var textNode = Element.getElementsByClassName(element, Calendar.className.scheduleTimeArea)[0];\r
+ var text = this.getTimeText(time[0], time[1]);\r
+ textNode.innerHTML = text;\r
+ },\r
+ \r
+ findClickedElement: function(event) {\r
+ var container = $(this.getScheduleContainerId());\r
+ var position = Position.cumulativeOffset(container);\r
+ var scrollTop = Position.realOffset(container).last();\r
+ scrollTop -= document.documentElement.scrollTop || document.body.scrollTop;\r
+ var x = Event.pointerX(event) - position[0];\r
+ var y = Event.pointerY(event) - position[1] + scrollTop;\r
+\r
+ var cellIndex = Math.floor(y / this.column.height);\r
+ var rowIndex = Math.floor(x / this.column.width);\r
+ return $(this.calendarTable.rows[0].cells[rowIndex]).down(cellIndex);\r
+ },\r
+\r
+ multipleSelection: function(event) {\r
+ if (!this.calendar.selectedBase || !this.calendar.mouseDown) return;\r
+ var self = this;\r
+ var calendar = this.calendar;\r
+ var selected = this.calendar.selectedBase;\r
+\r
+ this.abstractSelect(event, function(date, element) {\r
+ var selectedElement = $(selected.id);\r
+ if (selectedElement.date.getDate() != element.date.getDate()) return;\r
+\r
+ var nodes = $A(selectedElement.parentNode.childNodes);\r
+ var ids = [parseInt(selected.id.getSuffix()), parseInt(element.id.getSuffix())];\r
+ ids.sort(function(a, b) {return a - b;});\r
+\r
+ nodes.each(function(n) {\r
+ if (!n.id) throw $continue;\r
+ var id = parseInt(n.id.getSuffix());\r
+ if ((id < ids[0]) || (ids[1] < id)) {\r
+ calendar.removeSelectedClass(n);\r
+ } else if (!Element.hasClassName(n, Calendar.className.selected)) {\r
+ calendar.addSelectedClass(n);\r
+ }\r
+ });\r
+ });\r
+ },\r
+\r
+ getTimeByElement: function(element) {\r
+ var schedule = element.schedule;\r
+ var top = parseInt(Element.getStyle(element, 'top'), 10);\r
+ var height = parseInt(Element.getStyle(element, 'height'), 10);\r
+ var oneHour = this.column.height * 2;\r
+ var distance = 0.25;\r
+\r
+ var startTime = top / oneHour + this.startTime;\r
+ startTime = Math.round(startTime / distance) * distance;\r
+\r
+ var finishTime = height / oneHour + startTime;\r
+ finishTime = Math.round(finishTime / distance) * distance;\r
+\r
+ var start = {};\r
+ start.hour = Math.floor(startTime);\r
+ start.min = (startTime - start.hour) * 60;\r
+\r
+ var finish = {};\r
+ finish.hour = Math.floor(finishTime);\r
+ finish.min = (finishTime - finish.hour) * 60;\r
+\r
+ if (finish.min == 60) {\r
+ finish.hour += 1;\r
+ finish.min = 0;\r
+ }\r
+\r
+ return [start, finish];\r
+ },\r
+\r
+ getDateId: function(date, i) {\r
+ var id = this.calendar.element.id.appendSuffix(date.getDate());\r
+ return id.appendSuffix(i * 10);\r
+ },\r
+\r
+ dateIdToTime: function(id) {\r
+ id = id.getSuffix() / 10;\r
+ var hour = Math.floor(id);\r
+ return {hour: hour, min: (id - hour) * 60};\r
+ },\r
+\r
+ formatTime: function(date) {\r
+ var time = date.toTimeString();\r
+ time = time.split(' ');\r
+ time = time[0].split(':');\r
+ time.pop();\r
+ return time.join(':');\r
+ },\r
+\r
+ /**\r
+ * hours are 0, 0.5, 1, ..., 23.5, 24\r
+ */\r
+ includeDisplayTime: function(hours) {\r
+ return (this.startTime <= hours) && (hours < this.finishTime);\r
+ },\r
+\r
+ /**\r
+ * exsample\r
+ *\r
+ * {hour: 1, min: 30} => 1.5\r
+ */\r
+ convertHours: function(schedule) {\r
+ return [\r
+ schedule.start.hour + schedule.start.min / 60,\r
+ schedule.finish.hour + schedule.finish.min / 60\r
+ ];\r
+ },\r
+\r
+ setDisplayTime: function() {\r
+ this.startTime = this.calendar.options.displayTime.first().hour;\r
+ var finishTime = this.calendar.options.displayTime.last();\r
+ this.finishTime = Math.ceil(finishTime.hour + finishTime.min / 60);\r
+ },\r
+\r
+ getTimeText: function(start, finish) {\r
+ var calendar = this.calendar;\r
+ return calendar.formatTime(start) + ' - ' + calendar.formatTime(finish);\r
+ },\r
+\r
+ isChengeSchedule: function(scheduleElement, newTime) {\r
+ var schedule = scheduleElement.schedule;\r
+ var changeStart = ((schedule.start.hour != newTime[0].hour) || (schedule.start.min != newTime[0].min));\r
+ var changeFinish = ((schedule.finish.hour != newTime[1].hour) || (schedule.finish.min != newTime[1].min));\r
+\r
+ if (scheduleElement.originalSchedule) {\r
+ if (changeStart && changeFinish) {\r
+ var currentDateStart = DateUtil.toDate(schedule.start).getTime();\r
+ var OriginalDateStart = DateUtil.toDate(scheduleElement.originalSchedule.start).getTime();\r
+ if (currentDateStart == OriginalDateStart) {\r
+ changeFinish = false;\r
+ } else {\r
+ changeStart = false;\r
+ }\r
+ }\r
+ }\r
+ return {start: changeStart, finish: changeFinish};\r
+ }\r
+});\r
+\r
+\r
+/**\r
+ * CalendarDay Class\r
+ */\r
+var CalendarDay = Class.create();\r
+CalendarDay.id = {\r
+ header: 'dayHeader' \r
+}\r
+Object.extend(CalendarDay.prototype, CalendarWeek.prototype);\r
+Object.extend(CalendarDay.prototype, {\r
+\r
+ initialize: function(calendar) {\r
+ var day = calendar.date.getDay();\r
+ this.calendar = calendar;\r
+ this.setDisplayTime();\r
+\r
+ this.calendar.options.displayIndexesOld = this.calendar.options.displayIndexes;\r
+ this.calendar.options.displayIndexes = [day];\r
+ this.calendar.options.weekIndexOld = this.calendar.options.weekIndex;\r
+ this.calendar.options.weekIndex = day;\r
+ this.week = this.getWeek();\r
+ },\r
+\r
+ destroy: function() {\r
+ this.calendar.options.displayIndexes = this.calendar.options.displayIndexesOld;\r
+ this.calendar.options.weekIndex = this.calendar.options.weekIndexOld;\r
+ delete this.calendar.options.displayIndexesOld;\r
+ delete this.calendar.options.weekIndexOld;\r
+ },\r
+\r
+ /*** Day ***/\r
+ /********************************** build functions **********************************/\r
+ buildHeaderCenter: function() {\r
+ var headerText = this.calendar.date.toDateString();\r
+ if (this.calendar.options.dayHeaderFormat) {\r
+ var date = this.calendar.date;\r
+ headerText = new Template(this.calendar.options.dayHeaderFormat).evaluate(\r
+ {year: date.getFullYear(), month: date.getMonth() + 1, day: date.getDate()});\r
+ }\r
+ var container = Builder.node('TD');\r
+ this.calendar.classNames.addClassNames(container, 'years');\r
+\r
+ var id = this.calendar.element.id.appendSuffix(CalendarDay.id.header);\r
+ var node = Builder.node('SPAN', {id: id}, [headerText]);\r
+ this.calendar.classNames.addClassNames(node, 'ym');\r
+ container.appendChild(node);\r
+\r
+ return container;\r
+ },\r
+\r
+ /*** Day ***/\r
+ /********************************** private method **********************************/\r
+ changeCalendar: function(event) {\r
+ var element = Event.element(event);\r
+ var oldDate = new Date(this.calendar.date.toDateString());\r
+\r
+ if (Element.hasClassName(element, Calendar.className.preWeekMark)) {\r
+ this.calendar.date.setDate(this.calendar.date.getDate() - 1);\r
+ } else if (Element.hasClassName(element, Calendar.className.nextWeekMark)) {\r
+ this.calendar.date.setDate(this.calendar.date.getDate() + 1);\r
+ }\r
+\r
+ this.calendar.options.changeCalendar(this.calendar.date, oldDate);\r
+ this.calendar.refresh();\r
+ }\r
+});\r
+\r
+\r
+//\r
+// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+var CalendarResizeableEx = Class.create();\r
+Object.extend(CalendarResizeableEx.prototype, Resizeable.prototype);\r
+Object.extend(CalendarResizeableEx.prototype, {\r
+ initialize: function(element) {\r
+ var options = Object.extend({\r
+ top: 6,\r
+ bottom: 6,\r
+ left: 6,\r
+ right: 6,\r
+ minHeight: 0,\r
+ minWidth: 0,\r
+ zindex: 1000,\r
+ resize: null,\r
+ distance: 1, // add by spinelz\r
+ change: Prototype.emptyFunction,\r
+ restriction: true\r
+ }, arguments[1] || {});\r
+\r
+ this.element = $(element);\r
+ this.handle = this.element;\r
+\r
+ Element.makePositioned(this.element); // fix IE \r
+\r
+ this.options = options;\r
+\r
+ this.active = false;\r
+ this.resizing = false; \r
+ this.currentDirection = '';\r
+\r
+ this.eventMouseDown = this.startResize.bindAsEventListener(this);\r
+ this.eventMouseUp = this.endResize.bindAsEventListener(this);\r
+ this.eventMouseMove = this.update.bindAsEventListener(this);\r
+ this.eventCursorCheck = this.cursor.bindAsEventListener(this);\r
+ this.eventKeypress = this.keyPress.bindAsEventListener(this);\r
+ \r
+ this.registerEvents();\r
+ },\r
+\r
+ startResize: function(event) {\r
+ Event.stop(event);\r
+ if(Event.isLeftClick(event)) {\r
+ \r
+ // abort on form elements, fixes a Firefox issue\r
+ var src = Event.element(event);\r
+ if(src.tagName && (\r
+ src.tagName=='INPUT' ||\r
+ src.tagName=='SELECT' ||\r
+ src.tagName=='BUTTON' ||\r
+ src.tagName=='TEXTAREA')) return;\r
+\r
+ var dir = this.directions(event);\r
+ if (dir.length > 0) { \r
+ this.active = true;\r
+// var offsets = Position.cumulativeOffset(this.element);\r
+ this.startTop = parseInt(Element.getStyle(this.element, 'top'), 10);\r
+ this.startLeft = parseInt(Element.getStyle(this.element, 'left'), 10);\r
+ this.startWidth = parseInt(Element.getStyle(this.element, 'width'), 10);\r
+ this.startHeight = parseInt(Element.getStyle(this.element, 'height'), 10);\r
+ this.startX = event.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;\r
+ this.startY = event.clientY + document.body.scrollTop + document.documentElement.scrollTop;\r
+ \r
+ this.currentDirection = dir;\r
+\r
+ if (this.options.restriction) {\r
+ var container = this.element.parentNode;\r
+ this.restDimensions = Element.getDimensions(container);\r
+ this.restOffset = Position.cumulativeOffset(container);\r
+ }\r
+ }\r
+ }\r
+ },\r
+\r
+ draw: function(event) {\r
+ Event.stop(event);\r
+ var pointer = [Event.pointerX(event), Event.pointerY(event)];\r
+ var style = this.element.style;\r
+\r
+ if (this.currentDirection.indexOf('n') != -1) {\r
+ if (this.restOffset[1] >= pointer[1]) return;\r
+ var pointerMoved = this.startY - pointer[1];\r
+// var margin = Element.getStyle(this.element, 'margin-top') || "0";\r
+ var newHeight = this.map(this.startHeight + pointerMoved);\r
+ if (newHeight > this.options.minHeight) {\r
+ style.height = newHeight + "px";\r
+ style.top = this.map(this.startTop - pointerMoved) + "px";\r
+ }\r
+ }\r
+ if (this.currentDirection.indexOf('w') != -1) {\r
+ var pointerMoved = this.map(this.startX - pointer[0]);\r
+ var margin = Element.getStyle(this.element, 'margin-left') || "0";\r
+ var newWidth = this.startWidth + pointerMoved;\r
+ if (newWidth > this.options.minWidth) {\r
+ style.left = (this.startLeft - pointerMoved - parseInt(margin)) + "px";\r
+ style.width = newWidth + "px";\r
+ }\r
+ }\r
+ if (this.currentDirection.indexOf('s') != -1) {\r
+ var bottom = this.restDimensions.height + this.restOffset[1];\r
+ var pointerMoved = pointer[1] - this.startY;\r
+ if (bottom <= pointer[1]) return;\r
+ var newHeight = this.map(this.startHeight + pointer[1] - this.startY);\r
+ if (newHeight > this.options.minHeight) {\r
+ style.height = newHeight + "px";\r
+// style.top = this.startTop + "px";\r
+ }\r
+ }\r
+ if (this.currentDirection.indexOf('e') != -1) {\r
+ var newWidth = this.map(this.startWidth + pointer[0] - this.startX);\r
+ if (newWidth > this.options.minWidth) {\r
+ style.width = newWidth + "px";\r
+ }\r
+ }\r
+ if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering\r
+ this.options.change(this.element);\r
+ },\r
+\r
+ directions: function(event) {\r
+ var pointer = [Event.pointerX(event), Event.pointerY(event)];\r
+ var offsets = Position.cumulativeOffset(this.element);\r
+ var bodyScrollTop = document.documentElement.scrollTop || document.body.scrollTop;\r
+ var scroll = Position.realOffset(this.element)[1] - bodyScrollTop;\r
+\r
+ var cursor = '';\r
+ if (this.between(pointer[1] - offsets[1] + scroll, 0, this.options.top)) cursor += 'n';\r
+ if (this.between((offsets[1] + this.element.offsetHeight) - pointer[1] - scroll, 0, this.options.bottom)) cursor += 's';\r
+ if (this.between(pointer[0] - offsets[0], 0, this.options.left)) cursor += 'w';\r
+ if (this.between((offsets[0] + this.element.offsetWidth) - pointer[0], 0, this.options.right)) cursor += 'e';\r
+\r
+ return cursor;\r
+ },\r
+\r
+ map: function(length) {\r
+ return Math.round(length / this.options.distance) * this.options.distance;\r
+ }\r
+});\r
-// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-var DatePicker = Class.create();
-DatePicker.className = {
- container: 'datepicker',
- header: 'datepicker_header',
- footer: 'datepicker_footer',
- preYears: 'datepicker_preYears',
- nextYears: 'datepicker_nextYears',
- years: 'datepicker_years',
- calendar: 'datepicker_calendar',
- date: 'datepicker_date',
- holiday: 'datepicker_holiday',
- ym: 'datepicker_ym',
- table: 'datepicker_table',
- tableTh: 'datepicker_tableTh',
- nextMonthMark: 'datepicker_nextMonthMark',
- nextYearMark: 'datepicker_nextYearMark',
- preMonthMark: 'datepicker_preMonthMark',
- preYearMark: 'datepicker_preYearMark',
- zIndex: null
-}
-DatePicker.prototype = {
-
- initialize: function(element, target, trigger) {
- this.element = $(element);
- Element.setStyle(this.element, {visibility: 'hidden'});
- this.target = $(target);
- this.date = new Date();
-
- this.options = Object.extend({
- month: this.date.getMonth() + 1,
- date: this.date.getDate(),
- year: this.date.getFullYear(),
- format: DateUtil.toLocaleDateString,
- cssPrefix: 'custom_',
- callBack: Prototype.emptyFunction,
- standTo: false,
- beforeShow: Prototype.emptyFunction,
- headerFormat: null,
- dayOfWeek: DateUtil.dayOfWeek
- }, arguments[3] || {});
-
- var customCss = CssUtil.appendPrefix(this.options.cssPrefix, DatePicker.className);
- this.classNames = new CssUtil([DatePicker.className, customCss]);
-
- this.format = this.options.format;
- this.callBack = this.options.callBack;
-
- this.date.setMonth(this.options.month - 1);
- this.date.setDate(this.options.date);
- this.date.setFullYear(this.options.year);
-
- this.calendar = this.build();
- this.element.appendChild(this.calendar);
- this.cover = new IECover(this.element);
-
- this.doclistener = this.hide.bindAsEventListener(this);
- Event.observe($(trigger), "click", this.show.bindAsEventListener(this));
- this.hide();
- Element.setStyle(this.element, {visibility: 'visible'});
- },
-
- build: function() {
- var node =
- Builder.node(
- 'DIV',
- {className: this.classNames.joinClassNames('container')},
- [
- this.buildHeader(),
- this.buildCalendar(),
- this.buildFooter()
- ]);
-
- return node;
- },
-
- buildHeader: function() {
- var headerNodes = Builder.node('TR');
- headerNodes.appendChild(this.buildHeaderLeft());
- headerNodes.appendChild(this.buildHeaderCenter());
- headerNodes.appendChild(this.buildHeaderRight());
-
- className = this.classNames.joinClassNames('header');
- var tbody = Builder.node('TBODY', [headerNodes]);
- return Builder.node('TABLE', {className: className}, [tbody]);
- },
-
- buildFooter: function() {
- var footer = Builder.node('DIV');
- this.classNames.addClassNames(footer, 'footer');
- return footer;
- },
-
- buildHeaderLeft: function() {
- var container = Builder.node('TD');
- this.classNames.addClassNames(container, 'preYears');
-
- var id = this.element.id.appendSuffix('preYear');
- var node = Builder.node('DIV', {id: id});
- this.classNames.addClassNames(node, 'preYearMark');
- Event.observe(node, "click", this.changeCalendar.bindAsEventListener(this));
- container.appendChild(node);
-
- id = this.element.id.appendSuffix('preMonth');
- node = Builder.node('DIV', {id: id});
- this.classNames.addClassNames(node, 'preMonthMark');
- Event.observe(node, "click", this.changeCalendar.bindAsEventListener(this));
- container.appendChild(node);
-
- return container;
- },
-
- buildHeaderCenter: function() {
- var contents = [];
- var yearMonth = this.getHeaderYearMonth();
-
- var id = this.element.id.appendSuffix('nextMonth');
- var node = Builder.node('SPAN', {id: id}, [yearMonth[0]]);
- this.classNames.addClassNames(node, 'ym');
- contents.push(node);
-
- id = this.element.id.appendSuffix('nextYear');
- node = Builder.node('SPAN', {id: id}, [yearMonth[1]]);
- this.classNames.addClassNames(node, 'ym');
- contents.push(node);
-
- var container = Builder.node('TD', contents);
- this.classNames.addClassNames(container, 'years');
-
- return container;
- },
-
- getHeaderYearMonth: function() {
- if (this.options.headerFormat) {
- var tmpl = new Template(this.options.headerFormat);
- return [tmpl.evaluate({year: this.date.getFullYear(), month: this.date.getMonth() + 1}), ' '];
- }
- return [DateUtil.months[this.date.getMonth()], this.date.getFullYear()];
- },
-
- buildHeaderRight: function() {
- var container = Builder.node('TD');
- this.classNames.addClassNames(container, 'nextYears');
-
- var id = this.element.id.appendSuffix('nextMonth');
- var node = Builder.node('DIV', {id: id});
- this.classNames.addClassNames(node, 'nextMonthMark');
- Event.observe(node, "click", this.changeCalendar.bindAsEventListener(this));
- container.appendChild(node);
-
- id = this.element.id.appendSuffix('nextYear');
- node = Builder.node('DIV', {id: id});
- this.classNames.addClassNames(node, 'nextYearMark');
- Event.observe(node, "click", this.changeCalendar.bindAsEventListener(this));
- container.appendChild(node);
-
- return container;
- },
-
- multiBuild: function(tagType, params, className, hover, clickEvent) {
- var children = [];
- for (var i = 0; i < params.length; i++) {
- var node;
-
- node = Builder.node(tagType, [params[i]]);
- if (className)
- this.classNames.addClassNames(node, className);
-
- if (hover)
- new Hover(node);
-
- if (clickEvent)
- Event.observe(node, "click", clickEvent.bindAsEventListener(this));
-
- children.push(node);
- }
-
- return children;
- },
-
- buildCalendar: function() {
- var className = this.classNames.joinClassNames('table');
- var node = Builder.node('TBODY', [this.buildTableHeader(), this.buildTableData()]);
- var table = Builder.node('TABLE', {className: className}, [node]);
-
- className = this.classNames.joinClassNames('calendar');
- return Builder.node('DIV', {className: className}, [table]);
- },
-
- buildTableHeader: function() {
- var weekArray = new Array();
- var className = this.classNames.joinClassNames('tableTh');
- for (var i = 0; i < DateUtil.dayOfWeek.length; i++) {
- weekArray.push(
- Builder.node('TH', {className: className}, [this.options.dayOfWeek[i]]));
- }
-
- return Builder.node('TR', weekArray);
- },
-
- buildTableData: function() {
- var length = DateUtil.dayOfWeek.length * 6;
- var year = this.date.getFullYear();
- var month = this.date.getMonth();
- var firstDay = DateUtil.getFirstDate(year, month).getDay();
- var lastDate = DateUtil.getLastDate(year, month).getDate();
- var trs = new Array();
- var tds = new Array();
-
- for (var i = 0, day = 1; i <= length; i++) {
- if ((i < firstDay) || day > lastDate) {
- tds.push(Builder.node('TD'));
-
- } else {
- var className;
- if ((i % 7 == 0) || ((i+1) % 7 == 0))
- className = 'holiday';
- else
- className = 'date';
-
- var defaultClass = this.classNames.joinClassNames(className);
- node = Builder.node('TD', {className: defaultClass}, [day]);
- new Hover(node);
- Event.observe(node, "click", this.selectDate.bindAsEventListener(this));
- tds.push(node);
- day++;
- }
-
- if ((i + 1) % 7 == 0) {
- trs.push(Builder.node('TR', tds));
- tds = new Array();
- }
- }
-
- return trs;
- },
-
- refresh: function() {
- this.element.innerHTML = '';
- this.calendar = this.build();
- this.element.appendChild(this.calendar);
- new IECover(this.element);
- },
-
- getMonth: function() {
- return DateUtil.months[this.date.getMonth()];
- },
-
- changeCalendar: function(event) {
- var element = Event.element(event);
- if (Element.hasClassName(element, DatePicker.className.preYearMark)) {
- this.date.setFullYear(this.date.getFullYear() - 1);
- } else if (Element.hasClassName(element, DatePicker.className.nextYearMark)) {
- this.date.setFullYear(this.date.getFullYear() + 1);
- } else if (Element.hasClassName(element, DatePicker.className.preMonthMark)) {
- var pre = this.date.getMonth() - 1;
- if (pre < 0) {
- pre = 11;
- this.date.setFullYear(this.date.getFullYear() - 1);
- }
- this.date.setMonth(pre);
- } else if (Element.hasClassName(element, DatePicker.className.nextMonthMark)) {
- var next = this.date.getMonth() + 1;
- if (next > 11) {
- next = 0;
- this.date.setFullYear(this.date.getFullYear() + 1);
- }
- this.date.setMonth(next);
- }
-
- this.refresh();
- if (event) Event.stop(event);
- },
-
- selectDate: function(event) {
- var src = Event.element(event);
- var text = Element.getTextNodes(src)[0];
-
- this.date.setDate(text.nodeValue);
- var value = this.formatDateString();
-
- if (this.target.value || this.target.value == '') {
- this.target.value = value;
- } else {
- this.target.innerHTML = value;
- }
-
- this.hide();
- this.classNames.refreshClassNames(src, 'date');
-
- this.callBack(this);
- },
-
- show: function(event) {
- var styles = $H({zIndex: ZindexManager.getIndex(this.options.zIndex)});
- if (this.options.standTo) {
- this.defaultParent = this.element.parentNode;
- document.body.appendChild(this.element);
- styles = styles.merge({
- position: 'absolute',
- left: Event.pointerX(event) + 'px',
- top: Event.pointerY(event) + 'px'
- });
- }
-
- Element.setStyle(this.element, styles);
- Element.show(this.element);
- this.cover.resetSize();
- Event.observe(document, "click", this.doclistener);
- if (event) {
- Event.stop(event);
- }
- },
-
- hide: function() {
- Event.stopObserving(document, "click", this.doclistener);
- Element.hide(this.element);
- if (this.defaultParent) {
- this.defaultParent.appendChild(this.element);
- }
- },
-
- addTrigger: function(trigger) {
- Event.observe($(trigger), 'click', this.show.bindAsEventListener(this));
- },
-
- changeTarget: function(target) {
- this.target = $(target);
- },
-
- formatDateString: function() {
- var string = '';
- if (this.format.constructor == Function) {
- string = this.format(this.date);
- } else if (this.format.constructor == String) {
- string = this.date.strftime(this.format);
- }
- return string;
- }
-}
+// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+var DatePicker = Class.create();\r
+DatePicker.className = {\r
+ container: 'datepicker',\r
+ header: 'datepicker_header',\r
+ footer: 'datepicker_footer',\r
+ preYears: 'datepicker_preYears',\r
+ nextYears: 'datepicker_nextYears',\r
+ years: 'datepicker_years',\r
+ calendar: 'datepicker_calendar',\r
+ date: 'datepicker_date',\r
+ holiday: 'datepicker_holiday',\r
+ ym: 'datepicker_ym',\r
+ table: 'datepicker_table',\r
+ tableTh: 'datepicker_tableTh',\r
+ nextMonthMark: 'datepicker_nextMonthMark',\r
+ nextYearMark: 'datepicker_nextYearMark',\r
+ preMonthMark: 'datepicker_preMonthMark',\r
+ preYearMark: 'datepicker_preYearMark',\r
+ zIndex: null\r
+}\r
+DatePicker.prototype = {\r
+ \r
+ initialize: function(element, target, trigger) {\r
+ this.element = $(element);\r
+ Element.setStyle(this.element, {visibility: 'hidden'});\r
+ this.target = $(target);\r
+ this.date = new Date();\r
+\r
+ this.options = Object.extend({\r
+ month: this.date.getMonth() + 1,\r
+ date: this.date.getDate(),\r
+ year: this.date.getFullYear(),\r
+ format: DateUtil.toLocaleDateString,\r
+ cssPrefix: 'custom_',\r
+ callBack: Prototype.emptyFunction,\r
+ standTo: false,\r
+ beforeShow: Prototype.emptyFunction,\r
+ headerFormat: null,\r
+ dayOfWeek: DateUtil.dayOfWeek\r
+ }, arguments[3] || {});\r
+ \r
+ var customCss = CssUtil.appendPrefix(this.options.cssPrefix, DatePicker.className);\r
+ this.classNames = new CssUtil([DatePicker.className, customCss]);\r
+ \r
+ this.format = this.options.format;\r
+ this.callBack = this.options.callBack;\r
+ \r
+ this.date.setMonth(this.options.month - 1);\r
+ this.date.setDate(this.options.date);\r
+ this.date.setFullYear(this.options.year);\r
+ \r
+ this.calendar = this.build();\r
+ this.element.appendChild(this.calendar);\r
+ this.cover = new IECover(this.element);\r
+ \r
+ this.doclistener = this.hide.bindAsEventListener(this);\r
+ Event.observe($(trigger), "click", this.show.bindAsEventListener(this));\r
+ this.hide();\r
+ Element.setStyle(this.element, {visibility: 'visible'});\r
+ },\r
+ \r
+ build: function() {\r
+ var node = \r
+ Builder.node(\r
+ 'DIV', \r
+ {className: this.classNames.joinClassNames('container')},\r
+ [\r
+ this.buildHeader(),\r
+ this.buildCalendar(),\r
+ this.buildFooter()\r
+ ]);\r
+ \r
+ return node;\r
+ },\r
+ \r
+ buildHeader: function() {\r
+ var headerNodes = Builder.node('TR');\r
+ headerNodes.appendChild(this.buildHeaderLeft());\r
+ headerNodes.appendChild(this.buildHeaderCenter());\r
+ headerNodes.appendChild(this.buildHeaderRight());\r
+ \r
+ className = this.classNames.joinClassNames('header');\r
+ var tbody = Builder.node('TBODY', [headerNodes]);\r
+ return Builder.node('TABLE', {className: className}, [tbody]);\r
+ },\r
+\r
+ buildFooter: function() {\r
+ var footer = Builder.node('DIV');\r
+ this.classNames.addClassNames(footer, 'footer');\r
+ return footer;\r
+ },\r
+\r
+ buildHeaderLeft: function() {\r
+ var container = Builder.node('TD');\r
+ this.classNames.addClassNames(container, 'preYears');\r
+\r
+ var id = this.element.id.appendSuffix('preYear');\r
+ var node = Builder.node('DIV', {id: id});\r
+ this.classNames.addClassNames(node, 'preYearMark');\r
+ Event.observe(node, "click", this.changeCalendar.bindAsEventListener(this));\r
+ container.appendChild(node);\r
+\r
+ id = this.element.id.appendSuffix('preMonth');\r
+ node = Builder.node('DIV', {id: id});\r
+ this.classNames.addClassNames(node, 'preMonthMark');\r
+ Event.observe(node, "click", this.changeCalendar.bindAsEventListener(this));\r
+ container.appendChild(node);\r
+\r
+ return container;\r
+ },\r
+\r
+ buildHeaderCenter: function() {\r
+ var contents = [];\r
+ var yearMonth = this.getHeaderYearMonth();\r
+\r
+ var id = this.element.id.appendSuffix('nextMonth');\r
+ var node = Builder.node('SPAN', {id: id}, [yearMonth[0]]);\r
+ this.classNames.addClassNames(node, 'ym');\r
+ contents.push(node);\r
+\r
+ id = this.element.id.appendSuffix('nextYear');\r
+ node = Builder.node('SPAN', {id: id}, [yearMonth[1]]);\r
+ this.classNames.addClassNames(node, 'ym');\r
+ contents.push(node);\r
+\r
+ var container = Builder.node('TD', contents);\r
+ this.classNames.addClassNames(container, 'years');\r
+\r
+ return container;\r
+ },\r
+\r
+ getHeaderYearMonth: function() {\r
+ if (this.options.headerFormat) {\r
+ var tmpl = new Template(this.options.headerFormat);\r
+ return [tmpl.evaluate({year: this.date.getFullYear(), month: this.date.getMonth() + 1}), ' '];\r
+ }\r
+ return [DateUtil.months[this.date.getMonth()], this.date.getFullYear()];\r
+ },\r
+\r
+ buildHeaderRight: function() {\r
+ var container = Builder.node('TD');\r
+ this.classNames.addClassNames(container, 'nextYears');\r
+\r
+ var id = this.element.id.appendSuffix('nextMonth');\r
+ var node = Builder.node('DIV', {id: id});\r
+ this.classNames.addClassNames(node, 'nextMonthMark');\r
+ Event.observe(node, "click", this.changeCalendar.bindAsEventListener(this));\r
+ container.appendChild(node);\r
+\r
+ id = this.element.id.appendSuffix('nextYear');\r
+ node = Builder.node('DIV', {id: id});\r
+ this.classNames.addClassNames(node, 'nextYearMark');\r
+ Event.observe(node, "click", this.changeCalendar.bindAsEventListener(this));\r
+ container.appendChild(node);\r
+\r
+ return container;\r
+ },\r
+ \r
+ multiBuild: function(tagType, params, className, hover, clickEvent) {\r
+ var children = [];\r
+ for (var i = 0; i < params.length; i++) {\r
+ var node;\r
+ \r
+ node = Builder.node(tagType, [params[i]]);\r
+ if (className)\r
+ this.classNames.addClassNames(node, className);\r
+ \r
+ if (hover)\r
+ new Hover(node);\r
+ \r
+ if (clickEvent)\r
+ Event.observe(node, "click", clickEvent.bindAsEventListener(this));\r
+ \r
+ children.push(node);\r
+ }\r
+ \r
+ return children;\r
+ },\r
+ \r
+ buildCalendar: function() {\r
+ var className = this.classNames.joinClassNames('table');\r
+ var node = Builder.node('TBODY', [this.buildTableHeader(), this.buildTableData()]);\r
+ var table = Builder.node('TABLE', {className: className}, [node]);\r
+ \r
+ className = this.classNames.joinClassNames('calendar');\r
+ return Builder.node('DIV', {className: className}, [table]);\r
+ },\r
+ \r
+ buildTableHeader: function() {\r
+ var weekArray = new Array();\r
+ var className = this.classNames.joinClassNames('tableTh');\r
+ for (var i = 0; i < DateUtil.dayOfWeek.length; i++) {\r
+ weekArray.push(\r
+ Builder.node('TH', {className: className}, [this.options.dayOfWeek[i]]));\r
+ }\r
+ \r
+ return Builder.node('TR', weekArray);\r
+ },\r
+ \r
+ buildTableData: function() {\r
+ var length = DateUtil.dayOfWeek.length * 6;\r
+ var year = this.date.getFullYear();\r
+ var month = this.date.getMonth();\r
+ var firstDay = DateUtil.getFirstDate(year, month).getDay();\r
+ var lastDate = DateUtil.getLastDate(year, month).getDate();\r
+ var trs = new Array();\r
+ var tds = new Array();\r
+ \r
+ for (var i = 0, day = 1; i <= length; i++) {\r
+ if ((i < firstDay) || day > lastDate) {\r
+ tds.push(Builder.node('TD'));\r
+ \r
+ } else {\r
+ var className;\r
+ if ((i % 7 == 0) || ((i+1) % 7 == 0))\r
+ className = 'holiday';\r
+ else\r
+ className = 'date';\r
+ \r
+ var defaultClass = this.classNames.joinClassNames(className);\r
+ node = Builder.node('TD', {className: defaultClass}, [day]);\r
+ new Hover(node);\r
+ Event.observe(node, "click", this.selectDate.bindAsEventListener(this));\r
+ tds.push(node);\r
+ day++;\r
+ }\r
+ \r
+ if ((i + 1) % 7 == 0) {\r
+ trs.push(Builder.node('TR', tds));\r
+ tds = new Array();\r
+ }\r
+ }\r
+ \r
+ return trs;\r
+ },\r
+ \r
+ refresh: function() {\r
+ this.element.innerHTML = '';\r
+ this.calendar = this.build();\r
+ this.element.appendChild(this.calendar);\r
+ new IECover(this.element);\r
+ },\r
+ \r
+ getMonth: function() {\r
+ return DateUtil.months[this.date.getMonth()];\r
+ },\r
+ \r
+ changeCalendar: function(event) {\r
+ var element = Event.element(event);\r
+ if (Element.hasClassName(element, DatePicker.className.preYearMark)) {\r
+ this.date.setFullYear(this.date.getFullYear() - 1);\r
+ } else if (Element.hasClassName(element, DatePicker.className.nextYearMark)) {\r
+ this.date.setFullYear(this.date.getFullYear() + 1);\r
+ } else if (Element.hasClassName(element, DatePicker.className.preMonthMark)) {\r
+ var pre = this.date.getMonth() - 1;\r
+ if (pre < 0) {\r
+ pre = 11;\r
+ this.date.setFullYear(this.date.getFullYear() - 1);\r
+ }\r
+ this.date.setMonth(pre);\r
+ } else if (Element.hasClassName(element, DatePicker.className.nextMonthMark)) {\r
+ var next = this.date.getMonth() + 1;\r
+ if (next > 11) {\r
+ next = 0;\r
+ this.date.setFullYear(this.date.getFullYear() + 1);\r
+ }\r
+ this.date.setMonth(next);\r
+ }\r
+ \r
+ this.refresh();\r
+ if (event) Event.stop(event);\r
+ },\r
+ \r
+ selectDate: function(event) {\r
+ var src = Event.element(event);\r
+ var text = Element.getTextNodes(src)[0];\r
+\r
+ this.date.setDate(text.nodeValue);\r
+ var value = this.formatDateString();\r
+ \r
+ if (this.target.value || this.target.value == '') {\r
+ this.target.value = value;\r
+ } else {\r
+ this.target.innerHTML = value;\r
+ }\r
+ \r
+ this.hide();\r
+ this.classNames.refreshClassNames(src, 'date');\r
+ \r
+ this.callBack(this);\r
+ },\r
+ \r
+ show: function(event) {\r
+ var styles = $H({zIndex: ZindexManager.getIndex(this.options.zIndex)});\r
+ if (this.options.standTo) {\r
+ this.defaultParent = this.element.parentNode;\r
+ document.body.appendChild(this.element);\r
+ styles = styles.merge({ \r
+ position: 'absolute',\r
+ left: Event.pointerX(event) + 'px',\r
+ top: Event.pointerY(event) + 'px'\r
+ });\r
+ }\r
+\r
+ Element.setStyle(this.element, styles);\r
+ Element.show(this.element);\r
+ this.cover.resetSize();\r
+ Event.observe(document, "click", this.doclistener);\r
+ if (event) {\r
+ Event.stop(event);\r
+ }\r
+ },\r
+ \r
+ hide: function() {\r
+ Event.stopObserving(document, "click", this.doclistener);\r
+ Element.hide(this.element);\r
+ if (this.defaultParent) {\r
+ this.defaultParent.appendChild(this.element);\r
+ }\r
+ },\r
+ \r
+ addTrigger: function(trigger) {\r
+ Event.observe($(trigger), 'click', this.show.bindAsEventListener(this));\r
+ },\r
+ \r
+ changeTarget: function(target) {\r
+ this.target = $(target);\r
+ },\r
+\r
+ formatDateString: function() {\r
+ var string = '';\r
+ if (this.format.constructor == Function) {\r
+ string = this.format(this.date);\r
+ } else if (this.format.constructor == String) {\r
+ string = this.date.strftime(this.format);\r
+ }\r
+ return string;\r
+ }\r
+}\r
-// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Grid = Class.create();
-Grid.className = {
- container: 'grid_container',
-
- baseTable: 'grid_baseTable',
- baseRow: 'grid_baseRow',
- baseCell: 'grid_baseCell',
-
- headerTable: 'grid_headerTable',
- headerRow: 'grid_headerRow',
- headerCell: 'grid_headerCell',
- headerCellDrag: 'grid_headerCellDrag',
- headerCellSort: 'grid_headerCellVal',
-
- idTable: 'grid_idTable',
- idRow: 'grid_idRow',
- idCell: 'grid_idCell',
- idCellVal: 'grid_idCellVal',
-
- cellTable: 'grid_cellTable',
- cellTbody: 'grid_cellTbody',
- cellRow: 'grid_cellRow',
- cell: 'grid_cell',
- cellVal: 'grid_cellVal',
- cellSelected: 'grid_cellSelected',
- state: 'grid_state',
- stateEmpty: 'grid_stateEmpty',
- stateOpen: 'grid_stateOpen',
- stateClose: 'grid_stateClose',
-
- inplaceEditor: 'grid_inplaceEditor'
-}
-Grid.scrollTop = 0;
-Grid.scrollLeft = 0;
-Grid.options = {}
-Grid.options.baseTable = {
- border:1,
- frame : 'border',
- cellSpacing:0,
- cellPadding:0
-}
-Grid.options.headerTable = {
- border:1,
- frame : 'border',
- cellSpacing:0,
- cellPadding:0
-}
-Grid.options.idTable = {
- border:1,
- frame : 'border',
- cellSpacing:0,
- cellPadding:0
-}
-Grid.options.cellTable = {
- border:1,
- frame : 'border',
- cellSpacing:0,
- cellPadding:0
-}
-Grid.prototype = {
-
- initialize : function(element) {
-
- this.element = $(element);
- Element.setStyle(this.element, {visibility: 'hidden'});
- Element.hide(this.element);
-
- var options = Object.extend({
- cssPrefix: 'custum_',
- cellMinWidth: 10,
- cellMinHeight: 10,
- cellDefaultWidth: 72,
- cellDefaultHeight: 25,
- defaultRowLength: 10,
- baseWidth: 40,
- baseHeight: 25,
- baseTop: 0,
- baseLeft: 0,
- cellEditUrl: '',
- updateGridUrl: '',
- updateGridReceiver: '',
- hierarchy: false,
- hierarchyCol: false,
- hierarchyIndent: 20,
- sortOptions: {}
- }, arguments[1] || {});
-
- this.options = options;
- this.custumCss = CssUtil.appendPrefix(options.cssPrefix, Grid.className);
- this.cssUtil = new CssUtil([Grid.className, this.custumCss]);
- this.cssUtil.addClassNames(this.element, 'container');
- this.hierarchyCol = this.options.hierarchyCol ? $(this.options.hierarchyCol) : false;
- this.hierarchyColIndex = this.hierarchyCol ? this.hierarchyCol.cellIndex : 0;
- Element.makePositioned(this.element);
- Position.includeScrollOffsets = true;
- this.stateDivWidth = parseInt(CssUtil.getCssRuleBySelectorText('.' + Grid.className.state).style.width, 10);
-
- this.marginSize = this.options.marginSize ? this.options.marginSize : 4;
- this.stateIndent = 15;
-
- this.rowIdBase = this.element.id + '_row_';
- this.topLevelList = new Array();
- this.removeList = new Array();
- this.build();
- this.removeList.each(function(r) {
- r.parentNode.removeChild(r);
- });
- var sortOptions = {
- relate : this.idTable,
- handle:this.headerTable,
- callBack:this.finishSort.bind(this)
- };
- sortOptions = $H(sortOptions).merge(this.options.sortOptions);
- this.sortTable = new SortableTableGridEx(this.cellTable, sortOptions);
- Element.setStyle(this.element, {visibility: 'visible'});
- Element.show(this.element);
- },
-
- build: function() {
- Element.cleanWhitespace(this.element);
- this.cellTable = this.element.childNodes[0];
- Element.cleanWhitespace(this.cellTable);
-
- this.colLength = this.cellTable.tHead.rows[0].cells.length;
- this.rowLength = this.cellTable.tBodies[0].rows.length;
- if (this.rowLength == 0)this.rowLength = this.options.defaultRowLength;
- this.buildBaseTable();
- this.buildHeaderTable();
- this.buildIdTable();
- this.buildCellTable();
-
- Event.observe(this.element, 'scroll', this.fixTablePosition.bindAsEventListener(this));
- },
-
- buildBaseTable: function() {
-
- this.baseTable = Builder.node('table', Grid.options.baseTable);
- this.cssUtil.addClassNames(this.baseTable, 'baseTable');
- with (this.baseTable.style) {
- width = this.options.baseWidth + 'px';
- height = this.options.baseHeight + 'px';
- position = 'absolute';
- top = this.options.baseTop + 'px';
- left = this.options.baseLeft + 'px';
- }
-
- var row = this.baseTable.insertRow(0);
- var cell = row.insertCell(0);
-
- this.cssUtil.addClassNames(row, 'baseRow');
- this.cssUtil.addClassNames(cell, 'baseCell');
-
- this.element.appendChild(this.baseTable);
- },
-
- buildHeaderTable: function() {
- this.headerTable = Builder.node('table', Grid.options.headerTable);
- this.cssUtil.addClassNames(this.headerTable, 'headerTable');
-
- var thead = this.cellTable.tHead;
- var row = thead.rows[0];
- row.id = this.element.id + '_headerTable_row';
- var cells = row.cells;
- Element.cleanWhitespace(thead);
- Element.cleanWhitespace(row);
-
- this.cssUtil.addClassNames(row, 'headerRow');
- for (var i = 0; i < cells.length; i++) {
- var cell = cells[i];
- var value = cell.firstChild;
- var title = cell.innerHTML;
- this.buildHeaderCell(cell, title, i);
- this.removeList.push(value);
- }
- this.headerTable.appendChild(thead);
- with (this.headerTable.style) {
- width = this.options.cellDefaultWidth * this.colLength + 'px';
- height = this.baseTable.style.height;
- position= 'absolute';
- top = Element.getStyle(this.baseTable, 'top');
- left = parseInt(Element.getStyle(this.baseTable, 'left')) + parseInt(Element.getStyle(this.baseTable, 'width')) + 'px';
- }
- this.element.appendChild(this.headerTable);
- Sortable.create(
- row,
- {
- tag:'td',
- handle:Grid.className.headerCellDrag,
- constraint:true,
- overlap:'horizontal',
- scroll:this.element,
- onUpdate:this.updateCellLine.bind(this)
- });
- },
-
- buildHeaderCell : function(cell, title, index) {
-
- cell.id = this.element.id + '_header_col_' + index;
-
- var drag = Builder.node('div');
- var sort = Builder.node('div');
-
- this.cssUtil.addClassNames(cell, 'headerCell');
- this.cssUtil.addClassNames(drag, 'headerCellDrag');
- this.cssUtil.addClassNames(sort, 'headerCellSort');
-
- cell.style.width = this.options.cellDefaultWidth + 'px';
- var dragWidth = parseInt(Element.getStyle(cell, 'width')) - (this.marginSize * 2);
- var sortWidth = dragWidth - (this.marginSize * 2);
- var cellHeight = this.options.baseHeight - (Grid.options.headerTable.border * 4);
- with (drag.style) {
- width = dragWidth + 'px';
- height = cellHeight + 'px';
- marginLeft = this.marginSize + 'px';
- marginRight = this.marginSize + 'px';
- }
- with (sort.style) {
- width = sortWidth + 'px';
- height = cellHeight + 'px';
- marginLeft = this.marginSize + 'px';
- marginRight = this.marginSize + 'px';
- }
-
- sort.innerHTML = title;
- drag.appendChild(sort);
- cell.appendChild(drag);
-
- new ResizeableGridEx(cell, {minWidth: this.options.cellMinWidth, top:0,right:2, bottom:0, left:0 ,draw:this.updateCellWidth.bind(this)});
- Event.observe(cell, 'mousedown', this.setSelectedColumn.bindAsEventListener(this));
- Event.observe(drag, 'mousedown', this.setSelectedColumn.bindAsEventListener(this));
- Event.observe(sort, 'mousedown', this.setSelectedColumn.bindAsEventListener(this));
- },
-
- buildIdTable: function() {
-
- this.idTable = Builder.node('table', Grid.options.idTable);
- this.cssUtil.addClassNames(this.idTable, 'idTable');
- for (var i = 0; i < this.rowLength; i++) {
-
- var row = this.idTable.insertRow(i);
- this.buildIdRow(row, i);
- }
-
- with(this.idTable.style) {
- width = this.options.baseWidth + 'px';
- position = 'absolute';
- top = parseInt(Element.getStyle(this.baseTable, 'top')) + parseInt(Element.getStyle(this.baseTable, 'height')) + 'px';
- left = Element.getStyle(this.baseTable, 'left');
- }
-
- this.element.appendChild(this.idTable);
- var tbody = this.idTable.tBodies[0];
- tbody.id = this.element.id + '_idTable_tbody';
- Sortable.create(
- tbody,
- {
- tag:'tr',
- handle:Grid.className.idCellVal,
- scroll:this.element,
- constraint:true,
- overlap:'vertical',
- onUpdate:this.updateRowLine.bind(this)
- });
- },
-
- buildIdRow : function(row, index) {
- row.id = this.rowIdBase + '_id_' + index;
-
- var cell = row.insertCell(0);
- var valueDiv = Builder.node('div');
-
- this.cssUtil.addClassNames(row, 'idRow');
- this.cssUtil.addClassNames(cell, 'idCell');
- this.cssUtil.addClassNames(valueDiv, 'idCellVal');
-
- with (cell.style) {
- width = this.options.baseWidth + 'px';
- height = this.options.cellDefaultHeight + 'px';
- }
- with (valueDiv.style) {
- marginTop = this.marginSize + 'px';
- marginBottom = this.marginSize + 'px';
- width = this.options.baseWidth - (Grid.options.idTable.border * 4) + 'px';
- height = this.options.cellDefaultHeight - (this.marginSize * 2) + 'px';
- }
-
- valueDiv.innerHTML = index + 1;
- cell.appendChild(valueDiv);
-
- new ResizeableGridEx(cell, {minHeight: this.options.cellMinHeight, top:0, right: 0, bottom: 2, left: 0, draw:this.updateCellHeight.bind(this)});
-
- Event.observe(row, 'mousedown', this.setSelectedRow.bindAsEventListener(this));
- Event.observe(cell, 'mousedown', this.setSelectedRow.bindAsEventListener(this));
- Event.observe(valueDiv, 'mousedown', this.setSelectedRow.bindAsEventListener(this));
- },
-
- buildCellTable: function() {
- var tbody = this.cellTable.tBodies[0];
- Element.cleanWhitespace(tbody);
- with(this.cellTable){
- border = Grid.options.cellTable.border;
- cellSpacing = Grid.options.cellTable.cellSpacing;
- cellPadding = Grid.options.cellTable.cellPadding;
- }
- this.cssUtil.addClassNames(this.cellTable, 'cellTable');
- this.cssUtil.addClassNames(tbody, 'cellTbody');
- this.element.appendChild(this.cellTable);
- var rows = this.cellTable.rows;
-
- if (!rows || rows.length == 0) {
- for(var i = 0; i < this.rowLength; i++) {
-
- var newRow = this.cellTable.insertRow(i);
- newRow.id = this.rowIdBase + i;
- this.cssUtil.addClassNames(newRow, 'cellRow');
-
- for (var j = 0; j < this.colLength; j++) {
- var newCell = newRow.insertCell(j);
- this.buildCell(newCell, j, "");
- }
- if (this.options.hierarchy) {
- this.setHierarchyRow(newRow);
- }
- }
-
- } else {
- for (var i = 0; i < this.rowLength; i++) {
- var row = rows[i];
- Element.cleanWhitespace(row);
- this.cssUtil.addClassNames(row, 'cellRow');
- row.id = this.rowIdBase + i;
- var cells = row.cells;
-
- for (var j = 0; j < cells.length; j++) {
- var cell = cells[j];
- Element.cleanWhitespace(cell);
- this.buildCell(cell, j, Element.collectTextNodes(cell));
- this.removeList.push(cell.firstChild);
- }
- if (this.options.hierarchy) {
- this.setHierarchyRow(row);
- }
- }
- }
-
- with (this.cellTable.style) {
- width = this.options.cellDefaultWidth * this.colLength + 'px';
- position = 'absolute';
- top = parseInt(Element.getStyle(this.baseTable, 'top')) + parseInt(Element.getStyle(this.baseTable, 'height')) + 'px';
- left = parseInt(Element.getStyle(this.baseTable, 'left')) + parseInt(Element.getStyle(this.baseTable, 'width')) + 'px';
- }
-
- this.cellTable.getIdRow = this.getIdRow.bind(this);
- },
-
- buildCell : function(cell, cellIdIndex, value) {
-
- var cellValueDiv = Builder.node('div');
- cellValueDiv.innerHTML = value;
-
- cell.appendChild(cellValueDiv);
- cell.id = cell.parentNode.id + '_col_' + cellIdIndex;
-
- this.cssUtil.addClassNames(cell, 'cell');
- this.cssUtil.addClassNames(cellValueDiv, 'cellVal');
-
- with (cell.style) {
- width = Element.getStyle(this.getHeaderCell(cell), 'width');
- height = Element.getStyle(this.getIdRow(cell.parentNode).cells[0], 'height');
- }
- with (cellValueDiv.style) {
- width = cell.style.width;
- height = cell.style.height;
- marginTop = '0px';
- marginBottom = '0px';
- }
-
- Event.observe(cell, 'click', this.setSelectedCell.bindAsEventListener(this));
-
- var ajax = new Ajax.InPlaceEditor(cellValueDiv, this.options.cellEditUrl,
- {
- formClassName: this.cssUtil.joinClassNames('inplaceEditor'),
- rows: 2,
- cols:12,
- okButton: false,
- cancelLink:false,
- submitOnBlur:true,
- hoverClassName: "cellHover",
- highlightcolor: "#becfeb",
- highlightendcolor: "#becfeb",
- onComplete: this.showStateDiv.bind(this),
- callback : this.createInplaceEditorParams.bind(this),
- formId : cell.id + '_form'
- }
- );
- cellValueDiv.ajax = ajax;
- Event.stopObserving(cellValueDiv, 'click', ajax.onclickListener);
- Event.stopObserving(cellValueDiv, 'mouseover', ajax.mouseoverListener);
- Event.stopObserving(cellValueDiv, 'mouseout', ajax.mouseoutListener);
-
-
- Event.observe(cellValueDiv, 'dblclick', this.setTextAreaSize.bindAsEventListener(this));
- if (this.options.hierarchy && cell.cellIndex == this.hierarchyColIndex) {
- Event.observe(cellValueDiv, 'dblclick', this.hideStateDiv.bindAsEventListener(this));
- }
- Event.observe(cellValueDiv, 'dblclick', ajax.onclickListener);
-
- },
-
- addColumn: function(index, colTitle, values) {
- var headerRow = this.headerTable.rows[0];
- var insertIndex = (!isNaN(index)) ? index : this.colLength;
- var colIdIndex = this.colLength;
- var headerCell = headerRow.insertCell(insertIndex);
- this.buildHeaderCell(headerCell, colTitle, insertIndex);
-
- var rows = this.cellTable.rows;
- var idRows = this.idTable.rows;
- for (var i = 0; i < rows.length; i++) {
-
- var cell = rows[i].insertCell(insertIndex);
- var cellValue = "";
- if (values && values[i]) {
- cellValue = values[i];
- }
- this.buildCell(cell, colIdIndex, cellValue);
- }
-
- this.headerTable.style.width = parseInt(Element.getStyle(this.headerTable, 'width')) + this.options.cellDefaultWidth + 'px';
- this.cellTable.style.width = this.headerTable.style.width;
-
- var sortableOptions = Sortable.options(headerRow);
-
- sortableOptions.draggables.push(
- new Draggable(
- headerCell,
- {
- revert: true,
- constraint: true,
- scroll: this.element,
- handle: Element.getElementsByClassName(headerCell, Grid.className.headerCellDrag)[0]
- }
- )
- );
- Droppables.add(headerCell, {overlap:'horizontal', containment:headerRow, onHover:Sortable.onHover, greedy:true});
- sortableOptions.droppables.push(headerCell);
- this.sortTable.addEvent(Element.getElementsByClassName(headerCell, Grid.className.headerCellSort)[0]);
- this.colLength += 1;
- },
-
- deleteColumn : function(index) {
- if((isNaN(index)) || index >= this.colLength) {
- return;
- }
- var headerRow = this.headerTable.rows[0];
- if (!headerRow) return;
- var headerCell = headerRow.cells[index];
- if (!headerCell) return;
-
- var width = headerCell.offsetWidth;
- var rows = this.cellTable.rows;
- headerRow.deleteCell(index);
-
- for (var i = 0; i < rows.length; i++) {
- rows[i].deleteCell(index);
- }
-
- var headerTableWidth = parseInt(Element.getStyle(this.headerTable, 'width')) - width;
-
- this.headerTable.style.width = headerTableWidth >= 0 ? headerTableWidth + 'px' : '0px';
- this.cellTable.style.width = this.headerTable.style.width;
- this.colLength -= 1;
- this.fixTablePosition();
- },
-
- addRow : function(index, values) {
- var insertIndex = (!isNaN(index)) ? index : this.idTable.rows.length;
- var rowIdIndex = this.idTable.rows.length;
- var idRow = this.idTable.insertRow(index);
- idRow.id = this.rowIdBase + '_id_' + rowIdIndex;
- this.buildIdRow(idRow, rowIdIndex);
- this.updateId();
-
- var cellRow = this.cellTable.insertRow(insertIndex);
- cellRow.id = this.rowIdBase + rowIdIndex;
- this.cssUtil.addClassNames(cellRow, 'cellRow');
- var headerCells = this.headerTable.rows[0].cells;
-
- for (var i = 0; i < headerCells.length; i++) {
- var headerCell = headerCells[i];
- var colIdIndex = headerCell.id.substring(headerCell.id.indexOf('_col_',0) + '_col_'.length);
- var cell = cellRow.insertCell(i);
- var cellValue = (values && values[i]) ? values[i] : "";
- this.buildCell(cell, colIdIndex, cellValue);
- }
-
- this.sortTable.defaultOrder.insert(index, cellRow);
-
- var idTbody = this.idTable.tBodies[0];
- var sortableOptions = Sortable.options(idTbody);
-
- sortableOptions.draggables.push(
- new Draggable(
- idRow,
- {
- revert: true,
- constraint: true,
- scroll: this.element,
- handle: Element.getElementsByClassName(idRow, Grid.className.idCellVal)[0]
- }
- )
- );
- Droppables.add(idRow, {overlap:'vertical', containment:idTbody, onHover:Sortable.onHover, greedy:true});
- sortableOptions.droppables.push(idRow);
- this.rowLength += 1;
- return cellRow;
- },
-
- deleteRow : function(index) {
- if(isNaN(index) || index >= this.rowLength) {
- return;
- }
-
- var targetId = null;
- if (this.cellTable.rows[index])
- targetId = this.cellTable.rows[index].id;
- else
- return;
-
- this.sortTable.defaultOrder.reverse();
- var newOrder = new Array();
-
- for (var i = 0; this.sortTable.defaultOrder.length > 0; i++) {
- var row = this.sortTable.defaultOrder.pop();
- if (row.id == targetId) {
- continue;
- }
- newOrder.push(row);
- }
-
- this.sortTable.defaultOrder = newOrder;
- this.idTable.deleteRow(index);
- this.cellTable.deleteRow(index);
-
- this.fixTablePosition();
- this.rowLength -= 1;
- this.updateId();
- },
-
- getHeaderCell : function(cell) {
- return this.headerTable.rows[0].cells[cell.cellIndex];
- },
-
- getCells : function(index) {
- var rows = this.cellTable.rows;
- var columns = new Array();
- for (var i = 0; i < rows.length; i++){
- columns.push(rows[i].cells[index]);
- }
- return columns;
- },
-
- getRow : function(index) {
- return this.cellTable.rows[index];
- },
-
- getIdRow : function(cellRow) {
- var id = cellRow.id;
- var index = id.substring(this.rowIdBase.length);
- var targetRow = $(this.rowIdBase + '_id_' + index);
- return targetRow;
- },
-
- getColTitle : function(index) {
- var headerCell = this.headerTable.rows[0].cells[index];
- var title = Element.collectTextNodes(headerCell);
- return title;
- },
-
- finishSort : function() {
- for (var i = 0; i < this.cellTable.rows.length; i++) {
- this.idTable.tBodies[0].appendChild(this.getIdRow(this.cellTable.rows[i]));
- }
- this.updateId();
- },
-
- setSelectedCell : function(event) {
- this.removeSelectedClasses();
- var src = Event.element(event);
-
- if (src.tagName.toUpperCase() != 'TH' && src.tagName.toUpperCase() != 'TD') {
- src = Element.getParentByTagName(['TH,TD'], src);
- }
-
- this.targetCell = src;
-
- if (this.targetCell) {
- this.targetColIndex = this.targetCell.cellIndex;
- this.targetRowIndex = this.targetCell.parentNode.rowIndex;
- this.targetColumn = this.getCells(this.targetColIndex);
- this.targetRow = this.getRow(this.targetRowIndex);
- }
-
- this.cssUtil.addClassNames(this.targetCell, 'cellSelected');
- var childNodes = Element.getTagNodes(this.targetCell, true);
- for (var i = 0; i < childNodes.length; i++) {
- this.cssUtil.addClassNames(childNodes[i], 'cellSelected');
- }
- },
-
- setSelectedColumn : function(event) {
- this.removeSelectedClasses();
-
- this.targetCell = null;
- this.targetRowIndex = null;
- this.targetRow = null;
- this.targetIdRow = null;
- var src = Event.element(event);
- if (src && (src.tagName.toUpperCase() == 'TH' || src.tagName.toUpperCase() == 'TD')) {
- this.targetHeaderCell = src;
- } else {
- this.targetHeaderCell = Element.getParentByTagName(['TH,TD'], src);
- }
- if (this.targetHeaderCell) {
- this.targetColIndex = this.targetHeaderCell.cellIndex;
- this.targetColumn = this.getCells(this.targetColIndex);
- this.cssUtil.addClassNames(this.targetHeaderCell, 'cellSelected');
- var childNodes = Element.getTagNodes(this.targetHeaderCell, true);
- for (var i = 0; i < childNodes.length; i++) {
- this.cssUtil.addClassNames(childNodes[i], 'cellSelected');
- }
- for(var i = 0; i < this.targetColumn.length; i++) {
- this.cssUtil.addClassNames(this.targetColumn[i], 'cellSelected');
- var cellChildNodes = Element.getTagNodes(this.targetColumn[i], true);
- for (var j = 0; j < cellChildNodes.length; j++) {
- this.cssUtil.addClassNames(cellChildNodes.length[j], 'cellSelected');
- }
- }
- }
- },
-
- setSelectedRow : function(event) {
- this.removeSelectedClasses();
- var src = Event.element(event);
- if (src && src.tagName.toUpperCase() == 'TR') {
- this.targetIdRow = src;
- } else {
- this.targetIdRow = Element.getParentByTagName(['TR'], src);
- }
- if (this.targetIdRow) {
- this.targetRowIndex = this.targetIdRow.rowIndex;
- this.targetRow = this.getRow(this.targetRowIndex);
-
- this.cssUtil.addClassNames(this.targetRow, 'cellSelected');
- var childNodes = Element.getTagNodes(this.targetRow, true);
- for (var i = 0; i < childNodes.length; i++) {
- this.cssUtil.addClassNames(childNodes[i], 'cellSelected');
- }
- this.cssUtil.addClassNames(this.targetIdRow, 'cellSelected');
- childNodes = Element.getTagNodes(this.targetIdRow, true);
- for (var i = 0; i < childNodes.length; i++) {
- this.cssUtil.addClassNames(childNodes[i], 'cellSelected');
- }
- }
-
- },
-
- removeSelectedClasses : function() {
- if (this.targetHeaderCell) {
- this.cssUtil.removeClassNames(this.targetHeaderCell, 'cellSelected');
- var childNodes = Element.getTagNodes(this.targetHeaderCell, true);
- for (var i = 0; i < childNodes.length; i++) {
- this.cssUtil.removeClassNames(childNodes[i], 'cellSelected');
- }
- for(var i = 0; i < this.targetColumn.length; i++) {
- this.cssUtil.removeClassNames(this.targetColumn[i], 'cellSelected');
- var cellChildNodes = Element.getTagNodes(this.targetColumn[i], true);
- for (var j = 0; j < cellChildNodes.length; j++) {
- this.cssUtil.removeClassNames(cellChildNodes.length[j], 'cellSelected');
- }
- }
-
- }
- if (this.targetCell) {
- this.cssUtil.removeClassNames(this.targetCell, 'cellSelected');
- var childNodes = Element.getTagNodes(this.targetCell, true);
- for (var i = 0; i < childNodes.length; i++) {
- this.cssUtil.removeClassNames(childNodes[i], 'cellSelected');
- }
-
- }
-
- if (this.targetRow) {
- this.cssUtil.removeClassNames(this.targetRow, 'cellSelected');
- var childNodes = Element.getTagNodes(this.targetRow, true);
- for (var i = 0; i < childNodes.length; i++) {
- this.cssUtil.removeClassNames(childNodes[i], 'cellSelected');
- }
- this.cssUtil.removeClassNames(this.targetIdRow, 'cellSelected');
- childNodes = Element.getTagNodes(this.targetIdRow, true);
- for (var i = 0; i < childNodes.length; i++) {
- this.cssUtil.removeClassNames(childNodes[i], 'cellSelected');
- }
- }
-
- this.targetHeaderCell = null;
- this.targetColumn = null;
- this.targetColIndex = null;
- this.targetCell = null;
- this.targetRowIndex = null;
- this.targetRow = null;
- this.targetIdRow = null;
- },
-
- updateId : function() {
- var rows = this.idTable.rows;
- for (var i = 0; i < rows.length; i++) {
- var idValue = document.getElementsByClassName(this.custumCss.idCellVal, rows[i])[0];
-
- idValue.innerHTML = i + 1;
- }
- },
-
- updateRowLine : function(target) {
- var targetCellRow = this.cellTable.rows[this.targetRowIndex];
- var updateRowIndex = this.targetIdRow.rowIndex;
- var cellTableBody = targetCellRow.parentNode;
- var cellTableRows = cellTableBody.rows;
-
- if (this.options.hierarchy) {
- var checkRow = cellTableBody.rows[this.targetIdRow.rowIndex];
- if (this.isParentRow(checkRow, targetCellRow)) {
- var idBody = this.idTable.tBodies[0];
- idBody.insertBefore(this.targetIdRow, idBody.rows[this.targetRowIndex]);
- return;
- }
- }
- if (updateRowIndex == cellTableRows.length - 1) {
- cellTableBody.appendChild(targetCellRow);
- } else if (this.targetRowIndex < updateRowIndex) {
- cellTableBody.insertBefore(targetCellRow, cellTableRows[updateRowIndex + 1]);
- } else {
- cellTableBody.insertBefore(targetCellRow, cellTableRows[updateRowIndex]);
- }
- if (this.options.hierarchy) {
- this.updateOutline(targetCellRow);
- }
- this.targetRowIndex = updateRowIndex;
- this.updateId();
- },
- updateCellLine : function(target){
- var targetCells = this.getCells(this.targetColIndex);
- var updateColIndex = this.targetHeaderCell.cellIndex;
-
- var rows = this.cellTable.rows;
-
- for (var i = 0; i < rows.length; i++) {
- var cells = rows[i].cells;
- var targetCell = targetCells[i];
-
- if (updateColIndex == cells.length -1) {
- rows[i].appendChild(targetCell);
- } else if (this.targetColIndex < updateColIndex) {
- rows[i].insertBefore(targetCell, cells[updateColIndex + 1]);
- } else {
- rows[i].insertBefore(targetCell, cells[updateColIndex]);
- }
- }
- this.targetColIndex = updateColIndex;
- },
-
- updateCellWidth : function(newStyle, headColumn) {
-
- if(newStyle.width > this.options.cellMinWidth) {
- var dragDiv = Element.getElementsByClassName(headColumn, Grid.className.headerCellDrag)[0];
- var sortDiv = Element.getElementsByClassName(headColumn, Grid.className.headerCellSort)[0];
- var val = newStyle.width - (parseInt(Element.getStyle(headColumn, 'width')));
-
- val = parseInt(val);
-
- this.headerTable.style.width = (parseInt(Element.getStyle(this.headerTable, 'width')) + val) + 'px';
-
- dragDiv.style.width = newStyle.width - (this.marginSize * 2) + 'px';
- sortDiv.style.width = parseInt(Element.getStyle(dragDiv, 'width')) - (this.marginSize * 2) + 'px';
-
- var index = headColumn.cellIndex ;
- var rows = this.cellTable.rows;
-
- this.cellTable.style.width = this.headerTable.style.width
-
- for(var i = 0; i < rows.length; i++){
- var cell = rows[i].cells[index];
- var cellValueDiv = Element.getElementsByClassName(cell, Grid.className.cellVal)[0];
- cellValueDiv.style.width = newStyle.width + 'px';
- cell.style.width = newStyle.width + 'px';
- }
-
- }
- },
-
- updateCellHeight : function(newStyle, idCell) {
- if(newStyle.height > this.options.cellMinHeight) {
- var row = idCell.parentNode;
- var index = row.rowIndex;
- var idValueDiv = Element.getElementsByClassName(idCell, Grid.className.idCellVal)[0];
- idValueDiv.style.height = newStyle.height - (this.marginSize * 2) + 'px';
- var padding = parseInt(idValueDiv.style.paddingTop);
- var cellRow = this.cellTable.rows[index];
- var cells = cellRow.cells;
- for (var i = 0; i < cells.length; i++) {
- cells[i].style.height = newStyle.height + 'px';
- var cellValueDiv = Element.getElementsByClassName(cells[i], Grid.className.cellVal)[0];
- cellValueDiv.style.height = newStyle.height + 'px';
- }
- }
- },
-
- setTextAreaSize : function(event) {
- var target = Event.element(event);
- var rows = parseInt(Element.getStyle(target, 'height'));
- var cols = parseInt(Element.getStyle(target, 'width'));
- target.ajax.options.rows = Math.round(rows/20);
- target.ajax.options.cols = Math.round(cols/20);
- },
-
- fixTablePosition : function(event) {
- Grid.scrollTop = this.element.scrollTop;
- Grid.scrollLeft = this.element.scrollLeft;
- this.baseTable.style.top = Grid.scrollTop + 'px';
- this.baseTable.style.left = Grid.scrollLeft + 'px';
- this.headerTable.style.top = Grid.scrollTop + 'px';
- this.idTable.style.left = Grid.scrollLeft + 'px';
- },
-
-//----------ajax request param method---------------------------------------------------------------------------
- createInplaceEditorParams : function(form, value) {
- var rowIndexEnd = form.id.indexOf('_col_', 0);
- var rowIndex = form.id.substring(this.rowIdBase.length, rowIndexEnd);
-
- var colIndexStart = rowIndexEnd + '_col_'.length;
- var colIndexEnd = form.id.indexOf('_form', 0);
- var colIndex = form.id.substring(colIndexStart, colIndexEnd);
- var jsonRowObj = this.rowDataToJsonObj(rowIndex);
-
- var targetColTitle = this.getColTitle(colIndex);
- jsonRowObj.each(function(j) {
- if (j.column == targetColTitle) {
- j.value = value;
- throw $break;
- }
- });
- var jsonRowText = JSON.stringify(jsonRowObj);
- var params = {
- rowData: jsonRowText,
- column: targetColTitle,
- value: value
- };
- return $H(params).toQueryString();
- },
-
- gridDataToJsonObj : function() {
- var rows = this.cellTable.rows;
- var jsonDataList = [];
- for (var i = 0; i < this.rowLength; i++) {
- var rowData = this.rowDataToJsonObj(i);
- jsonDataList.push(rowData);
- }
- return jsonDataList;
- },
-
- rowDataToJsonObj : function(index) {
- var jsonRowObj = [];
- var row = $A(this.cellTable.rows).detect(function(r) {return r.id.getSuffix() == index});
- for (var i = 0; i < this.colLength; i++) {
- var jsonCellObj = {};
- jsonCellObj['column'] = this.getColTitle(i);
- jsonCellObj['value'] = Element.collectTextNodes(row.cells[i]);
- jsonRowObj.push(jsonCellObj);
- }
- return jsonRowObj;
- },
-
- updateGridData : function() {
-
- var jsonDataText = JSON.stringify(this.gridDataToJsonObj());
- var params = 'id=' + encodeURIComponent(this.element.id) + '&data=' + encodeURIComponent(jsonDataText);
-
- new Ajax.Updater(
- this.options.updateGridReceiver,
- this.options.updateGridUrl,
- {
- parameters: params,
- evalScripts: true, asynchronous:true
-
- }
- );
- },
-
-//----------hierarchy grid method---------------------------------------------------------------------------
- setHierarchyRow : function(row, outlineLevel, outlineNum){
- row.outlineLevel = outlineLevel || 1;
- row.list = row.list || new Array();
- if (row.outlineLevel == 1) {
- this.topLevelList.push(row);
- row.outlineNum = outlineNum || this.topLevelList.length;
- } else {
- var parentRow = this.getParentRow(row);
- parentRow.list.push(row);
- var num = parentRow.length;
- row.outlineNum = outlineNum || parentRow.outlineNum + '.' + parentRow.list.length;
-
- }
-
- this.buildStateDiv(row.cells[this.hierarchyColIndex]);
- this.setOutlineIndent(row);
- this.setFontWeight(row);
- },
-
- buildStateDiv : function (cell) {
- var stateDiv = Builder.node('div');
- var valueDiv = Element.getElementsByClassName(cell, Grid.className.cellVal)[0];
- this.cssUtil.addClassNames(stateDiv, 'state');
- cell.insertBefore(stateDiv, valueDiv);
-
- if (document.all) {
- stateDiv.style.position = "absolute";
- } else {
- stateDiv.style.position = "relative";
- stateDiv.style.cssFloat = "left";
- }
- this.addStateClass(cell, stateDiv);
- Event.observe(stateDiv, 'click', this.toggleState.bindAsEventListener(this));
- },
-
- addStateClass : function (cell, stateDiv) {
- var row = cell.parentNode;
- if (row.list.length == 0) {
- this.cssUtil.addClassNames(stateDiv, 'stateEmpty');
- } else if (this.options.open){
- this.cssUtil.addClassNames(stateDiv, 'stateOpen');
- } else {
- this.cssUtil.addClassNames(stateDiv, 'stateClose');
- this.closeRow(row);
- }
- },
-
- toggleState : function(event) {
- var src = Event.element(event);
- var row = src.parentNode.parentNode;
-
- if (!Element.hasClassName(src, Grid.className.stateEmpty)) {
- if (Element.hasClassName(src, Grid.className.stateOpen)) {
- this.closeRow(row.list);
- this.cssUtil.removeClassNames(src, 'stateOpen');
- this.cssUtil.addClassNames(src, 'stateClose');
- } else {
- this.openRow(row.list);
- this.cssUtil.removeClassNames(src, 'stateClose');
- this.cssUtil.addClassNames(src, 'stateOpen');
- }
- }
- },
-
- openRow : function(list) {
- for (var i = 0; i < list.length; i++) {
- var row = list[i];
- Element.show(row);
- Element.show(this.getIdRow(row));
- var stateDiv = Element.getElementsByClassName(row.cells[this.hierarchyColIndex], Grid.className.state)[0];
- if (Element.hasClassName(stateDiv, Grid.className.stateOpen)) {
- this.openRow(row.list)
- }
- }
- },
-
- closeRow : function(list) {
- for (var i = 0; i < list.length; i++) {
- Element.hide(list[i]);
- Element.hide(this.getIdRow(list[i]));
- this.closeRow(list[i].list)
- }
- },
-
-
- showStateDiv : function(transport, element) {
- var row = Element.getParentByTagName(['TR'], element);
- var state = Element.getElementsByClassName(row, Grid.className.state)[0];
- Element.show(state);
- },
-
- hideStateDiv : function(event) {
- var src = Event.element(event);
- var row = Element.getParentByTagName(['TR'], src);
- var state = Element.getElementsByClassName(row, Grid.className.state)[0];
-
- Element.hide(state);
- },
-
- addHierarchyRow : function(index, values) {
- if (this.colLength == 0) {
- return;
- }
- var newRow = this.addRow(index, values);
-
- newRow.list = new Array();
- var previousRow = newRow.previousSibling;
- var parentRow = null;
- var parentList = null;
- var insertIndex = 0;
- if (!previousRow) {
- newRow.outlineLevel = 1;
- parentList = this.topLevelList;
- } else if (previousRow.list.length > 0) {
- newRow.outlineLevel = previousRow.outlineLevel + 1;
- parentRow = previousRow;
- parentList = parentRow.list;
- } else {
- newRow.outlineLevel = previousRow.outlineLevel;
- parentRow = this.getParentRow(previousRow);
- parentList = parentRow ? parentRow.list : this.topLevelList;
- insertIndex = parentList.indexOf(previousRow) + 1;
- }
- parentList.insert(insertIndex, newRow);
- this.buildStateDiv(newRow.cells[this.hierarchyColIndex]);
- for (var i = insertIndex; i < parentList.length; i++) {
- if (parentList[i].outlineLevel != 1) {
- parentList[i].outlineNum = parentRow.outlineNum + '.' + (i + 1);
- } else {
- parentList[i].outlineNum = i + 1;
- }
- this.setOutline(parentList[i]);
- }
-
- },
-
- deleteHierarchyRow : function(index) {
- if(isNaN(index) || index >= this.rowLength) {
- return;
- }
- var row = this.getRow(index);
- if (!row) {
- return;
- }
- var parentRow = this.getParentRow(row);
- var parentList = parentRow ? parentRow.list : this.topLevelList;
- var removeIndex = parentList.indexOf(row);
- var childList = row.list;
-
- for (var i = 0; i < childList.length; i++) {
- this.deleteChildRow(childList[i]);
- }
- parentList.remove(removeIndex);
- this.deleteRow(index);
-
- for (var i = removeIndex; i < parentList.length; i++) {
- var updateRow = parentList[i];
- if (updateRow.outlineLevel == 1) {
- updateRow.outlineNum = i + 1;
- } else {
- updateRow.outlineNum = this.getParentRow(updateRow).outlineNum + '.' + (i + 1);
- }
- this.setOutline(parentList[i]);
- }
- this.setFontWeight(parentRow);
- },
-
- deleteChildRow : function(childRow) {
- var list = childRow.list;
-
- for (var i = 0; i < list.length; i++) {
- this.deleteChildRow(list[i]);
- }
- this.deleteRow(childRow.rowIndex);
- },
-
- levelUp : function(row) {
- if (!row) {
- return;
- }
- var previousRow = row.previousSibling;
- if (row.outlineLevel == 1 || !previousRow) {
- return;
- }
-
- var parentRow = this.getParentRow(row);
- var currentList = parentRow.list;
-
- var newParentRow = this.getParentRow(parentRow);
- var targetList = newParentRow ? newParentRow.list : this.topLevelList;
-
- var currentIndex = currentList.indexOf(row);
- var targetIndex = targetList.indexOf(parentRow) + 1;
-
- row.outlineLevel -= 1;
- targetList.insert(targetIndex, row);
- currentList.remove(currentIndex);
-
- while (currentList[currentIndex]) {
- var moveRow = currentList[currentIndex];
- row.list.push(moveRow);
- currentList.remove(currentIndex);
- }
-
- if (row.outlineLevel != 1) {
- row.outlineNum = newParentRow.outlineNum + '.' + (targetIndex + 1);
- } else {
- row.outlineNum = targetIndex + 1;
- }
-
- this.setOutline(row);
-
- for (var i = targetIndex + 1; i < targetList.length; i++) {
- if (targetList[i].outlineLevel != 1) {
- targetList[i].outlineNum = newParentRow.outlineNum + '.' + (i + 1);
- } else {
- targetList[i].outlineNum = i + 1;
- }
- this.setOutline(targetList[i]);
- }
-
- this.setFontWeight(row);
- this.setFontWeight(parentRow);
- this.setFontWeight(newParentRow);
- this.setStateClass(row);
- this.setStateClass(previousRow);
- },
-
- levelDown : function(row) {
- if (!row) {
- return;
- }
- var previousRow = row.previousSibling;
- var parentRow = this.getParentRow(row);
- if (!previousRow || parentRow == previousRow) {
- return;
- }
- var currentList = (row.outlineLevel == 1) ? this.topLevelList : parentRow.list;
- var currentIndex = currentList.indexOf(row);
-
- row.outlineLevel += 1;
-
- var newParentRow = this.getParentRow(row);
- var targetList = newParentRow.list;
- var targetIndex = targetList.length;
-
- currentList.remove(currentIndex);
- targetList.push(row);
-
- row.outlineNum = newParentRow.outlineNum + '.' + (targetIndex + 1);
- this.setOutline(row);
- for (var i = currentIndex; i < currentList.length; i++) {
- if (currentList[i].outlineLevel != 1) {
- currentList[i].outlineNum = parentRow.outlineNum + '.' + (i + 1);
- } else {
- currentList[i].outlineNum = i + 1;
- }
- this.setOutline(currentList[i]);
- }
-
- for (var i = targetIndex + 1; i < targetList.length; i++) {
- targetList[i].outlineNum = newParentRow.outlineNum + '.' + (i + 1);
- this.setOutline(targetList[i]);
- }
-
- this.setFontWeight(row);
- this.setFontWeight(parentRow);
- this.setFontWeight(newParentRow);
- this.setStateClass(row);
- this.setStateClass(previousRow);
-
- },
-
- setStateClass : function(row) {
- if (!row.list) return;
- var stateDiv = Element.getElementsByClassName(row.cells[this.hierarchyColIndex], Grid.className.state)[0];
-
- if (Element.hasClassName(stateDiv, Grid.className.stateEmpty) && row.list.length > 0) {
- this.cssUtil.removeClassNames(stateDiv, 'stateEmpty');
- this.cssUtil.addClassNames(stateDiv, 'stateOpen');
- } else if (!Element.hasClassName(stateDiv, Grid.className.stateEmpty) && row.list.length == 0) {
- this.cssUtil.removeClassNames(stateDiv, 'stateOpen');
- this.cssUtil.addClassNames(stateDiv, 'stateEmpty');
- }
- },
-
- setOutline : function(row) {
- var childList = row.list;
- if (!childList) return;
- for(var i = 0; i < childList.length; i++) {
- var childRow = childList[i];
- childRow.outlineLevel = row.outlineLevel + 1;
- childRow.outlineNum = row.outlineNum + '.' + (i + 1);
- this.setOutline(childRow);
- }
- this.setOutlineIndent(row);
- },
-
- setOutlineIndent : function(row) {
- var cell = row.cells[this.hierarchyColIndex];
- if (!cell) {
- return;
- }
- var cellValueDiv = Element.getElementsByClassName(cell, Grid.className.cellVal)[0];
- var stateDiv = Element.getElementsByClassName(cell, Grid.className.state)[0];
- if (!stateDiv) return;
- var stateDivWidth = stateDiv.offsetWidth || this.stateDivWidth;
- var left = this.options.hierarchyIndent * (row.outlineLevel - 1);
- var valueLeft = document.all ? left + stateDivWidth : left;
- cellValueDiv.style.left = valueLeft + 'px';
- stateDiv.style.left = left + 'px';
- },
-
- setFontWeight : function(row) {
- if (row) {
- if (!row.list) return;
- if (row.list.length > 0){
- row.style.fontWeight = 'bold';
- } else {
- row.style.fontWeight = 'normal';
- }
- }
- },
-
- updateOutline : function(row) {
- var previousRow = row.previousSibling;
- var newParentRow = null;
- var insertIndex = 0;
- var newParentList = null;
-
- if (!previousRow.list) return;
- if (!previousRow) {
- newParentList = this.topLevelList;
- }else if(previousRow.list.length > 0) {
- newParentRow = previousRow;
- newParentList = newParentRow.list;
- } else {
- newParentRow = this.getParentRow(previousRow);
- newParentList = newParentRow ? newParentRow.list : this.topLevelList;
- insertIndex = newParentList.indexOf(previousRow) + 1;
- }
- var parentRow = this.getParentRowByIndex(row, this.targetRowIndex);
- var parentList = null;
-
- var outlineNumBase = '';
- if (parentRow) {
- parentList = parentRow.list;
- outlineNumBase = parentRow.outlineNum + '.';
- } else {
- parentList = this.topLevelList;
- if (!parentList) return;
- }
- var removeIndex = parentList.indexOf(row);
-
- if (parentList == newParentList && removeIndex < insertIndex) {
- insertIndex -= 1;
- parentList.remove(removeIndex);
- parentList.insert(insertIndex, row);
- for (var i = removeIndex; i < parentList.length; i++) {
- try {
- parentList[i].outlineNum = outlineNumBase + (i + 1);
- this.setOutline(parentList[i]);
- } catch (e) {}
- }
-
- } else {
- parentList.remove(removeIndex);
- newParentList.insert(insertIndex, row);
- for (var i = removeIndex; i < parentList.length; i++) {
- parentList[i].outlineNum = outlineNumBase + (i + 1);
- this.setOutline(parentList[i]);
- }
- var newOutlineNumBase = newParentRow ? newParentRow.outlineNum + '.' : '';
- var newOutlineLevelBase = newParentRow ? newParentRow.outlineLevel : 0;
- row.outlineNum = newOutlineNumBase + (insertIndex + 1);
- row.outlineLevel = newOutlineLevelBase + 1;
- for (var i = insertIndex; i < newParentList.length; i++) {
- newParentList[i].outlineNum = newOutlineNumBase + (i + 1);
- this.setOutline(newParentList[i]);
- }
- this.setOutline(row);
- }
- this.setFontWeight(row);
- this.setStateClass(row);
- if (parentRow) {
- this.setFontWeight(parentRow);
- this.setStateClass(parentRow);
- }
- if (newParentRow) {
- this.setFontWeight(newParentRow);
- this.setStateClass(newParentRow);
- }
- this.updateHierarchyRowLine(row);
- },
-
- updateHierarchyRowLine : function(row, existingRow) {
- if (!row.list) return;
- var rowIndex = row.rowIndex;
- var cellBody = this.cellTable.tBodies[0];
- var idBody = this.idTable.tBodies[0];
- if (!existingRow) {
- existingRow = cellBody.rows[rowIndex + 1]
- }
-
- for (var i = 0; i < row.list.length; i++) {
- if (!existingRow) {
- cellBody.appendChild(row.list[i]);
- idBody.appendChild(this.getIdRow(row.list[i]));
- } else {
- cellBody.insertBefore(row.list[i], existingRow);
- idBody.insertBefore(this.getIdRow(row.list[i]), this.getIdRow(existingRow));
- }
- this.updateHierarchyRowLine(row.list[i], existingRow);
- }
- },
-
- getParentRow : function(row) {
- if (row.outlineLevel == 1) {
- return null;
- }
-
- var previousRow = row.previousSibling;
- if (!previousRow) {
- return null;
- }
- try {
- while (previousRow.outlineLevel != (row.outlineLevel - 1)) {
- previousRow = previousRow.previousSibling;
- }
- return previousRow;
- } catch (e) {}
- },
-
- getParentRowByIndex : function(row, index) {
- if (row.outlineLevel == 1) {
- return null;
- }
- if (this.targetRowIndex) {
- for(var i = 0; i < this.targetRowIndex + 1; i++) {
- if (!this.cellTable.rows[i].list) return;
- if (this.cellTable.rows[i].list.indexOf(row) != -1) {
- return this.cellTable.rows[i];
- }
- }
- }
- return null;
- },
-
- getPreviousRootRow : function(row) {
- var previousRow = row.previousSibling;
- if (!previousRow) {
- return;
- }
- while (previousRow.outlineLevel != 1) {
- previousRow = previousRow.previousSibling;
- }
-
- return previousRow;
- },
-
- isParentRow : function(row, parentRow) {
- var temp = this.getParentRow(row);
- if (!temp) {
- return false;
- } else if (temp == parentRow) {
- return true;
- } else {
- return this.isParentRow(temp, parentRow);
- }
- }
-}
+// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+Grid = Class.create();\r
+Grid.className = {\r
+ container: 'grid_container',\r
+ \r
+ baseTable: 'grid_baseTable',\r
+ baseRow: 'grid_baseRow',\r
+ baseCell: 'grid_baseCell',\r
+ \r
+ headerTable: 'grid_headerTable',\r
+ headerRow: 'grid_headerRow',\r
+ headerCell: 'grid_headerCell',\r
+ headerCellDrag: 'grid_headerCellDrag',\r
+ headerCellSort: 'grid_headerCellVal',\r
+ \r
+ idTable: 'grid_idTable',\r
+ idRow: 'grid_idRow',\r
+ idCell: 'grid_idCell',\r
+ idCellVal: 'grid_idCellVal',\r
+ \r
+ cellTable: 'grid_cellTable',\r
+ cellTbody: 'grid_cellTbody',\r
+ cellRow: 'grid_cellRow',\r
+ cell: 'grid_cell',\r
+ cellVal: 'grid_cellVal',\r
+ cellSelected: 'grid_cellSelected',\r
+ state: 'grid_state',\r
+ stateEmpty: 'grid_stateEmpty',\r
+ stateOpen: 'grid_stateOpen',\r
+ stateClose: 'grid_stateClose',\r
+ \r
+ inplaceEditor: 'grid_inplaceEditor'\r
+}\r
+Grid.scrollTop = 0;\r
+Grid.scrollLeft = 0;\r
+Grid.options = {}\r
+Grid.options.baseTable = {\r
+ border:1,\r
+ frame : 'border',\r
+ cellSpacing:0,\r
+ cellPadding:0\r
+}\r
+Grid.options.headerTable = {\r
+ border:1,\r
+ frame : 'border',\r
+ cellSpacing:0,\r
+ cellPadding:0\r
+}\r
+Grid.options.idTable = {\r
+ border:1,\r
+ frame : 'border',\r
+ cellSpacing:0,\r
+ cellPadding:0\r
+}\r
+Grid.options.cellTable = {\r
+ border:1,\r
+ frame : 'border',\r
+ cellSpacing:0,\r
+ cellPadding:0\r
+}\r
+Grid.prototype = {\r
+ \r
+ initialize : function(element) {\r
+ \r
+ this.element = $(element);\r
+ Element.setStyle(this.element, {visibility: 'hidden'});\r
+ Element.hide(this.element);\r
+\r
+ var options = Object.extend({\r
+ cssPrefix: 'custum_',\r
+ cellMinWidth: 10,\r
+ cellMinHeight: 10,\r
+ cellDefaultWidth: 72,\r
+ cellDefaultHeight: 25,\r
+ defaultRowLength: 10,\r
+ baseWidth: 40,\r
+ baseHeight: 25,\r
+ baseTop: 0,\r
+ baseLeft: 0,\r
+ cellEditUrl: '',\r
+ updateGridUrl: '',\r
+ updateGridReceiver: '',\r
+ hierarchy: false,\r
+ hierarchyCol: false,\r
+ hierarchyIndent: 20,\r
+ sortOptions: {}\r
+ }, arguments[1] || {});\r
+ \r
+ this.options = options;\r
+ this.custumCss = CssUtil.appendPrefix(options.cssPrefix, Grid.className);\r
+ this.cssUtil = new CssUtil([Grid.className, this.custumCss]);\r
+ this.cssUtil.addClassNames(this.element, 'container');\r
+ this.hierarchyCol = this.options.hierarchyCol ? $(this.options.hierarchyCol) : false;\r
+ this.hierarchyColIndex = this.hierarchyCol ? this.hierarchyCol.cellIndex : 0;\r
+ Element.makePositioned(this.element);\r
+ Position.includeScrollOffsets = true;\r
+ this.stateDivWidth = parseInt(CssUtil.getCssRuleBySelectorText('.' + Grid.className.state).style.width, 10);\r
+ \r
+ this.marginSize = this.options.marginSize ? this.options.marginSize : 4;\r
+ this.stateIndent = 15;\r
+ \r
+ this.rowIdBase = this.element.id + '_row_';\r
+ this.topLevelList = new Array();\r
+ this.removeList = new Array();\r
+ this.build();\r
+ this.removeList.each(function(r) {\r
+ r.parentNode.removeChild(r);\r
+ });\r
+ var sortOptions = {\r
+ relate : this.idTable,\r
+ handle:this.headerTable,\r
+ callBack:this.finishSort.bind(this)\r
+ };\r
+ sortOptions = $H(sortOptions).merge(this.options.sortOptions);\r
+ this.sortTable = new SortableTableGridEx(this.cellTable, sortOptions);\r
+ Element.setStyle(this.element, {visibility: 'visible'});\r
+ Element.show(this.element);\r
+ },\r
+ \r
+ build: function() { \r
+ Element.cleanWhitespace(this.element);\r
+ this.cellTable = this.element.childNodes[0];\r
+ Element.cleanWhitespace(this.cellTable);\r
+ \r
+ this.colLength = this.cellTable.tHead.rows[0].cells.length;\r
+ this.rowLength = this.cellTable.tBodies[0].rows.length;\r
+ if (this.rowLength == 0)this.rowLength = this.options.defaultRowLength;\r
+ this.buildBaseTable();\r
+ this.buildHeaderTable();\r
+ this.buildIdTable();\r
+ this.buildCellTable();\r
+ \r
+ Event.observe(this.element, 'scroll', this.fixTablePosition.bindAsEventListener(this));\r
+ },\r
+ \r
+ buildBaseTable: function() {\r
+\r
+ this.baseTable = Builder.node('table', Grid.options.baseTable);\r
+ this.cssUtil.addClassNames(this.baseTable, 'baseTable');\r
+ with (this.baseTable.style) {\r
+ width = this.options.baseWidth + 'px';\r
+ height = this.options.baseHeight + 'px';\r
+ position = 'absolute';\r
+ top = this.options.baseTop + 'px';\r
+ left = this.options.baseLeft + 'px';\r
+ }\r
+ \r
+ var row = this.baseTable.insertRow(0);\r
+ var cell = row.insertCell(0);\r
+ \r
+ this.cssUtil.addClassNames(row, 'baseRow');\r
+ this.cssUtil.addClassNames(cell, 'baseCell');\r
+ \r
+ this.element.appendChild(this.baseTable);\r
+ },\r
+ \r
+ buildHeaderTable: function() {\r
+ this.headerTable = Builder.node('table', Grid.options.headerTable);\r
+ this.cssUtil.addClassNames(this.headerTable, 'headerTable');\r
+ \r
+ var thead = this.cellTable.tHead;\r
+ var row = thead.rows[0];\r
+ row.id = this.element.id + '_headerTable_row';\r
+ var cells = row.cells;\r
+ Element.cleanWhitespace(thead);\r
+ Element.cleanWhitespace(row);\r
+ \r
+ this.cssUtil.addClassNames(row, 'headerRow');\r
+ for (var i = 0; i < cells.length; i++) {\r
+ var cell = cells[i];\r
+ var value = cell.firstChild;\r
+ var title = cell.innerHTML;\r
+ this.buildHeaderCell(cell, title, i);\r
+ this.removeList.push(value);\r
+ }\r
+ this.headerTable.appendChild(thead);\r
+ with (this.headerTable.style) {\r
+ width = this.options.cellDefaultWidth * this.colLength + 'px';\r
+ height = this.baseTable.style.height;\r
+ position= 'absolute';\r
+ top = Element.getStyle(this.baseTable, 'top');\r
+ left = parseInt(Element.getStyle(this.baseTable, 'left')) + parseInt(Element.getStyle(this.baseTable, 'width')) + 'px';\r
+ }\r
+ this.element.appendChild(this.headerTable);\r
+ Sortable.create(\r
+ row, \r
+ {\r
+ tag:'td',\r
+ handle:Grid.className.headerCellDrag,\r
+ constraint:true,\r
+ overlap:'horizontal',\r
+ scroll:this.element,\r
+ onUpdate:this.updateCellLine.bind(this)\r
+ });\r
+ },\r
+ \r
+ buildHeaderCell : function(cell, title, index) {\r
+\r
+ cell.id = this.element.id + '_header_col_' + index;\r
+ \r
+ var drag = Builder.node('div');\r
+ var sort = Builder.node('div');\r
+ \r
+ this.cssUtil.addClassNames(cell, 'headerCell');\r
+ this.cssUtil.addClassNames(drag, 'headerCellDrag');\r
+ this.cssUtil.addClassNames(sort, 'headerCellSort');\r
+ \r
+ cell.style.width = this.options.cellDefaultWidth + 'px';\r
+ var dragWidth = parseInt(Element.getStyle(cell, 'width')) - (this.marginSize * 2);\r
+ var sortWidth = dragWidth - (this.marginSize * 2);\r
+ var cellHeight = this.options.baseHeight - (Grid.options.headerTable.border * 4);\r
+ with (drag.style) {\r
+ width = dragWidth + 'px';\r
+ height = cellHeight + 'px';\r
+ marginLeft = this.marginSize + 'px';\r
+ marginRight = this.marginSize + 'px';\r
+ }\r
+ with (sort.style) {\r
+ width = sortWidth + 'px';\r
+ height = cellHeight + 'px';\r
+ marginLeft = this.marginSize + 'px';\r
+ marginRight = this.marginSize + 'px';\r
+ }\r
+ \r
+ sort.innerHTML = title;\r
+ drag.appendChild(sort);\r
+ cell.appendChild(drag);\r
+ \r
+ new ResizeableGridEx(cell, {minWidth: this.options.cellMinWidth, top:0,right:2, bottom:0, left:0 ,draw:this.updateCellWidth.bind(this)});\r
+ Event.observe(cell, 'mousedown', this.setSelectedColumn.bindAsEventListener(this));\r
+ Event.observe(drag, 'mousedown', this.setSelectedColumn.bindAsEventListener(this));\r
+ Event.observe(sort, 'mousedown', this.setSelectedColumn.bindAsEventListener(this)); \r
+ },\r
+ \r
+ buildIdTable: function() {\r
+\r
+ this.idTable = Builder.node('table', Grid.options.idTable);\r
+ this.cssUtil.addClassNames(this.idTable, 'idTable');\r
+ for (var i = 0; i < this.rowLength; i++) {\r
+ \r
+ var row = this.idTable.insertRow(i);\r
+ this.buildIdRow(row, i);\r
+ }\r
+ \r
+ with(this.idTable.style) {\r
+ width = this.options.baseWidth + 'px';\r
+ position = 'absolute';\r
+ top = parseInt(Element.getStyle(this.baseTable, 'top')) + parseInt(Element.getStyle(this.baseTable, 'height')) + 'px';\r
+ left = Element.getStyle(this.baseTable, 'left');\r
+ }\r
+ \r
+ this.element.appendChild(this.idTable);\r
+ var tbody = this.idTable.tBodies[0];\r
+ tbody.id = this.element.id + '_idTable_tbody';\r
+ Sortable.create(\r
+ tbody, \r
+ {\r
+ tag:'tr',\r
+ handle:Grid.className.idCellVal,\r
+ scroll:this.element,\r
+ constraint:true,\r
+ overlap:'vertical',\r
+ onUpdate:this.updateRowLine.bind(this)\r
+ });\r
+ },\r
+ \r
+ buildIdRow : function(row, index) {\r
+ row.id = this.rowIdBase + '_id_' + index;\r
+ \r
+ var cell = row.insertCell(0);\r
+ var valueDiv = Builder.node('div');\r
+\r
+ this.cssUtil.addClassNames(row, 'idRow');\r
+ this.cssUtil.addClassNames(cell, 'idCell');\r
+ this.cssUtil.addClassNames(valueDiv, 'idCellVal'); \r
+ \r
+ with (cell.style) {\r
+ width = this.options.baseWidth + 'px';\r
+ height = this.options.cellDefaultHeight + 'px';\r
+ }\r
+ with (valueDiv.style) {\r
+ marginTop = this.marginSize + 'px';\r
+ marginBottom = this.marginSize + 'px';\r
+ width = this.options.baseWidth - (Grid.options.idTable.border * 4) + 'px';\r
+ height = this.options.cellDefaultHeight - (this.marginSize * 2) + 'px';\r
+ }\r
+\r
+ valueDiv.innerHTML = index + 1;\r
+ cell.appendChild(valueDiv);\r
+ \r
+ new ResizeableGridEx(cell, {minHeight: this.options.cellMinHeight, top:0, right: 0, bottom: 2, left: 0, draw:this.updateCellHeight.bind(this)});\r
+ \r
+ Event.observe(row, 'mousedown', this.setSelectedRow.bindAsEventListener(this));\r
+ Event.observe(cell, 'mousedown', this.setSelectedRow.bindAsEventListener(this));\r
+ Event.observe(valueDiv, 'mousedown', this.setSelectedRow.bindAsEventListener(this)); \r
+ },\r
+ \r
+ buildCellTable: function() {\r
+ var tbody = this.cellTable.tBodies[0];\r
+ Element.cleanWhitespace(tbody);\r
+ with(this.cellTable){\r
+ border = Grid.options.cellTable.border;\r
+ cellSpacing = Grid.options.cellTable.cellSpacing;\r
+ cellPadding = Grid.options.cellTable.cellPadding;\r
+ }\r
+ this.cssUtil.addClassNames(this.cellTable, 'cellTable');\r
+ this.cssUtil.addClassNames(tbody, 'cellTbody');\r
+ this.element.appendChild(this.cellTable);\r
+ var rows = this.cellTable.rows;\r
+ \r
+ if (!rows || rows.length == 0) {\r
+ for(var i = 0; i < this.rowLength; i++) {\r
+ \r
+ var newRow = this.cellTable.insertRow(i);\r
+ newRow.id = this.rowIdBase + i;\r
+ this.cssUtil.addClassNames(newRow, 'cellRow');\r
+ \r
+ for (var j = 0; j < this.colLength; j++) {\r
+ var newCell = newRow.insertCell(j);\r
+ this.buildCell(newCell, j, "");\r
+ }\r
+ if (this.options.hierarchy) {\r
+ this.setHierarchyRow(newRow);\r
+ }\r
+ } \r
+ \r
+ } else {\r
+ for (var i = 0; i < this.rowLength; i++) {\r
+ var row = rows[i];\r
+ Element.cleanWhitespace(row);\r
+ this.cssUtil.addClassNames(row, 'cellRow');\r
+ row.id = this.rowIdBase + i;\r
+ var cells = row.cells;\r
+\r
+ for (var j = 0; j < cells.length; j++) {\r
+ var cell = cells[j];\r
+ Element.cleanWhitespace(cell);\r
+ this.buildCell(cell, j, Element.collectTextNodes(cell));\r
+ this.removeList.push(cell.firstChild);\r
+ }\r
+ if (this.options.hierarchy) {\r
+ this.setHierarchyRow(row);\r
+ } \r
+ }\r
+ }\r
+ \r
+ with (this.cellTable.style) {\r
+ width = this.options.cellDefaultWidth * this.colLength + 'px';\r
+ position = 'absolute';\r
+ top = parseInt(Element.getStyle(this.baseTable, 'top')) + parseInt(Element.getStyle(this.baseTable, 'height')) + 'px';\r
+ left = parseInt(Element.getStyle(this.baseTable, 'left')) + parseInt(Element.getStyle(this.baseTable, 'width')) + 'px';\r
+ }\r
+ \r
+ this.cellTable.getIdRow = this.getIdRow.bind(this); \r
+ },\r
+\r
+ buildCell : function(cell, cellIdIndex, value) {\r
+\r
+ var cellValueDiv = Builder.node('div');\r
+ cellValueDiv.innerHTML = value;\r
+ \r
+ cell.appendChild(cellValueDiv);\r
+ cell.id = cell.parentNode.id + '_col_' + cellIdIndex;\r
+ \r
+ this.cssUtil.addClassNames(cell, 'cell');\r
+ this.cssUtil.addClassNames(cellValueDiv, 'cellVal');\r
+ \r
+ with (cell.style) {\r
+ width = Element.getStyle(this.getHeaderCell(cell), 'width');\r
+ height = Element.getStyle(this.getIdRow(cell.parentNode).cells[0], 'height');\r
+ } \r
+ with (cellValueDiv.style) {\r
+ width = cell.style.width;\r
+ height = cell.style.height;\r
+ marginTop = '0px';\r
+ marginBottom = '0px';\r
+ }\r
+ \r
+ Event.observe(cell, 'click', this.setSelectedCell.bindAsEventListener(this));\r
+ \r
+ var ajax = new Ajax.InPlaceEditor(cellValueDiv, this.options.cellEditUrl,\r
+ {\r
+ formClassName: this.cssUtil.joinClassNames('inplaceEditor'), \r
+ rows: 2, \r
+ cols:12, \r
+ okButton: false, \r
+ cancelLink:false, \r
+ submitOnBlur:true, \r
+ hoverClassName: "cellHover",\r
+ highlightcolor: "#becfeb",\r
+ highlightendcolor: "#becfeb",\r
+ onComplete: this.showStateDiv.bind(this),\r
+ callback : this.createInplaceEditorParams.bind(this),\r
+ formId : cell.id + '_form'\r
+ }\r
+ );\r
+ cellValueDiv.ajax = ajax;\r
+ Event.stopObserving(cellValueDiv, 'click', ajax.onclickListener);\r
+ Event.stopObserving(cellValueDiv, 'mouseover', ajax.mouseoverListener);\r
+ Event.stopObserving(cellValueDiv, 'mouseout', ajax.mouseoutListener);\r
+ \r
+\r
+ Event.observe(cellValueDiv, 'dblclick', this.setTextAreaSize.bindAsEventListener(this));\r
+ if (this.options.hierarchy && cell.cellIndex == this.hierarchyColIndex) {\r
+ Event.observe(cellValueDiv, 'dblclick', this.hideStateDiv.bindAsEventListener(this));\r
+ }\r
+ Event.observe(cellValueDiv, 'dblclick', ajax.onclickListener);\r
+ \r
+ },\r
+ \r
+ addColumn: function(index, colTitle, values) {\r
+ var headerRow = this.headerTable.rows[0];\r
+ var insertIndex = (!isNaN(index)) ? index : this.colLength;\r
+ var colIdIndex = this.colLength;\r
+ var headerCell = headerRow.insertCell(insertIndex);\r
+ this.buildHeaderCell(headerCell, colTitle, insertIndex);\r
+ \r
+ var rows = this.cellTable.rows;\r
+ var idRows = this.idTable.rows;\r
+ for (var i = 0; i < rows.length; i++) {\r
+ \r
+ var cell = rows[i].insertCell(insertIndex);\r
+ var cellValue = "";\r
+ if (values && values[i]) {\r
+ cellValue = values[i];\r
+ }\r
+ this.buildCell(cell, colIdIndex, cellValue);\r
+ }\r
+ \r
+ this.headerTable.style.width = parseInt(Element.getStyle(this.headerTable, 'width')) + this.options.cellDefaultWidth + 'px';\r
+ this.cellTable.style.width = this.headerTable.style.width;\r
+ \r
+ var sortableOptions = Sortable.options(headerRow);\r
+ \r
+ sortableOptions.draggables.push(\r
+ new Draggable(\r
+ headerCell, \r
+ {\r
+ revert: true,\r
+ constraint: true,\r
+ scroll: this.element,\r
+ handle: Element.getElementsByClassName(headerCell, Grid.className.headerCellDrag)[0]\r
+ }\r
+ )\r
+ );\r
+ Droppables.add(headerCell, {overlap:'horizontal', containment:headerRow, onHover:Sortable.onHover, greedy:true});\r
+ sortableOptions.droppables.push(headerCell); \r
+ this.sortTable.addEvent(Element.getElementsByClassName(headerCell, Grid.className.headerCellSort)[0]);\r
+ this.colLength += 1;\r
+ },\r
+ \r
+ deleteColumn : function(index) {\r
+ if((isNaN(index)) || index >= this.colLength) {\r
+ return;\r
+ }\r
+ var headerRow = this.headerTable.rows[0];\r
+ if (!headerRow) return;\r
+ var headerCell = headerRow.cells[index];\r
+ if (!headerCell) return;\r
+ \r
+ var width = headerCell.offsetWidth;\r
+ var rows = this.cellTable.rows;\r
+ headerRow.deleteCell(index);\r
+ \r
+ for (var i = 0; i < rows.length; i++) {\r
+ rows[i].deleteCell(index);\r
+ }\r
+ \r
+ var headerTableWidth = parseInt(Element.getStyle(this.headerTable, 'width')) - width;\r
+ \r
+ this.headerTable.style.width = headerTableWidth >= 0 ? headerTableWidth + 'px' : '0px';\r
+ this.cellTable.style.width = this.headerTable.style.width;\r
+ this.colLength -= 1;\r
+ this.fixTablePosition();\r
+ },\r
+ \r
+ addRow : function(index, values) {\r
+ var insertIndex = (!isNaN(index)) ? index : this.idTable.rows.length;\r
+ var rowIdIndex = this.idTable.rows.length;\r
+ var idRow = this.idTable.insertRow(index);\r
+ idRow.id = this.rowIdBase + '_id_' + rowIdIndex;\r
+ this.buildIdRow(idRow, rowIdIndex);\r
+ this.updateId();\r
+ \r
+ var cellRow = this.cellTable.insertRow(insertIndex);\r
+ cellRow.id = this.rowIdBase + rowIdIndex;\r
+ this.cssUtil.addClassNames(cellRow, 'cellRow');\r
+ var headerCells = this.headerTable.rows[0].cells;\r
+ \r
+ for (var i = 0; i < headerCells.length; i++) {\r
+ var headerCell = headerCells[i];\r
+ var colIdIndex = headerCell.id.substring(headerCell.id.indexOf('_col_',0) + '_col_'.length);\r
+ var cell = cellRow.insertCell(i);\r
+ var cellValue = (values && values[i]) ? values[i] : "";\r
+ this.buildCell(cell, colIdIndex, cellValue);\r
+ }\r
+\r
+ this.sortTable.defaultOrder.insert(index, cellRow);\r
+ \r
+ var idTbody = this.idTable.tBodies[0];\r
+ var sortableOptions = Sortable.options(idTbody);\r
+ \r
+ sortableOptions.draggables.push(\r
+ new Draggable(\r
+ idRow,\r
+ {\r
+ revert: true,\r
+ constraint: true,\r
+ scroll: this.element,\r
+ handle: Element.getElementsByClassName(idRow, Grid.className.idCellVal)[0]\r
+ }\r
+ )\r
+ );\r
+ Droppables.add(idRow, {overlap:'vertical', containment:idTbody, onHover:Sortable.onHover, greedy:true});\r
+ sortableOptions.droppables.push(idRow); \r
+ this.rowLength += 1;\r
+ return cellRow;\r
+ },\r
+ \r
+ deleteRow : function(index) {\r
+ if(isNaN(index) || index >= this.rowLength) {\r
+ return;\r
+ }\r
+ \r
+ var targetId = null;\r
+ if (this.cellTable.rows[index])\r
+ targetId = this.cellTable.rows[index].id;\r
+ else\r
+ return;\r
+ \r
+ this.sortTable.defaultOrder.reverse();\r
+ var newOrder = new Array();\r
+ \r
+ for (var i = 0; this.sortTable.defaultOrder.length > 0; i++) {\r
+ var row = this.sortTable.defaultOrder.pop();\r
+ if (row.id == targetId) {\r
+ continue;\r
+ }\r
+ newOrder.push(row);\r
+ }\r
+ \r
+ this.sortTable.defaultOrder = newOrder;\r
+ this.idTable.deleteRow(index);\r
+ this.cellTable.deleteRow(index);\r
+ \r
+ this.fixTablePosition();\r
+ this.rowLength -= 1;\r
+ this.updateId();\r
+ },\r
+ \r
+ getHeaderCell : function(cell) {\r
+ return this.headerTable.rows[0].cells[cell.cellIndex];\r
+ },\r
+ \r
+ getCells : function(index) {\r
+ var rows = this.cellTable.rows;\r
+ var columns = new Array();\r
+ for (var i = 0; i < rows.length; i++){\r
+ columns.push(rows[i].cells[index]);\r
+ }\r
+ return columns;\r
+ },\r
+ \r
+ getRow : function(index) {\r
+ return this.cellTable.rows[index];\r
+ },\r
+ \r
+ getIdRow : function(cellRow) {\r
+ var id = cellRow.id;\r
+ var index = id.substring(this.rowIdBase.length);\r
+ var targetRow = $(this.rowIdBase + '_id_' + index);\r
+ return targetRow;\r
+ },\r
+ \r
+ getColTitle : function(index) {\r
+ var headerCell = this.headerTable.rows[0].cells[index];\r
+ var title = Element.collectTextNodes(headerCell);\r
+ return title;\r
+ },\r
+ \r
+ finishSort : function() {\r
+ for (var i = 0; i < this.cellTable.rows.length; i++) {\r
+ this.idTable.tBodies[0].appendChild(this.getIdRow(this.cellTable.rows[i]));\r
+ }\r
+ this.updateId();\r
+ },\r
+ \r
+ setSelectedCell : function(event) {\r
+ this.removeSelectedClasses();\r
+ var src = Event.element(event);\r
+\r
+ if (src.tagName.toUpperCase() != 'TH' && src.tagName.toUpperCase() != 'TD') { \r
+ src = Element.getParentByTagName(['TH,TD'], src);\r
+ } \r
+ \r
+ this.targetCell = src;\r
+ \r
+ if (this.targetCell) {\r
+ this.targetColIndex = this.targetCell.cellIndex;\r
+ this.targetRowIndex = this.targetCell.parentNode.rowIndex;\r
+ this.targetColumn = this.getCells(this.targetColIndex);\r
+ this.targetRow = this.getRow(this.targetRowIndex);\r
+ }\r
+ \r
+ this.cssUtil.addClassNames(this.targetCell, 'cellSelected');\r
+ var childNodes = Element.getTagNodes(this.targetCell, true); \r
+ for (var i = 0; i < childNodes.length; i++) {\r
+ this.cssUtil.addClassNames(childNodes[i], 'cellSelected');\r
+ }\r
+ },\r
+ \r
+ setSelectedColumn : function(event) {\r
+ this.removeSelectedClasses();\r
+ \r
+ this.targetCell = null;\r
+ this.targetRowIndex = null;\r
+ this.targetRow = null;\r
+ this.targetIdRow = null;\r
+ var src = Event.element(event);\r
+ if (src && (src.tagName.toUpperCase() == 'TH' || src.tagName.toUpperCase() == 'TD')) { \r
+ this.targetHeaderCell = src;\r
+ } else {\r
+ this.targetHeaderCell = Element.getParentByTagName(['TH,TD'], src);\r
+ }\r
+ if (this.targetHeaderCell) {\r
+ this.targetColIndex = this.targetHeaderCell.cellIndex;\r
+ this.targetColumn = this.getCells(this.targetColIndex);\r
+ this.cssUtil.addClassNames(this.targetHeaderCell, 'cellSelected');\r
+ var childNodes = Element.getTagNodes(this.targetHeaderCell, true);\r
+ for (var i = 0; i < childNodes.length; i++) {\r
+ this.cssUtil.addClassNames(childNodes[i], 'cellSelected');\r
+ }\r
+ for(var i = 0; i < this.targetColumn.length; i++) {\r
+ this.cssUtil.addClassNames(this.targetColumn[i], 'cellSelected');\r
+ var cellChildNodes = Element.getTagNodes(this.targetColumn[i], true); \r
+ for (var j = 0; j < cellChildNodes.length; j++) {\r
+ this.cssUtil.addClassNames(cellChildNodes.length[j], 'cellSelected');\r
+ }\r
+ }\r
+ }\r
+ },\r
+\r
+ setSelectedRow : function(event) {\r
+ this.removeSelectedClasses();\r
+ var src = Event.element(event);\r
+ if (src && src.tagName.toUpperCase() == 'TR') { \r
+ this.targetIdRow = src;\r
+ } else {\r
+ this.targetIdRow = Element.getParentByTagName(['TR'], src);\r
+ }\r
+ if (this.targetIdRow) {\r
+ this.targetRowIndex = this.targetIdRow.rowIndex;\r
+ this.targetRow = this.getRow(this.targetRowIndex);\r
+ \r
+ this.cssUtil.addClassNames(this.targetRow, 'cellSelected');\r
+ var childNodes = Element.getTagNodes(this.targetRow, true);\r
+ for (var i = 0; i < childNodes.length; i++) {\r
+ this.cssUtil.addClassNames(childNodes[i], 'cellSelected');\r
+ }\r
+ this.cssUtil.addClassNames(this.targetIdRow, 'cellSelected');\r
+ childNodes = Element.getTagNodes(this.targetIdRow, true);\r
+ for (var i = 0; i < childNodes.length; i++) {\r
+ this.cssUtil.addClassNames(childNodes[i], 'cellSelected');\r
+ } \r
+ }\r
+ \r
+ },\r
+ \r
+ removeSelectedClasses : function() {\r
+ if (this.targetHeaderCell) {\r
+ this.cssUtil.removeClassNames(this.targetHeaderCell, 'cellSelected');\r
+ var childNodes = Element.getTagNodes(this.targetHeaderCell, true);\r
+ for (var i = 0; i < childNodes.length; i++) {\r
+ this.cssUtil.removeClassNames(childNodes[i], 'cellSelected');\r
+ }\r
+ for(var i = 0; i < this.targetColumn.length; i++) {\r
+ this.cssUtil.removeClassNames(this.targetColumn[i], 'cellSelected');\r
+ var cellChildNodes = Element.getTagNodes(this.targetColumn[i], true); \r
+ for (var j = 0; j < cellChildNodes.length; j++) {\r
+ this.cssUtil.removeClassNames(cellChildNodes.length[j], 'cellSelected');\r
+ }\r
+ }\r
+ \r
+ }\r
+ if (this.targetCell) {\r
+ this.cssUtil.removeClassNames(this.targetCell, 'cellSelected');\r
+ var childNodes = Element.getTagNodes(this.targetCell, true); \r
+ for (var i = 0; i < childNodes.length; i++) {\r
+ this.cssUtil.removeClassNames(childNodes[i], 'cellSelected');\r
+ }\r
+ \r
+ }\r
+ \r
+ if (this.targetRow) {\r
+ this.cssUtil.removeClassNames(this.targetRow, 'cellSelected');\r
+ var childNodes = Element.getTagNodes(this.targetRow, true);\r
+ for (var i = 0; i < childNodes.length; i++) {\r
+ this.cssUtil.removeClassNames(childNodes[i], 'cellSelected');\r
+ }\r
+ this.cssUtil.removeClassNames(this.targetIdRow, 'cellSelected');\r
+ childNodes = Element.getTagNodes(this.targetIdRow, true);\r
+ for (var i = 0; i < childNodes.length; i++) {\r
+ this.cssUtil.removeClassNames(childNodes[i], 'cellSelected');\r
+ } \r
+ }\r
+ \r
+ this.targetHeaderCell = null;\r
+ this.targetColumn = null;\r
+ this.targetColIndex = null;\r
+ this.targetCell = null;\r
+ this.targetRowIndex = null;\r
+ this.targetRow = null;\r
+ this.targetIdRow = null; \r
+ },\r
+ \r
+ updateId : function() {\r
+ var rows = this.idTable.rows;\r
+ for (var i = 0; i < rows.length; i++) {\r
+ var idValue = document.getElementsByClassName(this.custumCss.idCellVal, rows[i])[0];\r
+ \r
+ idValue.innerHTML = i + 1;\r
+ }\r
+ },\r
+ \r
+ updateRowLine : function(target) {\r
+ var targetCellRow = this.cellTable.rows[this.targetRowIndex];\r
+ var updateRowIndex = this.targetIdRow.rowIndex;\r
+ var cellTableBody = targetCellRow.parentNode;\r
+ var cellTableRows = cellTableBody.rows;\r
+ \r
+ if (this.options.hierarchy) {\r
+ var checkRow = cellTableBody.rows[this.targetIdRow.rowIndex];\r
+ if (this.isParentRow(checkRow, targetCellRow)) {\r
+ var idBody = this.idTable.tBodies[0];\r
+ idBody.insertBefore(this.targetIdRow, idBody.rows[this.targetRowIndex]);\r
+ return;\r
+ }\r
+ }\r
+ if (updateRowIndex == cellTableRows.length - 1) {\r
+ cellTableBody.appendChild(targetCellRow);\r
+ } else if (this.targetRowIndex < updateRowIndex) {\r
+ cellTableBody.insertBefore(targetCellRow, cellTableRows[updateRowIndex + 1]);\r
+ } else {\r
+ cellTableBody.insertBefore(targetCellRow, cellTableRows[updateRowIndex]);\r
+ }\r
+ if (this.options.hierarchy) {\r
+ this.updateOutline(targetCellRow);\r
+ }\r
+ this.targetRowIndex = updateRowIndex;\r
+ this.updateId();\r
+ },\r
+ updateCellLine : function(target){\r
+ var targetCells = this.getCells(this.targetColIndex);\r
+ var updateColIndex = this.targetHeaderCell.cellIndex;\r
+ \r
+ var rows = this.cellTable.rows;\r
+ \r
+ for (var i = 0; i < rows.length; i++) {\r
+ var cells = rows[i].cells;\r
+ var targetCell = targetCells[i];\r
+ \r
+ if (updateColIndex == cells.length -1) {\r
+ rows[i].appendChild(targetCell);\r
+ } else if (this.targetColIndex < updateColIndex) {\r
+ rows[i].insertBefore(targetCell, cells[updateColIndex + 1]);\r
+ } else {\r
+ rows[i].insertBefore(targetCell, cells[updateColIndex]);\r
+ }\r
+ }\r
+ this.targetColIndex = updateColIndex;\r
+ },\r
+ \r
+ updateCellWidth : function(newStyle, headColumn) {\r
+ \r
+ if(newStyle.width > this.options.cellMinWidth) {\r
+ var dragDiv = Element.getElementsByClassName(headColumn, Grid.className.headerCellDrag)[0];\r
+ var sortDiv = Element.getElementsByClassName(headColumn, Grid.className.headerCellSort)[0];\r
+ var val = newStyle.width - (parseInt(Element.getStyle(headColumn, 'width')));\r
+ \r
+ val = parseInt(val);\r
+ \r
+ this.headerTable.style.width = (parseInt(Element.getStyle(this.headerTable, 'width')) + val) + 'px';\r
+ \r
+ dragDiv.style.width = newStyle.width - (this.marginSize * 2) + 'px';\r
+ sortDiv.style.width = parseInt(Element.getStyle(dragDiv, 'width')) - (this.marginSize * 2) + 'px';\r
+ \r
+ var index = headColumn.cellIndex ;\r
+ var rows = this.cellTable.rows;\r
+\r
+ this.cellTable.style.width = this.headerTable.style.width\r
+ \r
+ for(var i = 0; i < rows.length; i++){\r
+ var cell = rows[i].cells[index];\r
+ var cellValueDiv = Element.getElementsByClassName(cell, Grid.className.cellVal)[0];\r
+ cellValueDiv.style.width = newStyle.width + 'px';\r
+ cell.style.width = newStyle.width + 'px';\r
+ }\r
+ \r
+ }\r
+ },\r
+ \r
+ updateCellHeight : function(newStyle, idCell) {\r
+ if(newStyle.height > this.options.cellMinHeight) {\r
+ var row = idCell.parentNode;\r
+ var index = row.rowIndex;\r
+ var idValueDiv = Element.getElementsByClassName(idCell, Grid.className.idCellVal)[0];\r
+ idValueDiv.style.height = newStyle.height - (this.marginSize * 2) + 'px';\r
+ var padding = parseInt(idValueDiv.style.paddingTop);\r
+ var cellRow = this.cellTable.rows[index]; \r
+ var cells = cellRow.cells;\r
+ for (var i = 0; i < cells.length; i++) {\r
+ cells[i].style.height = newStyle.height + 'px';\r
+ var cellValueDiv = Element.getElementsByClassName(cells[i], Grid.className.cellVal)[0];\r
+ cellValueDiv.style.height = newStyle.height + 'px';\r
+ }\r
+ }\r
+ },\r
+ \r
+ setTextAreaSize : function(event) {\r
+ var target = Event.element(event);\r
+ var rows = parseInt(Element.getStyle(target, 'height'));\r
+ var cols = parseInt(Element.getStyle(target, 'width'));\r
+ target.ajax.options.rows = Math.round(rows/20);\r
+ target.ajax.options.cols = Math.round(cols/20);\r
+ },\r
+ \r
+ fixTablePosition : function(event) {\r
+ Grid.scrollTop = this.element.scrollTop;\r
+ Grid.scrollLeft = this.element.scrollLeft;\r
+ this.baseTable.style.top = Grid.scrollTop + 'px';\r
+ this.baseTable.style.left = Grid.scrollLeft + 'px';\r
+ this.headerTable.style.top = Grid.scrollTop + 'px';\r
+ this.idTable.style.left = Grid.scrollLeft + 'px';\r
+ },\r
+ \r
+//----------ajax request param method---------------------------------------------------------------------------\r
+ createInplaceEditorParams : function(form, value) {\r
+ var rowIndexEnd = form.id.indexOf('_col_', 0);\r
+ var rowIndex = form.id.substring(this.rowIdBase.length, rowIndexEnd);\r
+\r
+ var colIndexStart = rowIndexEnd + '_col_'.length;\r
+ var colIndexEnd = form.id.indexOf('_form', 0);\r
+ var colIndex = form.id.substring(colIndexStart, colIndexEnd);\r
+ var jsonRowObj = this.rowDataToJsonObj(rowIndex);\r
+\r
+ var targetColTitle = this.getColTitle(colIndex);\r
+ jsonRowObj.each(function(j) {\r
+ if (j.column == targetColTitle) {\r
+ j.value = value;\r
+ throw $break;\r
+ }\r
+ });\r
+ var jsonRowText = JSON.stringify(jsonRowObj);\r
+ var params = {\r
+ rowData: jsonRowText,\r
+ column: targetColTitle,\r
+ value: value\r
+ };\r
+ return $H(params).toQueryString();\r
+ },\r
+ \r
+ gridDataToJsonObj : function() {\r
+ var rows = this.cellTable.rows;\r
+ var jsonDataList = [];\r
+ for (var i = 0; i < this.rowLength; i++) {\r
+ var rowData = this.rowDataToJsonObj(i);\r
+ jsonDataList.push(rowData);\r
+ }\r
+ return jsonDataList; \r
+ },\r
+ \r
+ rowDataToJsonObj : function(index) {\r
+ var jsonRowObj = [];\r
+ var row = $A(this.cellTable.rows).detect(function(r) {return r.id.getSuffix() == index});\r
+ for (var i = 0; i < this.colLength; i++) {\r
+ var jsonCellObj = {};\r
+ jsonCellObj['column'] = this.getColTitle(i);\r
+ jsonCellObj['value'] = Element.collectTextNodes(row.cells[i]);\r
+ jsonRowObj.push(jsonCellObj);\r
+ }\r
+ return jsonRowObj;\r
+ },\r
+ \r
+ updateGridData : function() {\r
+ \r
+ var jsonDataText = JSON.stringify(this.gridDataToJsonObj());\r
+ var params = 'id=' + encodeURIComponent(this.element.id) + '&data=' + encodeURIComponent(jsonDataText);\r
+\r
+ new Ajax.Updater(\r
+ this.options.updateGridReceiver, \r
+ this.options.updateGridUrl,\r
+ { \r
+ parameters: params, \r
+ evalScripts: true, asynchronous:true\r
+ \r
+ }\r
+ ); \r
+ },\r
+\r
+//----------hierarchy grid method---------------------------------------------------------------------------\r
+ setHierarchyRow : function(row, outlineLevel, outlineNum){\r
+ row.outlineLevel = outlineLevel || 1;\r
+ row.list = row.list || new Array();\r
+ if (row.outlineLevel == 1) {\r
+ this.topLevelList.push(row);\r
+ row.outlineNum = outlineNum || this.topLevelList.length;\r
+ } else {\r
+ var parentRow = this.getParentRow(row);\r
+ parentRow.list.push(row);\r
+ var num = parentRow.length;\r
+ row.outlineNum = outlineNum || parentRow.outlineNum + '.' + parentRow.list.length;\r
+ \r
+ }\r
+ \r
+ this.buildStateDiv(row.cells[this.hierarchyColIndex]);\r
+ this.setOutlineIndent(row);\r
+ this.setFontWeight(row);\r
+ },\r
+ \r
+ buildStateDiv : function (cell) {\r
+ var stateDiv = Builder.node('div');\r
+ var valueDiv = Element.getElementsByClassName(cell, Grid.className.cellVal)[0];\r
+ this.cssUtil.addClassNames(stateDiv, 'state');\r
+ cell.insertBefore(stateDiv, valueDiv);\r
+ \r
+ if (document.all) {\r
+ stateDiv.style.position = "absolute";\r
+ } else {\r
+ stateDiv.style.position = "relative";\r
+ stateDiv.style.cssFloat = "left";\r
+ }\r
+ this.addStateClass(cell, stateDiv);\r
+ Event.observe(stateDiv, 'click', this.toggleState.bindAsEventListener(this));\r
+ },\r
+ \r
+ addStateClass : function (cell, stateDiv) {\r
+ var row = cell.parentNode;\r
+ if (row.list.length == 0) {\r
+ this.cssUtil.addClassNames(stateDiv, 'stateEmpty');\r
+ } else if (this.options.open){\r
+ this.cssUtil.addClassNames(stateDiv, 'stateOpen');\r
+ } else {\r
+ this.cssUtil.addClassNames(stateDiv, 'stateClose');\r
+ this.closeRow(row);\r
+ }\r
+ },\r
+ \r
+ toggleState : function(event) {\r
+ var src = Event.element(event);\r
+ var row = src.parentNode.parentNode;\r
+\r
+ if (!Element.hasClassName(src, Grid.className.stateEmpty)) {\r
+ if (Element.hasClassName(src, Grid.className.stateOpen)) {\r
+ this.closeRow(row.list);\r
+ this.cssUtil.removeClassNames(src, 'stateOpen');\r
+ this.cssUtil.addClassNames(src, 'stateClose');\r
+ } else {\r
+ this.openRow(row.list);\r
+ this.cssUtil.removeClassNames(src, 'stateClose');\r
+ this.cssUtil.addClassNames(src, 'stateOpen');\r
+ }\r
+ }\r
+ },\r
+ \r
+ openRow : function(list) {\r
+ for (var i = 0; i < list.length; i++) {\r
+ var row = list[i];\r
+ Element.show(row);\r
+ Element.show(this.getIdRow(row));\r
+ var stateDiv = Element.getElementsByClassName(row.cells[this.hierarchyColIndex], Grid.className.state)[0];\r
+ if (Element.hasClassName(stateDiv, Grid.className.stateOpen)) {\r
+ this.openRow(row.list)\r
+ }\r
+ }\r
+ },\r
+ \r
+ closeRow : function(list) {\r
+ for (var i = 0; i < list.length; i++) {\r
+ Element.hide(list[i]);\r
+ Element.hide(this.getIdRow(list[i]));\r
+ this.closeRow(list[i].list)\r
+ } \r
+ },\r
+\r
+ \r
+ showStateDiv : function(transport, element) {\r
+ var row = Element.getParentByTagName(['TR'], element);\r
+ var state = Element.getElementsByClassName(row, Grid.className.state)[0];\r
+ Element.show(state); \r
+ },\r
+ \r
+ hideStateDiv : function(event) {\r
+ var src = Event.element(event);\r
+ var row = Element.getParentByTagName(['TR'], src);\r
+ var state = Element.getElementsByClassName(row, Grid.className.state)[0];\r
+ \r
+ Element.hide(state);\r
+ },\r
+ \r
+ addHierarchyRow : function(index, values) {\r
+ if (this.colLength == 0) {\r
+ return;\r
+ }\r
+ var newRow = this.addRow(index, values);\r
+ \r
+ newRow.list = new Array();\r
+ var previousRow = newRow.previousSibling;\r
+ var parentRow = null;\r
+ var parentList = null;\r
+ var insertIndex = 0;\r
+ if (!previousRow) {\r
+ newRow.outlineLevel = 1;\r
+ parentList = this.topLevelList;\r
+ } else if (previousRow.list.length > 0) {\r
+ newRow.outlineLevel = previousRow.outlineLevel + 1;\r
+ parentRow = previousRow;\r
+ parentList = parentRow.list;\r
+ } else {\r
+ newRow.outlineLevel = previousRow.outlineLevel;\r
+ parentRow = this.getParentRow(previousRow);\r
+ parentList = parentRow ? parentRow.list : this.topLevelList;\r
+ insertIndex = parentList.indexOf(previousRow) + 1;\r
+ }\r
+ parentList.insert(insertIndex, newRow);\r
+ this.buildStateDiv(newRow.cells[this.hierarchyColIndex]);\r
+ for (var i = insertIndex; i < parentList.length; i++) {\r
+ if (parentList[i].outlineLevel != 1) {\r
+ parentList[i].outlineNum = parentRow.outlineNum + '.' + (i + 1);\r
+ } else {\r
+ parentList[i].outlineNum = i + 1;\r
+ }\r
+ this.setOutline(parentList[i]);\r
+ } \r
+ \r
+ },\r
+ \r
+ deleteHierarchyRow : function(index) {\r
+ if(isNaN(index) || index >= this.rowLength) {\r
+ return;\r
+ }\r
+ var row = this.getRow(index);\r
+ if (!row) {\r
+ return;\r
+ }\r
+ var parentRow = this.getParentRow(row);\r
+ var parentList = parentRow ? parentRow.list : this.topLevelList;\r
+ var removeIndex = parentList.indexOf(row);\r
+ var childList = row.list;\r
+ \r
+ for (var i = 0; i < childList.length; i++) {\r
+ this.deleteChildRow(childList[i]);\r
+ }\r
+ parentList.remove(removeIndex);\r
+ this.deleteRow(index);\r
+ \r
+ for (var i = removeIndex; i < parentList.length; i++) {\r
+ var updateRow = parentList[i];\r
+ if (updateRow.outlineLevel == 1) {\r
+ updateRow.outlineNum = i + 1;\r
+ } else {\r
+ updateRow.outlineNum = this.getParentRow(updateRow).outlineNum + '.' + (i + 1);\r
+ }\r
+ this.setOutline(parentList[i]);\r
+ }\r
+ this.setFontWeight(parentRow);\r
+ },\r
+ \r
+ deleteChildRow : function(childRow) {\r
+ var list = childRow.list;\r
+ \r
+ for (var i = 0; i < list.length; i++) {\r
+ this.deleteChildRow(list[i]);\r
+ }\r
+ this.deleteRow(childRow.rowIndex);\r
+ }, \r
+ \r
+ levelUp : function(row) {\r
+ if (!row) {\r
+ return;\r
+ }\r
+ var previousRow = row.previousSibling;\r
+ if (row.outlineLevel == 1 || !previousRow) {\r
+ return;\r
+ }\r
+ \r
+ var parentRow = this.getParentRow(row);\r
+ var currentList = parentRow.list;\r
+ \r
+ var newParentRow = this.getParentRow(parentRow);\r
+ var targetList = newParentRow ? newParentRow.list : this.topLevelList;\r
+ \r
+ var currentIndex = currentList.indexOf(row);\r
+ var targetIndex = targetList.indexOf(parentRow) + 1;\r
+\r
+ row.outlineLevel -= 1;\r
+ targetList.insert(targetIndex, row);\r
+ currentList.remove(currentIndex);\r
+ \r
+ while (currentList[currentIndex]) {\r
+ var moveRow = currentList[currentIndex];\r
+ row.list.push(moveRow);\r
+ currentList.remove(currentIndex);\r
+ }\r
+ \r
+ if (row.outlineLevel != 1) {\r
+ row.outlineNum = newParentRow.outlineNum + '.' + (targetIndex + 1);\r
+ } else {\r
+ row.outlineNum = targetIndex + 1;\r
+ }\r
+ \r
+ this.setOutline(row);\r
+\r
+ for (var i = targetIndex + 1; i < targetList.length; i++) {\r
+ if (targetList[i].outlineLevel != 1) {\r
+ targetList[i].outlineNum = newParentRow.outlineNum + '.' + (i + 1);\r
+ } else {\r
+ targetList[i].outlineNum = i + 1;\r
+ }\r
+ this.setOutline(targetList[i]);\r
+ }\r
+\r
+ this.setFontWeight(row);\r
+ this.setFontWeight(parentRow);\r
+ this.setFontWeight(newParentRow); \r
+ this.setStateClass(row);\r
+ this.setStateClass(previousRow);\r
+ },\r
+ \r
+ levelDown : function(row) {\r
+ if (!row) {\r
+ return;\r
+ }\r
+ var previousRow = row.previousSibling;\r
+ var parentRow = this.getParentRow(row);\r
+ if (!previousRow || parentRow == previousRow) {\r
+ return;\r
+ }\r
+ var currentList = (row.outlineLevel == 1) ? this.topLevelList : parentRow.list;\r
+ var currentIndex = currentList.indexOf(row);\r
+ \r
+ row.outlineLevel += 1;\r
+ \r
+ var newParentRow = this.getParentRow(row);\r
+ var targetList = newParentRow.list;\r
+ var targetIndex = targetList.length;\r
+ \r
+ currentList.remove(currentIndex);\r
+ targetList.push(row);\r
+ \r
+ row.outlineNum = newParentRow.outlineNum + '.' + (targetIndex + 1);\r
+ this.setOutline(row);\r
+ for (var i = currentIndex; i < currentList.length; i++) {\r
+ if (currentList[i].outlineLevel != 1) {\r
+ currentList[i].outlineNum = parentRow.outlineNum + '.' + (i + 1);\r
+ } else {\r
+ currentList[i].outlineNum = i + 1;\r
+ }\r
+ this.setOutline(currentList[i]);\r
+ }\r
+ \r
+ for (var i = targetIndex + 1; i < targetList.length; i++) {\r
+ targetList[i].outlineNum = newParentRow.outlineNum + '.' + (i + 1);\r
+ this.setOutline(targetList[i]);\r
+ }\r
+ \r
+ this.setFontWeight(row);\r
+ this.setFontWeight(parentRow);\r
+ this.setFontWeight(newParentRow);\r
+ this.setStateClass(row);\r
+ this.setStateClass(previousRow);\r
+ \r
+ },\r
+ \r
+ setStateClass : function(row) {\r
+ if (!row.list) return; \r
+ var stateDiv = Element.getElementsByClassName(row.cells[this.hierarchyColIndex], Grid.className.state)[0];\r
+ \r
+ if (Element.hasClassName(stateDiv, Grid.className.stateEmpty) && row.list.length > 0) {\r
+ this.cssUtil.removeClassNames(stateDiv, 'stateEmpty');\r
+ this.cssUtil.addClassNames(stateDiv, 'stateOpen');\r
+ } else if (!Element.hasClassName(stateDiv, Grid.className.stateEmpty) && row.list.length == 0) {\r
+ this.cssUtil.removeClassNames(stateDiv, 'stateOpen');\r
+ this.cssUtil.addClassNames(stateDiv, 'stateEmpty');\r
+ }\r
+ },\r
+ \r
+ setOutline : function(row) {\r
+ var childList = row.list;\r
+ if (!childList) return;\r
+ for(var i = 0; i < childList.length; i++) {\r
+ var childRow = childList[i];\r
+ childRow.outlineLevel = row.outlineLevel + 1;\r
+ childRow.outlineNum = row.outlineNum + '.' + (i + 1);\r
+ this.setOutline(childRow);\r
+ }\r
+ this.setOutlineIndent(row); \r
+ },\r
+ \r
+ setOutlineIndent : function(row) {\r
+ var cell = row.cells[this.hierarchyColIndex];\r
+ if (!cell) {\r
+ return;\r
+ }\r
+ var cellValueDiv = Element.getElementsByClassName(cell, Grid.className.cellVal)[0];\r
+ var stateDiv = Element.getElementsByClassName(cell, Grid.className.state)[0];\r
+ if (!stateDiv) return;\r
+ var stateDivWidth = stateDiv.offsetWidth || this.stateDivWidth;\r
+ var left = this.options.hierarchyIndent * (row.outlineLevel - 1);\r
+ var valueLeft = document.all ? left + stateDivWidth : left;\r
+ cellValueDiv.style.left = valueLeft + 'px';\r
+ stateDiv.style.left = left + 'px';\r
+ },\r
+ \r
+ setFontWeight : function(row) {\r
+ if (row) {\r
+ if (!row.list) return;\r
+ if (row.list.length > 0){\r
+ row.style.fontWeight = 'bold';\r
+ } else {\r
+ row.style.fontWeight = 'normal'; \r
+ }\r
+ }\r
+ },\r
+ \r
+ updateOutline : function(row) {\r
+ var previousRow = row.previousSibling;\r
+ var newParentRow = null;\r
+ var insertIndex = 0;\r
+ var newParentList = null;\r
+ \r
+ if (!previousRow.list) return;\r
+ if (!previousRow) {\r
+ newParentList = this.topLevelList;\r
+ }else if(previousRow.list.length > 0) {\r
+ newParentRow = previousRow;\r
+ newParentList = newParentRow.list;\r
+ } else {\r
+ newParentRow = this.getParentRow(previousRow);\r
+ newParentList = newParentRow ? newParentRow.list : this.topLevelList;\r
+ insertIndex = newParentList.indexOf(previousRow) + 1;\r
+ }\r
+ var parentRow = this.getParentRowByIndex(row, this.targetRowIndex);\r
+ var parentList = null;\r
+\r
+ var outlineNumBase = '';\r
+ if (parentRow) {\r
+ parentList = parentRow.list;\r
+ outlineNumBase = parentRow.outlineNum + '.';\r
+ } else {\r
+ parentList = this.topLevelList;\r
+ if (!parentList) return;\r
+ }\r
+ var removeIndex = parentList.indexOf(row);\r
+ \r
+ if (parentList == newParentList && removeIndex < insertIndex) { \r
+ insertIndex -= 1;\r
+ parentList.remove(removeIndex);\r
+ parentList.insert(insertIndex, row);\r
+ for (var i = removeIndex; i < parentList.length; i++) {\r
+ try {\r
+ parentList[i].outlineNum = outlineNumBase + (i + 1);\r
+ this.setOutline(parentList[i]); \r
+ } catch (e) {}\r
+ }\r
+ \r
+ } else {\r
+ parentList.remove(removeIndex);\r
+ newParentList.insert(insertIndex, row);\r
+ for (var i = removeIndex; i < parentList.length; i++) {\r
+ parentList[i].outlineNum = outlineNumBase + (i + 1);\r
+ this.setOutline(parentList[i]); \r
+ }\r
+ var newOutlineNumBase = newParentRow ? newParentRow.outlineNum + '.' : '';\r
+ var newOutlineLevelBase = newParentRow ? newParentRow.outlineLevel : 0;\r
+ row.outlineNum = newOutlineNumBase + (insertIndex + 1);\r
+ row.outlineLevel = newOutlineLevelBase + 1;\r
+ for (var i = insertIndex; i < newParentList.length; i++) {\r
+ newParentList[i].outlineNum = newOutlineNumBase + (i + 1);\r
+ this.setOutline(newParentList[i]);\r
+ }\r
+ this.setOutline(row); \r
+ }\r
+ this.setFontWeight(row);\r
+ this.setStateClass(row);\r
+ if (parentRow) {\r
+ this.setFontWeight(parentRow);\r
+ this.setStateClass(parentRow);\r
+ }\r
+ if (newParentRow) {\r
+ this.setFontWeight(newParentRow);\r
+ this.setStateClass(newParentRow);\r
+ }\r
+ this.updateHierarchyRowLine(row);\r
+ },\r
+ \r
+ updateHierarchyRowLine : function(row, existingRow) {\r
+ if (!row.list) return;\r
+ var rowIndex = row.rowIndex;\r
+ var cellBody = this.cellTable.tBodies[0];\r
+ var idBody = this.idTable.tBodies[0];\r
+ if (!existingRow) {\r
+ existingRow = cellBody.rows[rowIndex + 1]\r
+ }\r
+ \r
+ for (var i = 0; i < row.list.length; i++) {\r
+ if (!existingRow) {\r
+ cellBody.appendChild(row.list[i]);\r
+ idBody.appendChild(this.getIdRow(row.list[i]));\r
+ } else {\r
+ cellBody.insertBefore(row.list[i], existingRow);\r
+ idBody.insertBefore(this.getIdRow(row.list[i]), this.getIdRow(existingRow));\r
+ }\r
+ this.updateHierarchyRowLine(row.list[i], existingRow);\r
+ }\r
+ },\r
+ \r
+ getParentRow : function(row) {\r
+ if (row.outlineLevel == 1) {\r
+ return null;\r
+ }\r
+\r
+ var previousRow = row.previousSibling;\r
+ if (!previousRow) {\r
+ return null;\r
+ }\r
+ try {\r
+ while (previousRow.outlineLevel != (row.outlineLevel - 1)) {\r
+ previousRow = previousRow.previousSibling;\r
+ }\r
+ return previousRow;\r
+ } catch (e) {}\r
+ },\r
+ \r
+ getParentRowByIndex : function(row, index) {\r
+ if (row.outlineLevel == 1) {\r
+ return null;\r
+ }\r
+ if (this.targetRowIndex) {\r
+ for(var i = 0; i < this.targetRowIndex + 1; i++) {\r
+ if (!this.cellTable.rows[i].list) return;\r
+ if (this.cellTable.rows[i].list.indexOf(row) != -1) {\r
+ return this.cellTable.rows[i];\r
+ }\r
+ }\r
+ }\r
+ return null;\r
+ },\r
+ \r
+ getPreviousRootRow : function(row) {\r
+ var previousRow = row.previousSibling;\r
+ if (!previousRow) {\r
+ return;\r
+ }\r
+ while (previousRow.outlineLevel != 1) {\r
+ previousRow = previousRow.previousSibling;\r
+ } \r
+ \r
+ return previousRow;\r
+ },\r
+ \r
+ isParentRow : function(row, parentRow) {\r
+ var temp = this.getParentRow(row);\r
+ if (!temp) {\r
+ return false;\r
+ } else if (temp == parentRow) {\r
+ return true;\r
+ } else {\r
+ return this.isParentRow(temp, parentRow);\r
+ }\r
+ }\r
+}\r
-// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)
-//
-// This code is substantially based on code from Thomas Fakes(http://craz8.com)
-// which has the following copyright and permission notice
-//
-// Copyright (c) 2005 Thomas Fakes (http://craz8.com)
-//
-// This code is substantially based on code from script.aculo.us which has the
-// following copyright and permission notice
-//
-// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-ResizeableGridEx = Class.create();
-Object.extend(Object.extend(ResizeableGridEx.prototype, Resizeable.prototype), {
-
- draw: function(event) {
-
- var pointer = [Event.pointerX(event), Event.pointerY(event)];
- var style = this.element.style;
- var newHeight = 0;
- var newWidth = 0;
- var newTop = 0;
- var newLeft = 0;
- if (this.currentDirection.indexOf('n') != -1) {
- var pointerMoved = this.startY - pointer[1];
- var margin = Element.getStyle(this.element, 'margin-top') || "0";
- newHeight = this.startHeight + pointerMoved;
- newTop = (this.startTop - pointerMoved - parseInt(margin)) + "px";
- }
- if (this.currentDirection.indexOf('w') != -1) {
- var pointerMoved = this.startX - pointer[0];
- var margin = Element.getStyle(this.element, 'margin-left') || "0";
- newWidth = this.startWidth + pointerMoved;
- newLeft = (this.startLeft - pointerMoved - parseInt(margin)) + "px";
- }
- if (this.currentDirection.indexOf('s') != -1) {
- newHeight = this.startHeight + pointer[1] - this.startY;
- }
- if (this.currentDirection.indexOf('e') != -1) {
- newWidth = this.startWidth + pointer[0] - this.startX;
- }
- var newStyle = {
- height: newHeight,
- width: newWidth,
- top: newTop,
- left: newLeft
- }
- if (this.options.draw) {
- this.options.draw(newStyle, this.element);
- }
-
- if (newHeight && newHeight > this.options.minHeight) {
-
- style.top = newStyle.top;
-
- style.height = newStyle.height + "px";
-
- }
- if (newWidth && newWidth > this.options.minWidth) {
-
- style.left = newStyle.left;
- style.width = newStyle.width + "px";
-
-
- }
- if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering
- },
-
- directions: function(event) {
- var pointer = [Event.pointerX(event) + Grid.scrollLeft, Event.pointerY(event) + Grid.scrollTop];
- //var pointer = [Event.pointerX(event), Event.pointerY(event)];
- var offsets = Position.cumulativeOffset(this.element);
- var cursor = '';
- if (this.between(pointer[1] - offsets[1], 0, this.options.top)) cursor += 'n';
- if (this.between((offsets[1] + this.element.offsetHeight) - pointer[1], 0, this.options.bottom)) cursor += 's';
- if (this.between(pointer[0] - offsets[0], 0, this.options.left)) cursor += 'w';
- if (this.between((offsets[0] + this.element.offsetWidth) - pointer[0], 0, this.options.right)) cursor += 'e';
-
- return cursor;
- }
-});
+// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// This code is substantially based on code from Thomas Fakes(http://craz8.com) \r
+// which has the following copyright and permission notice\r
+// \r
+// Copyright (c) 2005 Thomas Fakes (http://craz8.com)\r
+// \r
+// This code is substantially based on code from script.aculo.us which has the \r
+// following copyright and permission notice\r
+//\r
+// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+ResizeableGridEx = Class.create();\r
+Object.extend(Object.extend(ResizeableGridEx.prototype, Resizeable.prototype), {\r
+\r
+ draw: function(event) {\r
+ \r
+ var pointer = [Event.pointerX(event), Event.pointerY(event)];\r
+ var style = this.element.style;\r
+ var newHeight = 0;\r
+ var newWidth = 0;\r
+ var newTop = 0;\r
+ var newLeft = 0;\r
+ if (this.currentDirection.indexOf('n') != -1) {\r
+ var pointerMoved = this.startY - pointer[1];\r
+ var margin = Element.getStyle(this.element, 'margin-top') || "0";\r
+ newHeight = this.startHeight + pointerMoved;\r
+ newTop = (this.startTop - pointerMoved - parseInt(margin)) + "px";\r
+ }\r
+ if (this.currentDirection.indexOf('w') != -1) {\r
+ var pointerMoved = this.startX - pointer[0];\r
+ var margin = Element.getStyle(this.element, 'margin-left') || "0";\r
+ newWidth = this.startWidth + pointerMoved;\r
+ newLeft = (this.startLeft - pointerMoved - parseInt(margin)) + "px";\r
+ }\r
+ if (this.currentDirection.indexOf('s') != -1) {\r
+ newHeight = this.startHeight + pointer[1] - this.startY;\r
+ }\r
+ if (this.currentDirection.indexOf('e') != -1) {\r
+ newWidth = this.startWidth + pointer[0] - this.startX;\r
+ }\r
+ var newStyle = {\r
+ height: newHeight,\r
+ width: newWidth,\r
+ top: newTop,\r
+ left: newLeft\r
+ }\r
+ if (this.options.draw) {\r
+ this.options.draw(newStyle, this.element);\r
+ }\r
+ \r
+ if (newHeight && newHeight > this.options.minHeight) {\r
+\r
+ style.top = newStyle.top;\r
+ \r
+ style.height = newStyle.height + "px";\r
+ \r
+ }\r
+ if (newWidth && newWidth > this.options.minWidth) {\r
+ \r
+ style.left = newStyle.left;\r
+ style.width = newStyle.width + "px";\r
+ \r
+\r
+ }\r
+ if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering\r
+ },\r
+\r
+ directions: function(event) {\r
+ var pointer = [Event.pointerX(event) + Grid.scrollLeft, Event.pointerY(event) + Grid.scrollTop];\r
+ //var pointer = [Event.pointerX(event), Event.pointerY(event)]; \r
+ var offsets = Position.cumulativeOffset(this.element);\r
+ var cursor = '';\r
+ if (this.between(pointer[1] - offsets[1], 0, this.options.top)) cursor += 'n';\r
+ if (this.between((offsets[1] + this.element.offsetHeight) - pointer[1], 0, this.options.bottom)) cursor += 's';\r
+ if (this.between(pointer[0] - offsets[0], 0, this.options.left)) cursor += 'w';\r
+ if (this.between((offsets[0] + this.element.offsetWidth) - pointer[0], 0, this.options.right)) cursor += 'e';\r
+ \r
+ return cursor;\r
+ }\r
+});\r
-// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-
-SortableTableGridEx = Class.create();
-Object.extend(Object.extend(SortableTableGridEx.prototype, SortableTable.prototype), {
-
- initialize: function(element) {
- this.element = $(element);
- Element.setStyle(this.element, {visibility: 'hidden'});
-
- var options = Object.extend({
- ascImg: false,
- descImg: false,
- handle: false,
- callBack: false
- }, arguments[1] || {});
- this.options = options;
-
- this.handle = options.handle ? $(options.handle) : this.element.rows[0];
- this.ascImg = options.ascImg ? options.ascImg : 'images/spinelz/sortableTable_down.gif';
- this.descImg = options.descImg ? options.descImg : 'images/spinelz/sortableTable_up.gif';
- this.sortType = options.sortType;
-
- this.currentOrder = 'default';
- this.defaultOrder = new Array();
- for (var i = 0; i < this.element.rows.length; i++) {
- this.defaultOrder[i] = this.element.rows[i];
- }
- this.addEvents();
- Element.setStyle(this.element, {visibility: 'visible'});
- },
-
- addEvents: function() {
- var rows = this.handle.rows[0];
- if (!rows) return;
-
- for (var i = 0; i < rows.cells.length; i++) {
- Element.cleanWhitespace(rows.cells[i]);
- Element.cleanWhitespace(rows.cells[i].firstChild);
- this.addEvent(rows.cells[i].firstChild.firstChild);
- }
- },
-
- addEvent: function(handle) {
- if (handle) {
- handle.style.cursor = 'pointer';
- Event.observe(handle, 'click', this.sortTable.bindAsEventListener(this));
- }
- },
-
- sortTable: function(event) {
- var target = Event.element(event);
- if (target.tagName.toUpperCase() == 'IMG') {
- target = target.parentNode;
- }
- var cell = target;
- if (cell.tagName.toUpperCase() != 'TD' && cell.tagName.toUpperCase() != 'TH') {
- cell = Element.getParentByTagName(['TD','TH'], cell);
- }
- var tmpColumn = cell.cellIndex;
- if (this.targetColumn != tmpColumn) {
- this.currentOrder = 'default';
- }
- this.targetColumn = tmpColumn;
-
- var newRows = new Array();
- for (var i = 0; i < this.element.rows.length; i++) {
- newRows[i] = this.element.rows[i];
- }
- if (newRows.length < 1) return;
-
- if (this.currentOrder == 'default') {
- newRows.sort(this.getSortFunc());
- this.currentOrder = 'asc';
-
- } else if (this.currentOrder == 'asc') {
- newRows = newRows.reverse();
- this.currentOrder = 'desc';
- } else if (this.currentOrder == 'desc') {
- newRows = this.defaultOrder;
- this.currentOrder = 'default';
- }
-
- for (var i = 0; i < newRows.length; i++) {
- this.element.tBodies[0].appendChild(newRows[i]);
- }
-
- this.mark(target);
- if (this.options.callBack) this.options.callBack(this.element);
- },
-
- mark: function(cell) {
- var row = this.options.handle ? this.options.handle.rows[0] : this.element.rows[0];
-
- var imgs = row.getElementsByTagName('IMG');
-
- for (var i = 0; i < imgs.length; i++){
- var parent = imgs[i].parentNode;
- parent.removeChild(imgs[i]);
- }
- var imgFile;
- if (this.currentOrder == 'asc') imgFile = this.ascImg;
- else if (this.currentOrder == 'desc') imgFile = this.descImg;
-
- if (imgFile)
- cell.appendChild(Builder.node('IMG', {src: imgFile, alt: 'sortImg'}));
- }
-
-});
-
+// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+\r
+SortableTableGridEx = Class.create();\r
+Object.extend(Object.extend(SortableTableGridEx.prototype, SortableTable.prototype), {\r
+\r
+ initialize: function(element) {\r
+ this.element = $(element);\r
+ Element.setStyle(this.element, {visibility: 'hidden'});\r
+\r
+ var options = Object.extend({\r
+ ascImg: false,\r
+ descImg: false,\r
+ handle: false,\r
+ callBack: false\r
+ }, arguments[1] || {});\r
+ this.options = options;\r
+ \r
+ this.handle = options.handle ? $(options.handle) : this.element.rows[0];\r
+ this.ascImg = options.ascImg ? options.ascImg : 'images/spinelz/sortableTable_down.gif';\r
+ this.descImg = options.descImg ? options.descImg : 'images/spinelz/sortableTable_up.gif';\r
+ this.sortType = options.sortType;\r
+ \r
+ this.currentOrder = 'default';\r
+ this.defaultOrder = new Array();\r
+ for (var i = 0; i < this.element.rows.length; i++) {\r
+ this.defaultOrder[i] = this.element.rows[i];\r
+ } \r
+ this.addEvents();\r
+ Element.setStyle(this.element, {visibility: 'visible'});\r
+ },\r
+ \r
+ addEvents: function() {\r
+ var rows = this.handle.rows[0];\r
+ if (!rows) return;\r
+ \r
+ for (var i = 0; i < rows.cells.length; i++) {\r
+ Element.cleanWhitespace(rows.cells[i]);\r
+ Element.cleanWhitespace(rows.cells[i].firstChild);\r
+ this.addEvent(rows.cells[i].firstChild.firstChild); \r
+ }\r
+ },\r
+ \r
+ addEvent: function(handle) {\r
+ if (handle) {\r
+ handle.style.cursor = 'pointer';\r
+ Event.observe(handle, 'click', this.sortTable.bindAsEventListener(this));\r
+ }\r
+ },\r
+ \r
+ sortTable: function(event) {\r
+ var target = Event.element(event);\r
+ if (target.tagName.toUpperCase() == 'IMG') {\r
+ target = target.parentNode;\r
+ }\r
+ var cell = target;\r
+ if (cell.tagName.toUpperCase() != 'TD' && cell.tagName.toUpperCase() != 'TH') {\r
+ cell = Element.getParentByTagName(['TD','TH'], cell);\r
+ }\r
+ var tmpColumn = cell.cellIndex;\r
+ if (this.targetColumn != tmpColumn) {\r
+ this.currentOrder = 'default';\r
+ }\r
+ this.targetColumn = tmpColumn;\r
+ \r
+ var newRows = new Array();\r
+ for (var i = 0; i < this.element.rows.length; i++) {\r
+ newRows[i] = this.element.rows[i];\r
+ }\r
+ if (newRows.length < 1) return;\r
+ \r
+ if (this.currentOrder == 'default') {\r
+ newRows.sort(this.getSortFunc());\r
+ this.currentOrder = 'asc';\r
+ \r
+ } else if (this.currentOrder == 'asc') {\r
+ newRows = newRows.reverse();\r
+ this.currentOrder = 'desc';\r
+ } else if (this.currentOrder == 'desc') {\r
+ newRows = this.defaultOrder;\r
+ this.currentOrder = 'default';\r
+ }\r
+ \r
+ for (var i = 0; i < newRows.length; i++) {\r
+ this.element.tBodies[0].appendChild(newRows[i]);\r
+ }\r
+ \r
+ this.mark(target);\r
+ if (this.options.callBack) this.options.callBack(this.element); \r
+ },\r
+ \r
+ mark: function(cell) {\r
+ var row = this.options.handle ? this.options.handle.rows[0] : this.element.rows[0];\r
+ \r
+ var imgs = row.getElementsByTagName('IMG');\r
+\r
+ for (var i = 0; i < imgs.length; i++){\r
+ var parent = imgs[i].parentNode;\r
+ parent.removeChild(imgs[i]);\r
+ }\r
+ var imgFile;\r
+ if (this.currentOrder == 'asc') imgFile = this.ascImg;\r
+ else if (this.currentOrder == 'desc') imgFile = this.descImg;\r
+ \r
+ if (imgFile)\r
+ cell.appendChild(Builder.node('IMG', {src: imgFile, alt: 'sortImg'}));\r
+ } \r
+\r
+});\r
+\r
-// Copyright (c) 2006 spinelz.org (http://script.spinelz.org/)
-//
-// This code is substantially based on code from script.aculo.us which has the
-// following copyright and permission notice
-//
-// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-InPlaceEditorEx = Class.create();
-Object.extend(Object.extend(InPlaceEditorEx.prototype, Ajax.InPlaceEditor.prototype), {
- /*********************************************
- * Edit
- * The URL option is unnecessary because
- * of updating without Ajax.
- *********************************************
- initialize: function(element, url, options) {
- this.url = url;
- *********************************************/
- initialize: function(element, options) {
- /*********************************************/
- this.element = $(element);
-
- this.options = Object.extend({
- okButton: true,
- okText: "ok",
- cancelLink: true,
- cancelText: "cancel",
- savingText: "Saving...",
- clickToEditText: "Click to edit",
- okText: "ok",
- rows: 1,
- onComplete: function(transport, element) {
- new Effect.Highlight(element, {startcolor: this.options.highlightcolor});
- },
- onFailure: function(transport) {
- alert("Error communicating with the server: " + transport.responseText.stripTags());
- },
- callback: function(form) {
- return Form.serialize(form);
- },
- handleLineBreaks: true,
- loadingText: 'Loading...',
- savingClassName: 'inplaceeditor-saving',
- loadingClassName: 'inplaceeditor-loading',
- formClassName: 'inplaceeditor-form',
- highlightcolor: Ajax.InPlaceEditor.defaultHighlightColor,
- highlightendcolor: "#FFFFFF",
- externalControl: null,
- submitOnBlur: false,
- ajaxOptions: {},
- evalScripts: false
- }, options || {});
-
- if(!this.options.formId && this.element.id) {
- this.options.formId = this.element.id + "-inplaceeditor";
- if ($(this.options.formId)) {
- // there's already a form with that name, don't specify an id
- this.options.formId = null;
- }
- }
-
- if (this.options.externalControl) {
- this.options.externalControl = $(this.options.externalControl);
- }
-
- this.originalBackground = Element.getStyle(this.element, 'background-color');
- if (!this.originalBackground) {
- this.originalBackground = "transparent";
- }
-
- this.element.title = this.options.clickToEditText;
-
- /*********************************************
- * Edit
- * The event to enter edit mode is changed
- * from single-click to double-click.
- *********************************************
- this.onclickListener = this.enterEditMode.bindAsEventListener(this);
- this.mouseoverListener = this.enterHover.bindAsEventListener(this);
- this.mouseoutListener = this.leaveHover.bindAsEventListener(this);
- Event.observe(this.element, 'click', this.onclickListener);
- Event.observe(this.element, 'mouseover', this.mouseoverListener);
- Event.observe(this.element, 'mouseout', this.mouseoutListener);
- if (this.options.externalControl) {
- Event.observe(this.options.externalControl, 'click', this.onclickListener);
- Event.observe(this.options.externalControl, 'mouseover', this.mouseoverListener);
- Event.observe(this.options.externalControl, 'mouseout', this.mouseoutListener);
- }
- *********************************************/
- this.ondblclickListener = this.enterEditMode.bindAsEventListener(this);
- this.mouseoverListener = this.enterHover.bindAsEventListener(this);
- this.mouseoutListener = this.leaveHover.bindAsEventListener(this);
- Event.observe(this.element, 'dblclick', this.ondblclickListener);
- Event.observe(this.element, 'mouseover', this.mouseoverListener);
- Event.observe(this.element, 'mouseout', this.mouseoutListener);
- if (this.options.externalControl) {
- Event.observe(this.options.externalControl, 'dblclick', this.ondblclickListener);
- Event.observe(this.options.externalControl, 'mouseover', this.mouseoverListener);
- Event.observe(this.options.externalControl, 'mouseout', this.mouseoutListener);
- }
- /*********************************************/
- },
- getText: function() {
- return this.element.innerHTML.unescapeHTML();
- },
- onSubmit: function() {
- var value = this.editField.value.escapeHTML();
- if(value == '') {
- this.onclickCancel();
- return false;
- } else {
- this.onLoading();
- this.element.innerHTML = value;
- new InPlaceEditorEx(this.element.id, this.options);
- return true;
- }
- },
- removeForm: function() {
- if(this.form) {
- if(this.form.parentNode) {
- var childNodes = this.form.parentNode.childNodes;
- for(var i = 0; i < childNodes.length; i++) {
- childNodes[i].data = '';
- }
- Element.remove(this.form);
- }
- this.form = null;
- }
- }
-});
+// Copyright (c) 2006 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// This code is substantially based on code from script.aculo.us which has the \r
+// following copyright and permission notice\r
+//\r
+// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+InPlaceEditorEx = Class.create();\r
+Object.extend(Object.extend(InPlaceEditorEx.prototype, Ajax.InPlaceEditor.prototype), {\r
+ /*********************************************\r
+ * Edit\r
+ * The URL option is unnecessary because\r
+ * of updating without Ajax.\r
+ *********************************************\r
+ initialize: function(element, url, options) {\r
+ this.url = url;\r
+ *********************************************/\r
+ initialize: function(element, options) {\r
+ /*********************************************/\r
+ this.element = $(element);\r
+\r
+ this.options = Object.extend({\r
+ okButton: true,\r
+ okText: "ok",\r
+ cancelLink: true,\r
+ cancelText: "cancel",\r
+ savingText: "Saving...",\r
+ clickToEditText: "Click to edit",\r
+ okText: "ok",\r
+ rows: 1,\r
+ onComplete: function(transport, element) {\r
+ new Effect.Highlight(element, {startcolor: this.options.highlightcolor});\r
+ },\r
+ onFailure: function(transport) {\r
+ alert("Error communicating with the server: " + transport.responseText.stripTags());\r
+ },\r
+ callback: function(form) {\r
+ return Form.serialize(form);\r
+ },\r
+ handleLineBreaks: true,\r
+ loadingText: 'Loading...',\r
+ savingClassName: 'inplaceeditor-saving',\r
+ loadingClassName: 'inplaceeditor-loading',\r
+ formClassName: 'inplaceeditor-form',\r
+ highlightcolor: Ajax.InPlaceEditor.defaultHighlightColor,\r
+ highlightendcolor: "#FFFFFF",\r
+ externalControl: null,\r
+ submitOnBlur: false,\r
+ ajaxOptions: {},\r
+ evalScripts: false\r
+ }, options || {});\r
+\r
+ if(!this.options.formId && this.element.id) {\r
+ this.options.formId = this.element.id + "-inplaceeditor";\r
+ if ($(this.options.formId)) {\r
+ // there's already a form with that name, don't specify an id\r
+ this.options.formId = null;\r
+ }\r
+ }\r
+ \r
+ if (this.options.externalControl) {\r
+ this.options.externalControl = $(this.options.externalControl);\r
+ }\r
+ \r
+ this.originalBackground = Element.getStyle(this.element, 'background-color');\r
+ if (!this.originalBackground) {\r
+ this.originalBackground = "transparent";\r
+ }\r
+ \r
+ this.element.title = this.options.clickToEditText;\r
+ \r
+ /*********************************************\r
+ * Edit\r
+ * The event to enter edit mode is changed\r
+ * from single-click to double-click.\r
+ *********************************************\r
+ this.onclickListener = this.enterEditMode.bindAsEventListener(this);\r
+ this.mouseoverListener = this.enterHover.bindAsEventListener(this);\r
+ this.mouseoutListener = this.leaveHover.bindAsEventListener(this);\r
+ Event.observe(this.element, 'click', this.onclickListener);\r
+ Event.observe(this.element, 'mouseover', this.mouseoverListener);\r
+ Event.observe(this.element, 'mouseout', this.mouseoutListener);\r
+ if (this.options.externalControl) {\r
+ Event.observe(this.options.externalControl, 'click', this.onclickListener);\r
+ Event.observe(this.options.externalControl, 'mouseover', this.mouseoverListener);\r
+ Event.observe(this.options.externalControl, 'mouseout', this.mouseoutListener);\r
+ }\r
+ *********************************************/\r
+ this.ondblclickListener = this.enterEditMode.bindAsEventListener(this);\r
+ this.mouseoverListener = this.enterHover.bindAsEventListener(this);\r
+ this.mouseoutListener = this.leaveHover.bindAsEventListener(this);\r
+ Event.observe(this.element, 'dblclick', this.ondblclickListener);\r
+ Event.observe(this.element, 'mouseover', this.mouseoverListener);\r
+ Event.observe(this.element, 'mouseout', this.mouseoutListener);\r
+ if (this.options.externalControl) {\r
+ Event.observe(this.options.externalControl, 'dblclick', this.ondblclickListener);\r
+ Event.observe(this.options.externalControl, 'mouseover', this.mouseoverListener);\r
+ Event.observe(this.options.externalControl, 'mouseout', this.mouseoutListener);\r
+ }\r
+ /*********************************************/\r
+ },\r
+ getText: function() {\r
+ return this.element.innerHTML.unescapeHTML();\r
+ },\r
+ onSubmit: function() {\r
+ var value = this.editField.value.escapeHTML();\r
+ if(value == '') {\r
+ this.onclickCancel();\r
+ return false;\r
+ } else {\r
+ this.onLoading();\r
+ this.element.innerHTML = value;\r
+ new InPlaceEditorEx(this.element.id, this.options);\r
+ return true;\r
+ }\r
+ },\r
+ removeForm: function() {\r
+ if(this.form) {\r
+ if(this.form.parentNode) {\r
+ var childNodes = this.form.parentNode.childNodes;\r
+ for(var i = 0; i < childNodes.length; i++) {\r
+ childNodes[i].data = '';\r
+ }\r
+ Element.remove(this.form);\r
+ }\r
+ this.form = null;\r
+ }\r
+ }\r
+});\r
-// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-var MenuBar = Class.create();
-MenuBar.cssNames = {
- container: 'menubar',
- menu: 'menubar_menu',
- menuBody: 'menubar_menuBody',
- menuBodyHover: 'menubar_menuBodyHover',
- subMenu: 'menubar_subMenu',
- subMenuBody: 'menubar_subMenuBody',
- subMenuBodyHover: 'menubar_subMenuBodyHover',
- subMenuContainer: 'menubar_menuContainer',
- dirMark: 'menubar_dirMark'
-}
-
-MenuBar.mark = {
- dir: '>>'
-}
-
-MenuBar.prototype = {
-
- initialize: function(element) {
- this.options = Object.extend({
- hideOnClickSubmenu: true
- }, arguments[1]);
-
- this.element = $(element);
- Element.setStyle(this.element, {visibility: 'hidden'});
- Element.hide(this.element);
-
- var options = Object.extend({
- cssPrefix: 'custom_'
- }, arguments[1] || {});
-
- var customCss = CssUtil.appendPrefix(options.cssPrefix, MenuBar.cssNames);
- this.classNames = new CssUtil([MenuBar.cssNames, customCss]);
-
- this.clicked = [];
- var topMenus = [];
- var nodes = this.element.childNodes;
-
- for (var i = 0; i < nodes.length; i++) {
- if (nodes[i].nodeType == 1) {
- this.build(nodes[i], 'menu');
- topMenus.push(nodes[i]);
- }
- }
-
- this.menubar = Builder.node('DIV', topMenus)
- this.classNames.addClassNames(this.menubar, 'container');
- this.element.appendChild(this.menubar);
-
- Event.observe(document, "click", this.hideAllTrigger(this.menubar).bindAsEventListener(this));
- Element.setStyle(this.element, {visibility: 'visible'});
- Element.show(this.element);
- },
-
- build: function(element, className) {
- this.classNames.addClassNames(element, className);
-
- var bodyContents = new Array();
- var subMenus = new Array();
- var nodes = element.childNodes;
-
- for (var i = 0; i < nodes.length; i++) {
- if (nodes[i].nodeType == 1 && nodes[i].tagName == 'DIV') {
- this.build(nodes[i], 'subMenu');
- subMenus.push(nodes[i]);
- } else {
- bodyContents.push(nodes[i]);
- }
- }
-
- var bodyClass= className + 'Body';
- var body = Builder.node('DIV', bodyContents);
- this.classNames.addClassNames(body, bodyClass);
- new Hover(body);
- element.appendChild(body);
-
- if (subMenus.length > 0) {
- if (className == 'subMenu') {
- var subMenu = Builder.node('DIV', [MenuBar.mark.dir]);
- this.classNames.addClassNames(subMenu, 'dirMark');
- body.appendChild(subMenu);
- }
-
- var container = Builder.node('DIV', subMenus);
- this.classNames.addClassNames(container, 'subMenuContainer');
- element.appendChild(container);
-
- this.hide(container);
- }
- Event.observe(element, "click", this.onClick.bindAsEventListener(this, body));
- },
-
- onClick: function(event, menuBody) {
- var menu = menuBody.parentNode;
- var parentContainer = this.getParentContainer(menu);
-
- var container = this.getContainer(menu);
- var className = MenuBar.cssNames.menu;
- if (Element.hasClassName(menu, className)) {
- if (this.clicked.length > 0) {
- this.hideAll(this.menubar);
- this.clicked = [];
- }
- if (container) this.showAtBottom(container, menuBody);
-
- } else {
- if (container) {
- var lastMenuBody = this.clicked.pop();
- var lastMenu = lastMenuBody.parentNode;
- var lastContainer = this.getContainer(lastMenu);
- var lastParentContainer = this.getParentContainer(lastMenu);
-
- if (lastMenu == menu) {
- this.hide(container);
-
- } else if (Element.hasClassName(lastContainer, MenuBar.cssNames.container)) {
- this.clicked.push(last);
-
- } else if (lastParentContainer == parentContainer) {
- this.hide(lastContainer);
-
- } else {
- this.clicked.push(lastMenuBody);
- }
- this.showAtLeft(container, menu);
- } else if (this.options.hideOnClickSubmenu) {
- this.hideAll(this.menubar);
- }
- }
-
- if (container) this.clicked.push(menuBody);
- Event.stop(event);
- },
-
- showAtBottom: function(contents, menuBody) {
- var offset = Position.positionedOffset(menuBody);
- var height = 0;
-
- if (menuBody.style.height) height = Element.getHeight(menuBody);
- else height = menuBody.clientHeight;
- height += offset[1];
- height += (document.all) ? 4 : 3;
-
- contents.style.top = height + 'px';
- contents.style.left = offset[0] + 'px';
-
- this.show(contents);
- },
-
- showAtLeft: function(contents, menuBody) {
- var offset = Position.positionedOffset(menuBody);
-
- contents.style.top = (offset[1] - 1) + 'px';
- contents.style.left = (offset[0] + menuBody.offsetWidth + 2) + 'px';
-
- this.show(contents);
- },
-
- hideAllTrigger: function(element) {
- return function(event) {
- if (!this.isMenuElement(Event.element(event))) this.hideAll(element);
- }
- },
-
- hideAll: function(element) {
- var nodes = element.childNodes;
- for (var i = 0; i < nodes.length; i++) {
- if (nodes[i].nodeType == 1) {
- if (Element.hasClassName(nodes[i], MenuBar.cssNames.subMenuContainer)) {
- this.hide(nodes[i]);
- }
-
- this.hideAll(nodes[i]);
- }
- }
- },
-
- show: function(element) {
- element.style.visibility = 'visible';
- },
-
- hide: function(element) {
- element.style.visibility = 'hidden';
- },
-
- getContainer: function(element) {
-
- if (!element) return;
- return document.getElementsByClassName(MenuBar.cssNames.subMenuContainer, element)[0];
- },
-
- getParentContainer: function(element) {
- var container = Element.getParentByClassName(MenuBar.cssNames.subMenuContainer, element);
- if (!container) {
- container = Element.getParentByClassName(MenuBar.cssNames.container, element);
- }
-
- return container;
- },
-
- isMenuElement: function(element) {
- return Element.hasClassName(element, MenuBar.cssNames.menuBodyHover)
- || Element.hasClassName(element, MenuBar.cssNames.subMenuBodyHover)
- || Element.hasClassName(element, MenuBar.cssNames.dirMark);
- }
-}
+// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+var MenuBar = Class.create();\r
+MenuBar.cssNames = {\r
+ container: 'menubar',\r
+ menu: 'menubar_menu',\r
+ menuBody: 'menubar_menuBody',\r
+ menuBodyHover: 'menubar_menuBodyHover',\r
+ subMenu: 'menubar_subMenu',\r
+ subMenuBody: 'menubar_subMenuBody',\r
+ subMenuBodyHover: 'menubar_subMenuBodyHover',\r
+ subMenuContainer: 'menubar_menuContainer',\r
+ dirMark: 'menubar_dirMark'\r
+}\r
+\r
+MenuBar.mark = {\r
+ dir: '>>'\r
+}\r
+\r
+MenuBar.prototype = {\r
+\r
+ initialize: function(element) {\r
+ this.options = Object.extend({\r
+ hideOnClickSubmenu: true\r
+ }, arguments[1]);\r
+\r
+ this.element = $(element);\r
+ Element.setStyle(this.element, {visibility: 'hidden'});\r
+ Element.hide(this.element);\r
+ \r
+ var options = Object.extend({\r
+ cssPrefix: 'custom_'\r
+ }, arguments[1] || {});\r
+ \r
+ var customCss = CssUtil.appendPrefix(options.cssPrefix, MenuBar.cssNames);\r
+ this.classNames = new CssUtil([MenuBar.cssNames, customCss]);\r
+ \r
+ this.clicked = [];\r
+ var topMenus = [];\r
+ var nodes = this.element.childNodes;\r
+ \r
+ for (var i = 0; i < nodes.length; i++) {\r
+ if (nodes[i].nodeType == 1) {\r
+ this.build(nodes[i], 'menu');\r
+ topMenus.push(nodes[i]);\r
+ } \r
+ }\r
+ \r
+ this.menubar = Builder.node('DIV', topMenus)\r
+ this.classNames.addClassNames(this.menubar, 'container');\r
+ this.element.appendChild(this.menubar);\r
+ \r
+ Event.observe(document, "click", this.hideAllTrigger(this.menubar).bindAsEventListener(this));\r
+ Element.setStyle(this.element, {visibility: 'visible'});\r
+ Element.show(this.element);\r
+ },\r
+ \r
+ build: function(element, className) {\r
+ this.classNames.addClassNames(element, className);\r
+ \r
+ var bodyContents = new Array();\r
+ var subMenus = new Array();\r
+ var nodes = element.childNodes;\r
+ \r
+ for (var i = 0; i < nodes.length; i++) {\r
+ if (nodes[i].nodeType == 1 && nodes[i].tagName == 'DIV') {\r
+ this.build(nodes[i], 'subMenu');\r
+ subMenus.push(nodes[i]);\r
+ } else {\r
+ bodyContents.push(nodes[i]);\r
+ }\r
+ }\r
+ \r
+ var bodyClass= className + 'Body';\r
+ var body = Builder.node('DIV', bodyContents);\r
+ this.classNames.addClassNames(body, bodyClass);\r
+ new Hover(body);\r
+ element.appendChild(body);\r
+ \r
+ if (subMenus.length > 0) {\r
+ if (className == 'subMenu') {\r
+ var subMenu = Builder.node('DIV', [MenuBar.mark.dir]);\r
+ this.classNames.addClassNames(subMenu, 'dirMark');\r
+ body.appendChild(subMenu);\r
+ }\r
+ \r
+ var container = Builder.node('DIV', subMenus);\r
+ this.classNames.addClassNames(container, 'subMenuContainer');\r
+ element.appendChild(container);\r
+ \r
+ this.hide(container);\r
+ }\r
+ Event.observe(element, "click", this.onClick.bindAsEventListener(this, body));\r
+ },\r
+ \r
+ onClick: function(event, menuBody) {\r
+ var menu = menuBody.parentNode;\r
+ var parentContainer = this.getParentContainer(menu);\r
+ \r
+ var container = this.getContainer(menu);\r
+ var className = MenuBar.cssNames.menu;\r
+ if (Element.hasClassName(menu, className)) {\r
+ if (this.clicked.length > 0) {\r
+ this.hideAll(this.menubar);\r
+ this.clicked = [];\r
+ }\r
+ if (container) this.showAtBottom(container, menuBody);\r
+\r
+ } else {\r
+ if (container) {\r
+ var lastMenuBody = this.clicked.pop();\r
+ var lastMenu = lastMenuBody.parentNode;\r
+ var lastContainer = this.getContainer(lastMenu);\r
+ var lastParentContainer = this.getParentContainer(lastMenu);\r
+ \r
+ if (lastMenu == menu) {\r
+ this.hide(container);\r
+ \r
+ } else if (Element.hasClassName(lastContainer, MenuBar.cssNames.container)) {\r
+ this.clicked.push(last);\r
+ \r
+ } else if (lastParentContainer == parentContainer) {\r
+ this.hide(lastContainer);\r
+ \r
+ } else {\r
+ this.clicked.push(lastMenuBody);\r
+ }\r
+ this.showAtLeft(container, menu);\r
+ } else if (this.options.hideOnClickSubmenu) {\r
+ this.hideAll(this.menubar);\r
+ }\r
+ }\r
+ \r
+ if (container) this.clicked.push(menuBody);\r
+ Event.stop(event);\r
+ },\r
+ \r
+ showAtBottom: function(contents, menuBody) {\r
+ var offset = Position.positionedOffset(menuBody);\r
+ var height = 0;\r
+ \r
+ if (menuBody.style.height) height = Element.getHeight(menuBody);\r
+ else height = menuBody.clientHeight;\r
+ height += offset[1];\r
+ height += (document.all) ? 4 : 3;\r
+ \r
+ contents.style.top = height + 'px';\r
+ contents.style.left = offset[0] + 'px';\r
+ \r
+ this.show(contents);\r
+ },\r
+ \r
+ showAtLeft: function(contents, menuBody) {\r
+ var offset = Position.positionedOffset(menuBody);\r
+ \r
+ contents.style.top = (offset[1] - 1) + 'px';\r
+ contents.style.left = (offset[0] + menuBody.offsetWidth + 2) + 'px';\r
+ \r
+ this.show(contents);\r
+ },\r
+\r
+ hideAllTrigger: function(element) {\r
+ return function(event) {\r
+ if (!this.isMenuElement(Event.element(event))) this.hideAll(element);\r
+ }\r
+ },\r
+ \r
+ hideAll: function(element) {\r
+ var nodes = element.childNodes;\r
+ for (var i = 0; i < nodes.length; i++) {\r
+ if (nodes[i].nodeType == 1) {\r
+ if (Element.hasClassName(nodes[i], MenuBar.cssNames.subMenuContainer)) {\r
+ this.hide(nodes[i]);\r
+ }\r
+ \r
+ this.hideAll(nodes[i]);\r
+ }\r
+ }\r
+ },\r
+ \r
+ show: function(element) {\r
+ element.style.visibility = 'visible';\r
+ }, \r
+ \r
+ hide: function(element) {\r
+ element.style.visibility = 'hidden';\r
+ },\r
+ \r
+ getContainer: function(element) {\r
+ \r
+ if (!element) return;\r
+ return document.getElementsByClassName(MenuBar.cssNames.subMenuContainer, element)[0];\r
+ },\r
+ \r
+ getParentContainer: function(element) {\r
+ var container = Element.getParentByClassName(MenuBar.cssNames.subMenuContainer, element);\r
+ if (!container) {\r
+ container = Element.getParentByClassName(MenuBar.cssNames.container, element);\r
+ }\r
+ \r
+ return container;\r
+ },\r
+\r
+ isMenuElement: function(element) {\r
+ return Element.hasClassName(element, MenuBar.cssNames.menuBodyHover)\r
+ || Element.hasClassName(element, MenuBar.cssNames.subMenuBodyHover)\r
+ || Element.hasClassName(element, MenuBar.cssNames.dirMark);\r
+ }\r
+}\r
-// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-NavPanel = Class.create();
-NavPanel.className = {
- navPanel : 'navPanel',
- panel: 'navPanel_panel',
- tab : 'navPanel_tab',
- tabLeftInactive : 'navPanel_tabLeftInactive',
- tabLeftActive: 'navPanel_tabLeftActive',
- tabMiddleInactive : 'navPanel_tabMiddleInactive',
- tabMiddleActive : 'navPanel_tabMiddleActive',
- tabRightInactive : 'navPanel_tabRightInactive',
- tabRightActive : 'navPanel_tabRightActive'
-}
-NavPanel.prototype = {
-
- initialize: function(element) {
- var options = Object.extend({
- selected: 1,
- cssPrefix: 'custom_'
- }, arguments[1] || {});
-
- this.options = options;
- this.element = $(element);
- Element.setStyle(this.element, {visibility: 'hidden'});
- Element.hide(this.element);
-
- var customCss = CssUtil.appendPrefix(this.options.cssPrefix, NavPanel.className);
- this.classNames = new CssUtil([NavPanel.className, customCss]);
-
- this.classNames.addClassNames(this.element, 'navPanel');
-
- this.selected = (this.options.selected > 0) ? this.options.selected - 1 : 0 ;
- this.start();
-
- Element.setStyle(this.element, {visibility: 'visible'});
- Element.show(this.element);
- },
-
- start: function() {
- this.tabs = [];
- this.panels = [];
- this.panelList = [];
-
- this.tabId = this.element.id + '_tab';
- this.tabLeftId = this.tabId + '_left';
- this.tabMiddleId = this.tabId + '_middle';
- this.tabRightId = this.tabId + '_right';
- this.panelId = this.element.id + '_panel';
-
- this.build();
- },
-
- build: function() {
- Element.cleanWhitespace(this.element);
- this.panelList = this.element.childNodes;
-
- for (var i = 0; i < this.panelList.length; i++) {
- if (this.panelList[i].nodeType != 1) {
- Element.remove(this.panelList[i]);
- i--;
- continue;
- }
- Element.cleanWhitespace(this.panelList[i]);
- var navSet = this.panelList[i].childNodes;
- this.buildTab(navSet[0], i);
- this.buildPanel(navSet[0], i);
- }
- this.selectTab();
- },
-
-
- buildTab: function(tabTitle, i) {
- var tab = Builder.node('div', {id:this.tabId + i});
- this.classNames.addClassNames(tab, 'tab');
- var tabLeft = Builder.node('div', {id:this.tabLeftId + i});
- var tabMiddle = Builder.node('div', {id:this.tabMiddleId + i});
- tabMiddle.appendChild(tabTitle);
- var tabRight = Builder.node('div',{id:this.tabRightId + i});
-
- tab.appendChild(tabLeft);
- tab.appendChild(tabMiddle);
- tab.appendChild(tabRight);
- Event.observe(tab, 'click', this.selectTab.bindAsEventListener(this));
-
- this.tabs[i] = tab;
- this.setTabInactive(tab);
- this.panelList[i].appendChild(tab);
- },
-
- buildPanel: function(panelContent, i) {
- var panel = Builder.node('div', {id:this.panelId + i});
- this.classNames.addClassNames(panel, 'panel');
- panel.appendChild(panelContent);
- Element.hide(panel);
- this.panels[i] = panel;
- this.panelList[i].appendChild(panel);
- },
-
- selectTab: function(e) {
- if (!e) {
- if (!this.panels[this.selected]) this.selected = 0;
- Element.show(this.panels[this.selected]);
- this.setTabActive(this.tabs[this.selected]);
- return;
- }
-
- var targetElement = Event.element(e);
- var targetIndex = this.getTargetIndex(targetElement);
- if (targetIndex == this.selected) {
- return;
- }
-
- var currentPanel = this.panels[this.selected];
- var targetPanel = this.panels[targetIndex];
- this.setTabInactive(this.tabs[this.selected]);
- this.setTabActive(this.tabs[targetIndex]);
- Element.show(targetPanel);
- Element.hide(currentPanel);
- this.selected = targetIndex;
- },
-
- setTabActive: function(tab) {
- var tabChildren = tab.childNodes;
-
- this.classNames.refreshClassNames(tabChildren[0], 'tabLeftActive');
- this.classNames.refreshClassNames(tabChildren[1], 'tabMiddleActive');
- this.classNames.refreshClassNames(tabChildren[2], 'tabRightActive');
- },
-
- setTabInactive: function(tab) {
- var tabChildren = tab.childNodes;
-
- this.classNames.refreshClassNames(tabChildren[0], 'tabLeftInactive');
- this.classNames.refreshClassNames(tabChildren[1], 'tabMiddleInactive');
- this.classNames.refreshClassNames(tabChildren[2], 'tabRightInactive');
- },
-
- getTargetIndex: function(element) {
-
- while(element) {
- if (element.id && element.id.indexOf(this.tabId, 0) >= 0) {
- var index = element.id.substring(this.tabId.length);
- if (!isNaN(index)) {
- return index;
- }
- }
- element = element.parentNode;
- }
- }
-}
+// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+NavPanel = Class.create();\r
+NavPanel.className = {\r
+ navPanel : 'navPanel',\r
+ panel: 'navPanel_panel',\r
+ tab : 'navPanel_tab',\r
+ tabLeftInactive : 'navPanel_tabLeftInactive',\r
+ tabLeftActive: 'navPanel_tabLeftActive',\r
+ tabMiddleInactive : 'navPanel_tabMiddleInactive',\r
+ tabMiddleActive : 'navPanel_tabMiddleActive',\r
+ tabRightInactive : 'navPanel_tabRightInactive',\r
+ tabRightActive : 'navPanel_tabRightActive'\r
+}\r
+NavPanel.prototype = {\r
+ \r
+ initialize: function(element) {\r
+ var options = Object.extend({\r
+ selected: 1,\r
+ cssPrefix: 'custom_'\r
+ }, arguments[1] || {});\r
+ \r
+ this.options = options;\r
+ this.element = $(element);\r
+ Element.setStyle(this.element, {visibility: 'hidden'});\r
+ Element.hide(this.element);\r
+ \r
+ var customCss = CssUtil.appendPrefix(this.options.cssPrefix, NavPanel.className);\r
+ this.classNames = new CssUtil([NavPanel.className, customCss]);\r
+ \r
+ this.classNames.addClassNames(this.element, 'navPanel');\r
+ \r
+ this.selected = (this.options.selected > 0) ? this.options.selected - 1 : 0 ;\r
+ this.start();\r
+ \r
+ Element.setStyle(this.element, {visibility: 'visible'});\r
+ Element.show(this.element);\r
+ },\r
+ \r
+ start: function() {\r
+ this.tabs = [];\r
+ this.panels = [];\r
+ this.panelList = [];\r
+\r
+ this.tabId = this.element.id + '_tab';\r
+ this.tabLeftId = this.tabId + '_left';\r
+ this.tabMiddleId = this.tabId + '_middle';\r
+ this.tabRightId = this.tabId + '_right';\r
+ this.panelId = this.element.id + '_panel';\r
+ \r
+ this.build(); \r
+ }, \r
+ \r
+ build: function() {\r
+ Element.cleanWhitespace(this.element);\r
+ this.panelList = this.element.childNodes;\r
+ \r
+ for (var i = 0; i < this.panelList.length; i++) {\r
+ if (this.panelList[i].nodeType != 1) {\r
+ Element.remove(this.panelList[i]);\r
+ i--;\r
+ continue;\r
+ }\r
+ Element.cleanWhitespace(this.panelList[i]);\r
+ var navSet = this.panelList[i].childNodes;\r
+ this.buildTab(navSet[0], i);\r
+ this.buildPanel(navSet[0], i);\r
+ }\r
+ this.selectTab();\r
+ },\r
+ \r
+ \r
+ buildTab: function(tabTitle, i) {\r
+ var tab = Builder.node('div', {id:this.tabId + i});\r
+ this.classNames.addClassNames(tab, 'tab');\r
+ var tabLeft = Builder.node('div', {id:this.tabLeftId + i});\r
+ var tabMiddle = Builder.node('div', {id:this.tabMiddleId + i});\r
+ tabMiddle.appendChild(tabTitle);\r
+ var tabRight = Builder.node('div',{id:this.tabRightId + i});\r
+ \r
+ tab.appendChild(tabLeft);\r
+ tab.appendChild(tabMiddle);\r
+ tab.appendChild(tabRight);\r
+ Event.observe(tab, 'click', this.selectTab.bindAsEventListener(this));\r
+\r
+ this.tabs[i] = tab;\r
+ this.setTabInactive(tab);\r
+ this.panelList[i].appendChild(tab);\r
+ },\r
+ \r
+ buildPanel: function(panelContent, i) {\r
+ var panel = Builder.node('div', {id:this.panelId + i});\r
+ this.classNames.addClassNames(panel, 'panel');\r
+ panel.appendChild(panelContent);\r
+ Element.hide(panel);\r
+ this.panels[i] = panel;\r
+ this.panelList[i].appendChild(panel);\r
+ },\r
+ \r
+ selectTab: function(e) {\r
+ if (!e) {\r
+ if (!this.panels[this.selected]) this.selected = 0;\r
+ Element.show(this.panels[this.selected]);\r
+ this.setTabActive(this.tabs[this.selected]);\r
+ return;\r
+ }\r
+ \r
+ var targetElement = Event.element(e);\r
+ var targetIndex = this.getTargetIndex(targetElement);\r
+ if (targetIndex == this.selected) {\r
+ return;\r
+ }\r
+ \r
+ var currentPanel = this.panels[this.selected];\r
+ var targetPanel = this.panels[targetIndex];\r
+ this.setTabInactive(this.tabs[this.selected]);\r
+ this.setTabActive(this.tabs[targetIndex]);\r
+ Element.show(targetPanel);\r
+ Element.hide(currentPanel);\r
+ this.selected = targetIndex; \r
+ },\r
+ \r
+ setTabActive: function(tab) {\r
+ var tabChildren = tab.childNodes;\r
+\r
+ this.classNames.refreshClassNames(tabChildren[0], 'tabLeftActive');\r
+ this.classNames.refreshClassNames(tabChildren[1], 'tabMiddleActive');\r
+ this.classNames.refreshClassNames(tabChildren[2], 'tabRightActive');\r
+ },\r
+ \r
+ setTabInactive: function(tab) {\r
+ var tabChildren = tab.childNodes;\r
+ \r
+ this.classNames.refreshClassNames(tabChildren[0], 'tabLeftInactive');\r
+ this.classNames.refreshClassNames(tabChildren[1], 'tabMiddleInactive');\r
+ this.classNames.refreshClassNames(tabChildren[2], 'tabRightInactive');\r
+ },\r
+\r
+ getTargetIndex: function(element) {\r
+\r
+ while(element) {\r
+ if (element.id && element.id.indexOf(this.tabId, 0) >= 0) {\r
+ var index = element.id.substring(this.tabId.length);\r
+ if (!isNaN(index)) {\r
+ return index;\r
+ }\r
+ }\r
+ element = element.parentNode;\r
+ }\r
+ }\r
+}\r
-// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-var SelectableTable = Class.create();
-
-SelectableTable.classNames = {
- table: 'selectableTable_table',
- tr: 'selectableTable_tr',
- trHover: 'selectableTable_trHover',
- trSelected: 'selectableTable_trSelected'
-}
-
-SelectableTable.prototype = {
- initialize: function(element) {
- this.element = $(element);
- Element.setStyle(this.element, {visibility: 'hidden'});
- var defaultOptions = {
- arrayDefaultData: [],
- flagAllowUnselect: true,
- flagInitialAllowMultiple: false,
- flagKeypressAvailable: false,
- flagKeypressDeleteAvailable: false,
- flagKeypressInsertAvailable: false,
- functionPostAdd: Prototype.emptyFunction,
- functionPostDelete: Prototype.emptyFunction,
- functionPostPressLeft: Prototype.emptyFunction,
- functionPostPressRight: Prototype.emptyFunction,
- functionPostSelect: Prototype.emptyFunction,
- functionPostUnselect: Prototype.emptyFunction,
- functionPreAdd: function() {return true;},
- functionPreDelete: function() {return true;},
- functionSubmit: Prototype.emptyFunction,
- initialSelected: null,
- prefixTrId: 'selectable_table_',
- prefixCSS: 'custom_'
- }
- this.options = Object.extend(defaultOptions, arguments[1] || {});
- this.classNames = new CssUtil([SelectableTable.classNames, CssUtil.appendPrefix(this.options.prefixCSS, SelectableTable.classNames)]);
- this.documentListener = this.eventKeypress.bindAsEventListener(this);
- this.flagAllowMultiple = this.options.flagInitialAllowMultiple;
- this.flagAvailable = true;
- this.focused = null;
- this.lastSelected = null;
- this.newNumber = 1;
- this.selected = new Object();
- this.build();
- if(arguments[2]) {
- this.selectEffect(this.buildTrId(arguments[2]));
- }
- Element.setStyle(this.element, {visibility: 'visible'});
- },
-
- add: function() {
- if(!this.flagAvailable) {return;}
- if(!this.options.functionPreAdd(this)) {return;}
- if(arguments[0] == null) {arguments[0] = this.options.arrayDefaultData;}
- if(typeof(arguments[0]) != 'string') {
- arguments = arguments[0];
- }
- if(arguments[0] == null) {return;}
- var objTr, objTd;
- objTr = document.createElement('tr');
- objTr.id = 'new_' + this.newNumber;
- this.buildTr(objTr);
- for(var i = 0; i < arguments.length; i++) {
- objTd = document.createElement('td');
- objTd.innerHTML = arguments[i];
- objTr.appendChild(objTd);
- }
- this.element.tBodies[0].appendChild(objTr);
- this.newNumber++;
- this.options.functionPostAdd(this);
- },
-
- build: function() {
- var lines = this.element.tBodies[0].rows;
- this.classNames.addClassNames(this.element, 'table');
- Event.observe(document, 'keypress', this.documentListener);
- for(var i = 0; i < lines.length; i++) {
- this.buildTr(lines[i]);
- }
- var selected = this.options.initialSelected
- if(selected) {
- this.selectEffect(this.buildTrId(selected));
- }
- },
-
- buildTr: function(objTr) {
- objTr.id = this.buildTrId(objTr.id);
- this.classNames.addClassNames(objTr, 'tr');
- Event.observe(objTr, 'click', this.eventClick.bindAsEventListener(this));
- Event.observe(objTr, 'dblclick', this.eventDoubleClick.bindAsEventListener(this));
- Event.observe(objTr, 'mouseout', this.eventFocusOut.bindAsEventListener(this));
- Event.observe(objTr, 'mouseover', this.eventFocusOver.bindAsEventListener(this));
- },
-
- buildTrId: function(strId) {
- return this.options.prefixTrId + strId
- },
-
- deleteAll: function() {
- if(!this.flagAvailable) {return;}
- if(!this.options.functionPreDelete(this)) {return;}
- for(var trId in this.selected) {
- this.element.tBodies[0].removeChild($(trId));
- delete this.selected[trId];
- }
- this.focused = null;
- this.options.functionPostDelete(this);
- },
-
- eventClick: function(event) {
- if(!this.flagAvailable) {return;}
- if(event.shiftKey) {
- this.selectOrUnselectRange(Event.findElement(event, 'tr').id);
- } else {
- this.selectOrUnselect(Event.findElement(event, 'tr').id, event.ctrlKey);
- }
- },
-
- eventDoubleClick: function(event) {
- if(!this.flagAvailable) {return;}
- if(this.flagAllowMultiple) {
- this.select(Event.findElement(event, 'tr').id, false);
- this.submit();
- }
- },
-
- eventFocusOut: function(event) {
- if(!this.flagAvailable) {return;}
- this.focusOff();
- },
-
- eventFocusOver: function(event) {
- if(!this.flagAvailable) {return;}
- this.focusOn(Event.findElement(event, 'tr').id);
- Event.findElement(event, 'tr').focus();
- },
-
- eventKeypress: function(event) {
- if(!this.flagAvailable) {return;}
- if(!this.options.flagKeypressAvailable) {return;}
- switch(event.keyCode) {
- case 13: //Enter
- if(event.shiftKey) {
- this.selectOrUnselectRange(this.focused);
- } else {
- this.selectOrUnselect(this.focused, event.ctrlKey);
- }
- break;
- case 37: //Left
- this.options.functionPostPressLeft(this);
- break;
- case 38: //Up
- this.focusMove('up');
- break;
- case 39: //Right
- this.options.functionPostPressRight(this);
- break;
- case 40: //Down
- this.focusMove('down');
- break;
- case 45: //Insert
- if(this.options.flagKeypressInsertAvailable) {this.add();}
- break;
- case 46: //Delete
- if(this.options.flagKeypressDeleteAvailable) {this.deleteAll();}
- break;
- }
- },
-
- focusMove: function(direction) {
- if(!this.flagAvailable) {return;}
- if(this.focused == null) {
- this.focusOn(this.element.tBodies[0].rows[0].id);
- } else {
- var rowIndex = $(this.focused).rowIndex;
- var correctionValue, flagEdge;
- switch(direction) {
- case 'down':
- correctionValue = 1;
- flagEdge = this.isBottom(rowIndex);
- break;
- case 'up':
- correctionValue = -1;
- flagEdge = this.isTop(rowIndex);
- break;
- }
- if(!flagEdge) {
- this.focusOn(this.element.rows[rowIndex + correctionValue].id);
- }
- }
- },
-
- focusOff: function() {
- if(!this.flagAvailable) {return;}
- if(this.focused != null) {
- var objTr = $(this.focused);
- this.classNames.removeClassNames(objTr, 'trHover');
- this.focused = null;
- }
- },
-
- focusOn: function(trId) {
- if(!this.flagAvailable) {return;}
- if($(trId) != null) {
- this.focusOff();
- this.classNames.addClassNames($(trId), 'trHover');
- this.focused = trId;
- }
- },
-
- getSelected: function() {
- var selectedIdList = new Array();
- for(var trId in this.selected) {
- selectedIdList.push(trId.replace(this.options.prefixTrId, ''));
- }
- return selectedIdList;
- },
-
- getSelectedElement: function(id) {
- var trId = this.options.prefixTrId + id;
- return $(trId)
- },
-
- isBottom: function(rowIndex) {
- return (rowIndex == this.element.rows.length - 1) ? true : false;
- },
-
- isTop: function(rowIndex) {
- return (rowIndex == this.element.tBodies[0].rows[0].rowIndex) ? true : false;
- },
-
- makeAvailable: function() {
- this.flagAvailable = true;
- },
-
- makeMultiple: function() {
- this.flagAllowMultiple = true;
- },
-
- makeSingular: function() {
- this.flagAllowMultiple = false;
- this.unselectAll();
- },
-
- makeUnavailable: function() {
- this.flagAvailable = false;
- },
-
- removeEventFromDocument: function() {
- Event.stopObserving(document, 'keypress', this.documentListener);
- },
-
- select: function(trId, ctrl) {
- if(!this.flagAvailable) {return;}
- this.selectEffect(trId, ctrl);
- this.lastSelected = trId;
- this.options.functionPostSelect(this);
- if(!this.flagAllowMultiple) {
- this.submit();
- }
- },
-
- selectAll: function() {
- if(!this.flagAvailable) {return;}
- if(!this.flagAllowMultiple) {return;}
- this.selected = new Object();
- var lines = this.element.tBodies[0].rows;
- for(var i = 0; i < lines.length; i++) {
- this.select(lines[i].id, true);
- }
- },
-
- selectEffect: function(trId, ctrl) {
- if($(trId)) {
- if(!this.flagAllowMultiple || !ctrl) {
- this.unselectAll();
- }
- this.classNames.addClassNames($(trId), 'trSelected');
- this.selected[trId] = true;
- }
- },
-
- selectOrUnselect: function(trId, ctrl) {
- if(!this.flagAvailable) {return;}
- if(trId == null) {return;}
- if(ctrl && this.selected[trId]) {
- if(!this.flagAllowMultiple && !this.options.flagAllowUnselect) {return;}
- this.unselect(trId);
- } else {
- this.select(trId, ctrl);
- }
- },
-
- selectOrUnselectRange: function(trId) {
- if(!this.flagAvailable) {return;}
- if(trId == null) {return;}
- if(this.lastSelected == null || this.lastSelected == trId) {
- this.selectOrUnselect(trId);
- return;
- }
- var flagSelect = false;
- var lines = this.element.tBodies[0].rows;
- var lastSelected = this.lastSelected
- for(var i = 0; i < lines.length; i++) {
- if(lines[i].id == trId || lines[i].id == lastSelected) {
- flagSelect = (flagSelect) ? false : true;
- } else if(!flagSelect) {
- continue;
- }
- if(this.selected[lastSelected]) {
- this.select(lines[i].id, true);
- } else {
- this.unselect(lines[i].id);
- }
- }
- },
-
- submit: function(trId) {
- if(!this.flagAvailable) {return;}
- var selected = this.getSelected();
- this.options.functionSubmit(selected[0]);
- },
-
- unselect: function(trId) {
- if(!this.flagAvailable) {return;}
- this.classNames.removeClassNames($(trId), 'trSelected');
- delete this.selected[trId];
- this.lastSelected = trId;
- this.options.functionPostUnselect(this);
- },
-
- unselectAll: function() {
- if(!this.flagAvailable) {return;}
- var lines = this.element.tBodies[0].rows;
- for(var i = 0; i < lines.length; i++) {
- this.unselect(lines[i].id);
- }
- }
-}
-
-var SelectableTableManager = Class.create();
-SelectableTableManager.prototype = {
- initialize: function() {
- this.active = null,
- this.list = {}
- },
- activate: function(key) {
- this.stop();
- if(this.list[key]) {
- this.list[key].makeAvailable();
- this.active = this.list[key];
- } else {
- this.active = null;
- }
- },
- push: function(key, element) {
- this.list[key] = element;
- },
- start: function() {
- if(this.active) {
- this.active.makeAvailable();
- }
- },
- stop: function() {
- $H(this.list).each(
- function(el) {
- if(el[1]) {
- el[1].makeUnavailable();
- }
- }
- );
- }
-}
+// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+var SelectableTable = Class.create();\r
+\r
+SelectableTable.classNames = {\r
+ table: 'selectableTable_table',\r
+ tr: 'selectableTable_tr',\r
+ trHover: 'selectableTable_trHover',\r
+ trSelected: 'selectableTable_trSelected'\r
+}\r
+\r
+SelectableTable.prototype = {\r
+ initialize: function(element) {\r
+ this.element = $(element);\r
+ Element.setStyle(this.element, {visibility: 'hidden'});\r
+ var defaultOptions = {\r
+ arrayDefaultData: [],\r
+ flagAllowUnselect: true,\r
+ flagInitialAllowMultiple: false,\r
+ flagKeypressAvailable: false,\r
+ flagKeypressDeleteAvailable: false,\r
+ flagKeypressInsertAvailable: false,\r
+ functionPostAdd: Prototype.emptyFunction,\r
+ functionPostDelete: Prototype.emptyFunction,\r
+ functionPostPressLeft: Prototype.emptyFunction,\r
+ functionPostPressRight: Prototype.emptyFunction,\r
+ functionPostSelect: Prototype.emptyFunction,\r
+ functionPostUnselect: Prototype.emptyFunction,\r
+ functionPreAdd: function() {return true;},\r
+ functionPreDelete: function() {return true;},\r
+ functionSubmit: Prototype.emptyFunction,\r
+ initialSelected: null,\r
+ prefixTrId: 'selectable_table_',\r
+ prefixCSS: 'custom_'\r
+ }\r
+ this.options = Object.extend(defaultOptions, arguments[1] || {});\r
+ this.classNames = new CssUtil([SelectableTable.classNames, CssUtil.appendPrefix(this.options.prefixCSS, SelectableTable.classNames)]);\r
+ this.documentListener = this.eventKeypress.bindAsEventListener(this);\r
+ this.flagAllowMultiple = this.options.flagInitialAllowMultiple;\r
+ this.flagAvailable = true;\r
+ this.focused = null;\r
+ this.lastSelected = null;\r
+ this.newNumber = 1;\r
+ this.selected = new Object();\r
+ this.build();\r
+ if(arguments[2]) {\r
+ this.selectEffect(this.buildTrId(arguments[2]));\r
+ }\r
+ Element.setStyle(this.element, {visibility: 'visible'});\r
+ },\r
+\r
+ add: function() {\r
+ if(!this.flagAvailable) {return;}\r
+ if(!this.options.functionPreAdd(this)) {return;}\r
+ if(arguments[0] == null) {arguments[0] = this.options.arrayDefaultData;}\r
+ if(typeof(arguments[0]) != 'string') {\r
+ arguments = arguments[0];\r
+ }\r
+ if(arguments[0] == null) {return;}\r
+ var objTr, objTd;\r
+ objTr = document.createElement('tr');\r
+ objTr.id = 'new_' + this.newNumber;\r
+ this.buildTr(objTr);\r
+ for(var i = 0; i < arguments.length; i++) {\r
+ objTd = document.createElement('td');\r
+ objTd.innerHTML = arguments[i];\r
+ objTr.appendChild(objTd);\r
+ }\r
+ this.element.tBodies[0].appendChild(objTr);\r
+ this.newNumber++;\r
+ this.options.functionPostAdd(this);\r
+ },\r
+\r
+ build: function() {\r
+ var lines = this.element.tBodies[0].rows;\r
+ this.classNames.addClassNames(this.element, 'table');\r
+ Event.observe(document, 'keypress', this.documentListener);\r
+ for(var i = 0; i < lines.length; i++) {\r
+ this.buildTr(lines[i]);\r
+ }\r
+ var selected = this.options.initialSelected\r
+ if(selected) {\r
+ this.selectEffect(this.buildTrId(selected));\r
+ }\r
+ },\r
+\r
+ buildTr: function(objTr) {\r
+ objTr.id = this.buildTrId(objTr.id);\r
+ this.classNames.addClassNames(objTr, 'tr');\r
+ Event.observe(objTr, 'click', this.eventClick.bindAsEventListener(this));\r
+ Event.observe(objTr, 'dblclick', this.eventDoubleClick.bindAsEventListener(this));\r
+ Event.observe(objTr, 'mouseout', this.eventFocusOut.bindAsEventListener(this));\r
+ Event.observe(objTr, 'mouseover', this.eventFocusOver.bindAsEventListener(this));\r
+ },\r
+\r
+ buildTrId: function(strId) {\r
+ return this.options.prefixTrId + strId\r
+ },\r
+\r
+ deleteAll: function() {\r
+ if(!this.flagAvailable) {return;}\r
+ if(!this.options.functionPreDelete(this)) {return;}\r
+ for(var trId in this.selected) {\r
+ this.element.tBodies[0].removeChild($(trId));\r
+ delete this.selected[trId];\r
+ }\r
+ this.focused = null;\r
+ this.options.functionPostDelete(this);\r
+ },\r
+\r
+ eventClick: function(event) {\r
+ if(!this.flagAvailable) {return;}\r
+ if(event.shiftKey) {\r
+ this.selectOrUnselectRange(Event.findElement(event, 'tr').id);\r
+ } else {\r
+ this.selectOrUnselect(Event.findElement(event, 'tr').id, event.ctrlKey);\r
+ }\r
+ },\r
+\r
+ eventDoubleClick: function(event) {\r
+ if(!this.flagAvailable) {return;}\r
+ if(this.flagAllowMultiple) {\r
+ this.select(Event.findElement(event, 'tr').id, false);\r
+ this.submit();\r
+ }\r
+ },\r
+\r
+ eventFocusOut: function(event) {\r
+ if(!this.flagAvailable) {return;}\r
+ this.focusOff();\r
+ },\r
+\r
+ eventFocusOver: function(event) {\r
+ if(!this.flagAvailable) {return;}\r
+ this.focusOn(Event.findElement(event, 'tr').id);\r
+ Event.findElement(event, 'tr').focus();\r
+ },\r
+\r
+ eventKeypress: function(event) {\r
+ if(!this.flagAvailable) {return;}\r
+ if(!this.options.flagKeypressAvailable) {return;}\r
+ switch(event.keyCode) {\r
+ case 13: //Enter\r
+ if(event.shiftKey) {\r
+ this.selectOrUnselectRange(this.focused);\r
+ } else {\r
+ this.selectOrUnselect(this.focused, event.ctrlKey);\r
+ }\r
+ break;\r
+ case 37: //Left\r
+ this.options.functionPostPressLeft(this);\r
+ break;\r
+ case 38: //Up\r
+ this.focusMove('up');\r
+ break;\r
+ case 39: //Right\r
+ this.options.functionPostPressRight(this);\r
+ break;\r
+ case 40: //Down\r
+ this.focusMove('down');\r
+ break;\r
+ case 45: //Insert\r
+ if(this.options.flagKeypressInsertAvailable) {this.add();}\r
+ break;\r
+ case 46: //Delete\r
+ if(this.options.flagKeypressDeleteAvailable) {this.deleteAll();}\r
+ break;\r
+ }\r
+ },\r
+\r
+ focusMove: function(direction) {\r
+ if(!this.flagAvailable) {return;}\r
+ if(this.focused == null) {\r
+ this.focusOn(this.element.tBodies[0].rows[0].id);\r
+ } else {\r
+ var rowIndex = $(this.focused).rowIndex;\r
+ var correctionValue, flagEdge;\r
+ switch(direction) {\r
+ case 'down':\r
+ correctionValue = 1;\r
+ flagEdge = this.isBottom(rowIndex);\r
+ break;\r
+ case 'up':\r
+ correctionValue = -1;\r
+ flagEdge = this.isTop(rowIndex);\r
+ break;\r
+ }\r
+ if(!flagEdge) {\r
+ this.focusOn(this.element.rows[rowIndex + correctionValue].id);\r
+ }\r
+ }\r
+ },\r
+\r
+ focusOff: function() {\r
+ if(!this.flagAvailable) {return;}\r
+ if(this.focused != null) {\r
+ var objTr = $(this.focused);\r
+ this.classNames.removeClassNames(objTr, 'trHover');\r
+ this.focused = null;\r
+ }\r
+ },\r
+\r
+ focusOn: function(trId) {\r
+ if(!this.flagAvailable) {return;}\r
+ if($(trId) != null) {\r
+ this.focusOff();\r
+ this.classNames.addClassNames($(trId), 'trHover');\r
+ this.focused = trId;\r
+ }\r
+ },\r
+\r
+ getSelected: function() {\r
+ var selectedIdList = new Array();\r
+ for(var trId in this.selected) {\r
+ selectedIdList.push(trId.replace(this.options.prefixTrId, ''));\r
+ }\r
+ return selectedIdList;\r
+ },\r
+\r
+ getSelectedElement: function(id) {\r
+ var trId = this.options.prefixTrId + id;\r
+ return $(trId)\r
+ },\r
+\r
+ isBottom: function(rowIndex) {\r
+ return (rowIndex == this.element.rows.length - 1) ? true : false;\r
+ },\r
+\r
+ isTop: function(rowIndex) {\r
+ return (rowIndex == this.element.tBodies[0].rows[0].rowIndex) ? true : false;\r
+ },\r
+\r
+ makeAvailable: function() {\r
+ this.flagAvailable = true;\r
+ },\r
+\r
+ makeMultiple: function() {\r
+ this.flagAllowMultiple = true;\r
+ },\r
+\r
+ makeSingular: function() {\r
+ this.flagAllowMultiple = false;\r
+ this.unselectAll();\r
+ },\r
+\r
+ makeUnavailable: function() {\r
+ this.flagAvailable = false;\r
+ },\r
+\r
+ removeEventFromDocument: function() {\r
+ Event.stopObserving(document, 'keypress', this.documentListener);\r
+ },\r
+\r
+ select: function(trId, ctrl) {\r
+ if(!this.flagAvailable) {return;}\r
+ this.selectEffect(trId, ctrl);\r
+ this.lastSelected = trId;\r
+ this.options.functionPostSelect(this);\r
+ if(!this.flagAllowMultiple) {\r
+ this.submit();\r
+ }\r
+ },\r
+\r
+ selectAll: function() {\r
+ if(!this.flagAvailable) {return;}\r
+ if(!this.flagAllowMultiple) {return;}\r
+ this.selected = new Object();\r
+ var lines = this.element.tBodies[0].rows;\r
+ for(var i = 0; i < lines.length; i++) {\r
+ this.select(lines[i].id, true);\r
+ }\r
+ },\r
+\r
+ selectEffect: function(trId, ctrl) {\r
+ if($(trId)) {\r
+ if(!this.flagAllowMultiple || !ctrl) {\r
+ this.unselectAll();\r
+ }\r
+ this.classNames.addClassNames($(trId), 'trSelected');\r
+ this.selected[trId] = true;\r
+ }\r
+ },\r
+\r
+ selectOrUnselect: function(trId, ctrl) {\r
+ if(!this.flagAvailable) {return;}\r
+ if(trId == null) {return;}\r
+ if(ctrl && this.selected[trId]) {\r
+ if(!this.flagAllowMultiple && !this.options.flagAllowUnselect) {return;}\r
+ this.unselect(trId);\r
+ } else {\r
+ this.select(trId, ctrl);\r
+ }\r
+ },\r
+\r
+ selectOrUnselectRange: function(trId) {\r
+ if(!this.flagAvailable) {return;}\r
+ if(trId == null) {return;}\r
+ if(this.lastSelected == null || this.lastSelected == trId) {\r
+ this.selectOrUnselect(trId);\r
+ return;\r
+ }\r
+ var flagSelect = false;\r
+ var lines = this.element.tBodies[0].rows;\r
+ var lastSelected = this.lastSelected\r
+ for(var i = 0; i < lines.length; i++) {\r
+ if(lines[i].id == trId || lines[i].id == lastSelected) {\r
+ flagSelect = (flagSelect) ? false : true;\r
+ } else if(!flagSelect) {\r
+ continue;\r
+ }\r
+ if(this.selected[lastSelected]) {\r
+ this.select(lines[i].id, true);\r
+ } else {\r
+ this.unselect(lines[i].id);\r
+ }\r
+ }\r
+ },\r
+\r
+ submit: function(trId) {\r
+ if(!this.flagAvailable) {return;}\r
+ var selected = this.getSelected();\r
+ this.options.functionSubmit(selected[0]);\r
+ },\r
+\r
+ unselect: function(trId) {\r
+ if(!this.flagAvailable) {return;}\r
+ this.classNames.removeClassNames($(trId), 'trSelected');\r
+ delete this.selected[trId];\r
+ this.lastSelected = trId;\r
+ this.options.functionPostUnselect(this);\r
+ },\r
+\r
+ unselectAll: function() {\r
+ if(!this.flagAvailable) {return;}\r
+ var lines = this.element.tBodies[0].rows;\r
+ for(var i = 0; i < lines.length; i++) {\r
+ this.unselect(lines[i].id);\r
+ }\r
+ }\r
+}\r
+\r
+var SelectableTableManager = Class.create();\r
+SelectableTableManager.prototype = {\r
+ initialize: function() {\r
+ this.active = null,\r
+ this.list = {}\r
+ },\r
+ activate: function(key) {\r
+ this.stop();\r
+ if(this.list[key]) {\r
+ this.list[key].makeAvailable();\r
+ this.active = this.list[key];\r
+ } else {\r
+ this.active = null;\r
+ }\r
+ },\r
+ push: function(key, element) {\r
+ this.list[key] = element;\r
+ },\r
+ start: function() {\r
+ if(this.active) {\r
+ this.active.makeAvailable();\r
+ }\r
+ },\r
+ stop: function() {\r
+ $H(this.list).each(\r
+ function(el) {\r
+ if(el[1]) {\r
+ el[1].makeUnavailable();\r
+ }\r
+ }\r
+ );\r
+ }\r
+}\r
-// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-
-SideBarBox = Class.create();
-
-SideBarBox.className = {
- panelContainer : 'sideBarBox_panelContainer',
- tabContainer : 'sideBarBox_tabContainer',
- title : 'sideBarBox_tabTitle',
- tab : 'sideBarBox_tab',
- tabTopInactive : 'sideBarBox_tabTopInactive',
- tabTopActive : 'sideBarBox_tabTopActive',
- tabMiddleInactive : 'sideBarBox_tabMiddleInactive',
- tabMiddleActive : 'sideBarBox_tabMiddleActive',
- tabBottomInactive : 'sideBarBox_tabBottomInactive',
- tabBottomActive : 'sideBarBox_tabBottomActive'
-}
-
-SideBarBox.prototype = {
-
- initialize: function(element) {
- var options = Object.extend({
- selected: 1,
- beforeSelect: function() {return true},
- afterSelect: Prototype.emptyFunction,
- visible: false,
- close: true,
- cssPrefix: 'custom_'
- }, arguments[1] || {});
-
- this.options = options;
- this.element = $(element);
- Element.setStyle(this.element, {visibility: 'hidden'});
-
- var customCss = CssUtil.appendPrefix(this.options.cssPrefix, SideBarBox.className);
- this.classNames = new CssUtil([SideBarBox.className, customCss]);
-
- this.start();
- Element.setStyle(this.element, {visibility: 'visible'});
- },
-
- start: function() {
- this.tabs = [];
- this.panelContents = [];
- this.tabSets = [];
-
- this.visible = this.options.visible;
- this.selected = (this.options.selected > 0) ? this.options.selected - 1 : 0 ;
- this.selected = (this.visible) ? this.selected : -1;
-
- this.tabId = this.element.id + '_tab';
- this.tabTopId = this.tabId + '_top';
- this.tabMiddleId = this.tabId + '_middle';
- this.tabBottomId = this.tabId + '_bottom';
- this.tabContainerId = this.element.id + '_tabContainer';
- this.panelId = this.element.id + '_panel';
- this.panelContainerId = this.element.id + '_panelContainer';
-
- this.tabContainer = null;
- this.panelContainer = null;
-
- this.buildTabBox();
- },
-
- buildTabBox: function() {
- this.buildContainers();
-
- Element.cleanWhitespace(this.element);
- this.tabSets = this.element.childNodes;
- if (this.visible && this.selected >= this.tabSets.length) {
- this.selected = 0;
- }
- var i = 0;
- while(this.tabSets.length > 0){
- var tabSet = this.tabSets[0];
- var tabPanel = $A(tabSet.childNodes).detect(function(c) {
- return (c.nodeType == 1) && (c.tagName.toLowerCase() == 'div');
- });
- this.buildPanel(tabPanel, i);
- this.buildTab(tabSet, i);
- i++;
- }
- this.addContainers();
- },
-
- buildContainers : function() {
- this.tabContainer = Builder.node('div',{id:this.tabContainerId});
- this.classNames.addClassNames(this.tabContainer, 'tabContainer');
- this.panelContainer = Builder.node('div',
- {
- id:this.panelContainerId
- }
- );
- this.classNames.addClassNames(this.panelContainer, 'panelContainer');
-
- if (!this.visible) {
- Element.hide(this.panelContainer);
- }
- },
-
- addContainers : function() {
- this.element.appendChild(this.panelContainer);
- this.element.appendChild(this.tabContainer);
- this.element.appendChild(Builder.node('div', {style:'clear: left'}));
- },
-
- buildTab: function(tab, i) {
- var tabTitle = tab.childNodes;
- tab.id = this.tabId + i;
- this.classNames.addClassNames(tab, 'tab');
- var top = Builder.node('div',{id: this.tabTopId + i});
- var middle = Builder.node('div', {id: this.tabMiddleId + i}, $A(tabTitle));
- var bottom = Builder.node('div', {id: this.tabBottomId + i});
-
- tab.appendChild(top);
- tab.appendChild(middle);
- tab.appendChild(bottom);
- Event.observe(tab, 'click', this.selectTab.bindAsEventListener(this));
-
- this.tabs[i] = tab;
- this.tabContainer.appendChild(tab);
- if ( i != this.selected) {
- this.setTabInactive(tab);
- } else {
- this.setTabActive(tab);
- }
- },
-
- buildPanel: function(panelContent, i) {
- var panel = Builder.node('div', {id: this.panelId + i});
- panel.appendChild(panelContent);
- this.panelContents[i] = panel;
- if(i != this.selected) {
- Element.hide(panel);
- }
- this.panelContainer.appendChild(panel);
- },
-
- selectTab: function(e) {
- if (!this.options.beforeSelect()) return;
- if (!e) {
- this.setTabActive(this.tabs[this.selected]);
- Element.show(this.panelList[this.selected]);
- return;
- }
-
- var currentPanel = this.panelContents[this.selected];
- var currentTab = this.tabs[this.selected];
-
- var targetElement = null;
- if (e.nodeType) {
- targetElement = e;
- } else {
- targetElement = Event.element(e);
- }
- var targetIndex = this.getTargetIndex(targetElement);
- var targetPanel = this.panelContents[targetIndex];
- var targetTab = this.tabs[targetIndex];
- if (this.visible) {
- if (targetTab.id == currentTab.id) {
- if (this.options.close) {
- Effect.SlideRightOutOfView(this.panelContainer);
- this.visible = false;
- this.selected = -1;
- this.setTabInactive(currentTab);
- Element.toggle(targetPanel);
- }
- } else {
- this.setTabActive(targetTab);
- this.setTabInactive(currentTab);
- Element.toggle(currentPanel);
- Element.toggle(targetPanel);
- this.selected = targetIndex;
- }
- } else {
- this.setTabActive(targetTab);
- Element.toggle(targetPanel);
- Effect.SlideRightIntoView(this.panelContainer);
- this.visible = true;
- this.selected = targetIndex;
- }
- this.options.afterSelect(targetPanel, currentPanel);
- },
-
- setTabActive: function(tab) {
- var tabChildren = tab.childNodes;
-
- this.classNames.refreshClassNames(tabChildren[0], 'tabTopActive');
- this.classNames.refreshClassNames(tabChildren[1], 'tabMiddleActive');
- this.classNames.refreshClassNames(tabChildren[2], 'tabBottomActive');
- },
-
- setTabInactive: function(tab) {
- var tabChildren = tab.childNodes;
-
- this.classNames.refreshClassNames(tabChildren[0], 'tabTopInactive');
- this.classNames.refreshClassNames(tabChildren[1], 'tabMiddleInactive');
- this.classNames.refreshClassNames(tabChildren[2], 'tabBottomInactive');
- },
-
- getTargetIndex: function(element) {
- while(element) {
- if (element.id && element.id.indexOf(this.tabId, 0) >= 0) {
- var index = element.id.substring(this.tabId.length);
- if (!isNaN(index)) {
- return index;
- }
- }
- element = element.parentNode;
- }
- },
-
- hasNextTab: function() {
- return this.getNextTab() ? true : false;
- },
-
- hasPreviousTab: function() {
- return this.getPreviousTab() ? true : false;
- },
-
- getNextTab: function() {
- return Element.next(this.getCurrentTab());
- },
-
- getPreviousTab: function() {
- return Element.previous(this.getCurrentTab());
- },
-
- selectNextTab: function() {
- this.selectTab(this.getNextTab());
- },
-
- selectPreviousTab: function() {
- this.selectTab(this.getPreviousTab());
- },
-
- tabCount: function() {
- return this.tabs.inject(0, function(i, t) {
- return t ? ++i : i;
- })
- },
-
- getCurrentPanel: function() {
- return this.panelContents[this.selected];
- },
-
- getCurrentTab: function() {
- return this.tabs[this.selected];
- }
-}
+// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+\r
+SideBarBox = Class.create();\r
+\r
+SideBarBox.className = {\r
+ panelContainer : 'sideBarBox_panelContainer',\r
+ tabContainer : 'sideBarBox_tabContainer',\r
+ title : 'sideBarBox_tabTitle',\r
+ tab : 'sideBarBox_tab',\r
+ tabTopInactive : 'sideBarBox_tabTopInactive',\r
+ tabTopActive : 'sideBarBox_tabTopActive',\r
+ tabMiddleInactive : 'sideBarBox_tabMiddleInactive',\r
+ tabMiddleActive : 'sideBarBox_tabMiddleActive',\r
+ tabBottomInactive : 'sideBarBox_tabBottomInactive',\r
+ tabBottomActive : 'sideBarBox_tabBottomActive' \r
+}\r
+\r
+SideBarBox.prototype = {\r
+ \r
+ initialize: function(element) {\r
+ var options = Object.extend({\r
+ selected: 1,\r
+ beforeSelect: function() {return true},\r
+ afterSelect: Prototype.emptyFunction,\r
+ visible: false,\r
+ close: true,\r
+ cssPrefix: 'custom_'\r
+ }, arguments[1] || {});\r
+ \r
+ this.options = options;\r
+ this.element = $(element);\r
+ Element.setStyle(this.element, {visibility: 'hidden'});\r
+ \r
+ var customCss = CssUtil.appendPrefix(this.options.cssPrefix, SideBarBox.className);\r
+ this.classNames = new CssUtil([SideBarBox.className, customCss]);\r
+ \r
+ this.start();\r
+ Element.setStyle(this.element, {visibility: 'visible'});\r
+ },\r
+ \r
+ start: function() {\r
+ this.tabs = [];\r
+ this.panelContents = [];\r
+ this.tabSets = [];\r
+ \r
+ this.visible = this.options.visible;\r
+ this.selected = (this.options.selected > 0) ? this.options.selected - 1 : 0 ;\r
+ this.selected = (this.visible) ? this.selected : -1;\r
+ \r
+ this.tabId = this.element.id + '_tab';\r
+ this.tabTopId = this.tabId + '_top';\r
+ this.tabMiddleId = this.tabId + '_middle';\r
+ this.tabBottomId = this.tabId + '_bottom';\r
+ this.tabContainerId = this.element.id + '_tabContainer';\r
+ this.panelId = this.element.id + '_panel';\r
+ this.panelContainerId = this.element.id + '_panelContainer';\r
+\r
+ this.tabContainer = null; \r
+ this.panelContainer = null;\r
+ \r
+ this.buildTabBox(); \r
+ },\r
+ \r
+ buildTabBox: function() {\r
+ this.buildContainers();\r
+ \r
+ Element.cleanWhitespace(this.element);\r
+ this.tabSets = this.element.childNodes;\r
+ if (this.visible && this.selected >= this.tabSets.length) {\r
+ this.selected = 0;\r
+ }\r
+ var i = 0;\r
+ while(this.tabSets.length > 0){\r
+ var tabSet = this.tabSets[0];\r
+ var tabPanel = $A(tabSet.childNodes).detect(function(c) {\r
+ return (c.nodeType == 1) && (c.tagName.toLowerCase() == 'div');\r
+ });\r
+ this.buildPanel(tabPanel, i); \r
+ this.buildTab(tabSet, i);\r
+ i++;\r
+ }\r
+ this.addContainers();\r
+ },\r
+ \r
+ buildContainers : function() {\r
+ this.tabContainer = Builder.node('div',{id:this.tabContainerId});\r
+ this.classNames.addClassNames(this.tabContainer, 'tabContainer');\r
+ this.panelContainer = Builder.node('div',\r
+ {\r
+ id:this.panelContainerId\r
+ }\r
+ );\r
+ this.classNames.addClassNames(this.panelContainer, 'panelContainer');\r
+\r
+ if (!this.visible) {\r
+ Element.hide(this.panelContainer);\r
+ }\r
+ },\r
+ \r
+ addContainers : function() {\r
+ this.element.appendChild(this.panelContainer);\r
+ this.element.appendChild(this.tabContainer);\r
+ this.element.appendChild(Builder.node('div', {style:'clear: left'}));\r
+ },\r
+ \r
+ buildTab: function(tab, i) {\r
+ var tabTitle = tab.childNodes;\r
+ tab.id = this.tabId + i;\r
+ this.classNames.addClassNames(tab, 'tab');\r
+ var top = Builder.node('div',{id: this.tabTopId + i});\r
+ var middle = Builder.node('div', {id: this.tabMiddleId + i}, $A(tabTitle));\r
+ var bottom = Builder.node('div', {id: this.tabBottomId + i});\r
+ \r
+ tab.appendChild(top);\r
+ tab.appendChild(middle);\r
+ tab.appendChild(bottom);\r
+ Event.observe(tab, 'click', this.selectTab.bindAsEventListener(this));\r
+ \r
+ this.tabs[i] = tab;\r
+ this.tabContainer.appendChild(tab);\r
+ if ( i != this.selected) {\r
+ this.setTabInactive(tab);\r
+ } else {\r
+ this.setTabActive(tab);\r
+ }\r
+ },\r
+ \r
+ buildPanel: function(panelContent, i) {\r
+ var panel = Builder.node('div', {id: this.panelId + i});\r
+ panel.appendChild(panelContent);\r
+ this.panelContents[i] = panel;\r
+ if(i != this.selected) {\r
+ Element.hide(panel);\r
+ }\r
+ this.panelContainer.appendChild(panel);\r
+ },\r
+ \r
+ selectTab: function(e) {\r
+ if (!this.options.beforeSelect()) return;\r
+ if (!e) {\r
+ this.setTabActive(this.tabs[this.selected]);\r
+ Element.show(this.panelList[this.selected]);\r
+ return;\r
+ }\r
+\r
+ var currentPanel = this.panelContents[this.selected];\r
+ var currentTab = this.tabs[this.selected];\r
+\r
+ var targetElement = null;\r
+ if (e.nodeType) {\r
+ targetElement = e; \r
+ } else {\r
+ targetElement = Event.element(e);\r
+ }\r
+ var targetIndex = this.getTargetIndex(targetElement);\r
+ var targetPanel = this.panelContents[targetIndex];\r
+ var targetTab = this.tabs[targetIndex];\r
+ if (this.visible) {\r
+ if (targetTab.id == currentTab.id) {\r
+ if (this.options.close) {\r
+ Effect.SlideRightOutOfView(this.panelContainer);\r
+ this.visible = false;\r
+ this.selected = -1;\r
+ this.setTabInactive(currentTab);\r
+ Element.toggle(targetPanel);\r
+ }\r
+ } else {\r
+ this.setTabActive(targetTab);\r
+ this.setTabInactive(currentTab);\r
+ Element.toggle(currentPanel);\r
+ Element.toggle(targetPanel);\r
+ this.selected = targetIndex;\r
+ }\r
+ } else {\r
+ this.setTabActive(targetTab);\r
+ Element.toggle(targetPanel);\r
+ Effect.SlideRightIntoView(this.panelContainer);\r
+ this.visible = true; \r
+ this.selected = targetIndex;\r
+ }\r
+ this.options.afterSelect(targetPanel, currentPanel);\r
+ },\r
+ \r
+ setTabActive: function(tab) {\r
+ var tabChildren = tab.childNodes;\r
+\r
+ this.classNames.refreshClassNames(tabChildren[0], 'tabTopActive');\r
+ this.classNames.refreshClassNames(tabChildren[1], 'tabMiddleActive');\r
+ this.classNames.refreshClassNames(tabChildren[2], 'tabBottomActive');\r
+ },\r
+ \r
+ setTabInactive: function(tab) {\r
+ var tabChildren = tab.childNodes;\r
+ \r
+ this.classNames.refreshClassNames(tabChildren[0], 'tabTopInactive');\r
+ this.classNames.refreshClassNames(tabChildren[1], 'tabMiddleInactive');\r
+ this.classNames.refreshClassNames(tabChildren[2], 'tabBottomInactive');\r
+ },\r
+ \r
+ getTargetIndex: function(element) {\r
+ while(element) {\r
+ if (element.id && element.id.indexOf(this.tabId, 0) >= 0) {\r
+ var index = element.id.substring(this.tabId.length);\r
+ if (!isNaN(index)) {\r
+ return index;\r
+ }\r
+ }\r
+ element = element.parentNode;\r
+ }\r
+ },\r
+\r
+ hasNextTab: function() {\r
+ return this.getNextTab() ? true : false;\r
+ },\r
+\r
+ hasPreviousTab: function() {\r
+ return this.getPreviousTab() ? true : false;\r
+ },\r
+\r
+ getNextTab: function() {\r
+ return Element.next(this.getCurrentTab());\r
+ },\r
+\r
+ getPreviousTab: function() {\r
+ return Element.previous(this.getCurrentTab());\r
+ },\r
+\r
+ selectNextTab: function() {\r
+ this.selectTab(this.getNextTab());\r
+ },\r
+\r
+ selectPreviousTab: function() {\r
+ this.selectTab(this.getPreviousTab());\r
+ },\r
+\r
+ tabCount: function() {\r
+ return this.tabs.inject(0, function(i, t) {\r
+ return t ? ++i : i;\r
+ })\r
+ },\r
+\r
+ getCurrentPanel: function() {\r
+ return this.panelContents[this.selected];\r
+ },\r
+\r
+ getCurrentTab: function() {\r
+ return this.tabs[this.selected];\r
+ }\r
+}\r
-// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)
-//
-// This code is substantially based on code from script.aculo.us which has the
-// following copyright and permission notice
-//
-// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Effect.SlideRightIntoView = function(element) {
- element = $(element);
- Element.cleanWhitespace(element);
-
- var oldInnerRight = element.firstChild.style.right;
- var elementDimensions = Element.getDimensions(element);
- return new Effect.Scale(element, 100,
- Object.extend({ scaleContent: false,
- scaleY: false,
- scaleFrom: 0,
- scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
- restoreAfterFinish: true,
- afterSetup: function(effect) {
- Element.makePositioned(effect.element.firstChild);
- if (window.opera) effect.element.firstChild.style.left = "";
- Element.makeClipping(effect.element);
- element.style.width = '0';
- Element.show(element);
- },
- afterUpdateInternal: function(effect) {
- effect.element.firstChild.style.right =
- (effect.dims[1] - effect.element.clientWidth) + 'px'; },
- afterFinishInternal: function(effect) {
- Element.undoClipping(effect.element);
- Element.undoPositioned(effect.element.firstChild);
- effect.element.firstChild.style.right = oldInnerRight; }
- }, arguments[1] || {})
- );
-}
-
-Effect.SlideRightOutOfView = function(element) {
- element = $(element);
- Element.cleanWhitespace(element);
- var oldInnerRight = element.firstChild.style.right;
- return new Effect.Scale(element, 0,
- Object.extend({ scaleContent: false,
- scaleY: false,
- scaleMode: 'box',
- scaleFrom: 100,
- restoreAfterFinish: true,
- beforeStartInternal: function(effect) {
- Element.makePositioned(effect.element.firstChild);
- if (window.opera) effect.element.firstChild.style.left = "";
- Element.makeClipping(effect.element);
- Element.show(element);
- },
- afterUpdateInternal: function(effect) {
- effect.element.firstChild.style.right =
- (effect.dims[1] - effect.element.clientWidth) + 'px'; },
- afterFinishInternal: function(effect) {
- Element.hide(effect.element);
- Element.undoClipping(effect.element);
- Element.undoPositioned(effect.element.firstChild);
- effect.element.firstChild.style.right = oldInnerRight; }
- }, arguments[1] || {})
- );
-}
+// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// This code is substantially based on code from script.aculo.us which has the \r
+// following copyright and permission notice\r
+//\r
+// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+Effect.SlideRightIntoView = function(element) {\r
+ element = $(element);\r
+ Element.cleanWhitespace(element);\r
+\r
+ var oldInnerRight = element.firstChild.style.right;\r
+ var elementDimensions = Element.getDimensions(element);\r
+ return new Effect.Scale(element, 100, \r
+ Object.extend({ scaleContent: false, \r
+ scaleY: false, \r
+ scaleFrom: 0,\r
+ scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, \r
+ restoreAfterFinish: true,\r
+ afterSetup: function(effect) {\r
+ Element.makePositioned(effect.element.firstChild);\r
+ if (window.opera) effect.element.firstChild.style.left = "";\r
+ Element.makeClipping(effect.element);\r
+ element.style.width = '0';\r
+ Element.show(element); \r
+ }, \r
+ afterUpdateInternal: function(effect) { \r
+ effect.element.firstChild.style.right = \r
+ (effect.dims[1] - effect.element.clientWidth) + 'px'; },\r
+ afterFinishInternal: function(effect) { \r
+ Element.undoClipping(effect.element); \r
+ Element.undoPositioned(effect.element.firstChild);\r
+ effect.element.firstChild.style.right = oldInnerRight; }\r
+ }, arguments[1] || {})\r
+ );\r
+}\r
+\r
+Effect.SlideRightOutOfView = function(element) {\r
+ element = $(element);\r
+ Element.cleanWhitespace(element);\r
+ var oldInnerRight = element.firstChild.style.right;\r
+ return new Effect.Scale(element, 0, \r
+ Object.extend({ scaleContent: false, \r
+ scaleY: false, \r
+ scaleMode: 'box',\r
+ scaleFrom: 100,\r
+ restoreAfterFinish: true,\r
+ beforeStartInternal: function(effect) { \r
+ Element.makePositioned(effect.element.firstChild);\r
+ if (window.opera) effect.element.firstChild.style.left = "";\r
+ Element.makeClipping(effect.element);\r
+ Element.show(element); \r
+ }, \r
+ afterUpdateInternal: function(effect) { \r
+ effect.element.firstChild.style.right = \r
+ (effect.dims[1] - effect.element.clientWidth) + 'px'; },\r
+ afterFinishInternal: function(effect) { \r
+ Element.hide(effect.element);\r
+ Element.undoClipping(effect.element); \r
+ Element.undoPositioned(effect.element.firstChild);\r
+ effect.element.firstChild.style.right = oldInnerRight; }\r
+ }, arguments[1] || {})\r
+ );\r
+}\r
-// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-var SortableTable = Class.create();
-
-SortableTable.classNames = {
- header: 'sortableTable_header',
- title: 'sortableTable_title',
- empty: 'sortableTable_empty',
- down: 'sortableTable_down',
- up: 'sortableTable_up',
- mark: 'sortableTable_mark',
- thead: 'sortableTable_thead',
- tbody: 'sortableTable_tbody'
-}
-
-SortableTable.prototype = {
-
- initialize: function(element) {
- this.element = $(element);
- Element.setStyle(this.element, {visibility: 'hidden'});
-
- var options = Object.extend({
- sortType: false,
- cssPrefix: 'custom_'
- }, arguments[1] || {});
-
- var customCss = CssUtil.appendPrefix(options.cssPrefix, SortableTable.classNames);
- this.classNames = new CssUtil([SortableTable.classNames, customCss]);
-
- this.sortType = options.sortType;
-
- this.currentOrder = 'default';
- this.defaultOrder = new Array();
- for (var i = 1; i < this.element.rows.length; i++) {
- this.defaultOrder[i - 1] = this.element.rows[i];
- }
-
- this.build();
- Element.setStyle(this.element, {visibility: 'visible'});
- },
-
- build: function() {
- thead = this.element.tHead;
- this.classNames.addClassNames(thead, 'thead');
- tbody = thead.nextSibling;
- while ((tbody.nodeType != 1) || (tbody.tagName.toLowerCase() != 'tbody')) {
- tbody = tbody.nextSibling;
- }
- this.classNames.addClassNames(tbody, 'tbody');
- var rows = this.element.rows[0];
- if (!rows) return;
-
- for (var i = 0; i < rows.cells.length; i++) {
-
- var cell = rows.cells[i];
- cell.style.cursor = 'pointer';
-
- Element.cleanWhitespace(cell);
- var title = Builder.node('DIV', $A(cell.childNodes));
- this.classNames.addClassNames(title, 'title');
-
- var img = Builder.node('DIV');
- this.classNames.addClassNames(img, 'mark');
- this.classNames.addClassNames(img, 'empty');
-
- var header = Builder.node('DIV', [title, img]);
- this.classNames.addClassNames(header, 'header');
- cell.appendChild(header);
-
- var titleWidth = title.offsetWidth;
- var imgWidth = img.offsetWidth;
-
- title.style.width = (titleWidth + imgWidth) + 'px';
- Event.observe(rows.cells[i], 'click', this.sortTable.bindAsEventListener(this));
- }
- },
-
- sortTable: function(event) {
- var cell = Event.element(event);
-
- if (cell.tagName.toUpperCase() != 'TD' && cell.tagName.toUpperCase() != 'TH') {
- cell = Element.getParentByTagName(['TD','TH'], cell);
- }
-
- var tmpColumn = cell.cellIndex;
- if (this.targetColumn != tmpColumn) {
- this.currentOrder = 'default';
- }
- this.targetColumn = tmpColumn;
-
- var newRows = new Array();
- for (var i = 1; i < this.element.rows.length; i++) {
- newRows[i - 1] = this.element.rows[i];
- }
- if (newRows.length < 1) return;
-
- if (this.currentOrder == 'default') {
- newRows.sort(this.getSortFunc());
- this.currentOrder = 'asc';
- } else if (this.currentOrder == 'asc') {
- newRows = newRows.reverse();
- this.currentOrder = 'desc';
- } else if (this.currentOrder == 'desc') {
- newRows = this.defaultOrder;
- this.currentOrder = 'default';
- }
-
- for (var i = 0; i < newRows.length; i++) {
- this.element.tBodies[0].appendChild(newRows[i]);
- }
-
- this.mark(cell);
- },
-
- mark: function(cell) {
- var images = document.getElementsByClassName(SortableTable.classNames.mark, this.element);
- var targetImg = document.getElementsByClassName(SortableTable.classNames.mark, cell)[0];
-
- for (var i = 0; i < images.length; i++) {
- var parent = images[i].parentNode;
- var title = document.getElementsByClassName(SortableTable.classNames.title, parent)[0];
- var titleWidth = title.offsetWidth;
-
- if (targetImg == images[i]) {
-
- var imgWidth = targetImg.offsetWidth;
-
- if (this.currentOrder == 'asc') {
- this.classNames.addClassNames(targetImg, 'down');
- this.classNames.removeClassNames(targetImg, 'empty');
- if (!document.all) title.style.width = (titleWidth - imgWidth) + 'px';
-
- } else if (this.currentOrder == 'desc') {
- this.classNames.addClassNames(targetImg, 'up');
- this.classNames.removeClassNames(targetImg, 'down');
-
- } else if (this.currentOrder == 'default') {
- this.classNames.addClassNames(targetImg, 'empty');
- this.classNames.removeClassNames(targetImg, 'up');
- if (!document.all) title.style.width = (titleWidth + imgWidth) + 'px';
- }
-
- } else {
-
- if (Element.hasClassName(images[i], SortableTable.classNames.empty))
- continue;
-
- else if (Element.hasClassName(images[i], SortableTable.classNames.down))
- this.classNames.removeClassNames(images[i], 'down');
-
- else if (Element.hasClassName(images[i], SortableTable.classNames.up))
- this.classNames.removeClassNames(images[i], 'up');
-
- var imgWidth = targetImg.offsetWidth;
- this.classNames.addClassNames(images[i], 'empty');
- if (!document.all) title.style.width = (titleWidth + imgWidth) + 'px';
- }
- }
- },
-
- getSortFunc: function() {
- if (!this.sortType || !this.sortType[this.targetColumn])
- return SortFunction.string(this);
-
- var type = this.getSortType();
-
- if (!this.sortType || !type) {
- return SortFunction.string(this);
- } else if (type == SortFunction.numeric) {
- return SortFunction.number(this);
- }
-
- return SortFunction.date(this);
- },
-
- getSortType: function() {
- return this.sortType[this.targetColumn];
- }
-}
-
-var SortFunction = Class.create();
-SortFunction = {
- string: 'string',
- numeric: 'numeric',
- mmddyyyy: 'mmddyyyy',
- mmddyy: 'mmddyy',
- yyyymmdd: 'yyyymmdd',
- yymmdd: 'yymmdd',
- ddmmyyyy: 'ddmmyyyy',
- ddmmyy: 'ddmmyy',
-
- date: function(grid) {
- return function(fst, snd) {
- var aValue = Element.collectTextNodes(fst.cells[grid.targetColumn]);
- var bValue = Element.collectTextNodes(snd.cells[grid.targetColumn]);
- var date1, date2;
-
- var date1 = SortFunction.getDateString(aValue, grid.getSortType());
- var date2 = SortFunction.getDateString(bValue, grid.getSortType());
-
- if (date1 == date2) return 0;
- if (date1 < date2) return -1;
-
- return 1;
- }
- },
-
- number: function(grid) {
- return function(fst, snd) {
- var aValue = parseFloat(Element.collectTextNodes(fst.cells[grid.targetColumn]));
- if (isNaN(aValue)) aValue = 0;
- var bValue = parseFloat(Element.collectTextNodes(snd.cells[grid.targetColumn]));
- if (isNaN(bValue)) bValue = 0;
-
- return aValue - bValue;
- }
- },
-
- string: function(grid) {
- return function(fst, snd) {
- var aValue = Element.collectTextNodes(fst.cells[grid.targetColumn]);
- var bValue = Element.collectTextNodes(snd.cells[grid.targetColumn]);
- if (aValue == bValue) return 0;
- if (aValue < bValue) return -1;
- return 1;
- }
- },
-
- getDateString: function(date, type) {
- var array = date.split('/');
-
- if ((type == SortFunction.mmddyyyy) ||
- (type == SortFunction.mmddyy)) {
- var newArray = new Array();
- newArray.push(array[2]);
- newArray.push(array[0]);
- newArray.push(array[1]);
- } else if ((type == SortFunction.ddmmyyyy) ||
- (type == SortFunction.ddmmyy)) {
- var newArray = new Array();
- newArray.push(array[2]);
- newArray.push(array[1]);
- newArray.push(array[0]);
- } else {
- newArray = array;
- }
-
- return newArray.join();
- }
-}
-
+// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+var SortableTable = Class.create();\r
+\r
+SortableTable.classNames = {\r
+ header: 'sortableTable_header',\r
+ title: 'sortableTable_title',\r
+ empty: 'sortableTable_empty',\r
+ down: 'sortableTable_down',\r
+ up: 'sortableTable_up',\r
+ mark: 'sortableTable_mark',\r
+ thead: 'sortableTable_thead',\r
+ tbody: 'sortableTable_tbody'\r
+}\r
+\r
+SortableTable.prototype = {\r
+ \r
+ initialize: function(element) {\r
+ this.element = $(element);\r
+ Element.setStyle(this.element, {visibility: 'hidden'});\r
+\r
+ var options = Object.extend({\r
+ sortType: false,\r
+ cssPrefix: 'custom_'\r
+ }, arguments[1] || {});\r
+ \r
+ var customCss = CssUtil.appendPrefix(options.cssPrefix, SortableTable.classNames);\r
+ this.classNames = new CssUtil([SortableTable.classNames, customCss]);\r
+ \r
+ this.sortType = options.sortType;\r
+ \r
+ this.currentOrder = 'default';\r
+ this.defaultOrder = new Array();\r
+ for (var i = 1; i < this.element.rows.length; i++) {\r
+ this.defaultOrder[i - 1] = this.element.rows[i];\r
+ }\r
+ \r
+ this.build();\r
+ Element.setStyle(this.element, {visibility: 'visible'});\r
+ },\r
+ \r
+ build: function() {\r
+ thead = this.element.tHead;\r
+ this.classNames.addClassNames(thead, 'thead');\r
+ tbody = thead.nextSibling;\r
+ while ((tbody.nodeType != 1) || (tbody.tagName.toLowerCase() != 'tbody')) {\r
+ tbody = tbody.nextSibling;\r
+ }\r
+ this.classNames.addClassNames(tbody, 'tbody');\r
+ var rows = this.element.rows[0];\r
+ if (!rows) return;\r
+ \r
+ for (var i = 0; i < rows.cells.length; i++) {\r
+ \r
+ var cell = rows.cells[i];\r
+ cell.style.cursor = 'pointer';\r
+ \r
+ Element.cleanWhitespace(cell);\r
+ var title = Builder.node('DIV', $A(cell.childNodes));\r
+ this.classNames.addClassNames(title, 'title');\r
+ \r
+ var img = Builder.node('DIV');\r
+ this.classNames.addClassNames(img, 'mark');\r
+ this.classNames.addClassNames(img, 'empty');\r
+\r
+ var header = Builder.node('DIV', [title, img]);\r
+ this.classNames.addClassNames(header, 'header');\r
+ cell.appendChild(header);\r
+ \r
+ var titleWidth = title.offsetWidth;\r
+ var imgWidth = img.offsetWidth;\r
+ \r
+ title.style.width = (titleWidth + imgWidth) + 'px';\r
+ Event.observe(rows.cells[i], 'click', this.sortTable.bindAsEventListener(this));\r
+ }\r
+ },\r
+\r
+ sortTable: function(event) {\r
+ var cell = Event.element(event);\r
+\r
+ if (cell.tagName.toUpperCase() != 'TD' && cell.tagName.toUpperCase() != 'TH') {\r
+ cell = Element.getParentByTagName(['TD','TH'], cell);\r
+ }\r
+\r
+ var tmpColumn = cell.cellIndex;\r
+ if (this.targetColumn != tmpColumn) {\r
+ this.currentOrder = 'default';\r
+ }\r
+ this.targetColumn = tmpColumn;\r
+ \r
+ var newRows = new Array();\r
+ for (var i = 1; i < this.element.rows.length; i++) {\r
+ newRows[i - 1] = this.element.rows[i];\r
+ }\r
+ if (newRows.length < 1) return;\r
+ \r
+ if (this.currentOrder == 'default') {\r
+ newRows.sort(this.getSortFunc());\r
+ this.currentOrder = 'asc';\r
+ } else if (this.currentOrder == 'asc') {\r
+ newRows = newRows.reverse();\r
+ this.currentOrder = 'desc';\r
+ } else if (this.currentOrder == 'desc') {\r
+ newRows = this.defaultOrder;\r
+ this.currentOrder = 'default';\r
+ }\r
+ \r
+ for (var i = 0; i < newRows.length; i++) {\r
+ this.element.tBodies[0].appendChild(newRows[i]);\r
+ }\r
+ \r
+ this.mark(cell);\r
+ },\r
+ \r
+ mark: function(cell) {\r
+ var images = document.getElementsByClassName(SortableTable.classNames.mark, this.element);\r
+ var targetImg = document.getElementsByClassName(SortableTable.classNames.mark, cell)[0];\r
+ \r
+ for (var i = 0; i < images.length; i++) {\r
+ var parent = images[i].parentNode;\r
+ var title = document.getElementsByClassName(SortableTable.classNames.title, parent)[0];\r
+ var titleWidth = title.offsetWidth;\r
+ \r
+ if (targetImg == images[i]) {\r
+ \r
+ var imgWidth = targetImg.offsetWidth;\r
+ \r
+ if (this.currentOrder == 'asc') {\r
+ this.classNames.addClassNames(targetImg, 'down');\r
+ this.classNames.removeClassNames(targetImg, 'empty');\r
+ if (!document.all) title.style.width = (titleWidth - imgWidth) + 'px';\r
+ \r
+ } else if (this.currentOrder == 'desc') {\r
+ this.classNames.addClassNames(targetImg, 'up');\r
+ this.classNames.removeClassNames(targetImg, 'down');\r
+ \r
+ } else if (this.currentOrder == 'default') {\r
+ this.classNames.addClassNames(targetImg, 'empty');\r
+ this.classNames.removeClassNames(targetImg, 'up');\r
+ if (!document.all) title.style.width = (titleWidth + imgWidth) + 'px';\r
+ }\r
+ \r
+ } else {\r
+ \r
+ if (Element.hasClassName(images[i], SortableTable.classNames.empty))\r
+ continue;\r
+ \r
+ else if (Element.hasClassName(images[i], SortableTable.classNames.down))\r
+ this.classNames.removeClassNames(images[i], 'down');\r
+ \r
+ else if (Element.hasClassName(images[i], SortableTable.classNames.up))\r
+ this.classNames.removeClassNames(images[i], 'up');\r
+ \r
+ var imgWidth = targetImg.offsetWidth;\r
+ this.classNames.addClassNames(images[i], 'empty');\r
+ if (!document.all) title.style.width = (titleWidth + imgWidth) + 'px';\r
+ }\r
+ }\r
+ },\r
+\r
+ getSortFunc: function() {\r
+ if (!this.sortType || !this.sortType[this.targetColumn])\r
+ return SortFunction.string(this);\r
+ \r
+ var type = this.getSortType();\r
+ \r
+ if (!this.sortType || !type) {\r
+ return SortFunction.string(this);\r
+ } else if (type == SortFunction.numeric) {\r
+ return SortFunction.number(this);\r
+ } \r
+ \r
+ return SortFunction.date(this);\r
+ },\r
+ \r
+ getSortType: function() {\r
+ return this.sortType[this.targetColumn];\r
+ }\r
+}\r
+\r
+var SortFunction = Class.create();\r
+SortFunction = {\r
+ string: 'string',\r
+ numeric: 'numeric',\r
+ mmddyyyy: 'mmddyyyy',\r
+ mmddyy: 'mmddyy',\r
+ yyyymmdd: 'yyyymmdd',\r
+ yymmdd: 'yymmdd',\r
+ ddmmyyyy: 'ddmmyyyy',\r
+ ddmmyy: 'ddmmyy',\r
+ \r
+ date: function(grid) {\r
+ return function(fst, snd) {\r
+ var aValue = Element.collectTextNodes(fst.cells[grid.targetColumn]);\r
+ var bValue = Element.collectTextNodes(snd.cells[grid.targetColumn]);\r
+ var date1, date2;\r
+ \r
+ var date1 = SortFunction.getDateString(aValue, grid.getSortType());\r
+ var date2 = SortFunction.getDateString(bValue, grid.getSortType());\r
+ \r
+ if (date1 == date2) return 0;\r
+ if (date1 < date2) return -1;\r
+ \r
+ return 1;\r
+ }\r
+ },\r
+ \r
+ number: function(grid) {\r
+ return function(fst, snd) {\r
+ var aValue = parseFloat(Element.collectTextNodes(fst.cells[grid.targetColumn]));\r
+ if (isNaN(aValue)) aValue = 0;\r
+ var bValue = parseFloat(Element.collectTextNodes(snd.cells[grid.targetColumn])); \r
+ if (isNaN(bValue)) bValue = 0;\r
+ \r
+ return aValue - bValue;\r
+ }\r
+ },\r
+ \r
+ string: function(grid) {\r
+ return function(fst, snd) {\r
+ var aValue = Element.collectTextNodes(fst.cells[grid.targetColumn]);\r
+ var bValue = Element.collectTextNodes(snd.cells[grid.targetColumn]);\r
+ if (aValue == bValue) return 0;\r
+ if (aValue < bValue) return -1;\r
+ return 1;\r
+ }\r
+ },\r
+ \r
+ getDateString: function(date, type) {\r
+ var array = date.split('/');\r
+\r
+ if ((type == SortFunction.mmddyyyy) ||\r
+ (type == SortFunction.mmddyy)) {\r
+ var newArray = new Array();\r
+ newArray.push(array[2]);\r
+ newArray.push(array[0]);\r
+ newArray.push(array[1]);\r
+ } else if ((type == SortFunction.ddmmyyyy) ||\r
+ (type == SortFunction.ddmmyy)) {\r
+ var newArray = new Array();\r
+ newArray.push(array[2]);\r
+ newArray.push(array[1]);\r
+ newArray.push(array[0]);\r
+ } else {\r
+ newArray = array;\r
+ }\r
+ \r
+ return newArray.join();\r
+ }\r
+}\r
+\r
-var Switcher = Class.create();
-Switcher.classNames = {
- open: 'switcher_state_open',
- close: 'switcher_state_close'
-}
-Switcher.prototype = {
- initialize: function(sw, content) {
- this.options = Object.extend({
- open: false,
- duration: 0.4,
- beforeOpen: Prototype.emptyFunction,
- afterOpen: Prototype.emptyFunction,
- beforeClose: Prototype.emptyFunction,
- afterClose: Prototype.emptyFunction,
- effect: false,
- cssPrefix: 'custom_'
- }, arguments[2] || {});
-
- this.sw = $(sw);
- this.content = $(content);
-
- var customCss = CssUtil.appendPrefix(this.options.cssPrefix, Switcher.classNames);
- this.classNames = new CssUtil([Switcher.classNames, customCss]);
-
- if (this.options.open) {
- Element.show(this.content);
- this.classNames.addClassNames(this.sw, 'open');
- } else {
- Element.hide(this.content);
- this.classNames.addClassNames(this.sw, 'close');
- }
-
- Event.observe(this.sw, 'click', this.toggle.bind(this));
- },
-
- toggle: function() {
- if (Element.hasClassName(this.sw, Switcher.classNames.close)) {
- this.open();
- }else {
- this.close();
- }
- },
-
- open: function() {
- this.options.beforeOpen(this.content);
- this.classNames.refreshClassNames(this.sw, 'open');
- if (this.options.effect) {
- new Effect.BlindDown(this.content, {duration: this.options.duration});
- } else {
- Element.show(this.content);
- }
- this.options.afterOpen(this.content);
- },
-
- close: function() {
- this.options.beforeClose(this.content);
- this.classNames.refreshClassNames(this.sw, 'close');
- if (this.options.effect) {
- new Effect.BlindUp(this.content, {duration: this.options.duration});
- } else {
- Element.hide(this.content);
- }
- this.options.afterClose(this.content);
- }
-}
+var Switcher = Class.create();\r
+Switcher.classNames = {\r
+ open: 'switcher_state_open',\r
+ close: 'switcher_state_close'\r
+}\r
+Switcher.prototype = {\r
+ initialize: function(sw, content) {\r
+ this.options = Object.extend({\r
+ open: false,\r
+ duration: 0.4,\r
+ beforeOpen: Prototype.emptyFunction,\r
+ afterOpen: Prototype.emptyFunction,\r
+ beforeClose: Prototype.emptyFunction,\r
+ afterClose: Prototype.emptyFunction,\r
+ effect: false,\r
+ cssPrefix: 'custom_'\r
+ }, arguments[2] || {});\r
+\r
+ this.sw = $(sw);\r
+ this.content = $(content);\r
+\r
+ var customCss = CssUtil.appendPrefix(this.options.cssPrefix, Switcher.classNames);\r
+ this.classNames = new CssUtil([Switcher.classNames, customCss]);\r
+\r
+ if (this.options.open) {\r
+ Element.show(this.content);\r
+ this.classNames.addClassNames(this.sw, 'open');\r
+ } else {\r
+ Element.hide(this.content);\r
+ this.classNames.addClassNames(this.sw, 'close');\r
+ }\r
+\r
+ Event.observe(this.sw, 'click', this.toggle.bind(this));\r
+ },\r
+\r
+ toggle: function() {\r
+ if (Element.hasClassName(this.sw, Switcher.classNames.close)) {\r
+ this.open();\r
+ }else {\r
+ this.close();\r
+ }\r
+ },\r
+\r
+ open: function() {\r
+ this.options.beforeOpen(this.content);\r
+ this.classNames.refreshClassNames(this.sw, 'open');\r
+ if (this.options.effect) {\r
+ new Effect.BlindDown(this.content, {duration: this.options.duration});\r
+ } else {\r
+ Element.show(this.content);\r
+ }\r
+ this.options.afterOpen(this.content);\r
+ },\r
+\r
+ close: function() {\r
+ this.options.beforeClose(this.content);\r
+ this.classNames.refreshClassNames(this.sw, 'close');\r
+ if (this.options.effect) {\r
+ new Effect.BlindUp(this.content, {duration: this.options.duration});\r
+ } else {\r
+ Element.hide(this.content);\r
+ }\r
+ this.options.afterClose(this.content);\r
+ }\r
+}\r
-// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-TabBox = Class.create();
-TabBox.className = {
- tabBox: 'tabBox_tabBox',
- panelContainer: 'tabBox_panelContainer',
- tabContainer: 'tabBox_tabContainer',
- tab: 'tabBox_tab',
- tabLeftInactive: 'tabBox_tabLeftInactive',
- tabLeftActive: 'tabBox_tabLeftActive',
- tabMiddleInactive: 'tabBox_tabMiddleInactive',
- tabMiddleActive: 'tabBox_tabMiddleActive',
- tabRightInactive: 'tabBox_tabRightInactive',
- tabRightActive: 'tabBox_tabRightActive',
- tabTitle: 'tabBox_tabTitle',
- closeButton: 'tabBox_closeButton'
-}
-TabBox.prototype = {
-
- initialize: function(element) {
- var options = Object.extend({
- selected: 1,
- cssPrefix: 'custom_',
- beforeSelect: function() {return true},
- afterSelect: Prototype.emptyFunction,
- onRemove: function() {return true},
- sortable: false,
- closeButton: false,
- afterSort: Prototype.emptyFunction,
- onSort: Prototype.emptyFunction,
- lazyLoadUrl: [],
- onLazyLoad: Prototype.emptyFunction,
- afterLazyLoad: Prototype.emptyFunction,
- lazyLoadFailure: Prototype.emptyFunction,
- failureLimitOver: Prototype.emptyFunction,
- failureLimit: 5,
- tabRow: null,
- titleLength: null
- }, arguments[1] || {});
-
- this.options = options;
- this.element = $(element);
- Element.setStyle(this.element, {visibility: 'hidden'});
- Element.hide(this.element);
- this.selected = (this.options.selected > 0) ? this.options.selected - 1 : 0 ;
-
- var customCss = CssUtil.appendPrefix(this.options.cssPrefix, TabBox.className);
- this.classNames = new CssUtil([TabBox.className, customCss]);
- this.classNames.addClassNames(this.element, 'tabBox');
-
- this.start();
- Element.setStyle(this.element, {visibility: 'visible'});
- Element.show(this.element);
-
- if (this.options.lazyLoadUrl.length > 0) this.lazyLoad(0);
- },
-
- start: function() {
- this.tabs = [];
- this.panelList = [];
-
- this.tabId = this.element.id + '_tab';
- this.tabLeftId = this.tabId + '_left';
- this.tabMiddleId = this.tabId + '_middle';
- this.tabRightId = this.tabId + '_right';
- this.tabContainerId = this.element.id + '_tabContainer';
- this.panelId = this.element.id + '_panel';
- this.panelContainerId = this.element.id + '_panelContainer';
-
- this.tabContainer = null;
- this.panelContainer = null;
- this.build();
- if (this.options.sortable) this.setDrag();
- },
-
- setDrag: function() {
- Sortable.create(this.tabContainerId, {
- tag: 'div',
- overlap: 'horizontal',
- constraint: 'horizontal',
- onChange: this.options.onSort,
- onUpdate: this.options.afterSort,
- starteffect: Prototype.emptyFunction,
- endeffect: Prototype.emptyFunction
- });
- },
-
- build: function() {
- this.buildContainers();
-
- Element.cleanWhitespace(this.element);
- var tabSets = this.element.childNodes;
-
- if (tabSets.length <= this.selected) {
- this.selected = 0;
- }
- var i = 0;
- while(tabSets.length > 0) {
- this.buildTabSet(tabSets[0], i);
- i++;
- }
- this.addContainers();
- this.selectTab();
- },
-
- buildTabSet: function(element, i) {
- if (element.nodeType != 1) {
- Element.remove(element);
- return;
- }
- Element.cleanWhitespace(element);
- var panelContents = element.childNodes[1];
- this.buildPanel(panelContents, i);
- this.buildTab(element, i);
- },
-
- buildContainers : function() {
- this.tabContainer = Builder.node('div',{id:this.tabContainerId});
- this.classNames.addClassNames(this.tabContainer, 'tabContainer');
-
- this.panelContainer = Builder.node('div', {id:this.panelContainerId});
- this.classNames.addClassNames(this.panelContainer, 'panelContainer');
- },
-
- addContainers : function() {
- this.element.appendChild(this.tabContainer);
- this.element.appendChild(this.panelContainer);
- },
-
- buildTab: function(tab, i) {
- tab.id = this.tabId + i
- this.classNames.addClassNames(tab, 'tab');
- var tabTitle = Builder.node('div', [$A(tab.childNodes)]);
- this.classNames.addClassNames(tabTitle, 'tabTitle');
- var tabLeft = Builder.node('div', {id:this.tabLeftId + i});
- var tabMiddle = Builder.node('div', {id:this.tabMiddleId + i}, [tabTitle]);
- var tabRight = Builder.node('div',{id:this.tabRightId + i});
-
- tab.appendChild(tabLeft);
- tab.appendChild(tabMiddle);
- tab.appendChild(tabRight);
- Event.observe(tab, 'click', this.selectTab.bindAsEventListener(this));
- Event.observe(tab, 'mouseover', this.onMouseOver.bindAsEventListener(this));
- Event.observe(tab, 'mouseout', this.onMouseOut.bindAsEventListener(this));
-
- if (this.options.closeButton) {
- var button = Builder.node('div', {
- id: this.element.id.appendSuffix('closeButton_' + i)
- });
- this.classNames.addClassNames(button, 'closeButton');
- tabMiddle.appendChild(button);
- Event.observe(button, 'click', this.onRemove.bindAsEventListener(this));
- }
-
- if (this.options.tabRow && !isNaN(this.options.tabRow) && (i % this.options.tabRow == 0)) {
- Element.setStyle(tab, {clear: 'left', styleFloat: 'none'});
- }
-
- this.setTitle(tabMiddle);
- this.tabs[i] = tab;
- this.setTabInactive(tab);
- this.tabContainer.appendChild(tab);
- },
-
- setTitle: function(container) {
- var node = Element.getTextNodes(container, true)[0];
- title = node.nodeValue.replace(/^(\s)*/, '');
- title = title.replace(/(\s)*$/, '');
- var sortTitle = title;
- if (this.options.titleLength && !isNaN(this.options.titleLength)) {
- sortTitle = title.substring(0, this.options.titleLength);
- }
- node.nodeValue = sortTitle;
- container.parentNode.title = title;
- },
-
- buildPanel: function(panelContent, i) {
- var panel = Builder.node('div', {id: this.panelId + i});
- panel.appendChild(panelContent);
- Element.hide(panel);
- this.panelList[i] = panel;
- this.panelContainer.appendChild(panel);
- },
-
- selectTab: function(e){
- if (!this.options.beforeSelect()) return;
- if (!e) {
- this.setTabActive(this.tabs[this.selected]);
- Element.show(this.panelList[this.selected]);
- return;
- }
- var currentPanel = this.getCurrentPanel();
- var currentTab = this.getCurrentTab();
-
- var targetElement = null;
- if (e.nodeType) {
- targetElement = e;
- } else {
- targetElement = Event.element(e);
- }
- var targetIndex = this.getTargetIndex(targetElement);
- if (targetIndex == this.selected) {
- return;
- }
- var targetPanel = this.panelList[targetIndex];
- var targetTab = this.tabs[targetIndex];
-
- if (currentTab) this.setTabInactive(currentTab);
- this.setTabActive(targetTab);
-
- if (currentPanel) Element.toggle(currentPanel);
- Element.toggle(targetPanel);
-
- this.selected = targetIndex;
- this.options.afterSelect(targetPanel, currentPanel);
- },
-
- setTabActive: function(tab) {
- var tabChildren = tab.childNodes;
- this.classNames.refreshClassNames(tabChildren[0], 'tabLeftActive');
- this.classNames.refreshClassNames(tabChildren[1], 'tabMiddleActive');
- this.classNames.refreshClassNames(tabChildren[2], 'tabRightActive');
- },
-
- setTabInactive: function(tab) {
- var tabChildren = tab.childNodes;
- this.classNames.refreshClassNames(tabChildren[0], 'tabLeftInactive');
- this.classNames.refreshClassNames(tabChildren[1], 'tabMiddleInactive');
- this.classNames.refreshClassNames(tabChildren[2], 'tabRightInactive');
- },
-
- getTargetIndex: function(element) {
- while(element) {
- if (element.id && element.id.indexOf(this.tabId, 0) >= 0) {
- var index = element.id.substring(this.tabId.length);
- if (!isNaN(index)) {
- return index;
- }
- }
- element = element.parentNode;
- }
- },
-
- onRemove: function(event) {
- Event.stop(event);
- var element = Event.element(event);
- var index = this.getTargetIndex(element);
- var tab = this.tabs[index];
- if (this.options.onRemove(tab)) {
- this.remove(tab);
- }
- },
-
- remove: function(tab) {
- if (tab) {
- var index = this.getTargetIndex(tab);
- var nextActiveTab = this.getNextTab();
- if (!nextActiveTab) nextActiveTab = this.getPreviousTab();
- Element.remove(tab);
- Element.remove(this.panelList[index]);
- this.tabs[index] = null;
- this.panelList[index] = null;
-
- if (index == this.selected) {
- if (nextActiveTab) {
- this.selectTab(nextActiveTab);
- }
- }
- }
- },
-
- addByElement: function(element) {
- this.buildTabSet($(element), this.tabs.length);
- if (this.options.sortable) this.setDrag();
- },
-
- add: function(title, content) {
- var contents = [];
- var node = Builder.node('div');
- node.innerHTML = title;
- contents.push(node);
- node = Builder.node('div');
- node.innerHTML = content;
- contents.push(node);
- this.addByElement(Builder.node('div', contents));
- },
-
- lazyLoad: function(index) {
- this.errorCount = 0;
- this.loadedList = [];
- this.load(index);
- },
-
- load: function(index) {
- var container = this.panelList[index];
- var url = this.options.lazyLoadUrl[index];
- var self = this;
- if (container && url) {
- new Ajax.Updater(
- {success: container},
- url,
- {
- onSuccess: function() {
- self.setLoaded(index);
- self.options.onLazyLoad(container, self);
- self.load(++index);
- if (self.isFinishLazyLoad()) self.options.afterLazyLoad(self);
- },
- onFailure: function() {
- self.errorCount++;
- self.options.lazyLoadFailure(container, self);
- if (self.errorCount <= self.options.failureLimit) {
- self.load(index);
- } else {
- self.options.failureLimitOver(self);
- }
- },
- asynchronous: true,
- evalScripts: true
- }
- );
- }
- },
-
- isFinishLazyLoad: function() {
- return this.loadedList.length == this.panelList.length;
- },
-
- setLoaded: function(i) {
- this.loadedList.push(i);
- },
-
- onMouseOver: function(event) {
- var targetElement = Event.element(event);
- var targetIndex = this.getTargetIndex(targetElement);
- if (targetIndex != this.selected) {
- var targetTab = this.tabs[targetIndex];
- this.setTabActive(targetTab);
- }
- },
-
- onMouseOut: function(event) {
- var targetElement = Event.element(event);
- var targetIndex = this.getTargetIndex(targetElement);
- if (targetIndex != this.selected) {
- var targetTab = this.tabs[targetIndex];
- this.setTabInactive(targetTab);
- }
- },
-
- hasNextTab: function() {
- return this.getNextTab() ? true : false;
- },
-
- hasPreviousTab: function() {
- return this.getPreviousTab() ? true : false;
- },
-
- getNextTab: function() {
- return Element.next(this.getCurrentTab());
- },
-
- getPreviousTab: function() {
- return Element.previous(this.getCurrentTab());
- },
-
- selectNextTab: function() {
- this.selectTab(this.getNextTab());
- },
-
- selectPreviousTab: function() {
- this.selectTab(this.getPreviousTab());
- },
-
- tabCount: function() {
- return this.tabs.inject(0, function(i, t) {
- return t ? ++i : i;
- })
- },
-
- getCurrentPanel: function() {
- return this.panelList[this.selected];
- },
-
- getCurrentTab: function() {
- return this.tabs[this.selected];
- }
-}
+// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+TabBox = Class.create();\r
+TabBox.className = {\r
+ tabBox: 'tabBox_tabBox',\r
+ panelContainer: 'tabBox_panelContainer',\r
+ tabContainer: 'tabBox_tabContainer',\r
+ tab: 'tabBox_tab',\r
+ tabLeftInactive: 'tabBox_tabLeftInactive',\r
+ tabLeftActive: 'tabBox_tabLeftActive',\r
+ tabMiddleInactive: 'tabBox_tabMiddleInactive',\r
+ tabMiddleActive: 'tabBox_tabMiddleActive',\r
+ tabRightInactive: 'tabBox_tabRightInactive',\r
+ tabRightActive: 'tabBox_tabRightActive',\r
+ tabTitle: 'tabBox_tabTitle',\r
+ closeButton: 'tabBox_closeButton'\r
+}\r
+TabBox.prototype = {\r
+ \r
+ initialize: function(element) {\r
+ var options = Object.extend({\r
+ selected: 1,\r
+ cssPrefix: 'custom_',\r
+ beforeSelect: function() {return true},\r
+ afterSelect: Prototype.emptyFunction,\r
+ onRemove: function() {return true},\r
+ sortable: false,\r
+ closeButton: false,\r
+ afterSort: Prototype.emptyFunction,\r
+ onSort: Prototype.emptyFunction,\r
+ lazyLoadUrl: [],\r
+ onLazyLoad: Prototype.emptyFunction,\r
+ afterLazyLoad: Prototype.emptyFunction,\r
+ lazyLoadFailure: Prototype.emptyFunction,\r
+ failureLimitOver: Prototype.emptyFunction,\r
+ failureLimit: 5,\r
+ tabRow: null,\r
+ titleLength: null\r
+ }, arguments[1] || {});\r
+ \r
+ this.options = options;\r
+ this.element = $(element);\r
+ Element.setStyle(this.element, {visibility: 'hidden'});\r
+ Element.hide(this.element);\r
+ this.selected = (this.options.selected > 0) ? this.options.selected - 1 : 0 ;\r
+ \r
+ var customCss = CssUtil.appendPrefix(this.options.cssPrefix, TabBox.className);\r
+ this.classNames = new CssUtil([TabBox.className, customCss]);\r
+ this.classNames.addClassNames(this.element, 'tabBox');\r
+ \r
+ this.start();\r
+ Element.setStyle(this.element, {visibility: 'visible'});\r
+ Element.show(this.element);\r
+\r
+ if (this.options.lazyLoadUrl.length > 0) this.lazyLoad(0);\r
+ },\r
+ \r
+ start: function() {\r
+ this.tabs = [];\r
+ this.panelList = [];\r
+\r
+ this.tabId = this.element.id + '_tab';\r
+ this.tabLeftId = this.tabId + '_left';\r
+ this.tabMiddleId = this.tabId + '_middle';\r
+ this.tabRightId = this.tabId + '_right';\r
+ this.tabContainerId = this.element.id + '_tabContainer';\r
+ this.panelId = this.element.id + '_panel';\r
+ this.panelContainerId = this.element.id + '_panelContainer';\r
+ \r
+ this.tabContainer = null; \r
+ this.panelContainer = null;\r
+ this.build(); \r
+ if (this.options.sortable) this.setDrag();\r
+ },\r
+\r
+ setDrag: function() {\r
+ Sortable.create(this.tabContainerId, {\r
+ tag: 'div',\r
+ overlap: 'horizontal',\r
+ constraint: 'horizontal',\r
+ onChange: this.options.onSort,\r
+ onUpdate: this.options.afterSort,\r
+ starteffect: Prototype.emptyFunction,\r
+ endeffect: Prototype.emptyFunction\r
+ });\r
+ },\r
+ \r
+ build: function() {\r
+ this.buildContainers();\r
+ \r
+ Element.cleanWhitespace(this.element);\r
+ var tabSets = this.element.childNodes;\r
+ \r
+ if (tabSets.length <= this.selected) {\r
+ this.selected = 0;\r
+ }\r
+ var i = 0;\r
+ while(tabSets.length > 0) {\r
+ this.buildTabSet(tabSets[0], i);\r
+ i++;\r
+ }\r
+ this.addContainers();\r
+ this.selectTab();\r
+ },\r
+\r
+ buildTabSet: function(element, i) {\r
+ if (element.nodeType != 1) {\r
+ Element.remove(element);\r
+ return;\r
+ }\r
+ Element.cleanWhitespace(element);\r
+ var panelContents = element.childNodes[1];\r
+ this.buildPanel(panelContents, i); \r
+ this.buildTab(element, i);\r
+ },\r
+\r
+ buildContainers : function() {\r
+ this.tabContainer = Builder.node('div',{id:this.tabContainerId});\r
+ this.classNames.addClassNames(this.tabContainer, 'tabContainer');\r
+ \r
+ this.panelContainer = Builder.node('div', {id:this.panelContainerId});\r
+ this.classNames.addClassNames(this.panelContainer, 'panelContainer'); \r
+ },\r
+ \r
+ addContainers : function() {\r
+ this.element.appendChild(this.tabContainer);\r
+ this.element.appendChild(this.panelContainer);\r
+ },\r
+\r
+ buildTab: function(tab, i) {\r
+ tab.id = this.tabId + i\r
+ this.classNames.addClassNames(tab, 'tab');\r
+ var tabTitle = Builder.node('div', [$A(tab.childNodes)]); \r
+ this.classNames.addClassNames(tabTitle, 'tabTitle');\r
+ var tabLeft = Builder.node('div', {id:this.tabLeftId + i});\r
+ var tabMiddle = Builder.node('div', {id:this.tabMiddleId + i}, [tabTitle]);\r
+ var tabRight = Builder.node('div',{id:this.tabRightId + i});\r
+ \r
+ tab.appendChild(tabLeft);\r
+ tab.appendChild(tabMiddle);\r
+ tab.appendChild(tabRight);\r
+ Event.observe(tab, 'click', this.selectTab.bindAsEventListener(this));\r
+ Event.observe(tab, 'mouseover', this.onMouseOver.bindAsEventListener(this));\r
+ Event.observe(tab, 'mouseout', this.onMouseOut.bindAsEventListener(this));\r
+\r
+ if (this.options.closeButton) {\r
+ var button = Builder.node('div', {\r
+ id: this.element.id.appendSuffix('closeButton_' + i)\r
+ });\r
+ this.classNames.addClassNames(button, 'closeButton');\r
+ tabMiddle.appendChild(button);\r
+ Event.observe(button, 'click', this.onRemove.bindAsEventListener(this));\r
+ }\r
+\r
+ if (this.options.tabRow && !isNaN(this.options.tabRow) && (i % this.options.tabRow == 0)) {\r
+ Element.setStyle(tab, {clear: 'left', styleFloat: 'none'});\r
+ }\r
+\r
+ this.setTitle(tabMiddle);\r
+ this.tabs[i] = tab;\r
+ this.setTabInactive(tab);\r
+ this.tabContainer.appendChild(tab); \r
+ },\r
+\r
+ setTitle: function(container) {\r
+ var node = Element.getTextNodes(container, true)[0];\r
+ title = node.nodeValue.replace(/^(\s)*/, '');\r
+ title = title.replace(/(\s)*$/, '');\r
+ var sortTitle = title;\r
+ if (this.options.titleLength && !isNaN(this.options.titleLength)) {\r
+ sortTitle = title.substring(0, this.options.titleLength);\r
+ }\r
+ node.nodeValue = sortTitle;\r
+ container.parentNode.title = title;\r
+ },\r
+ \r
+ buildPanel: function(panelContent, i) {\r
+ var panel = Builder.node('div', {id: this.panelId + i});\r
+ panel.appendChild(panelContent);\r
+ Element.hide(panel);\r
+ this.panelList[i] = panel;\r
+ this.panelContainer.appendChild(panel);\r
+ },\r
+ \r
+ selectTab: function(e){\r
+ if (!this.options.beforeSelect()) return;\r
+ if (!e) {\r
+ this.setTabActive(this.tabs[this.selected]);\r
+ Element.show(this.panelList[this.selected]);\r
+ return;\r
+ }\r
+ var currentPanel = this.getCurrentPanel();\r
+ var currentTab = this.getCurrentTab();\r
+ \r
+ var targetElement = null;\r
+ if (e.nodeType) {\r
+ targetElement = e; \r
+ } else {\r
+ targetElement = Event.element(e);\r
+ }\r
+ var targetIndex = this.getTargetIndex(targetElement);\r
+ if (targetIndex == this.selected) {\r
+ return;\r
+ }\r
+ var targetPanel = this.panelList[targetIndex];\r
+ var targetTab = this.tabs[targetIndex];\r
+ \r
+ if (currentTab) this.setTabInactive(currentTab);\r
+ this.setTabActive(targetTab);\r
+\r
+ if (currentPanel) Element.toggle(currentPanel);\r
+ Element.toggle(targetPanel);\r
+\r
+ this.selected = targetIndex;\r
+ this.options.afterSelect(targetPanel, currentPanel);\r
+ },\r
+ \r
+ setTabActive: function(tab) {\r
+ var tabChildren = tab.childNodes;\r
+ this.classNames.refreshClassNames(tabChildren[0], 'tabLeftActive');\r
+ this.classNames.refreshClassNames(tabChildren[1], 'tabMiddleActive');\r
+ this.classNames.refreshClassNames(tabChildren[2], 'tabRightActive');\r
+ },\r
+ \r
+ setTabInactive: function(tab) {\r
+ var tabChildren = tab.childNodes;\r
+ this.classNames.refreshClassNames(tabChildren[0], 'tabLeftInactive');\r
+ this.classNames.refreshClassNames(tabChildren[1], 'tabMiddleInactive');\r
+ this.classNames.refreshClassNames(tabChildren[2], 'tabRightInactive');\r
+ },\r
+\r
+ getTargetIndex: function(element) {\r
+ while(element) {\r
+ if (element.id && element.id.indexOf(this.tabId, 0) >= 0) {\r
+ var index = element.id.substring(this.tabId.length);\r
+ if (!isNaN(index)) {\r
+ return index;\r
+ }\r
+ }\r
+ element = element.parentNode;\r
+ }\r
+ },\r
+\r
+ onRemove: function(event) {\r
+ Event.stop(event);\r
+ var element = Event.element(event);\r
+ var index = this.getTargetIndex(element);\r
+ var tab = this.tabs[index];\r
+ if (this.options.onRemove(tab)) {\r
+ this.remove(tab);\r
+ }\r
+ },\r
+\r
+ remove: function(tab) {\r
+ if (tab) {\r
+ var index = this.getTargetIndex(tab);\r
+ var nextActiveTab = this.getNextTab();\r
+ if (!nextActiveTab) nextActiveTab = this.getPreviousTab();\r
+ Element.remove(tab);\r
+ Element.remove(this.panelList[index]);\r
+ this.tabs[index] = null;\r
+ this.panelList[index] = null;\r
+ \r
+ if (index == this.selected) {\r
+ if (nextActiveTab) {\r
+ this.selectTab(nextActiveTab);\r
+ }\r
+ }\r
+ }\r
+ },\r
+\r
+ addByElement: function(element) {\r
+ this.buildTabSet($(element), this.tabs.length);\r
+ if (this.options.sortable) this.setDrag();\r
+ },\r
+\r
+ add: function(title, content) {\r
+ var contents = [];\r
+ var node = Builder.node('div');\r
+ node.innerHTML = title;\r
+ contents.push(node);\r
+ node = Builder.node('div');\r
+ node.innerHTML = content;\r
+ contents.push(node);\r
+ this.addByElement(Builder.node('div', contents));\r
+ },\r
+\r
+ lazyLoad: function(index) {\r
+ this.errorCount = 0;\r
+ this.loadedList = [];\r
+ this.load(index);\r
+ },\r
+\r
+ load: function(index) {\r
+ var container = this.panelList[index];\r
+ var url = this.options.lazyLoadUrl[index];\r
+ var self = this;\r
+ if (container && url) {\r
+ new Ajax.Updater(\r
+ {success: container},\r
+ url,\r
+ {\r
+ onSuccess: function() {\r
+ self.setLoaded(index);\r
+ self.options.onLazyLoad(container, self);\r
+ self.load(++index);\r
+ if (self.isFinishLazyLoad()) self.options.afterLazyLoad(self);\r
+ },\r
+ onFailure: function() {\r
+ self.errorCount++;\r
+ self.options.lazyLoadFailure(container, self);\r
+ if (self.errorCount <= self.options.failureLimit) {\r
+ self.load(index);\r
+ } else {\r
+ self.options.failureLimitOver(self);\r
+ }\r
+ },\r
+ asynchronous: true, \r
+ evalScripts: true\r
+ }\r
+ );\r
+ }\r
+ },\r
+\r
+ isFinishLazyLoad: function() {\r
+ return this.loadedList.length == this.panelList.length;\r
+ },\r
+\r
+ setLoaded: function(i) {\r
+ this.loadedList.push(i);\r
+ },\r
+\r
+ onMouseOver: function(event) {\r
+ var targetElement = Event.element(event);\r
+ var targetIndex = this.getTargetIndex(targetElement);\r
+ if (targetIndex != this.selected) {\r
+ var targetTab = this.tabs[targetIndex];\r
+ this.setTabActive(targetTab);\r
+ }\r
+ },\r
+\r
+ onMouseOut: function(event) {\r
+ var targetElement = Event.element(event);\r
+ var targetIndex = this.getTargetIndex(targetElement);\r
+ if (targetIndex != this.selected) {\r
+ var targetTab = this.tabs[targetIndex];\r
+ this.setTabInactive(targetTab);\r
+ }\r
+ },\r
+\r
+ hasNextTab: function() {\r
+ return this.getNextTab() ? true : false;\r
+ },\r
+\r
+ hasPreviousTab: function() {\r
+ return this.getPreviousTab() ? true : false;\r
+ },\r
+\r
+ getNextTab: function() {\r
+ return Element.next(this.getCurrentTab());\r
+ },\r
+\r
+ getPreviousTab: function() {\r
+ return Element.previous(this.getCurrentTab());\r
+ },\r
+\r
+ selectNextTab: function() {\r
+ this.selectTab(this.getNextTab());\r
+ },\r
+\r
+ selectPreviousTab: function() {\r
+ this.selectTab(this.getPreviousTab());\r
+ },\r
+\r
+ tabCount: function() {\r
+ return this.tabs.inject(0, function(i, t) {\r
+ return t ? ++i : i;\r
+ })\r
+ },\r
+\r
+ getCurrentPanel: function() {\r
+ return this.panelList[this.selected];\r
+ },\r
+\r
+ getCurrentTab: function() {\r
+ return this.tabs[this.selected];\r
+ }\r
+}\r
-// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-
-/**
- * TimePicker
- */
-var TimePicker = Class.create();
-TimePicker.className = {
- container: 'timepicker_container',
-// container: 'timepicker',
- header: 'timepicker_header',
- preYears: 'timepicker_preYears',
- nextYears: 'timepicker_nextYears',
- years: 'timepicker_years',
- mark: 'timepicker_mark',
- ym: 'timepicker_ym',
- table: 'timepicker_table',
- thRight: 'right',
- tdRight: 'right',
- tdBottom: 'bottom',
- date: 'timepicker_date',
- holiday: 'timepicker_holiday',
- regularHoliday: 'timepicker_regularHoliday',
- schedule: 'timepicker_schedule',
- highlightDay: 'timepicker_highlightDay',
- scheduleListContainer: 'timepicker_scheduleListContainer',
- scheduleItem: 'timepicker_scheduleItem',
- scheduleTimeArea: 'timepicker_scheduleItemTimeArea',
- scheduleHandler: 'timepicker_scheduleHandler',
- holidayName: 'timepicker_holidayName',
- dateContainer: 'timepicker_dateContainer',
- tableHeader: 'timepicker_tableHeader',
- rowContent: 'timepicker_rowContent',
- selected: 'timepicker_selected',
- displayToggle: 'timepicker_displayToggle',
-
- nextYearMark: 'timepicker_nextYearMark',
- nextMonthMark: 'timepicker_nextMonthMark',
- nextWeekMark: 'timepicker_nextWeekMark',
- preYearMark: 'timepicker_preYearMark',
- preMonthMark: 'timepicker_preMonthMark',
- preWeekMark: 'timepicker_preWeekMark',
-
- weekTable: 'timepicker_weekContainerTable',
- weekMainTable: 'timepicker_weekMainTable',
- timeLine: 'timepicker_timeline',
- timeLineTimeTop: 'timepicker_timelineTimeTop',
- timeLineTime: 'timepicker_timelineTime',
- timeLineTimeIe: 'timepicker_timelineTime_ie',
- timeLineTimeIeTop: 'timepicker_timelineTime_ieTop',
- headerColumn: 'timepicker_headerColumn',
- columnTopDate: 'timepicker_columnTopDate',
- columnDate: 'timepicker_columnDate',
- columnDateOdd: 'timepicker_columnOddDate',
- scheduleItemSamll: 'timepicker_scheduleItemSmall',
- scheduleItemLarge: 'timepicker_scheduleItemLarge',
- scheduleItemSelect: 'timepicker_scheduleItemSelect',
- deleteImg: 'timepicker_deleteImage',
- privateImg: 'timepicker_privateImage',
- scheduleContainer: 'timepicker_weekScheduleContainer',
- selector: 'timepicker_selector',
- cover: 'timepicker_cover'
-}
-Object.extend(TimePicker.prototype, Calendar.prototype);
-Object.extend(TimePicker.prototype, {
- initialize: function(element) {
- this.options = Object.extend({
- initDate: new Date(),
- cssPrefix: 'custom_',
- holidays: [],
- schedules: [],
- size: Calendar.size.large,
- regularHoliday: [0, 6],
- displayIndexes: [0, 1, 2, 3, 4, 5, 6],
- displayTime: [{hour: 0, min: 0}, {hour: 24, min: 0}],
- weekIndex: 0,
- dblclickListener: null,
- afterSelect: Prototype.emptyFunction,
- beforeRefresh: Prototype.emptyFunction,
- changeSchedule: Prototype.emptyFunction,
- changeCalendar: Prototype.emptyFunction,
- displayType: 'month',
- highlightDay: true,
- beforeRemoveSchedule: function() {return true;},
- dblclickSchedule: null,
- updateTirm: Prototype.emptyFunction,
- displayTimeLine: true,
- clickDateText: null,
- getMonthHeaderText: Prototype.emptyFunction,
- getMonthSubHeaderText: Prototype.emptyFunction,
- getWeekHeaderText: Prototype.emptyFunction,
- getWeekSubHeaderText: Prototype.emptyFunction,
- getDayHeaderText: Prototype.emptyFunction,
-
- setPosition: true,
- headerTitle: '',
- standardTime: false,
- oneDayLabel: '24H',
- standardTimeLabel: 'standard'
- }, arguments[1] || {});
-
- if (this.options.standardTime) {
- this.options.displayTime = this.options.standardTime;
- this.options.oneDay = [{hour: 0, min: 0}, {hour: 24, min: 0}];
- }
-
- this.element = $(element);
- this.date = new Date();
- var customCss = CssUtil.appendPrefix(this.options.cssPrefix, TimePicker.className);
- this.classNames = new CssUtil([TimePicker.className, customCss]);
-
- this.builder = new TimePickerBuilder(this);
- this.builder.beforeBuild();
- this.calendar = this.builder.build();
- this.builder.afterBuild();
- this.element.appendChild(this.calendar);
- Element.hide(element);
- Element.setStyle(this.element, {position: 'absolute'});
-
-// Event.observe(document, 'click', this.hide.bind(this));
- Event.observe(document, "mouseup", this.onMouseUp.bindAsEventListener(this));
- },
-
- refresh: function() {
- this.options.beforeRefresh(this);
- this.destroy();
- this.selectedBase = null;
- Element.remove(this.calendar);
- this.builder = new TimePickerBuilder(this);
- this.builder.beforeBuild();
- this.calendar = this.builder.build();
- this.element.appendChild(this.calendar);
- this.builder.afterBuild();
-// Event.observe(window, 'resize', this.windowResize);
- },
-
- show: function(event, triggerId) {
- Event.stop(event);
- var pointer = [Event.pointerX(event), Event.pointerY(event)];
- if (this.options.setPosition.constructor == Function) {
- this.options.setPosition(this.element, pointer);
- } else if (this.options.setPosition) {
- var parentOffset = Position.cumulativeOffset(this.element.parentNode);
- Element.setStyle(this.element, {
- left: pointer[0] - parentOffset[0] + 'px',
- top: pointer[1] - parentOffset[1] + 'px'
- });
- }
- Element.setStyle(this.element, {zIndex: ZindexManager.getIndex()});
- Element.show(this.element);
- this.builder.setColumnWidth();
- this.builder.setCover();
- },
-
- hide: function() {
- Element.hide(this.element);
- this.clearSelected();
- },
-
- setTrigger: function(trigger, targets) {
- trigger = $(trigger);
- Event.observe(trigger, 'click', this.show.bindAsEventListener(this));
- },
-
- setTargets: function(targets) {
- this.targets = targets;
- },
-
- onMouseUp: function(event) {
- var calendar = this;
- var dimention = Element.getDimensions(this.element);
- var position = Position.cumulativeOffset(this.element);
- var x = Event.pointerX(event);
- var y = Event.pointerY(event);
-
- if ((x < position[0]) || ((position[0] + dimention.width) < x) ||
- (y < position[1]) || ((position[1] + dimention.height) < y)) {
- this.hide();
- }
-
- if (calendar.mouseDown) {
- setTimeout(function() {
- if (calendar.mouseDown) {
- calendar.mouseDown = false;
- calendar.hide();
- }
- }, 10);
- }
-
- var term = this.builder.getSelectedTerm();
- if (term) {
- var start = term.first();
- var finish = term.last();
- this.setTime(this.targets.start.hour, start.getHours());
- this.setTime(this.targets.start.min, start.getMinutes());
- this.setTime(this.targets.finish.hour, finish.getHours());
- this.setTime(this.targets.finish.min, finish.getMinutes());
- this.hide();
- }
- },
-
- setTime: function(target, value) {
- $A($(target).options).each(function(option) {
- if (option.value == value) {
- option.selected = true;
- } else {
- option.selected = false;
- }
- });
- }
-});
-
-
-/**
- * TimePickerBuilder
- */
-var TimePickerBuilder = Class.create();
-Object.extend(TimePickerBuilder.prototype, CalendarDay.prototype);
-Object.extend(TimePickerBuilder.prototype, {
- initialize: function(calendar) {
- var day = calendar.date.getDay();
- this.calendar = calendar;
- this.setDisplayTime();
- this.calendar.options.displayIndexesOld = this.calendar.options.displayIndexes;
- this.calendar.options.displayIndexes = [day];
- this.calendar.options.weekIndexOld = this.calendar.options.weekIndex;
- this.calendar.options.weekIndex = day;
- this.week = this.getWeek();
- },
-
- buildHeader: function() {
- var headerNodes = Builder.node('TR');
- headerNodes.appendChild(this.buildHeaderCenter());
-
- className = this.calendar.classNames.joinClassNames('header');
- var tbody = Builder.node('TBODY', [headerNodes]);
- return Builder.node('TABLE', {className: className}, [tbody]);
- },
-
- buildHeaderCenter: function() {
- var contents = [];
- var node = Builder.node('SPAN', [this.calendar.options.headerTitle]);
- contents.push(node);
- var container = Builder.node('TD', contents);
- return container;
- },
-
- buildTimeLine: function() {
- var time = new Date();
- var hour = 0, hoursOfDay = 24;
- time.setHours(hour);
- time.setMinutes(0);
- var nodes = [];
- var timelineClass = 'timeLineTime';
- var timelineTopClass = 'timeLineTime'
- if (UserAgent.isIE()) {
- timelineClass = 'timeLineTimeIe';
- timelineTopClass = 'timeLineTimeIeTop';
- }
-
- var node = Builder.node('DIV');
- this.calendar.classNames.addClassNames(node, 'timeLineTimeTop');
- nodes.push(node);
- while (hour < hoursOfDay) {
- if (this.includeDisplayTime(hour)) {
- node = Builder.node('DIV', [this.formatTime(time)]);
- if (nodes.length == 0) {
- this.calendar.classNames.addClassNames(node, timelineTopClass);
- } else {
- this.calendar.classNames.addClassNames(node, timelineClass);
- }
- nodes.push(node);
- }
- hour++;
- time.setHours(hour);
- }
-
- var td = Builder.node('TD', nodes);
- this.calendar.classNames.addClassNames(td, 'timeLine');
- return td;
- },
-
- buildCalendarHeader: function() {
- var node = null;
- if (this.calendar.options.displayTime == this.calendar.options.standardTime) {
- node = Builder.node('DIV', [this.calendar.options.oneDayLabel]);
- } else {
- node = Builder.node('DIV', [this.calendar.options.standardTimeLabel]);
- }
- Event.observe(node, 'click', this.toggleDisplayTime.bindAsEventListener(this, node));
- this.calendar.classNames.addClassNames(node, 'headerColumn');
- return Builder.node('TR', [Builder.node('TD', {align: 'center'}, [node])]);
- },
-
- abstractSelect: function(event, method) {
- var element = this.findClickedElement(event);
- if (element) {
- if (Element.hasClassName(element, TimePicker.className.columnDate) ||
- Element.hasClassName(element, TimePicker.className.columnDateOdd) ||
- Element.hasClassName(element, TimePicker.className.columnTopDate)) {
-
- var date = this.getDate(element);
- method(date, element);
- }
- }
- },
-
- toggleDisplayTime: function(event, element) {
- Event.stop(event);
-// var text = Element.getTextNodes(element).first().nodeValue;
- if (this.calendar.options.displayTime == this.calendar.options.oneDay) {
- this.calendar.options.displayTime = this.calendar.options.standardTime;
- } else {
- this.calendar.options.displayTime = this.calendar.options.oneDay;
- }
- this.calendar.refresh();
- },
-
- findClickedElement: function(event) {
- var container = $(this.getScheduleContainerId());
- var position = Position.cumulativeOffset(container);
- var x = Event.pointerX(event) - position[0];
- var y = Event.pointerY(event) - position[1];
- var descendans = this.calendarTable.rows[0].cells[0].getElementsByTagName('div');
- var height = parseInt(Element.getHeight(container), 10) / descendans.length;
- var cellIndex = Math.floor(y / height);
- return descendans[cellIndex];
- },
-
- beforeBuild: function() {
- this.column = {};
- var rule = CssUtil.getCssRuleBySelectorText('.' + TimePicker.className.columnDate);
- this.column.height = parseInt(rule.style['height'], 10) + 1;
- },
-
- afterBuild: function() {
- this.setColumnWidth();
- this.setCover();
- }
-});
+// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+\r
+/**\r
+ * TimePicker\r
+ */\r
+var TimePicker = Class.create();\r
+TimePicker.className = {\r
+ container: 'timepicker_container',\r
+// container: 'timepicker',\r
+ header: 'timepicker_header',\r
+ preYears: 'timepicker_preYears',\r
+ nextYears: 'timepicker_nextYears',\r
+ years: 'timepicker_years',\r
+ mark: 'timepicker_mark',\r
+ ym: 'timepicker_ym',\r
+ table: 'timepicker_table',\r
+ thRight: 'right',\r
+ tdRight: 'right',\r
+ tdBottom: 'bottom',\r
+ date: 'timepicker_date',\r
+ holiday: 'timepicker_holiday',\r
+ regularHoliday: 'timepicker_regularHoliday',\r
+ schedule: 'timepicker_schedule',\r
+ highlightDay: 'timepicker_highlightDay',\r
+ scheduleListContainer: 'timepicker_scheduleListContainer',\r
+ scheduleItem: 'timepicker_scheduleItem',\r
+ scheduleTimeArea: 'timepicker_scheduleItemTimeArea',\r
+ scheduleHandler: 'timepicker_scheduleHandler',\r
+ holidayName: 'timepicker_holidayName',\r
+ dateContainer: 'timepicker_dateContainer',\r
+ tableHeader: 'timepicker_tableHeader',\r
+ rowContent: 'timepicker_rowContent',\r
+ selected: 'timepicker_selected',\r
+ displayToggle: 'timepicker_displayToggle',\r
+\r
+ nextYearMark: 'timepicker_nextYearMark',\r
+ nextMonthMark: 'timepicker_nextMonthMark',\r
+ nextWeekMark: 'timepicker_nextWeekMark',\r
+ preYearMark: 'timepicker_preYearMark',\r
+ preMonthMark: 'timepicker_preMonthMark',\r
+ preWeekMark: 'timepicker_preWeekMark',\r
+ \r
+ weekTable: 'timepicker_weekContainerTable',\r
+ weekMainTable: 'timepicker_weekMainTable',\r
+ timeLine: 'timepicker_timeline',\r
+ timeLineTimeTop: 'timepicker_timelineTimeTop',\r
+ timeLineTime: 'timepicker_timelineTime',\r
+ timeLineTimeIe: 'timepicker_timelineTime_ie',\r
+ timeLineTimeIeTop: 'timepicker_timelineTime_ieTop',\r
+ headerColumn: 'timepicker_headerColumn',\r
+ columnTopDate: 'timepicker_columnTopDate',\r
+ columnDate: 'timepicker_columnDate',\r
+ columnDateOdd: 'timepicker_columnOddDate',\r
+ scheduleItemSamll: 'timepicker_scheduleItemSmall',\r
+ scheduleItemLarge: 'timepicker_scheduleItemLarge',\r
+ scheduleItemSelect: 'timepicker_scheduleItemSelect',\r
+ deleteImg: 'timepicker_deleteImage',\r
+ privateImg: 'timepicker_privateImage',\r
+ scheduleContainer: 'timepicker_weekScheduleContainer',\r
+ selector: 'timepicker_selector',\r
+ cover: 'timepicker_cover'\r
+}\r
+Object.extend(TimePicker.prototype, Calendar.prototype);\r
+Object.extend(TimePicker.prototype, {\r
+ initialize: function(element) {\r
+ this.options = Object.extend({\r
+ initDate: new Date(),\r
+ cssPrefix: 'custom_',\r
+ holidays: [],\r
+ schedules: [],\r
+ size: Calendar.size.large,\r
+ regularHoliday: [0, 6],\r
+ displayIndexes: [0, 1, 2, 3, 4, 5, 6],\r
+ displayTime: [{hour: 0, min: 0}, {hour: 24, min: 0}],\r
+ weekIndex: 0,\r
+ dblclickListener: null,\r
+ afterSelect: Prototype.emptyFunction,\r
+ beforeRefresh: Prototype.emptyFunction,\r
+ changeSchedule: Prototype.emptyFunction,\r
+ changeCalendar: Prototype.emptyFunction,\r
+ displayType: 'month',\r
+ highlightDay: true,\r
+ beforeRemoveSchedule: function() {return true;},\r
+ dblclickSchedule: null,\r
+ updateTirm: Prototype.emptyFunction,\r
+ displayTimeLine: true,\r
+ clickDateText: null,\r
+ getMonthHeaderText: Prototype.emptyFunction,\r
+ getMonthSubHeaderText: Prototype.emptyFunction,\r
+ getWeekHeaderText: Prototype.emptyFunction,\r
+ getWeekSubHeaderText: Prototype.emptyFunction,\r
+ getDayHeaderText: Prototype.emptyFunction,\r
+\r
+ setPosition: true,\r
+ headerTitle: '',\r
+ standardTime: false,\r
+ oneDayLabel: '24H',\r
+ standardTimeLabel: 'standard'\r
+ }, arguments[1] || {});\r
+\r
+ if (this.options.standardTime) {\r
+ this.options.displayTime = this.options.standardTime;\r
+ this.options.oneDay = [{hour: 0, min: 0}, {hour: 24, min: 0}];\r
+ }\r
+\r
+ this.element = $(element);\r
+ this.date = new Date();\r
+ var customCss = CssUtil.appendPrefix(this.options.cssPrefix, TimePicker.className);\r
+ this.classNames = new CssUtil([TimePicker.className, customCss]);\r
+\r
+ this.builder = new TimePickerBuilder(this);\r
+ this.builder.beforeBuild();\r
+ this.calendar = this.builder.build();\r
+ this.builder.afterBuild();\r
+ this.element.appendChild(this.calendar);\r
+ Element.hide(element);\r
+ Element.setStyle(this.element, {position: 'absolute'});\r
+ \r
+// Event.observe(document, 'click', this.hide.bind(this));\r
+ Event.observe(document, "mouseup", this.onMouseUp.bindAsEventListener(this));\r
+ },\r
+\r
+ refresh: function() {\r
+ this.options.beforeRefresh(this);\r
+ this.destroy();\r
+ this.selectedBase = null;\r
+ Element.remove(this.calendar);\r
+ this.builder = new TimePickerBuilder(this);\r
+ this.builder.beforeBuild();\r
+ this.calendar = this.builder.build();\r
+ this.element.appendChild(this.calendar);\r
+ this.builder.afterBuild();\r
+// Event.observe(window, 'resize', this.windowResize);\r
+ },\r
+\r
+ show: function(event, triggerId) {\r
+ Event.stop(event);\r
+ var pointer = [Event.pointerX(event), Event.pointerY(event)];\r
+ if (this.options.setPosition.constructor == Function) {\r
+ this.options.setPosition(this.element, pointer);\r
+ } else if (this.options.setPosition) {\r
+ var parentOffset = Position.cumulativeOffset(this.element.parentNode);\r
+ Element.setStyle(this.element, {\r
+ left: pointer[0] - parentOffset[0] + 'px',\r
+ top: pointer[1] - parentOffset[1] + 'px'\r
+ });\r
+ }\r
+ Element.setStyle(this.element, {zIndex: ZindexManager.getIndex()});\r
+ Element.show(this.element);\r
+ this.builder.setColumnWidth();\r
+ this.builder.setCover();\r
+ },\r
+\r
+ hide: function() {\r
+ Element.hide(this.element);\r
+ this.clearSelected();\r
+ },\r
+\r
+ setTrigger: function(trigger, targets) {\r
+ trigger = $(trigger);\r
+ Event.observe(trigger, 'click', this.show.bindAsEventListener(this));\r
+ },\r
+\r
+ setTargets: function(targets) {\r
+ this.targets = targets;\r
+ },\r
+\r
+ onMouseUp: function(event) {\r
+ var calendar = this;\r
+ var dimention = Element.getDimensions(this.element);\r
+ var position = Position.cumulativeOffset(this.element);\r
+ var x = Event.pointerX(event);\r
+ var y = Event.pointerY(event);\r
+\r
+ if ((x < position[0]) || ((position[0] + dimention.width) < x) ||\r
+ (y < position[1]) || ((position[1] + dimention.height) < y)) {\r
+ this.hide();\r
+ }\r
+\r
+ if (calendar.mouseDown) {\r
+ setTimeout(function() {\r
+ if (calendar.mouseDown) {\r
+ calendar.mouseDown = false;\r
+ calendar.hide();\r
+ }\r
+ }, 10);\r
+ }\r
+\r
+ var term = this.builder.getSelectedTerm();\r
+ if (term) {\r
+ var start = term.first();\r
+ var finish = term.last();\r
+ this.setTime(this.targets.start.hour, start.getHours());\r
+ this.setTime(this.targets.start.min, start.getMinutes());\r
+ this.setTime(this.targets.finish.hour, finish.getHours());\r
+ this.setTime(this.targets.finish.min, finish.getMinutes());\r
+ this.hide();\r
+ }\r
+ },\r
+\r
+ setTime: function(target, value) {\r
+ $A($(target).options).each(function(option) {\r
+ if (option.value == value) {\r
+ option.selected = true;\r
+ } else {\r
+ option.selected = false;\r
+ }\r
+ });\r
+ }\r
+});\r
+\r
+\r
+/**\r
+ * TimePickerBuilder\r
+ */\r
+var TimePickerBuilder = Class.create();\r
+Object.extend(TimePickerBuilder.prototype, CalendarDay.prototype);\r
+Object.extend(TimePickerBuilder.prototype, {\r
+ initialize: function(calendar) {\r
+ var day = calendar.date.getDay();\r
+ this.calendar = calendar;\r
+ this.setDisplayTime();\r
+ this.calendar.options.displayIndexesOld = this.calendar.options.displayIndexes;\r
+ this.calendar.options.displayIndexes = [day];\r
+ this.calendar.options.weekIndexOld = this.calendar.options.weekIndex;\r
+ this.calendar.options.weekIndex = day;\r
+ this.week = this.getWeek();\r
+ },\r
+\r
+ buildHeader: function() {\r
+ var headerNodes = Builder.node('TR');\r
+ headerNodes.appendChild(this.buildHeaderCenter());\r
+ \r
+ className = this.calendar.classNames.joinClassNames('header');\r
+ var tbody = Builder.node('TBODY', [headerNodes]);\r
+ return Builder.node('TABLE', {className: className}, [tbody]);\r
+ },\r
+\r
+ buildHeaderCenter: function() {\r
+ var contents = [];\r
+ var node = Builder.node('SPAN', [this.calendar.options.headerTitle]);\r
+ contents.push(node);\r
+ var container = Builder.node('TD', contents);\r
+ return container;\r
+ },\r
+\r
+ buildTimeLine: function() {\r
+ var time = new Date();\r
+ var hour = 0, hoursOfDay = 24;\r
+ time.setHours(hour);\r
+ time.setMinutes(0);\r
+ var nodes = [];\r
+ var timelineClass = 'timeLineTime';\r
+ var timelineTopClass = 'timeLineTime'\r
+ if (UserAgent.isIE()) {\r
+ timelineClass = 'timeLineTimeIe';\r
+ timelineTopClass = 'timeLineTimeIeTop';\r
+ }\r
+\r
+ var node = Builder.node('DIV');\r
+ this.calendar.classNames.addClassNames(node, 'timeLineTimeTop');\r
+ nodes.push(node);\r
+ while (hour < hoursOfDay) {\r
+ if (this.includeDisplayTime(hour)) {\r
+ node = Builder.node('DIV', [this.formatTime(time)]);\r
+ if (nodes.length == 0) {\r
+ this.calendar.classNames.addClassNames(node, timelineTopClass);\r
+ } else {\r
+ this.calendar.classNames.addClassNames(node, timelineClass);\r
+ }\r
+ nodes.push(node);\r
+ }\r
+ hour++;\r
+ time.setHours(hour);\r
+ }\r
+\r
+ var td = Builder.node('TD', nodes);\r
+ this.calendar.classNames.addClassNames(td, 'timeLine');\r
+ return td;\r
+ },\r
+ \r
+ buildCalendarHeader: function() {\r
+ var node = null;\r
+ if (this.calendar.options.displayTime == this.calendar.options.standardTime) {\r
+ node = Builder.node('DIV', [this.calendar.options.oneDayLabel]);\r
+ } else {\r
+ node = Builder.node('DIV', [this.calendar.options.standardTimeLabel]);\r
+ }\r
+ Event.observe(node, 'click', this.toggleDisplayTime.bindAsEventListener(this, node));\r
+ this.calendar.classNames.addClassNames(node, 'headerColumn');\r
+ return Builder.node('TR', [Builder.node('TD', {align: 'center'}, [node])]);\r
+ },\r
+\r
+ abstractSelect: function(event, method) {\r
+ var element = this.findClickedElement(event);\r
+ if (element) {\r
+ if (Element.hasClassName(element, TimePicker.className.columnDate) ||\r
+ Element.hasClassName(element, TimePicker.className.columnDateOdd) ||\r
+ Element.hasClassName(element, TimePicker.className.columnTopDate)) {\r
+ \r
+ var date = this.getDate(element);\r
+ method(date, element);\r
+ }\r
+ }\r
+ },\r
+\r
+ toggleDisplayTime: function(event, element) {\r
+ Event.stop(event);\r
+// var text = Element.getTextNodes(element).first().nodeValue;\r
+ if (this.calendar.options.displayTime == this.calendar.options.oneDay) {\r
+ this.calendar.options.displayTime = this.calendar.options.standardTime;\r
+ } else {\r
+ this.calendar.options.displayTime = this.calendar.options.oneDay;\r
+ }\r
+ this.calendar.refresh();\r
+ },\r
+\r
+ findClickedElement: function(event) {\r
+ var container = $(this.getScheduleContainerId());\r
+ var position = Position.cumulativeOffset(container);\r
+ var x = Event.pointerX(event) - position[0];\r
+ var y = Event.pointerY(event) - position[1];\r
+ var descendans = this.calendarTable.rows[0].cells[0].getElementsByTagName('div');\r
+ var height = parseInt(Element.getHeight(container), 10) / descendans.length;\r
+ var cellIndex = Math.floor(y / height);\r
+ return descendans[cellIndex];\r
+ },\r
+\r
+ beforeBuild: function() {\r
+ this.column = {};\r
+ var rule = CssUtil.getCssRuleBySelectorText('.' + TimePicker.className.columnDate);\r
+ this.column.height = parseInt(rule.style['height'], 10) + 1;\r
+ },\r
+\r
+ afterBuild: function() {\r
+ this.setColumnWidth();\r
+ this.setCover();\r
+ }\r
+});\r
-// Copyright (c) 2006 spinelz.org (http://script.spinelz.org/)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-var ToolBar = Class.create();
-ToolBar.className = {
- container : 'toolbar_container',
- containerLeft : 'toolbar_containerLeft',
- containerMiddle : 'toolbar_containerMiddle',
- containerRight : 'toolbar_containerRight',
- toolbarItem : 'toolbar_item',
- toolbarItemHover : 'toolbar_itemHov',
- toolbarItemPres : 'toolbar_itemPres',
- toolbarContent : 'toolbar_content',
- toolbarContentPres: 'toolbar_contentPres'
-}
-
-ToolBar.prototype = {
-
- initialize: function(element) {
- var options = Object.extend({
- cssPrefix : 'custom_'
- }, arguments[1] || {});
-
- this.element = $(element);
- Element.setStyle(this.element, {visibility: 'hidden'});
- Element.hide(this.element);
- this.options = options;
-
- var customCss = CssUtil.appendPrefix(this.options.cssPrefix, ToolBar.className);
- this.classNames = new CssUtil([ToolBar.className, customCss]);
-
- this.build();
- Element.setStyle(this.element, {visibility: 'visible'});
- Element.show(this.element);
- },
-
- build: function() {
-// Element.cleanWhitespace(this.element);
- this.classNames.addClassNames(this.element, 'container');
- var iconList = this.element.childNodes;
-
- var containerLeft = Builder.node('div');
- this.classNames.addClassNames(containerLeft, 'containerLeft');
-
- this.containerMiddle = Builder.node('div');
- this.classNames.addClassNames(this.containerMiddle, 'containerMiddle');
-
- var containerRight = Builder.node('div');
- this.classNames.addClassNames(containerRight, 'containerRight');
-
- var removeList = [];
- var toolbar = this;
- $A(iconList).each(function(i) {
- if (i.nodeType != 1) {
- throw $continue;
- }
- toolbar.buildIcon(i);
- });
-
- this.element.appendChild(containerLeft);
- this.element.appendChild(this.containerMiddle);
- this.element.appendChild(containerRight);
- },
-
- buildIcon: function(icon) {
- var toolbarItem = Builder.node('div');
- this.classNames.addClassNames(toolbarItem, 'toolbarItem');
-
- var toolbarContent = Builder.node('div');
- this.classNames.addClassNames(toolbarContent, 'toolbarContent');
-
- toolbarContent.appendChild(icon);
- toolbarItem.appendChild(toolbarContent);
- this.containerMiddle.appendChild(toolbarItem);
- this.setHovEvent(toolbarItem);
- this.setPresEvent(toolbarItem);
- },
-
- addIcon: function(options) {
- var iconOptions = Object.extend({
- id : 'newIcon',
- src : 'url',
- alt : 'icon',
- width: 15,
- height: 15
- }, arguments[0] || {});
- if (!$(iconOptions.id)) {
- var icon = Builder.node('img', {id: iconOptions.id, src: iconOptions.src, alt: iconOptions.alt, style: 'width: ' + iconOptions.width + 'px; height: ' + iconOptions.height + 'px;'});
- this.buildIcon(icon);
- }
- },
-
- removeIcon: function(icon) {
- var target = $(icon);
- if (target) {
- var itemNode = target.parentNode.parentNode;
- Element.remove(itemNode);
- }
- },
-
- addEvent: function(icon, eventName, func) {
- var target = $(icon);
- if (target) {
- var itemNode = target.parentNode.parentNode;
- Event.observe(itemNode, eventName, func);
- }
- },
-
- removeEvent: function(icon, eventName, func) {
- var target = $(icon);
- if (target) {
- var itemNode = target.parentNode.parentNode;
- Event.stopObserving(itemNode, eventName, func);
- }
- },
- setHovEvent: function(element) {
- Event.observe(element, "mouseout", this.toggleItemClass(element, 'toolbarItem').bindAsEventListener(this));
- Event.observe(element, "mouseover", this.toggleItemClass(element, 'toolbarItemHover').bindAsEventListener(this));
- Event.observe(element, "mouseout", this.toggleItemClass(element.childNodes[0], 'toolbarContent').bindAsEventListener(this));
- },
-
- setPresEvent: function(element) {
- Event.observe(element, "mousedown", this.toggleItemClass(element, 'toolbarItemPres').bindAsEventListener(this));
- Event.observe(element, "mouseup", this.toggleItemClass(element, 'toolbarItem').bindAsEventListener(this));
- Event.observe(element, "mousedown", this.toggleItemClass(element.childNodes[0], 'toolbarContentPres').bindAsEventListener(this));
- Event.observe(element, "mouseup", this.toggleItemClass(element.childNodes[0], 'toolbarContent').bindAsEventListener(this));
- },
-
- toggleItemClass: function(target, className) {
- return function() {
- this.classNames.refreshClassNames(target, className);
- }
- }
-}
+// Copyright (c) 2006 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+var ToolBar = Class.create();\r
+ToolBar.className = {\r
+ container : 'toolbar_container',\r
+ containerLeft : 'toolbar_containerLeft',\r
+ containerMiddle : 'toolbar_containerMiddle',\r
+ containerRight : 'toolbar_containerRight', \r
+ toolbarItem : 'toolbar_item',\r
+ toolbarItemHover : 'toolbar_itemHov',\r
+ toolbarItemPres : 'toolbar_itemPres',\r
+ toolbarContent : 'toolbar_content',\r
+ toolbarContentPres: 'toolbar_contentPres'\r
+}\r
+\r
+ToolBar.prototype = {\r
+\r
+ initialize: function(element) {\r
+ var options = Object.extend({\r
+ cssPrefix : 'custom_'\r
+ }, arguments[1] || {});\r
+ \r
+ this.element = $(element);\r
+ Element.setStyle(this.element, {visibility: 'hidden'});\r
+ Element.hide(this.element);\r
+ this.options = options;\r
+ \r
+ var customCss = CssUtil.appendPrefix(this.options.cssPrefix, ToolBar.className);\r
+ this.classNames = new CssUtil([ToolBar.className, customCss]);\r
+ \r
+ this.build();\r
+ Element.setStyle(this.element, {visibility: 'visible'});\r
+ Element.show(this.element);\r
+ },\r
+ \r
+ build: function() {\r
+// Element.cleanWhitespace(this.element);\r
+ this.classNames.addClassNames(this.element, 'container');\r
+ var iconList = this.element.childNodes; \r
+ \r
+ var containerLeft = Builder.node('div');\r
+ this.classNames.addClassNames(containerLeft, 'containerLeft');\r
+ \r
+ this.containerMiddle = Builder.node('div');\r
+ this.classNames.addClassNames(this.containerMiddle, 'containerMiddle');\r
+ \r
+ var containerRight = Builder.node('div');\r
+ this.classNames.addClassNames(containerRight, 'containerRight');\r
+ \r
+ var removeList = [];\r
+ var toolbar = this; \r
+ $A(iconList).each(function(i) {\r
+ if (i.nodeType != 1) {\r
+ throw $continue;\r
+ }\r
+ toolbar.buildIcon(i);\r
+ });\r
+ \r
+ this.element.appendChild(containerLeft);\r
+ this.element.appendChild(this.containerMiddle);\r
+ this.element.appendChild(containerRight);\r
+ },\r
+ \r
+ buildIcon: function(icon) {\r
+ var toolbarItem = Builder.node('div');\r
+ this.classNames.addClassNames(toolbarItem, 'toolbarItem');\r
+ \r
+ var toolbarContent = Builder.node('div');\r
+ this.classNames.addClassNames(toolbarContent, 'toolbarContent');\r
+ \r
+ toolbarContent.appendChild(icon);\r
+ toolbarItem.appendChild(toolbarContent);\r
+ this.containerMiddle.appendChild(toolbarItem);\r
+ this.setHovEvent(toolbarItem);\r
+ this.setPresEvent(toolbarItem);\r
+ },\r
+ \r
+ addIcon: function(options) {\r
+ var iconOptions = Object.extend({\r
+ id : 'newIcon',\r
+ src : 'url',\r
+ alt : 'icon',\r
+ width: 15,\r
+ height: 15\r
+ }, arguments[0] || {});\r
+ if (!$(iconOptions.id)) {\r
+ var icon = Builder.node('img', {id: iconOptions.id, src: iconOptions.src, alt: iconOptions.alt, style: 'width: ' + iconOptions.width + 'px; height: ' + iconOptions.height + 'px;'});\r
+ this.buildIcon(icon);\r
+ }\r
+ },\r
+ \r
+ removeIcon: function(icon) {\r
+ var target = $(icon);\r
+ if (target) {\r
+ var itemNode = target.parentNode.parentNode;\r
+ Element.remove(itemNode);\r
+ } \r
+ }, \r
+\r
+ addEvent: function(icon, eventName, func) {\r
+ var target = $(icon);\r
+ if (target) {\r
+ var itemNode = target.parentNode.parentNode;\r
+ Event.observe(itemNode, eventName, func);\r
+ }\r
+ },\r
+ \r
+ removeEvent: function(icon, eventName, func) {\r
+ var target = $(icon);\r
+ if (target) {\r
+ var itemNode = target.parentNode.parentNode;\r
+ Event.stopObserving(itemNode, eventName, func);\r
+ }\r
+ },\r
+ setHovEvent: function(element) {\r
+ Event.observe(element, "mouseout", this.toggleItemClass(element, 'toolbarItem').bindAsEventListener(this));\r
+ Event.observe(element, "mouseover", this.toggleItemClass(element, 'toolbarItemHover').bindAsEventListener(this));\r
+ Event.observe(element, "mouseout", this.toggleItemClass(element.childNodes[0], 'toolbarContent').bindAsEventListener(this));\r
+ },\r
+ \r
+ setPresEvent: function(element) {\r
+ Event.observe(element, "mousedown", this.toggleItemClass(element, 'toolbarItemPres').bindAsEventListener(this));\r
+ Event.observe(element, "mouseup", this.toggleItemClass(element, 'toolbarItem').bindAsEventListener(this));\r
+ Event.observe(element, "mousedown", this.toggleItemClass(element.childNodes[0], 'toolbarContentPres').bindAsEventListener(this));\r
+ Event.observe(element, "mouseup", this.toggleItemClass(element.childNodes[0], 'toolbarContent').bindAsEventListener(this));\r
+ },\r
+ \r
+ toggleItemClass: function(target, className) {\r
+ return function() {\r
+ this.classNames.refreshClassNames(target, className);\r
+ }\r
+ }\r
+}\r
-// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-var TreeView = Class.create();
-TreeView.className = {
- top: 'treeview',
- dir: 'treeview_dir',
- dirBody: 'treeview_dirBody',
- dirBodyText: 'treeview_dirBodyText',
- dirBodyTextActive: 'treeview_dirBodyTextActive',
- dirContainer: 'treeview_dirContainer',
- dirContainerHover: 'treeview_dirContainerHover',
- file: 'treeview_file',
- fileBody: 'treeview_fileBody',
- fileBodyText: 'treeview_fileBodyText',
- fileBodyTextActive: 'treeview_fileBodyTextActive',
- state_open: 'treeview_stateOpen',
- state_close: 'treeview_stateClose',
- state_empty: 'treeview_stateEmpty',
- dirIcon: 'treeview_dirIcon',
- fileIcon: 'treeview_fileIcon',
- handle: 'treeview_handle'
-}
-
-TreeView.iconId = 'treeview_icon';
-
-TreeView.prototype = {
- initialize: function(element) {
- this.element = $(element);
- Element.setStyle(this.element, {visibility: 'hidden'});
- Element.hide(this.element);
-
- this.options = Object.extend({
- dirSymbol: 'dir',
- fileSymbol: 'file',
- cssPrefix: 'custom_',
- open: true,
- callBackFunctions: false,
- dirSelect: true,
- fileSelect: true,
- noSelectedInsert: true,
- iconIdPrefix: TreeView.iconId,
- move: false,
- unselected: Prototype.emptyFunction,
- enableUnselected: true,
- sortOptions: {},
- openDir: Prototype.emptyFunction,
- closeDir: Prototype.emptyFunction,
- emptyImg: false,
- initialSelected: null
- }, arguments[1] || {});
-
- this.customCss = CssUtil.appendPrefix(this.options.cssPrefix, TreeView.className);
- this.classNames = new CssUtil([TreeView.className, this.customCss]);
-
- this.changeClassNameDirAndFile(this.element);
- var nodes = this.element.childNodes;
- for (var i = 0; i < nodes.length; i++) {
- this.build(nodes[i]);
- }
-
- this.classNames.addClassNames(this.element, 'top');
- Element.setStyle(this.element, {visibility: 'visible'});
- Element.show(this.element);
-
- if (this.options.initialSelected) {
- this.selectEffect(this.options.initialSelected);
- }
-
- if (this.options.move) {
- this.setSortable();
- }
- },
-
- addChildById: function(element, parent, number) {
- element = $(element);
- parent = $(parent);
-
- var container = null;
- if (!element || !parent)
- return;
- else if (Element.hasClassName(parent, TreeView.className.dir))
- container = this.getChildDirContainer(parent);
- else if (Element.hasClassName(parent, TreeView.className.top))
- container = parent;
- else
- return;
-
- this.build(element);
-
- if (isNaN(number)) {
- container.appendChild(element);
- } else {
- var children = this.getDirectoryContents(container);
- if (children[number]) container.insertBefore(element, children[number]);
- else container.appendChild(element);
- }
-
- this.refreshStateImg(parent);
- if (this.options.dragAdrop) this.setSortable();
- },
-
- addChildByPath: function(element, path) {
- element = $(element);
- if (element) this.build(element);
- else return;
-
- var paths = path.split('/').findAll(function(elm) {
- return (elm != '');
- });
-
- var last = paths.pop();
- var container = this.search(paths.join('/'));
-
- var children = this.getDirectoryContents(container);
-
- if(children[last])
- container.insertBefore(element, children[last]);
- else
- container.appendChild(element);
-
- this.refreshStateImg(container.parentNode);
- if (this.options.dragAdrop) this.setSortable();
- },
-
- addChildBySelected: function(element, number) {
- if (!this.selected && !this.options.noSelectedInsert) return;
-
- if (this.selected)
- this.addChildById(element, this.selected, number);
- else
- this.addChildById(element, this.element, number);
- },
-
- addSelectItemCallback: function(functionObj) {
- if (!this.options.callBackFunctions) {
- this.options.callBackFunctions = new Array();
- }
- this.options.callBackFunctions.push(functionObj);
- },
-
- build: function(element) {
- if (element.nodeType != 1) return;
-
- Element.cleanWhitespace(element);
- this.changeClassNameDirAndFile(element);
-
- if (Element.hasClassName(element, TreeView.className.dir)) {
- var container = this.createDirectoryContainer(element);
- var body;
- if (this.hasContents(container))
- body = this.createDirectoryBody(element, false);
- else
- body = this.createDirectoryBody(element, true);
-
- element.appendChild(body);
- element.appendChild(container);
-
- var nodes = container.childNodes;
- for (var i = 0; i < nodes.length; i++) {
- this.build(nodes[i]);
- }
- } else if (Element.hasClassName(element, TreeView.className.file)) {
- var created = this.createFileBody(element);
- element.appendChild(created);
- }
- },
-
- changeClassName: function(element, to, from) {
- var nodes = document.getElementsByClassName(from, element);
-
- var newClassName = this.classNames.joinClassNames(to);
- nodes.each(function(n) {
- n.className = n.className.replace(new RegExp(from), newClassName);
- });
-
- if (Element.hasClassName(element, from)) {
- element.className = element.className.replace(new RegExp(from), newClassName);
- }
- },
-
- changeClassNameDirAndFile: function(element) {
- this.changeClassName(element, 'dir', this.options.dirSymbol);
- this.changeClassName(element, 'file', this.options.fileSymbol);
- },
-
- convertJSON: function() {
- return JSON.stringify(this.parse());
- },
-
- createDirectoryBody: function(element, isEmpty) {
- var customClass = null;
- var dirBodyClass = this.classNames.joinClassNames('dir');
- if (element.className != dirBodyClass) {
- customClass = element.className.replace(new RegExp(dirBodyClass + ' '), '');
- element.className = dirBodyClass;
- }
-
- var bodyNodes = new Array();
- var state;
- if (isEmpty && !this.options.emptyImg)
- state = 'state_empty';
- else if (this.options.open)
- state = 'state_open';
- else
- state = 'state_close';
-
- var id = this.options.iconIdPrefix.appendSuffix(element.id);
- var stateImg = Builder.node('DIV', {id: id.appendSuffix('stateImg')});
- this.classNames.addClassNames(stateImg, state);
- Event.observe(stateImg, "click", this.toggle.bindAsEventListener(this));
-
- var itemImg = Builder.node('DIV', {id: id});
- this.classNames.addClassNames(itemImg, 'dirIcon');
- if (customClass) {
- Element.addClassName(itemImg, customClass);
- }
- this.classNames.addClassNames(itemImg, 'handle');
-
- var bodyText = Builder.node('SPAN', this.getDirectoryText(element));
- this.classNames.addClassNames(bodyText, 'dirBodyText');
-
- bodyNodes.push(stateImg);
- bodyNodes.push(itemImg);
- bodyNodes.push(bodyText);
-
- var body = Builder.node('DIV', bodyNodes);
- this.classNames.addClassNames(body, 'dirBody');
- if (this.options.dirSelect) {
- Event.observe(itemImg, "click", this.selectDirItem.bindAsEventListener(this));
- Event.observe(bodyText, "click", this.selectDirItem.bindAsEventListener(this));
- }
-
- return body;
- },
-
- createDirectoryContainer: function(element) {
- var container = element.getElementsByTagName('ul')[0];
- if (!container) {
- container = Builder.node('UL');
- }
- this.classNames.addClassNames(container, 'dirContainer');
- if (!this.options.open) Element.hide(container);
- return container;
- },
-
- createFileBody: function(element) {
- var customClass = null;
- var fileBodyClass = this.classNames.joinClassNames('file');
- if (element.className != fileBodyClass) {
- customClass = element.className.replace(new RegExp(fileBodyClass + ' '), '');
- element.className = fileBodyClass;
- }
-
- var id = this.options.iconIdPrefix.appendSuffix(element.id);
- var itemImg = Builder.node('DIV', {id: id});
- this.classNames.addClassNames(itemImg, 'fileIcon');
- if (customClass) {
- Element.addClassName(itemImg, customClass);
- }
- this.classNames.addClassNames(itemImg, 'handle');
-
- var bodyText = Builder.node('SPAN', $A(element.childNodes));
- this.classNames.addClassNames(bodyText, 'fileBodyText');
-
- var children = new Array();
- children.push(itemImg);
- children.push(bodyText);
-
- var body = Builder.node('DIV', children);
- this.classNames.addClassNames(body, 'fileBody');
- if (this.options.fileSelect) {
- Event.observe(itemImg, "click", this.selectFileItem.bindAsEventListener(this));
- Event.observe(bodyText, "click", this.selectFileItem.bindAsEventListener(this));
- }
-
- return body;
- },
-
- getChildBody: function(element) {
- var names = [TreeView.className.fileBody, TreeView.className.dirBody];
- return Element.getFirstElementByClassNames(element, names);
- },
-
- getChildBodyText: function(element) {
- var names = [
- TreeView.className.fileBodyText,
- TreeView.className.fileBodyTextActive,
- TreeView.className.dirBodyText,
- TreeView.className.dirBodyTextActive
- ];
- return Element.getFirstElementByClassNames(element, names);
- },
-
- getChildBodyTextNode: function(element) {
- var body = this.getChildBody(element);
- var bodyText = this.getChildBodyText(body);
- return this.searchTextNode(bodyText);
- },
-
- getChildDir: function(element) {
- return document.getElementsByClassName(TreeView.className.dir, element);
- },
-
- getChildDirBody: function(element) {
- return document.getElementsByClassName(TreeView.className.dirBody, element)[0];
- },
-
- getChildDirContainer: function(element) {
- return document.getElementsByClassName(TreeView.className.dirContainer, element)[0];
- },
-
- getChildStateImg: function(element) {
- var body = this.getChildDirBody(element);
- var names = [
- TreeView.className.state_close,
- TreeView.className.state_open,
- TreeView.className.state_empty
- ];
-
- return Element.getFirstElementByClassNames(body, names);
- },
-
- getChildren: function(element, ignoreDir, ignoreFile) {
- var parent;
- var children = new Array();
- if(element) {
- parent = $(element).getElementsByTagName('ul')[0];
- } else {
- parent = this.element;
- }
- $A(Element.getTagNodes(parent)).each(
- function(node) {
- if(!ignoreDir && Element.hasClassName(node, TreeView.className.dir)) {
- children.push(node);
- }
- if(!ignoreFile && Element.hasClassName(node, TreeView.className.file)) {
- children.push(node);
- }
- }
- );
- return children;
- },
-
- getDirectoryContents: function(element) {
- return $A(element.childNodes).findAll(function(child) {
- if ((child.nodeType != 1)) {
- return false;
- }
- if (child.tagName.toLowerCase() == 'li') {
- return true;
- }
- return false;
- });
- },
-
- getDirectoryText: function(element) {
- return $A(element.childNodes).findAll(function(child) {
- if ((child.nodeType != 1)) {
- return true;
- } else if (child.tagName.toLowerCase() != 'ul') {
- return true;
- }
- return false;
- });
- },
-
- getHierarchyNumber: function() {
- if (!this.selected) return;
- var element = this.selected;
- var i = 0;
- while (true) {
- if (this.element == element) {
- return i;
- } else {
- element = this.getParentDir(element, true);
- if (!element) return;
- i++;
- }
- }
- },
-
- getParentDir: function(element, top) {
- var result = Element.getParentByClassName(TreeView.className.dir, element);
- if (!result && top)
- result = Element.getParentByClassName(TreeView.className.top, element);
- return result;
- },
-
- hasContents: function(element) {
- if (element) {
- if (!Element.hasClassName(element, TreeView.className.dirContainer) &&
- !Element.hasClassName(element, TreeView.className.top)) {
- return false;
- }
-
- var nodes = element.childNodes;
- for (var i = 0; i < nodes.length; i++) {
- if (nodes[i].nodeType == 1) {
- if (Element.hasClassName(nodes[i], TreeView.className.dir) ||
- Element.hasClassName(nodes[i], TreeView.className.file)) {
- return true;
- }
- }
- }
- }
- return false;
- },
-
- parse: function(container) {
- if (!container) container = this.element;
-
- var itemList = [];
- var contents = this.getDirectoryContents(container);
-
- for (var i = 0; i < contents.length; i++) {
- var node = contents[i];
- var body = this.getChildBody(node);
- var text = this.getChildBodyText(body);
-
- var item = {};
- item.id = node.id;
-
- item.name = Element.collectTextNodes(text).replace(/\n/, '');
- if (Element.hasClassName(node, TreeView.className.dir)) {
- item.type = this.options.dirSymbol;
- item.contents = this.parse(this.getChildDirContainer(node));
-
- } else {
- item.type = this.options.fileSymbol;
- }
-
- itemList.push(item);
- }
-
- return itemList;
- },
-
- refreshStateImg: function(element) {
- if (!Element.hasClassName(element, TreeView.className.dir)) return;
-
- var container = this.getChildDirContainer(element);
- var img = this.getChildStateImg(element);
-
- if (!this.hasContents(container) && !this.options.emptyImg)
- this.classNames.refreshClassNames(img, 'state_empty');
- else if (Element.visible(container))
- this.classNames.refreshClassNames(img, 'state_open');
- else
- this.classNames.refreshClassNames(img, 'state_close');
- },
-
- removeById: function(element) {
- element = $(element);
- if (element) {
- var parent = element.parentNode.parentNode;
- Element.remove(element);
- this.refreshStateImg(parent);
- }
- },
-
- removeByPath: function(path) {
- var paths = path.split('/').findAll(function(elm) {
- return (elm != '');
- });
-
- var last = paths.pop();
- var container = this.search(paths.join('/'));
-
- var target = this.getDirectoryContents(container)[last];
- if (target)
- this.removeById(target);
- },
-
- removeBySelected: function() {
- if (!this.selected) return;
- this.removeById(this.selected);
- this.selected = false;
- },
-
- renameById: function(name, element) {
- element = $(element);
- if (!Element.hasClassName(element, TreeView.className.dir) &&
- !Element.hasClassName(element, TreeView.className.file)) {
- return;
- }
- var node = this.getChildBodyTextNode(element);
- node.nodeValue = name;
- },
-
- renameByPath: function(name, path) {
- var paths = path.split('/').findAll(function(elm) {
- return (elm != '');
- });
-
- var last = paths.pop();
- var container = this.search(paths.join('/'));
-
- var target = this.getDirectoryContents(container)[last];
- if (target)
- this.renameById(name, target);
- },
-
- renameBySelected: function(name) {
- if (!this.selected) return;
- this.renameById(name, this.selected);
- },
-
- search: function(path) {
- var paths = path.split('/').findAll(function(elm) {
- return (elm != '');
- });
-
- var container = this.element;
- for (var i = 0; i < paths.length; i++) {
- var num = paths[i];
- var contents = this.getDirectoryContents(container);
- if (contents[num] && Element.hasClassName(contents[num], TreeView.className.dir)) {
- container = this.getChildDirContainer(contents[num]);
- } else {
- return false;
- }
- }
- return container;
- },
-
- searchTextNode: function(element) {
- var text = null;
- var nodes = element.childNodes;
-
- for (var i = 0; i < nodes.length; i++) {
- if (nodes[i].nodeType == 3) {
- text = nodes[i];
- break;
- } else if (nodes[i].nodeType == 1) {
- var tmp = this.searchTextNode(nodes[i]);
- if (tmp) {
- text = tmp;
- break;
- }
- }
- }
- return text;
- },
-
- selectDirItem: function(event) {
- var itemBody = Element.getParentByClassName(TreeView.className.dirBody, Event.element(event));
- this.selectItem(itemBody);
- },
-
- selectEffect: function(element) {
- element = $(element);
- if(element) {
- var itemBody = element.firstChild;
- if (this.selectItemUnselect(itemBody, false)) {
- return;
- }
- this.selectItemSelect(itemBody, false);
- }
- },
-
- selectFileItem: function(event) {
- var itemBody = Element.getParentByClassName(TreeView.className.fileBody, Event.element(event));
- this.selectItem(itemBody);
- },
-
- selectItem: function(itemBody) {
- if (this.selectItemUnselect(itemBody, true)) {
- return;
- }
- this.selectItemSelect(itemBody, true);
- },
-
- selectItemSelect: function(itemBody, callback) {
- this.selected = itemBody.parentNode;
- var text = this.getChildBodyText(itemBody);
- if (Element.hasClassName(text, TreeView.className.dirBodyText)) {
- this.classNames.refreshClassNames(text, 'dirBodyTextActive');
- this.defaultCss = 'dirBodyText';
- } else if (Element.hasClassName(text, TreeView.className.fileBodyText)) {
- this.classNames.refreshClassNames(text, 'fileBodyTextActive');
- this.defaultCss = 'fileBodyText';
- }
- if (callback) {
- if (this.options.callBackFunctions) {
- for (var i = 0; i < this.options.callBackFunctions.length; i++) {
- this.options.callBackFunctions[i](itemBody.parentNode);
- }
- }
- }
- },
-
- selectItemUnselect: function(itemBody, callback) {
- if (this.selected) {
- var selectedBody = this.getChildBody(this.selected);
- var selectedText = this.getChildBodyText(selectedBody);
- this.classNames.refreshClassNames(selectedText, this.defaultCss);
- if (this.selected == itemBody.parentNode && this.options.enableUnselected) {
- this.selected = false;
- this.defaultCss = false;
- if (callback) {
- this.options.unselected();
- }
- return true;
- }
- }
- return false;
- },
-
- setSortable: function() {
- var options = Object.extend({
- dropOnEmpty: true,
- tree: true,
- hoverclass: 'treeview_dirContainerHover',
- scroll: window,
- ghosting: true
- }, this.options.sortOptions);
- Sortable.create(this.element, options);
- },
-
- toggle: function(event) {
- Event.stop(event);
- var src = Event.element(event);
- var parent = this.getParentDir(src);
- var container = this.getChildDirContainer(parent);
-
- if (!this.hasContents(container) && !this.options.emptyImg) return;
-
- Element.toggle(container);
- this.refreshStateImg(parent);
-
- if (!this.hasContents(container) && !this.options.emptyImg)
- this.options.openDir(parent, container);
- else if (Element.visible(container))
- this.options.openDir(parent, container);
- else
- this.options.closeDir(parent, container);
- }
-}
+// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+var TreeView = Class.create();\r
+TreeView.className = {\r
+ top: 'treeview',\r
+ dir: 'treeview_dir',\r
+ dirBody: 'treeview_dirBody',\r
+ dirBodyText: 'treeview_dirBodyText',\r
+ dirBodyTextActive: 'treeview_dirBodyTextActive',\r
+ dirContainer: 'treeview_dirContainer',\r
+ dirContainerHover: 'treeview_dirContainerHover',\r
+ file: 'treeview_file',\r
+ fileBody: 'treeview_fileBody',\r
+ fileBodyText: 'treeview_fileBodyText',\r
+ fileBodyTextActive: 'treeview_fileBodyTextActive',\r
+ state_open: 'treeview_stateOpen',\r
+ state_close: 'treeview_stateClose',\r
+ state_empty: 'treeview_stateEmpty',\r
+ dirIcon: 'treeview_dirIcon',\r
+ fileIcon: 'treeview_fileIcon',\r
+ handle: 'treeview_handle'\r
+}\r
+\r
+TreeView.iconId = 'treeview_icon';\r
+\r
+TreeView.prototype = {\r
+ initialize: function(element) {\r
+ this.element = $(element);\r
+ Element.setStyle(this.element, {visibility: 'hidden'});\r
+ Element.hide(this.element);\r
+\r
+ this.options = Object.extend({\r
+ dirSymbol: 'dir',\r
+ fileSymbol: 'file',\r
+ cssPrefix: 'custom_',\r
+ open: true,\r
+ callBackFunctions: false,\r
+ dirSelect: true,\r
+ fileSelect: true,\r
+ noSelectedInsert: true,\r
+ iconIdPrefix: TreeView.iconId,\r
+ move: false,\r
+ unselected: Prototype.emptyFunction,\r
+ enableUnselected: true,\r
+ sortOptions: {},\r
+ openDir: Prototype.emptyFunction,\r
+ closeDir: Prototype.emptyFunction,\r
+ emptyImg: false,\r
+ initialSelected: null\r
+ }, arguments[1] || {});\r
+\r
+ this.customCss = CssUtil.appendPrefix(this.options.cssPrefix, TreeView.className);\r
+ this.classNames = new CssUtil([TreeView.className, this.customCss]);\r
+\r
+ this.changeClassNameDirAndFile(this.element);\r
+ var nodes = this.element.childNodes;\r
+ for (var i = 0; i < nodes.length; i++) {\r
+ this.build(nodes[i]);\r
+ }\r
+\r
+ this.classNames.addClassNames(this.element, 'top');\r
+ Element.setStyle(this.element, {visibility: 'visible'});\r
+ Element.show(this.element);\r
+\r
+ if (this.options.initialSelected) {\r
+ this.selectEffect(this.options.initialSelected);\r
+ }\r
+\r
+ if (this.options.move) {\r
+ this.setSortable();\r
+ }\r
+ },\r
+\r
+ addChildById: function(element, parent, number) {\r
+ element = $(element);\r
+ parent = $(parent);\r
+\r
+ var container = null;\r
+ if (!element || !parent)\r
+ return;\r
+ else if (Element.hasClassName(parent, TreeView.className.dir))\r
+ container = this.getChildDirContainer(parent);\r
+ else if (Element.hasClassName(parent, TreeView.className.top))\r
+ container = parent;\r
+ else\r
+ return;\r
+\r
+ this.build(element);\r
+\r
+ if (isNaN(number)) {\r
+ container.appendChild(element);\r
+ } else {\r
+ var children = this.getDirectoryContents(container);\r
+ if (children[number]) container.insertBefore(element, children[number]);\r
+ else container.appendChild(element);\r
+ }\r
+\r
+ this.refreshStateImg(parent);\r
+ if (this.options.dragAdrop) this.setSortable();\r
+ },\r
+\r
+ addChildByPath: function(element, path) {\r
+ element = $(element);\r
+ if (element) this.build(element);\r
+ else return;\r
+\r
+ var paths = path.split('/').findAll(function(elm) {\r
+ return (elm != '');\r
+ });\r
+\r
+ var last = paths.pop();\r
+ var container = this.search(paths.join('/'));\r
+\r
+ var children = this.getDirectoryContents(container);\r
+\r
+ if(children[last])\r
+ container.insertBefore(element, children[last]);\r
+ else\r
+ container.appendChild(element);\r
+\r
+ this.refreshStateImg(container.parentNode);\r
+ if (this.options.dragAdrop) this.setSortable();\r
+ },\r
+\r
+ addChildBySelected: function(element, number) {\r
+ if (!this.selected && !this.options.noSelectedInsert) return;\r
+\r
+ if (this.selected)\r
+ this.addChildById(element, this.selected, number);\r
+ else\r
+ this.addChildById(element, this.element, number);\r
+ },\r
+\r
+ addSelectItemCallback: function(functionObj) {\r
+ if (!this.options.callBackFunctions) {\r
+ this.options.callBackFunctions = new Array();\r
+ }\r
+ this.options.callBackFunctions.push(functionObj);\r
+ },\r
+\r
+ build: function(element) {\r
+ if (element.nodeType != 1) return;\r
+\r
+ Element.cleanWhitespace(element);\r
+ this.changeClassNameDirAndFile(element);\r
+\r
+ if (Element.hasClassName(element, TreeView.className.dir)) {\r
+ var container = this.createDirectoryContainer(element);\r
+ var body;\r
+ if (this.hasContents(container))\r
+ body = this.createDirectoryBody(element, false);\r
+ else\r
+ body = this.createDirectoryBody(element, true);\r
+\r
+ element.appendChild(body);\r
+ element.appendChild(container);\r
+\r
+ var nodes = container.childNodes;\r
+ for (var i = 0; i < nodes.length; i++) {\r
+ this.build(nodes[i]);\r
+ }\r
+ } else if (Element.hasClassName(element, TreeView.className.file)) {\r
+ var created = this.createFileBody(element);\r
+ element.appendChild(created);\r
+ }\r
+ },\r
+\r
+ changeClassName: function(element, to, from) {\r
+ var nodes = document.getElementsByClassName(from, element);\r
+\r
+ var newClassName = this.classNames.joinClassNames(to);\r
+ nodes.each(function(n) {\r
+ n.className = n.className.replace(new RegExp(from), newClassName);\r
+ });\r
+\r
+ if (Element.hasClassName(element, from)) {\r
+ element.className = element.className.replace(new RegExp(from), newClassName);\r
+ }\r
+ },\r
+\r
+ changeClassNameDirAndFile: function(element) {\r
+ this.changeClassName(element, 'dir', this.options.dirSymbol);\r
+ this.changeClassName(element, 'file', this.options.fileSymbol);\r
+ },\r
+\r
+ convertJSON: function() {\r
+ return JSON.stringify(this.parse());\r
+ },\r
+\r
+ createDirectoryBody: function(element, isEmpty) {\r
+ var customClass = null;\r
+ var dirBodyClass = this.classNames.joinClassNames('dir');\r
+ if (element.className != dirBodyClass) {\r
+ customClass = element.className.replace(new RegExp(dirBodyClass + ' '), '');\r
+ element.className = dirBodyClass;\r
+ }\r
+\r
+ var bodyNodes = new Array();\r
+ var state;\r
+ if (isEmpty && !this.options.emptyImg)\r
+ state = 'state_empty';\r
+ else if (this.options.open)\r
+ state = 'state_open';\r
+ else\r
+ state = 'state_close';\r
+\r
+ var id = this.options.iconIdPrefix.appendSuffix(element.id);\r
+ var stateImg = Builder.node('DIV', {id: id.appendSuffix('stateImg')});\r
+ this.classNames.addClassNames(stateImg, state);\r
+ Event.observe(stateImg, "click", this.toggle.bindAsEventListener(this));\r
+\r
+ var itemImg = Builder.node('DIV', {id: id});\r
+ this.classNames.addClassNames(itemImg, 'dirIcon');\r
+ if (customClass) {\r
+ Element.addClassName(itemImg, customClass);\r
+ }\r
+ this.classNames.addClassNames(itemImg, 'handle');\r
+\r
+ var bodyText = Builder.node('SPAN', this.getDirectoryText(element));\r
+ this.classNames.addClassNames(bodyText, 'dirBodyText');\r
+\r
+ bodyNodes.push(stateImg);\r
+ bodyNodes.push(itemImg);\r
+ bodyNodes.push(bodyText);\r
+\r
+ var body = Builder.node('DIV', bodyNodes);\r
+ this.classNames.addClassNames(body, 'dirBody');\r
+ if (this.options.dirSelect) {\r
+ Event.observe(itemImg, "click", this.selectDirItem.bindAsEventListener(this));\r
+ Event.observe(bodyText, "click", this.selectDirItem.bindAsEventListener(this));\r
+ }\r
+\r
+ return body;\r
+ },\r
+\r
+ createDirectoryContainer: function(element) {\r
+ var container = element.getElementsByTagName('ul')[0];\r
+ if (!container) {\r
+ container = Builder.node('UL');\r
+ }\r
+ this.classNames.addClassNames(container, 'dirContainer');\r
+ if (!this.options.open) Element.hide(container);\r
+ return container;\r
+ },\r
+\r
+ createFileBody: function(element) {\r
+ var customClass = null;\r
+ var fileBodyClass = this.classNames.joinClassNames('file');\r
+ if (element.className != fileBodyClass) {\r
+ customClass = element.className.replace(new RegExp(fileBodyClass + ' '), '');\r
+ element.className = fileBodyClass;\r
+ }\r
+\r
+ var id = this.options.iconIdPrefix.appendSuffix(element.id);\r
+ var itemImg = Builder.node('DIV', {id: id});\r
+ this.classNames.addClassNames(itemImg, 'fileIcon');\r
+ if (customClass) {\r
+ Element.addClassName(itemImg, customClass);\r
+ }\r
+ this.classNames.addClassNames(itemImg, 'handle');\r
+\r
+ var bodyText = Builder.node('SPAN', $A(element.childNodes));\r
+ this.classNames.addClassNames(bodyText, 'fileBodyText');\r
+\r
+ var children = new Array();\r
+ children.push(itemImg);\r
+ children.push(bodyText);\r
+\r
+ var body = Builder.node('DIV', children);\r
+ this.classNames.addClassNames(body, 'fileBody');\r
+ if (this.options.fileSelect) {\r
+ Event.observe(itemImg, "click", this.selectFileItem.bindAsEventListener(this));\r
+ Event.observe(bodyText, "click", this.selectFileItem.bindAsEventListener(this));\r
+ }\r
+\r
+ return body;\r
+ },\r
+\r
+ getChildBody: function(element) {\r
+ var names = [TreeView.className.fileBody, TreeView.className.dirBody];\r
+ return Element.getFirstElementByClassNames(element, names);\r
+ },\r
+\r
+ getChildBodyText: function(element) {\r
+ var names = [\r
+ TreeView.className.fileBodyText,\r
+ TreeView.className.fileBodyTextActive,\r
+ TreeView.className.dirBodyText,\r
+ TreeView.className.dirBodyTextActive\r
+ ];\r
+ return Element.getFirstElementByClassNames(element, names);\r
+ },\r
+\r
+ getChildBodyTextNode: function(element) {\r
+ var body = this.getChildBody(element);\r
+ var bodyText = this.getChildBodyText(body);\r
+ return this.searchTextNode(bodyText);\r
+ },\r
+\r
+ getChildDir: function(element) {\r
+ return document.getElementsByClassName(TreeView.className.dir, element);\r
+ },\r
+\r
+ getChildDirBody: function(element) {\r
+ return document.getElementsByClassName(TreeView.className.dirBody, element)[0];\r
+ },\r
+\r
+ getChildDirContainer: function(element) {\r
+ return document.getElementsByClassName(TreeView.className.dirContainer, element)[0];\r
+ },\r
+\r
+ getChildStateImg: function(element) {\r
+ var body = this.getChildDirBody(element);\r
+ var names = [\r
+ TreeView.className.state_close,\r
+ TreeView.className.state_open,\r
+ TreeView.className.state_empty\r
+ ];\r
+\r
+ return Element.getFirstElementByClassNames(body, names);\r
+ },\r
+\r
+ getChildren: function(element, ignoreDir, ignoreFile) {\r
+ var parent;\r
+ var children = new Array();\r
+ if(element) {\r
+ parent = $(element).getElementsByTagName('ul')[0];\r
+ } else {\r
+ parent = this.element;\r
+ }\r
+ $A(Element.getTagNodes(parent)).each(\r
+ function(node) {\r
+ if(!ignoreDir && Element.hasClassName(node, TreeView.className.dir)) {\r
+ children.push(node);\r
+ }\r
+ if(!ignoreFile && Element.hasClassName(node, TreeView.className.file)) {\r
+ children.push(node);\r
+ }\r
+ }\r
+ );\r
+ return children;\r
+ },\r
+\r
+ getDirectoryContents: function(element) {\r
+ return $A(element.childNodes).findAll(function(child) {\r
+ if ((child.nodeType != 1)) {\r
+ return false;\r
+ }\r
+ if (child.tagName.toLowerCase() == 'li') {\r
+ return true;\r
+ }\r
+ return false;\r
+ });\r
+ },\r
+\r
+ getDirectoryText: function(element) {\r
+ return $A(element.childNodes).findAll(function(child) {\r
+ if ((child.nodeType != 1)) {\r
+ return true;\r
+ } else if (child.tagName.toLowerCase() != 'ul') {\r
+ return true;\r
+ }\r
+ return false;\r
+ });\r
+ },\r
+\r
+ getHierarchyNumber: function() {\r
+ if (!this.selected) return;\r
+ var element = this.selected;\r
+ var i = 0;\r
+ while (true) {\r
+ if (this.element == element) {\r
+ return i;\r
+ } else {\r
+ element = this.getParentDir(element, true);\r
+ if (!element) return;\r
+ i++;\r
+ }\r
+ }\r
+ },\r
+\r
+ getParentDir: function(element, top) {\r
+ var result = Element.getParentByClassName(TreeView.className.dir, element);\r
+ if (!result && top)\r
+ result = Element.getParentByClassName(TreeView.className.top, element);\r
+ return result;\r
+ },\r
+\r
+ hasContents: function(element) {\r
+ if (element) {\r
+ if (!Element.hasClassName(element, TreeView.className.dirContainer) &&\r
+ !Element.hasClassName(element, TreeView.className.top)) {\r
+ return false;\r
+ }\r
+\r
+ var nodes = element.childNodes;\r
+ for (var i = 0; i < nodes.length; i++) {\r
+ if (nodes[i].nodeType == 1) {\r
+ if (Element.hasClassName(nodes[i], TreeView.className.dir) ||\r
+ Element.hasClassName(nodes[i], TreeView.className.file)) {\r
+ return true;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ return false;\r
+ },\r
+\r
+ parse: function(container) {\r
+ if (!container) container = this.element;\r
+\r
+ var itemList = [];\r
+ var contents = this.getDirectoryContents(container);\r
+\r
+ for (var i = 0; i < contents.length; i++) {\r
+ var node = contents[i];\r
+ var body = this.getChildBody(node);\r
+ var text = this.getChildBodyText(body);\r
+\r
+ var item = {};\r
+ item.id = node.id;\r
+\r
+ item.name = Element.collectTextNodes(text).replace(/\n/, '');\r
+ if (Element.hasClassName(node, TreeView.className.dir)) {\r
+ item.type = this.options.dirSymbol;\r
+ item.contents = this.parse(this.getChildDirContainer(node));\r
+\r
+ } else {\r
+ item.type = this.options.fileSymbol;\r
+ }\r
+\r
+ itemList.push(item);\r
+ }\r
+\r
+ return itemList;\r
+ },\r
+\r
+ refreshStateImg: function(element) {\r
+ if (!Element.hasClassName(element, TreeView.className.dir)) return;\r
+\r
+ var container = this.getChildDirContainer(element);\r
+ var img = this.getChildStateImg(element);\r
+\r
+ if (!this.hasContents(container) && !this.options.emptyImg)\r
+ this.classNames.refreshClassNames(img, 'state_empty');\r
+ else if (Element.visible(container))\r
+ this.classNames.refreshClassNames(img, 'state_open');\r
+ else\r
+ this.classNames.refreshClassNames(img, 'state_close');\r
+ },\r
+\r
+ removeById: function(element) {\r
+ element = $(element);\r
+ if (element) {\r
+ var parent = element.parentNode.parentNode;\r
+ Element.remove(element);\r
+ this.refreshStateImg(parent);\r
+ }\r
+ },\r
+\r
+ removeByPath: function(path) {\r
+ var paths = path.split('/').findAll(function(elm) {\r
+ return (elm != '');\r
+ });\r
+\r
+ var last = paths.pop();\r
+ var container = this.search(paths.join('/'));\r
+\r
+ var target = this.getDirectoryContents(container)[last];\r
+ if (target)\r
+ this.removeById(target);\r
+ },\r
+\r
+ removeBySelected: function() {\r
+ if (!this.selected) return;\r
+ this.removeById(this.selected);\r
+ this.selected = false;\r
+ },\r
+\r
+ renameById: function(name, element) {\r
+ element = $(element);\r
+ if (!Element.hasClassName(element, TreeView.className.dir) &&\r
+ !Element.hasClassName(element, TreeView.className.file)) {\r
+ return;\r
+ }\r
+ var node = this.getChildBodyTextNode(element);\r
+ node.nodeValue = name;\r
+ },\r
+\r
+ renameByPath: function(name, path) {\r
+ var paths = path.split('/').findAll(function(elm) {\r
+ return (elm != '');\r
+ });\r
+\r
+ var last = paths.pop();\r
+ var container = this.search(paths.join('/'));\r
+\r
+ var target = this.getDirectoryContents(container)[last];\r
+ if (target)\r
+ this.renameById(name, target);\r
+ },\r
+\r
+ renameBySelected: function(name) {\r
+ if (!this.selected) return;\r
+ this.renameById(name, this.selected);\r
+ },\r
+\r
+ search: function(path) {\r
+ var paths = path.split('/').findAll(function(elm) {\r
+ return (elm != '');\r
+ });\r
+\r
+ var container = this.element;\r
+ for (var i = 0; i < paths.length; i++) {\r
+ var num = paths[i];\r
+ var contents = this.getDirectoryContents(container);\r
+ if (contents[num] && Element.hasClassName(contents[num], TreeView.className.dir)) {\r
+ container = this.getChildDirContainer(contents[num]);\r
+ } else {\r
+ return false;\r
+ }\r
+ }\r
+ return container;\r
+ },\r
+\r
+ searchTextNode: function(element) {\r
+ var text = null;\r
+ var nodes = element.childNodes;\r
+\r
+ for (var i = 0; i < nodes.length; i++) {\r
+ if (nodes[i].nodeType == 3) {\r
+ text = nodes[i];\r
+ break;\r
+ } else if (nodes[i].nodeType == 1) {\r
+ var tmp = this.searchTextNode(nodes[i]);\r
+ if (tmp) {\r
+ text = tmp;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ return text;\r
+ },\r
+\r
+ selectDirItem: function(event) {\r
+ var itemBody = Element.getParentByClassName(TreeView.className.dirBody, Event.element(event));\r
+ this.selectItem(itemBody);\r
+ },\r
+\r
+ selectEffect: function(element) {\r
+ element = $(element);\r
+ if(element) {\r
+ var itemBody = element.firstChild;\r
+ if (this.selectItemUnselect(itemBody, false)) {\r
+ return;\r
+ }\r
+ this.selectItemSelect(itemBody, false);\r
+ }\r
+ },\r
+\r
+ selectFileItem: function(event) {\r
+ var itemBody = Element.getParentByClassName(TreeView.className.fileBody, Event.element(event));\r
+ this.selectItem(itemBody);\r
+ },\r
+\r
+ selectItem: function(itemBody) {\r
+ if (this.selectItemUnselect(itemBody, true)) {\r
+ return;\r
+ }\r
+ this.selectItemSelect(itemBody, true);\r
+ },\r
+\r
+ selectItemSelect: function(itemBody, callback) {\r
+ this.selected = itemBody.parentNode;\r
+ var text = this.getChildBodyText(itemBody);\r
+ if (Element.hasClassName(text, TreeView.className.dirBodyText)) {\r
+ this.classNames.refreshClassNames(text, 'dirBodyTextActive');\r
+ this.defaultCss = 'dirBodyText';\r
+ } else if (Element.hasClassName(text, TreeView.className.fileBodyText)) {\r
+ this.classNames.refreshClassNames(text, 'fileBodyTextActive');\r
+ this.defaultCss = 'fileBodyText';\r
+ }\r
+ if (callback) {\r
+ if (this.options.callBackFunctions) {\r
+ for (var i = 0; i < this.options.callBackFunctions.length; i++) {\r
+ this.options.callBackFunctions[i](itemBody.parentNode);\r
+ }\r
+ }\r
+ }\r
+ },\r
+\r
+ selectItemUnselect: function(itemBody, callback) {\r
+ if (this.selected) {\r
+ var selectedBody = this.getChildBody(this.selected);\r
+ var selectedText = this.getChildBodyText(selectedBody);\r
+ this.classNames.refreshClassNames(selectedText, this.defaultCss);\r
+ if (this.selected == itemBody.parentNode && this.options.enableUnselected) {\r
+ this.selected = false;\r
+ this.defaultCss = false;\r
+ if (callback) {\r
+ this.options.unselected();\r
+ }\r
+ return true;\r
+ }\r
+ }\r
+ return false;\r
+ },\r
+\r
+ setSortable: function() {\r
+ var options = Object.extend({\r
+ dropOnEmpty: true,\r
+ tree: true,\r
+ hoverclass: 'treeview_dirContainerHover',\r
+ scroll: window,\r
+ ghosting: true\r
+ }, this.options.sortOptions);\r
+ Sortable.create(this.element, options);\r
+ },\r
+\r
+ toggle: function(event) {\r
+ Event.stop(event);\r
+ var src = Event.element(event);\r
+ var parent = this.getParentDir(src);\r
+ var container = this.getChildDirContainer(parent);\r
+\r
+ if (!this.hasContents(container) && !this.options.emptyImg) return;\r
+\r
+ Element.toggle(container);\r
+ this.refreshStateImg(parent);\r
+\r
+ if (!this.hasContents(container) && !this.options.emptyImg)\r
+ this.options.openDir(parent, container);\r
+ else if (Element.visible(container))\r
+ this.options.openDir(parent, container);\r
+ else\r
+ this.options.closeDir(parent, container);\r
+ }\r
+}\r
-// Copyright (c) 2006 spinelz.org (http://script.spinelz.org/)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-var Window = Class.create();
-Window.className = {
- window: 'window',
- header: 'window_header',
- headerLeft: 'window_headerLeft',
- headerMiddle: 'window_headerMiddle',
- headerRight: 'window_headerRight',
- buttonHolder: 'window_buttonHolder',
- closeButton: 'window_closeButton',
- maxButton: 'window_maxButton',
- minButton: 'window_minButton',
- body: 'window_body',
- bodyLeft: 'window_bodyLeft',
- bodyMiddle: 'window_bodyMiddle',
- bodyRight: 'window_bodyRight',
- bottom: 'window_bottom',
- bottomLeft: 'window_bottomLeft',
- bottomMiddle: 'window_bottomMiddle',
- bottomRight: 'window_bottomRight'
-}
-
-Window.prototype = {
-
- initialize: function(element) {
- var options = Object.extend({
- className: Window.className.window,
- width: 300,
- height: 300,
- minWidth: 200,
- minHeight: 40,
- drag: true,
- resize: true,
- resizeX: true,
- resizeY: true,
- modal: false,
- closeButton: true,
- maxButton: true,
- minButton: true,
- cssPrefix: 'custom_',
- restriction: false,
- endDrag: Prototype.emptyFunction,
- endResize: Prototype.emptyFunction,
- addButton: Prototype.emptyFunction,
- preMaximize: function() {return true},
- preMinimize: function() {return true},
- preRevertMaximize: function() {return true},
- preRevertMinimize: function() {return true},
- preClose: function() {return true},
- endMaximize: Prototype.emptyFunction,
- endMinimize: Prototype.emptyFunction,
- endRevertMaximize: Prototype.emptyFunction,
- endRevertMinimize: Prototype.emptyFunction,
- endClose: Prototype.emptyFunction,
- dragOptions: {},
- appendToBody: false
- }, arguments[1] || {});
-
- var customCss = CssUtil.appendPrefix(options.cssPrefix, Window.className);
- this.classNames = new CssUtil([Window.className, customCss]);
-
- this.element = $(element);
- Element.setStyle(this.element, {visibility: 'hidden'});
-
- this.options = options;
- this.element.className = this.options.className;
- this.header = null;
- this.windowBody = null;
- this.bottom = null;
-
- this.elementId = this.element.id;
- this.dragHandleId = this.elementId + '_dragHandle';
-
- this.maxZindex = -1;
- this.minFlag = false;
- this.maxFlag = false;
- this.currentPos = [0,0];
- this.currentSize = [0,0];
-
- this.buildWindow();
- this.cover = new IECover(this.element, {padding: 10});
-
- Element.makePositioned(element);
- Element.hide(this.element);
- Element.setStyle(this.element, {visibility: 'visible'});
-
- if (this.options.appendToBody) this.appendToBody.callAfterLoading(this);
- },
-
- buildWindow: function() {
- Element.cleanWhitespace(this.element);
-
- with(this.element.style) {
- width = this.options.width + 'px';
- height= this.options.height + 'px';
- }
-
- var title = this.element.childNodes[0];
- var content = this.element.childNodes[1];
- this.buildHeader(title);
- this.buildBody(content);
- this.buildBottom();
- var newStyle = {height: this.options.height};
- this.setBodyHeight(newStyle);
-
- if (this.options.drag) this.createDraggble();
-
- if (this.options.resize) {
- this.enableResizing();
- }
- },
-
- buildHeader: function(title) {
- var headerLeft = Builder.node('div');
- this.classNames.addClassNames(headerLeft, 'headerLeft');
-
- var headerMiddle = Builder.node('div', {id: this.dragHandleId});
- this.classNames.addClassNames(headerMiddle, 'headerMiddle');
-
- var headerRight = Builder.node('div');
- this.classNames.addClassNames(headerRight, 'headerRight');
-
- var buttonHolder = Builder.node('div');
- this.classNames.addClassNames(buttonHolder, 'buttonHolder');
-
- headerMiddle.appendChild(title);
- var headerList = [headerLeft, headerMiddle, buttonHolder, headerRight];
- this.header = Builder.node('div', headerList);
- this.classNames.addClassNames(this.header, 'header');
- this.element.appendChild(this.header);
-
-
- if (this.options.closeButton) {
- var closeButton = Builder.node('div', {id: this.element.id.appendSuffix('closeButton')});
- this.classNames.addClassNames(closeButton, 'closeButton');
- buttonHolder.appendChild(closeButton);
- Event.observe(closeButton, 'click', this.close.bindAsEventListener(this));
- }
- if (this.options.maxButton) {
- var maxButton = Builder.node('div', {id: this.element.id.appendSuffix('maxButton')});
- this.classNames.addClassNames(maxButton, 'maxButton');
- buttonHolder.appendChild(maxButton);
- Event.observe(maxButton, 'click', this.maximize.bindAsEventListener(this));
- }
- if (this.options.minButton) {
- var minButton = Builder.node('div', {id: this.element.id.appendSuffix('minButton')});
- this.classNames.addClassNames(minButton, 'minButton');
- buttonHolder.appendChild(minButton);
- Event.observe(minButton, 'click', this.minimize.bindAsEventListener(this));
- }
-
- if (this.options.addButton) {
- var addButton = this.options.addButton;
- if (addButton.constructor == Function) {
- addButton(buttonHolder);
- } else if (addButton.constructor == Array) {
- var self = this;
- var firstChild = buttonHolder.firstChild;
- addButton.each(function(b) {
- var button = Builder.node('div', {id: b.id, className: b.className});
- Event.observe(button, 'click', b.onclick.bindAsEventListener(self));
- if (b.first && firstChild) {
- buttonHolder.insertBefore(button, firstChild);
- } else {
- buttonHolder.appendChild(button);
- }
- });
- }
- }
- },
-
- buildBody: function(contents) {
- var bodyLeft = Builder.node('div', {className: Window.className.bodyLeft});
- this.classNames.addClassNames(bodyLeft, 'bodyLeft');
-
- var bodyMiddle = Builder.node('div');
- this.classNames.addClassNames(bodyMiddle, 'bodyMiddle');
- bodyMiddle.appendChild(contents);
-
- var bodyRight = Builder.node('div');
- this.classNames.addClassNames(bodyRight, 'bodyRight');
-
- var bodyList = [bodyRight,bodyLeft, bodyMiddle];
- this.windowBody = Builder.node('div', bodyList);
- this.classNames.addClassNames(this.windowBody, 'body');
- this.element.appendChild(this.windowBody);
- },
-
- buildBottom: function() {
- var bottomLeft = Builder.node('div');
- this.classNames.addClassNames(bottomLeft, 'bottomLeft');
-
- var bottomMiddle = Builder.node('div');
- this.classNames.addClassNames(bottomMiddle, 'bottomMiddle');
-
- var bottomRight = Builder.node('div');
- this.classNames.addClassNames(bottomRight, 'bottomRight');
-
- var bottomList = [bottomLeft, bottomMiddle, bottomRight];
- this.bottom = Builder.node('div', bottomList);
- this.classNames.addClassNames(this.bottom, 'bottom');
- this.element.appendChild(this.bottom);
- },
-
- createDraggble: function() {
- var self = this;
- var options = Object.extend({
- handle: this.dragHandleId,
- starteffect: Prototype.emptyFunction,
- endeffect: Prototype.emptyFunction,
- endDrag: this.options.endDrag,
- scroll: window
- }, this.options.dragOptions);
-
- if (this.options.restriction) {
- options.snap = function(x, y) {
- function constrain(n, lower, upper) {
- if (n > upper) return upper;
- else if (n < lower) return lower;
- else return n;
- }
-
- var eDimensions = Element.getDimensions(self.element);
- var pDimensions = Element.getDimensions(self.element.parentNode);
-
- if (Element.getStyle(self.element.parentNode, 'position') == 'static') {
- var offset = Position.positionedOffset(self.element.parentNode);
- var parentLeft = offset[0];
- var parentTop = offset[1];
- return[
- constrain(x, parentLeft, parentLeft + pDimensions.width - eDimensions.width),
- constrain(y, parentTop, parentTop + pDimensions.height - eDimensions.height)
- ];
- } else {
- return[
- constrain(x, 0, pDimensions.width - eDimensions.width),
- constrain(y, 0, pDimensions.height - eDimensions.height)
- ];
- }
- }
- } else {
- var p = Position.cumulativeOffset(Position.offsetParent(this.element));
- options.snap = function(x, y) {
- return [
- ((x + p[0]) >= 0) ? x : 0 - p[0],
- ((y + p[1]) >= 0) ? y : 0 - p[1]
- ];
- }
- }
- new DraggableWindowEx(this.element, options);
- },
-
- setWindowZindex : function(zIndex) {
- zIndex = this.getZindex(zIndex);
- this.element.style.zIndex = zIndex;
- },
-
- getZindex: function(zIndex) {
- return ZindexManager.getIndex(zIndex);
- },
-
- open: function(zIndex) {
- this.opening = true;
- if (this.options.modal) {
- Modal.mask(this.element, {zIndex: zIndex});
- } else {
- this.setWindowZindex(zIndex);
- }
- Element.show(this.element);
- this.cover.resetSize();
- this.opening = false;
- if (this.shouldClose) {
- this.close();
- this.shouldClose = false;
- }
- },
-
- close: function() {
- if (this.opening) this.shouldClose = true;
- if (!this.options.preClose(this)) return;
- this.element.style.zIndex = -1;
- this.maxZindex = -1;
- try {
- Element.hide(this.element);
- } catch(e) {}
- if (this.options.modal) {
- Modal.unmask();
- }
- this.options.endClose(this);
- if (this.opening) this.shouldClose = true;
- },
-
- minimize: function(event) {
- if (this.minFlag) {
- if (!this.options.preRevertMinimize(this)) return;
- Element.toggle(this.windowBody);
- if (this.maxFlag) {
- this.minFlag = false;
- this.setMax();
- } else {
- var newStyle = {height:this.currentSize[1]}
- this.setBodyHeight(newStyle);
- this.element.style.width = this.currentSize[0];
- this.element.style.height = this.currentSize[1];
- this.element.style.left = this.currentPos[0];
- this.element.style.top = this.currentPos[1];
- this.maxFlag = false;
- this.minFlag = false;
- this.options.endRevertMinimize(this);
- }
- } else {
- if (!this.options.preMinimize(this)) return;
- Element.toggle(this.windowBody);
- if (!this.maxFlag) {
- this.currentPos = [Element.getStyle(this.element, 'left'), Element.getStyle(this.element, 'top')];
- this.currentSize = [Element.getStyle(this.element, 'width'), Element.getStyle(this.element, 'height')];
- }
- this.setMin();
- this.minFlag = true;
- this.options.endMinimize(this);
- }
- this.cover.resetSize();
- },
-
- maximize: function(event) {
- if (this.maxFlag) {
- if (this.minFlag) {
- Element.toggle(this.windowBody);
- this.minFlag = false;
- this.setMax();
- } else {
- if (!this.options.preRevertMaximize(this)) return;
- var newStyle = {height:parseInt(this.currentSize[1])}
- this.setBodyHeight(newStyle);
- this.element.style.width = this.currentSize[0];
- this.element.style.height = this.currentSize[1];
- this.element.style.left = this.currentPos[0];
- this.element.style.top = this.currentPos[1];
- this.maxFlag = false;
- this.minFlag = false;
- document.body.style.overflow = '';
- this.element.style.position = this.position;
- if (this.parent) {
- if (this.nextElement) {
- this.parent.insertBefore(this.element, this.nextElement);
- } else {
- this.parent.appendChild(this.element);
- }
- }
- this.options.endRevertMaximize(this);
- }
-
- } else {
- if (!this.options.preMaximize(this)) return;
- if (!this.minFlag) {
- this.currentPos = [Element.getStyle(this.element, 'left'), Element.getStyle(this.element, 'top')];
- this.currentSize = [Element.getStyle(this.element, 'width'), Element.getStyle(this.element, 'height')];
- } else {
- Element.toggle(this.windowBody);
- this.minFlag = false;
- }
- this.parent = this.element.parentNode;
- this.nextElement = Element.next(this.element, 0);
- this.position = Element.getStyle(this.element, 'position');
- document.body.style.overflow = 'hidden';
- document.body.appendChild(this.element);
- this.element.style.position = 'absolute';
- this.setMax();
- this.maxFlag = true;
- this.options.endMaximize(this);
- }
- this.cover.resetSize();
- },
-
- setMin : function() {
- var minHeight = this.header.offsetHeight + this.bottom.offsetHeight;
- var minWidth = this.options.minWidth;
- this.element.style.height = minHeight + 'px';
- this.element.style.width = minWidth + 'px';
- },
-
- setMax : function(zIndex) {
- var maxW = Element.getWindowWidth();
- var maxH = Element.getWindowHeight();
- var newStatus = {height:maxH}
- with(this.element.style) {
- width = maxW + 'px';
- height = maxH + 'px';
- left = '0px';
- top = '0px';
- }
- this.setBodyHeight(newStatus);
- this.setWindowZindex(zIndex);
- },
-
- _getParentWidth: function(parent) {
- if (parent && parent.style) {
- var width = parent.style.width;
- var index = 0;
- if (width) {
- if ((index = width.indexOf('px', 0)) > 0) {
- return parseInt(width);
- } else if ((index = width.indexOf('%', 0)) > 0) {
- var pw = this._getParentWidth(parent.parentNode);
-
- var par = parseInt(width);
- return pw * par / 100;
- } else if (!width.isNaN) {
- return parseInt(width);
- }
- } else if (parent == document.body){
- return Element.getWindowWidth();
- }
- }
- },
-
- setHeight: function(height) {
- height = {height: height};
- Element.setStyle(this.element, height);
- this.setBodyHeight(height);
- },
-
- setBodyHeight: function(newStyle) {
- var height = parseInt(newStyle.height);
- if (height > this.options.minHeight) {
- var newHeight = (height - this.header.offsetHeight - this.bottom.offsetHeight) + 'px';
- this.windowBody.childNodes[0].style.height = newHeight;
- this.windowBody.childNodes[1].style.height = newHeight;
- this.windowBody.childNodes[2].style.height = newHeight;
- this.windowBody.style.height = newHeight;
- }
- if (this.cover) this.cover.resetSize();
- },
-
- center: function() {
- var w = parseInt(Element.getStyle(this.element, 'width'));
- var h = parseInt(Element.getStyle(this.element, 'height'));
-
- var pOffset = Position.cumulativeOffset(Position.offsetParent(this.element));
-
- var left = (Element.getWindowWidth() - w) / 2;
- var top = (Element.getWindowHeight() - h) / 2;
- var scrollTop = (document.documentElement.scrollTop || document.body.scrollTop);
- var scrollLeft = (document.documentElement.scrollLeft || document.body.scrollLeft);
-
- top += scrollTop - pOffset[1];
- left += scrollLeft - pOffset[0];
- top = ((top + pOffset[1]) >= 0) ? top : 0 - pOffset[1];
- left = ((left + pOffset[0]) >= 0) ? left : 0 - pOffset[0];
- Element.setStyle(this.element, {left: left + 'px', top: top + 'px'});
- },
-
- enableResizing: function() {
- var resTop = this.options.resizeY ? 6 : 0;
- var resBottom = this.options.resizeY ? 6 : 0;
- var resLeft = this.options.resizeX ? 6 : 0;
- var resRight = this.options.resizeX ? 6 : 0;
- this.resizeable = new ResizeableWindowEx(this.element, {
- top: resTop,
- bottom: resBottom,
- left: resLeft,
- right: resRight,
- minWidth: this.options.minWidth,
- minHeight: this.options.minHeight,
- draw: this.setBodyHeight.bind(this),
- resize: this.options.endResize,
- restriction: this.options.restriction,
- zindex: 2000
- });
- },
-
- disableResizing: function() {
- this.resizeable.destroy();
- },
-
- appendToBody: function() {
- this.removeFromBody(this.element.id)
- document.body.appendChild(this.element);
- },
-
- removeFromBody: function(dom_id) {
- $A(document.body.childNodes).each(function(node){
- if (node.id == dom_id) node.remove();
- });
- }
-}
-
-
-// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)
-//
-// This code is substantially based on code from script.aculo.us which has the
-// following copyright and permission notice
-//
-// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-var DraggableWindowEx = Class.create();
-Object.extend(DraggableWindowEx.prototype, Draggable.prototype);
-Object.extend(DraggableWindowEx.prototype, {
- initDrag: function(event) {
- if(Event.isLeftClick(event)) {
- // abort on form elements, fixes a Firefox issue
- var src = Event.element(event);
- if(src.tagName && (
- src.tagName=='INPUT' ||
- src.tagName=='SELECT' ||
- src.tagName=='OPTION' ||
- src.tagName=='BUTTON' ||
- src.tagName=='TEXTAREA')) return;
-
- if(this.element._revert) {
- this.element._revert.cancel();
- this.element._revert = null;
- }
-
- var pointer = [Event.pointerX(event), Event.pointerY(event)];
- var pos = Position.cumulativeOffset(this.element);
- this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) });
-
- var zIndex = ZindexManager.getIndex();
- this.originalZ = zIndex;
- this.options.zindex = zIndex;
- Element.setStyle(this.element, {zIndex: zIndex});
-
- Draggables.activate(this);
- Event.stop(event);
- }
- },
-
- endDrag: function(event) {
- if(!this.dragging) return;
- this.stopScrolling();
- this.finishDrag(event, true);
-
- this.options.endDrag();
- Event.stop(event);
- }
-});
-
+// Copyright (c) 2006 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+var Window = Class.create();\r
+Window.className = {\r
+ window: 'window',\r
+ header: 'window_header',\r
+ headerLeft: 'window_headerLeft',\r
+ headerMiddle: 'window_headerMiddle',\r
+ headerRight: 'window_headerRight',\r
+ buttonHolder: 'window_buttonHolder',\r
+ closeButton: 'window_closeButton',\r
+ maxButton: 'window_maxButton',\r
+ minButton: 'window_minButton',\r
+ body: 'window_body',\r
+ bodyLeft: 'window_bodyLeft',\r
+ bodyMiddle: 'window_bodyMiddle',\r
+ bodyRight: 'window_bodyRight',\r
+ bottom: 'window_bottom',\r
+ bottomLeft: 'window_bottomLeft',\r
+ bottomMiddle: 'window_bottomMiddle',\r
+ bottomRight: 'window_bottomRight'\r
+}\r
+\r
+Window.prototype = {\r
+ \r
+ initialize: function(element) {\r
+ var options = Object.extend({\r
+ className: Window.className.window,\r
+ width: 300,\r
+ height: 300,\r
+ minWidth: 200,\r
+ minHeight: 40,\r
+ drag: true,\r
+ resize: true,\r
+ resizeX: true,\r
+ resizeY: true,\r
+ modal: false,\r
+ closeButton: true,\r
+ maxButton: true,\r
+ minButton: true,\r
+ cssPrefix: 'custom_',\r
+ restriction: false,\r
+ endDrag: Prototype.emptyFunction,\r
+ endResize: Prototype.emptyFunction,\r
+ addButton: Prototype.emptyFunction,\r
+ preMaximize: function() {return true},\r
+ preMinimize: function() {return true},\r
+ preRevertMaximize: function() {return true},\r
+ preRevertMinimize: function() {return true},\r
+ preClose: function() {return true},\r
+ endMaximize: Prototype.emptyFunction,\r
+ endMinimize: Prototype.emptyFunction,\r
+ endRevertMaximize: Prototype.emptyFunction,\r
+ endRevertMinimize: Prototype.emptyFunction,\r
+ endClose: Prototype.emptyFunction,\r
+ dragOptions: {},\r
+ appendToBody: false\r
+ }, arguments[1] || {});\r
+ \r
+ var customCss = CssUtil.appendPrefix(options.cssPrefix, Window.className);\r
+ this.classNames = new CssUtil([Window.className, customCss]);\r
+ \r
+ this.element = $(element);\r
+ Element.setStyle(this.element, {visibility: 'hidden'});\r
+\r
+ this.options = options;\r
+ this.element.className = this.options.className;\r
+ this.header = null;\r
+ this.windowBody = null;\r
+ this.bottom = null;\r
+ \r
+ this.elementId = this.element.id;\r
+ this.dragHandleId = this.elementId + '_dragHandle';\r
+ \r
+ this.maxZindex = -1;\r
+ this.minFlag = false;\r
+ this.maxFlag = false;\r
+ this.currentPos = [0,0];\r
+ this.currentSize = [0,0];\r
+\r
+ this.buildWindow();\r
+ this.cover = new IECover(this.element, {padding: 10});\r
+ \r
+ Element.makePositioned(element);\r
+ Element.hide(this.element);\r
+ Element.setStyle(this.element, {visibility: 'visible'});\r
+\r
+ if (this.options.appendToBody) this.appendToBody.callAfterLoading(this);\r
+ },\r
+\r
+ buildWindow: function() {\r
+ Element.cleanWhitespace(this.element);\r
+ \r
+ with(this.element.style) {\r
+ width = this.options.width + 'px';\r
+ height= this.options.height + 'px';\r
+ }\r
+\r
+ var title = this.element.childNodes[0];\r
+ var content = this.element.childNodes[1];\r
+ this.buildHeader(title);\r
+ this.buildBody(content);\r
+ this.buildBottom();\r
+ var newStyle = {height: this.options.height};\r
+ this.setBodyHeight(newStyle);\r
+\r
+ if (this.options.drag) this.createDraggble();\r
+\r
+ if (this.options.resize) {\r
+ this.enableResizing();\r
+ }\r
+ },\r
+\r
+ buildHeader: function(title) {\r
+ var headerLeft = Builder.node('div');\r
+ this.classNames.addClassNames(headerLeft, 'headerLeft');\r
+\r
+ var headerMiddle = Builder.node('div', {id: this.dragHandleId});\r
+ this.classNames.addClassNames(headerMiddle, 'headerMiddle');\r
+ \r
+ var headerRight = Builder.node('div');\r
+ this.classNames.addClassNames(headerRight, 'headerRight');\r
+\r
+ var buttonHolder = Builder.node('div');\r
+ this.classNames.addClassNames(buttonHolder, 'buttonHolder');\r
+ \r
+ headerMiddle.appendChild(title);\r
+ var headerList = [headerLeft, headerMiddle, buttonHolder, headerRight];\r
+ this.header = Builder.node('div', headerList);\r
+ this.classNames.addClassNames(this.header, 'header');\r
+ this.element.appendChild(this.header);\r
+ \r
+ \r
+ if (this.options.closeButton) {\r
+ var closeButton = Builder.node('div', {id: this.element.id.appendSuffix('closeButton')});\r
+ this.classNames.addClassNames(closeButton, 'closeButton');\r
+ buttonHolder.appendChild(closeButton);\r
+ Event.observe(closeButton, 'click', this.close.bindAsEventListener(this));\r
+ }\r
+ if (this.options.maxButton) {\r
+ var maxButton = Builder.node('div', {id: this.element.id.appendSuffix('maxButton')});\r
+ this.classNames.addClassNames(maxButton, 'maxButton');\r
+ buttonHolder.appendChild(maxButton);\r
+ Event.observe(maxButton, 'click', this.maximize.bindAsEventListener(this));\r
+ }\r
+ if (this.options.minButton) {\r
+ var minButton = Builder.node('div', {id: this.element.id.appendSuffix('minButton')});\r
+ this.classNames.addClassNames(minButton, 'minButton');\r
+ buttonHolder.appendChild(minButton);\r
+ Event.observe(minButton, 'click', this.minimize.bindAsEventListener(this));\r
+ }\r
+\r
+ if (this.options.addButton) {\r
+ var addButton = this.options.addButton;\r
+ if (addButton.constructor == Function) {\r
+ addButton(buttonHolder);\r
+ } else if (addButton.constructor == Array) {\r
+ var self = this;\r
+ var firstChild = buttonHolder.firstChild;\r
+ addButton.each(function(b) {\r
+ var button = Builder.node('div', {id: b.id, className: b.className});\r
+ Event.observe(button, 'click', b.onclick.bindAsEventListener(self));\r
+ if (b.first && firstChild) {\r
+ buttonHolder.insertBefore(button, firstChild);\r
+ } else {\r
+ buttonHolder.appendChild(button);\r
+ }\r
+ });\r
+ }\r
+ }\r
+ },\r
+ \r
+ buildBody: function(contents) {\r
+ var bodyLeft = Builder.node('div', {className: Window.className.bodyLeft});\r
+ this.classNames.addClassNames(bodyLeft, 'bodyLeft');\r
+ \r
+ var bodyMiddle = Builder.node('div');\r
+ this.classNames.addClassNames(bodyMiddle, 'bodyMiddle');\r
+ bodyMiddle.appendChild(contents);\r
+ \r
+ var bodyRight = Builder.node('div');\r
+ this.classNames.addClassNames(bodyRight, 'bodyRight');\r
+\r
+ var bodyList = [bodyRight,bodyLeft, bodyMiddle];\r
+ this.windowBody = Builder.node('div', bodyList); \r
+ this.classNames.addClassNames(this.windowBody, 'body');\r
+ this.element.appendChild(this.windowBody);\r
+ },\r
+ \r
+ buildBottom: function() {\r
+ var bottomLeft = Builder.node('div');\r
+ this.classNames.addClassNames(bottomLeft, 'bottomLeft');\r
+ \r
+ var bottomMiddle = Builder.node('div');\r
+ this.classNames.addClassNames(bottomMiddle, 'bottomMiddle');\r
+ \r
+ var bottomRight = Builder.node('div');\r
+ this.classNames.addClassNames(bottomRight, 'bottomRight');\r
+ \r
+ var bottomList = [bottomLeft, bottomMiddle, bottomRight];\r
+ this.bottom = Builder.node('div', bottomList);\r
+ this.classNames.addClassNames(this.bottom, 'bottom');\r
+ this.element.appendChild(this.bottom);\r
+ },\r
+\r
+ createDraggble: function() {\r
+ var self = this;\r
+ var options = Object.extend({\r
+ handle: this.dragHandleId,\r
+ starteffect: Prototype.emptyFunction,\r
+ endeffect: Prototype.emptyFunction,\r
+ endDrag: this.options.endDrag,\r
+ scroll: window\r
+ }, this.options.dragOptions);\r
+\r
+ if (this.options.restriction) {\r
+ options.snap = function(x, y) {\r
+ function constrain(n, lower, upper) {\r
+ if (n > upper) return upper; \r
+ else if (n < lower) return lower;\r
+ else return n;\r
+ }\r
+\r
+ var eDimensions = Element.getDimensions(self.element);\r
+ var pDimensions = Element.getDimensions(self.element.parentNode);\r
+\r
+ if (Element.getStyle(self.element.parentNode, 'position') == 'static') {\r
+ var offset = Position.positionedOffset(self.element.parentNode);\r
+ var parentLeft = offset[0];\r
+ var parentTop = offset[1];\r
+ return[\r
+ constrain(x, parentLeft, parentLeft + pDimensions.width - eDimensions.width),\r
+ constrain(y, parentTop, parentTop + pDimensions.height - eDimensions.height)\r
+ ];\r
+ } else {\r
+ return[\r
+ constrain(x, 0, pDimensions.width - eDimensions.width),\r
+ constrain(y, 0, pDimensions.height - eDimensions.height)\r
+ ];\r
+ }\r
+ }\r
+ } else {\r
+ var p = Position.cumulativeOffset(Position.offsetParent(this.element));\r
+ options.snap = function(x, y) {\r
+ return [\r
+ ((x + p[0]) >= 0) ? x : 0 - p[0], \r
+ ((y + p[1]) >= 0) ? y : 0 - p[1]\r
+ ];\r
+ }\r
+ }\r
+ new DraggableWindowEx(this.element, options);\r
+ },\r
+\r
+ setWindowZindex : function(zIndex) {\r
+ zIndex = this.getZindex(zIndex);\r
+ this.element.style.zIndex = zIndex;\r
+ },\r
+ \r
+ getZindex: function(zIndex) {\r
+ return ZindexManager.getIndex(zIndex);\r
+ },\r
+ \r
+ open: function(zIndex) {\r
+ this.opening = true;\r
+ if (this.options.modal) {\r
+ Modal.mask(this.element, {zIndex: zIndex});\r
+ } else {\r
+ this.setWindowZindex(zIndex);\r
+ }\r
+ Element.show(this.element);\r
+ this.cover.resetSize();\r
+ this.opening = false;\r
+ if (this.shouldClose) {\r
+ this.close();\r
+ this.shouldClose = false;\r
+ }\r
+ },\r
+ \r
+ close: function() {\r
+ if (this.opening) this.shouldClose = true;\r
+ if (!this.options.preClose(this)) return;\r
+ this.element.style.zIndex = -1;\r
+ this.maxZindex = -1;\r
+ try {\r
+ Element.hide(this.element);\r
+ } catch(e) {}\r
+ if (this.options.modal) {\r
+ Modal.unmask();\r
+ }\r
+ this.options.endClose(this);\r
+ if (this.opening) this.shouldClose = true;\r
+ },\r
+\r
+ minimize: function(event) {\r
+ if (this.minFlag) {\r
+ if (!this.options.preRevertMinimize(this)) return;\r
+ Element.toggle(this.windowBody);\r
+ if (this.maxFlag) {\r
+ this.minFlag = false;\r
+ this.setMax();\r
+ } else { \r
+ var newStyle = {height:this.currentSize[1]}\r
+ this.setBodyHeight(newStyle);\r
+ this.element.style.width = this.currentSize[0];\r
+ this.element.style.height = this.currentSize[1]; \r
+ this.element.style.left = this.currentPos[0];\r
+ this.element.style.top = this.currentPos[1];\r
+ this.maxFlag = false;\r
+ this.minFlag = false;\r
+ this.options.endRevertMinimize(this);\r
+ }\r
+ } else {\r
+ if (!this.options.preMinimize(this)) return;\r
+ Element.toggle(this.windowBody);\r
+ if (!this.maxFlag) {\r
+ this.currentPos = [Element.getStyle(this.element, 'left'), Element.getStyle(this.element, 'top')];\r
+ this.currentSize = [Element.getStyle(this.element, 'width'), Element.getStyle(this.element, 'height')];\r
+ }\r
+ this.setMin();\r
+ this.minFlag = true;\r
+ this.options.endMinimize(this);\r
+ }\r
+ this.cover.resetSize();\r
+ },\r
+ \r
+ maximize: function(event) {\r
+ if (this.maxFlag) {\r
+ if (this.minFlag) {\r
+ Element.toggle(this.windowBody);\r
+ this.minFlag = false;\r
+ this.setMax();\r
+ } else {\r
+ if (!this.options.preRevertMaximize(this)) return;\r
+ var newStyle = {height:parseInt(this.currentSize[1])}\r
+ this.setBodyHeight(newStyle);\r
+ this.element.style.width = this.currentSize[0];\r
+ this.element.style.height = this.currentSize[1]; \r
+ this.element.style.left = this.currentPos[0];\r
+ this.element.style.top = this.currentPos[1];\r
+ this.maxFlag = false;\r
+ this.minFlag = false; \r
+ document.body.style.overflow = '';\r
+ this.element.style.position = this.position;\r
+ if (this.parent) {\r
+ if (this.nextElement) {\r
+ this.parent.insertBefore(this.element, this.nextElement);\r
+ } else {\r
+ this.parent.appendChild(this.element);\r
+ }\r
+ }\r
+ this.options.endRevertMaximize(this);\r
+ }\r
+ \r
+ } else {\r
+ if (!this.options.preMaximize(this)) return;\r
+ if (!this.minFlag) {\r
+ this.currentPos = [Element.getStyle(this.element, 'left'), Element.getStyle(this.element, 'top')];\r
+ this.currentSize = [Element.getStyle(this.element, 'width'), Element.getStyle(this.element, 'height')]; \r
+ } else {\r
+ Element.toggle(this.windowBody);\r
+ this.minFlag = false;\r
+ }\r
+ this.parent = this.element.parentNode;\r
+ this.nextElement = Element.next(this.element, 0);\r
+ this.position = Element.getStyle(this.element, 'position');\r
+ document.body.style.overflow = 'hidden';\r
+ document.body.appendChild(this.element);\r
+ this.element.style.position = 'absolute';\r
+ this.setMax();\r
+ this.maxFlag = true;\r
+ this.options.endMaximize(this);\r
+ }\r
+ this.cover.resetSize();\r
+ },\r
+ \r
+ setMin : function() {\r
+ var minHeight = this.header.offsetHeight + this.bottom.offsetHeight;\r
+ var minWidth = this.options.minWidth;\r
+ this.element.style.height = minHeight + 'px';\r
+ this.element.style.width = minWidth + 'px';\r
+ },\r
+ \r
+ setMax : function(zIndex) {\r
+ var maxW = Element.getWindowWidth();\r
+ var maxH = Element.getWindowHeight();\r
+ var newStatus = {height:maxH}\r
+ with(this.element.style) {\r
+ width = maxW + 'px';\r
+ height = maxH + 'px';\r
+ left = '0px';\r
+ top = '0px';\r
+ }\r
+ this.setBodyHeight(newStatus);\r
+ this.setWindowZindex(zIndex); \r
+ },\r
+ \r
+ _getParentWidth: function(parent) {\r
+ if (parent && parent.style) {\r
+ var width = parent.style.width;\r
+ var index = 0;\r
+ if (width) {\r
+ if ((index = width.indexOf('px', 0)) > 0) {\r
+ return parseInt(width);\r
+ } else if ((index = width.indexOf('%', 0)) > 0) {\r
+ var pw = this._getParentWidth(parent.parentNode);\r
+ \r
+ var par = parseInt(width);\r
+ return pw * par / 100;\r
+ } else if (!width.isNaN) {\r
+ return parseInt(width);\r
+ } \r
+ } else if (parent == document.body){\r
+ return Element.getWindowWidth();\r
+ }\r
+ }\r
+ },\r
+\r
+ setHeight: function(height) {\r
+ height = {height: height};\r
+ Element.setStyle(this.element, height);\r
+ this.setBodyHeight(height);\r
+ },\r
+ \r
+ setBodyHeight: function(newStyle) {\r
+ var height = parseInt(newStyle.height);\r
+ if (height > this.options.minHeight) {\r
+ var newHeight = (height - this.header.offsetHeight - this.bottom.offsetHeight) + 'px';\r
+ this.windowBody.childNodes[0].style.height = newHeight;\r
+ this.windowBody.childNodes[1].style.height = newHeight;\r
+ this.windowBody.childNodes[2].style.height = newHeight;\r
+ this.windowBody.style.height = newHeight;\r
+ }\r
+ if (this.cover) this.cover.resetSize();\r
+ },\r
+\r
+ center: function() {\r
+ var w = parseInt(Element.getStyle(this.element, 'width'));\r
+ var h = parseInt(Element.getStyle(this.element, 'height'));\r
+\r
+ var pOffset = Position.cumulativeOffset(Position.offsetParent(this.element));\r
+\r
+ var left = (Element.getWindowWidth() - w) / 2;\r
+ var top = (Element.getWindowHeight() - h) / 2;\r
+ var scrollTop = (document.documentElement.scrollTop || document.body.scrollTop);\r
+ var scrollLeft = (document.documentElement.scrollLeft || document.body.scrollLeft);\r
+\r
+ top += scrollTop - pOffset[1];\r
+ left += scrollLeft - pOffset[0];\r
+ top = ((top + pOffset[1]) >= 0) ? top : 0 - pOffset[1];\r
+ left = ((left + pOffset[0]) >= 0) ? left : 0 - pOffset[0];\r
+ Element.setStyle(this.element, {left: left + 'px', top: top + 'px'});\r
+ },\r
+\r
+ enableResizing: function() {\r
+ var resTop = this.options.resizeY ? 6 : 0;\r
+ var resBottom = this.options.resizeY ? 6 : 0;\r
+ var resLeft = this.options.resizeX ? 6 : 0;\r
+ var resRight = this.options.resizeX ? 6 : 0;\r
+ this.resizeable = new ResizeableWindowEx(this.element, { \r
+ top: resTop,\r
+ bottom: resBottom,\r
+ left: resLeft,\r
+ right: resRight,\r
+ minWidth: this.options.minWidth,\r
+ minHeight: this.options.minHeight,\r
+ draw: this.setBodyHeight.bind(this),\r
+ resize: this.options.endResize,\r
+ restriction: this.options.restriction,\r
+ zindex: 2000\r
+ });\r
+ },\r
+\r
+ disableResizing: function() {\r
+ this.resizeable.destroy();\r
+ },\r
+\r
+ appendToBody: function() {\r
+ this.removeFromBody(this.element.id)\r
+ document.body.appendChild(this.element);\r
+ },\r
+ \r
+ removeFromBody: function(dom_id) {\r
+ $A(document.body.childNodes).each(function(node){\r
+ if (node.id == dom_id) node.remove();\r
+ });\r
+ }\r
+}\r
+\r
+\r
+// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// This code is substantially based on code from script.aculo.us which has the \r
+// following copyright and permission notice\r
+//\r
+// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+var DraggableWindowEx = Class.create();\r
+Object.extend(DraggableWindowEx.prototype, Draggable.prototype);\r
+Object.extend(DraggableWindowEx.prototype, {\r
+ initDrag: function(event) {\r
+ if(Event.isLeftClick(event)) { \r
+ // abort on form elements, fixes a Firefox issue\r
+ var src = Event.element(event);\r
+ if(src.tagName && (\r
+ src.tagName=='INPUT' ||\r
+ src.tagName=='SELECT' ||\r
+ src.tagName=='OPTION' ||\r
+ src.tagName=='BUTTON' ||\r
+ src.tagName=='TEXTAREA')) return;\r
+ \r
+ if(this.element._revert) {\r
+ this.element._revert.cancel();\r
+ this.element._revert = null;\r
+ }\r
+ \r
+ var pointer = [Event.pointerX(event), Event.pointerY(event)];\r
+ var pos = Position.cumulativeOffset(this.element);\r
+ this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) });\r
+\r
+ var zIndex = ZindexManager.getIndex();\r
+ this.originalZ = zIndex;\r
+ this.options.zindex = zIndex;\r
+ Element.setStyle(this.element, {zIndex: zIndex});\r
+ \r
+ Draggables.activate(this);\r
+ Event.stop(event);\r
+ }\r
+ },\r
+\r
+ endDrag: function(event) {\r
+ if(!this.dragging) return;\r
+ this.stopScrolling();\r
+ this.finishDrag(event, true);\r
+\r
+ this.options.endDrag();\r
+ Event.stop(event);\r
+ }\r
+});\r
+\r
-// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)
-//
-// This code is substantially based on code from Thomas Fakes(http://craz8.com)
-// which has the following copyright and permission notice
-//
-// Copyright (c) 2005 Thomas Fakes (http://craz8.com)
-//
-// This code is substantially based on code from script.aculo.us which has the
-// following copyright and permission notice
-//
-// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-ResizeableWindowEx = Class.create();
-Object.extend(Object.extend(ResizeableWindowEx.prototype, Resizeable.prototype), {
- startResize: function(event) {
- if (Event.isLeftClick(event)) {
-
- // abort on form elements, fixes a Firefox issue
- var src = Event.element(event);
- if(src.tagName && (
- src.tagName=='INPUT' ||
- src.tagName=='SELECT' ||
- src.tagName=='BUTTON' ||
- src.tagName=='TEXTAREA')) return;
-
- var dir = this.directions(event);
- if (dir.length > 0) {
- this.active = true;
- var offsets = Position.cumulativeOffset(this.element);
- this.startTop = offsets[1];
- this.startLeft = offsets[0];
- this.startWidth = parseInt(Element.getStyle(this.element, 'width'));
- this.startHeight = parseInt(Element.getStyle(this.element, 'height'));
- this.startX = event.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
- this.startY = event.clientY + document.body.scrollTop + document.documentElement.scrollTop;
-
- this.currentDirection = dir;
- Event.stop(event);
- }
-
- if (this.options.restriction) {
- var parent = this.element.parentNode;
- var dimensions = Element.getDimensions(parent);
- this.parentOffset = Position.cumulativeOffset(parent);
- this.parentWidth = this.parentOffset[0] + dimensions.width;
- this.parentHeight = this.parentOffset[1] + dimensions.height;
- }
- }
- },
-
- draw: function(event) {
- var pointer = [Event.pointerX(event), Event.pointerY(event)];
- if (this.options.restriction &&
- (
- (this.parentWidth <= pointer[0])
- || (this.parentHeight <= pointer[1])
- || (this.parentOffset[0] >= pointer[0])
- || (this.parentOffset[1] >= pointer[1])
- )) return;
-
- var style = this.element.style;
- var newHeight = style.height;
- var newWidth = style.width;
- var newTop = style.top;
- var newLeft = style.left;
-
- if (this.currentDirection.indexOf('n') != -1) {
- var pointerMoved = this.startY - pointer[1];
- var margin = Element.getStyle(this.element, 'margin-top') || "0";
- newHeight = this.startHeight + pointerMoved;
- newTop = (this.startTop - pointerMoved - parseInt(margin)) + "px";
- }
-
- if (this.currentDirection.indexOf('w') != -1) {
- var pointerMoved = this.startX - pointer[0];
- var margin = Element.getStyle(this.element, 'margin-left') || "0";
- newWidth = this.startWidth + pointerMoved;
- newLeft = this.startLeft - pointerMoved - parseInt(margin);
- if (this.options.restriction) newLeft -= this.parentOffset[0];
- newLeft += 'px';
- }
-
- if (this.currentDirection.indexOf('s') != -1) {
- newHeight = this.startHeight + pointer[1] - this.startY;
- }
-
- if (this.currentDirection.indexOf('e') != -1) {
- newWidth = this.startWidth + pointer[0] - this.startX;
- }
-
- var newStyle = {
- height: newHeight,
- width: newWidth,
- top: newTop,
- left: newLeft
- }
- if (this.options.draw) {
- this.options.draw(newStyle, this.element);
- }
-
- if (newHeight && newHeight > this.options.minHeight) {
- style.top = newStyle.top;
- style.height = newStyle.height + "px";
- }
- if (newWidth && newWidth > this.options.minWidth) {
- style.left = newStyle.left;
- style.width = newStyle.width + "px";
- }
- if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering
- }
-});
+// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// This code is substantially based on code from Thomas Fakes(http://craz8.com) \r
+// which has the following copyright and permission notice\r
+// \r
+// Copyright (c) 2005 Thomas Fakes (http://craz8.com)\r
+// \r
+// This code is substantially based on code from script.aculo.us which has the \r
+// following copyright and permission notice\r
+//\r
+// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+ResizeableWindowEx = Class.create();\r
+Object.extend(Object.extend(ResizeableWindowEx.prototype, Resizeable.prototype), {\r
+ startResize: function(event) {\r
+ if (Event.isLeftClick(event)) {\r
+ \r
+ // abort on form elements, fixes a Firefox issue\r
+ var src = Event.element(event);\r
+ if(src.tagName && (\r
+ src.tagName=='INPUT' ||\r
+ src.tagName=='SELECT' ||\r
+ src.tagName=='BUTTON' ||\r
+ src.tagName=='TEXTAREA')) return;\r
+\r
+ var dir = this.directions(event);\r
+ if (dir.length > 0) { \r
+ this.active = true;\r
+ var offsets = Position.cumulativeOffset(this.element);\r
+ this.startTop = offsets[1];\r
+ this.startLeft = offsets[0];\r
+ this.startWidth = parseInt(Element.getStyle(this.element, 'width'));\r
+ this.startHeight = parseInt(Element.getStyle(this.element, 'height'));\r
+ this.startX = event.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;\r
+ this.startY = event.clientY + document.body.scrollTop + document.documentElement.scrollTop;\r
+ \r
+ this.currentDirection = dir;\r
+ Event.stop(event);\r
+ }\r
+\r
+ if (this.options.restriction) {\r
+ var parent = this.element.parentNode;\r
+ var dimensions = Element.getDimensions(parent);\r
+ this.parentOffset = Position.cumulativeOffset(parent);\r
+ this.parentWidth = this.parentOffset[0] + dimensions.width;\r
+ this.parentHeight = this.parentOffset[1] + dimensions.height;\r
+ }\r
+ }\r
+ },\r
+\r
+ draw: function(event) {\r
+ var pointer = [Event.pointerX(event), Event.pointerY(event)];\r
+ if (this.options.restriction &&\r
+ (\r
+ (this.parentWidth <= pointer[0])\r
+ || (this.parentHeight <= pointer[1])\r
+ || (this.parentOffset[0] >= pointer[0])\r
+ || (this.parentOffset[1] >= pointer[1])\r
+ )) return;\r
+\r
+ var style = this.element.style;\r
+ var newHeight = style.height;\r
+ var newWidth = style.width;\r
+ var newTop = style.top;\r
+ var newLeft = style.left;\r
+\r
+ if (this.currentDirection.indexOf('n') != -1) {\r
+ var pointerMoved = this.startY - pointer[1];\r
+ var margin = Element.getStyle(this.element, 'margin-top') || "0";\r
+ newHeight = this.startHeight + pointerMoved;\r
+ newTop = (this.startTop - pointerMoved - parseInt(margin)) + "px";\r
+ }\r
+ \r
+ if (this.currentDirection.indexOf('w') != -1) {\r
+ var pointerMoved = this.startX - pointer[0];\r
+ var margin = Element.getStyle(this.element, 'margin-left') || "0";\r
+ newWidth = this.startWidth + pointerMoved;\r
+ newLeft = this.startLeft - pointerMoved - parseInt(margin);\r
+ if (this.options.restriction) newLeft -= this.parentOffset[0];\r
+ newLeft += 'px';\r
+ }\r
+ \r
+ if (this.currentDirection.indexOf('s') != -1) {\r
+ newHeight = this.startHeight + pointer[1] - this.startY;\r
+ }\r
+ \r
+ if (this.currentDirection.indexOf('e') != -1) {\r
+ newWidth = this.startWidth + pointer[0] - this.startX;\r
+ }\r
+ \r
+ var newStyle = {\r
+ height: newHeight,\r
+ width: newWidth,\r
+ top: newTop,\r
+ left: newLeft\r
+ }\r
+ if (this.options.draw) {\r
+ this.options.draw(newStyle, this.element);\r
+ }\r
+ \r
+ if (newHeight && newHeight > this.options.minHeight) {\r
+ style.top = newStyle.top;\r
+ style.height = newStyle.height + "px";\r
+ }\r
+ if (newWidth && newWidth > this.options.minWidth) {\r
+ style.left = newStyle.left;\r
+ style.width = newStyle.width + "px";\r
+ }\r
+ if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering\r
+ }\r
+});\r
-// script.aculo.us builder.js v1.6.4, Wed Sep 06 11:30:58 CEST 2006
-
-// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-//
-// See scriptaculous.js for full license.
-
-var Builder = {
- NODEMAP: {
- AREA: 'map',
- CAPTION: 'table',
- COL: 'table',
- COLGROUP: 'table',
- LEGEND: 'fieldset',
- OPTGROUP: 'select',
- OPTION: 'select',
- PARAM: 'object',
- TBODY: 'table',
- TD: 'table',
- TFOOT: 'table',
- TH: 'table',
- THEAD: 'table',
- TR: 'table'
- },
- // note: For Firefox < 1.5, OPTION and OPTGROUP tags are currently broken,
- // due to a Firefox bug
- node: function(elementName) {
- elementName = elementName.toUpperCase();
-
- // try innerHTML approach
- var parentTag = this.NODEMAP[elementName] || 'div';
- var parentElement = document.createElement(parentTag);
- try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
- parentElement.innerHTML = "<" + elementName + "></" + elementName + ">";
- } catch(e) {}
- var element = parentElement.firstChild || null;
-
- // see if browser added wrapping tags
- if(element && (element.tagName != elementName))
- element = element.getElementsByTagName(elementName)[0];
-
- // fallback to createElement approach
- if(!element) element = document.createElement(elementName);
-
- // abort if nothing could be created
- if(!element) return;
-
- // attributes (or text)
- if(arguments[1])
- if(this._isStringOrNumber(arguments[1]) ||
- (arguments[1] instanceof Array)) {
- this._children(element, arguments[1]);
- } else {
- var attrs = this._attributes(arguments[1]);
- if(attrs.length) {
- try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
- parentElement.innerHTML = "<" +elementName + " " +
- attrs + "></" + elementName + ">";
- } catch(e) {}
- element = parentElement.firstChild || null;
- // workaround firefox 1.0.X bug
- if(!element) {
- element = document.createElement(elementName);
- for(attr in arguments[1])
- element[attr == 'class' ? 'className' : attr] = arguments[1][attr];
- }
- if(element.tagName != elementName)
- element = parentElement.getElementsByTagName(elementName)[0];
- }
- }
-
- // text, or array of children
- if(arguments[2])
- this._children(element, arguments[2]);
-
- return element;
- },
- _text: function(text) {
- return document.createTextNode(text);
- },
- _attributes: function(attributes) {
- var attrs = [];
- for(attribute in attributes)
- attrs.push((attribute=='className' ? 'class' : attribute) +
- '="' + attributes[attribute].toString().escapeHTML() + '"');
- return attrs.join(" ");
- },
- _children: function(element, children) {
- if(typeof children=='object') { // array can hold nodes and text
- children.flatten().each( function(e) {
- if(typeof e=='object')
- element.appendChild(e)
- else
- if(Builder._isStringOrNumber(e))
- element.appendChild(Builder._text(e));
- });
- } else
- if(Builder._isStringOrNumber(children))
- element.appendChild(Builder._text(children));
- },
- _isStringOrNumber: function(param) {
- return(typeof param=='string' || typeof param=='number');
- },
- dump: function(scope) {
- if(typeof scope != 'object' && typeof scope != 'function') scope = window; //global scope
-
- var tags = ("A ABBR ACRONYM ADDRESS APPLET AREA B BASE BASEFONT BDO BIG BLOCKQUOTE BODY " +
- "BR BUTTON CAPTION CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM FIELDSET " +
- "FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I IFRAME IMG INPUT INS ISINDEX "+
- "KBD LABEL LEGEND LI LINK MAP MENU META NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION P "+
- "PARAM PRE Q S SAMP SCRIPT SELECT SMALL SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD "+
- "TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR").split(/\s+/);
-
- tags.each( function(tag){
- scope[tag] = function() {
- return Builder.node.apply(Builder, [tag].concat($A(arguments)));
- }
- });
- }
+// script.aculo.us builder.js v1.6.4, Wed Sep 06 11:30:58 CEST 2006\r
+\r
+// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)\r
+//\r
+// See scriptaculous.js for full license.\r
+\r
+var Builder = {\r
+ NODEMAP: {\r
+ AREA: 'map',\r
+ CAPTION: 'table',\r
+ COL: 'table',\r
+ COLGROUP: 'table',\r
+ LEGEND: 'fieldset',\r
+ OPTGROUP: 'select',\r
+ OPTION: 'select',\r
+ PARAM: 'object',\r
+ TBODY: 'table',\r
+ TD: 'table',\r
+ TFOOT: 'table',\r
+ TH: 'table',\r
+ THEAD: 'table',\r
+ TR: 'table'\r
+ },\r
+ // note: For Firefox < 1.5, OPTION and OPTGROUP tags are currently broken,\r
+ // due to a Firefox bug\r
+ node: function(elementName) {\r
+ elementName = elementName.toUpperCase();\r
+ \r
+ // try innerHTML approach\r
+ var parentTag = this.NODEMAP[elementName] || 'div';\r
+ var parentElement = document.createElement(parentTag);\r
+ try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707\r
+ parentElement.innerHTML = "<" + elementName + "></" + elementName + ">";\r
+ } catch(e) {}\r
+ var element = parentElement.firstChild || null;\r
+ \r
+ // see if browser added wrapping tags\r
+ if(element && (element.tagName != elementName))\r
+ element = element.getElementsByTagName(elementName)[0];\r
+ \r
+ // fallback to createElement approach\r
+ if(!element) element = document.createElement(elementName);\r
+ \r
+ // abort if nothing could be created\r
+ if(!element) return;\r
+\r
+ // attributes (or text)\r
+ if(arguments[1])\r
+ if(this._isStringOrNumber(arguments[1]) ||\r
+ (arguments[1] instanceof Array)) {\r
+ this._children(element, arguments[1]);\r
+ } else {\r
+ var attrs = this._attributes(arguments[1]);\r
+ if(attrs.length) {\r
+ try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707\r
+ parentElement.innerHTML = "<" +elementName + " " +\r
+ attrs + "></" + elementName + ">";\r
+ } catch(e) {}\r
+ element = parentElement.firstChild || null;\r
+ // workaround firefox 1.0.X bug\r
+ if(!element) {\r
+ element = document.createElement(elementName);\r
+ for(attr in arguments[1]) \r
+ element[attr == 'class' ? 'className' : attr] = arguments[1][attr];\r
+ }\r
+ if(element.tagName != elementName)\r
+ element = parentElement.getElementsByTagName(elementName)[0];\r
+ }\r
+ } \r
+\r
+ // text, or array of children\r
+ if(arguments[2])\r
+ this._children(element, arguments[2]);\r
+\r
+ return element;\r
+ },\r
+ _text: function(text) {\r
+ return document.createTextNode(text);\r
+ },\r
+ _attributes: function(attributes) {\r
+ var attrs = [];\r
+ for(attribute in attributes)\r
+ attrs.push((attribute=='className' ? 'class' : attribute) +\r
+ '="' + attributes[attribute].toString().escapeHTML() + '"');\r
+ return attrs.join(" ");\r
+ },\r
+ _children: function(element, children) {\r
+ if(typeof children=='object') { // array can hold nodes and text\r
+ children.flatten().each( function(e) {\r
+ if(typeof e=='object')\r
+ element.appendChild(e)\r
+ else\r
+ if(Builder._isStringOrNumber(e))\r
+ element.appendChild(Builder._text(e));\r
+ });\r
+ } else\r
+ if(Builder._isStringOrNumber(children)) \r
+ element.appendChild(Builder._text(children));\r
+ },\r
+ _isStringOrNumber: function(param) {\r
+ return(typeof param=='string' || typeof param=='number');\r
+ },\r
+ dump: function(scope) { \r
+ if(typeof scope != 'object' && typeof scope != 'function') scope = window; //global scope \r
+ \r
+ var tags = ("A ABBR ACRONYM ADDRESS APPLET AREA B BASE BASEFONT BDO BIG BLOCKQUOTE BODY " +\r
+ "BR BUTTON CAPTION CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM FIELDSET " +\r
+ "FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I IFRAME IMG INPUT INS ISINDEX "+\r
+ "KBD LABEL LEGEND LI LINK MAP MENU META NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION P "+\r
+ "PARAM PRE Q S SAMP SCRIPT SELECT SMALL SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD "+\r
+ "TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR").split(/\s+/);\r
+ \r
+ tags.each( function(tag){ \r
+ scope[tag] = function() { \r
+ return Builder.node.apply(Builder, [tag].concat($A(arguments))); \r
+ } \r
+ });\r
+ }\r
}
\ No newline at end of file
-// script.aculo.us controls.js v1.6.4, Wed Sep 06 11:30:58 CEST 2006
-
-// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-// (c) 2005 Ivan Krstic (http://blogs.law.harvard.edu/ivan)
-// (c) 2005 Jon Tirsen (http://www.tirsen.com)
-// Contributors:
-// Richard Livsey
-// Rahul Bhargava
-// Rob Wills
-//
-// See scriptaculous.js for full license.
-
-// Autocompleter.Base handles all the autocompletion functionality
-// that's independent of the data source for autocompletion. This
-// includes drawing the autocompletion menu, observing keyboard
-// and mouse events, and similar.
-//
-// Specific autocompleters need to provide, at the very least,
-// a getUpdatedChoices function that will be invoked every time
-// the text inside the monitored textbox changes. This method
-// should get the text for which to provide autocompletion by
-// invoking this.getToken(), NOT by directly accessing
-// this.element.value. This is to allow incremental tokenized
-// autocompletion. Specific auto-completion logic (AJAX, etc)
-// belongs in getUpdatedChoices.
-//
-// Tokenized incremental autocompletion is enabled automatically
-// when an autocompleter is instantiated with the 'tokens' option
-// in the options parameter, e.g.:
-// new Ajax.Autocompleter('id','upd', '/url/', { tokens: ',' });
-// will incrementally autocomplete with a comma as the token.
-// Additionally, ',' in the above example can be replaced with
-// a token array, e.g. { tokens: [',', '\n'] } which
-// enables autocompletion on multiple tokens. This is most
-// useful when one of the tokens is \n (a newline), as it
-// allows smart autocompletion after linebreaks.
-
-if(typeof Effect == 'undefined')
- throw("controls.js requires including script.aculo.us' effects.js library");
-
-var Autocompleter = {}
-Autocompleter.Base = function() {};
-Autocompleter.Base.prototype = {
- baseInitialize: function(element, update, options) {
- this.element = $(element);
- this.update = $(update);
- this.hasFocus = false;
- this.changed = false;
- this.active = false;
- this.index = 0;
- this.entryCount = 0;
-
- if(this.setOptions)
- this.setOptions(options);
- else
- this.options = options || {};
-
- this.options.paramName = this.options.paramName || this.element.name;
- this.options.tokens = this.options.tokens || [];
- this.options.frequency = this.options.frequency || 0.4;
- this.options.minChars = this.options.minChars || 1;
- this.options.onShow = this.options.onShow ||
- function(element, update){
- if(!update.style.position || update.style.position=='absolute') {
- update.style.position = 'absolute';
- Position.clone(element, update, {
- setHeight: false,
- offsetTop: element.offsetHeight
- });
- }
- Effect.Appear(update,{duration:0.15});
- };
- this.options.onHide = this.options.onHide ||
- function(element, update){ new Effect.Fade(update,{duration:0.15}) };
-
- if(typeof(this.options.tokens) == 'string')
- this.options.tokens = new Array(this.options.tokens);
-
- this.observer = null;
-
- this.element.setAttribute('autocomplete','off');
-
- Element.hide(this.update);
-
- Event.observe(this.element, "blur", this.onBlur.bindAsEventListener(this));
- Event.observe(this.element, "keypress", this.onKeyPress.bindAsEventListener(this));
- },
-
- show: function() {
- if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update);
- if(!this.iefix &&
- (navigator.appVersion.indexOf('MSIE')>0) &&
- (navigator.userAgent.indexOf('Opera')<0) &&
- (Element.getStyle(this.update, 'position')=='absolute')) {
- new Insertion.After(this.update,
- '<iframe id="' + this.update.id + '_iefix" '+
- 'style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" ' +
- 'src="javascript:false;" frameborder="0" scrolling="no"></iframe>');
- this.iefix = $(this.update.id+'_iefix');
- }
- if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this), 50);
- },
-
- fixIEOverlapping: function() {
- Position.clone(this.update, this.iefix, {setTop:(!this.update.style.height)});
- this.iefix.style.zIndex = 1;
- this.update.style.zIndex = 2;
- Element.show(this.iefix);
- },
-
- hide: function() {
- this.stopIndicator();
- if(Element.getStyle(this.update, 'display')!='none') this.options.onHide(this.element, this.update);
- if(this.iefix) Element.hide(this.iefix);
- },
-
- startIndicator: function() {
- if(this.options.indicator) Element.show(this.options.indicator);
- },
-
- stopIndicator: function() {
- if(this.options.indicator) Element.hide(this.options.indicator);
- },
-
- onKeyPress: function(event) {
- if(this.active)
- switch(event.keyCode) {
- case Event.KEY_TAB:
- case Event.KEY_RETURN:
- this.selectEntry();
- Event.stop(event);
- case Event.KEY_ESC:
- this.hide();
- this.active = false;
- Event.stop(event);
- return;
- case Event.KEY_LEFT:
- case Event.KEY_RIGHT:
- return;
- case Event.KEY_UP:
- this.markPrevious();
- this.render();
- if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event);
- return;
- case Event.KEY_DOWN:
- this.markNext();
- this.render();
- if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event);
- return;
- }
- else
- if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN ||
- (navigator.appVersion.indexOf('AppleWebKit') > 0 && event.keyCode == 0)) return;
-
- this.changed = true;
- this.hasFocus = true;
-
- if(this.observer) clearTimeout(this.observer);
- this.observer =
- setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000);
- },
-
- activate: function() {
- this.changed = false;
- this.hasFocus = true;
- this.getUpdatedChoices();
- },
-
- onHover: function(event) {
- var element = Event.findElement(event, 'LI');
- if(this.index != element.autocompleteIndex)
- {
- this.index = element.autocompleteIndex;
- this.render();
- }
- Event.stop(event);
- },
-
- onClick: function(event) {
- var element = Event.findElement(event, 'LI');
- this.index = element.autocompleteIndex;
- this.selectEntry();
- this.hide();
- },
-
- onBlur: function(event) {
- // needed to make click events working
- setTimeout(this.hide.bind(this), 250);
- this.hasFocus = false;
- this.active = false;
- },
-
- render: function() {
- if(this.entryCount > 0) {
- for (var i = 0; i < this.entryCount; i++)
- this.index==i ?
- Element.addClassName(this.getEntry(i),"selected") :
- Element.removeClassName(this.getEntry(i),"selected");
-
- if(this.hasFocus) {
- this.show();
- this.active = true;
- }
- } else {
- this.active = false;
- this.hide();
- }
- },
-
- markPrevious: function() {
- if(this.index > 0) this.index--
- else this.index = this.entryCount-1;
- this.getEntry(this.index).scrollIntoView(true);
- },
-
- markNext: function() {
- if(this.index < this.entryCount-1) this.index++
- else this.index = 0;
- this.getEntry(this.index).scrollIntoView(false);
- },
-
- getEntry: function(index) {
- return this.update.firstChild.childNodes[index];
- },
-
- getCurrentEntry: function() {
- return this.getEntry(this.index);
- },
-
- selectEntry: function() {
- this.active = false;
- this.updateElement(this.getCurrentEntry());
- },
-
- updateElement: function(selectedElement) {
- if (this.options.updateElement) {
- this.options.updateElement(selectedElement);
- return;
- }
- var value = '';
- if (this.options.select) {
- var nodes = document.getElementsByClassName(this.options.select, selectedElement) || [];
- if(nodes.length>0) value = Element.collectTextNodes(nodes[0], this.options.select);
- } else
- value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal');
-
- var lastTokenPos = this.findLastToken();
- if (lastTokenPos != -1) {
- var newValue = this.element.value.substr(0, lastTokenPos + 1);
- var whitespace = this.element.value.substr(lastTokenPos + 1).match(/^\s+/);
- if (whitespace)
- newValue += whitespace[0];
- this.element.value = newValue + value;
- } else {
- this.element.value = value;
- }
- this.element.focus();
-
- if (this.options.afterUpdateElement)
- this.options.afterUpdateElement(this.element, selectedElement);
- },
-
- updateChoices: function(choices) {
- if(!this.changed && this.hasFocus) {
- this.update.innerHTML = choices;
- Element.cleanWhitespace(this.update);
- Element.cleanWhitespace(this.update.firstChild);
-
- if(this.update.firstChild && this.update.firstChild.childNodes) {
- this.entryCount =
- this.update.firstChild.childNodes.length;
- for (var i = 0; i < this.entryCount; i++) {
- var entry = this.getEntry(i);
- entry.autocompleteIndex = i;
- this.addObservers(entry);
- }
- } else {
- this.entryCount = 0;
- }
-
- this.stopIndicator();
- this.index = 0;
-
- if(this.entryCount==1 && this.options.autoSelect) {
- this.selectEntry();
- this.hide();
- } else {
- this.render();
- }
- }
- },
-
- addObservers: function(element) {
- Event.observe(element, "mouseover", this.onHover.bindAsEventListener(this));
- Event.observe(element, "click", this.onClick.bindAsEventListener(this));
- },
-
- onObserverEvent: function() {
- this.changed = false;
- if(this.getToken().length>=this.options.minChars) {
- this.startIndicator();
- this.getUpdatedChoices();
- } else {
- this.active = false;
- this.hide();
- }
- },
-
- getToken: function() {
- var tokenPos = this.findLastToken();
- if (tokenPos != -1)
- var ret = this.element.value.substr(tokenPos + 1).replace(/^\s+/,'').replace(/\s+$/,'');
- else
- var ret = this.element.value;
-
- return /\n/.test(ret) ? '' : ret;
- },
-
- findLastToken: function() {
- var lastTokenPos = -1;
-
- for (var i=0; i<this.options.tokens.length; i++) {
- var thisTokenPos = this.element.value.lastIndexOf(this.options.tokens[i]);
- if (thisTokenPos > lastTokenPos)
- lastTokenPos = thisTokenPos;
- }
- return lastTokenPos;
- }
-}
-
-Ajax.Autocompleter = Class.create();
-Object.extend(Object.extend(Ajax.Autocompleter.prototype, Autocompleter.Base.prototype), {
- initialize: function(element, update, url, options) {
- this.baseInitialize(element, update, options);
- this.options.asynchronous = true;
- this.options.onComplete = this.onComplete.bind(this);
- this.options.defaultParams = this.options.parameters || null;
- this.url = url;
- },
-
- getUpdatedChoices: function() {
- entry = encodeURIComponent(this.options.paramName) + '=' +
- encodeURIComponent(this.getToken());
-
- this.options.parameters = this.options.callback ?
- this.options.callback(this.element, entry) : entry;
-
- if(this.options.defaultParams)
- this.options.parameters += '&' + this.options.defaultParams;
-
- new Ajax.Request(this.url, this.options);
- },
-
- onComplete: function(request) {
- this.updateChoices(request.responseText);
- }
-
-});
-
-// The local array autocompleter. Used when you'd prefer to
-// inject an array of autocompletion options into the page, rather
-// than sending out Ajax queries, which can be quite slow sometimes.
-//
-// The constructor takes four parameters. The first two are, as usual,
-// the id of the monitored textbox, and id of the autocompletion menu.
-// The third is the array you want to autocomplete from, and the fourth
-// is the options block.
-//
-// Extra local autocompletion options:
-// - choices - How many autocompletion choices to offer
-//
-// - partialSearch - If false, the autocompleter will match entered
-// text only at the beginning of strings in the
-// autocomplete array. Defaults to true, which will
-// match text at the beginning of any *word* in the
-// strings in the autocomplete array. If you want to
-// search anywhere in the string, additionally set
-// the option fullSearch to true (default: off).
-//
-// - fullSsearch - Search anywhere in autocomplete array strings.
-//
-// - partialChars - How many characters to enter before triggering
-// a partial match (unlike minChars, which defines
-// how many characters are required to do any match
-// at all). Defaults to 2.
-//
-// - ignoreCase - Whether to ignore case when autocompleting.
-// Defaults to true.
-//
-// It's possible to pass in a custom function as the 'selector'
-// option, if you prefer to write your own autocompletion logic.
-// In that case, the other options above will not apply unless
-// you support them.
-
-Autocompleter.Local = Class.create();
-Autocompleter.Local.prototype = Object.extend(new Autocompleter.Base(), {
- initialize: function(element, update, array, options) {
- this.baseInitialize(element, update, options);
- this.options.array = array;
- },
-
- getUpdatedChoices: function() {
- this.updateChoices(this.options.selector(this));
- },
-
- setOptions: function(options) {
- this.options = Object.extend({
- choices: 10,
- partialSearch: true,
- partialChars: 2,
- ignoreCase: true,
- fullSearch: false,
- selector: function(instance) {
- var ret = []; // Beginning matches
- var partial = []; // Inside matches
- var entry = instance.getToken();
- var count = 0;
-
- for (var i = 0; i < instance.options.array.length &&
- ret.length < instance.options.choices ; i++) {
-
- var elem = instance.options.array[i];
- var foundPos = instance.options.ignoreCase ?
- elem.toLowerCase().indexOf(entry.toLowerCase()) :
- elem.indexOf(entry);
-
- while (foundPos != -1) {
- if (foundPos == 0 && elem.length != entry.length) {
- ret.push("<li><strong>" + elem.substr(0, entry.length) + "</strong>" +
- elem.substr(entry.length) + "</li>");
- break;
- } else if (entry.length >= instance.options.partialChars &&
- instance.options.partialSearch && foundPos != -1) {
- if (instance.options.fullSearch || /\s/.test(elem.substr(foundPos-1,1))) {
- partial.push("<li>" + elem.substr(0, foundPos) + "<strong>" +
- elem.substr(foundPos, entry.length) + "</strong>" + elem.substr(
- foundPos + entry.length) + "</li>");
- break;
- }
- }
-
- foundPos = instance.options.ignoreCase ?
- elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) :
- elem.indexOf(entry, foundPos + 1);
-
- }
- }
- if (partial.length)
- ret = ret.concat(partial.slice(0, instance.options.choices - ret.length))
- return "<ul>" + ret.join('') + "</ul>";
- }
- }, options || {});
- }
-});
-
-// AJAX in-place editor
-//
-// see documentation on http://wiki.script.aculo.us/scriptaculous/show/Ajax.InPlaceEditor
-
-// Use this if you notice weird scrolling problems on some browsers,
-// the DOM might be a bit confused when this gets called so do this
-// waits 1 ms (with setTimeout) until it does the activation
-Field.scrollFreeActivate = function(field) {
- setTimeout(function() {
- Field.activate(field);
- }, 1);
-}
-
-Ajax.InPlaceEditor = Class.create();
-Ajax.InPlaceEditor.defaultHighlightColor = "#FFFF99";
-Ajax.InPlaceEditor.prototype = {
- initialize: function(element, url, options) {
- this.url = url;
- this.element = $(element);
-
- this.options = Object.extend({
- okButton: true,
- okText: "ok",
- cancelLink: true,
- cancelText: "cancel",
- savingText: "Saving...",
- clickToEditText: "Click to edit",
- okText: "ok",
- rows: 1,
- onComplete: function(transport, element) {
- new Effect.Highlight(element, {startcolor: this.options.highlightcolor});
- },
- onFailure: function(transport) {
- alert("Error communicating with the server: " + transport.responseText.stripTags());
- },
- callback: function(form) {
- return Form.serialize(form);
- },
- handleLineBreaks: true,
- loadingText: 'Loading...',
- savingClassName: 'inplaceeditor-saving',
- loadingClassName: 'inplaceeditor-loading',
- formClassName: 'inplaceeditor-form',
- highlightcolor: Ajax.InPlaceEditor.defaultHighlightColor,
- highlightendcolor: "#FFFFFF",
- externalControl: null,
- submitOnBlur: false,
- ajaxOptions: {},
- evalScripts: false
- }, options || {});
-
- if(!this.options.formId && this.element.id) {
- this.options.formId = this.element.id + "-inplaceeditor";
- if ($(this.options.formId)) {
- // there's already a form with that name, don't specify an id
- this.options.formId = null;
- }
- }
-
- if (this.options.externalControl) {
- this.options.externalControl = $(this.options.externalControl);
- }
-
- this.originalBackground = Element.getStyle(this.element, 'background-color');
- if (!this.originalBackground) {
- this.originalBackground = "transparent";
- }
-
- this.element.title = this.options.clickToEditText;
-
- this.onclickListener = this.enterEditMode.bindAsEventListener(this);
- this.mouseoverListener = this.enterHover.bindAsEventListener(this);
- this.mouseoutListener = this.leaveHover.bindAsEventListener(this);
- Event.observe(this.element, 'click', this.onclickListener);
- Event.observe(this.element, 'mouseover', this.mouseoverListener);
- Event.observe(this.element, 'mouseout', this.mouseoutListener);
- if (this.options.externalControl) {
- Event.observe(this.options.externalControl, 'click', this.onclickListener);
- Event.observe(this.options.externalControl, 'mouseover', this.mouseoverListener);
- Event.observe(this.options.externalControl, 'mouseout', this.mouseoutListener);
- }
- },
- enterEditMode: function(evt) {
- if (this.saving) return;
- if (this.editing) return;
- this.editing = true;
- this.onEnterEditMode();
- if (this.options.externalControl) {
- Element.hide(this.options.externalControl);
- }
- Element.hide(this.element);
- this.createForm();
- this.element.parentNode.insertBefore(this.form, this.element);
- if (!this.options.loadTextURL) Field.scrollFreeActivate(this.editField);
- // stop the event to avoid a page refresh in Safari
- if (evt) {
- Event.stop(evt);
- }
- return false;
- },
- createForm: function() {
- this.form = document.createElement("form");
- this.form.id = this.options.formId;
- Element.addClassName(this.form, this.options.formClassName)
- this.form.onsubmit = this.onSubmit.bind(this);
-
- this.createEditField();
-
- if (this.options.textarea) {
- var br = document.createElement("br");
- this.form.appendChild(br);
- }
-
- if (this.options.okButton) {
- okButton = document.createElement("input");
- okButton.type = "submit";
- okButton.value = this.options.okText;
- okButton.className = 'editor_ok_button';
- this.form.appendChild(okButton);
- }
-
- if (this.options.cancelLink) {
- cancelLink = document.createElement("a");
- cancelLink.href = "#";
- cancelLink.appendChild(document.createTextNode(this.options.cancelText));
- cancelLink.onclick = this.onclickCancel.bind(this);
- cancelLink.className = 'editor_cancel';
- this.form.appendChild(cancelLink);
- }
- },
- hasHTMLLineBreaks: function(string) {
- if (!this.options.handleLineBreaks) return false;
- return string.match(/<br/i) || string.match(/<p>/i);
- },
- convertHTMLLineBreaks: function(string) {
- return string.replace(/<br>/gi, "\n").replace(/<br\/>/gi, "\n").replace(/<\/p>/gi, "\n").replace(/<p>/gi, "");
- },
- createEditField: function() {
- var text;
- if(this.options.loadTextURL) {
- text = this.options.loadingText;
- } else {
- text = this.getText();
- }
-
- var obj = this;
-
- if (this.options.rows == 1 && !this.hasHTMLLineBreaks(text)) {
- this.options.textarea = false;
- var textField = document.createElement("input");
- textField.obj = this;
- textField.type = "text";
- textField.name = "value";
- textField.value = text;
- textField.style.backgroundColor = this.options.highlightcolor;
- textField.className = 'editor_field';
- var size = this.options.size || this.options.cols || 0;
- if (size != 0) textField.size = size;
- if (this.options.submitOnBlur)
- textField.onblur = this.onSubmit.bind(this);
- this.editField = textField;
- } else {
- this.options.textarea = true;
- var textArea = document.createElement("textarea");
- textArea.obj = this;
- textArea.name = "value";
- textArea.value = this.convertHTMLLineBreaks(text);
- textArea.rows = this.options.rows;
- textArea.cols = this.options.cols || 40;
- textArea.className = 'editor_field';
- if (this.options.submitOnBlur)
- textArea.onblur = this.onSubmit.bind(this);
- this.editField = textArea;
- }
-
- if(this.options.loadTextURL) {
- this.loadExternalText();
- }
- this.form.appendChild(this.editField);
- },
- getText: function() {
- return this.element.innerHTML;
- },
- loadExternalText: function() {
- Element.addClassName(this.form, this.options.loadingClassName);
- this.editField.disabled = true;
- new Ajax.Request(
- this.options.loadTextURL,
- Object.extend({
- asynchronous: true,
- onComplete: this.onLoadedExternalText.bind(this)
- }, this.options.ajaxOptions)
- );
- },
- onLoadedExternalText: function(transport) {
- Element.removeClassName(this.form, this.options.loadingClassName);
- this.editField.disabled = false;
- this.editField.value = transport.responseText.stripTags();
- Field.scrollFreeActivate(this.editField);
- },
- onclickCancel: function() {
- this.onComplete();
- this.leaveEditMode();
- return false;
- },
- onFailure: function(transport) {
- this.options.onFailure(transport);
- if (this.oldInnerHTML) {
- this.element.innerHTML = this.oldInnerHTML;
- this.oldInnerHTML = null;
- }
- return false;
- },
- onSubmit: function() {
- // onLoading resets these so we need to save them away for the Ajax call
- var form = this.form;
- var value = this.editField.value;
-
- // do this first, sometimes the ajax call returns before we get a chance to switch on Saving...
- // which means this will actually switch on Saving... *after* we've left edit mode causing Saving...
- // to be displayed indefinitely
- this.onLoading();
-
- if (this.options.evalScripts) {
- new Ajax.Request(
- this.url, Object.extend({
- parameters: this.options.callback(form, value),
- onComplete: this.onComplete.bind(this),
- onFailure: this.onFailure.bind(this),
- asynchronous:true,
- evalScripts:true
- }, this.options.ajaxOptions));
- } else {
- new Ajax.Updater(
- { success: this.element,
- // don't update on failure (this could be an option)
- failure: null },
- this.url, Object.extend({
- parameters: this.options.callback(form, value),
- onComplete: this.onComplete.bind(this),
- onFailure: this.onFailure.bind(this)
- }, this.options.ajaxOptions));
- }
- // stop the event to avoid a page refresh in Safari
- if (arguments.length > 1) {
- Event.stop(arguments[0]);
- }
- return false;
- },
- onLoading: function() {
- this.saving = true;
- this.removeForm();
- this.leaveHover();
- this.showSaving();
- },
- showSaving: function() {
- this.oldInnerHTML = this.element.innerHTML;
- this.element.innerHTML = this.options.savingText;
- Element.addClassName(this.element, this.options.savingClassName);
- this.element.style.backgroundColor = this.originalBackground;
- Element.show(this.element);
- },
- removeForm: function() {
- if(this.form) {
- if (this.form.parentNode) Element.remove(this.form);
- this.form = null;
- }
- },
- enterHover: function() {
- if (this.saving) return;
- this.element.style.backgroundColor = this.options.highlightcolor;
- if (this.effect) {
- this.effect.cancel();
- }
- Element.addClassName(this.element, this.options.hoverClassName)
- },
- leaveHover: function() {
- if (this.options.backgroundColor) {
- this.element.style.backgroundColor = this.oldBackground;
- }
- Element.removeClassName(this.element, this.options.hoverClassName)
- if (this.saving) return;
- this.effect = new Effect.Highlight(this.element, {
- startcolor: this.options.highlightcolor,
- endcolor: this.options.highlightendcolor,
- restorecolor: this.originalBackground
- });
- },
- leaveEditMode: function() {
- Element.removeClassName(this.element, this.options.savingClassName);
- this.removeForm();
- this.leaveHover();
- this.element.style.backgroundColor = this.originalBackground;
- Element.show(this.element);
- if (this.options.externalControl) {
- Element.show(this.options.externalControl);
- }
- this.editing = false;
- this.saving = false;
- this.oldInnerHTML = null;
- this.onLeaveEditMode();
- },
- onComplete: function(transport) {
- this.leaveEditMode();
- this.options.onComplete.bind(this)(transport, this.element);
- },
- onEnterEditMode: function() {},
- onLeaveEditMode: function() {},
- dispose: function() {
- if (this.oldInnerHTML) {
- this.element.innerHTML = this.oldInnerHTML;
- }
- this.leaveEditMode();
- Event.stopObserving(this.element, 'click', this.onclickListener);
- Event.stopObserving(this.element, 'mouseover', this.mouseoverListener);
- Event.stopObserving(this.element, 'mouseout', this.mouseoutListener);
- if (this.options.externalControl) {
- Event.stopObserving(this.options.externalControl, 'click', this.onclickListener);
- Event.stopObserving(this.options.externalControl, 'mouseover', this.mouseoverListener);
- Event.stopObserving(this.options.externalControl, 'mouseout', this.mouseoutListener);
- }
- }
-};
-
-Ajax.InPlaceCollectionEditor = Class.create();
-Object.extend(Ajax.InPlaceCollectionEditor.prototype, Ajax.InPlaceEditor.prototype);
-Object.extend(Ajax.InPlaceCollectionEditor.prototype, {
- createEditField: function() {
- if (!this.cached_selectTag) {
- var selectTag = document.createElement("select");
- var collection = this.options.collection || [];
- var optionTag;
- collection.each(function(e,i) {
- optionTag = document.createElement("option");
- optionTag.value = (e instanceof Array) ? e[0] : e;
- if((typeof this.options.value == 'undefined') &&
- ((e instanceof Array) ? this.element.innerHTML == e[1] : e == optionTag.value)) optionTag.selected = true;
- if(this.options.value==optionTag.value) optionTag.selected = true;
- optionTag.appendChild(document.createTextNode((e instanceof Array) ? e[1] : e));
- selectTag.appendChild(optionTag);
- }.bind(this));
- this.cached_selectTag = selectTag;
- }
-
- this.editField = this.cached_selectTag;
- if(this.options.loadTextURL) this.loadExternalText();
- this.form.appendChild(this.editField);
- this.options.callback = function(form, value) {
- return "value=" + encodeURIComponent(value);
- }
- }
-});
-
-// Delayed observer, like Form.Element.Observer,
-// but waits for delay after last key input
-// Ideal for live-search fields
-
-Form.Element.DelayedObserver = Class.create();
-Form.Element.DelayedObserver.prototype = {
- initialize: function(element, delay, callback) {
- this.delay = delay || 0.5;
- this.element = $(element);
- this.callback = callback;
- this.timer = null;
- this.lastValue = $F(this.element);
- Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this));
- },
- delayedListener: function(event) {
- if(this.lastValue == $F(this.element)) return;
- if(this.timer) clearTimeout(this.timer);
- this.timer = setTimeout(this.onTimerEvent.bind(this), this.delay * 1000);
- this.lastValue = $F(this.element);
- },
- onTimerEvent: function() {
- this.timer = null;
- this.callback(this.element, $F(this.element));
- }
-};
+// script.aculo.us controls.js v1.6.4, Wed Sep 06 11:30:58 CEST 2006\r
+\r
+// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)\r
+// (c) 2005 Ivan Krstic (http://blogs.law.harvard.edu/ivan)\r
+// (c) 2005 Jon Tirsen (http://www.tirsen.com)\r
+// Contributors:\r
+// Richard Livsey\r
+// Rahul Bhargava\r
+// Rob Wills\r
+// \r
+// See scriptaculous.js for full license.\r
+\r
+// Autocompleter.Base handles all the autocompletion functionality \r
+// that's independent of the data source for autocompletion. This\r
+// includes drawing the autocompletion menu, observing keyboard\r
+// and mouse events, and similar.\r
+//\r
+// Specific autocompleters need to provide, at the very least, \r
+// a getUpdatedChoices function that will be invoked every time\r
+// the text inside the monitored textbox changes. This method \r
+// should get the text for which to provide autocompletion by\r
+// invoking this.getToken(), NOT by directly accessing\r
+// this.element.value. This is to allow incremental tokenized\r
+// autocompletion. Specific auto-completion logic (AJAX, etc)\r
+// belongs in getUpdatedChoices.\r
+//\r
+// Tokenized incremental autocompletion is enabled automatically\r
+// when an autocompleter is instantiated with the 'tokens' option\r
+// in the options parameter, e.g.:\r
+// new Ajax.Autocompleter('id','upd', '/url/', { tokens: ',' });\r
+// will incrementally autocomplete with a comma as the token.\r
+// Additionally, ',' in the above example can be replaced with\r
+// a token array, e.g. { tokens: [',', '\n'] } which\r
+// enables autocompletion on multiple tokens. This is most \r
+// useful when one of the tokens is \n (a newline), as it \r
+// allows smart autocompletion after linebreaks.\r
+\r
+if(typeof Effect == 'undefined')\r
+ throw("controls.js requires including script.aculo.us' effects.js library");\r
+\r
+var Autocompleter = {}\r
+Autocompleter.Base = function() {};\r
+Autocompleter.Base.prototype = {\r
+ baseInitialize: function(element, update, options) {\r
+ this.element = $(element); \r
+ this.update = $(update); \r
+ this.hasFocus = false; \r
+ this.changed = false; \r
+ this.active = false; \r
+ this.index = 0; \r
+ this.entryCount = 0;\r
+\r
+ if(this.setOptions)\r
+ this.setOptions(options);\r
+ else\r
+ this.options = options || {};\r
+\r
+ this.options.paramName = this.options.paramName || this.element.name;\r
+ this.options.tokens = this.options.tokens || [];\r
+ this.options.frequency = this.options.frequency || 0.4;\r
+ this.options.minChars = this.options.minChars || 1;\r
+ this.options.onShow = this.options.onShow || \r
+ function(element, update){ \r
+ if(!update.style.position || update.style.position=='absolute') {\r
+ update.style.position = 'absolute';\r
+ Position.clone(element, update, {\r
+ setHeight: false, \r
+ offsetTop: element.offsetHeight\r
+ });\r
+ }\r
+ Effect.Appear(update,{duration:0.15});\r
+ };\r
+ this.options.onHide = this.options.onHide || \r
+ function(element, update){ new Effect.Fade(update,{duration:0.15}) };\r
+\r
+ if(typeof(this.options.tokens) == 'string') \r
+ this.options.tokens = new Array(this.options.tokens);\r
+\r
+ this.observer = null;\r
+ \r
+ this.element.setAttribute('autocomplete','off');\r
+\r
+ Element.hide(this.update);\r
+\r
+ Event.observe(this.element, "blur", this.onBlur.bindAsEventListener(this));\r
+ Event.observe(this.element, "keypress", this.onKeyPress.bindAsEventListener(this));\r
+ },\r
+\r
+ show: function() {\r
+ if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update);\r
+ if(!this.iefix && \r
+ (navigator.appVersion.indexOf('MSIE')>0) &&\r
+ (navigator.userAgent.indexOf('Opera')<0) &&\r
+ (Element.getStyle(this.update, 'position')=='absolute')) {\r
+ new Insertion.After(this.update, \r
+ '<iframe id="' + this.update.id + '_iefix" '+\r
+ 'style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" ' +\r
+ 'src="javascript:false;" frameborder="0" scrolling="no"></iframe>');\r
+ this.iefix = $(this.update.id+'_iefix');\r
+ }\r
+ if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this), 50);\r
+ },\r
+ \r
+ fixIEOverlapping: function() {\r
+ Position.clone(this.update, this.iefix, {setTop:(!this.update.style.height)});\r
+ this.iefix.style.zIndex = 1;\r
+ this.update.style.zIndex = 2;\r
+ Element.show(this.iefix);\r
+ },\r
+\r
+ hide: function() {\r
+ this.stopIndicator();\r
+ if(Element.getStyle(this.update, 'display')!='none') this.options.onHide(this.element, this.update);\r
+ if(this.iefix) Element.hide(this.iefix);\r
+ },\r
+\r
+ startIndicator: function() {\r
+ if(this.options.indicator) Element.show(this.options.indicator);\r
+ },\r
+\r
+ stopIndicator: function() {\r
+ if(this.options.indicator) Element.hide(this.options.indicator);\r
+ },\r
+\r
+ onKeyPress: function(event) {\r
+ if(this.active)\r
+ switch(event.keyCode) {\r
+ case Event.KEY_TAB:\r
+ case Event.KEY_RETURN:\r
+ this.selectEntry();\r
+ Event.stop(event);\r
+ case Event.KEY_ESC:\r
+ this.hide();\r
+ this.active = false;\r
+ Event.stop(event);\r
+ return;\r
+ case Event.KEY_LEFT:\r
+ case Event.KEY_RIGHT:\r
+ return;\r
+ case Event.KEY_UP:\r
+ this.markPrevious();\r
+ this.render();\r
+ if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event);\r
+ return;\r
+ case Event.KEY_DOWN:\r
+ this.markNext();\r
+ this.render();\r
+ if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event);\r
+ return;\r
+ }\r
+ else \r
+ if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN || \r
+ (navigator.appVersion.indexOf('AppleWebKit') > 0 && event.keyCode == 0)) return;\r
+\r
+ this.changed = true;\r
+ this.hasFocus = true;\r
+\r
+ if(this.observer) clearTimeout(this.observer);\r
+ this.observer = \r
+ setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000);\r
+ },\r
+\r
+ activate: function() {\r
+ this.changed = false;\r
+ this.hasFocus = true;\r
+ this.getUpdatedChoices();\r
+ },\r
+\r
+ onHover: function(event) {\r
+ var element = Event.findElement(event, 'LI');\r
+ if(this.index != element.autocompleteIndex) \r
+ {\r
+ this.index = element.autocompleteIndex;\r
+ this.render();\r
+ }\r
+ Event.stop(event);\r
+ },\r
+ \r
+ onClick: function(event) {\r
+ var element = Event.findElement(event, 'LI');\r
+ this.index = element.autocompleteIndex;\r
+ this.selectEntry();\r
+ this.hide();\r
+ },\r
+ \r
+ onBlur: function(event) {\r
+ // needed to make click events working\r
+ setTimeout(this.hide.bind(this), 250);\r
+ this.hasFocus = false;\r
+ this.active = false; \r
+ }, \r
+ \r
+ render: function() {\r
+ if(this.entryCount > 0) {\r
+ for (var i = 0; i < this.entryCount; i++)\r
+ this.index==i ? \r
+ Element.addClassName(this.getEntry(i),"selected") : \r
+ Element.removeClassName(this.getEntry(i),"selected");\r
+ \r
+ if(this.hasFocus) { \r
+ this.show();\r
+ this.active = true;\r
+ }\r
+ } else {\r
+ this.active = false;\r
+ this.hide();\r
+ }\r
+ },\r
+ \r
+ markPrevious: function() {\r
+ if(this.index > 0) this.index--\r
+ else this.index = this.entryCount-1;\r
+ this.getEntry(this.index).scrollIntoView(true);\r
+ },\r
+ \r
+ markNext: function() {\r
+ if(this.index < this.entryCount-1) this.index++\r
+ else this.index = 0;\r
+ this.getEntry(this.index).scrollIntoView(false);\r
+ },\r
+ \r
+ getEntry: function(index) {\r
+ return this.update.firstChild.childNodes[index];\r
+ },\r
+ \r
+ getCurrentEntry: function() {\r
+ return this.getEntry(this.index);\r
+ },\r
+ \r
+ selectEntry: function() {\r
+ this.active = false;\r
+ this.updateElement(this.getCurrentEntry());\r
+ },\r
+\r
+ updateElement: function(selectedElement) {\r
+ if (this.options.updateElement) {\r
+ this.options.updateElement(selectedElement);\r
+ return;\r
+ }\r
+ var value = '';\r
+ if (this.options.select) {\r
+ var nodes = document.getElementsByClassName(this.options.select, selectedElement) || [];\r
+ if(nodes.length>0) value = Element.collectTextNodes(nodes[0], this.options.select);\r
+ } else\r
+ value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal');\r
+ \r
+ var lastTokenPos = this.findLastToken();\r
+ if (lastTokenPos != -1) {\r
+ var newValue = this.element.value.substr(0, lastTokenPos + 1);\r
+ var whitespace = this.element.value.substr(lastTokenPos + 1).match(/^\s+/);\r
+ if (whitespace)\r
+ newValue += whitespace[0];\r
+ this.element.value = newValue + value;\r
+ } else {\r
+ this.element.value = value;\r
+ }\r
+ this.element.focus();\r
+ \r
+ if (this.options.afterUpdateElement)\r
+ this.options.afterUpdateElement(this.element, selectedElement);\r
+ },\r
+\r
+ updateChoices: function(choices) {\r
+ if(!this.changed && this.hasFocus) {\r
+ this.update.innerHTML = choices;\r
+ Element.cleanWhitespace(this.update);\r
+ Element.cleanWhitespace(this.update.firstChild);\r
+\r
+ if(this.update.firstChild && this.update.firstChild.childNodes) {\r
+ this.entryCount = \r
+ this.update.firstChild.childNodes.length;\r
+ for (var i = 0; i < this.entryCount; i++) {\r
+ var entry = this.getEntry(i);\r
+ entry.autocompleteIndex = i;\r
+ this.addObservers(entry);\r
+ }\r
+ } else { \r
+ this.entryCount = 0;\r
+ }\r
+\r
+ this.stopIndicator();\r
+ this.index = 0;\r
+ \r
+ if(this.entryCount==1 && this.options.autoSelect) {\r
+ this.selectEntry();\r
+ this.hide();\r
+ } else {\r
+ this.render();\r
+ }\r
+ }\r
+ },\r
+\r
+ addObservers: function(element) {\r
+ Event.observe(element, "mouseover", this.onHover.bindAsEventListener(this));\r
+ Event.observe(element, "click", this.onClick.bindAsEventListener(this));\r
+ },\r
+\r
+ onObserverEvent: function() {\r
+ this.changed = false; \r
+ if(this.getToken().length>=this.options.minChars) {\r
+ this.startIndicator();\r
+ this.getUpdatedChoices();\r
+ } else {\r
+ this.active = false;\r
+ this.hide();\r
+ }\r
+ },\r
+\r
+ getToken: function() {\r
+ var tokenPos = this.findLastToken();\r
+ if (tokenPos != -1)\r
+ var ret = this.element.value.substr(tokenPos + 1).replace(/^\s+/,'').replace(/\s+$/,'');\r
+ else\r
+ var ret = this.element.value;\r
+\r
+ return /\n/.test(ret) ? '' : ret;\r
+ },\r
+\r
+ findLastToken: function() {\r
+ var lastTokenPos = -1;\r
+\r
+ for (var i=0; i<this.options.tokens.length; i++) {\r
+ var thisTokenPos = this.element.value.lastIndexOf(this.options.tokens[i]);\r
+ if (thisTokenPos > lastTokenPos)\r
+ lastTokenPos = thisTokenPos;\r
+ }\r
+ return lastTokenPos;\r
+ }\r
+}\r
+\r
+Ajax.Autocompleter = Class.create();\r
+Object.extend(Object.extend(Ajax.Autocompleter.prototype, Autocompleter.Base.prototype), {\r
+ initialize: function(element, update, url, options) {\r
+ this.baseInitialize(element, update, options);\r
+ this.options.asynchronous = true;\r
+ this.options.onComplete = this.onComplete.bind(this);\r
+ this.options.defaultParams = this.options.parameters || null;\r
+ this.url = url;\r
+ },\r
+\r
+ getUpdatedChoices: function() {\r
+ entry = encodeURIComponent(this.options.paramName) + '=' + \r
+ encodeURIComponent(this.getToken());\r
+\r
+ this.options.parameters = this.options.callback ?\r
+ this.options.callback(this.element, entry) : entry;\r
+\r
+ if(this.options.defaultParams) \r
+ this.options.parameters += '&' + this.options.defaultParams;\r
+\r
+ new Ajax.Request(this.url, this.options);\r
+ },\r
+\r
+ onComplete: function(request) {\r
+ this.updateChoices(request.responseText);\r
+ }\r
+\r
+});\r
+\r
+// The local array autocompleter. Used when you'd prefer to\r
+// inject an array of autocompletion options into the page, rather\r
+// than sending out Ajax queries, which can be quite slow sometimes.\r
+//\r
+// The constructor takes four parameters. The first two are, as usual,\r
+// the id of the monitored textbox, and id of the autocompletion menu.\r
+// The third is the array you want to autocomplete from, and the fourth\r
+// is the options block.\r
+//\r
+// Extra local autocompletion options:\r
+// - choices - How many autocompletion choices to offer\r
+//\r
+// - partialSearch - If false, the autocompleter will match entered\r
+// text only at the beginning of strings in the \r
+// autocomplete array. Defaults to true, which will\r
+// match text at the beginning of any *word* in the\r
+// strings in the autocomplete array. If you want to\r
+// search anywhere in the string, additionally set\r
+// the option fullSearch to true (default: off).\r
+//\r
+// - fullSsearch - Search anywhere in autocomplete array strings.\r
+//\r
+// - partialChars - How many characters to enter before triggering\r
+// a partial match (unlike minChars, which defines\r
+// how many characters are required to do any match\r
+// at all). Defaults to 2.\r
+//\r
+// - ignoreCase - Whether to ignore case when autocompleting.\r
+// Defaults to true.\r
+//\r
+// It's possible to pass in a custom function as the 'selector' \r
+// option, if you prefer to write your own autocompletion logic.\r
+// In that case, the other options above will not apply unless\r
+// you support them.\r
+\r
+Autocompleter.Local = Class.create();\r
+Autocompleter.Local.prototype = Object.extend(new Autocompleter.Base(), {\r
+ initialize: function(element, update, array, options) {\r
+ this.baseInitialize(element, update, options);\r
+ this.options.array = array;\r
+ },\r
+\r
+ getUpdatedChoices: function() {\r
+ this.updateChoices(this.options.selector(this));\r
+ },\r
+\r
+ setOptions: function(options) {\r
+ this.options = Object.extend({\r
+ choices: 10,\r
+ partialSearch: true,\r
+ partialChars: 2,\r
+ ignoreCase: true,\r
+ fullSearch: false,\r
+ selector: function(instance) {\r
+ var ret = []; // Beginning matches\r
+ var partial = []; // Inside matches\r
+ var entry = instance.getToken();\r
+ var count = 0;\r
+\r
+ for (var i = 0; i < instance.options.array.length && \r
+ ret.length < instance.options.choices ; i++) { \r
+\r
+ var elem = instance.options.array[i];\r
+ var foundPos = instance.options.ignoreCase ? \r
+ elem.toLowerCase().indexOf(entry.toLowerCase()) : \r
+ elem.indexOf(entry);\r
+\r
+ while (foundPos != -1) {\r
+ if (foundPos == 0 && elem.length != entry.length) { \r
+ ret.push("<li><strong>" + elem.substr(0, entry.length) + "</strong>" + \r
+ elem.substr(entry.length) + "</li>");\r
+ break;\r
+ } else if (entry.length >= instance.options.partialChars && \r
+ instance.options.partialSearch && foundPos != -1) {\r
+ if (instance.options.fullSearch || /\s/.test(elem.substr(foundPos-1,1))) {\r
+ partial.push("<li>" + elem.substr(0, foundPos) + "<strong>" +\r
+ elem.substr(foundPos, entry.length) + "</strong>" + elem.substr(\r
+ foundPos + entry.length) + "</li>");\r
+ break;\r
+ }\r
+ }\r
+\r
+ foundPos = instance.options.ignoreCase ? \r
+ elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) : \r
+ elem.indexOf(entry, foundPos + 1);\r
+\r
+ }\r
+ }\r
+ if (partial.length)\r
+ ret = ret.concat(partial.slice(0, instance.options.choices - ret.length))\r
+ return "<ul>" + ret.join('') + "</ul>";\r
+ }\r
+ }, options || {});\r
+ }\r
+});\r
+\r
+// AJAX in-place editor\r
+//\r
+// see documentation on http://wiki.script.aculo.us/scriptaculous/show/Ajax.InPlaceEditor\r
+\r
+// Use this if you notice weird scrolling problems on some browsers,\r
+// the DOM might be a bit confused when this gets called so do this\r
+// waits 1 ms (with setTimeout) until it does the activation\r
+Field.scrollFreeActivate = function(field) {\r
+ setTimeout(function() {\r
+ Field.activate(field);\r
+ }, 1);\r
+}\r
+\r
+Ajax.InPlaceEditor = Class.create();\r
+Ajax.InPlaceEditor.defaultHighlightColor = "#FFFF99";\r
+Ajax.InPlaceEditor.prototype = {\r
+ initialize: function(element, url, options) {\r
+ this.url = url;\r
+ this.element = $(element);\r
+\r
+ this.options = Object.extend({\r
+ okButton: true,\r
+ okText: "ok",\r
+ cancelLink: true,\r
+ cancelText: "cancel",\r
+ savingText: "Saving...",\r
+ clickToEditText: "Click to edit",\r
+ okText: "ok",\r
+ rows: 1,\r
+ onComplete: function(transport, element) {\r
+ new Effect.Highlight(element, {startcolor: this.options.highlightcolor});\r
+ },\r
+ onFailure: function(transport) {\r
+ alert("Error communicating with the server: " + transport.responseText.stripTags());\r
+ },\r
+ callback: function(form) {\r
+ return Form.serialize(form);\r
+ },\r
+ handleLineBreaks: true,\r
+ loadingText: 'Loading...',\r
+ savingClassName: 'inplaceeditor-saving',\r
+ loadingClassName: 'inplaceeditor-loading',\r
+ formClassName: 'inplaceeditor-form',\r
+ highlightcolor: Ajax.InPlaceEditor.defaultHighlightColor,\r
+ highlightendcolor: "#FFFFFF",\r
+ externalControl: null,\r
+ submitOnBlur: false,\r
+ ajaxOptions: {},\r
+ evalScripts: false\r
+ }, options || {});\r
+\r
+ if(!this.options.formId && this.element.id) {\r
+ this.options.formId = this.element.id + "-inplaceeditor";\r
+ if ($(this.options.formId)) {\r
+ // there's already a form with that name, don't specify an id\r
+ this.options.formId = null;\r
+ }\r
+ }\r
+ \r
+ if (this.options.externalControl) {\r
+ this.options.externalControl = $(this.options.externalControl);\r
+ }\r
+ \r
+ this.originalBackground = Element.getStyle(this.element, 'background-color');\r
+ if (!this.originalBackground) {\r
+ this.originalBackground = "transparent";\r
+ }\r
+ \r
+ this.element.title = this.options.clickToEditText;\r
+ \r
+ this.onclickListener = this.enterEditMode.bindAsEventListener(this);\r
+ this.mouseoverListener = this.enterHover.bindAsEventListener(this);\r
+ this.mouseoutListener = this.leaveHover.bindAsEventListener(this);\r
+ Event.observe(this.element, 'click', this.onclickListener);\r
+ Event.observe(this.element, 'mouseover', this.mouseoverListener);\r
+ Event.observe(this.element, 'mouseout', this.mouseoutListener);\r
+ if (this.options.externalControl) {\r
+ Event.observe(this.options.externalControl, 'click', this.onclickListener);\r
+ Event.observe(this.options.externalControl, 'mouseover', this.mouseoverListener);\r
+ Event.observe(this.options.externalControl, 'mouseout', this.mouseoutListener);\r
+ }\r
+ },\r
+ enterEditMode: function(evt) {\r
+ if (this.saving) return;\r
+ if (this.editing) return;\r
+ this.editing = true;\r
+ this.onEnterEditMode();\r
+ if (this.options.externalControl) {\r
+ Element.hide(this.options.externalControl);\r
+ }\r
+ Element.hide(this.element);\r
+ this.createForm();\r
+ this.element.parentNode.insertBefore(this.form, this.element);\r
+ if (!this.options.loadTextURL) Field.scrollFreeActivate(this.editField);\r
+ // stop the event to avoid a page refresh in Safari\r
+ if (evt) {\r
+ Event.stop(evt);\r
+ }\r
+ return false;\r
+ },\r
+ createForm: function() {\r
+ this.form = document.createElement("form");\r
+ this.form.id = this.options.formId;\r
+ Element.addClassName(this.form, this.options.formClassName)\r
+ this.form.onsubmit = this.onSubmit.bind(this);\r
+\r
+ this.createEditField();\r
+\r
+ if (this.options.textarea) {\r
+ var br = document.createElement("br");\r
+ this.form.appendChild(br);\r
+ }\r
+\r
+ if (this.options.okButton) {\r
+ okButton = document.createElement("input");\r
+ okButton.type = "submit";\r
+ okButton.value = this.options.okText;\r
+ okButton.className = 'editor_ok_button';\r
+ this.form.appendChild(okButton);\r
+ }\r
+\r
+ if (this.options.cancelLink) {\r
+ cancelLink = document.createElement("a");\r
+ cancelLink.href = "#";\r
+ cancelLink.appendChild(document.createTextNode(this.options.cancelText));\r
+ cancelLink.onclick = this.onclickCancel.bind(this);\r
+ cancelLink.className = 'editor_cancel'; \r
+ this.form.appendChild(cancelLink);\r
+ }\r
+ },\r
+ hasHTMLLineBreaks: function(string) {\r
+ if (!this.options.handleLineBreaks) return false;\r
+ return string.match(/<br/i) || string.match(/<p>/i);\r
+ },\r
+ convertHTMLLineBreaks: function(string) {\r
+ return string.replace(/<br>/gi, "\n").replace(/<br\/>/gi, "\n").replace(/<\/p>/gi, "\n").replace(/<p>/gi, "");\r
+ },\r
+ createEditField: function() {\r
+ var text;\r
+ if(this.options.loadTextURL) {\r
+ text = this.options.loadingText;\r
+ } else {\r
+ text = this.getText();\r
+ }\r
+\r
+ var obj = this;\r
+ \r
+ if (this.options.rows == 1 && !this.hasHTMLLineBreaks(text)) {\r
+ this.options.textarea = false;\r
+ var textField = document.createElement("input");\r
+ textField.obj = this;\r
+ textField.type = "text";\r
+ textField.name = "value";\r
+ textField.value = text;\r
+ textField.style.backgroundColor = this.options.highlightcolor;\r
+ textField.className = 'editor_field';\r
+ var size = this.options.size || this.options.cols || 0;\r
+ if (size != 0) textField.size = size;\r
+ if (this.options.submitOnBlur)\r
+ textField.onblur = this.onSubmit.bind(this);\r
+ this.editField = textField;\r
+ } else {\r
+ this.options.textarea = true;\r
+ var textArea = document.createElement("textarea");\r
+ textArea.obj = this;\r
+ textArea.name = "value";\r
+ textArea.value = this.convertHTMLLineBreaks(text);\r
+ textArea.rows = this.options.rows;\r
+ textArea.cols = this.options.cols || 40;\r
+ textArea.className = 'editor_field'; \r
+ if (this.options.submitOnBlur)\r
+ textArea.onblur = this.onSubmit.bind(this);\r
+ this.editField = textArea;\r
+ }\r
+ \r
+ if(this.options.loadTextURL) {\r
+ this.loadExternalText();\r
+ }\r
+ this.form.appendChild(this.editField);\r
+ },\r
+ getText: function() {\r
+ return this.element.innerHTML;\r
+ },\r
+ loadExternalText: function() {\r
+ Element.addClassName(this.form, this.options.loadingClassName);\r
+ this.editField.disabled = true;\r
+ new Ajax.Request(\r
+ this.options.loadTextURL,\r
+ Object.extend({\r
+ asynchronous: true,\r
+ onComplete: this.onLoadedExternalText.bind(this)\r
+ }, this.options.ajaxOptions)\r
+ );\r
+ },\r
+ onLoadedExternalText: function(transport) {\r
+ Element.removeClassName(this.form, this.options.loadingClassName);\r
+ this.editField.disabled = false;\r
+ this.editField.value = transport.responseText.stripTags();\r
+ Field.scrollFreeActivate(this.editField);\r
+ },\r
+ onclickCancel: function() {\r
+ this.onComplete();\r
+ this.leaveEditMode();\r
+ return false;\r
+ },\r
+ onFailure: function(transport) {\r
+ this.options.onFailure(transport);\r
+ if (this.oldInnerHTML) {\r
+ this.element.innerHTML = this.oldInnerHTML;\r
+ this.oldInnerHTML = null;\r
+ }\r
+ return false;\r
+ },\r
+ onSubmit: function() {\r
+ // onLoading resets these so we need to save them away for the Ajax call\r
+ var form = this.form;\r
+ var value = this.editField.value;\r
+ \r
+ // do this first, sometimes the ajax call returns before we get a chance to switch on Saving...\r
+ // which means this will actually switch on Saving... *after* we've left edit mode causing Saving...\r
+ // to be displayed indefinitely\r
+ this.onLoading();\r
+ \r
+ if (this.options.evalScripts) {\r
+ new Ajax.Request(\r
+ this.url, Object.extend({\r
+ parameters: this.options.callback(form, value),\r
+ onComplete: this.onComplete.bind(this),\r
+ onFailure: this.onFailure.bind(this),\r
+ asynchronous:true, \r
+ evalScripts:true\r
+ }, this.options.ajaxOptions));\r
+ } else {\r
+ new Ajax.Updater(\r
+ { success: this.element,\r
+ // don't update on failure (this could be an option)\r
+ failure: null }, \r
+ this.url, Object.extend({\r
+ parameters: this.options.callback(form, value),\r
+ onComplete: this.onComplete.bind(this),\r
+ onFailure: this.onFailure.bind(this)\r
+ }, this.options.ajaxOptions));\r
+ }\r
+ // stop the event to avoid a page refresh in Safari\r
+ if (arguments.length > 1) {\r
+ Event.stop(arguments[0]);\r
+ }\r
+ return false;\r
+ },\r
+ onLoading: function() {\r
+ this.saving = true;\r
+ this.removeForm();\r
+ this.leaveHover();\r
+ this.showSaving();\r
+ },\r
+ showSaving: function() {\r
+ this.oldInnerHTML = this.element.innerHTML;\r
+ this.element.innerHTML = this.options.savingText;\r
+ Element.addClassName(this.element, this.options.savingClassName);\r
+ this.element.style.backgroundColor = this.originalBackground;\r
+ Element.show(this.element);\r
+ },\r
+ removeForm: function() {\r
+ if(this.form) {\r
+ if (this.form.parentNode) Element.remove(this.form);\r
+ this.form = null;\r
+ }\r
+ },\r
+ enterHover: function() {\r
+ if (this.saving) return;\r
+ this.element.style.backgroundColor = this.options.highlightcolor;\r
+ if (this.effect) {\r
+ this.effect.cancel();\r
+ }\r
+ Element.addClassName(this.element, this.options.hoverClassName)\r
+ },\r
+ leaveHover: function() {\r
+ if (this.options.backgroundColor) {\r
+ this.element.style.backgroundColor = this.oldBackground;\r
+ }\r
+ Element.removeClassName(this.element, this.options.hoverClassName)\r
+ if (this.saving) return;\r
+ this.effect = new Effect.Highlight(this.element, {\r
+ startcolor: this.options.highlightcolor,\r
+ endcolor: this.options.highlightendcolor,\r
+ restorecolor: this.originalBackground\r
+ });\r
+ },\r
+ leaveEditMode: function() {\r
+ Element.removeClassName(this.element, this.options.savingClassName);\r
+ this.removeForm();\r
+ this.leaveHover();\r
+ this.element.style.backgroundColor = this.originalBackground;\r
+ Element.show(this.element);\r
+ if (this.options.externalControl) {\r
+ Element.show(this.options.externalControl);\r
+ }\r
+ this.editing = false;\r
+ this.saving = false;\r
+ this.oldInnerHTML = null;\r
+ this.onLeaveEditMode();\r
+ },\r
+ onComplete: function(transport) {\r
+ this.leaveEditMode();\r
+ this.options.onComplete.bind(this)(transport, this.element);\r
+ },\r
+ onEnterEditMode: function() {},\r
+ onLeaveEditMode: function() {},\r
+ dispose: function() {\r
+ if (this.oldInnerHTML) {\r
+ this.element.innerHTML = this.oldInnerHTML;\r
+ }\r
+ this.leaveEditMode();\r
+ Event.stopObserving(this.element, 'click', this.onclickListener);\r
+ Event.stopObserving(this.element, 'mouseover', this.mouseoverListener);\r
+ Event.stopObserving(this.element, 'mouseout', this.mouseoutListener);\r
+ if (this.options.externalControl) {\r
+ Event.stopObserving(this.options.externalControl, 'click', this.onclickListener);\r
+ Event.stopObserving(this.options.externalControl, 'mouseover', this.mouseoverListener);\r
+ Event.stopObserving(this.options.externalControl, 'mouseout', this.mouseoutListener);\r
+ }\r
+ }\r
+};\r
+\r
+Ajax.InPlaceCollectionEditor = Class.create();\r
+Object.extend(Ajax.InPlaceCollectionEditor.prototype, Ajax.InPlaceEditor.prototype);\r
+Object.extend(Ajax.InPlaceCollectionEditor.prototype, {\r
+ createEditField: function() {\r
+ if (!this.cached_selectTag) {\r
+ var selectTag = document.createElement("select");\r
+ var collection = this.options.collection || [];\r
+ var optionTag;\r
+ collection.each(function(e,i) {\r
+ optionTag = document.createElement("option");\r
+ optionTag.value = (e instanceof Array) ? e[0] : e;\r
+ if((typeof this.options.value == 'undefined') && \r
+ ((e instanceof Array) ? this.element.innerHTML == e[1] : e == optionTag.value)) optionTag.selected = true;\r
+ if(this.options.value==optionTag.value) optionTag.selected = true;\r
+ optionTag.appendChild(document.createTextNode((e instanceof Array) ? e[1] : e));\r
+ selectTag.appendChild(optionTag);\r
+ }.bind(this));\r
+ this.cached_selectTag = selectTag;\r
+ }\r
+\r
+ this.editField = this.cached_selectTag;\r
+ if(this.options.loadTextURL) this.loadExternalText();\r
+ this.form.appendChild(this.editField);\r
+ this.options.callback = function(form, value) {\r
+ return "value=" + encodeURIComponent(value);\r
+ }\r
+ }\r
+});\r
+\r
+// Delayed observer, like Form.Element.Observer, \r
+// but waits for delay after last key input\r
+// Ideal for live-search fields\r
+\r
+Form.Element.DelayedObserver = Class.create();\r
+Form.Element.DelayedObserver.prototype = {\r
+ initialize: function(element, delay, callback) {\r
+ this.delay = delay || 0.5;\r
+ this.element = $(element);\r
+ this.callback = callback;\r
+ this.timer = null;\r
+ this.lastValue = $F(this.element); \r
+ Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this));\r
+ },\r
+ delayedListener: function(event) {\r
+ if(this.lastValue == $F(this.element)) return;\r
+ if(this.timer) clearTimeout(this.timer);\r
+ this.timer = setTimeout(this.onTimerEvent.bind(this), this.delay * 1000);\r
+ this.lastValue = $F(this.element);\r
+ },\r
+ onTimerEvent: function() {\r
+ this.timer = null;\r
+ this.callback(this.element, $F(this.element));\r
+ }\r
+};\r
-// script.aculo.us dragdrop.js v1.6.4, Wed Sep 06 11:30:58 CEST 2006
-
-// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-// (c) 2005 Sammi Williams (http://www.oriontransfer.co.nz, sammi@oriontransfer.co.nz)
-//
-// See scriptaculous.js for full license.
-
-/*--------------------------------------------------------------------------*/
-
-if(typeof Effect == 'undefined')
- throw("dragdrop.js requires including script.aculo.us' effects.js library");
-
-var Droppables = {
- drops: [],
-
- remove: function(element) {
- this.drops = this.drops.reject(function(d) { return d.element==$(element) });
- },
-
- add: function(element) {
- element = $(element);
- var options = Object.extend({
- greedy: true,
- hoverclass: null,
- tree: false
- }, arguments[1] || {});
-
- // cache containers
- if(options.containment) {
- options._containers = [];
- var containment = options.containment;
- if((typeof containment == 'object') &&
- (containment.constructor == Array)) {
- containment.each( function(c) { options._containers.push($(c)) });
- } else {
- options._containers.push($(containment));
- }
- }
-
- if(options.accept) options.accept = [options.accept].flatten();
-
- Element.makePositioned(element); // fix IE
- options.element = element;
-
- this.drops.push(options);
- },
-
- findDeepestChild: function(drops) {
- deepest = drops[0];
-
- for (i = 1; i < drops.length; ++i)
- if (Element.isParent(drops[i].element, deepest.element))
- deepest = drops[i];
-
- return deepest;
- },
-
- isContained: function(element, drop) {
- var containmentNode;
- if(drop.tree) {
- containmentNode = element.treeNode;
- } else {
- containmentNode = element.parentNode;
- }
- return drop._containers.detect(function(c) { return containmentNode == c });
- },
-
- isAffected: function(point, element, drop) {
- return (
- (drop.element!=element) &&
- ((!drop._containers) ||
- this.isContained(element, drop)) &&
- ((!drop.accept) ||
- (Element.classNames(element).detect(
- function(v) { return drop.accept.include(v) } ) )) &&
- Position.within(drop.element, point[0], point[1]) );
- },
-
- deactivate: function(drop) {
- if(drop.hoverclass)
- Element.removeClassName(drop.element, drop.hoverclass);
- this.last_active = null;
- },
-
- activate: function(drop) {
- if(drop.hoverclass)
- Element.addClassName(drop.element, drop.hoverclass);
- this.last_active = drop;
- },
-
- show: function(point, element) {
- if(!this.drops.length) return;
- var affected = [];
-
- if(this.last_active) this.deactivate(this.last_active);
- this.drops.each( function(drop) {
- if(Droppables.isAffected(point, element, drop))
- affected.push(drop);
- });
-
- if(affected.length>0) {
- drop = Droppables.findDeepestChild(affected);
- Position.within(drop.element, point[0], point[1]);
- if(drop.onHover)
- drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element));
-
- Droppables.activate(drop);
- }
- },
-
- fire: function(event, element) {
- if(!this.last_active) return;
- Position.prepare();
-
- if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active))
- if (this.last_active.onDrop)
- this.last_active.onDrop(element, this.last_active.element, event);
- },
-
- reset: function() {
- if(this.last_active)
- this.deactivate(this.last_active);
- }
-}
-
-var Draggables = {
- drags: [],
- observers: [],
-
- register: function(draggable) {
- if(this.drags.length == 0) {
- this.eventMouseUp = this.endDrag.bindAsEventListener(this);
- this.eventMouseMove = this.updateDrag.bindAsEventListener(this);
- this.eventKeypress = this.keyPress.bindAsEventListener(this);
-
- Event.observe(document, "mouseup", this.eventMouseUp);
- Event.observe(document, "mousemove", this.eventMouseMove);
- Event.observe(document, "keypress", this.eventKeypress);
- }
- this.drags.push(draggable);
- },
-
- unregister: function(draggable) {
- this.drags = this.drags.reject(function(d) { return d==draggable });
- if(this.drags.length == 0) {
- Event.stopObserving(document, "mouseup", this.eventMouseUp);
- Event.stopObserving(document, "mousemove", this.eventMouseMove);
- Event.stopObserving(document, "keypress", this.eventKeypress);
- }
- },
-
- activate: function(draggable) {
- if(draggable.options.delay) {
- this._timeout = setTimeout(function() {
- Draggables._timeout = null;
- window.focus();
- Draggables.activeDraggable = draggable;
- }.bind(this), draggable.options.delay);
- } else {
- window.focus(); // allows keypress events if window isn't currently focused, fails for Safari
- this.activeDraggable = draggable;
- }
- },
-
- deactivate: function() {
- this.activeDraggable = null;
- },
-
- updateDrag: function(event) {
- if(!this.activeDraggable) return;
- var pointer = [Event.pointerX(event), Event.pointerY(event)];
- // Mozilla-based browsers fire successive mousemove events with
- // the same coordinates, prevent needless redrawing (moz bug?)
- if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return;
- this._lastPointer = pointer;
-
- this.activeDraggable.updateDrag(event, pointer);
- },
-
- endDrag: function(event) {
- if(this._timeout) {
- clearTimeout(this._timeout);
- this._timeout = null;
- }
- if(!this.activeDraggable) return;
- this._lastPointer = null;
- this.activeDraggable.endDrag(event);
- this.activeDraggable = null;
- },
-
- keyPress: function(event) {
- if(this.activeDraggable)
- this.activeDraggable.keyPress(event);
- },
-
- addObserver: function(observer) {
- this.observers.push(observer);
- this._cacheObserverCallbacks();
- },
-
- removeObserver: function(element) { // element instead of observer fixes mem leaks
- this.observers = this.observers.reject( function(o) { return o.element==element });
- this._cacheObserverCallbacks();
- },
-
- notify: function(eventName, draggable, event) { // 'onStart', 'onEnd', 'onDrag'
- if(this[eventName+'Count'] > 0)
- this.observers.each( function(o) {
- if(o[eventName]) o[eventName](eventName, draggable, event);
- });
- if(draggable.options[eventName]) draggable.options[eventName](draggable, event);
- },
-
- _cacheObserverCallbacks: function() {
- ['onStart','onEnd','onDrag'].each( function(eventName) {
- Draggables[eventName+'Count'] = Draggables.observers.select(
- function(o) { return o[eventName]; }
- ).length;
- });
- }
-}
-
-/*--------------------------------------------------------------------------*/
-
-var Draggable = Class.create();
-Draggable._dragging = {};
-
-Draggable.prototype = {
- initialize: function(element) {
- var defaults = {
- handle: false,
- reverteffect: function(element, top_offset, left_offset) {
- var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02;
- new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur,
- queue: {scope:'_draggable', position:'end'}
- });
- },
- endeffect: function(element) {
- var toOpacity = typeof element._opacity == 'number' ? element._opacity : 1.0;
- new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity,
- queue: {scope:'_draggable', position:'end'},
- afterFinish: function(){
- Draggable._dragging[element] = false
- }
- });
- },
- zindex: 1000,
- revert: false,
- scroll: false,
- scrollSensitivity: 20,
- scrollSpeed: 15,
- snap: false, // false, or xy or [x,y] or function(x,y){ return [x,y] }
- delay: 0
- };
-
- if(arguments[1] && typeof arguments[1].endeffect == 'undefined')
- Object.extend(defaults, {
- starteffect: function(element) {
- element._opacity = Element.getOpacity(element);
- Draggable._dragging[element] = true;
- new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7});
- }
- });
-
- var options = Object.extend(defaults, arguments[1] || {});
-
- this.element = $(element);
-
- if(options.handle && (typeof options.handle == 'string')) {
- var h = Element.childrenWithClassName(this.element, options.handle, true);
- if(h.length>0) this.handle = h[0];
- }
- if(!this.handle) this.handle = $(options.handle);
- if(!this.handle) this.handle = this.element;
-
- if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) {
- options.scroll = $(options.scroll);
- this._isScrollChild = Element.childOf(this.element, options.scroll);
- }
-
- Element.makePositioned(this.element); // fix IE
-
- this.delta = this.currentDelta();
- this.options = options;
- this.dragging = false;
-
- this.eventMouseDown = this.initDrag.bindAsEventListener(this);
- Event.observe(this.handle, "mousedown", this.eventMouseDown);
-
- Draggables.register(this);
- },
-
- destroy: function() {
- Event.stopObserving(this.handle, "mousedown", this.eventMouseDown);
- Draggables.unregister(this);
- },
-
- currentDelta: function() {
- return([
- parseInt(Element.getStyle(this.element,'left') || '0'),
- parseInt(Element.getStyle(this.element,'top') || '0')]);
- },
-
- initDrag: function(event) {
- if(typeof Draggable._dragging[this.element] != 'undefined' &&
- Draggable._dragging[this.element]) return;
- if(Event.isLeftClick(event)) {
- // abort on form elements, fixes a Firefox issue
- var src = Event.element(event);
- if(src.tagName && (
- src.tagName=='INPUT' ||
- src.tagName=='SELECT' ||
- src.tagName=='OPTION' ||
- src.tagName=='BUTTON' ||
- src.tagName=='TEXTAREA')) return;
-
- var pointer = [Event.pointerX(event), Event.pointerY(event)];
- var pos = Position.cumulativeOffset(this.element);
- this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) });
-
- Draggables.activate(this);
- Event.stop(event);
- }
- },
-
- startDrag: function(event) {
- this.dragging = true;
-
- if(this.options.zindex) {
- this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0);
- this.element.style.zIndex = this.options.zindex;
- }
-
- if(this.options.ghosting) {
- this._clone = this.element.cloneNode(true);
- Position.absolutize(this.element);
- this.element.parentNode.insertBefore(this._clone, this.element);
- }
-
- if(this.options.scroll) {
- if (this.options.scroll == window) {
- var where = this._getWindowScroll(this.options.scroll);
- this.originalScrollLeft = where.left;
- this.originalScrollTop = where.top;
- } else {
- this.originalScrollLeft = this.options.scroll.scrollLeft;
- this.originalScrollTop = this.options.scroll.scrollTop;
- }
- }
-
- Draggables.notify('onStart', this, event);
-
- if(this.options.starteffect) this.options.starteffect(this.element);
- },
-
- updateDrag: function(event, pointer) {
- if(!this.dragging) this.startDrag(event);
- Position.prepare();
- Droppables.show(pointer, this.element);
- Draggables.notify('onDrag', this, event);
-
- this.draw(pointer);
- if(this.options.change) this.options.change(this);
-
- if(this.options.scroll) {
- this.stopScrolling();
-
- var p;
- if (this.options.scroll == window) {
- with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; }
- } else {
- p = Position.page(this.options.scroll);
- p[0] += this.options.scroll.scrollLeft;
- p[1] += this.options.scroll.scrollTop;
-
- p[0] += (window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0);
- p[1] += (window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0);
-
- p.push(p[0]+this.options.scroll.offsetWidth);
- p.push(p[1]+this.options.scroll.offsetHeight);
- }
- var speed = [0,0];
- if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity);
- if(pointer[1] < (p[1]+this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[1]+this.options.scrollSensitivity);
- if(pointer[0] > (p[2]-this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[2]-this.options.scrollSensitivity);
- if(pointer[1] > (p[3]-this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[3]-this.options.scrollSensitivity);
- this.startScrolling(speed);
- }
-
- // fix AppleWebKit rendering
- if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
-
- Event.stop(event);
- },
-
- finishDrag: function(event, success) {
- this.dragging = false;
-
- if(this.options.ghosting) {
- Position.relativize(this.element);
- Element.remove(this._clone);
- this._clone = null;
- }
-
- if(success) Droppables.fire(event, this.element);
- Draggables.notify('onEnd', this, event);
-
- var revert = this.options.revert;
- if(revert && typeof revert == 'function') revert = revert(this.element);
-
- var d = this.currentDelta();
- if(revert && this.options.reverteffect) {
- this.options.reverteffect(this.element,
- d[1]-this.delta[1], d[0]-this.delta[0]);
- } else {
- this.delta = d;
- }
-
- if(this.options.zindex)
- this.element.style.zIndex = this.originalZ;
-
- if(this.options.endeffect)
- this.options.endeffect(this.element);
-
- Draggables.deactivate(this);
- Droppables.reset();
- },
-
- keyPress: function(event) {
- if(event.keyCode!=Event.KEY_ESC) return;
- this.finishDrag(event, false);
- Event.stop(event);
- },
-
- endDrag: function(event) {
- if(!this.dragging) return;
- this.stopScrolling();
- this.finishDrag(event, true);
- Event.stop(event);
- },
-
- draw: function(point) {
- var pos = Position.cumulativeOffset(this.element);
- if(this.options.ghosting) {
- var r = Position.realOffset(this.element);
- window.status = r.inspect();
- pos[0] += r[0] - Position.deltaX; pos[1] += r[1] - Position.deltaY;
- }
-
- var d = this.currentDelta();
- pos[0] -= d[0]; pos[1] -= d[1];
-
- if(this.options.scroll && (this.options.scroll != window && this._isScrollChild)) {
- pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft;
- pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop;
- }
-
- var p = [0,1].map(function(i){
- return (point[i]-pos[i]-this.offset[i])
- }.bind(this));
-
- if(this.options.snap) {
- if(typeof this.options.snap == 'function') {
- p = this.options.snap(p[0],p[1],this);
- } else {
- if(this.options.snap instanceof Array) {
- p = p.map( function(v, i) {
- return Math.round(v/this.options.snap[i])*this.options.snap[i] }.bind(this))
- } else {
- p = p.map( function(v) {
- return Math.round(v/this.options.snap)*this.options.snap }.bind(this))
- }
- }}
-
- var style = this.element.style;
- if((!this.options.constraint) || (this.options.constraint=='horizontal'))
- style.left = p[0] + "px";
- if((!this.options.constraint) || (this.options.constraint=='vertical'))
- style.top = p[1] + "px";
-
- if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering
- },
-
- stopScrolling: function() {
- if(this.scrollInterval) {
- clearInterval(this.scrollInterval);
- this.scrollInterval = null;
- Draggables._lastScrollPointer = null;
- }
- },
-
- startScrolling: function(speed) {
- if(!(speed[0] || speed[1])) return;
- this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed];
- this.lastScrolled = new Date();
- this.scrollInterval = setInterval(this.scroll.bind(this), 10);
- },
-
- scroll: function() {
- var current = new Date();
- var delta = current - this.lastScrolled;
- this.lastScrolled = current;
- if(this.options.scroll == window) {
- with (this._getWindowScroll(this.options.scroll)) {
- if (this.scrollSpeed[0] || this.scrollSpeed[1]) {
- var d = delta / 1000;
- this.options.scroll.scrollTo( left + d*this.scrollSpeed[0], top + d*this.scrollSpeed[1] );
- }
- }
- } else {
- this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000;
- this.options.scroll.scrollTop += this.scrollSpeed[1] * delta / 1000;
- }
-
- Position.prepare();
- Droppables.show(Draggables._lastPointer, this.element);
- Draggables.notify('onDrag', this);
- if (this._isScrollChild) {
- Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer);
- Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000;
- Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000;
- if (Draggables._lastScrollPointer[0] < 0)
- Draggables._lastScrollPointer[0] = 0;
- if (Draggables._lastScrollPointer[1] < 0)
- Draggables._lastScrollPointer[1] = 0;
- this.draw(Draggables._lastScrollPointer);
- }
-
- if(this.options.change) this.options.change(this);
- },
-
- _getWindowScroll: function(w) {
- var T, L, W, H;
- with (w.document) {
- if (w.document.documentElement && documentElement.scrollTop) {
- T = documentElement.scrollTop;
- L = documentElement.scrollLeft;
- } else if (w.document.body) {
- T = body.scrollTop;
- L = body.scrollLeft;
- }
- if (w.innerWidth) {
- W = w.innerWidth;
- H = w.innerHeight;
- } else if (w.document.documentElement && documentElement.clientWidth) {
- W = documentElement.clientWidth;
- H = documentElement.clientHeight;
- } else {
- W = body.offsetWidth;
- H = body.offsetHeight
- }
- }
- return { top: T, left: L, width: W, height: H };
- }
-}
-
-/*--------------------------------------------------------------------------*/
-
-var SortableObserver = Class.create();
-SortableObserver.prototype = {
- initialize: function(element, observer) {
- this.element = $(element);
- this.observer = observer;
- this.lastValue = Sortable.serialize(this.element);
- },
-
- onStart: function() {
- this.lastValue = Sortable.serialize(this.element);
- },
-
- onEnd: function() {
- Sortable.unmark();
- if(this.lastValue != Sortable.serialize(this.element))
- this.observer(this.element)
- }
-}
-
-var Sortable = {
- SERIALIZE_RULE: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/,
-
- sortables: {},
-
- _findRootElement: function(element) {
- while (element.tagName != "BODY") {
- if(element.id && Sortable.sortables[element.id]) return element;
- element = element.parentNode;
- }
- },
-
- options: function(element) {
- element = Sortable._findRootElement($(element));
- if(!element) return;
- return Sortable.sortables[element.id];
- },
-
- destroy: function(element){
- var s = Sortable.options(element);
-
- if(s) {
- Draggables.removeObserver(s.element);
- s.droppables.each(function(d){ Droppables.remove(d) });
- s.draggables.invoke('destroy');
-
- delete Sortable.sortables[s.element.id];
- }
- },
-
- create: function(element) {
- element = $(element);
- var options = Object.extend({
- element: element,
- tag: 'li', // assumes li children, override with tag: 'tagname'
- dropOnEmpty: false,
- tree: false,
- treeTag: 'ul',
- overlap: 'vertical', // one of 'vertical', 'horizontal'
- constraint: 'vertical', // one of 'vertical', 'horizontal', false
- containment: element, // also takes array of elements (or id's); or false
- handle: false, // or a CSS class
- only: false,
- delay: 0,
- hoverclass: null,
- ghosting: false,
- scroll: false,
- scrollSensitivity: 20,
- scrollSpeed: 15,
- format: this.SERIALIZE_RULE,
- onChange: Prototype.emptyFunction,
- onUpdate: Prototype.emptyFunction
- }, arguments[1] || {});
-
- // clear any old sortable with same element
- this.destroy(element);
-
- // build options for the draggables
- var options_for_draggable = {
- revert: true,
- scroll: options.scroll,
- scrollSpeed: options.scrollSpeed,
- scrollSensitivity: options.scrollSensitivity,
- delay: options.delay,
- ghosting: options.ghosting,
- constraint: options.constraint,
- handle: options.handle };
-
- if(options.starteffect)
- options_for_draggable.starteffect = options.starteffect;
-
- if(options.reverteffect)
- options_for_draggable.reverteffect = options.reverteffect;
- else
- if(options.ghosting) options_for_draggable.reverteffect = function(element) {
- element.style.top = 0;
- element.style.left = 0;
- };
-
- if(options.endeffect)
- options_for_draggable.endeffect = options.endeffect;
-
- if(options.zindex)
- options_for_draggable.zindex = options.zindex;
-
- // build options for the droppables
- var options_for_droppable = {
- overlap: options.overlap,
- containment: options.containment,
- tree: options.tree,
- hoverclass: options.hoverclass,
- onHover: Sortable.onHover
- //greedy: !options.dropOnEmpty
- }
-
- var options_for_tree = {
- onHover: Sortable.onEmptyHover,
- overlap: options.overlap,
- containment: options.containment,
- hoverclass: options.hoverclass
- }
-
- // fix for gecko engine
- Element.cleanWhitespace(element);
-
- options.draggables = [];
- options.droppables = [];
-
- // drop on empty handling
- if(options.dropOnEmpty || options.tree) {
- Droppables.add(element, options_for_tree);
- options.droppables.push(element);
- }
-
- (this.findElements(element, options) || []).each( function(e) {
- // handles are per-draggable
- var handle = options.handle ?
- Element.childrenWithClassName(e, options.handle)[0] : e;
- options.draggables.push(
- new Draggable(e, Object.extend(options_for_draggable, { handle: handle })));
- Droppables.add(e, options_for_droppable);
- if(options.tree) e.treeNode = element;
- options.droppables.push(e);
- });
-
- if(options.tree) {
- (Sortable.findTreeElements(element, options) || []).each( function(e) {
- Droppables.add(e, options_for_tree);
- e.treeNode = element;
- options.droppables.push(e);
- });
- }
-
- // keep reference
- this.sortables[element.id] = options;
-
- // for onupdate
- Draggables.addObserver(new SortableObserver(element, options.onUpdate));
-
- },
-
- // return all suitable-for-sortable elements in a guaranteed order
- findElements: function(element, options) {
- return Element.findChildren(
- element, options.only, options.tree ? true : false, options.tag);
- },
-
- findTreeElements: function(element, options) {
- return Element.findChildren(
- element, options.only, options.tree ? true : false, options.treeTag);
- },
-
- onHover: function(element, dropon, overlap) {
- if(Element.isParent(dropon, element)) return;
-
- if(overlap > .33 && overlap < .66 && Sortable.options(dropon).tree) {
- return;
- } else if(overlap>0.5) {
- Sortable.mark(dropon, 'before');
- if(dropon.previousSibling != element) {
- var oldParentNode = element.parentNode;
- element.style.visibility = "hidden"; // fix gecko rendering
- dropon.parentNode.insertBefore(element, dropon);
- if(dropon.parentNode!=oldParentNode)
- Sortable.options(oldParentNode).onChange(element);
- Sortable.options(dropon.parentNode).onChange(element);
- }
- } else {
- Sortable.mark(dropon, 'after');
- var nextElement = dropon.nextSibling || null;
- if(nextElement != element) {
- var oldParentNode = element.parentNode;
- element.style.visibility = "hidden"; // fix gecko rendering
- dropon.parentNode.insertBefore(element, nextElement);
- if(dropon.parentNode!=oldParentNode)
- Sortable.options(oldParentNode).onChange(element);
- Sortable.options(dropon.parentNode).onChange(element);
- }
- }
- },
-
- onEmptyHover: function(element, dropon, overlap) {
- var oldParentNode = element.parentNode;
- var droponOptions = Sortable.options(dropon);
-
- if(!Element.isParent(dropon, element)) {
- var index;
-
- var children = Sortable.findElements(dropon, {tag: droponOptions.tag, only: droponOptions.only});
- var child = null;
-
- if(children) {
- var offset = Element.offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap);
-
- for (index = 0; index < children.length; index += 1) {
- if (offset - Element.offsetSize (children[index], droponOptions.overlap) >= 0) {
- offset -= Element.offsetSize (children[index], droponOptions.overlap);
- } else if (offset - (Element.offsetSize (children[index], droponOptions.overlap) / 2) >= 0) {
- child = index + 1 < children.length ? children[index + 1] : null;
- break;
- } else {
- child = children[index];
- break;
- }
- }
- }
-
- dropon.insertBefore(element, child);
-
- Sortable.options(oldParentNode).onChange(element);
- droponOptions.onChange(element);
- }
- },
-
- unmark: function() {
- if(Sortable._marker) Element.hide(Sortable._marker);
- },
-
- mark: function(dropon, position) {
- // mark on ghosting only
- var sortable = Sortable.options(dropon.parentNode);
- if(sortable && !sortable.ghosting) return;
-
- if(!Sortable._marker) {
- Sortable._marker = $('dropmarker') || document.createElement('DIV');
- Element.hide(Sortable._marker);
- Element.addClassName(Sortable._marker, 'dropmarker');
- Sortable._marker.style.position = 'absolute';
- document.getElementsByTagName("body").item(0).appendChild(Sortable._marker);
- }
- var offsets = Position.cumulativeOffset(dropon);
- Sortable._marker.style.left = offsets[0] + 'px';
- Sortable._marker.style.top = offsets[1] + 'px';
-
- if(position=='after')
- if(sortable.overlap == 'horizontal')
- Sortable._marker.style.left = (offsets[0]+dropon.clientWidth) + 'px';
- else
- Sortable._marker.style.top = (offsets[1]+dropon.clientHeight) + 'px';
-
- Element.show(Sortable._marker);
- },
-
- _tree: function(element, options, parent) {
- var children = Sortable.findElements(element, options) || [];
-
- for (var i = 0; i < children.length; ++i) {
- var match = children[i].id.match(options.format);
-
- if (!match) continue;
-
- var child = {
- id: encodeURIComponent(match ? match[1] : null),
- element: element,
- parent: parent,
- children: new Array,
- position: parent.children.length,
- container: Sortable._findChildrenElement(children[i], options.treeTag.toUpperCase())
- }
-
- /* Get the element containing the children and recurse over it */
- if (child.container)
- this._tree(child.container, options, child)
-
- parent.children.push (child);
- }
-
- return parent;
- },
-
- /* Finds the first element of the given tag type within a parent element.
- Used for finding the first LI[ST] within a L[IST]I[TEM].*/
- _findChildrenElement: function (element, containerTag) {
- if (element && element.hasChildNodes)
- for (var i = 0; i < element.childNodes.length; ++i)
- if (element.childNodes[i].tagName == containerTag)
- return element.childNodes[i];
-
- return null;
- },
-
- tree: function(element) {
- element = $(element);
- var sortableOptions = this.options(element);
- var options = Object.extend({
- tag: sortableOptions.tag,
- treeTag: sortableOptions.treeTag,
- only: sortableOptions.only,
- name: element.id,
- format: sortableOptions.format
- }, arguments[1] || {});
-
- var root = {
- id: null,
- parent: null,
- children: new Array,
- container: element,
- position: 0
- }
-
- return Sortable._tree (element, options, root);
- },
-
- /* Construct a [i] index for a particular node */
- _constructIndex: function(node) {
- var index = '';
- do {
- if (node.id) index = '[' + node.position + ']' + index;
- } while ((node = node.parent) != null);
- return index;
- },
-
- sequence: function(element) {
- element = $(element);
- var options = Object.extend(this.options(element), arguments[1] || {});
-
- return $(this.findElements(element, options) || []).map( function(item) {
- return item.id.match(options.format) ? item.id.match(options.format)[1] : '';
- });
- },
-
- setSequence: function(element, new_sequence) {
- element = $(element);
- var options = Object.extend(this.options(element), arguments[2] || {});
-
- var nodeMap = {};
- this.findElements(element, options).each( function(n) {
- if (n.id.match(options.format))
- nodeMap[n.id.match(options.format)[1]] = [n, n.parentNode];
- n.parentNode.removeChild(n);
- });
-
- new_sequence.each(function(ident) {
- var n = nodeMap[ident];
- if (n) {
- n[1].appendChild(n[0]);
- delete nodeMap[ident];
- }
- });
- },
-
- serialize: function(element) {
- element = $(element);
- var options = Object.extend(Sortable.options(element), arguments[1] || {});
- var name = encodeURIComponent(
- (arguments[1] && arguments[1].name) ? arguments[1].name : element.id);
-
- if (options.tree) {
- return Sortable.tree(element, arguments[1]).children.map( function (item) {
- return [name + Sortable._constructIndex(item) + "[id]=" +
- encodeURIComponent(item.id)].concat(item.children.map(arguments.callee));
- }).flatten().join('&');
- } else {
- return Sortable.sequence(element, arguments[1]).map( function(item) {
- return name + "[]=" + encodeURIComponent(item);
- }).join('&');
- }
- }
-}
-
-/* Returns true if child is contained within element */
-Element.isParent = function(child, element) {
- if (!child.parentNode || child == element) return false;
-
- if (child.parentNode == element) return true;
-
- return Element.isParent(child.parentNode, element);
-}
-
-Element.findChildren = function(element, only, recursive, tagName) {
- if(!element.hasChildNodes()) return null;
- tagName = tagName.toUpperCase();
- if(only) only = [only].flatten();
- var elements = [];
- $A(element.childNodes).each( function(e) {
- if(e.tagName && e.tagName.toUpperCase()==tagName &&
- (!only || (Element.classNames(e).detect(function(v) { return only.include(v) }))))
- elements.push(e);
- if(recursive) {
- var grandchildren = Element.findChildren(e, only, recursive, tagName);
- if(grandchildren) elements.push(grandchildren);
- }
- });
-
- return (elements.length>0 ? elements.flatten() : []);
-}
-
-Element.offsetSize = function (element, type) {
- if (type == 'vertical' || type == 'height')
- return element.offsetHeight;
- else
- return element.offsetWidth;
+// script.aculo.us dragdrop.js v1.6.4, Wed Sep 06 11:30:58 CEST 2006\r
+\r
+// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)\r
+// (c) 2005 Sammi Williams (http://www.oriontransfer.co.nz, sammi@oriontransfer.co.nz)\r
+// \r
+// See scriptaculous.js for full license.\r
+\r
+/*--------------------------------------------------------------------------*/\r
+\r
+if(typeof Effect == 'undefined')\r
+ throw("dragdrop.js requires including script.aculo.us' effects.js library");\r
+\r
+var Droppables = {\r
+ drops: [],\r
+\r
+ remove: function(element) {\r
+ this.drops = this.drops.reject(function(d) { return d.element==$(element) });\r
+ },\r
+\r
+ add: function(element) {\r
+ element = $(element);\r
+ var options = Object.extend({\r
+ greedy: true,\r
+ hoverclass: null,\r
+ tree: false\r
+ }, arguments[1] || {});\r
+\r
+ // cache containers\r
+ if(options.containment) {\r
+ options._containers = [];\r
+ var containment = options.containment;\r
+ if((typeof containment == 'object') && \r
+ (containment.constructor == Array)) {\r
+ containment.each( function(c) { options._containers.push($(c)) });\r
+ } else {\r
+ options._containers.push($(containment));\r
+ }\r
+ }\r
+ \r
+ if(options.accept) options.accept = [options.accept].flatten();\r
+\r
+ Element.makePositioned(element); // fix IE\r
+ options.element = element;\r
+\r
+ this.drops.push(options);\r
+ },\r
+ \r
+ findDeepestChild: function(drops) {\r
+ deepest = drops[0];\r
+ \r
+ for (i = 1; i < drops.length; ++i)\r
+ if (Element.isParent(drops[i].element, deepest.element))\r
+ deepest = drops[i];\r
+ \r
+ return deepest;\r
+ },\r
+\r
+ isContained: function(element, drop) {\r
+ var containmentNode;\r
+ if(drop.tree) {\r
+ containmentNode = element.treeNode; \r
+ } else {\r
+ containmentNode = element.parentNode;\r
+ }\r
+ return drop._containers.detect(function(c) { return containmentNode == c });\r
+ },\r
+ \r
+ isAffected: function(point, element, drop) {\r
+ return (\r
+ (drop.element!=element) &&\r
+ ((!drop._containers) ||\r
+ this.isContained(element, drop)) &&\r
+ ((!drop.accept) ||\r
+ (Element.classNames(element).detect( \r
+ function(v) { return drop.accept.include(v) } ) )) &&\r
+ Position.within(drop.element, point[0], point[1]) );\r
+ },\r
+\r
+ deactivate: function(drop) {\r
+ if(drop.hoverclass)\r
+ Element.removeClassName(drop.element, drop.hoverclass);\r
+ this.last_active = null;\r
+ },\r
+\r
+ activate: function(drop) {\r
+ if(drop.hoverclass)\r
+ Element.addClassName(drop.element, drop.hoverclass);\r
+ this.last_active = drop;\r
+ },\r
+\r
+ show: function(point, element) {\r
+ if(!this.drops.length) return;\r
+ var affected = [];\r
+ \r
+ if(this.last_active) this.deactivate(this.last_active);\r
+ this.drops.each( function(drop) {\r
+ if(Droppables.isAffected(point, element, drop))\r
+ affected.push(drop);\r
+ });\r
+ \r
+ if(affected.length>0) {\r
+ drop = Droppables.findDeepestChild(affected);\r
+ Position.within(drop.element, point[0], point[1]);\r
+ if(drop.onHover)\r
+ drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element));\r
+ \r
+ Droppables.activate(drop);\r
+ }\r
+ },\r
+\r
+ fire: function(event, element) {\r
+ if(!this.last_active) return;\r
+ Position.prepare();\r
+\r
+ if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active))\r
+ if (this.last_active.onDrop) \r
+ this.last_active.onDrop(element, this.last_active.element, event);\r
+ },\r
+\r
+ reset: function() {\r
+ if(this.last_active)\r
+ this.deactivate(this.last_active);\r
+ }\r
+}\r
+\r
+var Draggables = {\r
+ drags: [],\r
+ observers: [],\r
+ \r
+ register: function(draggable) {\r
+ if(this.drags.length == 0) {\r
+ this.eventMouseUp = this.endDrag.bindAsEventListener(this);\r
+ this.eventMouseMove = this.updateDrag.bindAsEventListener(this);\r
+ this.eventKeypress = this.keyPress.bindAsEventListener(this);\r
+ \r
+ Event.observe(document, "mouseup", this.eventMouseUp);\r
+ Event.observe(document, "mousemove", this.eventMouseMove);\r
+ Event.observe(document, "keypress", this.eventKeypress);\r
+ }\r
+ this.drags.push(draggable);\r
+ },\r
+ \r
+ unregister: function(draggable) {\r
+ this.drags = this.drags.reject(function(d) { return d==draggable });\r
+ if(this.drags.length == 0) {\r
+ Event.stopObserving(document, "mouseup", this.eventMouseUp);\r
+ Event.stopObserving(document, "mousemove", this.eventMouseMove);\r
+ Event.stopObserving(document, "keypress", this.eventKeypress);\r
+ }\r
+ },\r
+ \r
+ activate: function(draggable) {\r
+ if(draggable.options.delay) { \r
+ this._timeout = setTimeout(function() { \r
+ Draggables._timeout = null; \r
+ window.focus(); \r
+ Draggables.activeDraggable = draggable; \r
+ }.bind(this), draggable.options.delay); \r
+ } else {\r
+ window.focus(); // allows keypress events if window isn't currently focused, fails for Safari\r
+ this.activeDraggable = draggable;\r
+ }\r
+ },\r
+ \r
+ deactivate: function() {\r
+ this.activeDraggable = null;\r
+ },\r
+ \r
+ updateDrag: function(event) {\r
+ if(!this.activeDraggable) return;\r
+ var pointer = [Event.pointerX(event), Event.pointerY(event)];\r
+ // Mozilla-based browsers fire successive mousemove events with\r
+ // the same coordinates, prevent needless redrawing (moz bug?)\r
+ if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return;\r
+ this._lastPointer = pointer;\r
+ \r
+ this.activeDraggable.updateDrag(event, pointer);\r
+ },\r
+ \r
+ endDrag: function(event) {\r
+ if(this._timeout) { \r
+ clearTimeout(this._timeout); \r
+ this._timeout = null; \r
+ }\r
+ if(!this.activeDraggable) return;\r
+ this._lastPointer = null;\r
+ this.activeDraggable.endDrag(event);\r
+ this.activeDraggable = null;\r
+ },\r
+ \r
+ keyPress: function(event) {\r
+ if(this.activeDraggable)\r
+ this.activeDraggable.keyPress(event);\r
+ },\r
+ \r
+ addObserver: function(observer) {\r
+ this.observers.push(observer);\r
+ this._cacheObserverCallbacks();\r
+ },\r
+ \r
+ removeObserver: function(element) { // element instead of observer fixes mem leaks\r
+ this.observers = this.observers.reject( function(o) { return o.element==element });\r
+ this._cacheObserverCallbacks();\r
+ },\r
+ \r
+ notify: function(eventName, draggable, event) { // 'onStart', 'onEnd', 'onDrag'\r
+ if(this[eventName+'Count'] > 0)\r
+ this.observers.each( function(o) {\r
+ if(o[eventName]) o[eventName](eventName, draggable, event);\r
+ });\r
+ if(draggable.options[eventName]) draggable.options[eventName](draggable, event);\r
+ },\r
+ \r
+ _cacheObserverCallbacks: function() {\r
+ ['onStart','onEnd','onDrag'].each( function(eventName) {\r
+ Draggables[eventName+'Count'] = Draggables.observers.select(\r
+ function(o) { return o[eventName]; }\r
+ ).length;\r
+ });\r
+ }\r
+}\r
+\r
+/*--------------------------------------------------------------------------*/\r
+\r
+var Draggable = Class.create();\r
+Draggable._dragging = {};\r
+\r
+Draggable.prototype = {\r
+ initialize: function(element) {\r
+ var defaults = {\r
+ handle: false,\r
+ reverteffect: function(element, top_offset, left_offset) {\r
+ var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02;\r
+ new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur,\r
+ queue: {scope:'_draggable', position:'end'}\r
+ });\r
+ },\r
+ endeffect: function(element) {\r
+ var toOpacity = typeof element._opacity == 'number' ? element._opacity : 1.0;\r
+ new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity, \r
+ queue: {scope:'_draggable', position:'end'},\r
+ afterFinish: function(){ \r
+ Draggable._dragging[element] = false \r
+ }\r
+ }); \r
+ },\r
+ zindex: 1000,\r
+ revert: false,\r
+ scroll: false,\r
+ scrollSensitivity: 20,\r
+ scrollSpeed: 15,\r
+ snap: false, // false, or xy or [x,y] or function(x,y){ return [x,y] }\r
+ delay: 0\r
+ };\r
+ \r
+ if(arguments[1] && typeof arguments[1].endeffect == 'undefined')\r
+ Object.extend(defaults, {\r
+ starteffect: function(element) {\r
+ element._opacity = Element.getOpacity(element);\r
+ Draggable._dragging[element] = true;\r
+ new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7}); \r
+ }\r
+ });\r
+ \r
+ var options = Object.extend(defaults, arguments[1] || {});\r
+\r
+ this.element = $(element);\r
+ \r
+ if(options.handle && (typeof options.handle == 'string')) {\r
+ var h = Element.childrenWithClassName(this.element, options.handle, true);\r
+ if(h.length>0) this.handle = h[0];\r
+ }\r
+ if(!this.handle) this.handle = $(options.handle);\r
+ if(!this.handle) this.handle = this.element;\r
+ \r
+ if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) {\r
+ options.scroll = $(options.scroll);\r
+ this._isScrollChild = Element.childOf(this.element, options.scroll);\r
+ }\r
+\r
+ Element.makePositioned(this.element); // fix IE \r
+\r
+ this.delta = this.currentDelta();\r
+ this.options = options;\r
+ this.dragging = false; \r
+\r
+ this.eventMouseDown = this.initDrag.bindAsEventListener(this);\r
+ Event.observe(this.handle, "mousedown", this.eventMouseDown);\r
+ \r
+ Draggables.register(this);\r
+ },\r
+ \r
+ destroy: function() {\r
+ Event.stopObserving(this.handle, "mousedown", this.eventMouseDown);\r
+ Draggables.unregister(this);\r
+ },\r
+ \r
+ currentDelta: function() {\r
+ return([\r
+ parseInt(Element.getStyle(this.element,'left') || '0'),\r
+ parseInt(Element.getStyle(this.element,'top') || '0')]);\r
+ },\r
+ \r
+ initDrag: function(event) {\r
+ if(typeof Draggable._dragging[this.element] != 'undefined' &&\r
+ Draggable._dragging[this.element]) return;\r
+ if(Event.isLeftClick(event)) { \r
+ // abort on form elements, fixes a Firefox issue\r
+ var src = Event.element(event);\r
+ if(src.tagName && (\r
+ src.tagName=='INPUT' ||\r
+ src.tagName=='SELECT' ||\r
+ src.tagName=='OPTION' ||\r
+ src.tagName=='BUTTON' ||\r
+ src.tagName=='TEXTAREA')) return;\r
+ \r
+ var pointer = [Event.pointerX(event), Event.pointerY(event)];\r
+ var pos = Position.cumulativeOffset(this.element);\r
+ this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) });\r
+ \r
+ Draggables.activate(this);\r
+ Event.stop(event);\r
+ }\r
+ },\r
+ \r
+ startDrag: function(event) {\r
+ this.dragging = true;\r
+ \r
+ if(this.options.zindex) {\r
+ this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0);\r
+ this.element.style.zIndex = this.options.zindex;\r
+ }\r
+ \r
+ if(this.options.ghosting) {\r
+ this._clone = this.element.cloneNode(true);\r
+ Position.absolutize(this.element);\r
+ this.element.parentNode.insertBefore(this._clone, this.element);\r
+ }\r
+ \r
+ if(this.options.scroll) {\r
+ if (this.options.scroll == window) {\r
+ var where = this._getWindowScroll(this.options.scroll);\r
+ this.originalScrollLeft = where.left;\r
+ this.originalScrollTop = where.top;\r
+ } else {\r
+ this.originalScrollLeft = this.options.scroll.scrollLeft;\r
+ this.originalScrollTop = this.options.scroll.scrollTop;\r
+ }\r
+ }\r
+ \r
+ Draggables.notify('onStart', this, event);\r
+ \r
+ if(this.options.starteffect) this.options.starteffect(this.element);\r
+ },\r
+ \r
+ updateDrag: function(event, pointer) {\r
+ if(!this.dragging) this.startDrag(event);\r
+ Position.prepare();\r
+ Droppables.show(pointer, this.element);\r
+ Draggables.notify('onDrag', this, event);\r
+ \r
+ this.draw(pointer);\r
+ if(this.options.change) this.options.change(this);\r
+ \r
+ if(this.options.scroll) {\r
+ this.stopScrolling();\r
+ \r
+ var p;\r
+ if (this.options.scroll == window) {\r
+ with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; }\r
+ } else {\r
+ p = Position.page(this.options.scroll);\r
+ p[0] += this.options.scroll.scrollLeft;\r
+ p[1] += this.options.scroll.scrollTop;\r
+ \r
+ p[0] += (window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0);\r
+ p[1] += (window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0);\r
+ \r
+ p.push(p[0]+this.options.scroll.offsetWidth);\r
+ p.push(p[1]+this.options.scroll.offsetHeight);\r
+ }\r
+ var speed = [0,0];\r
+ if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity);\r
+ if(pointer[1] < (p[1]+this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[1]+this.options.scrollSensitivity);\r
+ if(pointer[0] > (p[2]-this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[2]-this.options.scrollSensitivity);\r
+ if(pointer[1] > (p[3]-this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[3]-this.options.scrollSensitivity);\r
+ this.startScrolling(speed);\r
+ }\r
+ \r
+ // fix AppleWebKit rendering\r
+ if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);\r
+ \r
+ Event.stop(event);\r
+ },\r
+ \r
+ finishDrag: function(event, success) {\r
+ this.dragging = false;\r
+\r
+ if(this.options.ghosting) {\r
+ Position.relativize(this.element);\r
+ Element.remove(this._clone);\r
+ this._clone = null;\r
+ }\r
+\r
+ if(success) Droppables.fire(event, this.element);\r
+ Draggables.notify('onEnd', this, event);\r
+\r
+ var revert = this.options.revert;\r
+ if(revert && typeof revert == 'function') revert = revert(this.element);\r
+ \r
+ var d = this.currentDelta();\r
+ if(revert && this.options.reverteffect) {\r
+ this.options.reverteffect(this.element, \r
+ d[1]-this.delta[1], d[0]-this.delta[0]);\r
+ } else {\r
+ this.delta = d;\r
+ }\r
+\r
+ if(this.options.zindex)\r
+ this.element.style.zIndex = this.originalZ;\r
+\r
+ if(this.options.endeffect) \r
+ this.options.endeffect(this.element);\r
+ \r
+ Draggables.deactivate(this);\r
+ Droppables.reset();\r
+ },\r
+ \r
+ keyPress: function(event) {\r
+ if(event.keyCode!=Event.KEY_ESC) return;\r
+ this.finishDrag(event, false);\r
+ Event.stop(event);\r
+ },\r
+ \r
+ endDrag: function(event) {\r
+ if(!this.dragging) return;\r
+ this.stopScrolling();\r
+ this.finishDrag(event, true);\r
+ Event.stop(event);\r
+ },\r
+ \r
+ draw: function(point) {\r
+ var pos = Position.cumulativeOffset(this.element);\r
+ if(this.options.ghosting) {\r
+ var r = Position.realOffset(this.element);\r
+ window.status = r.inspect();\r
+ pos[0] += r[0] - Position.deltaX; pos[1] += r[1] - Position.deltaY;\r
+ }\r
+ \r
+ var d = this.currentDelta();\r
+ pos[0] -= d[0]; pos[1] -= d[1];\r
+ \r
+ if(this.options.scroll && (this.options.scroll != window && this._isScrollChild)) {\r
+ pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft;\r
+ pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop;\r
+ }\r
+ \r
+ var p = [0,1].map(function(i){ \r
+ return (point[i]-pos[i]-this.offset[i]) \r
+ }.bind(this));\r
+ \r
+ if(this.options.snap) {\r
+ if(typeof this.options.snap == 'function') {\r
+ p = this.options.snap(p[0],p[1],this);\r
+ } else {\r
+ if(this.options.snap instanceof Array) {\r
+ p = p.map( function(v, i) {\r
+ return Math.round(v/this.options.snap[i])*this.options.snap[i] }.bind(this))\r
+ } else {\r
+ p = p.map( function(v) {\r
+ return Math.round(v/this.options.snap)*this.options.snap }.bind(this))\r
+ }\r
+ }}\r
+ \r
+ var style = this.element.style;\r
+ if((!this.options.constraint) || (this.options.constraint=='horizontal'))\r
+ style.left = p[0] + "px";\r
+ if((!this.options.constraint) || (this.options.constraint=='vertical'))\r
+ style.top = p[1] + "px";\r
+ \r
+ if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering\r
+ },\r
+ \r
+ stopScrolling: function() {\r
+ if(this.scrollInterval) {\r
+ clearInterval(this.scrollInterval);\r
+ this.scrollInterval = null;\r
+ Draggables._lastScrollPointer = null;\r
+ }\r
+ },\r
+ \r
+ startScrolling: function(speed) {\r
+ if(!(speed[0] || speed[1])) return;\r
+ this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed];\r
+ this.lastScrolled = new Date();\r
+ this.scrollInterval = setInterval(this.scroll.bind(this), 10);\r
+ },\r
+ \r
+ scroll: function() {\r
+ var current = new Date();\r
+ var delta = current - this.lastScrolled;\r
+ this.lastScrolled = current;\r
+ if(this.options.scroll == window) {\r
+ with (this._getWindowScroll(this.options.scroll)) {\r
+ if (this.scrollSpeed[0] || this.scrollSpeed[1]) {\r
+ var d = delta / 1000;\r
+ this.options.scroll.scrollTo( left + d*this.scrollSpeed[0], top + d*this.scrollSpeed[1] );\r
+ }\r
+ }\r
+ } else {\r
+ this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000;\r
+ this.options.scroll.scrollTop += this.scrollSpeed[1] * delta / 1000;\r
+ }\r
+ \r
+ Position.prepare();\r
+ Droppables.show(Draggables._lastPointer, this.element);\r
+ Draggables.notify('onDrag', this);\r
+ if (this._isScrollChild) {\r
+ Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer);\r
+ Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000;\r
+ Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000;\r
+ if (Draggables._lastScrollPointer[0] < 0)\r
+ Draggables._lastScrollPointer[0] = 0;\r
+ if (Draggables._lastScrollPointer[1] < 0)\r
+ Draggables._lastScrollPointer[1] = 0;\r
+ this.draw(Draggables._lastScrollPointer);\r
+ }\r
+ \r
+ if(this.options.change) this.options.change(this);\r
+ },\r
+ \r
+ _getWindowScroll: function(w) {\r
+ var T, L, W, H;\r
+ with (w.document) {\r
+ if (w.document.documentElement && documentElement.scrollTop) {\r
+ T = documentElement.scrollTop;\r
+ L = documentElement.scrollLeft;\r
+ } else if (w.document.body) {\r
+ T = body.scrollTop;\r
+ L = body.scrollLeft;\r
+ }\r
+ if (w.innerWidth) {\r
+ W = w.innerWidth;\r
+ H = w.innerHeight;\r
+ } else if (w.document.documentElement && documentElement.clientWidth) {\r
+ W = documentElement.clientWidth;\r
+ H = documentElement.clientHeight;\r
+ } else {\r
+ W = body.offsetWidth;\r
+ H = body.offsetHeight\r
+ }\r
+ }\r
+ return { top: T, left: L, width: W, height: H };\r
+ }\r
+}\r
+\r
+/*--------------------------------------------------------------------------*/\r
+\r
+var SortableObserver = Class.create();\r
+SortableObserver.prototype = {\r
+ initialize: function(element, observer) {\r
+ this.element = $(element);\r
+ this.observer = observer;\r
+ this.lastValue = Sortable.serialize(this.element);\r
+ },\r
+ \r
+ onStart: function() {\r
+ this.lastValue = Sortable.serialize(this.element);\r
+ },\r
+ \r
+ onEnd: function() {\r
+ Sortable.unmark();\r
+ if(this.lastValue != Sortable.serialize(this.element))\r
+ this.observer(this.element)\r
+ }\r
+}\r
+\r
+var Sortable = {\r
+ SERIALIZE_RULE: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/,\r
+ \r
+ sortables: {},\r
+ \r
+ _findRootElement: function(element) {\r
+ while (element.tagName != "BODY") { \r
+ if(element.id && Sortable.sortables[element.id]) return element;\r
+ element = element.parentNode;\r
+ }\r
+ },\r
+\r
+ options: function(element) {\r
+ element = Sortable._findRootElement($(element));\r
+ if(!element) return;\r
+ return Sortable.sortables[element.id];\r
+ },\r
+ \r
+ destroy: function(element){\r
+ var s = Sortable.options(element);\r
+ \r
+ if(s) {\r
+ Draggables.removeObserver(s.element);\r
+ s.droppables.each(function(d){ Droppables.remove(d) });\r
+ s.draggables.invoke('destroy');\r
+ \r
+ delete Sortable.sortables[s.element.id];\r
+ }\r
+ },\r
+\r
+ create: function(element) {\r
+ element = $(element);\r
+ var options = Object.extend({ \r
+ element: element,\r
+ tag: 'li', // assumes li children, override with tag: 'tagname'\r
+ dropOnEmpty: false,\r
+ tree: false,\r
+ treeTag: 'ul',\r
+ overlap: 'vertical', // one of 'vertical', 'horizontal'\r
+ constraint: 'vertical', // one of 'vertical', 'horizontal', false\r
+ containment: element, // also takes array of elements (or id's); or false\r
+ handle: false, // or a CSS class\r
+ only: false,\r
+ delay: 0,\r
+ hoverclass: null,\r
+ ghosting: false,\r
+ scroll: false,\r
+ scrollSensitivity: 20,\r
+ scrollSpeed: 15,\r
+ format: this.SERIALIZE_RULE,\r
+ onChange: Prototype.emptyFunction,\r
+ onUpdate: Prototype.emptyFunction\r
+ }, arguments[1] || {});\r
+\r
+ // clear any old sortable with same element\r
+ this.destroy(element);\r
+\r
+ // build options for the draggables\r
+ var options_for_draggable = {\r
+ revert: true,\r
+ scroll: options.scroll,\r
+ scrollSpeed: options.scrollSpeed,\r
+ scrollSensitivity: options.scrollSensitivity,\r
+ delay: options.delay,\r
+ ghosting: options.ghosting,\r
+ constraint: options.constraint,\r
+ handle: options.handle };\r
+\r
+ if(options.starteffect)\r
+ options_for_draggable.starteffect = options.starteffect;\r
+\r
+ if(options.reverteffect)\r
+ options_for_draggable.reverteffect = options.reverteffect;\r
+ else\r
+ if(options.ghosting) options_for_draggable.reverteffect = function(element) {\r
+ element.style.top = 0;\r
+ element.style.left = 0;\r
+ };\r
+\r
+ if(options.endeffect)\r
+ options_for_draggable.endeffect = options.endeffect;\r
+\r
+ if(options.zindex)\r
+ options_for_draggable.zindex = options.zindex;\r
+\r
+ // build options for the droppables \r
+ var options_for_droppable = {\r
+ overlap: options.overlap,\r
+ containment: options.containment,\r
+ tree: options.tree,\r
+ hoverclass: options.hoverclass,\r
+ onHover: Sortable.onHover\r
+ //greedy: !options.dropOnEmpty\r
+ }\r
+ \r
+ var options_for_tree = {\r
+ onHover: Sortable.onEmptyHover,\r
+ overlap: options.overlap,\r
+ containment: options.containment,\r
+ hoverclass: options.hoverclass\r
+ }\r
+\r
+ // fix for gecko engine\r
+ Element.cleanWhitespace(element); \r
+\r
+ options.draggables = [];\r
+ options.droppables = [];\r
+\r
+ // drop on empty handling\r
+ if(options.dropOnEmpty || options.tree) {\r
+ Droppables.add(element, options_for_tree);\r
+ options.droppables.push(element);\r
+ }\r
+\r
+ (this.findElements(element, options) || []).each( function(e) {\r
+ // handles are per-draggable\r
+ var handle = options.handle ? \r
+ Element.childrenWithClassName(e, options.handle)[0] : e; \r
+ options.draggables.push(\r
+ new Draggable(e, Object.extend(options_for_draggable, { handle: handle })));\r
+ Droppables.add(e, options_for_droppable);\r
+ if(options.tree) e.treeNode = element;\r
+ options.droppables.push(e); \r
+ });\r
+ \r
+ if(options.tree) {\r
+ (Sortable.findTreeElements(element, options) || []).each( function(e) {\r
+ Droppables.add(e, options_for_tree);\r
+ e.treeNode = element;\r
+ options.droppables.push(e);\r
+ });\r
+ }\r
+\r
+ // keep reference\r
+ this.sortables[element.id] = options;\r
+\r
+ // for onupdate\r
+ Draggables.addObserver(new SortableObserver(element, options.onUpdate));\r
+\r
+ },\r
+\r
+ // return all suitable-for-sortable elements in a guaranteed order\r
+ findElements: function(element, options) {\r
+ return Element.findChildren(\r
+ element, options.only, options.tree ? true : false, options.tag);\r
+ },\r
+ \r
+ findTreeElements: function(element, options) {\r
+ return Element.findChildren(\r
+ element, options.only, options.tree ? true : false, options.treeTag);\r
+ },\r
+\r
+ onHover: function(element, dropon, overlap) {\r
+ if(Element.isParent(dropon, element)) return;\r
+\r
+ if(overlap > .33 && overlap < .66 && Sortable.options(dropon).tree) {\r
+ return;\r
+ } else if(overlap>0.5) {\r
+ Sortable.mark(dropon, 'before');\r
+ if(dropon.previousSibling != element) {\r
+ var oldParentNode = element.parentNode;\r
+ element.style.visibility = "hidden"; // fix gecko rendering\r
+ dropon.parentNode.insertBefore(element, dropon);\r
+ if(dropon.parentNode!=oldParentNode) \r
+ Sortable.options(oldParentNode).onChange(element);\r
+ Sortable.options(dropon.parentNode).onChange(element);\r
+ }\r
+ } else {\r
+ Sortable.mark(dropon, 'after');\r
+ var nextElement = dropon.nextSibling || null;\r
+ if(nextElement != element) {\r
+ var oldParentNode = element.parentNode;\r
+ element.style.visibility = "hidden"; // fix gecko rendering\r
+ dropon.parentNode.insertBefore(element, nextElement);\r
+ if(dropon.parentNode!=oldParentNode) \r
+ Sortable.options(oldParentNode).onChange(element);\r
+ Sortable.options(dropon.parentNode).onChange(element);\r
+ }\r
+ }\r
+ },\r
+ \r
+ onEmptyHover: function(element, dropon, overlap) {\r
+ var oldParentNode = element.parentNode;\r
+ var droponOptions = Sortable.options(dropon);\r
+ \r
+ if(!Element.isParent(dropon, element)) {\r
+ var index;\r
+ \r
+ var children = Sortable.findElements(dropon, {tag: droponOptions.tag, only: droponOptions.only});\r
+ var child = null;\r
+ \r
+ if(children) {\r
+ var offset = Element.offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap);\r
+ \r
+ for (index = 0; index < children.length; index += 1) {\r
+ if (offset - Element.offsetSize (children[index], droponOptions.overlap) >= 0) {\r
+ offset -= Element.offsetSize (children[index], droponOptions.overlap);\r
+ } else if (offset - (Element.offsetSize (children[index], droponOptions.overlap) / 2) >= 0) {\r
+ child = index + 1 < children.length ? children[index + 1] : null;\r
+ break;\r
+ } else {\r
+ child = children[index];\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ \r
+ dropon.insertBefore(element, child);\r
+ \r
+ Sortable.options(oldParentNode).onChange(element);\r
+ droponOptions.onChange(element);\r
+ }\r
+ },\r
+\r
+ unmark: function() {\r
+ if(Sortable._marker) Element.hide(Sortable._marker);\r
+ },\r
+\r
+ mark: function(dropon, position) {\r
+ // mark on ghosting only\r
+ var sortable = Sortable.options(dropon.parentNode);\r
+ if(sortable && !sortable.ghosting) return; \r
+\r
+ if(!Sortable._marker) {\r
+ Sortable._marker = $('dropmarker') || document.createElement('DIV');\r
+ Element.hide(Sortable._marker);\r
+ Element.addClassName(Sortable._marker, 'dropmarker');\r
+ Sortable._marker.style.position = 'absolute';\r
+ document.getElementsByTagName("body").item(0).appendChild(Sortable._marker);\r
+ } \r
+ var offsets = Position.cumulativeOffset(dropon);\r
+ Sortable._marker.style.left = offsets[0] + 'px';\r
+ Sortable._marker.style.top = offsets[1] + 'px';\r
+ \r
+ if(position=='after')\r
+ if(sortable.overlap == 'horizontal') \r
+ Sortable._marker.style.left = (offsets[0]+dropon.clientWidth) + 'px';\r
+ else\r
+ Sortable._marker.style.top = (offsets[1]+dropon.clientHeight) + 'px';\r
+ \r
+ Element.show(Sortable._marker);\r
+ },\r
+ \r
+ _tree: function(element, options, parent) {\r
+ var children = Sortable.findElements(element, options) || [];\r
+ \r
+ for (var i = 0; i < children.length; ++i) {\r
+ var match = children[i].id.match(options.format);\r
+\r
+ if (!match) continue;\r
+ \r
+ var child = {\r
+ id: encodeURIComponent(match ? match[1] : null),\r
+ element: element,\r
+ parent: parent,\r
+ children: new Array,\r
+ position: parent.children.length,\r
+ container: Sortable._findChildrenElement(children[i], options.treeTag.toUpperCase())\r
+ }\r
+ \r
+ /* Get the element containing the children and recurse over it */\r
+ if (child.container)\r
+ this._tree(child.container, options, child)\r
+ \r
+ parent.children.push (child);\r
+ }\r
+\r
+ return parent; \r
+ },\r
+\r
+ /* Finds the first element of the given tag type within a parent element.\r
+ Used for finding the first LI[ST] within a L[IST]I[TEM].*/\r
+ _findChildrenElement: function (element, containerTag) {\r
+ if (element && element.hasChildNodes)\r
+ for (var i = 0; i < element.childNodes.length; ++i)\r
+ if (element.childNodes[i].tagName == containerTag)\r
+ return element.childNodes[i];\r
+ \r
+ return null;\r
+ },\r
+\r
+ tree: function(element) {\r
+ element = $(element);\r
+ var sortableOptions = this.options(element);\r
+ var options = Object.extend({\r
+ tag: sortableOptions.tag,\r
+ treeTag: sortableOptions.treeTag,\r
+ only: sortableOptions.only,\r
+ name: element.id,\r
+ format: sortableOptions.format\r
+ }, arguments[1] || {});\r
+ \r
+ var root = {\r
+ id: null,\r
+ parent: null,\r
+ children: new Array,\r
+ container: element,\r
+ position: 0\r
+ }\r
+ \r
+ return Sortable._tree (element, options, root);\r
+ },\r
+\r
+ /* Construct a [i] index for a particular node */\r
+ _constructIndex: function(node) {\r
+ var index = '';\r
+ do {\r
+ if (node.id) index = '[' + node.position + ']' + index;\r
+ } while ((node = node.parent) != null);\r
+ return index;\r
+ },\r
+\r
+ sequence: function(element) {\r
+ element = $(element);\r
+ var options = Object.extend(this.options(element), arguments[1] || {});\r
+ \r
+ return $(this.findElements(element, options) || []).map( function(item) {\r
+ return item.id.match(options.format) ? item.id.match(options.format)[1] : '';\r
+ });\r
+ },\r
+\r
+ setSequence: function(element, new_sequence) {\r
+ element = $(element);\r
+ var options = Object.extend(this.options(element), arguments[2] || {});\r
+ \r
+ var nodeMap = {};\r
+ this.findElements(element, options).each( function(n) {\r
+ if (n.id.match(options.format))\r
+ nodeMap[n.id.match(options.format)[1]] = [n, n.parentNode];\r
+ n.parentNode.removeChild(n);\r
+ });\r
+ \r
+ new_sequence.each(function(ident) {\r
+ var n = nodeMap[ident];\r
+ if (n) {\r
+ n[1].appendChild(n[0]);\r
+ delete nodeMap[ident];\r
+ }\r
+ });\r
+ },\r
+ \r
+ serialize: function(element) {\r
+ element = $(element);\r
+ var options = Object.extend(Sortable.options(element), arguments[1] || {});\r
+ var name = encodeURIComponent(\r
+ (arguments[1] && arguments[1].name) ? arguments[1].name : element.id);\r
+ \r
+ if (options.tree) {\r
+ return Sortable.tree(element, arguments[1]).children.map( function (item) {\r
+ return [name + Sortable._constructIndex(item) + "[id]=" + \r
+ encodeURIComponent(item.id)].concat(item.children.map(arguments.callee));\r
+ }).flatten().join('&');\r
+ } else {\r
+ return Sortable.sequence(element, arguments[1]).map( function(item) {\r
+ return name + "[]=" + encodeURIComponent(item);\r
+ }).join('&');\r
+ }\r
+ }\r
+}\r
+\r
+/* Returns true if child is contained within element */\r
+Element.isParent = function(child, element) {\r
+ if (!child.parentNode || child == element) return false;\r
+\r
+ if (child.parentNode == element) return true;\r
+\r
+ return Element.isParent(child.parentNode, element);\r
+}\r
+\r
+Element.findChildren = function(element, only, recursive, tagName) { \r
+ if(!element.hasChildNodes()) return null;\r
+ tagName = tagName.toUpperCase();\r
+ if(only) only = [only].flatten();\r
+ var elements = [];\r
+ $A(element.childNodes).each( function(e) {\r
+ if(e.tagName && e.tagName.toUpperCase()==tagName &&\r
+ (!only || (Element.classNames(e).detect(function(v) { return only.include(v) }))))\r
+ elements.push(e);\r
+ if(recursive) {\r
+ var grandchildren = Element.findChildren(e, only, recursive, tagName);\r
+ if(grandchildren) elements.push(grandchildren);\r
+ }\r
+ });\r
+\r
+ return (elements.length>0 ? elements.flatten() : []);\r
+}\r
+\r
+Element.offsetSize = function (element, type) {\r
+ if (type == 'vertical' || type == 'height')\r
+ return element.offsetHeight;\r
+ else\r
+ return element.offsetWidth;\r
}
\ No newline at end of file
-// script.aculo.us effects.js v1.6.4, Wed Sep 06 11:30:58 CEST 2006
-
-// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-// Contributors:
-// Justin Palmer (http://encytemedia.com/)
-// Mark Pilgrim (http://diveintomark.org/)
-// Martin Bialasinki
-//
-// See scriptaculous.js for full license.
-
-// converts rgb() and #xxx to #xxxxxx format,
-// returns self (or first argument) if not convertable
-String.prototype.parseColor = function() {
- var color = '#';
- if(this.slice(0,4) == 'rgb(') {
- var cols = this.slice(4,this.length-1).split(',');
- var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3);
- } else {
- if(this.slice(0,1) == '#') {
- if(this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();
- if(this.length==7) color = this.toLowerCase();
- }
- }
- return(color.length==7 ? color : (arguments[0] || this));
-}
-
-/*--------------------------------------------------------------------------*/
-
-Element.collectTextNodes = function(element) {
- return $A($(element).childNodes).collect( function(node) {
- return (node.nodeType==3 ? node.nodeValue :
- (node.hasChildNodes() ? Element.collectTextNodes(node) : ''));
- }).flatten().join('');
-}
-
-Element.collectTextNodesIgnoreClass = function(element, className) {
- return $A($(element).childNodes).collect( function(node) {
- return (node.nodeType==3 ? node.nodeValue :
- ((node.hasChildNodes() && !Element.hasClassName(node,className)) ?
- Element.collectTextNodesIgnoreClass(node, className) : ''));
- }).flatten().join('');
-}
-
-Element.setContentZoom = function(element, percent) {
- element = $(element);
- Element.setStyle(element, {fontSize: (percent/100) + 'em'});
- if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
-}
-
-Element.getOpacity = function(element){
- var opacity;
- if (opacity = Element.getStyle(element, 'opacity'))
- return parseFloat(opacity);
- if (opacity = (Element.getStyle(element, 'filter') || '').match(/alpha\(opacity=(.*)\)/))
- if(opacity[1]) return parseFloat(opacity[1]) / 100;
- return 1.0;
-}
-
-Element.setOpacity = function(element, value){
- element= $(element);
- if (value == 1){
- Element.setStyle(element, { opacity:
- (/Gecko/.test(navigator.userAgent) && !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ?
- 0.999999 : 1.0 });
- if(/MSIE/.test(navigator.userAgent) && !window.opera)
- Element.setStyle(element, {filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'')});
- } else {
- if(value < 0.00001) value = 0;
- Element.setStyle(element, {opacity: value});
- if(/MSIE/.test(navigator.userAgent) && !window.opera)
- Element.setStyle(element,
- { filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'') +
- 'alpha(opacity='+value*100+')' });
- }
-}
-
-Element.getInlineOpacity = function(element){
- return $(element).style.opacity || '';
-}
-
-Element.childrenWithClassName = function(element, className, findFirst) {
- var classNameRegExp = new RegExp("(^|\\s)" + className + "(\\s|$)");
- var results = $A($(element).getElementsByTagName('*'))[findFirst ? 'detect' : 'select']( function(c) {
- return (c.className && c.className.match(classNameRegExp));
- });
- if(!results) results = [];
- return results;
-}
-
-Element.forceRerendering = function(element) {
- try {
- element = $(element);
- var n = document.createTextNode(' ');
- element.appendChild(n);
- element.removeChild(n);
- } catch(e) { }
-};
-
-/*--------------------------------------------------------------------------*/
-
-Array.prototype.call = function() {
- var args = arguments;
- this.each(function(f){ f.apply(this, args) });
-}
-
-/*--------------------------------------------------------------------------*/
-
-var Effect = {
- _elementDoesNotExistError: {
- name: 'ElementDoesNotExistError',
- message: 'The specified DOM element does not exist, but is required for this effect to operate'
- },
- tagifyText: function(element) {
- if(typeof Builder == 'undefined')
- throw("Effect.tagifyText requires including script.aculo.us' builder.js library");
-
- var tagifyStyle = 'position:relative';
- if(/MSIE/.test(navigator.userAgent) && !window.opera) tagifyStyle += ';zoom:1';
- element = $(element);
- $A(element.childNodes).each( function(child) {
- if(child.nodeType==3) {
- child.nodeValue.toArray().each( function(character) {
- element.insertBefore(
- Builder.node('span',{style: tagifyStyle},
- character == ' ' ? String.fromCharCode(160) : character),
- child);
- });
- Element.remove(child);
- }
- });
- },
- multiple: function(element, effect) {
- var elements;
- if(((typeof element == 'object') ||
- (typeof element == 'function')) &&
- (element.length))
- elements = element;
- else
- elements = $(element).childNodes;
-
- var options = Object.extend({
- speed: 0.1,
- delay: 0.0
- }, arguments[2] || {});
- var masterDelay = options.delay;
-
- $A(elements).each( function(element, index) {
- new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay }));
- });
- },
- PAIRS: {
- 'slide': ['SlideDown','SlideUp'],
- 'blind': ['BlindDown','BlindUp'],
- 'appear': ['Appear','Fade']
- },
- toggle: function(element, effect) {
- element = $(element);
- effect = (effect || 'appear').toLowerCase();
- var options = Object.extend({
- queue: { position:'end', scope:(element.id || 'global'), limit: 1 }
- }, arguments[2] || {});
- Effect[element.visible() ?
- Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);
- }
-};
-
-var Effect2 = Effect; // deprecated
-
-/* ------------- transitions ------------- */
-
-Effect.Transitions = {}
-
-Effect.Transitions.linear = Prototype.K;
-
-Effect.Transitions.sinoidal = function(pos) {
- return (-Math.cos(pos*Math.PI)/2) + 0.5;
-}
-Effect.Transitions.reverse = function(pos) {
- return 1-pos;
-}
-Effect.Transitions.flicker = function(pos) {
- return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;
-}
-Effect.Transitions.wobble = function(pos) {
- return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;
-}
-Effect.Transitions.pulse = function(pos) {
- return (Math.floor(pos*10) % 2 == 0 ?
- (pos*10-Math.floor(pos*10)) : 1-(pos*10-Math.floor(pos*10)));
-}
-Effect.Transitions.none = function(pos) {
- return 0;
-}
-Effect.Transitions.full = function(pos) {
- return 1;
-}
-
-/* ------------- core effects ------------- */
-
-Effect.ScopedQueue = Class.create();
-Object.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), {
- initialize: function() {
- this.effects = [];
- this.interval = null;
- },
- _each: function(iterator) {
- this.effects._each(iterator);
- },
- add: function(effect) {
- var timestamp = new Date().getTime();
-
- var position = (typeof effect.options.queue == 'string') ?
- effect.options.queue : effect.options.queue.position;
-
- switch(position) {
- case 'front':
- // move unstarted effects after this effect
- this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) {
- e.startOn += effect.finishOn;
- e.finishOn += effect.finishOn;
- });
- break;
- case 'end':
- // start effect after last queued effect has finished
- timestamp = this.effects.pluck('finishOn').max() || timestamp;
- break;
- }
-
- effect.startOn += timestamp;
- effect.finishOn += timestamp;
-
- if(!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))
- this.effects.push(effect);
-
- if(!this.interval)
- this.interval = setInterval(this.loop.bind(this), 40);
- },
- remove: function(effect) {
- this.effects = this.effects.reject(function(e) { return e==effect });
- if(this.effects.length == 0) {
- clearInterval(this.interval);
- this.interval = null;
- }
- },
- loop: function() {
- var timePos = new Date().getTime();
- this.effects.invoke('loop', timePos);
- }
-});
-
-Effect.Queues = {
- instances: $H(),
- get: function(queueName) {
- if(typeof queueName != 'string') return queueName;
-
- if(!this.instances[queueName])
- this.instances[queueName] = new Effect.ScopedQueue();
-
- return this.instances[queueName];
- }
-}
-Effect.Queue = Effect.Queues.get('global');
-
-Effect.DefaultOptions = {
- transition: Effect.Transitions.sinoidal,
- duration: 1.0, // seconds
- fps: 25.0, // max. 25fps due to Effect.Queue implementation
- sync: false, // true for combining
- from: 0.0,
- to: 1.0,
- delay: 0.0,
- queue: 'parallel'
-}
-
-Effect.Base = function() {};
-Effect.Base.prototype = {
- position: null,
- start: function(options) {
- this.options = Object.extend(Object.extend({},Effect.DefaultOptions), options || {});
- this.currentFrame = 0;
- this.state = 'idle';
- this.startOn = this.options.delay*1000;
- this.finishOn = this.startOn + (this.options.duration*1000);
- this.event('beforeStart');
- if(!this.options.sync)
- Effect.Queues.get(typeof this.options.queue == 'string' ?
- 'global' : this.options.queue.scope).add(this);
- },
- loop: function(timePos) {
- if(timePos >= this.startOn) {
- if(timePos >= this.finishOn) {
- this.render(1.0);
- this.cancel();
- this.event('beforeFinish');
- if(this.finish) this.finish();
- this.event('afterFinish');
- return;
- }
- var pos = (timePos - this.startOn) / (this.finishOn - this.startOn);
- var frame = Math.round(pos * this.options.fps * this.options.duration);
- if(frame > this.currentFrame) {
- this.render(pos);
- this.currentFrame = frame;
- }
- }
- },
- render: function(pos) {
- if(this.state == 'idle') {
- this.state = 'running';
- this.event('beforeSetup');
- if(this.setup) this.setup();
- this.event('afterSetup');
- }
- if(this.state == 'running') {
- if(this.options.transition) pos = this.options.transition(pos);
- pos *= (this.options.to-this.options.from);
- pos += this.options.from;
- this.position = pos;
- this.event('beforeUpdate');
- if(this.update) this.update(pos);
- this.event('afterUpdate');
- }
- },
- cancel: function() {
- if(!this.options.sync)
- Effect.Queues.get(typeof this.options.queue == 'string' ?
- 'global' : this.options.queue.scope).remove(this);
- this.state = 'finished';
- },
- event: function(eventName) {
- if(this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);
- if(this.options[eventName]) this.options[eventName](this);
- },
- inspect: function() {
- return '#<Effect:' + $H(this).inspect() + ',options:' + $H(this.options).inspect() + '>';
- }
-}
-
-Effect.Parallel = Class.create();
-Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), {
- initialize: function(effects) {
- this.effects = effects || [];
- this.start(arguments[1]);
- },
- update: function(position) {
- this.effects.invoke('render', position);
- },
- finish: function(position) {
- this.effects.each( function(effect) {
- effect.render(1.0);
- effect.cancel();
- effect.event('beforeFinish');
- if(effect.finish) effect.finish(position);
- effect.event('afterFinish');
- });
- }
-});
-
-Effect.Opacity = Class.create();
-Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), {
- initialize: function(element) {
- this.element = $(element);
- if(!this.element) throw(Effect._elementDoesNotExistError);
- // make this work on IE on elements without 'layout'
- if(/MSIE/.test(navigator.userAgent) && !window.opera && (!this.element.currentStyle.hasLayout))
- this.element.setStyle({zoom: 1});
- var options = Object.extend({
- from: this.element.getOpacity() || 0.0,
- to: 1.0
- }, arguments[1] || {});
- this.start(options);
- },
- update: function(position) {
- this.element.setOpacity(position);
- }
-});
-
-Effect.Move = Class.create();
-Object.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), {
- initialize: function(element) {
- this.element = $(element);
- if(!this.element) throw(Effect._elementDoesNotExistError);
- var options = Object.extend({
- x: 0,
- y: 0,
- mode: 'relative'
- }, arguments[1] || {});
- this.start(options);
- },
- setup: function() {
- // Bug in Opera: Opera returns the "real" position of a static element or
- // relative element that does not have top/left explicitly set.
- // ==> Always set top and left for position relative elements in your stylesheets
- // (to 0 if you do not need them)
- this.element.makePositioned();
- this.originalLeft = parseFloat(this.element.getStyle('left') || '0');
- this.originalTop = parseFloat(this.element.getStyle('top') || '0');
- if(this.options.mode == 'absolute') {
- // absolute movement, so we need to calc deltaX and deltaY
- this.options.x = this.options.x - this.originalLeft;
- this.options.y = this.options.y - this.originalTop;
- }
- },
- update: function(position) {
- this.element.setStyle({
- left: Math.round(this.options.x * position + this.originalLeft) + 'px',
- top: Math.round(this.options.y * position + this.originalTop) + 'px'
- });
- }
-});
-
-// for backwards compatibility
-Effect.MoveBy = function(element, toTop, toLeft) {
- return new Effect.Move(element,
- Object.extend({ x: toLeft, y: toTop }, arguments[3] || {}));
-};
-
-Effect.Scale = Class.create();
-Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), {
- initialize: function(element, percent) {
- this.element = $(element);
- if(!this.element) throw(Effect._elementDoesNotExistError);
- var options = Object.extend({
- scaleX: true,
- scaleY: true,
- scaleContent: true,
- scaleFromCenter: false,
- scaleMode: 'box', // 'box' or 'contents' or {} with provided values
- scaleFrom: 100.0,
- scaleTo: percent
- }, arguments[2] || {});
- this.start(options);
- },
- setup: function() {
- this.restoreAfterFinish = this.options.restoreAfterFinish || false;
- this.elementPositioning = this.element.getStyle('position');
-
- this.originalStyle = {};
- ['top','left','width','height','fontSize'].each( function(k) {
- this.originalStyle[k] = this.element.style[k];
- }.bind(this));
-
- this.originalTop = this.element.offsetTop;
- this.originalLeft = this.element.offsetLeft;
-
- var fontSize = this.element.getStyle('font-size') || '100%';
- ['em','px','%','pt'].each( function(fontSizeType) {
- if(fontSize.indexOf(fontSizeType)>0) {
- this.fontSize = parseFloat(fontSize);
- this.fontSizeType = fontSizeType;
- }
- }.bind(this));
-
- this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;
-
- this.dims = null;
- if(this.options.scaleMode=='box')
- this.dims = [this.element.offsetHeight, this.element.offsetWidth];
- if(/^content/.test(this.options.scaleMode))
- this.dims = [this.element.scrollHeight, this.element.scrollWidth];
- if(!this.dims)
- this.dims = [this.options.scaleMode.originalHeight,
- this.options.scaleMode.originalWidth];
- },
- update: function(position) {
- var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);
- if(this.options.scaleContent && this.fontSize)
- this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType });
- this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);
- },
- finish: function(position) {
- if (this.restoreAfterFinish) this.element.setStyle(this.originalStyle);
- },
- setDimensions: function(height, width) {
- var d = {};
- if(this.options.scaleX) d.width = Math.round(width) + 'px';
- if(this.options.scaleY) d.height = Math.round(height) + 'px';
- if(this.options.scaleFromCenter) {
- var topd = (height - this.dims[0])/2;
- var leftd = (width - this.dims[1])/2;
- if(this.elementPositioning == 'absolute') {
- if(this.options.scaleY) d.top = this.originalTop-topd + 'px';
- if(this.options.scaleX) d.left = this.originalLeft-leftd + 'px';
- } else {
- if(this.options.scaleY) d.top = -topd + 'px';
- if(this.options.scaleX) d.left = -leftd + 'px';
- }
- }
- this.element.setStyle(d);
- }
-});
-
-Effect.Highlight = Class.create();
-Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), {
- initialize: function(element) {
- this.element = $(element);
- if(!this.element) throw(Effect._elementDoesNotExistError);
- var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || {});
- this.start(options);
- },
- setup: function() {
- // Prevent executing on elements not in the layout flow
- if(this.element.getStyle('display')=='none') { this.cancel(); return; }
- // Disable background image during the effect
- this.oldStyle = {
- backgroundImage: this.element.getStyle('background-image') };
- this.element.setStyle({backgroundImage: 'none'});
- if(!this.options.endcolor)
- this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff');
- if(!this.options.restorecolor)
- this.options.restorecolor = this.element.getStyle('background-color');
- // init color calculations
- this._base = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this));
- this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this));
- },
- update: function(position) {
- this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){
- return m+(Math.round(this._base[i]+(this._delta[i]*position)).toColorPart()); }.bind(this)) });
- },
- finish: function() {
- this.element.setStyle(Object.extend(this.oldStyle, {
- backgroundColor: this.options.restorecolor
- }));
- }
-});
-
-Effect.ScrollTo = Class.create();
-Object.extend(Object.extend(Effect.ScrollTo.prototype, Effect.Base.prototype), {
- initialize: function(element) {
- this.element = $(element);
- this.start(arguments[1] || {});
- },
- setup: function() {
- Position.prepare();
- var offsets = Position.cumulativeOffset(this.element);
- if(this.options.offset) offsets[1] += this.options.offset;
- var max = window.innerHeight ?
- window.height - window.innerHeight :
- document.body.scrollHeight -
- (document.documentElement.clientHeight ?
- document.documentElement.clientHeight : document.body.clientHeight);
- this.scrollStart = Position.deltaY;
- this.delta = (offsets[1] > max ? max : offsets[1]) - this.scrollStart;
- },
- update: function(position) {
- Position.prepare();
- window.scrollTo(Position.deltaX,
- this.scrollStart + (position*this.delta));
- }
-});
-
-/* ------------- combination effects ------------- */
-
-Effect.Fade = function(element) {
- element = $(element);
- var oldOpacity = element.getInlineOpacity();
- var options = Object.extend({
- from: element.getOpacity() || 1.0,
- to: 0.0,
- afterFinishInternal: function(effect) {
- if(effect.options.to!=0) return;
- effect.element.hide();
- effect.element.setStyle({opacity: oldOpacity});
- }}, arguments[1] || {});
- return new Effect.Opacity(element,options);
-}
-
-Effect.Appear = function(element) {
- element = $(element);
- var options = Object.extend({
- from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0),
- to: 1.0,
- // force Safari to render floated elements properly
- afterFinishInternal: function(effect) {
- effect.element.forceRerendering();
- },
- beforeSetup: function(effect) {
- effect.element.setOpacity(effect.options.from);
- effect.element.show();
- }}, arguments[1] || {});
- return new Effect.Opacity(element,options);
-}
-
-Effect.Puff = function(element) {
- element = $(element);
- var oldStyle = {
- opacity: element.getInlineOpacity(),
- position: element.getStyle('position'),
- top: element.style.top,
- left: element.style.left,
- width: element.style.width,
- height: element.style.height
- };
- return new Effect.Parallel(
- [ new Effect.Scale(element, 200,
- { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }),
- new Effect.Opacity(element, { sync: true, to: 0.0 } ) ],
- Object.extend({ duration: 1.0,
- beforeSetupInternal: function(effect) {
- Position.absolutize(effect.effects[0].element)
- },
- afterFinishInternal: function(effect) {
- effect.effects[0].element.hide();
- effect.effects[0].element.setStyle(oldStyle); }
- }, arguments[1] || {})
- );
-}
-
-Effect.BlindUp = function(element) {
- element = $(element);
- element.makeClipping();
- return new Effect.Scale(element, 0,
- Object.extend({ scaleContent: false,
- scaleX: false,
- restoreAfterFinish: true,
- afterFinishInternal: function(effect) {
- effect.element.hide();
- effect.element.undoClipping();
- }
- }, arguments[1] || {})
- );
-}
-
-Effect.BlindDown = function(element) {
- element = $(element);
- var elementDimensions = element.getDimensions();
- return new Effect.Scale(element, 100, Object.extend({
- scaleContent: false,
- scaleX: false,
- scaleFrom: 0,
- scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
- restoreAfterFinish: true,
- afterSetup: function(effect) {
- effect.element.makeClipping();
- effect.element.setStyle({height: '0px'});
- effect.element.show();
- },
- afterFinishInternal: function(effect) {
- effect.element.undoClipping();
- }
- }, arguments[1] || {}));
-}
-
-Effect.SwitchOff = function(element) {
- element = $(element);
- var oldOpacity = element.getInlineOpacity();
- return new Effect.Appear(element, Object.extend({
- duration: 0.4,
- from: 0,
- transition: Effect.Transitions.flicker,
- afterFinishInternal: function(effect) {
- new Effect.Scale(effect.element, 1, {
- duration: 0.3, scaleFromCenter: true,
- scaleX: false, scaleContent: false, restoreAfterFinish: true,
- beforeSetup: function(effect) {
- effect.element.makePositioned();
- effect.element.makeClipping();
- },
- afterFinishInternal: function(effect) {
- effect.element.hide();
- effect.element.undoClipping();
- effect.element.undoPositioned();
- effect.element.setStyle({opacity: oldOpacity});
- }
- })
- }
- }, arguments[1] || {}));
-}
-
-Effect.DropOut = function(element) {
- element = $(element);
- var oldStyle = {
- top: element.getStyle('top'),
- left: element.getStyle('left'),
- opacity: element.getInlineOpacity() };
- return new Effect.Parallel(
- [ new Effect.Move(element, {x: 0, y: 100, sync: true }),
- new Effect.Opacity(element, { sync: true, to: 0.0 }) ],
- Object.extend(
- { duration: 0.5,
- beforeSetup: function(effect) {
- effect.effects[0].element.makePositioned();
- },
- afterFinishInternal: function(effect) {
- effect.effects[0].element.hide();
- effect.effects[0].element.undoPositioned();
- effect.effects[0].element.setStyle(oldStyle);
- }
- }, arguments[1] || {}));
-}
-
-Effect.Shake = function(element) {
- element = $(element);
- var oldStyle = {
- top: element.getStyle('top'),
- left: element.getStyle('left') };
- return new Effect.Move(element,
- { x: 20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
- new Effect.Move(effect.element,
- { x: -40, y: 0, duration: 0.1, afterFinishInternal: function(effect) {
- new Effect.Move(effect.element,
- { x: 40, y: 0, duration: 0.1, afterFinishInternal: function(effect) {
- new Effect.Move(effect.element,
- { x: -40, y: 0, duration: 0.1, afterFinishInternal: function(effect) {
- new Effect.Move(effect.element,
- { x: 40, y: 0, duration: 0.1, afterFinishInternal: function(effect) {
- new Effect.Move(effect.element,
- { x: -20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
- effect.element.undoPositioned();
- effect.element.setStyle(oldStyle);
- }}) }}) }}) }}) }}) }});
-}
-
-Effect.SlideDown = function(element) {
- element = $(element);
- element.cleanWhitespace();
- // SlideDown need to have the content of the element wrapped in a container element with fixed height!
- var oldInnerBottom = $(element.firstChild).getStyle('bottom');
- var elementDimensions = element.getDimensions();
- return new Effect.Scale(element, 100, Object.extend({
- scaleContent: false,
- scaleX: false,
- scaleFrom: window.opera ? 0 : 1,
- scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
- restoreAfterFinish: true,
- afterSetup: function(effect) {
- effect.element.makePositioned();
- effect.element.firstChild.makePositioned();
- if(window.opera) effect.element.setStyle({top: ''});
- effect.element.makeClipping();
- effect.element.setStyle({height: '0px'});
- effect.element.show(); },
- afterUpdateInternal: function(effect) {
- effect.element.firstChild.setStyle({bottom:
- (effect.dims[0] - effect.element.clientHeight) + 'px' });
- },
- afterFinishInternal: function(effect) {
- effect.element.undoClipping();
- // IE will crash if child is undoPositioned first
- if(/MSIE/.test(navigator.userAgent) && !window.opera){
- effect.element.undoPositioned();
- effect.element.firstChild.undoPositioned();
- }else{
- effect.element.firstChild.undoPositioned();
- effect.element.undoPositioned();
- }
- effect.element.firstChild.setStyle({bottom: oldInnerBottom}); }
- }, arguments[1] || {})
- );
-}
-
-Effect.SlideUp = function(element) {
- element = $(element);
- element.cleanWhitespace();
- var oldInnerBottom = $(element.firstChild).getStyle('bottom');
- return new Effect.Scale(element, window.opera ? 0 : 1,
- Object.extend({ scaleContent: false,
- scaleX: false,
- scaleMode: 'box',
- scaleFrom: 100,
- restoreAfterFinish: true,
- beforeStartInternal: function(effect) {
- effect.element.makePositioned();
- effect.element.firstChild.makePositioned();
- if(window.opera) effect.element.setStyle({top: ''});
- effect.element.makeClipping();
- effect.element.show(); },
- afterUpdateInternal: function(effect) {
- effect.element.firstChild.setStyle({bottom:
- (effect.dims[0] - effect.element.clientHeight) + 'px' }); },
- afterFinishInternal: function(effect) {
- effect.element.hide();
- effect.element.undoClipping();
- effect.element.firstChild.undoPositioned();
- effect.element.undoPositioned();
- effect.element.setStyle({bottom: oldInnerBottom}); }
- }, arguments[1] || {})
- );
-}
-
-// Bug in opera makes the TD containing this element expand for a instance after finish
-Effect.Squish = function(element) {
- return new Effect.Scale(element, window.opera ? 1 : 0,
- { restoreAfterFinish: true,
- beforeSetup: function(effect) {
- effect.element.makeClipping(effect.element); },
- afterFinishInternal: function(effect) {
- effect.element.hide(effect.element);
- effect.element.undoClipping(effect.element); }
- });
-}
-
-Effect.Grow = function(element) {
- element = $(element);
- var options = Object.extend({
- direction: 'center',
- moveTransition: Effect.Transitions.sinoidal,
- scaleTransition: Effect.Transitions.sinoidal,
- opacityTransition: Effect.Transitions.full
- }, arguments[1] || {});
- var oldStyle = {
- top: element.style.top,
- left: element.style.left,
- height: element.style.height,
- width: element.style.width,
- opacity: element.getInlineOpacity() };
-
- var dims = element.getDimensions();
- var initialMoveX, initialMoveY;
- var moveX, moveY;
-
- switch (options.direction) {
- case 'top-left':
- initialMoveX = initialMoveY = moveX = moveY = 0;
- break;
- case 'top-right':
- initialMoveX = dims.width;
- initialMoveY = moveY = 0;
- moveX = -dims.width;
- break;
- case 'bottom-left':
- initialMoveX = moveX = 0;
- initialMoveY = dims.height;
- moveY = -dims.height;
- break;
- case 'bottom-right':
- initialMoveX = dims.width;
- initialMoveY = dims.height;
- moveX = -dims.width;
- moveY = -dims.height;
- break;
- case 'center':
- initialMoveX = dims.width / 2;
- initialMoveY = dims.height / 2;
- moveX = -dims.width / 2;
- moveY = -dims.height / 2;
- break;
- }
-
- return new Effect.Move(element, {
- x: initialMoveX,
- y: initialMoveY,
- duration: 0.01,
- beforeSetup: function(effect) {
- effect.element.hide();
- effect.element.makeClipping();
- effect.element.makePositioned();
- },
- afterFinishInternal: function(effect) {
- new Effect.Parallel(
- [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }),
- new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }),
- new Effect.Scale(effect.element, 100, {
- scaleMode: { originalHeight: dims.height, originalWidth: dims.width },
- sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})
- ], Object.extend({
- beforeSetup: function(effect) {
- effect.effects[0].element.setStyle({height: '0px'});
- effect.effects[0].element.show();
- },
- afterFinishInternal: function(effect) {
- effect.effects[0].element.undoClipping();
- effect.effects[0].element.undoPositioned();
- effect.effects[0].element.setStyle(oldStyle);
- }
- }, options)
- )
- }
- });
-}
-
-Effect.Shrink = function(element) {
- element = $(element);
- var options = Object.extend({
- direction: 'center',
- moveTransition: Effect.Transitions.sinoidal,
- scaleTransition: Effect.Transitions.sinoidal,
- opacityTransition: Effect.Transitions.none
- }, arguments[1] || {});
- var oldStyle = {
- top: element.style.top,
- left: element.style.left,
- height: element.style.height,
- width: element.style.width,
- opacity: element.getInlineOpacity() };
-
- var dims = element.getDimensions();
- var moveX, moveY;
-
- switch (options.direction) {
- case 'top-left':
- moveX = moveY = 0;
- break;
- case 'top-right':
- moveX = dims.width;
- moveY = 0;
- break;
- case 'bottom-left':
- moveX = 0;
- moveY = dims.height;
- break;
- case 'bottom-right':
- moveX = dims.width;
- moveY = dims.height;
- break;
- case 'center':
- moveX = dims.width / 2;
- moveY = dims.height / 2;
- break;
- }
-
- return new Effect.Parallel(
- [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }),
- new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}),
- new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition })
- ], Object.extend({
- beforeStartInternal: function(effect) {
- effect.effects[0].element.makePositioned();
- effect.effects[0].element.makeClipping(); },
- afterFinishInternal: function(effect) {
- effect.effects[0].element.hide();
- effect.effects[0].element.undoClipping();
- effect.effects[0].element.undoPositioned();
- effect.effects[0].element.setStyle(oldStyle); }
- }, options)
- );
-}
-
-Effect.Pulsate = function(element) {
- element = $(element);
- var options = arguments[1] || {};
- var oldOpacity = element.getInlineOpacity();
- var transition = options.transition || Effect.Transitions.sinoidal;
- var reverser = function(pos){ return transition(1-Effect.Transitions.pulse(pos)) };
- reverser.bind(transition);
- return new Effect.Opacity(element,
- Object.extend(Object.extend({ duration: 3.0, from: 0,
- afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); }
- }, options), {transition: reverser}));
-}
-
-Effect.Fold = function(element) {
- element = $(element);
- var oldStyle = {
- top: element.style.top,
- left: element.style.left,
- width: element.style.width,
- height: element.style.height };
- Element.makeClipping(element);
- return new Effect.Scale(element, 5, Object.extend({
- scaleContent: false,
- scaleX: false,
- afterFinishInternal: function(effect) {
- new Effect.Scale(element, 1, {
- scaleContent: false,
- scaleY: false,
- afterFinishInternal: function(effect) {
- effect.element.hide();
- effect.element.undoClipping();
- effect.element.setStyle(oldStyle);
- } });
- }}, arguments[1] || {}));
-};
-
-['setOpacity','getOpacity','getInlineOpacity','forceRerendering','setContentZoom',
- 'collectTextNodes','collectTextNodesIgnoreClass','childrenWithClassName'].each(
- function(f) { Element.Methods[f] = Element[f]; }
-);
-
-Element.Methods.visualEffect = function(element, effect, options) {
- s = effect.gsub(/_/, '-').camelize();
- effect_class = s.charAt(0).toUpperCase() + s.substring(1);
- new Effect[effect_class](element, options);
- return $(element);
-};
-
+// script.aculo.us effects.js v1.6.4, Wed Sep 06 11:30:58 CEST 2006\r
+\r
+// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)\r
+// Contributors:\r
+// Justin Palmer (http://encytemedia.com/)\r
+// Mark Pilgrim (http://diveintomark.org/)\r
+// Martin Bialasinki\r
+// \r
+// See scriptaculous.js for full license. \r
+\r
+// converts rgb() and #xxx to #xxxxxx format, \r
+// returns self (or first argument) if not convertable \r
+String.prototype.parseColor = function() { \r
+ var color = '#'; \r
+ if(this.slice(0,4) == 'rgb(') { \r
+ var cols = this.slice(4,this.length-1).split(','); \r
+ var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3); \r
+ } else { \r
+ if(this.slice(0,1) == '#') { \r
+ if(this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase(); \r
+ if(this.length==7) color = this.toLowerCase(); \r
+ } \r
+ } \r
+ return(color.length==7 ? color : (arguments[0] || this)); \r
+}\r
+\r
+/*--------------------------------------------------------------------------*/\r
+\r
+Element.collectTextNodes = function(element) { \r
+ return $A($(element).childNodes).collect( function(node) {\r
+ return (node.nodeType==3 ? node.nodeValue : \r
+ (node.hasChildNodes() ? Element.collectTextNodes(node) : ''));\r
+ }).flatten().join('');\r
+}\r
+\r
+Element.collectTextNodesIgnoreClass = function(element, className) { \r
+ return $A($(element).childNodes).collect( function(node) {\r
+ return (node.nodeType==3 ? node.nodeValue : \r
+ ((node.hasChildNodes() && !Element.hasClassName(node,className)) ? \r
+ Element.collectTextNodesIgnoreClass(node, className) : ''));\r
+ }).flatten().join('');\r
+}\r
+\r
+Element.setContentZoom = function(element, percent) {\r
+ element = $(element); \r
+ Element.setStyle(element, {fontSize: (percent/100) + 'em'}); \r
+ if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);\r
+}\r
+\r
+Element.getOpacity = function(element){ \r
+ var opacity;\r
+ if (opacity = Element.getStyle(element, 'opacity')) \r
+ return parseFloat(opacity); \r
+ if (opacity = (Element.getStyle(element, 'filter') || '').match(/alpha\(opacity=(.*)\)/)) \r
+ if(opacity[1]) return parseFloat(opacity[1]) / 100; \r
+ return 1.0; \r
+}\r
+\r
+Element.setOpacity = function(element, value){ \r
+ element= $(element); \r
+ if (value == 1){\r
+ Element.setStyle(element, { opacity: \r
+ (/Gecko/.test(navigator.userAgent) && !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? \r
+ 0.999999 : 1.0 });\r
+ if(/MSIE/.test(navigator.userAgent) && !window.opera) \r
+ Element.setStyle(element, {filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'')}); \r
+ } else { \r
+ if(value < 0.00001) value = 0; \r
+ Element.setStyle(element, {opacity: value});\r
+ if(/MSIE/.test(navigator.userAgent) && !window.opera) \r
+ Element.setStyle(element, \r
+ { filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'') +\r
+ 'alpha(opacity='+value*100+')' }); \r
+ }\r
+} \r
+ \r
+Element.getInlineOpacity = function(element){ \r
+ return $(element).style.opacity || '';\r
+} \r
+\r
+Element.childrenWithClassName = function(element, className, findFirst) {\r
+ var classNameRegExp = new RegExp("(^|\\s)" + className + "(\\s|$)");\r
+ var results = $A($(element).getElementsByTagName('*'))[findFirst ? 'detect' : 'select']( function(c) { \r
+ return (c.className && c.className.match(classNameRegExp));\r
+ });\r
+ if(!results) results = [];\r
+ return results;\r
+}\r
+\r
+Element.forceRerendering = function(element) {\r
+ try {\r
+ element = $(element);\r
+ var n = document.createTextNode(' ');\r
+ element.appendChild(n);\r
+ element.removeChild(n);\r
+ } catch(e) { }\r
+};\r
+\r
+/*--------------------------------------------------------------------------*/\r
+\r
+Array.prototype.call = function() {\r
+ var args = arguments;\r
+ this.each(function(f){ f.apply(this, args) });\r
+}\r
+\r
+/*--------------------------------------------------------------------------*/\r
+\r
+var Effect = {\r
+ _elementDoesNotExistError: {\r
+ name: 'ElementDoesNotExistError',\r
+ message: 'The specified DOM element does not exist, but is required for this effect to operate'\r
+ },\r
+ tagifyText: function(element) {\r
+ if(typeof Builder == 'undefined')\r
+ throw("Effect.tagifyText requires including script.aculo.us' builder.js library");\r
+ \r
+ var tagifyStyle = 'position:relative';\r
+ if(/MSIE/.test(navigator.userAgent) && !window.opera) tagifyStyle += ';zoom:1';\r
+ element = $(element);\r
+ $A(element.childNodes).each( function(child) {\r
+ if(child.nodeType==3) {\r
+ child.nodeValue.toArray().each( function(character) {\r
+ element.insertBefore(\r
+ Builder.node('span',{style: tagifyStyle},\r
+ character == ' ' ? String.fromCharCode(160) : character), \r
+ child);\r
+ });\r
+ Element.remove(child);\r
+ }\r
+ });\r
+ },\r
+ multiple: function(element, effect) {\r
+ var elements;\r
+ if(((typeof element == 'object') || \r
+ (typeof element == 'function')) && \r
+ (element.length))\r
+ elements = element;\r
+ else\r
+ elements = $(element).childNodes;\r
+ \r
+ var options = Object.extend({\r
+ speed: 0.1,\r
+ delay: 0.0\r
+ }, arguments[2] || {});\r
+ var masterDelay = options.delay;\r
+\r
+ $A(elements).each( function(element, index) {\r
+ new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay }));\r
+ });\r
+ },\r
+ PAIRS: {\r
+ 'slide': ['SlideDown','SlideUp'],\r
+ 'blind': ['BlindDown','BlindUp'],\r
+ 'appear': ['Appear','Fade']\r
+ },\r
+ toggle: function(element, effect) {\r
+ element = $(element);\r
+ effect = (effect || 'appear').toLowerCase();\r
+ var options = Object.extend({\r
+ queue: { position:'end', scope:(element.id || 'global'), limit: 1 }\r
+ }, arguments[2] || {});\r
+ Effect[element.visible() ? \r
+ Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);\r
+ }\r
+};\r
+\r
+var Effect2 = Effect; // deprecated\r
+\r
+/* ------------- transitions ------------- */\r
+\r
+Effect.Transitions = {}\r
+\r
+Effect.Transitions.linear = Prototype.K;\r
+\r
+Effect.Transitions.sinoidal = function(pos) {\r
+ return (-Math.cos(pos*Math.PI)/2) + 0.5;\r
+}\r
+Effect.Transitions.reverse = function(pos) {\r
+ return 1-pos;\r
+}\r
+Effect.Transitions.flicker = function(pos) {\r
+ return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;\r
+}\r
+Effect.Transitions.wobble = function(pos) {\r
+ return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;\r
+}\r
+Effect.Transitions.pulse = function(pos) {\r
+ return (Math.floor(pos*10) % 2 == 0 ? \r
+ (pos*10-Math.floor(pos*10)) : 1-(pos*10-Math.floor(pos*10)));\r
+}\r
+Effect.Transitions.none = function(pos) {\r
+ return 0;\r
+}\r
+Effect.Transitions.full = function(pos) {\r
+ return 1;\r
+}\r
+\r
+/* ------------- core effects ------------- */\r
+\r
+Effect.ScopedQueue = Class.create();\r
+Object.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), {\r
+ initialize: function() {\r
+ this.effects = [];\r
+ this.interval = null;\r
+ },\r
+ _each: function(iterator) {\r
+ this.effects._each(iterator);\r
+ },\r
+ add: function(effect) {\r
+ var timestamp = new Date().getTime();\r
+ \r
+ var position = (typeof effect.options.queue == 'string') ? \r
+ effect.options.queue : effect.options.queue.position;\r
+ \r
+ switch(position) {\r
+ case 'front':\r
+ // move unstarted effects after this effect \r
+ this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) {\r
+ e.startOn += effect.finishOn;\r
+ e.finishOn += effect.finishOn;\r
+ });\r
+ break;\r
+ case 'end':\r
+ // start effect after last queued effect has finished\r
+ timestamp = this.effects.pluck('finishOn').max() || timestamp;\r
+ break;\r
+ }\r
+ \r
+ effect.startOn += timestamp;\r
+ effect.finishOn += timestamp;\r
+\r
+ if(!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))\r
+ this.effects.push(effect);\r
+ \r
+ if(!this.interval) \r
+ this.interval = setInterval(this.loop.bind(this), 40);\r
+ },\r
+ remove: function(effect) {\r
+ this.effects = this.effects.reject(function(e) { return e==effect });\r
+ if(this.effects.length == 0) {\r
+ clearInterval(this.interval);\r
+ this.interval = null;\r
+ }\r
+ },\r
+ loop: function() {\r
+ var timePos = new Date().getTime();\r
+ this.effects.invoke('loop', timePos);\r
+ }\r
+});\r
+\r
+Effect.Queues = {\r
+ instances: $H(),\r
+ get: function(queueName) {\r
+ if(typeof queueName != 'string') return queueName;\r
+ \r
+ if(!this.instances[queueName])\r
+ this.instances[queueName] = new Effect.ScopedQueue();\r
+ \r
+ return this.instances[queueName];\r
+ }\r
+}\r
+Effect.Queue = Effect.Queues.get('global');\r
+\r
+Effect.DefaultOptions = {\r
+ transition: Effect.Transitions.sinoidal,\r
+ duration: 1.0, // seconds\r
+ fps: 25.0, // max. 25fps due to Effect.Queue implementation\r
+ sync: false, // true for combining\r
+ from: 0.0,\r
+ to: 1.0,\r
+ delay: 0.0,\r
+ queue: 'parallel'\r
+}\r
+\r
+Effect.Base = function() {};\r
+Effect.Base.prototype = {\r
+ position: null,\r
+ start: function(options) {\r
+ this.options = Object.extend(Object.extend({},Effect.DefaultOptions), options || {});\r
+ this.currentFrame = 0;\r
+ this.state = 'idle';\r
+ this.startOn = this.options.delay*1000;\r
+ this.finishOn = this.startOn + (this.options.duration*1000);\r
+ this.event('beforeStart');\r
+ if(!this.options.sync)\r
+ Effect.Queues.get(typeof this.options.queue == 'string' ? \r
+ 'global' : this.options.queue.scope).add(this);\r
+ },\r
+ loop: function(timePos) {\r
+ if(timePos >= this.startOn) {\r
+ if(timePos >= this.finishOn) {\r
+ this.render(1.0);\r
+ this.cancel();\r
+ this.event('beforeFinish');\r
+ if(this.finish) this.finish(); \r
+ this.event('afterFinish');\r
+ return; \r
+ }\r
+ var pos = (timePos - this.startOn) / (this.finishOn - this.startOn);\r
+ var frame = Math.round(pos * this.options.fps * this.options.duration);\r
+ if(frame > this.currentFrame) {\r
+ this.render(pos);\r
+ this.currentFrame = frame;\r
+ }\r
+ }\r
+ },\r
+ render: function(pos) {\r
+ if(this.state == 'idle') {\r
+ this.state = 'running';\r
+ this.event('beforeSetup');\r
+ if(this.setup) this.setup();\r
+ this.event('afterSetup');\r
+ }\r
+ if(this.state == 'running') {\r
+ if(this.options.transition) pos = this.options.transition(pos);\r
+ pos *= (this.options.to-this.options.from);\r
+ pos += this.options.from;\r
+ this.position = pos;\r
+ this.event('beforeUpdate');\r
+ if(this.update) this.update(pos);\r
+ this.event('afterUpdate');\r
+ }\r
+ },\r
+ cancel: function() {\r
+ if(!this.options.sync)\r
+ Effect.Queues.get(typeof this.options.queue == 'string' ? \r
+ 'global' : this.options.queue.scope).remove(this);\r
+ this.state = 'finished';\r
+ },\r
+ event: function(eventName) {\r
+ if(this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);\r
+ if(this.options[eventName]) this.options[eventName](this);\r
+ },\r
+ inspect: function() {\r
+ return '#<Effect:' + $H(this).inspect() + ',options:' + $H(this.options).inspect() + '>';\r
+ }\r
+}\r
+\r
+Effect.Parallel = Class.create();\r
+Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), {\r
+ initialize: function(effects) {\r
+ this.effects = effects || [];\r
+ this.start(arguments[1]);\r
+ },\r
+ update: function(position) {\r
+ this.effects.invoke('render', position);\r
+ },\r
+ finish: function(position) {\r
+ this.effects.each( function(effect) {\r
+ effect.render(1.0);\r
+ effect.cancel();\r
+ effect.event('beforeFinish');\r
+ if(effect.finish) effect.finish(position);\r
+ effect.event('afterFinish');\r
+ });\r
+ }\r
+});\r
+\r
+Effect.Opacity = Class.create();\r
+Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), {\r
+ initialize: function(element) {\r
+ this.element = $(element);\r
+ if(!this.element) throw(Effect._elementDoesNotExistError);\r
+ // make this work on IE on elements without 'layout'\r
+ if(/MSIE/.test(navigator.userAgent) && !window.opera && (!this.element.currentStyle.hasLayout))\r
+ this.element.setStyle({zoom: 1});\r
+ var options = Object.extend({\r
+ from: this.element.getOpacity() || 0.0,\r
+ to: 1.0\r
+ }, arguments[1] || {});\r
+ this.start(options);\r
+ },\r
+ update: function(position) {\r
+ this.element.setOpacity(position);\r
+ }\r
+});\r
+\r
+Effect.Move = Class.create();\r
+Object.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), {\r
+ initialize: function(element) {\r
+ this.element = $(element);\r
+ if(!this.element) throw(Effect._elementDoesNotExistError);\r
+ var options = Object.extend({\r
+ x: 0,\r
+ y: 0,\r
+ mode: 'relative'\r
+ }, arguments[1] || {});\r
+ this.start(options);\r
+ },\r
+ setup: function() {\r
+ // Bug in Opera: Opera returns the "real" position of a static element or\r
+ // relative element that does not have top/left explicitly set.\r
+ // ==> Always set top and left for position relative elements in your stylesheets \r
+ // (to 0 if you do not need them) \r
+ this.element.makePositioned();\r
+ this.originalLeft = parseFloat(this.element.getStyle('left') || '0');\r
+ this.originalTop = parseFloat(this.element.getStyle('top') || '0');\r
+ if(this.options.mode == 'absolute') {\r
+ // absolute movement, so we need to calc deltaX and deltaY\r
+ this.options.x = this.options.x - this.originalLeft;\r
+ this.options.y = this.options.y - this.originalTop;\r
+ }\r
+ },\r
+ update: function(position) {\r
+ this.element.setStyle({\r
+ left: Math.round(this.options.x * position + this.originalLeft) + 'px',\r
+ top: Math.round(this.options.y * position + this.originalTop) + 'px'\r
+ });\r
+ }\r
+});\r
+\r
+// for backwards compatibility\r
+Effect.MoveBy = function(element, toTop, toLeft) {\r
+ return new Effect.Move(element, \r
+ Object.extend({ x: toLeft, y: toTop }, arguments[3] || {}));\r
+};\r
+\r
+Effect.Scale = Class.create();\r
+Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), {\r
+ initialize: function(element, percent) {\r
+ this.element = $(element);\r
+ if(!this.element) throw(Effect._elementDoesNotExistError);\r
+ var options = Object.extend({\r
+ scaleX: true,\r
+ scaleY: true,\r
+ scaleContent: true,\r
+ scaleFromCenter: false,\r
+ scaleMode: 'box', // 'box' or 'contents' or {} with provided values\r
+ scaleFrom: 100.0,\r
+ scaleTo: percent\r
+ }, arguments[2] || {});\r
+ this.start(options);\r
+ },\r
+ setup: function() {\r
+ this.restoreAfterFinish = this.options.restoreAfterFinish || false;\r
+ this.elementPositioning = this.element.getStyle('position');\r
+ \r
+ this.originalStyle = {};\r
+ ['top','left','width','height','fontSize'].each( function(k) {\r
+ this.originalStyle[k] = this.element.style[k];\r
+ }.bind(this));\r
+ \r
+ this.originalTop = this.element.offsetTop;\r
+ this.originalLeft = this.element.offsetLeft;\r
+ \r
+ var fontSize = this.element.getStyle('font-size') || '100%';\r
+ ['em','px','%','pt'].each( function(fontSizeType) {\r
+ if(fontSize.indexOf(fontSizeType)>0) {\r
+ this.fontSize = parseFloat(fontSize);\r
+ this.fontSizeType = fontSizeType;\r
+ }\r
+ }.bind(this));\r
+ \r
+ this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;\r
+ \r
+ this.dims = null;\r
+ if(this.options.scaleMode=='box')\r
+ this.dims = [this.element.offsetHeight, this.element.offsetWidth];\r
+ if(/^content/.test(this.options.scaleMode))\r
+ this.dims = [this.element.scrollHeight, this.element.scrollWidth];\r
+ if(!this.dims)\r
+ this.dims = [this.options.scaleMode.originalHeight,\r
+ this.options.scaleMode.originalWidth];\r
+ },\r
+ update: function(position) {\r
+ var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);\r
+ if(this.options.scaleContent && this.fontSize)\r
+ this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType });\r
+ this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);\r
+ },\r
+ finish: function(position) {\r
+ if (this.restoreAfterFinish) this.element.setStyle(this.originalStyle);\r
+ },\r
+ setDimensions: function(height, width) {\r
+ var d = {};\r
+ if(this.options.scaleX) d.width = Math.round(width) + 'px';\r
+ if(this.options.scaleY) d.height = Math.round(height) + 'px';\r
+ if(this.options.scaleFromCenter) {\r
+ var topd = (height - this.dims[0])/2;\r
+ var leftd = (width - this.dims[1])/2;\r
+ if(this.elementPositioning == 'absolute') {\r
+ if(this.options.scaleY) d.top = this.originalTop-topd + 'px';\r
+ if(this.options.scaleX) d.left = this.originalLeft-leftd + 'px';\r
+ } else {\r
+ if(this.options.scaleY) d.top = -topd + 'px';\r
+ if(this.options.scaleX) d.left = -leftd + 'px';\r
+ }\r
+ }\r
+ this.element.setStyle(d);\r
+ }\r
+});\r
+\r
+Effect.Highlight = Class.create();\r
+Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), {\r
+ initialize: function(element) {\r
+ this.element = $(element);\r
+ if(!this.element) throw(Effect._elementDoesNotExistError);\r
+ var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || {});\r
+ this.start(options);\r
+ },\r
+ setup: function() {\r
+ // Prevent executing on elements not in the layout flow\r
+ if(this.element.getStyle('display')=='none') { this.cancel(); return; }\r
+ // Disable background image during the effect\r
+ this.oldStyle = {\r
+ backgroundImage: this.element.getStyle('background-image') };\r
+ this.element.setStyle({backgroundImage: 'none'});\r
+ if(!this.options.endcolor)\r
+ this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff');\r
+ if(!this.options.restorecolor)\r
+ this.options.restorecolor = this.element.getStyle('background-color');\r
+ // init color calculations\r
+ this._base = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this));\r
+ this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this));\r
+ },\r
+ update: function(position) {\r
+ this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){\r
+ return m+(Math.round(this._base[i]+(this._delta[i]*position)).toColorPart()); }.bind(this)) });\r
+ },\r
+ finish: function() {\r
+ this.element.setStyle(Object.extend(this.oldStyle, {\r
+ backgroundColor: this.options.restorecolor\r
+ }));\r
+ }\r
+});\r
+\r
+Effect.ScrollTo = Class.create();\r
+Object.extend(Object.extend(Effect.ScrollTo.prototype, Effect.Base.prototype), {\r
+ initialize: function(element) {\r
+ this.element = $(element);\r
+ this.start(arguments[1] || {});\r
+ },\r
+ setup: function() {\r
+ Position.prepare();\r
+ var offsets = Position.cumulativeOffset(this.element);\r
+ if(this.options.offset) offsets[1] += this.options.offset;\r
+ var max = window.innerHeight ? \r
+ window.height - window.innerHeight :\r
+ document.body.scrollHeight - \r
+ (document.documentElement.clientHeight ? \r
+ document.documentElement.clientHeight : document.body.clientHeight);\r
+ this.scrollStart = Position.deltaY;\r
+ this.delta = (offsets[1] > max ? max : offsets[1]) - this.scrollStart;\r
+ },\r
+ update: function(position) {\r
+ Position.prepare();\r
+ window.scrollTo(Position.deltaX, \r
+ this.scrollStart + (position*this.delta));\r
+ }\r
+});\r
+\r
+/* ------------- combination effects ------------- */\r
+\r
+Effect.Fade = function(element) {\r
+ element = $(element);\r
+ var oldOpacity = element.getInlineOpacity();\r
+ var options = Object.extend({\r
+ from: element.getOpacity() || 1.0,\r
+ to: 0.0,\r
+ afterFinishInternal: function(effect) { \r
+ if(effect.options.to!=0) return;\r
+ effect.element.hide();\r
+ effect.element.setStyle({opacity: oldOpacity}); \r
+ }}, arguments[1] || {});\r
+ return new Effect.Opacity(element,options);\r
+}\r
+\r
+Effect.Appear = function(element) {\r
+ element = $(element);\r
+ var options = Object.extend({\r
+ from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0),\r
+ to: 1.0,\r
+ // force Safari to render floated elements properly\r
+ afterFinishInternal: function(effect) {\r
+ effect.element.forceRerendering();\r
+ },\r
+ beforeSetup: function(effect) {\r
+ effect.element.setOpacity(effect.options.from);\r
+ effect.element.show(); \r
+ }}, arguments[1] || {});\r
+ return new Effect.Opacity(element,options);\r
+}\r
+\r
+Effect.Puff = function(element) {\r
+ element = $(element);\r
+ var oldStyle = { \r
+ opacity: element.getInlineOpacity(), \r
+ position: element.getStyle('position'),\r
+ top: element.style.top,\r
+ left: element.style.left,\r
+ width: element.style.width,\r
+ height: element.style.height\r
+ };\r
+ return new Effect.Parallel(\r
+ [ new Effect.Scale(element, 200, \r
+ { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }), \r
+ new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], \r
+ Object.extend({ duration: 1.0, \r
+ beforeSetupInternal: function(effect) {\r
+ Position.absolutize(effect.effects[0].element)\r
+ },\r
+ afterFinishInternal: function(effect) {\r
+ effect.effects[0].element.hide();\r
+ effect.effects[0].element.setStyle(oldStyle); }\r
+ }, arguments[1] || {})\r
+ );\r
+}\r
+\r
+Effect.BlindUp = function(element) {\r
+ element = $(element);\r
+ element.makeClipping();\r
+ return new Effect.Scale(element, 0,\r
+ Object.extend({ scaleContent: false, \r
+ scaleX: false, \r
+ restoreAfterFinish: true,\r
+ afterFinishInternal: function(effect) {\r
+ effect.element.hide();\r
+ effect.element.undoClipping();\r
+ } \r
+ }, arguments[1] || {})\r
+ );\r
+}\r
+\r
+Effect.BlindDown = function(element) {\r
+ element = $(element);\r
+ var elementDimensions = element.getDimensions();\r
+ return new Effect.Scale(element, 100, Object.extend({ \r
+ scaleContent: false, \r
+ scaleX: false,\r
+ scaleFrom: 0,\r
+ scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},\r
+ restoreAfterFinish: true,\r
+ afterSetup: function(effect) {\r
+ effect.element.makeClipping();\r
+ effect.element.setStyle({height: '0px'});\r
+ effect.element.show(); \r
+ }, \r
+ afterFinishInternal: function(effect) {\r
+ effect.element.undoClipping();\r
+ }\r
+ }, arguments[1] || {}));\r
+}\r
+\r
+Effect.SwitchOff = function(element) {\r
+ element = $(element);\r
+ var oldOpacity = element.getInlineOpacity();\r
+ return new Effect.Appear(element, Object.extend({\r
+ duration: 0.4,\r
+ from: 0,\r
+ transition: Effect.Transitions.flicker,\r
+ afterFinishInternal: function(effect) {\r
+ new Effect.Scale(effect.element, 1, { \r
+ duration: 0.3, scaleFromCenter: true,\r
+ scaleX: false, scaleContent: false, restoreAfterFinish: true,\r
+ beforeSetup: function(effect) { \r
+ effect.element.makePositioned();\r
+ effect.element.makeClipping();\r
+ },\r
+ afterFinishInternal: function(effect) {\r
+ effect.element.hide();\r
+ effect.element.undoClipping();\r
+ effect.element.undoPositioned();\r
+ effect.element.setStyle({opacity: oldOpacity});\r
+ }\r
+ })\r
+ }\r
+ }, arguments[1] || {}));\r
+}\r
+\r
+Effect.DropOut = function(element) {\r
+ element = $(element);\r
+ var oldStyle = {\r
+ top: element.getStyle('top'),\r
+ left: element.getStyle('left'),\r
+ opacity: element.getInlineOpacity() };\r
+ return new Effect.Parallel(\r
+ [ new Effect.Move(element, {x: 0, y: 100, sync: true }), \r
+ new Effect.Opacity(element, { sync: true, to: 0.0 }) ],\r
+ Object.extend(\r
+ { duration: 0.5,\r
+ beforeSetup: function(effect) {\r
+ effect.effects[0].element.makePositioned(); \r
+ },\r
+ afterFinishInternal: function(effect) {\r
+ effect.effects[0].element.hide();\r
+ effect.effects[0].element.undoPositioned();\r
+ effect.effects[0].element.setStyle(oldStyle);\r
+ } \r
+ }, arguments[1] || {}));\r
+}\r
+\r
+Effect.Shake = function(element) {\r
+ element = $(element);\r
+ var oldStyle = {\r
+ top: element.getStyle('top'),\r
+ left: element.getStyle('left') };\r
+ return new Effect.Move(element, \r
+ { x: 20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {\r
+ new Effect.Move(effect.element,\r
+ { x: -40, y: 0, duration: 0.1, afterFinishInternal: function(effect) {\r
+ new Effect.Move(effect.element,\r
+ { x: 40, y: 0, duration: 0.1, afterFinishInternal: function(effect) {\r
+ new Effect.Move(effect.element,\r
+ { x: -40, y: 0, duration: 0.1, afterFinishInternal: function(effect) {\r
+ new Effect.Move(effect.element,\r
+ { x: 40, y: 0, duration: 0.1, afterFinishInternal: function(effect) {\r
+ new Effect.Move(effect.element,\r
+ { x: -20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {\r
+ effect.element.undoPositioned();\r
+ effect.element.setStyle(oldStyle);\r
+ }}) }}) }}) }}) }}) }});\r
+}\r
+\r
+Effect.SlideDown = function(element) {\r
+ element = $(element);\r
+ element.cleanWhitespace();\r
+ // SlideDown need to have the content of the element wrapped in a container element with fixed height!\r
+ var oldInnerBottom = $(element.firstChild).getStyle('bottom');\r
+ var elementDimensions = element.getDimensions();\r
+ return new Effect.Scale(element, 100, Object.extend({ \r
+ scaleContent: false, \r
+ scaleX: false, \r
+ scaleFrom: window.opera ? 0 : 1,\r
+ scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},\r
+ restoreAfterFinish: true,\r
+ afterSetup: function(effect) {\r
+ effect.element.makePositioned();\r
+ effect.element.firstChild.makePositioned();\r
+ if(window.opera) effect.element.setStyle({top: ''});\r
+ effect.element.makeClipping();\r
+ effect.element.setStyle({height: '0px'});\r
+ effect.element.show(); },\r
+ afterUpdateInternal: function(effect) {\r
+ effect.element.firstChild.setStyle({bottom:\r
+ (effect.dims[0] - effect.element.clientHeight) + 'px' }); \r
+ },\r
+ afterFinishInternal: function(effect) {\r
+ effect.element.undoClipping(); \r
+ // IE will crash if child is undoPositioned first\r
+ if(/MSIE/.test(navigator.userAgent) && !window.opera){\r
+ effect.element.undoPositioned();\r
+ effect.element.firstChild.undoPositioned();\r
+ }else{\r
+ effect.element.firstChild.undoPositioned();\r
+ effect.element.undoPositioned();\r
+ }\r
+ effect.element.firstChild.setStyle({bottom: oldInnerBottom}); }\r
+ }, arguments[1] || {})\r
+ );\r
+}\r
+\r
+Effect.SlideUp = function(element) {\r
+ element = $(element);\r
+ element.cleanWhitespace();\r
+ var oldInnerBottom = $(element.firstChild).getStyle('bottom');\r
+ return new Effect.Scale(element, window.opera ? 0 : 1,\r
+ Object.extend({ scaleContent: false, \r
+ scaleX: false, \r
+ scaleMode: 'box',\r
+ scaleFrom: 100,\r
+ restoreAfterFinish: true,\r
+ beforeStartInternal: function(effect) {\r
+ effect.element.makePositioned();\r
+ effect.element.firstChild.makePositioned();\r
+ if(window.opera) effect.element.setStyle({top: ''});\r
+ effect.element.makeClipping();\r
+ effect.element.show(); }, \r
+ afterUpdateInternal: function(effect) {\r
+ effect.element.firstChild.setStyle({bottom:\r
+ (effect.dims[0] - effect.element.clientHeight) + 'px' }); },\r
+ afterFinishInternal: function(effect) {\r
+ effect.element.hide();\r
+ effect.element.undoClipping();\r
+ effect.element.firstChild.undoPositioned();\r
+ effect.element.undoPositioned();\r
+ effect.element.setStyle({bottom: oldInnerBottom}); }\r
+ }, arguments[1] || {})\r
+ );\r
+}\r
+\r
+// Bug in opera makes the TD containing this element expand for a instance after finish \r
+Effect.Squish = function(element) {\r
+ return new Effect.Scale(element, window.opera ? 1 : 0, \r
+ { restoreAfterFinish: true,\r
+ beforeSetup: function(effect) {\r
+ effect.element.makeClipping(effect.element); }, \r
+ afterFinishInternal: function(effect) {\r
+ effect.element.hide(effect.element); \r
+ effect.element.undoClipping(effect.element); }\r
+ });\r
+}\r
+\r
+Effect.Grow = function(element) {\r
+ element = $(element);\r
+ var options = Object.extend({\r
+ direction: 'center',\r
+ moveTransition: Effect.Transitions.sinoidal,\r
+ scaleTransition: Effect.Transitions.sinoidal,\r
+ opacityTransition: Effect.Transitions.full\r
+ }, arguments[1] || {});\r
+ var oldStyle = {\r
+ top: element.style.top,\r
+ left: element.style.left,\r
+ height: element.style.height,\r
+ width: element.style.width,\r
+ opacity: element.getInlineOpacity() };\r
+\r
+ var dims = element.getDimensions(); \r
+ var initialMoveX, initialMoveY;\r
+ var moveX, moveY;\r
+ \r
+ switch (options.direction) {\r
+ case 'top-left':\r
+ initialMoveX = initialMoveY = moveX = moveY = 0; \r
+ break;\r
+ case 'top-right':\r
+ initialMoveX = dims.width;\r
+ initialMoveY = moveY = 0;\r
+ moveX = -dims.width;\r
+ break;\r
+ case 'bottom-left':\r
+ initialMoveX = moveX = 0;\r
+ initialMoveY = dims.height;\r
+ moveY = -dims.height;\r
+ break;\r
+ case 'bottom-right':\r
+ initialMoveX = dims.width;\r
+ initialMoveY = dims.height;\r
+ moveX = -dims.width;\r
+ moveY = -dims.height;\r
+ break;\r
+ case 'center':\r
+ initialMoveX = dims.width / 2;\r
+ initialMoveY = dims.height / 2;\r
+ moveX = -dims.width / 2;\r
+ moveY = -dims.height / 2;\r
+ break;\r
+ }\r
+ \r
+ return new Effect.Move(element, {\r
+ x: initialMoveX,\r
+ y: initialMoveY,\r
+ duration: 0.01, \r
+ beforeSetup: function(effect) {\r
+ effect.element.hide();\r
+ effect.element.makeClipping();\r
+ effect.element.makePositioned();\r
+ },\r
+ afterFinishInternal: function(effect) {\r
+ new Effect.Parallel(\r
+ [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }),\r
+ new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }),\r
+ new Effect.Scale(effect.element, 100, {\r
+ scaleMode: { originalHeight: dims.height, originalWidth: dims.width }, \r
+ sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})\r
+ ], Object.extend({\r
+ beforeSetup: function(effect) {\r
+ effect.effects[0].element.setStyle({height: '0px'});\r
+ effect.effects[0].element.show(); \r
+ },\r
+ afterFinishInternal: function(effect) {\r
+ effect.effects[0].element.undoClipping();\r
+ effect.effects[0].element.undoPositioned();\r
+ effect.effects[0].element.setStyle(oldStyle); \r
+ }\r
+ }, options)\r
+ )\r
+ }\r
+ });\r
+}\r
+\r
+Effect.Shrink = function(element) {\r
+ element = $(element);\r
+ var options = Object.extend({\r
+ direction: 'center',\r
+ moveTransition: Effect.Transitions.sinoidal,\r
+ scaleTransition: Effect.Transitions.sinoidal,\r
+ opacityTransition: Effect.Transitions.none\r
+ }, arguments[1] || {});\r
+ var oldStyle = {\r
+ top: element.style.top,\r
+ left: element.style.left,\r
+ height: element.style.height,\r
+ width: element.style.width,\r
+ opacity: element.getInlineOpacity() };\r
+\r
+ var dims = element.getDimensions();\r
+ var moveX, moveY;\r
+ \r
+ switch (options.direction) {\r
+ case 'top-left':\r
+ moveX = moveY = 0;\r
+ break;\r
+ case 'top-right':\r
+ moveX = dims.width;\r
+ moveY = 0;\r
+ break;\r
+ case 'bottom-left':\r
+ moveX = 0;\r
+ moveY = dims.height;\r
+ break;\r
+ case 'bottom-right':\r
+ moveX = dims.width;\r
+ moveY = dims.height;\r
+ break;\r
+ case 'center': \r
+ moveX = dims.width / 2;\r
+ moveY = dims.height / 2;\r
+ break;\r
+ }\r
+ \r
+ return new Effect.Parallel(\r
+ [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }),\r
+ new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}),\r
+ new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition })\r
+ ], Object.extend({ \r
+ beforeStartInternal: function(effect) {\r
+ effect.effects[0].element.makePositioned();\r
+ effect.effects[0].element.makeClipping(); },\r
+ afterFinishInternal: function(effect) {\r
+ effect.effects[0].element.hide();\r
+ effect.effects[0].element.undoClipping();\r
+ effect.effects[0].element.undoPositioned();\r
+ effect.effects[0].element.setStyle(oldStyle); }\r
+ }, options)\r
+ );\r
+}\r
+\r
+Effect.Pulsate = function(element) {\r
+ element = $(element);\r
+ var options = arguments[1] || {};\r
+ var oldOpacity = element.getInlineOpacity();\r
+ var transition = options.transition || Effect.Transitions.sinoidal;\r
+ var reverser = function(pos){ return transition(1-Effect.Transitions.pulse(pos)) };\r
+ reverser.bind(transition);\r
+ return new Effect.Opacity(element, \r
+ Object.extend(Object.extend({ duration: 3.0, from: 0,\r
+ afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); }\r
+ }, options), {transition: reverser}));\r
+}\r
+\r
+Effect.Fold = function(element) {\r
+ element = $(element);\r
+ var oldStyle = {\r
+ top: element.style.top,\r
+ left: element.style.left,\r
+ width: element.style.width,\r
+ height: element.style.height };\r
+ Element.makeClipping(element);\r
+ return new Effect.Scale(element, 5, Object.extend({ \r
+ scaleContent: false,\r
+ scaleX: false,\r
+ afterFinishInternal: function(effect) {\r
+ new Effect.Scale(element, 1, { \r
+ scaleContent: false, \r
+ scaleY: false,\r
+ afterFinishInternal: function(effect) {\r
+ effect.element.hide();\r
+ effect.element.undoClipping(); \r
+ effect.element.setStyle(oldStyle);\r
+ } });\r
+ }}, arguments[1] || {}));\r
+};\r
+\r
+['setOpacity','getOpacity','getInlineOpacity','forceRerendering','setContentZoom',\r
+ 'collectTextNodes','collectTextNodesIgnoreClass','childrenWithClassName'].each( \r
+ function(f) { Element.Methods[f] = Element[f]; }\r
+);\r
+\r
+Element.Methods.visualEffect = function(element, effect, options) {\r
+ s = effect.gsub(/_/, '-').camelize();\r
+ effect_class = s.charAt(0).toUpperCase() + s.substring(1);\r
+ new Effect[effect_class](element, options);\r
+ return $(element);\r
+};\r
+\r
Element.addMethods();
\ No newline at end of file
-/*
-Copyright (c) 2005 JSON.org
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The Software shall be used for Good, not Evil.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-*/
-
-/*
- The global object JSON contains two methods.
-
- JSON.stringify(value) takes a JavaScript value and produces a JSON text.
- The value must not be cyclical.
-
- JSON.parse(text) takes a JSON text and produces a JavaScript value. It will
- return false if there is an error.
-*/
-var JSON = function () {
- var m = {
- '\b': '\\b',
- '\t': '\\t',
- '\n': '\\n',
- '\f': '\\f',
- '\r': '\\r',
- '"' : '\\"',
- '\\': '\\\\'
- },
- s = {
- 'boolean': function (x) {
- return String(x);
- },
- number: function (x) {
- return isFinite(x) ? String(x) : 'null';
- },
- string: function (x) {
- if (/["\\\x00-\x1f]/.test(x)) {
- x = x.replace(/([\x00-\x1f\\"])/g, function(a, b) {
- var c = m[b];
- if (c) {
- return c;
- }
- c = b.charCodeAt();
- return '\\u00' +
- Math.floor(c / 16).toString(16) +
- (c % 16).toString(16);
- });
- }
- return '"' + x + '"';
- },
- object: function (x) {
- if (x) {
- var a = [], b, f, i, l, v;
- if (x instanceof Array) {
- a[0] = '[';
- l = x.length;
- for (i = 0; i < l; i += 1) {
- v = x[i];
- f = s[typeof v];
- if (f) {
- v = f(v);
- if (typeof v == 'string') {
- if (b) {
- a[a.length] = ',';
- }
- a[a.length] = v;
- b = true;
- }
- }
- }
- a[a.length] = ']';
- } else if (x instanceof Object) {
- a[0] = '{';
- for (i in x) {
- v = x[i];
- f = s[typeof v];
- if (f) {
- v = f(v);
- if (typeof v == 'string') {
- if (b) {
- a[a.length] = ',';
- }
- a.push(s.string(i), ':', v);
- b = true;
- }
- }
- }
- a[a.length] = '}';
- } else {
- return;
- }
- return a.join('');
- }
- return 'null';
- }
- };
- return {
- copyright: '(c)2005 JSON.org',
- license: 'http://www.crockford.com/JSON/license.html',
-/*
- Stringify a JavaScript value, producing a JSON text.
-*/
- stringify: function (v) {
- var f = s[typeof v];
- if (f) {
- v = f(v);
- if (typeof v == 'string') {
- return v;
- }
- }
- return null;
- },
-/*
- Parse a JSON text, producing a JavaScript value.
- It returns false if there is a syntax error.
-*/
- parse: function (text) {
- try {
- return !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(
- text.replace(/"(\\.|[^"\\])*"/g, ''))) &&
- eval('(' + text + ')');
- } catch (e) {
- return false;
- }
- }
- };
+/*\r
+Copyright (c) 2005 JSON.org\r
+\r
+Permission is hereby granted, free of charge, to any person obtaining a copy\r
+of this software and associated documentation files (the "Software"), to deal\r
+in the Software without restriction, including without limitation the rights\r
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r
+copies of the Software, and to permit persons to whom the Software is\r
+furnished to do so, subject to the following conditions:\r
+\r
+The Software shall be used for Good, not Evil.\r
+\r
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
+SOFTWARE.\r
+*/\r
+\r
+/*\r
+ The global object JSON contains two methods.\r
+\r
+ JSON.stringify(value) takes a JavaScript value and produces a JSON text.\r
+ The value must not be cyclical.\r
+\r
+ JSON.parse(text) takes a JSON text and produces a JavaScript value. It will\r
+ return false if there is an error.\r
+*/\r
+var JSON = function () {\r
+ var m = {\r
+ '\b': '\\b',\r
+ '\t': '\\t',\r
+ '\n': '\\n',\r
+ '\f': '\\f',\r
+ '\r': '\\r',\r
+ '"' : '\\"',\r
+ '\\': '\\\\'\r
+ },\r
+ s = {\r
+ 'boolean': function (x) {\r
+ return String(x);\r
+ },\r
+ number: function (x) {\r
+ return isFinite(x) ? String(x) : 'null';\r
+ },\r
+ string: function (x) {\r
+ if (/["\\\x00-\x1f]/.test(x)) {\r
+ x = x.replace(/([\x00-\x1f\\"])/g, function(a, b) {\r
+ var c = m[b];\r
+ if (c) {\r
+ return c;\r
+ }\r
+ c = b.charCodeAt();\r
+ return '\\u00' +\r
+ Math.floor(c / 16).toString(16) +\r
+ (c % 16).toString(16);\r
+ });\r
+ }\r
+ return '"' + x + '"';\r
+ },\r
+ object: function (x) {\r
+ if (x) {\r
+ var a = [], b, f, i, l, v;\r
+ if (x instanceof Array) {\r
+ a[0] = '[';\r
+ l = x.length;\r
+ for (i = 0; i < l; i += 1) {\r
+ v = x[i];\r
+ f = s[typeof v];\r
+ if (f) {\r
+ v = f(v);\r
+ if (typeof v == 'string') {\r
+ if (b) {\r
+ a[a.length] = ',';\r
+ }\r
+ a[a.length] = v;\r
+ b = true;\r
+ }\r
+ }\r
+ }\r
+ a[a.length] = ']';\r
+ } else if (x instanceof Object) {\r
+ a[0] = '{';\r
+ for (i in x) {\r
+ v = x[i];\r
+ f = s[typeof v];\r
+ if (f) {\r
+ v = f(v);\r
+ if (typeof v == 'string') {\r
+ if (b) {\r
+ a[a.length] = ',';\r
+ }\r
+ a.push(s.string(i), ':', v);\r
+ b = true;\r
+ }\r
+ }\r
+ }\r
+ a[a.length] = '}';\r
+ } else {\r
+ return;\r
+ }\r
+ return a.join('');\r
+ }\r
+ return 'null';\r
+ }\r
+ };\r
+ return {\r
+ copyright: '(c)2005 JSON.org',\r
+ license: 'http://www.crockford.com/JSON/license.html',\r
+/*\r
+ Stringify a JavaScript value, producing a JSON text.\r
+*/\r
+ stringify: function (v) {\r
+ var f = s[typeof v];\r
+ if (f) {\r
+ v = f(v);\r
+ if (typeof v == 'string') {\r
+ return v;\r
+ }\r
+ }\r
+ return null;\r
+ },\r
+/*\r
+ Parse a JSON text, producing a JavaScript value.\r
+ It returns false if there is a syntax error.\r
+*/\r
+ parse: function (text) {\r
+ try {\r
+ return !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(\r
+ text.replace(/"(\\.|[^"\\])*"/g, ''))) &&\r
+ eval('(' + text + ')');\r
+ } catch (e) {\r
+ return false;\r
+ }\r
+ }\r
+ };\r
}();
\ No newline at end of file
-/* Prototype JavaScript framework, version 1.5.0_rc1
- * (c) 2005 Sam Stephenson <sam@conio.net>
- *
- * Prototype is freely distributable under the terms of an MIT-style license.
- * For details, see the Prototype web site: http://prototype.conio.net/
- *
-/*--------------------------------------------------------------------------*/
-
-var Prototype = {
- Version: '1.5.0_rc1',
- ScriptFragment: '(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)',
-
- emptyFunction: function() {},
- K: function(x) {return x}
-}
-
-var Class = {
- create: function() {
- return function() {
- this.initialize.apply(this, arguments);
- }
- }
-}
-
-var Abstract = new Object();
-
-Object.extend = function(destination, source) {
- for (var property in source) {
- destination[property] = source[property];
- }
- return destination;
-}
-
-Object.extend(Object, {
- inspect: function(object) {
- try {
- if (object == undefined) return 'undefined';
- if (object == null) return 'null';
- return object.inspect ? object.inspect() : object.toString();
- } catch (e) {
- if (e instanceof RangeError) return '...';
- throw e;
- }
- },
-
- keys: function(object) {
- var keys = [];
- for (var property in object)
- keys.push(property);
- return keys;
- },
-
- values: function(object) {
- var values = [];
- for (var property in object)
- values.push(object[property]);
- return values;
- },
-
- clone: function(object) {
- return Object.extend({}, object);
- }
-});
-
-Function.prototype.bind = function() {
- var __method = this, args = $A(arguments), object = args.shift();
- return function() {
- return __method.apply(object, args.concat($A(arguments)));
- }
-}
-
-Function.prototype.bindAsEventListener = function(object) {
- var __method = this, args = $A(arguments), object = args.shift();
- return function(event) {
- return __method.apply(object, [( event || window.event)].concat(args).concat($A(arguments)));
- }
-}
-
-Object.extend(Number.prototype, {
- toColorPart: function() {
- var digits = this.toString(16);
- if (this < 16) return '0' + digits;
- return digits;
- },
-
- succ: function() {
- return this + 1;
- },
-
- times: function(iterator) {
- $R(0, this, true).each(iterator);
- return this;
- }
-});
-
-var Try = {
- these: function() {
- var returnValue;
-
- for (var i = 0; i < arguments.length; i++) {
- var lambda = arguments[i];
- try {
- returnValue = lambda();
- break;
- } catch (e) {}
- }
-
- return returnValue;
- }
-}
-
-/*--------------------------------------------------------------------------*/
-
-var PeriodicalExecuter = Class.create();
-PeriodicalExecuter.prototype = {
- initialize: function(callback, frequency) {
- this.callback = callback;
- this.frequency = frequency;
- this.currentlyExecuting = false;
-
- this.registerCallback();
- },
-
- registerCallback: function() {
- this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
- },
-
- stop: function() {
- if (!this.timer) return;
- clearInterval(this.timer);
- this.timer = null;
- },
-
- onTimerEvent: function() {
- if (!this.currentlyExecuting) {
- try {
- this.currentlyExecuting = true;
- this.callback(this);
- } finally {
- this.currentlyExecuting = false;
- }
- }
- }
-}
-Object.extend(String.prototype, {
- gsub: function(pattern, replacement) {
- var result = '', source = this, match;
- replacement = arguments.callee.prepareReplacement(replacement);
-
- while (source.length > 0) {
- if (match = source.match(pattern)) {
- result += source.slice(0, match.index);
- result += (replacement(match) || '').toString();
- source = source.slice(match.index + match[0].length);
- } else {
- result += source, source = '';
- }
- }
- return result;
- },
-
- sub: function(pattern, replacement, count) {
- replacement = this.gsub.prepareReplacement(replacement);
- count = count === undefined ? 1 : count;
-
- return this.gsub(pattern, function(match) {
- if (--count < 0) return match[0];
- return replacement(match);
- });
- },
-
- scan: function(pattern, iterator) {
- this.gsub(pattern, iterator);
- return this;
- },
-
- truncate: function(length, truncation) {
- length = length || 30;
- truncation = truncation === undefined ? '...' : truncation;
- return this.length > length ?
- this.slice(0, length - truncation.length) + truncation : this;
- },
-
- strip: function() {
- return this.replace(/^\s+/, '').replace(/\s+$/, '');
- },
-
- stripTags: function() {
- return this.replace(/<\/?[^>]+>/gi, '');
- },
-
- stripScripts: function() {
- return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');
- },
-
- extractScripts: function() {
- var matchAll = new RegExp(Prototype.ScriptFragment, 'img');
- var matchOne = new RegExp(Prototype.ScriptFragment, 'im');
- return (this.match(matchAll) || []).map(function(scriptTag) {
- return (scriptTag.match(matchOne) || ['', ''])[1];
- });
- },
-
- evalScripts: function() {
- return this.extractScripts().map(function(script) { return eval(script) });
- },
-
- escapeHTML: function() {
- var div = document.createElement('div');
- var text = document.createTextNode(this);
- div.appendChild(text);
- return div.innerHTML;
- },
-
- unescapeHTML: function() {
- var div = document.createElement('div');
- div.innerHTML = this.stripTags();
- return div.childNodes[0] ? div.childNodes[0].nodeValue : '';
- },
-
- toQueryParams: function() {
- var pairs = this.match(/^\??(.*)$/)[1].split('&');
- return pairs.inject({}, function(params, pairString) {
- var pair = pairString.split('=');
- var value = pair[1] ? decodeURIComponent(pair[1]) : undefined;
- params[decodeURIComponent(pair[0])] = value;
- return params;
- });
- },
-
- toArray: function() {
- return this.split('');
- },
-
- camelize: function() {
- var oStringList = this.split('-');
- if (oStringList.length == 1) return oStringList[0];
-
- var camelizedString = this.indexOf('-') == 0
- ? oStringList[0].charAt(0).toUpperCase() + oStringList[0].substring(1)
- : oStringList[0];
-
- for (var i = 1, len = oStringList.length; i < len; i++) {
- var s = oStringList[i];
- camelizedString += s.charAt(0).toUpperCase() + s.substring(1);
- }
-
- return camelizedString;
- },
-
- inspect: function(useDoubleQuotes) {
- var escapedString = this.replace(/\\/g, '\\\\');
- if (useDoubleQuotes)
- return '"' + escapedString.replace(/"/g, '\\"') + '"';
- else
- return "'" + escapedString.replace(/'/g, '\\\'') + "'";
- }
-});
-
-String.prototype.gsub.prepareReplacement = function(replacement) {
- if (typeof replacement == 'function') return replacement;
- var template = new Template(replacement);
- return function(match) { return template.evaluate(match) };
-}
-
-String.prototype.parseQuery = String.prototype.toQueryParams;
-
-var Template = Class.create();
-Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
-Template.prototype = {
- initialize: function(template, pattern) {
- this.template = template.toString();
- this.pattern = pattern || Template.Pattern;
- },
-
- evaluate: function(object) {
- return this.template.gsub(this.pattern, function(match) {
- var before = match[1];
- if (before == '\\') return match[2];
- return before + (object[match[3]] || '').toString();
- });
- }
-}
-
-var $break = new Object();
-var $continue = new Object();
-
-var Enumerable = {
- each: function(iterator) {
- var index = 0;
- try {
- this._each(function(value) {
- try {
- iterator(value, index++);
- } catch (e) {
- if (e != $continue) throw e;
- }
- });
- } catch (e) {
- if (e != $break) throw e;
- }
- },
-
- all: function(iterator) {
- var result = true;
- this.each(function(value, index) {
- result = result && !!(iterator || Prototype.K)(value, index);
- if (!result) throw $break;
- });
- return result;
- },
-
- any: function(iterator) {
- var result = false;
- this.each(function(value, index) {
- if (result = !!(iterator || Prototype.K)(value, index))
- throw $break;
- });
- return result;
- },
-
- collect: function(iterator) {
- var results = [];
- this.each(function(value, index) {
- results.push(iterator(value, index));
- });
- return results;
- },
-
- detect: function (iterator) {
- var result;
- this.each(function(value, index) {
- if (iterator(value, index)) {
- result = value;
- throw $break;
- }
- });
- return result;
- },
-
- findAll: function(iterator) {
- var results = [];
- this.each(function(value, index) {
- if (iterator(value, index))
- results.push(value);
- });
- return results;
- },
-
- grep: function(pattern, iterator) {
- var results = [];
- this.each(function(value, index) {
- var stringValue = value.toString();
- if (stringValue.match(pattern))
- results.push((iterator || Prototype.K)(value, index));
- })
- return results;
- },
-
- include: function(object) {
- var found = false;
- this.each(function(value) {
- if (value == object) {
- found = true;
- throw $break;
- }
- });
- return found;
- },
-
- inject: function(memo, iterator) {
- this.each(function(value, index) {
- memo = iterator(memo, value, index);
- });
- return memo;
- },
-
- invoke: function(method) {
- var args = $A(arguments).slice(1);
- return this.collect(function(value) {
- return value[method].apply(value, args);
- });
- },
-
- max: function(iterator) {
- var result;
- this.each(function(value, index) {
- value = (iterator || Prototype.K)(value, index);
- if (result == undefined || value >= result)
- result = value;
- });
- return result;
- },
-
- min: function(iterator) {
- var result;
- this.each(function(value, index) {
- value = (iterator || Prototype.K)(value, index);
- if (result == undefined || value < result)
- result = value;
- });
- return result;
- },
-
- partition: function(iterator) {
- var trues = [], falses = [];
- this.each(function(value, index) {
- ((iterator || Prototype.K)(value, index) ?
- trues : falses).push(value);
- });
- return [trues, falses];
- },
-
- pluck: function(property) {
- var results = [];
- this.each(function(value, index) {
- results.push(value[property]);
- });
- return results;
- },
-
- reject: function(iterator) {
- var results = [];
- this.each(function(value, index) {
- if (!iterator(value, index))
- results.push(value);
- });
- return results;
- },
-
- sortBy: function(iterator) {
- return this.collect(function(value, index) {
- return {value: value, criteria: iterator(value, index)};
- }).sort(function(left, right) {
- var a = left.criteria, b = right.criteria;
- return a < b ? -1 : a > b ? 1 : 0;
- }).pluck('value');
- },
-
- toArray: function() {
- return this.collect(Prototype.K);
- },
-
- zip: function() {
- var iterator = Prototype.K, args = $A(arguments);
- if (typeof args.last() == 'function')
- iterator = args.pop();
-
- var collections = [this].concat(args).map($A);
- return this.map(function(value, index) {
- return iterator(collections.pluck(index));
- });
- },
-
- inspect: function() {
- return '#<Enumerable:' + this.toArray().inspect() + '>';
- }
-}
-
-Object.extend(Enumerable, {
- map: Enumerable.collect,
- find: Enumerable.detect,
- select: Enumerable.findAll,
- member: Enumerable.include,
- entries: Enumerable.toArray
-});
-var $A = Array.from = function(iterable) {
- if (!iterable) return [];
- if (iterable.toArray) {
- return iterable.toArray();
- } else {
- var results = [];
- for (var i = 0; i < iterable.length; i++)
- results.push(iterable[i]);
- return results;
- }
-}
-
-Object.extend(Array.prototype, Enumerable);
-
-if (!Array.prototype._reverse)
- Array.prototype._reverse = Array.prototype.reverse;
-
-Object.extend(Array.prototype, {
- _each: function(iterator) {
- for (var i = 0; i < this.length; i++)
- iterator(this[i]);
- },
-
- clear: function() {
- this.length = 0;
- return this;
- },
-
- first: function() {
- return this[0];
- },
-
- last: function() {
- return this[this.length - 1];
- },
-
- compact: function() {
- return this.select(function(value) {
- return value != undefined || value != null;
- });
- },
-
- flatten: function() {
- return this.inject([], function(array, value) {
- return array.concat(value && value.constructor == Array ?
- value.flatten() : [value]);
- });
- },
-
- without: function() {
- var values = $A(arguments);
- return this.select(function(value) {
- return !values.include(value);
- });
- },
-
- indexOf: function(object) {
- for (var i = 0; i < this.length; i++)
- if (this[i] == object) return i;
- return -1;
- },
-
- reverse: function(inline) {
- return (inline !== false ? this : this.toArray())._reverse();
- },
-
- reduce: function() {
- return this.length > 1 ? this : this[0];
- },
-
- uniq: function() {
- return this.inject([], function(array, value) {
- return array.include(value) ? array : array.concat([value]);
- });
- },
-
- inspect: function() {
- return '[' + this.map(Object.inspect).join(', ') + ']';
- }
-});
-var Hash = {
- _each: function(iterator) {
- for (var key in this) {
- var value = this[key];
- if (typeof value == 'function') continue;
-
- var pair = [key, value];
- pair.key = key;
- pair.value = value;
- iterator(pair);
- }
- },
-
- keys: function() {
- return this.pluck('key');
- },
-
- values: function() {
- return this.pluck('value');
- },
-
- merge: function(hash) {
- return $H(hash).inject($H(this), function(mergedHash, pair) {
- mergedHash[pair.key] = pair.value;
- return mergedHash;
- });
- },
-
- toQueryString: function() {
- return this.map(function(pair) {
- return pair.map(encodeURIComponent).join('=');
- }).join('&');
- },
-
- inspect: function() {
- return '#<Hash:{' + this.map(function(pair) {
- return pair.map(Object.inspect).join(': ');
- }).join(', ') + '}>';
- }
-}
-
-function $H(object) {
- var hash = Object.extend({}, object || {});
- Object.extend(hash, Enumerable);
- Object.extend(hash, Hash);
- return hash;
-}
-ObjectRange = Class.create();
-Object.extend(ObjectRange.prototype, Enumerable);
-Object.extend(ObjectRange.prototype, {
- initialize: function(start, end, exclusive) {
- this.start = start;
- this.end = end;
- this.exclusive = exclusive;
- },
-
- _each: function(iterator) {
- var value = this.start;
- while (this.include(value)) {
- iterator(value);
- value = value.succ();
- }
- },
-
- include: function(value) {
- if (value < this.start)
- return false;
- if (this.exclusive)
- return value < this.end;
- return value <= this.end;
- }
-});
-
-var $R = function(start, end, exclusive) {
- return new ObjectRange(start, end, exclusive);
-}
-
-var Ajax = {
- getTransport: function() {
- return Try.these(
- function() {return new XMLHttpRequest()},
- function() {return new ActiveXObject('Msxml2.XMLHTTP')},
- function() {return new ActiveXObject('Microsoft.XMLHTTP')}
- ) || false;
- },
-
- activeRequestCount: 0
-}
-
-Ajax.Responders = {
- responders: [],
-
- _each: function(iterator) {
- this.responders._each(iterator);
- },
-
- register: function(responderToAdd) {
- if (!this.include(responderToAdd))
- this.responders.push(responderToAdd);
- },
-
- unregister: function(responderToRemove) {
- this.responders = this.responders.without(responderToRemove);
- },
-
- dispatch: function(callback, request, transport, json) {
- this.each(function(responder) {
- if (responder[callback] && typeof responder[callback] == 'function') {
- try {
- responder[callback].apply(responder, [request, transport, json]);
- } catch (e) {}
- }
- });
- }
-};
-
-Object.extend(Ajax.Responders, Enumerable);
-
-Ajax.Responders.register({
- onCreate: function() {
- Ajax.activeRequestCount++;
- },
-
- onComplete: function() {
- Ajax.activeRequestCount--;
- }
-});
-
-Ajax.Base = function() {};
-Ajax.Base.prototype = {
- setOptions: function(options) {
- this.options = {
- method: 'post',
- asynchronous: true,
- contentType: 'application/x-www-form-urlencoded',
- parameters: ''
- }
- Object.extend(this.options, options || {});
- },
-
- responseIsSuccess: function() {
- return this.transport.status == undefined
- || this.transport.status == 0
- || (this.transport.status >= 200 && this.transport.status < 300);
- },
-
- responseIsFailure: function() {
- return !this.responseIsSuccess();
- }
-}
-
-Ajax.Request = Class.create();
-Ajax.Request.Events =
- ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
-
-Ajax.Request.prototype = Object.extend(new Ajax.Base(), {
- initialize: function(url, options) {
- this.transport = Ajax.getTransport();
- this.setOptions(options);
- this.request(url);
- },
-
- request: function(url) {
- var parameters = this.options.parameters || '';
- if (parameters.length > 0) parameters += '&_=';
-
- /* Simulate other verbs over post */
- if (this.options.method != 'get' && this.options.method != 'post') {
- parameters += (parameters.length > 0 ? '&' : '') + '_method=' + this.options.method;
- this.options.method = 'post';
- }
-
- try {
- this.url = url;
- if (this.options.method == 'get' && parameters.length > 0)
- this.url += (this.url.match(/\?/) ? '&' : '?') + parameters;
-
- Ajax.Responders.dispatch('onCreate', this, this.transport);
-
- this.transport.open(this.options.method, this.url,
- this.options.asynchronous);
-
- if (this.options.asynchronous)
- setTimeout(function() { this.respondToReadyState(1) }.bind(this), 10);
-
- this.transport.onreadystatechange = this.onStateChange.bind(this);
- this.setRequestHeaders();
-
- var body = this.options.postBody ? this.options.postBody : parameters;
- this.transport.send(this.options.method == 'post' ? body : null);
-
- /* Force Firefox to handle ready state 4 for synchronous requests */
- if (!this.options.asynchronous && this.transport.overrideMimeType)
- this.onStateChange();
-
- } catch (e) {
- this.dispatchException(e);
- }
- },
-
- setRequestHeaders: function() {
- var requestHeaders =
- ['X-Requested-With', 'XMLHttpRequest',
- 'X-Prototype-Version', Prototype.Version,
- 'Accept', 'text/javascript, text/html, application/xml, text/xml, */*'];
-
- if (this.options.method == 'post') {
- requestHeaders.push('Content-type', this.options.contentType);
-
- /* Force "Connection: close" for Mozilla browsers to work around
- * a bug where XMLHttpReqeuest sends an incorrect Content-length
- * header. See Mozilla Bugzilla #246651.
- */
- if (this.transport.overrideMimeType)
- requestHeaders.push('Connection', 'close');
- }
-
- if (this.options.requestHeaders)
- requestHeaders.push.apply(requestHeaders, this.options.requestHeaders);
-
- for (var i = 0; i < requestHeaders.length; i += 2)
- this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]);
- },
-
- onStateChange: function() {
- var readyState = this.transport.readyState;
- if (readyState != 1)
- this.respondToReadyState(this.transport.readyState);
- },
-
- header: function(name) {
- try {
- return this.transport.getResponseHeader(name);
- } catch (e) {}
- },
-
- evalJSON: function() {
- try {
- return eval('(' + this.header('X-JSON') + ')');
- } catch (e) {}
- },
-
- evalResponse: function() {
- try {
- return eval(this.transport.responseText);
- } catch (e) {
- this.dispatchException(e);
- }
- },
-
- respondToReadyState: function(readyState) {
- var event = Ajax.Request.Events[readyState];
- var transport = this.transport, json = this.evalJSON();
-
- if (event == 'Complete') {
- try {
- (this.options['on' + this.transport.status]
- || this.options['on' + (this.responseIsSuccess() ? 'Success' : 'Failure')]
- || Prototype.emptyFunction)(transport, json);
- } catch (e) {
- this.dispatchException(e);
- }
-
- if ((this.header('Content-type') || '').match(/^text\/javascript/i))
- this.evalResponse();
- }
-
- try {
- (this.options['on' + event] || Prototype.emptyFunction)(transport, json);
- Ajax.Responders.dispatch('on' + event, this, transport, json);
- } catch (e) {
- this.dispatchException(e);
- }
-
- /* Avoid memory leak in MSIE: clean up the oncomplete event handler */
- if (event == 'Complete')
- this.transport.onreadystatechange = Prototype.emptyFunction;
- },
-
- dispatchException: function(exception) {
- (this.options.onException || Prototype.emptyFunction)(this, exception);
- Ajax.Responders.dispatch('onException', this, exception);
- }
-});
-
-Ajax.Updater = Class.create();
-
-Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), {
- initialize: function(container, url, options) {
- this.containers = {
- success: container.success ? $(container.success) : $(container),
- failure: container.failure ? $(container.failure) :
- (container.success ? null : $(container))
- }
-
- this.transport = Ajax.getTransport();
- this.setOptions(options);
-
- var onComplete = this.options.onComplete || Prototype.emptyFunction;
- this.options.onComplete = (function(transport, object) {
- this.updateContent();
- onComplete(transport, object);
- }).bind(this);
-
- this.request(url);
- },
-
- updateContent: function() {
- var receiver = this.responseIsSuccess() ?
- this.containers.success : this.containers.failure;
- var response = this.transport.responseText;
-
- if (!this.options.evalScripts)
- response = response.stripScripts();
-
- if (receiver) {
- if (this.options.insertion) {
- new this.options.insertion(receiver, response);
- } else {
- Element.update(receiver, response);
- }
- }
-
- if (this.responseIsSuccess()) {
- if (this.onComplete)
- setTimeout(this.onComplete.bind(this), 10);
- }
- }
-});
-
-Ajax.PeriodicalUpdater = Class.create();
-Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), {
- initialize: function(container, url, options) {
- this.setOptions(options);
- this.onComplete = this.options.onComplete;
-
- this.frequency = (this.options.frequency || 2);
- this.decay = (this.options.decay || 1);
-
- this.updater = {};
- this.container = container;
- this.url = url;
-
- this.start();
- },
-
- start: function() {
- this.options.onComplete = this.updateComplete.bind(this);
- this.onTimerEvent();
- },
-
- stop: function() {
- this.updater.options.onComplete = undefined;
- clearTimeout(this.timer);
- (this.onComplete || Prototype.emptyFunction).apply(this, arguments);
- },
-
- updateComplete: function(request) {
- if (this.options.decay) {
- this.decay = (request.responseText == this.lastText ?
- this.decay * this.options.decay : 1);
-
- this.lastText = request.responseText;
- }
- this.timer = setTimeout(this.onTimerEvent.bind(this),
- this.decay * this.frequency * 1000);
- },
-
- onTimerEvent: function() {
- this.updater = new Ajax.Updater(this.container, this.url, this.options);
- }
-});
-function $() {
- var results = [], element;
- for (var i = 0; i < arguments.length; i++) {
- element = arguments[i];
- if (typeof element == 'string')
- element = document.getElementById(element);
- results.push(Element.extend(element));
- }
- return results.reduce();
-}
-
-document.getElementsByClassName = function(className, parentElement) {
- var children = ($(parentElement) || document.body).getElementsByTagName('*');
- return $A(children).inject([], function(elements, child) {
- if (child.className.match(new RegExp("(^|\\s)" + className + "(\\s|$)")))
- elements.push(Element.extend(child));
- return elements;
- });
-}
-
-/*--------------------------------------------------------------------------*/
-
-if (!window.Element)
- var Element = new Object();
-
-Element.extend = function(element) {
- if (!element) return;
- if (_nativeExtensions || element.nodeType == 3) return element;
-
- if (!element._extended && element.tagName && element != window) {
- var methods = Object.clone(Element.Methods), cache = Element.extend.cache;
-
- if (element.tagName == 'FORM')
- Object.extend(methods, Form.Methods);
- if (['INPUT', 'TEXTAREA', 'SELECT'].include(element.tagName))
- Object.extend(methods, Form.Element.Methods);
-
- for (var property in methods) {
- var value = methods[property];
- if (typeof value == 'function')
- element[property] = cache.findOrStore(value);
- }
- }
-
- element._extended = true;
- return element;
-}
-
-Element.extend.cache = {
- findOrStore: function(value) {
- return this[value] = this[value] || function() {
- return value.apply(null, [this].concat($A(arguments)));
- }
- }
-}
-
-Element.Methods = {
- visible: function(element) {
- return $(element).style.display != 'none';
- },
-
- toggle: function(element) {
- element = $(element);
- Element[Element.visible(element) ? 'hide' : 'show'](element);
- return element;
- },
-
- hide: function(element) {
- $(element).style.display = 'none';
- return element;
- },
-
- show: function(element) {
- $(element).style.display = '';
- return element;
- },
-
- remove: function(element) {
- element = $(element);
- element.parentNode.removeChild(element);
- return element;
- },
-
- update: function(element, html) {
- $(element).innerHTML = html.stripScripts();
- setTimeout(function() {html.evalScripts()}, 10);
- return element;
- },
-
- replace: function(element, html) {
- element = $(element);
- if (element.outerHTML) {
- element.outerHTML = html.stripScripts();
- } else {
- var range = element.ownerDocument.createRange();
- range.selectNodeContents(element);
- element.parentNode.replaceChild(
- range.createContextualFragment(html.stripScripts()), element);
- }
- setTimeout(function() {html.evalScripts()}, 10);
- return element;
- },
-
- inspect: function(element) {
- element = $(element);
- var result = '<' + element.tagName.toLowerCase();
- $H({'id': 'id', 'className': 'class'}).each(function(pair) {
- var property = pair.first(), attribute = pair.last();
- var value = (element[property] || '').toString();
- if (value) result += ' ' + attribute + '=' + value.inspect(true);
- });
- return result + '>';
- },
-
- recursivelyCollect: function(element, property) {
- element = $(element);
- var elements = [];
- while (element = element[property])
- if (element.nodeType == 1)
- elements.push(Element.extend(element));
- return elements;
- },
-
- ancestors: function(element) {
- return $(element).recursivelyCollect('parentNode');
- },
-
- descendants: function(element) {
- element = $(element);
- return $A(element.getElementsByTagName('*'));
- },
-
- previousSiblings: function(element) {
- return $(element).recursivelyCollect('previousSibling');
- },
-
- nextSiblings: function(element) {
- return $(element).recursivelyCollect('nextSibling');
- },
-
- siblings: function(element) {
- element = $(element);
- return element.previousSiblings().reverse().concat(element.nextSiblings());
- },
-
- match: function(element, selector) {
- element = $(element);
- if (typeof selector == 'string')
- selector = new Selector(selector);
- return selector.match(element);
- },
-
- up: function(element, expression, index) {
- return Selector.findElement($(element).ancestors(), expression, index);
- },
-
- down: function(element, expression, index) {
- return Selector.findElement($(element).descendants(), expression, index);
- },
-
- previous: function(element, expression, index) {
- return Selector.findElement($(element).previousSiblings(), expression, index);
- },
-
- next: function(element, expression, index) {
- return Selector.findElement($(element).nextSiblings(), expression, index);
- },
-
- getElementsBySelector: function() {
- var args = $A(arguments), element = $(args.shift());
- return Selector.findChildElements(element, args);
- },
-
- getElementsByClassName: function(element, className) {
- element = $(element);
- return document.getElementsByClassName(className, element);
- },
-
- getHeight: function(element) {
- element = $(element);
- return element.offsetHeight;
- },
-
- classNames: function(element) {
- return new Element.ClassNames(element);
- },
-
- hasClassName: function(element, className) {
- if (!(element = $(element))) return;
- return Element.classNames(element).include(className);
- },
-
- addClassName: function(element, className) {
- if (!(element = $(element))) return;
- Element.classNames(element).add(className);
- return element;
- },
-
- removeClassName: function(element, className) {
- if (!(element = $(element))) return;
- Element.classNames(element).remove(className);
- return element;
- },
-
- observe: function() {
- Event.observe.apply(Event, arguments);
- return $A(arguments).first();
- },
-
- stopObserving: function() {
- Event.stopObserving.apply(Event, arguments);
- return $A(arguments).first();
- },
-
- // removes whitespace-only text node children
- cleanWhitespace: function(element) {
- element = $(element);
- var node = element.firstChild;
- while (node) {
- var nextNode = node.nextSibling;
- if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
- element.removeChild(node);
- node = nextNode;
- }
- return element;
- },
-
- empty: function(element) {
- return $(element).innerHTML.match(/^\s*$/);
- },
-
- childOf: function(element, ancestor) {
- element = $(element), ancestor = $(ancestor);
- while (element = element.parentNode)
- if (element == ancestor) return true;
- return false;
- },
-
- scrollTo: function(element) {
- element = $(element);
- var x = element.x ? element.x : element.offsetLeft,
- y = element.y ? element.y : element.offsetTop;
- window.scrollTo(x, y);
- return element;
- },
-
- getStyle: function(element, style) {
- element = $(element);
- var value = element.style[style.camelize()];
- if (!value) {
- if (document.defaultView && document.defaultView.getComputedStyle) {
- var css = document.defaultView.getComputedStyle(element, null);
- value = css ? css.getPropertyValue(style) : null;
- } else if (element.currentStyle) {
- value = element.currentStyle[style.camelize()];
- }
- }
-
- if (window.opera && ['left', 'top', 'right', 'bottom'].include(style))
- if (Element.getStyle(element, 'position') == 'static') value = 'auto';
-
- return value == 'auto' ? null : value;
- },
-
- setStyle: function(element, style) {
- element = $(element);
- for (var name in style)
- element.style[name.camelize()] = style[name];
- return element;
- },
-
- getDimensions: function(element) {
- element = $(element);
- if (Element.getStyle(element, 'display') != 'none')
- return {width: element.offsetWidth, height: element.offsetHeight};
-
- // All *Width and *Height properties give 0 on elements with display none,
- // so enable the element temporarily
- var els = element.style;
- var originalVisibility = els.visibility;
- var originalPosition = els.position;
- els.visibility = 'hidden';
- els.position = 'absolute';
- els.display = '';
- var originalWidth = element.clientWidth;
- var originalHeight = element.clientHeight;
- els.display = 'none';
- els.position = originalPosition;
- els.visibility = originalVisibility;
- return {width: originalWidth, height: originalHeight};
- },
-
- makePositioned: function(element) {
- element = $(element);
- var pos = Element.getStyle(element, 'position');
- if (pos == 'static' || !pos) {
- element._madePositioned = true;
- element.style.position = 'relative';
- // Opera returns the offset relative to the positioning context, when an
- // element is position relative but top and left have not been defined
- if (window.opera) {
- element.style.top = 0;
- element.style.left = 0;
- }
- }
- return element;
- },
-
- undoPositioned: function(element) {
- element = $(element);
- if (element._madePositioned) {
- element._madePositioned = undefined;
- element.style.position =
- element.style.top =
- element.style.left =
- element.style.bottom =
- element.style.right = '';
- }
- return element;
- },
-
- makeClipping: function(element) {
- element = $(element);
- if (element._overflow) return;
- element._overflow = element.style.overflow || 'auto';
- if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden')
- element.style.overflow = 'hidden';
- return element;
- },
-
- undoClipping: function(element) {
- element = $(element);
- if (!element._overflow) return;
- element.style.overflow = element._overflow == 'auto' ? '' : element._overflow;
- element._overflow = null;
- return element;
- }
-}
-
-// IE is missing .innerHTML support for TABLE-related elements
-if(document.all){
- Element.Methods.update = function(element, html) {
- element = $(element);
- var tagName = element.tagName.toUpperCase();
- if (['THEAD','TBODY','TR','TD'].indexOf(tagName) > -1) {
- var div = document.createElement('div');
- switch (tagName) {
- case 'THEAD':
- case 'TBODY':
- div.innerHTML = '<table><tbody>' + html.stripScripts() + '</tbody></table>';
- depth = 2;
- break;
- case 'TR':
- div.innerHTML = '<table><tbody><tr>' + html.stripScripts() + '</tr></tbody></table>';
- depth = 3;
- break;
- case 'TD':
- div.innerHTML = '<table><tbody><tr><td>' + html.stripScripts() + '</td></tr></tbody></table>';
- depth = 4;
- }
- $A(element.childNodes).each(function(node){
- element.removeChild(node)
- });
- depth.times(function(){ div = div.firstChild });
-
- $A(div.childNodes).each(
- function(node){ element.appendChild(node) });
- } else {
- element.innerHTML = html.stripScripts();
- }
- setTimeout(function() {html.evalScripts()}, 10);
- return element;
- }
-}
-
-Object.extend(Element, Element.Methods);
-
-var _nativeExtensions = false;
-
-if (!window.HTMLElement && /Konqueror|Safari|KHTML/.test(navigator.userAgent)) {
- /* Emulate HTMLElement, HTMLFormElement, HTMLInputElement, HTMLTextAreaElement,
- and HTMLSelectElement in Safari */
- ['', 'Form', 'Input', 'TextArea', 'Select'].each(function(tag) {
- var klass = window['HTML' + tag + 'Element'] = {};
- klass.prototype = document.createElement(tag ? tag.toLowerCase() : 'div').__proto__;
- });
-}
-
-Element.addMethods = function(methods) {
- Object.extend(Element.Methods, methods || {});
-
- function copy(methods, destination) {
- var cache = Element.extend.cache;
- for (var property in methods) {
- var value = methods[property];
- destination[property] = cache.findOrStore(value);
- }
- }
-
- if (typeof HTMLElement != 'undefined') {
- copy(Element.Methods, HTMLElement.prototype);
- copy(Form.Methods, HTMLFormElement.prototype);
- [HTMLInputElement, HTMLTextAreaElement, HTMLSelectElement].each(function(klass) {
- copy(Form.Element.Methods, klass.prototype);
- });
- _nativeExtensions = true;
- }
-}
-
-var Toggle = new Object();
-Toggle.display = Element.toggle;
-
-/*--------------------------------------------------------------------------*/
-
-Abstract.Insertion = function(adjacency) {
- this.adjacency = adjacency;
-}
-
-Abstract.Insertion.prototype = {
- initialize: function(element, content) {
- this.element = $(element);
- this.content = content.stripScripts();
-
- if (this.adjacency && this.element.insertAdjacentHTML) {
- try {
- this.element.insertAdjacentHTML(this.adjacency, this.content);
- } catch (e) {
- var tagName = this.element.tagName.toLowerCase();
- if (tagName == 'tbody' || tagName == 'tr') {
- this.insertContent(this.contentFromAnonymousTable());
- } else {
- throw e;
- }
- }
- } else {
- this.range = this.element.ownerDocument.createRange();
- if (this.initializeRange) this.initializeRange();
- this.insertContent([this.range.createContextualFragment(this.content)]);
- }
-
- setTimeout(function() {content.evalScripts()}, 10);
- },
-
- contentFromAnonymousTable: function() {
- var div = document.createElement('div');
- div.innerHTML = '<table><tbody>' + this.content + '</tbody></table>';
- return $A(div.childNodes[0].childNodes[0].childNodes);
- }
-}
-
-var Insertion = new Object();
-
-Insertion.Before = Class.create();
-Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), {
- initializeRange: function() {
- this.range.setStartBefore(this.element);
- },
-
- insertContent: function(fragments) {
- fragments.each((function(fragment) {
- this.element.parentNode.insertBefore(fragment, this.element);
- }).bind(this));
- }
-});
-
-Insertion.Top = Class.create();
-Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), {
- initializeRange: function() {
- this.range.selectNodeContents(this.element);
- this.range.collapse(true);
- },
-
- insertContent: function(fragments) {
- fragments.reverse(false).each((function(fragment) {
- this.element.insertBefore(fragment, this.element.firstChild);
- }).bind(this));
- }
-});
-
-Insertion.Bottom = Class.create();
-Insertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), {
- initializeRange: function() {
- this.range.selectNodeContents(this.element);
- this.range.collapse(this.element);
- },
-
- insertContent: function(fragments) {
- fragments.each((function(fragment) {
- this.element.appendChild(fragment);
- }).bind(this));
- }
-});
-
-Insertion.After = Class.create();
-Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), {
- initializeRange: function() {
- this.range.setStartAfter(this.element);
- },
-
- insertContent: function(fragments) {
- fragments.each((function(fragment) {
- this.element.parentNode.insertBefore(fragment,
- this.element.nextSibling);
- }).bind(this));
- }
-});
-
-/*--------------------------------------------------------------------------*/
-
-Element.ClassNames = Class.create();
-Element.ClassNames.prototype = {
- initialize: function(element) {
- this.element = $(element);
- },
-
- _each: function(iterator) {
- this.element.className.split(/\s+/).select(function(name) {
- return name.length > 0;
- })._each(iterator);
- },
-
- set: function(className) {
- this.element.className = className;
- },
-
- add: function(classNameToAdd) {
- if (this.include(classNameToAdd)) return;
- this.set(this.toArray().concat(classNameToAdd).join(' '));
- },
-
- remove: function(classNameToRemove) {
- if (!this.include(classNameToRemove)) return;
- this.set(this.select(function(className) {
- return className != classNameToRemove;
- }).join(' '));
- },
-
- toString: function() {
- return this.toArray().join(' ');
- }
-}
-
-Object.extend(Element.ClassNames.prototype, Enumerable);
-var Selector = Class.create();
-Selector.prototype = {
- initialize: function(expression) {
- this.params = {classNames: []};
- this.expression = expression.toString().strip();
- this.parseExpression();
- this.compileMatcher();
- },
-
- parseExpression: function() {
- function abort(message) { throw 'Parse error in selector: ' + message; }
-
- if (this.expression == '') abort('empty expression');
-
- var params = this.params, expr = this.expression, match, modifier, clause, rest;
- while (match = expr.match(/^(.*)\[([a-z0-9_:-]+?)(?:([~\|!]?=)(?:"([^"]*)"|([^\]\s]*)))?\]$/i)) {
- params.attributes = params.attributes || [];
- params.attributes.push({name: match[2], operator: match[3], value: match[4] || match[5] || ''});
- expr = match[1];
- }
-
- if (expr == '*') return this.params.wildcard = true;
-
- while (match = expr.match(/^([^a-z0-9_-])?([a-z0-9_-]+)(.*)/i)) {
- modifier = match[1], clause = match[2], rest = match[3];
- switch (modifier) {
- case '#': params.id = clause; break;
- case '.': params.classNames.push(clause); break;
- case '':
- case undefined: params.tagName = clause.toUpperCase(); break;
- default: abort(expr.inspect());
- }
- expr = rest;
- }
-
- if (expr.length > 0) abort(expr.inspect());
- },
-
- buildMatchExpression: function() {
- var params = this.params, conditions = [], clause;
-
- if (params.wildcard)
- conditions.push('true');
- if (clause = params.id)
- conditions.push('element.id == ' + clause.inspect());
- if (clause = params.tagName)
- conditions.push('element.tagName.toUpperCase() == ' + clause.inspect());
- if ((clause = params.classNames).length > 0)
- for (var i = 0; i < clause.length; i++)
- conditions.push('Element.hasClassName(element, ' + clause[i].inspect() + ')');
- if (clause = params.attributes) {
- clause.each(function(attribute) {
- var value = 'element.getAttribute(' + attribute.name.inspect() + ')';
- var splitValueBy = function(delimiter) {
- return value + ' && ' + value + '.split(' + delimiter.inspect() + ')';
- }
-
- switch (attribute.operator) {
- case '=': conditions.push(value + ' == ' + attribute.value.inspect()); break;
- case '~=': conditions.push(splitValueBy(' ') + '.include(' + attribute.value.inspect() + ')'); break;
- case '|=': conditions.push(
- splitValueBy('-') + '.first().toUpperCase() == ' + attribute.value.toUpperCase().inspect()
- ); break;
- case '!=': conditions.push(value + ' != ' + attribute.value.inspect()); break;
- case '':
- case undefined: conditions.push(value + ' != null'); break;
- default: throw 'Unknown operator ' + attribute.operator + ' in selector';
- }
- });
- }
-
- return conditions.join(' && ');
- },
-
- compileMatcher: function() {
- this.match = new Function('element', 'if (!element.tagName) return false; \
- return ' + this.buildMatchExpression());
- },
-
- findElements: function(scope) {
- var element;
-
- if (element = $(this.params.id))
- if (this.match(element))
- if (!scope || Element.childOf(element, scope))
- return [element];
-
- scope = (scope || document).getElementsByTagName(this.params.tagName || '*');
-
- var results = [];
- for (var i = 0; i < scope.length; i++)
- if (this.match(element = scope[i]))
- results.push(Element.extend(element));
-
- return results;
- },
-
- toString: function() {
- return this.expression;
- }
-}
-
-Object.extend(Selector, {
- matchElements: function(elements, expression) {
- var selector = new Selector(expression);
- return elements.select(selector.match.bind(selector));
- },
-
- findElement: function(elements, expression, index) {
- if (typeof expression == 'number') index = expression, expression = false;
- return Selector.matchElements(elements, expression || '*')[index || 0];
- },
-
- findChildElements: function(element, expressions) {
- return expressions.map(function(expression) {
- return expression.strip().split(/\s+/).inject([null], function(results, expr) {
- var selector = new Selector(expr);
- return results.inject([], function(elements, result) {
- return elements.concat(selector.findElements(result || element));
- });
- });
- }).flatten();
- }
-});
-
-function $$() {
- return Selector.findChildElements(document, $A(arguments));
-}
-var Form = {
- reset: function(form) {
- $(form).reset();
- return form;
- }
-};
-
-Form.Methods = {
- serialize: function(form) {
- var elements = Form.getElements($(form));
- var queryComponents = new Array();
-
- for (var i = 0; i < elements.length; i++) {
- var queryComponent = Form.Element.serialize(elements[i]);
- if (queryComponent)
- queryComponents.push(queryComponent);
- }
-
- return queryComponents.join('&');
- },
-
- getElements: function(form) {
- form = $(form);
- var elements = new Array();
-
- for (var tagName in Form.Element.Serializers) {
- var tagElements = form.getElementsByTagName(tagName);
- for (var j = 0; j < tagElements.length; j++)
- elements.push(tagElements[j]);
- }
- return elements;
- },
-
- getInputs: function(form, typeName, name) {
- form = $(form);
- var inputs = form.getElementsByTagName('input');
-
- if (!typeName && !name)
- return inputs;
-
- var matchingInputs = new Array();
- for (var i = 0; i < inputs.length; i++) {
- var input = inputs[i];
- if ((typeName && input.type != typeName) ||
- (name && input.name != name))
- continue;
- matchingInputs.push(input);
- }
-
- return matchingInputs;
- },
-
- disable: function(form) {
- form = $(form);
- var elements = Form.getElements(form);
- for (var i = 0; i < elements.length; i++) {
- var element = elements[i];
- element.blur();
- element.disabled = 'true';
- }
- return form;
- },
-
- enable: function(form) {
- form = $(form);
- var elements = Form.getElements(form);
- for (var i = 0; i < elements.length; i++) {
- var element = elements[i];
- element.disabled = '';
- }
- return form;
- },
-
- findFirstElement: function(form) {
- return Form.getElements(form).find(function(element) {
- return element.type != 'hidden' && !element.disabled &&
- ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());
- });
- },
-
- focusFirstElement: function(form) {
- form = $(form);
- Field.activate(Form.findFirstElement(form));
- return form;
- }
-}
-
-Object.extend(Form, Form.Methods);
-
-/*--------------------------------------------------------------------------*/
-
-Form.Element = {
- focus: function(element) {
- $(element).focus();
- return element;
- },
-
- select: function(element) {
- $(element).select();
- return element;
- }
-}
-
-Form.Element.Methods = {
- serialize: function(element) {
- element = $(element);
- var method = element.tagName.toLowerCase();
- var parameter = Form.Element.Serializers[method](element);
-
- if (parameter) {
- var key = encodeURIComponent(parameter[0]);
- if (key.length == 0) return;
-
- if (parameter[1].constructor != Array)
- parameter[1] = [parameter[1]];
-
- return parameter[1].map(function(value) {
- return key + '=' + encodeURIComponent(value);
- }).join('&');
- }
- },
-
- getValue: function(element) {
- element = $(element);
- var method = element.tagName.toLowerCase();
- var parameter = Form.Element.Serializers[method](element);
-
- if (parameter)
- return parameter[1];
- },
-
- clear: function(element) {
- $(element).value = '';
- return element;
- },
-
- present: function(element) {
- return $(element).value != '';
- },
-
- activate: function(element) {
- element = $(element);
- element.focus();
- if (element.select)
- element.select();
- return element;
- },
-
- disable: function(element) {
- element = $(element);
- element.disabled = '';
- return element;
- },
-
- enable: function(element) {
- element = $(element);
- element.blur();
- element.disabled = 'true';
- return element;
- }
-}
-
-Object.extend(Form.Element, Form.Element.Methods);
-var Field = Form.Element;
-
-/*--------------------------------------------------------------------------*/
-
-Form.Element.Serializers = {
- input: function(element) {
- switch (element.type.toLowerCase()) {
- case 'checkbox':
- case 'radio':
- return Form.Element.Serializers.inputSelector(element);
- default:
- return Form.Element.Serializers.textarea(element);
- }
- return false;
- },
-
- inputSelector: function(element) {
- if (element.checked)
- return [element.name, element.value];
- },
-
- textarea: function(element) {
- return [element.name, element.value];
- },
-
- select: function(element) {
- return Form.Element.Serializers[element.type == 'select-one' ?
- 'selectOne' : 'selectMany'](element);
- },
-
- selectOne: function(element) {
- var value = '', opt, index = element.selectedIndex;
- if (index >= 0) {
- opt = element.options[index];
- value = opt.value || opt.text;
- }
- return [element.name, value];
- },
-
- selectMany: function(element) {
- var value = [];
- for (var i = 0; i < element.length; i++) {
- var opt = element.options[i];
- if (opt.selected)
- value.push(opt.value || opt.text);
- }
- return [element.name, value];
- }
-}
-
-/*--------------------------------------------------------------------------*/
-
-var $F = Form.Element.getValue;
-
-/*--------------------------------------------------------------------------*/
-
-Abstract.TimedObserver = function() {}
-Abstract.TimedObserver.prototype = {
- initialize: function(element, frequency, callback) {
- this.frequency = frequency;
- this.element = $(element);
- this.callback = callback;
-
- this.lastValue = this.getValue();
- this.registerCallback();
- },
-
- registerCallback: function() {
- setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
- },
-
- onTimerEvent: function() {
- var value = this.getValue();
- if (this.lastValue != value) {
- this.callback(this.element, value);
- this.lastValue = value;
- }
- }
-}
-
-Form.Element.Observer = Class.create();
-Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
- getValue: function() {
- return Form.Element.getValue(this.element);
- }
-});
-
-Form.Observer = Class.create();
-Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
- getValue: function() {
- return Form.serialize(this.element);
- }
-});
-
-/*--------------------------------------------------------------------------*/
-
-Abstract.EventObserver = function() {}
-Abstract.EventObserver.prototype = {
- initialize: function(element, callback) {
- this.element = $(element);
- this.callback = callback;
-
- this.lastValue = this.getValue();
- if (this.element.tagName.toLowerCase() == 'form')
- this.registerFormCallbacks();
- else
- this.registerCallback(this.element);
- },
-
- onElementEvent: function() {
- var value = this.getValue();
- if (this.lastValue != value) {
- this.callback(this.element, value);
- this.lastValue = value;
- }
- },
-
- registerFormCallbacks: function() {
- var elements = Form.getElements(this.element);
- for (var i = 0; i < elements.length; i++)
- this.registerCallback(elements[i]);
- },
-
- registerCallback: function(element) {
- if (element.type) {
- switch (element.type.toLowerCase()) {
- case 'checkbox':
- case 'radio':
- Event.observe(element, 'click', this.onElementEvent.bind(this));
- break;
- default:
- Event.observe(element, 'change', this.onElementEvent.bind(this));
- break;
- }
- }
- }
-}
-
-Form.Element.EventObserver = Class.create();
-Form.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
- getValue: function() {
- return Form.Element.getValue(this.element);
- }
-});
-
-Form.EventObserver = Class.create();
-Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
- getValue: function() {
- return Form.serialize(this.element);
- }
-});
-if (!window.Event) {
- var Event = new Object();
-}
-
-Object.extend(Event, {
- KEY_BACKSPACE: 8,
- KEY_TAB: 9,
- KEY_RETURN: 13,
- KEY_ESC: 27,
- KEY_LEFT: 37,
- KEY_UP: 38,
- KEY_RIGHT: 39,
- KEY_DOWN: 40,
- KEY_DELETE: 46,
- KEY_HOME: 36,
- KEY_END: 35,
- KEY_PAGEUP: 33,
- KEY_PAGEDOWN: 34,
-
- element: function(event) {
- return event.target || event.srcElement;
- },
-
- isLeftClick: function(event) {
- return (((event.which) && (event.which == 1)) ||
- ((event.button) && (event.button == 1)));
- },
-
- pointerX: function(event) {
- return event.pageX || (event.clientX +
- (document.documentElement.scrollLeft || document.body.scrollLeft));
- },
-
- pointerY: function(event) {
- return event.pageY || (event.clientY +
- (document.documentElement.scrollTop || document.body.scrollTop));
- },
-
- stop: function(event) {
- if (event.preventDefault) {
- event.preventDefault();
- event.stopPropagation();
- } else {
- event.returnValue = false;
- event.cancelBubble = true;
- }
- },
-
- // find the first node with the given tagName, starting from the
- // node the event was triggered on; traverses the DOM upwards
- findElement: function(event, tagName) {
- var element = Event.element(event);
- while (element.parentNode && (!element.tagName ||
- (element.tagName.toUpperCase() != tagName.toUpperCase())))
- element = element.parentNode;
- return element;
- },
-
- observers: false,
-
- _observeAndCache: function(element, name, observer, useCapture) {
- if (!this.observers) this.observers = [];
- if (element.addEventListener) {
- this.observers.push([element, name, observer, useCapture]);
- element.addEventListener(name, observer, useCapture);
- } else if (element.attachEvent) {
- this.observers.push([element, name, observer, useCapture]);
- element.attachEvent('on' + name, observer);
- }
- },
-
- unloadCache: function() {
- if (!Event.observers) return;
- for (var i = 0; i < Event.observers.length; i++) {
- Event.stopObserving.apply(this, Event.observers[i]);
- Event.observers[i][0] = null;
- }
- Event.observers = false;
- },
-
- observe: function(element, name, observer, useCapture) {
- element = $(element);
- useCapture = useCapture || false;
-
- if (name == 'keypress' &&
- (navigator.appVersion.match(/Konqueror|Safari|KHTML/)
- || element.attachEvent))
- name = 'keydown';
-
- Event._observeAndCache(element, name, observer, useCapture);
- },
-
- stopObserving: function(element, name, observer, useCapture) {
- element = $(element);
- useCapture = useCapture || false;
-
- if (name == 'keypress' &&
- (navigator.appVersion.match(/Konqueror|Safari|KHTML/)
- || element.detachEvent))
- name = 'keydown';
-
- if (element.removeEventListener) {
- element.removeEventListener(name, observer, useCapture);
- } else if (element.detachEvent) {
- try {
- element.detachEvent('on' + name, observer);
- } catch (e) {}
- }
- }
-});
-
-/* prevent memory leaks in IE */
-if (navigator.appVersion.match(/\bMSIE\b/))
- Event.observe(window, 'unload', Event.unloadCache, false);
-var Position = {
- // set to true if needed, warning: firefox performance problems
- // NOT neeeded for page scrolling, only if draggable contained in
- // scrollable elements
- includeScrollOffsets: false,
-
- // must be called before calling withinIncludingScrolloffset, every time the
- // page is scrolled
- prepare: function() {
- this.deltaX = window.pageXOffset
- || document.documentElement.scrollLeft
- || document.body.scrollLeft
- || 0;
- this.deltaY = window.pageYOffset
- || document.documentElement.scrollTop
- || document.body.scrollTop
- || 0;
- },
-
- realOffset: function(element) {
- var valueT = 0, valueL = 0;
- do {
- valueT += element.scrollTop || 0;
- valueL += element.scrollLeft || 0;
- element = element.parentNode;
- } while (element);
- return [valueL, valueT];
- },
-
- cumulativeOffset: function(element) {
- var valueT = 0, valueL = 0;
- do {
- valueT += element.offsetTop || 0;
- valueL += element.offsetLeft || 0;
- element = element.offsetParent;
- } while (element);
- return [valueL, valueT];
- },
-
- positionedOffset: function(element) {
- var valueT = 0, valueL = 0;
- do {
- valueT += element.offsetTop || 0;
- valueL += element.offsetLeft || 0;
- element = element.offsetParent;
- if (element) {
- p = Element.getStyle(element, 'position');
- if (p == 'relative' || p == 'absolute') break;
- }
- } while (element);
- return [valueL, valueT];
- },
-
- offsetParent: function(element) {
- if (element.offsetParent) return element.offsetParent;
- if (element == document.body) return element;
-
- while ((element = element.parentNode) && element != document.body)
- if (Element.getStyle(element, 'position') != 'static')
- return element;
-
- return document.body;
- },
-
- // caches x/y coordinate pair to use with overlap
- within: function(element, x, y) {
- if (this.includeScrollOffsets)
- return this.withinIncludingScrolloffsets(element, x, y);
- this.xcomp = x;
- this.ycomp = y;
- this.offset = this.cumulativeOffset(element);
-
- return (y >= this.offset[1] &&
- y < this.offset[1] + element.offsetHeight &&
- x >= this.offset[0] &&
- x < this.offset[0] + element.offsetWidth);
- },
-
- withinIncludingScrolloffsets: function(element, x, y) {
- var offsetcache = this.realOffset(element);
-
- this.xcomp = x + offsetcache[0] - this.deltaX;
- this.ycomp = y + offsetcache[1] - this.deltaY;
- this.offset = this.cumulativeOffset(element);
-
- return (this.ycomp >= this.offset[1] &&
- this.ycomp < this.offset[1] + element.offsetHeight &&
- this.xcomp >= this.offset[0] &&
- this.xcomp < this.offset[0] + element.offsetWidth);
- },
-
- // within must be called directly before
- overlap: function(mode, element) {
- if (!mode) return 0;
- if (mode == 'vertical')
- return ((this.offset[1] + element.offsetHeight) - this.ycomp) /
- element.offsetHeight;
- if (mode == 'horizontal')
- return ((this.offset[0] + element.offsetWidth) - this.xcomp) /
- element.offsetWidth;
- },
-
- page: function(forElement) {
- var valueT = 0, valueL = 0;
-
- var element = forElement;
- do {
- valueT += element.offsetTop || 0;
- valueL += element.offsetLeft || 0;
-
- // Safari fix
- if (element.offsetParent==document.body)
- if (Element.getStyle(element,'position')=='absolute') break;
-
- } while (element = element.offsetParent);
-
- element = forElement;
- do {
- if (!window.opera || element.tagName=='BODY') {
- valueT -= element.scrollTop || 0;
- valueL -= element.scrollLeft || 0;
- }
- } while (element = element.parentNode);
-
- return [valueL, valueT];
- },
-
- clone: function(source, target) {
- var options = Object.extend({
- setLeft: true,
- setTop: true,
- setWidth: true,
- setHeight: true,
- offsetTop: 0,
- offsetLeft: 0
- }, arguments[2] || {})
-
- // find page position of source
- source = $(source);
- var p = Position.page(source);
-
- // find coordinate system to use
- target = $(target);
- var delta = [0, 0];
- var parent = null;
- // delta [0,0] will do fine with position: fixed elements,
- // position:absolute needs offsetParent deltas
- if (Element.getStyle(target,'position') == 'absolute') {
- parent = Position.offsetParent(target);
- delta = Position.page(parent);
- }
-
- // correct by body offsets (fixes Safari)
- if (parent == document.body) {
- delta[0] -= document.body.offsetLeft;
- delta[1] -= document.body.offsetTop;
- }
-
- // set position
- if(options.setLeft) target.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px';
- if(options.setTop) target.style.top = (p[1] - delta[1] + options.offsetTop) + 'px';
- if(options.setWidth) target.style.width = source.offsetWidth + 'px';
- if(options.setHeight) target.style.height = source.offsetHeight + 'px';
- },
-
- absolutize: function(element) {
- element = $(element);
- if (element.style.position == 'absolute') return;
- Position.prepare();
-
- var offsets = Position.positionedOffset(element);
- var top = offsets[1];
- var left = offsets[0];
- var width = element.clientWidth;
- var height = element.clientHeight;
-
- element._originalLeft = left - parseFloat(element.style.left || 0);
- element._originalTop = top - parseFloat(element.style.top || 0);
- element._originalWidth = element.style.width;
- element._originalHeight = element.style.height;
-
- element.style.position = 'absolute';
- element.style.top = top + 'px';;
- element.style.left = left + 'px';;
- element.style.width = width + 'px';;
- element.style.height = height + 'px';;
- },
-
- relativize: function(element) {
- element = $(element);
- if (element.style.position == 'relative') return;
- Position.prepare();
-
- element.style.position = 'relative';
- var top = parseFloat(element.style.top || 0) - (element._originalTop || 0);
- var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);
-
- element.style.top = top + 'px';
- element.style.left = left + 'px';
- element.style.height = element._originalHeight;
- element.style.width = element._originalWidth;
- }
-}
-
-// Safari returns margins on body which is incorrect if the child is absolutely
-// positioned. For performance reasons, redefine Position.cumulativeOffset for
-// KHTML/WebKit only.
-if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) {
- Position.cumulativeOffset = function(element) {
- var valueT = 0, valueL = 0;
- do {
- valueT += element.offsetTop || 0;
- valueL += element.offsetLeft || 0;
- if (element.offsetParent == document.body)
- if (Element.getStyle(element, 'position') == 'absolute') break;
-
- element = element.offsetParent;
- } while (element);
-
- return [valueL, valueT];
- }
-}
-
+/* Prototype JavaScript framework, version 1.5.0_rc1\r
+ * (c) 2005 Sam Stephenson <sam@conio.net>\r
+ *\r
+ * Prototype is freely distributable under the terms of an MIT-style license.\r
+ * For details, see the Prototype web site: http://prototype.conio.net/\r
+ *\r
+/*--------------------------------------------------------------------------*/\r
+\r
+var Prototype = {\r
+ Version: '1.5.0_rc1',\r
+ ScriptFragment: '(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)',\r
+\r
+ emptyFunction: function() {},\r
+ K: function(x) {return x}\r
+}\r
+\r
+var Class = {\r
+ create: function() {\r
+ return function() {\r
+ this.initialize.apply(this, arguments);\r
+ }\r
+ }\r
+}\r
+\r
+var Abstract = new Object();\r
+\r
+Object.extend = function(destination, source) {\r
+ for (var property in source) {\r
+ destination[property] = source[property];\r
+ }\r
+ return destination;\r
+}\r
+\r
+Object.extend(Object, {\r
+ inspect: function(object) {\r
+ try {\r
+ if (object == undefined) return 'undefined';\r
+ if (object == null) return 'null';\r
+ return object.inspect ? object.inspect() : object.toString();\r
+ } catch (e) {\r
+ if (e instanceof RangeError) return '...';\r
+ throw e;\r
+ }\r
+ },\r
+\r
+ keys: function(object) {\r
+ var keys = [];\r
+ for (var property in object)\r
+ keys.push(property);\r
+ return keys;\r
+ },\r
+\r
+ values: function(object) {\r
+ var values = [];\r
+ for (var property in object)\r
+ values.push(object[property]);\r
+ return values;\r
+ },\r
+\r
+ clone: function(object) {\r
+ return Object.extend({}, object);\r
+ }\r
+});\r
+\r
+Function.prototype.bind = function() {\r
+ var __method = this, args = $A(arguments), object = args.shift();\r
+ return function() {\r
+ return __method.apply(object, args.concat($A(arguments)));\r
+ }\r
+}\r
+\r
+Function.prototype.bindAsEventListener = function(object) {\r
+ var __method = this, args = $A(arguments), object = args.shift();\r
+ return function(event) {\r
+ return __method.apply(object, [( event || window.event)].concat(args).concat($A(arguments)));\r
+ }\r
+}\r
+\r
+Object.extend(Number.prototype, {\r
+ toColorPart: function() {\r
+ var digits = this.toString(16);\r
+ if (this < 16) return '0' + digits;\r
+ return digits;\r
+ },\r
+\r
+ succ: function() {\r
+ return this + 1;\r
+ },\r
+\r
+ times: function(iterator) {\r
+ $R(0, this, true).each(iterator);\r
+ return this;\r
+ }\r
+});\r
+\r
+var Try = {\r
+ these: function() {\r
+ var returnValue;\r
+\r
+ for (var i = 0; i < arguments.length; i++) {\r
+ var lambda = arguments[i];\r
+ try {\r
+ returnValue = lambda();\r
+ break;\r
+ } catch (e) {}\r
+ }\r
+\r
+ return returnValue;\r
+ }\r
+}\r
+\r
+/*--------------------------------------------------------------------------*/\r
+\r
+var PeriodicalExecuter = Class.create();\r
+PeriodicalExecuter.prototype = {\r
+ initialize: function(callback, frequency) {\r
+ this.callback = callback;\r
+ this.frequency = frequency;\r
+ this.currentlyExecuting = false;\r
+\r
+ this.registerCallback();\r
+ },\r
+\r
+ registerCallback: function() {\r
+ this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);\r
+ },\r
+\r
+ stop: function() {\r
+ if (!this.timer) return;\r
+ clearInterval(this.timer);\r
+ this.timer = null;\r
+ },\r
+\r
+ onTimerEvent: function() {\r
+ if (!this.currentlyExecuting) {\r
+ try {\r
+ this.currentlyExecuting = true;\r
+ this.callback(this);\r
+ } finally {\r
+ this.currentlyExecuting = false;\r
+ }\r
+ }\r
+ }\r
+}\r
+Object.extend(String.prototype, {\r
+ gsub: function(pattern, replacement) {\r
+ var result = '', source = this, match;\r
+ replacement = arguments.callee.prepareReplacement(replacement);\r
+\r
+ while (source.length > 0) {\r
+ if (match = source.match(pattern)) {\r
+ result += source.slice(0, match.index);\r
+ result += (replacement(match) || '').toString();\r
+ source = source.slice(match.index + match[0].length);\r
+ } else {\r
+ result += source, source = '';\r
+ }\r
+ }\r
+ return result;\r
+ },\r
+\r
+ sub: function(pattern, replacement, count) {\r
+ replacement = this.gsub.prepareReplacement(replacement);\r
+ count = count === undefined ? 1 : count;\r
+\r
+ return this.gsub(pattern, function(match) {\r
+ if (--count < 0) return match[0];\r
+ return replacement(match);\r
+ });\r
+ },\r
+\r
+ scan: function(pattern, iterator) {\r
+ this.gsub(pattern, iterator);\r
+ return this;\r
+ },\r
+\r
+ truncate: function(length, truncation) {\r
+ length = length || 30;\r
+ truncation = truncation === undefined ? '...' : truncation;\r
+ return this.length > length ?\r
+ this.slice(0, length - truncation.length) + truncation : this;\r
+ },\r
+\r
+ strip: function() {\r
+ return this.replace(/^\s+/, '').replace(/\s+$/, '');\r
+ },\r
+\r
+ stripTags: function() {\r
+ return this.replace(/<\/?[^>]+>/gi, '');\r
+ },\r
+\r
+ stripScripts: function() {\r
+ return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');\r
+ },\r
+\r
+ extractScripts: function() {\r
+ var matchAll = new RegExp(Prototype.ScriptFragment, 'img');\r
+ var matchOne = new RegExp(Prototype.ScriptFragment, 'im');\r
+ return (this.match(matchAll) || []).map(function(scriptTag) {\r
+ return (scriptTag.match(matchOne) || ['', ''])[1];\r
+ });\r
+ },\r
+\r
+ evalScripts: function() {\r
+ return this.extractScripts().map(function(script) { return eval(script) });\r
+ },\r
+\r
+ escapeHTML: function() {\r
+ var div = document.createElement('div');\r
+ var text = document.createTextNode(this);\r
+ div.appendChild(text);\r
+ return div.innerHTML;\r
+ },\r
+\r
+ unescapeHTML: function() {\r
+ var div = document.createElement('div');\r
+ div.innerHTML = this.stripTags();\r
+ return div.childNodes[0] ? div.childNodes[0].nodeValue : '';\r
+ },\r
+\r
+ toQueryParams: function() {\r
+ var pairs = this.match(/^\??(.*)$/)[1].split('&');\r
+ return pairs.inject({}, function(params, pairString) {\r
+ var pair = pairString.split('=');\r
+ var value = pair[1] ? decodeURIComponent(pair[1]) : undefined;\r
+ params[decodeURIComponent(pair[0])] = value;\r
+ return params;\r
+ });\r
+ },\r
+\r
+ toArray: function() {\r
+ return this.split('');\r
+ },\r
+\r
+ camelize: function() {\r
+ var oStringList = this.split('-');\r
+ if (oStringList.length == 1) return oStringList[0];\r
+\r
+ var camelizedString = this.indexOf('-') == 0\r
+ ? oStringList[0].charAt(0).toUpperCase() + oStringList[0].substring(1)\r
+ : oStringList[0];\r
+\r
+ for (var i = 1, len = oStringList.length; i < len; i++) {\r
+ var s = oStringList[i];\r
+ camelizedString += s.charAt(0).toUpperCase() + s.substring(1);\r
+ }\r
+\r
+ return camelizedString;\r
+ },\r
+\r
+ inspect: function(useDoubleQuotes) {\r
+ var escapedString = this.replace(/\\/g, '\\\\');\r
+ if (useDoubleQuotes)\r
+ return '"' + escapedString.replace(/"/g, '\\"') + '"';\r
+ else\r
+ return "'" + escapedString.replace(/'/g, '\\\'') + "'";\r
+ }\r
+});\r
+\r
+String.prototype.gsub.prepareReplacement = function(replacement) {\r
+ if (typeof replacement == 'function') return replacement;\r
+ var template = new Template(replacement);\r
+ return function(match) { return template.evaluate(match) };\r
+}\r
+\r
+String.prototype.parseQuery = String.prototype.toQueryParams;\r
+\r
+var Template = Class.create();\r
+Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;\r
+Template.prototype = {\r
+ initialize: function(template, pattern) {\r
+ this.template = template.toString();\r
+ this.pattern = pattern || Template.Pattern;\r
+ },\r
+\r
+ evaluate: function(object) {\r
+ return this.template.gsub(this.pattern, function(match) {\r
+ var before = match[1];\r
+ if (before == '\\') return match[2];\r
+ return before + (object[match[3]] || '').toString();\r
+ });\r
+ }\r
+}\r
+\r
+var $break = new Object();\r
+var $continue = new Object();\r
+\r
+var Enumerable = {\r
+ each: function(iterator) {\r
+ var index = 0;\r
+ try {\r
+ this._each(function(value) {\r
+ try {\r
+ iterator(value, index++);\r
+ } catch (e) {\r
+ if (e != $continue) throw e;\r
+ }\r
+ });\r
+ } catch (e) {\r
+ if (e != $break) throw e;\r
+ }\r
+ },\r
+\r
+ all: function(iterator) {\r
+ var result = true;\r
+ this.each(function(value, index) {\r
+ result = result && !!(iterator || Prototype.K)(value, index);\r
+ if (!result) throw $break;\r
+ });\r
+ return result;\r
+ },\r
+\r
+ any: function(iterator) {\r
+ var result = false;\r
+ this.each(function(value, index) {\r
+ if (result = !!(iterator || Prototype.K)(value, index))\r
+ throw $break;\r
+ });\r
+ return result;\r
+ },\r
+\r
+ collect: function(iterator) {\r
+ var results = [];\r
+ this.each(function(value, index) {\r
+ results.push(iterator(value, index));\r
+ });\r
+ return results;\r
+ },\r
+\r
+ detect: function (iterator) {\r
+ var result;\r
+ this.each(function(value, index) {\r
+ if (iterator(value, index)) {\r
+ result = value;\r
+ throw $break;\r
+ }\r
+ });\r
+ return result;\r
+ },\r
+\r
+ findAll: function(iterator) {\r
+ var results = [];\r
+ this.each(function(value, index) {\r
+ if (iterator(value, index))\r
+ results.push(value);\r
+ });\r
+ return results;\r
+ },\r
+\r
+ grep: function(pattern, iterator) {\r
+ var results = [];\r
+ this.each(function(value, index) {\r
+ var stringValue = value.toString();\r
+ if (stringValue.match(pattern))\r
+ results.push((iterator || Prototype.K)(value, index));\r
+ })\r
+ return results;\r
+ },\r
+\r
+ include: function(object) {\r
+ var found = false;\r
+ this.each(function(value) {\r
+ if (value == object) {\r
+ found = true;\r
+ throw $break;\r
+ }\r
+ });\r
+ return found;\r
+ },\r
+\r
+ inject: function(memo, iterator) {\r
+ this.each(function(value, index) {\r
+ memo = iterator(memo, value, index);\r
+ });\r
+ return memo;\r
+ },\r
+\r
+ invoke: function(method) {\r
+ var args = $A(arguments).slice(1);\r
+ return this.collect(function(value) {\r
+ return value[method].apply(value, args);\r
+ });\r
+ },\r
+\r
+ max: function(iterator) {\r
+ var result;\r
+ this.each(function(value, index) {\r
+ value = (iterator || Prototype.K)(value, index);\r
+ if (result == undefined || value >= result)\r
+ result = value;\r
+ });\r
+ return result;\r
+ },\r
+\r
+ min: function(iterator) {\r
+ var result;\r
+ this.each(function(value, index) {\r
+ value = (iterator || Prototype.K)(value, index);\r
+ if (result == undefined || value < result)\r
+ result = value;\r
+ });\r
+ return result;\r
+ },\r
+\r
+ partition: function(iterator) {\r
+ var trues = [], falses = [];\r
+ this.each(function(value, index) {\r
+ ((iterator || Prototype.K)(value, index) ?\r
+ trues : falses).push(value);\r
+ });\r
+ return [trues, falses];\r
+ },\r
+\r
+ pluck: function(property) {\r
+ var results = [];\r
+ this.each(function(value, index) {\r
+ results.push(value[property]);\r
+ });\r
+ return results;\r
+ },\r
+\r
+ reject: function(iterator) {\r
+ var results = [];\r
+ this.each(function(value, index) {\r
+ if (!iterator(value, index))\r
+ results.push(value);\r
+ });\r
+ return results;\r
+ },\r
+\r
+ sortBy: function(iterator) {\r
+ return this.collect(function(value, index) {\r
+ return {value: value, criteria: iterator(value, index)};\r
+ }).sort(function(left, right) {\r
+ var a = left.criteria, b = right.criteria;\r
+ return a < b ? -1 : a > b ? 1 : 0;\r
+ }).pluck('value');\r
+ },\r
+\r
+ toArray: function() {\r
+ return this.collect(Prototype.K);\r
+ },\r
+\r
+ zip: function() {\r
+ var iterator = Prototype.K, args = $A(arguments);\r
+ if (typeof args.last() == 'function')\r
+ iterator = args.pop();\r
+\r
+ var collections = [this].concat(args).map($A);\r
+ return this.map(function(value, index) {\r
+ return iterator(collections.pluck(index));\r
+ });\r
+ },\r
+\r
+ inspect: function() {\r
+ return '#<Enumerable:' + this.toArray().inspect() + '>';\r
+ }\r
+}\r
+\r
+Object.extend(Enumerable, {\r
+ map: Enumerable.collect,\r
+ find: Enumerable.detect,\r
+ select: Enumerable.findAll,\r
+ member: Enumerable.include,\r
+ entries: Enumerable.toArray\r
+});\r
+var $A = Array.from = function(iterable) {\r
+ if (!iterable) return [];\r
+ if (iterable.toArray) {\r
+ return iterable.toArray();\r
+ } else {\r
+ var results = [];\r
+ for (var i = 0; i < iterable.length; i++)\r
+ results.push(iterable[i]);\r
+ return results;\r
+ }\r
+}\r
+\r
+Object.extend(Array.prototype, Enumerable);\r
+\r
+if (!Array.prototype._reverse)\r
+ Array.prototype._reverse = Array.prototype.reverse;\r
+\r
+Object.extend(Array.prototype, {\r
+ _each: function(iterator) {\r
+ for (var i = 0; i < this.length; i++)\r
+ iterator(this[i]);\r
+ },\r
+\r
+ clear: function() {\r
+ this.length = 0;\r
+ return this;\r
+ },\r
+\r
+ first: function() {\r
+ return this[0];\r
+ },\r
+\r
+ last: function() {\r
+ return this[this.length - 1];\r
+ },\r
+\r
+ compact: function() {\r
+ return this.select(function(value) {\r
+ return value != undefined || value != null;\r
+ });\r
+ },\r
+\r
+ flatten: function() {\r
+ return this.inject([], function(array, value) {\r
+ return array.concat(value && value.constructor == Array ?\r
+ value.flatten() : [value]);\r
+ });\r
+ },\r
+\r
+ without: function() {\r
+ var values = $A(arguments);\r
+ return this.select(function(value) {\r
+ return !values.include(value);\r
+ });\r
+ },\r
+\r
+ indexOf: function(object) {\r
+ for (var i = 0; i < this.length; i++)\r
+ if (this[i] == object) return i;\r
+ return -1;\r
+ },\r
+\r
+ reverse: function(inline) {\r
+ return (inline !== false ? this : this.toArray())._reverse();\r
+ },\r
+\r
+ reduce: function() {\r
+ return this.length > 1 ? this : this[0];\r
+ },\r
+\r
+ uniq: function() {\r
+ return this.inject([], function(array, value) {\r
+ return array.include(value) ? array : array.concat([value]);\r
+ });\r
+ },\r
+\r
+ inspect: function() {\r
+ return '[' + this.map(Object.inspect).join(', ') + ']';\r
+ }\r
+});\r
+var Hash = {\r
+ _each: function(iterator) {\r
+ for (var key in this) {\r
+ var value = this[key];\r
+ if (typeof value == 'function') continue;\r
+\r
+ var pair = [key, value];\r
+ pair.key = key;\r
+ pair.value = value;\r
+ iterator(pair);\r
+ }\r
+ },\r
+\r
+ keys: function() {\r
+ return this.pluck('key');\r
+ },\r
+\r
+ values: function() {\r
+ return this.pluck('value');\r
+ },\r
+\r
+ merge: function(hash) {\r
+ return $H(hash).inject($H(this), function(mergedHash, pair) {\r
+ mergedHash[pair.key] = pair.value;\r
+ return mergedHash;\r
+ });\r
+ },\r
+\r
+ toQueryString: function() {\r
+ return this.map(function(pair) {\r
+ return pair.map(encodeURIComponent).join('=');\r
+ }).join('&');\r
+ },\r
+\r
+ inspect: function() {\r
+ return '#<Hash:{' + this.map(function(pair) {\r
+ return pair.map(Object.inspect).join(': ');\r
+ }).join(', ') + '}>';\r
+ }\r
+}\r
+\r
+function $H(object) {\r
+ var hash = Object.extend({}, object || {});\r
+ Object.extend(hash, Enumerable);\r
+ Object.extend(hash, Hash);\r
+ return hash;\r
+}\r
+ObjectRange = Class.create();\r
+Object.extend(ObjectRange.prototype, Enumerable);\r
+Object.extend(ObjectRange.prototype, {\r
+ initialize: function(start, end, exclusive) {\r
+ this.start = start;\r
+ this.end = end;\r
+ this.exclusive = exclusive;\r
+ },\r
+\r
+ _each: function(iterator) {\r
+ var value = this.start;\r
+ while (this.include(value)) {\r
+ iterator(value);\r
+ value = value.succ();\r
+ }\r
+ },\r
+\r
+ include: function(value) {\r
+ if (value < this.start)\r
+ return false;\r
+ if (this.exclusive)\r
+ return value < this.end;\r
+ return value <= this.end;\r
+ }\r
+});\r
+\r
+var $R = function(start, end, exclusive) {\r
+ return new ObjectRange(start, end, exclusive);\r
+}\r
+\r
+var Ajax = {\r
+ getTransport: function() {\r
+ return Try.these(\r
+ function() {return new XMLHttpRequest()},\r
+ function() {return new ActiveXObject('Msxml2.XMLHTTP')},\r
+ function() {return new ActiveXObject('Microsoft.XMLHTTP')}\r
+ ) || false;\r
+ },\r
+\r
+ activeRequestCount: 0\r
+}\r
+\r
+Ajax.Responders = {\r
+ responders: [],\r
+\r
+ _each: function(iterator) {\r
+ this.responders._each(iterator);\r
+ },\r
+\r
+ register: function(responderToAdd) {\r
+ if (!this.include(responderToAdd))\r
+ this.responders.push(responderToAdd);\r
+ },\r
+\r
+ unregister: function(responderToRemove) {\r
+ this.responders = this.responders.without(responderToRemove);\r
+ },\r
+\r
+ dispatch: function(callback, request, transport, json) {\r
+ this.each(function(responder) {\r
+ if (responder[callback] && typeof responder[callback] == 'function') {\r
+ try {\r
+ responder[callback].apply(responder, [request, transport, json]);\r
+ } catch (e) {}\r
+ }\r
+ });\r
+ }\r
+};\r
+\r
+Object.extend(Ajax.Responders, Enumerable);\r
+\r
+Ajax.Responders.register({\r
+ onCreate: function() {\r
+ Ajax.activeRequestCount++;\r
+ },\r
+\r
+ onComplete: function() {\r
+ Ajax.activeRequestCount--;\r
+ }\r
+});\r
+\r
+Ajax.Base = function() {};\r
+Ajax.Base.prototype = {\r
+ setOptions: function(options) {\r
+ this.options = {\r
+ method: 'post',\r
+ asynchronous: true,\r
+ contentType: 'application/x-www-form-urlencoded',\r
+ parameters: ''\r
+ }\r
+ Object.extend(this.options, options || {});\r
+ },\r
+\r
+ responseIsSuccess: function() {\r
+ return this.transport.status == undefined\r
+ || this.transport.status == 0\r
+ || (this.transport.status >= 200 && this.transport.status < 300);\r
+ },\r
+\r
+ responseIsFailure: function() {\r
+ return !this.responseIsSuccess();\r
+ }\r
+}\r
+\r
+Ajax.Request = Class.create();\r
+Ajax.Request.Events =\r
+ ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];\r
+\r
+Ajax.Request.prototype = Object.extend(new Ajax.Base(), {\r
+ initialize: function(url, options) {\r
+ this.transport = Ajax.getTransport();\r
+ this.setOptions(options);\r
+ this.request(url);\r
+ },\r
+\r
+ request: function(url) {\r
+ var parameters = this.options.parameters || '';\r
+ if (parameters.length > 0) parameters += '&_=';\r
+\r
+ /* Simulate other verbs over post */\r
+ if (this.options.method != 'get' && this.options.method != 'post') {\r
+ parameters += (parameters.length > 0 ? '&' : '') + '_method=' + this.options.method;\r
+ this.options.method = 'post';\r
+ }\r
+\r
+ try {\r
+ this.url = url;\r
+ if (this.options.method == 'get' && parameters.length > 0)\r
+ this.url += (this.url.match(/\?/) ? '&' : '?') + parameters;\r
+\r
+ Ajax.Responders.dispatch('onCreate', this, this.transport);\r
+\r
+ this.transport.open(this.options.method, this.url,\r
+ this.options.asynchronous);\r
+\r
+ if (this.options.asynchronous)\r
+ setTimeout(function() { this.respondToReadyState(1) }.bind(this), 10);\r
+\r
+ this.transport.onreadystatechange = this.onStateChange.bind(this);\r
+ this.setRequestHeaders();\r
+\r
+ var body = this.options.postBody ? this.options.postBody : parameters;\r
+ this.transport.send(this.options.method == 'post' ? body : null);\r
+\r
+ /* Force Firefox to handle ready state 4 for synchronous requests */\r
+ if (!this.options.asynchronous && this.transport.overrideMimeType)\r
+ this.onStateChange();\r
+\r
+ } catch (e) {\r
+ this.dispatchException(e);\r
+ }\r
+ },\r
+\r
+ setRequestHeaders: function() {\r
+ var requestHeaders =\r
+ ['X-Requested-With', 'XMLHttpRequest',\r
+ 'X-Prototype-Version', Prototype.Version,\r
+ 'Accept', 'text/javascript, text/html, application/xml, text/xml, */*'];\r
+\r
+ if (this.options.method == 'post') {\r
+ requestHeaders.push('Content-type', this.options.contentType);\r
+\r
+ /* Force "Connection: close" for Mozilla browsers to work around\r
+ * a bug where XMLHttpReqeuest sends an incorrect Content-length\r
+ * header. See Mozilla Bugzilla #246651.\r
+ */\r
+ if (this.transport.overrideMimeType)\r
+ requestHeaders.push('Connection', 'close');\r
+ }\r
+\r
+ if (this.options.requestHeaders)\r
+ requestHeaders.push.apply(requestHeaders, this.options.requestHeaders);\r
+\r
+ for (var i = 0; i < requestHeaders.length; i += 2)\r
+ this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]);\r
+ },\r
+\r
+ onStateChange: function() {\r
+ var readyState = this.transport.readyState;\r
+ if (readyState != 1)\r
+ this.respondToReadyState(this.transport.readyState);\r
+ },\r
+\r
+ header: function(name) {\r
+ try {\r
+ return this.transport.getResponseHeader(name);\r
+ } catch (e) {}\r
+ },\r
+\r
+ evalJSON: function() {\r
+ try {\r
+ return eval('(' + this.header('X-JSON') + ')');\r
+ } catch (e) {}\r
+ },\r
+\r
+ evalResponse: function() {\r
+ try {\r
+ return eval(this.transport.responseText);\r
+ } catch (e) {\r
+ this.dispatchException(e);\r
+ }\r
+ },\r
+\r
+ respondToReadyState: function(readyState) {\r
+ var event = Ajax.Request.Events[readyState];\r
+ var transport = this.transport, json = this.evalJSON();\r
+\r
+ if (event == 'Complete') {\r
+ try {\r
+ (this.options['on' + this.transport.status]\r
+ || this.options['on' + (this.responseIsSuccess() ? 'Success' : 'Failure')]\r
+ || Prototype.emptyFunction)(transport, json);\r
+ } catch (e) {\r
+ this.dispatchException(e);\r
+ }\r
+\r
+ if ((this.header('Content-type') || '').match(/^text\/javascript/i))\r
+ this.evalResponse();\r
+ }\r
+\r
+ try {\r
+ (this.options['on' + event] || Prototype.emptyFunction)(transport, json);\r
+ Ajax.Responders.dispatch('on' + event, this, transport, json);\r
+ } catch (e) {\r
+ this.dispatchException(e);\r
+ }\r
+\r
+ /* Avoid memory leak in MSIE: clean up the oncomplete event handler */\r
+ if (event == 'Complete')\r
+ this.transport.onreadystatechange = Prototype.emptyFunction;\r
+ },\r
+\r
+ dispatchException: function(exception) {\r
+ (this.options.onException || Prototype.emptyFunction)(this, exception);\r
+ Ajax.Responders.dispatch('onException', this, exception);\r
+ }\r
+});\r
+\r
+Ajax.Updater = Class.create();\r
+\r
+Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), {\r
+ initialize: function(container, url, options) {\r
+ this.containers = {\r
+ success: container.success ? $(container.success) : $(container),\r
+ failure: container.failure ? $(container.failure) :\r
+ (container.success ? null : $(container))\r
+ }\r
+\r
+ this.transport = Ajax.getTransport();\r
+ this.setOptions(options);\r
+\r
+ var onComplete = this.options.onComplete || Prototype.emptyFunction;\r
+ this.options.onComplete = (function(transport, object) {\r
+ this.updateContent();\r
+ onComplete(transport, object);\r
+ }).bind(this);\r
+\r
+ this.request(url);\r
+ },\r
+\r
+ updateContent: function() {\r
+ var receiver = this.responseIsSuccess() ?\r
+ this.containers.success : this.containers.failure;\r
+ var response = this.transport.responseText;\r
+\r
+ if (!this.options.evalScripts)\r
+ response = response.stripScripts();\r
+\r
+ if (receiver) {\r
+ if (this.options.insertion) {\r
+ new this.options.insertion(receiver, response);\r
+ } else {\r
+ Element.update(receiver, response);\r
+ }\r
+ }\r
+\r
+ if (this.responseIsSuccess()) {\r
+ if (this.onComplete)\r
+ setTimeout(this.onComplete.bind(this), 10);\r
+ }\r
+ }\r
+});\r
+\r
+Ajax.PeriodicalUpdater = Class.create();\r
+Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), {\r
+ initialize: function(container, url, options) {\r
+ this.setOptions(options);\r
+ this.onComplete = this.options.onComplete;\r
+\r
+ this.frequency = (this.options.frequency || 2);\r
+ this.decay = (this.options.decay || 1);\r
+\r
+ this.updater = {};\r
+ this.container = container;\r
+ this.url = url;\r
+\r
+ this.start();\r
+ },\r
+\r
+ start: function() {\r
+ this.options.onComplete = this.updateComplete.bind(this);\r
+ this.onTimerEvent();\r
+ },\r
+\r
+ stop: function() {\r
+ this.updater.options.onComplete = undefined;\r
+ clearTimeout(this.timer);\r
+ (this.onComplete || Prototype.emptyFunction).apply(this, arguments);\r
+ },\r
+\r
+ updateComplete: function(request) {\r
+ if (this.options.decay) {\r
+ this.decay = (request.responseText == this.lastText ?\r
+ this.decay * this.options.decay : 1);\r
+\r
+ this.lastText = request.responseText;\r
+ }\r
+ this.timer = setTimeout(this.onTimerEvent.bind(this),\r
+ this.decay * this.frequency * 1000);\r
+ },\r
+\r
+ onTimerEvent: function() {\r
+ this.updater = new Ajax.Updater(this.container, this.url, this.options);\r
+ }\r
+});\r
+function $() {\r
+ var results = [], element;\r
+ for (var i = 0; i < arguments.length; i++) {\r
+ element = arguments[i];\r
+ if (typeof element == 'string')\r
+ element = document.getElementById(element);\r
+ results.push(Element.extend(element));\r
+ }\r
+ return results.reduce();\r
+}\r
+\r
+document.getElementsByClassName = function(className, parentElement) {\r
+ var children = ($(parentElement) || document.body).getElementsByTagName('*');\r
+ return $A(children).inject([], function(elements, child) {\r
+ if (child.className.match(new RegExp("(^|\\s)" + className + "(\\s|$)")))\r
+ elements.push(Element.extend(child));\r
+ return elements;\r
+ });\r
+}\r
+\r
+/*--------------------------------------------------------------------------*/\r
+\r
+if (!window.Element)\r
+ var Element = new Object();\r
+\r
+Element.extend = function(element) {\r
+ if (!element) return;\r
+ if (_nativeExtensions || element.nodeType == 3) return element;\r
+\r
+ if (!element._extended && element.tagName && element != window) {\r
+ var methods = Object.clone(Element.Methods), cache = Element.extend.cache;\r
+\r
+ if (element.tagName == 'FORM')\r
+ Object.extend(methods, Form.Methods);\r
+ if (['INPUT', 'TEXTAREA', 'SELECT'].include(element.tagName))\r
+ Object.extend(methods, Form.Element.Methods);\r
+\r
+ for (var property in methods) {\r
+ var value = methods[property];\r
+ if (typeof value == 'function')\r
+ element[property] = cache.findOrStore(value);\r
+ }\r
+ }\r
+\r
+ element._extended = true;\r
+ return element;\r
+}\r
+\r
+Element.extend.cache = {\r
+ findOrStore: function(value) {\r
+ return this[value] = this[value] || function() {\r
+ return value.apply(null, [this].concat($A(arguments)));\r
+ }\r
+ }\r
+}\r
+\r
+Element.Methods = {\r
+ visible: function(element) {\r
+ return $(element).style.display != 'none';\r
+ },\r
+\r
+ toggle: function(element) {\r
+ element = $(element);\r
+ Element[Element.visible(element) ? 'hide' : 'show'](element);\r
+ return element;\r
+ },\r
+\r
+ hide: function(element) {\r
+ $(element).style.display = 'none';\r
+ return element;\r
+ },\r
+\r
+ show: function(element) {\r
+ $(element).style.display = '';\r
+ return element;\r
+ },\r
+\r
+ remove: function(element) {\r
+ element = $(element);\r
+ element.parentNode.removeChild(element);\r
+ return element;\r
+ },\r
+\r
+ update: function(element, html) {\r
+ $(element).innerHTML = html.stripScripts();\r
+ setTimeout(function() {html.evalScripts()}, 10);\r
+ return element;\r
+ },\r
+\r
+ replace: function(element, html) {\r
+ element = $(element);\r
+ if (element.outerHTML) {\r
+ element.outerHTML = html.stripScripts();\r
+ } else {\r
+ var range = element.ownerDocument.createRange();\r
+ range.selectNodeContents(element);\r
+ element.parentNode.replaceChild(\r
+ range.createContextualFragment(html.stripScripts()), element);\r
+ }\r
+ setTimeout(function() {html.evalScripts()}, 10);\r
+ return element;\r
+ },\r
+\r
+ inspect: function(element) {\r
+ element = $(element);\r
+ var result = '<' + element.tagName.toLowerCase();\r
+ $H({'id': 'id', 'className': 'class'}).each(function(pair) {\r
+ var property = pair.first(), attribute = pair.last();\r
+ var value = (element[property] || '').toString();\r
+ if (value) result += ' ' + attribute + '=' + value.inspect(true);\r
+ });\r
+ return result + '>';\r
+ },\r
+\r
+ recursivelyCollect: function(element, property) {\r
+ element = $(element);\r
+ var elements = [];\r
+ while (element = element[property])\r
+ if (element.nodeType == 1)\r
+ elements.push(Element.extend(element));\r
+ return elements;\r
+ },\r
+\r
+ ancestors: function(element) {\r
+ return $(element).recursivelyCollect('parentNode');\r
+ },\r
+\r
+ descendants: function(element) {\r
+ element = $(element);\r
+ return $A(element.getElementsByTagName('*'));\r
+ },\r
+\r
+ previousSiblings: function(element) {\r
+ return $(element).recursivelyCollect('previousSibling');\r
+ },\r
+\r
+ nextSiblings: function(element) {\r
+ return $(element).recursivelyCollect('nextSibling');\r
+ },\r
+\r
+ siblings: function(element) {\r
+ element = $(element);\r
+ return element.previousSiblings().reverse().concat(element.nextSiblings());\r
+ },\r
+\r
+ match: function(element, selector) {\r
+ element = $(element);\r
+ if (typeof selector == 'string')\r
+ selector = new Selector(selector);\r
+ return selector.match(element);\r
+ },\r
+\r
+ up: function(element, expression, index) {\r
+ return Selector.findElement($(element).ancestors(), expression, index);\r
+ },\r
+\r
+ down: function(element, expression, index) {\r
+ return Selector.findElement($(element).descendants(), expression, index);\r
+ },\r
+\r
+ previous: function(element, expression, index) {\r
+ return Selector.findElement($(element).previousSiblings(), expression, index);\r
+ },\r
+\r
+ next: function(element, expression, index) {\r
+ return Selector.findElement($(element).nextSiblings(), expression, index);\r
+ },\r
+\r
+ getElementsBySelector: function() {\r
+ var args = $A(arguments), element = $(args.shift());\r
+ return Selector.findChildElements(element, args);\r
+ },\r
+\r
+ getElementsByClassName: function(element, className) {\r
+ element = $(element);\r
+ return document.getElementsByClassName(className, element);\r
+ },\r
+\r
+ getHeight: function(element) {\r
+ element = $(element);\r
+ return element.offsetHeight;\r
+ },\r
+\r
+ classNames: function(element) {\r
+ return new Element.ClassNames(element);\r
+ },\r
+\r
+ hasClassName: function(element, className) {\r
+ if (!(element = $(element))) return;\r
+ return Element.classNames(element).include(className);\r
+ },\r
+\r
+ addClassName: function(element, className) {\r
+ if (!(element = $(element))) return;\r
+ Element.classNames(element).add(className);\r
+ return element;\r
+ },\r
+\r
+ removeClassName: function(element, className) {\r
+ if (!(element = $(element))) return;\r
+ Element.classNames(element).remove(className);\r
+ return element;\r
+ },\r
+\r
+ observe: function() {\r
+ Event.observe.apply(Event, arguments);\r
+ return $A(arguments).first();\r
+ },\r
+\r
+ stopObserving: function() {\r
+ Event.stopObserving.apply(Event, arguments);\r
+ return $A(arguments).first();\r
+ },\r
+\r
+ // removes whitespace-only text node children\r
+ cleanWhitespace: function(element) {\r
+ element = $(element);\r
+ var node = element.firstChild;\r
+ while (node) {\r
+ var nextNode = node.nextSibling;\r
+ if (node.nodeType == 3 && !/\S/.test(node.nodeValue))\r
+ element.removeChild(node);\r
+ node = nextNode;\r
+ }\r
+ return element;\r
+ },\r
+\r
+ empty: function(element) {\r
+ return $(element).innerHTML.match(/^\s*$/);\r
+ },\r
+\r
+ childOf: function(element, ancestor) {\r
+ element = $(element), ancestor = $(ancestor);\r
+ while (element = element.parentNode)\r
+ if (element == ancestor) return true;\r
+ return false;\r
+ },\r
+\r
+ scrollTo: function(element) {\r
+ element = $(element);\r
+ var x = element.x ? element.x : element.offsetLeft,\r
+ y = element.y ? element.y : element.offsetTop;\r
+ window.scrollTo(x, y);\r
+ return element;\r
+ },\r
+\r
+ getStyle: function(element, style) {\r
+ element = $(element);\r
+ var value = element.style[style.camelize()];\r
+ if (!value) {\r
+ if (document.defaultView && document.defaultView.getComputedStyle) {\r
+ var css = document.defaultView.getComputedStyle(element, null);\r
+ value = css ? css.getPropertyValue(style) : null;\r
+ } else if (element.currentStyle) {\r
+ value = element.currentStyle[style.camelize()];\r
+ }\r
+ }\r
+\r
+ if (window.opera && ['left', 'top', 'right', 'bottom'].include(style))\r
+ if (Element.getStyle(element, 'position') == 'static') value = 'auto';\r
+\r
+ return value == 'auto' ? null : value;\r
+ },\r
+\r
+ setStyle: function(element, style) {\r
+ element = $(element);\r
+ for (var name in style)\r
+ element.style[name.camelize()] = style[name];\r
+ return element;\r
+ },\r
+\r
+ getDimensions: function(element) {\r
+ element = $(element);\r
+ if (Element.getStyle(element, 'display') != 'none')\r
+ return {width: element.offsetWidth, height: element.offsetHeight};\r
+\r
+ // All *Width and *Height properties give 0 on elements with display none,\r
+ // so enable the element temporarily\r
+ var els = element.style;\r
+ var originalVisibility = els.visibility;\r
+ var originalPosition = els.position;\r
+ els.visibility = 'hidden';\r
+ els.position = 'absolute';\r
+ els.display = '';\r
+ var originalWidth = element.clientWidth;\r
+ var originalHeight = element.clientHeight;\r
+ els.display = 'none';\r
+ els.position = originalPosition;\r
+ els.visibility = originalVisibility;\r
+ return {width: originalWidth, height: originalHeight};\r
+ },\r
+\r
+ makePositioned: function(element) {\r
+ element = $(element);\r
+ var pos = Element.getStyle(element, 'position');\r
+ if (pos == 'static' || !pos) {\r
+ element._madePositioned = true;\r
+ element.style.position = 'relative';\r
+ // Opera returns the offset relative to the positioning context, when an\r
+ // element is position relative but top and left have not been defined\r
+ if (window.opera) {\r
+ element.style.top = 0;\r
+ element.style.left = 0;\r
+ }\r
+ }\r
+ return element;\r
+ },\r
+\r
+ undoPositioned: function(element) {\r
+ element = $(element);\r
+ if (element._madePositioned) {\r
+ element._madePositioned = undefined;\r
+ element.style.position =\r
+ element.style.top =\r
+ element.style.left =\r
+ element.style.bottom =\r
+ element.style.right = '';\r
+ }\r
+ return element;\r
+ },\r
+\r
+ makeClipping: function(element) {\r
+ element = $(element);\r
+ if (element._overflow) return;\r
+ element._overflow = element.style.overflow || 'auto';\r
+ if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden')\r
+ element.style.overflow = 'hidden';\r
+ return element;\r
+ },\r
+\r
+ undoClipping: function(element) {\r
+ element = $(element);\r
+ if (!element._overflow) return;\r
+ element.style.overflow = element._overflow == 'auto' ? '' : element._overflow;\r
+ element._overflow = null;\r
+ return element;\r
+ }\r
+}\r
+\r
+// IE is missing .innerHTML support for TABLE-related elements\r
+if(document.all){\r
+ Element.Methods.update = function(element, html) {\r
+ element = $(element);\r
+ var tagName = element.tagName.toUpperCase();\r
+ if (['THEAD','TBODY','TR','TD'].indexOf(tagName) > -1) {\r
+ var div = document.createElement('div');\r
+ switch (tagName) {\r
+ case 'THEAD':\r
+ case 'TBODY':\r
+ div.innerHTML = '<table><tbody>' + html.stripScripts() + '</tbody></table>';\r
+ depth = 2;\r
+ break;\r
+ case 'TR':\r
+ div.innerHTML = '<table><tbody><tr>' + html.stripScripts() + '</tr></tbody></table>';\r
+ depth = 3;\r
+ break;\r
+ case 'TD':\r
+ div.innerHTML = '<table><tbody><tr><td>' + html.stripScripts() + '</td></tr></tbody></table>';\r
+ depth = 4;\r
+ }\r
+ $A(element.childNodes).each(function(node){\r
+ element.removeChild(node)\r
+ });\r
+ depth.times(function(){ div = div.firstChild });\r
+\r
+ $A(div.childNodes).each(\r
+ function(node){ element.appendChild(node) });\r
+ } else {\r
+ element.innerHTML = html.stripScripts();\r
+ }\r
+ setTimeout(function() {html.evalScripts()}, 10);\r
+ return element;\r
+ }\r
+}\r
+\r
+Object.extend(Element, Element.Methods);\r
+\r
+var _nativeExtensions = false;\r
+\r
+if (!window.HTMLElement && /Konqueror|Safari|KHTML/.test(navigator.userAgent)) {\r
+ /* Emulate HTMLElement, HTMLFormElement, HTMLInputElement, HTMLTextAreaElement,\r
+ and HTMLSelectElement in Safari */\r
+ ['', 'Form', 'Input', 'TextArea', 'Select'].each(function(tag) {\r
+ var klass = window['HTML' + tag + 'Element'] = {};\r
+ klass.prototype = document.createElement(tag ? tag.toLowerCase() : 'div').__proto__;\r
+ });\r
+}\r
+\r
+Element.addMethods = function(methods) {\r
+ Object.extend(Element.Methods, methods || {});\r
+\r
+ function copy(methods, destination) {\r
+ var cache = Element.extend.cache;\r
+ for (var property in methods) {\r
+ var value = methods[property];\r
+ destination[property] = cache.findOrStore(value);\r
+ }\r
+ }\r
+\r
+ if (typeof HTMLElement != 'undefined') {\r
+ copy(Element.Methods, HTMLElement.prototype);\r
+ copy(Form.Methods, HTMLFormElement.prototype);\r
+ [HTMLInputElement, HTMLTextAreaElement, HTMLSelectElement].each(function(klass) {\r
+ copy(Form.Element.Methods, klass.prototype);\r
+ });\r
+ _nativeExtensions = true;\r
+ }\r
+}\r
+\r
+var Toggle = new Object();\r
+Toggle.display = Element.toggle;\r
+\r
+/*--------------------------------------------------------------------------*/\r
+\r
+Abstract.Insertion = function(adjacency) {\r
+ this.adjacency = adjacency;\r
+}\r
+\r
+Abstract.Insertion.prototype = {\r
+ initialize: function(element, content) {\r
+ this.element = $(element);\r
+ this.content = content.stripScripts();\r
+\r
+ if (this.adjacency && this.element.insertAdjacentHTML) {\r
+ try {\r
+ this.element.insertAdjacentHTML(this.adjacency, this.content);\r
+ } catch (e) {\r
+ var tagName = this.element.tagName.toLowerCase();\r
+ if (tagName == 'tbody' || tagName == 'tr') {\r
+ this.insertContent(this.contentFromAnonymousTable());\r
+ } else {\r
+ throw e;\r
+ }\r
+ }\r
+ } else {\r
+ this.range = this.element.ownerDocument.createRange();\r
+ if (this.initializeRange) this.initializeRange();\r
+ this.insertContent([this.range.createContextualFragment(this.content)]);\r
+ }\r
+\r
+ setTimeout(function() {content.evalScripts()}, 10);\r
+ },\r
+\r
+ contentFromAnonymousTable: function() {\r
+ var div = document.createElement('div');\r
+ div.innerHTML = '<table><tbody>' + this.content + '</tbody></table>';\r
+ return $A(div.childNodes[0].childNodes[0].childNodes);\r
+ }\r
+}\r
+\r
+var Insertion = new Object();\r
+\r
+Insertion.Before = Class.create();\r
+Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), {\r
+ initializeRange: function() {\r
+ this.range.setStartBefore(this.element);\r
+ },\r
+\r
+ insertContent: function(fragments) {\r
+ fragments.each((function(fragment) {\r
+ this.element.parentNode.insertBefore(fragment, this.element);\r
+ }).bind(this));\r
+ }\r
+});\r
+\r
+Insertion.Top = Class.create();\r
+Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), {\r
+ initializeRange: function() {\r
+ this.range.selectNodeContents(this.element);\r
+ this.range.collapse(true);\r
+ },\r
+\r
+ insertContent: function(fragments) {\r
+ fragments.reverse(false).each((function(fragment) {\r
+ this.element.insertBefore(fragment, this.element.firstChild);\r
+ }).bind(this));\r
+ }\r
+});\r
+\r
+Insertion.Bottom = Class.create();\r
+Insertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), {\r
+ initializeRange: function() {\r
+ this.range.selectNodeContents(this.element);\r
+ this.range.collapse(this.element);\r
+ },\r
+\r
+ insertContent: function(fragments) {\r
+ fragments.each((function(fragment) {\r
+ this.element.appendChild(fragment);\r
+ }).bind(this));\r
+ }\r
+});\r
+\r
+Insertion.After = Class.create();\r
+Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), {\r
+ initializeRange: function() {\r
+ this.range.setStartAfter(this.element);\r
+ },\r
+\r
+ insertContent: function(fragments) {\r
+ fragments.each((function(fragment) {\r
+ this.element.parentNode.insertBefore(fragment,\r
+ this.element.nextSibling);\r
+ }).bind(this));\r
+ }\r
+});\r
+\r
+/*--------------------------------------------------------------------------*/\r
+\r
+Element.ClassNames = Class.create();\r
+Element.ClassNames.prototype = {\r
+ initialize: function(element) {\r
+ this.element = $(element);\r
+ },\r
+\r
+ _each: function(iterator) {\r
+ this.element.className.split(/\s+/).select(function(name) {\r
+ return name.length > 0;\r
+ })._each(iterator);\r
+ },\r
+\r
+ set: function(className) {\r
+ this.element.className = className;\r
+ },\r
+\r
+ add: function(classNameToAdd) {\r
+ if (this.include(classNameToAdd)) return;\r
+ this.set(this.toArray().concat(classNameToAdd).join(' '));\r
+ },\r
+\r
+ remove: function(classNameToRemove) {\r
+ if (!this.include(classNameToRemove)) return;\r
+ this.set(this.select(function(className) {\r
+ return className != classNameToRemove;\r
+ }).join(' '));\r
+ },\r
+\r
+ toString: function() {\r
+ return this.toArray().join(' ');\r
+ }\r
+}\r
+\r
+Object.extend(Element.ClassNames.prototype, Enumerable);\r
+var Selector = Class.create();\r
+Selector.prototype = {\r
+ initialize: function(expression) {\r
+ this.params = {classNames: []};\r
+ this.expression = expression.toString().strip();\r
+ this.parseExpression();\r
+ this.compileMatcher();\r
+ },\r
+\r
+ parseExpression: function() {\r
+ function abort(message) { throw 'Parse error in selector: ' + message; }\r
+\r
+ if (this.expression == '') abort('empty expression');\r
+\r
+ var params = this.params, expr = this.expression, match, modifier, clause, rest;\r
+ while (match = expr.match(/^(.*)\[([a-z0-9_:-]+?)(?:([~\|!]?=)(?:"([^"]*)"|([^\]\s]*)))?\]$/i)) {\r
+ params.attributes = params.attributes || [];\r
+ params.attributes.push({name: match[2], operator: match[3], value: match[4] || match[5] || ''});\r
+ expr = match[1];\r
+ }\r
+\r
+ if (expr == '*') return this.params.wildcard = true;\r
+\r
+ while (match = expr.match(/^([^a-z0-9_-])?([a-z0-9_-]+)(.*)/i)) {\r
+ modifier = match[1], clause = match[2], rest = match[3];\r
+ switch (modifier) {\r
+ case '#': params.id = clause; break;\r
+ case '.': params.classNames.push(clause); break;\r
+ case '':\r
+ case undefined: params.tagName = clause.toUpperCase(); break;\r
+ default: abort(expr.inspect());\r
+ }\r
+ expr = rest;\r
+ }\r
+\r
+ if (expr.length > 0) abort(expr.inspect());\r
+ },\r
+\r
+ buildMatchExpression: function() {\r
+ var params = this.params, conditions = [], clause;\r
+\r
+ if (params.wildcard)\r
+ conditions.push('true');\r
+ if (clause = params.id)\r
+ conditions.push('element.id == ' + clause.inspect());\r
+ if (clause = params.tagName)\r
+ conditions.push('element.tagName.toUpperCase() == ' + clause.inspect());\r
+ if ((clause = params.classNames).length > 0)\r
+ for (var i = 0; i < clause.length; i++)\r
+ conditions.push('Element.hasClassName(element, ' + clause[i].inspect() + ')');\r
+ if (clause = params.attributes) {\r
+ clause.each(function(attribute) {\r
+ var value = 'element.getAttribute(' + attribute.name.inspect() + ')';\r
+ var splitValueBy = function(delimiter) {\r
+ return value + ' && ' + value + '.split(' + delimiter.inspect() + ')';\r
+ }\r
+\r
+ switch (attribute.operator) {\r
+ case '=': conditions.push(value + ' == ' + attribute.value.inspect()); break;\r
+ case '~=': conditions.push(splitValueBy(' ') + '.include(' + attribute.value.inspect() + ')'); break;\r
+ case '|=': conditions.push(\r
+ splitValueBy('-') + '.first().toUpperCase() == ' + attribute.value.toUpperCase().inspect()\r
+ ); break;\r
+ case '!=': conditions.push(value + ' != ' + attribute.value.inspect()); break;\r
+ case '':\r
+ case undefined: conditions.push(value + ' != null'); break;\r
+ default: throw 'Unknown operator ' + attribute.operator + ' in selector';\r
+ }\r
+ });\r
+ }\r
+\r
+ return conditions.join(' && ');\r
+ },\r
+\r
+ compileMatcher: function() {\r
+ this.match = new Function('element', 'if (!element.tagName) return false; \\r
+ return ' + this.buildMatchExpression());\r
+ },\r
+\r
+ findElements: function(scope) {\r
+ var element;\r
+\r
+ if (element = $(this.params.id))\r
+ if (this.match(element))\r
+ if (!scope || Element.childOf(element, scope))\r
+ return [element];\r
+\r
+ scope = (scope || document).getElementsByTagName(this.params.tagName || '*');\r
+\r
+ var results = [];\r
+ for (var i = 0; i < scope.length; i++)\r
+ if (this.match(element = scope[i]))\r
+ results.push(Element.extend(element));\r
+\r
+ return results;\r
+ },\r
+\r
+ toString: function() {\r
+ return this.expression;\r
+ }\r
+}\r
+\r
+Object.extend(Selector, {\r
+ matchElements: function(elements, expression) {\r
+ var selector = new Selector(expression);\r
+ return elements.select(selector.match.bind(selector));\r
+ },\r
+\r
+ findElement: function(elements, expression, index) {\r
+ if (typeof expression == 'number') index = expression, expression = false;\r
+ return Selector.matchElements(elements, expression || '*')[index || 0];\r
+ },\r
+\r
+ findChildElements: function(element, expressions) {\r
+ return expressions.map(function(expression) {\r
+ return expression.strip().split(/\s+/).inject([null], function(results, expr) {\r
+ var selector = new Selector(expr);\r
+ return results.inject([], function(elements, result) {\r
+ return elements.concat(selector.findElements(result || element));\r
+ });\r
+ });\r
+ }).flatten();\r
+ }\r
+});\r
+\r
+function $$() {\r
+ return Selector.findChildElements(document, $A(arguments));\r
+}\r
+var Form = {\r
+ reset: function(form) {\r
+ $(form).reset();\r
+ return form;\r
+ }\r
+};\r
+\r
+Form.Methods = {\r
+ serialize: function(form) {\r
+ var elements = Form.getElements($(form));\r
+ var queryComponents = new Array();\r
+\r
+ for (var i = 0; i < elements.length; i++) {\r
+ var queryComponent = Form.Element.serialize(elements[i]);\r
+ if (queryComponent)\r
+ queryComponents.push(queryComponent);\r
+ }\r
+\r
+ return queryComponents.join('&');\r
+ },\r
+\r
+ getElements: function(form) {\r
+ form = $(form);\r
+ var elements = new Array();\r
+\r
+ for (var tagName in Form.Element.Serializers) {\r
+ var tagElements = form.getElementsByTagName(tagName);\r
+ for (var j = 0; j < tagElements.length; j++)\r
+ elements.push(tagElements[j]);\r
+ }\r
+ return elements;\r
+ },\r
+\r
+ getInputs: function(form, typeName, name) {\r
+ form = $(form);\r
+ var inputs = form.getElementsByTagName('input');\r
+\r
+ if (!typeName && !name)\r
+ return inputs;\r
+\r
+ var matchingInputs = new Array();\r
+ for (var i = 0; i < inputs.length; i++) {\r
+ var input = inputs[i];\r
+ if ((typeName && input.type != typeName) ||\r
+ (name && input.name != name))\r
+ continue;\r
+ matchingInputs.push(input);\r
+ }\r
+\r
+ return matchingInputs;\r
+ },\r
+\r
+ disable: function(form) {\r
+ form = $(form);\r
+ var elements = Form.getElements(form);\r
+ for (var i = 0; i < elements.length; i++) {\r
+ var element = elements[i];\r
+ element.blur();\r
+ element.disabled = 'true';\r
+ }\r
+ return form;\r
+ },\r
+\r
+ enable: function(form) {\r
+ form = $(form);\r
+ var elements = Form.getElements(form);\r
+ for (var i = 0; i < elements.length; i++) {\r
+ var element = elements[i];\r
+ element.disabled = '';\r
+ }\r
+ return form;\r
+ },\r
+\r
+ findFirstElement: function(form) {\r
+ return Form.getElements(form).find(function(element) {\r
+ return element.type != 'hidden' && !element.disabled &&\r
+ ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());\r
+ });\r
+ },\r
+\r
+ focusFirstElement: function(form) {\r
+ form = $(form);\r
+ Field.activate(Form.findFirstElement(form));\r
+ return form;\r
+ }\r
+}\r
+\r
+Object.extend(Form, Form.Methods);\r
+\r
+/*--------------------------------------------------------------------------*/\r
+\r
+Form.Element = {\r
+ focus: function(element) {\r
+ $(element).focus();\r
+ return element;\r
+ },\r
+\r
+ select: function(element) {\r
+ $(element).select();\r
+ return element;\r
+ }\r
+}\r
+\r
+Form.Element.Methods = {\r
+ serialize: function(element) {\r
+ element = $(element);\r
+ var method = element.tagName.toLowerCase();\r
+ var parameter = Form.Element.Serializers[method](element);\r
+\r
+ if (parameter) {\r
+ var key = encodeURIComponent(parameter[0]);\r
+ if (key.length == 0) return;\r
+\r
+ if (parameter[1].constructor != Array)\r
+ parameter[1] = [parameter[1]];\r
+\r
+ return parameter[1].map(function(value) {\r
+ return key + '=' + encodeURIComponent(value);\r
+ }).join('&');\r
+ }\r
+ },\r
+\r
+ getValue: function(element) {\r
+ element = $(element);\r
+ var method = element.tagName.toLowerCase();\r
+ var parameter = Form.Element.Serializers[method](element);\r
+\r
+ if (parameter)\r
+ return parameter[1];\r
+ },\r
+\r
+ clear: function(element) {\r
+ $(element).value = '';\r
+ return element;\r
+ },\r
+\r
+ present: function(element) {\r
+ return $(element).value != '';\r
+ },\r
+\r
+ activate: function(element) {\r
+ element = $(element);\r
+ element.focus();\r
+ if (element.select)\r
+ element.select();\r
+ return element;\r
+ },\r
+\r
+ disable: function(element) {\r
+ element = $(element);\r
+ element.disabled = '';\r
+ return element;\r
+ },\r
+\r
+ enable: function(element) {\r
+ element = $(element);\r
+ element.blur();\r
+ element.disabled = 'true';\r
+ return element;\r
+ }\r
+}\r
+\r
+Object.extend(Form.Element, Form.Element.Methods);\r
+var Field = Form.Element;\r
+\r
+/*--------------------------------------------------------------------------*/\r
+\r
+Form.Element.Serializers = {\r
+ input: function(element) {\r
+ switch (element.type.toLowerCase()) {\r
+ case 'checkbox':\r
+ case 'radio':\r
+ return Form.Element.Serializers.inputSelector(element);\r
+ default:\r
+ return Form.Element.Serializers.textarea(element);\r
+ }\r
+ return false;\r
+ },\r
+\r
+ inputSelector: function(element) {\r
+ if (element.checked)\r
+ return [element.name, element.value];\r
+ },\r
+\r
+ textarea: function(element) {\r
+ return [element.name, element.value];\r
+ },\r
+\r
+ select: function(element) {\r
+ return Form.Element.Serializers[element.type == 'select-one' ?\r
+ 'selectOne' : 'selectMany'](element);\r
+ },\r
+\r
+ selectOne: function(element) {\r
+ var value = '', opt, index = element.selectedIndex;\r
+ if (index >= 0) {\r
+ opt = element.options[index];\r
+ value = opt.value || opt.text;\r
+ }\r
+ return [element.name, value];\r
+ },\r
+\r
+ selectMany: function(element) {\r
+ var value = [];\r
+ for (var i = 0; i < element.length; i++) {\r
+ var opt = element.options[i];\r
+ if (opt.selected)\r
+ value.push(opt.value || opt.text);\r
+ }\r
+ return [element.name, value];\r
+ }\r
+}\r
+\r
+/*--------------------------------------------------------------------------*/\r
+\r
+var $F = Form.Element.getValue;\r
+\r
+/*--------------------------------------------------------------------------*/\r
+\r
+Abstract.TimedObserver = function() {}\r
+Abstract.TimedObserver.prototype = {\r
+ initialize: function(element, frequency, callback) {\r
+ this.frequency = frequency;\r
+ this.element = $(element);\r
+ this.callback = callback;\r
+\r
+ this.lastValue = this.getValue();\r
+ this.registerCallback();\r
+ },\r
+\r
+ registerCallback: function() {\r
+ setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);\r
+ },\r
+\r
+ onTimerEvent: function() {\r
+ var value = this.getValue();\r
+ if (this.lastValue != value) {\r
+ this.callback(this.element, value);\r
+ this.lastValue = value;\r
+ }\r
+ }\r
+}\r
+\r
+Form.Element.Observer = Class.create();\r
+Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {\r
+ getValue: function() {\r
+ return Form.Element.getValue(this.element);\r
+ }\r
+});\r
+\r
+Form.Observer = Class.create();\r
+Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {\r
+ getValue: function() {\r
+ return Form.serialize(this.element);\r
+ }\r
+});\r
+\r
+/*--------------------------------------------------------------------------*/\r
+\r
+Abstract.EventObserver = function() {}\r
+Abstract.EventObserver.prototype = {\r
+ initialize: function(element, callback) {\r
+ this.element = $(element);\r
+ this.callback = callback;\r
+\r
+ this.lastValue = this.getValue();\r
+ if (this.element.tagName.toLowerCase() == 'form')\r
+ this.registerFormCallbacks();\r
+ else\r
+ this.registerCallback(this.element);\r
+ },\r
+\r
+ onElementEvent: function() {\r
+ var value = this.getValue();\r
+ if (this.lastValue != value) {\r
+ this.callback(this.element, value);\r
+ this.lastValue = value;\r
+ }\r
+ },\r
+\r
+ registerFormCallbacks: function() {\r
+ var elements = Form.getElements(this.element);\r
+ for (var i = 0; i < elements.length; i++)\r
+ this.registerCallback(elements[i]);\r
+ },\r
+\r
+ registerCallback: function(element) {\r
+ if (element.type) {\r
+ switch (element.type.toLowerCase()) {\r
+ case 'checkbox':\r
+ case 'radio':\r
+ Event.observe(element, 'click', this.onElementEvent.bind(this));\r
+ break;\r
+ default:\r
+ Event.observe(element, 'change', this.onElementEvent.bind(this));\r
+ break;\r
+ }\r
+ }\r
+ }\r
+}\r
+\r
+Form.Element.EventObserver = Class.create();\r
+Form.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {\r
+ getValue: function() {\r
+ return Form.Element.getValue(this.element);\r
+ }\r
+});\r
+\r
+Form.EventObserver = Class.create();\r
+Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {\r
+ getValue: function() {\r
+ return Form.serialize(this.element);\r
+ }\r
+});\r
+if (!window.Event) {\r
+ var Event = new Object();\r
+}\r
+\r
+Object.extend(Event, {\r
+ KEY_BACKSPACE: 8,\r
+ KEY_TAB: 9,\r
+ KEY_RETURN: 13,\r
+ KEY_ESC: 27,\r
+ KEY_LEFT: 37,\r
+ KEY_UP: 38,\r
+ KEY_RIGHT: 39,\r
+ KEY_DOWN: 40,\r
+ KEY_DELETE: 46,\r
+ KEY_HOME: 36,\r
+ KEY_END: 35,\r
+ KEY_PAGEUP: 33,\r
+ KEY_PAGEDOWN: 34,\r
+\r
+ element: function(event) {\r
+ return event.target || event.srcElement;\r
+ },\r
+\r
+ isLeftClick: function(event) {\r
+ return (((event.which) && (event.which == 1)) ||\r
+ ((event.button) && (event.button == 1)));\r
+ },\r
+\r
+ pointerX: function(event) {\r
+ return event.pageX || (event.clientX +\r
+ (document.documentElement.scrollLeft || document.body.scrollLeft));\r
+ },\r
+\r
+ pointerY: function(event) {\r
+ return event.pageY || (event.clientY +\r
+ (document.documentElement.scrollTop || document.body.scrollTop));\r
+ },\r
+\r
+ stop: function(event) {\r
+ if (event.preventDefault) {\r
+ event.preventDefault();\r
+ event.stopPropagation();\r
+ } else {\r
+ event.returnValue = false;\r
+ event.cancelBubble = true;\r
+ }\r
+ },\r
+\r
+ // find the first node with the given tagName, starting from the\r
+ // node the event was triggered on; traverses the DOM upwards\r
+ findElement: function(event, tagName) {\r
+ var element = Event.element(event);\r
+ while (element.parentNode && (!element.tagName ||\r
+ (element.tagName.toUpperCase() != tagName.toUpperCase())))\r
+ element = element.parentNode;\r
+ return element;\r
+ },\r
+\r
+ observers: false,\r
+\r
+ _observeAndCache: function(element, name, observer, useCapture) {\r
+ if (!this.observers) this.observers = [];\r
+ if (element.addEventListener) {\r
+ this.observers.push([element, name, observer, useCapture]);\r
+ element.addEventListener(name, observer, useCapture);\r
+ } else if (element.attachEvent) {\r
+ this.observers.push([element, name, observer, useCapture]);\r
+ element.attachEvent('on' + name, observer);\r
+ }\r
+ },\r
+\r
+ unloadCache: function() {\r
+ if (!Event.observers) return;\r
+ for (var i = 0; i < Event.observers.length; i++) {\r
+ Event.stopObserving.apply(this, Event.observers[i]);\r
+ Event.observers[i][0] = null;\r
+ }\r
+ Event.observers = false;\r
+ },\r
+\r
+ observe: function(element, name, observer, useCapture) {\r
+ element = $(element);\r
+ useCapture = useCapture || false;\r
+\r
+ if (name == 'keypress' &&\r
+ (navigator.appVersion.match(/Konqueror|Safari|KHTML/)\r
+ || element.attachEvent))\r
+ name = 'keydown';\r
+\r
+ Event._observeAndCache(element, name, observer, useCapture);\r
+ },\r
+\r
+ stopObserving: function(element, name, observer, useCapture) {\r
+ element = $(element);\r
+ useCapture = useCapture || false;\r
+\r
+ if (name == 'keypress' &&\r
+ (navigator.appVersion.match(/Konqueror|Safari|KHTML/)\r
+ || element.detachEvent))\r
+ name = 'keydown';\r
+\r
+ if (element.removeEventListener) {\r
+ element.removeEventListener(name, observer, useCapture);\r
+ } else if (element.detachEvent) {\r
+ try {\r
+ element.detachEvent('on' + name, observer);\r
+ } catch (e) {}\r
+ }\r
+ }\r
+});\r
+\r
+/* prevent memory leaks in IE */\r
+if (navigator.appVersion.match(/\bMSIE\b/))\r
+ Event.observe(window, 'unload', Event.unloadCache, false);\r
+var Position = {\r
+ // set to true if needed, warning: firefox performance problems\r
+ // NOT neeeded for page scrolling, only if draggable contained in\r
+ // scrollable elements\r
+ includeScrollOffsets: false,\r
+\r
+ // must be called before calling withinIncludingScrolloffset, every time the\r
+ // page is scrolled\r
+ prepare: function() {\r
+ this.deltaX = window.pageXOffset\r
+ || document.documentElement.scrollLeft\r
+ || document.body.scrollLeft\r
+ || 0;\r
+ this.deltaY = window.pageYOffset\r
+ || document.documentElement.scrollTop\r
+ || document.body.scrollTop\r
+ || 0;\r
+ },\r
+\r
+ realOffset: function(element) {\r
+ var valueT = 0, valueL = 0;\r
+ do {\r
+ valueT += element.scrollTop || 0;\r
+ valueL += element.scrollLeft || 0;\r
+ element = element.parentNode;\r
+ } while (element);\r
+ return [valueL, valueT];\r
+ },\r
+\r
+ cumulativeOffset: function(element) {\r
+ var valueT = 0, valueL = 0;\r
+ do {\r
+ valueT += element.offsetTop || 0;\r
+ valueL += element.offsetLeft || 0;\r
+ element = element.offsetParent;\r
+ } while (element);\r
+ return [valueL, valueT];\r
+ },\r
+\r
+ positionedOffset: function(element) {\r
+ var valueT = 0, valueL = 0;\r
+ do {\r
+ valueT += element.offsetTop || 0;\r
+ valueL += element.offsetLeft || 0;\r
+ element = element.offsetParent;\r
+ if (element) {\r
+ p = Element.getStyle(element, 'position');\r
+ if (p == 'relative' || p == 'absolute') break;\r
+ }\r
+ } while (element);\r
+ return [valueL, valueT];\r
+ },\r
+\r
+ offsetParent: function(element) {\r
+ if (element.offsetParent) return element.offsetParent;\r
+ if (element == document.body) return element;\r
+\r
+ while ((element = element.parentNode) && element != document.body)\r
+ if (Element.getStyle(element, 'position') != 'static')\r
+ return element;\r
+\r
+ return document.body;\r
+ },\r
+\r
+ // caches x/y coordinate pair to use with overlap\r
+ within: function(element, x, y) {\r
+ if (this.includeScrollOffsets)\r
+ return this.withinIncludingScrolloffsets(element, x, y);\r
+ this.xcomp = x;\r
+ this.ycomp = y;\r
+ this.offset = this.cumulativeOffset(element);\r
+\r
+ return (y >= this.offset[1] &&\r
+ y < this.offset[1] + element.offsetHeight &&\r
+ x >= this.offset[0] &&\r
+ x < this.offset[0] + element.offsetWidth);\r
+ },\r
+\r
+ withinIncludingScrolloffsets: function(element, x, y) {\r
+ var offsetcache = this.realOffset(element);\r
+\r
+ this.xcomp = x + offsetcache[0] - this.deltaX;\r
+ this.ycomp = y + offsetcache[1] - this.deltaY;\r
+ this.offset = this.cumulativeOffset(element);\r
+\r
+ return (this.ycomp >= this.offset[1] &&\r
+ this.ycomp < this.offset[1] + element.offsetHeight &&\r
+ this.xcomp >= this.offset[0] &&\r
+ this.xcomp < this.offset[0] + element.offsetWidth);\r
+ },\r
+\r
+ // within must be called directly before\r
+ overlap: function(mode, element) {\r
+ if (!mode) return 0;\r
+ if (mode == 'vertical')\r
+ return ((this.offset[1] + element.offsetHeight) - this.ycomp) /\r
+ element.offsetHeight;\r
+ if (mode == 'horizontal')\r
+ return ((this.offset[0] + element.offsetWidth) - this.xcomp) /\r
+ element.offsetWidth;\r
+ },\r
+\r
+ page: function(forElement) {\r
+ var valueT = 0, valueL = 0;\r
+\r
+ var element = forElement;\r
+ do {\r
+ valueT += element.offsetTop || 0;\r
+ valueL += element.offsetLeft || 0;\r
+\r
+ // Safari fix\r
+ if (element.offsetParent==document.body)\r
+ if (Element.getStyle(element,'position')=='absolute') break;\r
+\r
+ } while (element = element.offsetParent);\r
+\r
+ element = forElement;\r
+ do {\r
+ if (!window.opera || element.tagName=='BODY') {\r
+ valueT -= element.scrollTop || 0;\r
+ valueL -= element.scrollLeft || 0;\r
+ }\r
+ } while (element = element.parentNode);\r
+\r
+ return [valueL, valueT];\r
+ },\r
+\r
+ clone: function(source, target) {\r
+ var options = Object.extend({\r
+ setLeft: true,\r
+ setTop: true,\r
+ setWidth: true,\r
+ setHeight: true,\r
+ offsetTop: 0,\r
+ offsetLeft: 0\r
+ }, arguments[2] || {})\r
+\r
+ // find page position of source\r
+ source = $(source);\r
+ var p = Position.page(source);\r
+\r
+ // find coordinate system to use\r
+ target = $(target);\r
+ var delta = [0, 0];\r
+ var parent = null;\r
+ // delta [0,0] will do fine with position: fixed elements,\r
+ // position:absolute needs offsetParent deltas\r
+ if (Element.getStyle(target,'position') == 'absolute') {\r
+ parent = Position.offsetParent(target);\r
+ delta = Position.page(parent);\r
+ }\r
+\r
+ // correct by body offsets (fixes Safari)\r
+ if (parent == document.body) {\r
+ delta[0] -= document.body.offsetLeft;\r
+ delta[1] -= document.body.offsetTop;\r
+ }\r
+\r
+ // set position\r
+ if(options.setLeft) target.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px';\r
+ if(options.setTop) target.style.top = (p[1] - delta[1] + options.offsetTop) + 'px';\r
+ if(options.setWidth) target.style.width = source.offsetWidth + 'px';\r
+ if(options.setHeight) target.style.height = source.offsetHeight + 'px';\r
+ },\r
+\r
+ absolutize: function(element) {\r
+ element = $(element);\r
+ if (element.style.position == 'absolute') return;\r
+ Position.prepare();\r
+\r
+ var offsets = Position.positionedOffset(element);\r
+ var top = offsets[1];\r
+ var left = offsets[0];\r
+ var width = element.clientWidth;\r
+ var height = element.clientHeight;\r
+\r
+ element._originalLeft = left - parseFloat(element.style.left || 0);\r
+ element._originalTop = top - parseFloat(element.style.top || 0);\r
+ element._originalWidth = element.style.width;\r
+ element._originalHeight = element.style.height;\r
+\r
+ element.style.position = 'absolute';\r
+ element.style.top = top + 'px';;\r
+ element.style.left = left + 'px';;\r
+ element.style.width = width + 'px';;\r
+ element.style.height = height + 'px';;\r
+ },\r
+\r
+ relativize: function(element) {\r
+ element = $(element);\r
+ if (element.style.position == 'relative') return;\r
+ Position.prepare();\r
+\r
+ element.style.position = 'relative';\r
+ var top = parseFloat(element.style.top || 0) - (element._originalTop || 0);\r
+ var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);\r
+\r
+ element.style.top = top + 'px';\r
+ element.style.left = left + 'px';\r
+ element.style.height = element._originalHeight;\r
+ element.style.width = element._originalWidth;\r
+ }\r
+}\r
+\r
+// Safari returns margins on body which is incorrect if the child is absolutely\r
+// positioned. For performance reasons, redefine Position.cumulativeOffset for\r
+// KHTML/WebKit only.\r
+if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) {\r
+ Position.cumulativeOffset = function(element) {\r
+ var valueT = 0, valueL = 0;\r
+ do {\r
+ valueT += element.offsetTop || 0;\r
+ valueL += element.offsetLeft || 0;\r
+ if (element.offsetParent == document.body)\r
+ if (Element.getStyle(element, 'position') == 'absolute') break;\r
+\r
+ element = element.offsetParent;\r
+ } while (element);\r
+\r
+ return [valueL, valueT];\r
+ }\r
+}\r
+\r
Element.addMethods();
\ No newline at end of file
-// Copyright (c) 2005 Thomas Fakes (http://craz8.com)
-//
-// This code is substantially based on code from script.aculo.us which has the
-// following copyright and permission notice
-//
-// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-var Resizeable = Class.create();
-Resizeable.prototype = {
- initialize: function(element) {
- var options = Object.extend({
- top: 6,
- bottom: 6,
- left: 6,
- right: 6,
- minHeight: 0,
- minWidth: 0,
- zindex: 1000,
- resize: null
- }, arguments[1] || {});
-
- this.element = $(element);
- this.handle = this.element;
-
- Element.makePositioned(this.element); // fix IE
-
- this.options = options;
-
- this.active = false;
- this.resizing = false;
- this.currentDirection = '';
-
- this.eventMouseDown = this.startResize.bindAsEventListener(this);
- this.eventMouseUp = this.endResize.bindAsEventListener(this);
- this.eventMouseMove = this.update.bindAsEventListener(this);
- this.eventCursorCheck = this.cursor.bindAsEventListener(this);
- this.eventKeypress = this.keyPress.bindAsEventListener(this);
-
- this.registerEvents();
- },
- destroy: function() {
- Event.stopObserving(this.handle, "mousedown", this.eventMouseDown);
- this.unregisterEvents();
- },
- registerEvents: function() {
- Event.observe(document, "mouseup", this.eventMouseUp);
- Event.observe(document, "mousemove", this.eventMouseMove);
- Event.observe(document, "keypress", this.eventKeypress);
- Event.observe(this.handle, "mousedown", this.eventMouseDown);
- Event.observe(this.element, "mousemove", this.eventCursorCheck);
- },
- unregisterEvents: function() {
- //if(!this.active) return;
- //Event.stopObserving(document, "mouseup", this.eventMouseUp);
- //Event.stopObserving(document, "mousemove", this.eventMouseMove);
- //Event.stopObserving(document, "mousemove", this.eventCursorCheck);
- //Event.stopObserving(document, "keypress", this.eventKeypress);
- },
- startResize: function(event) {
- if(Event.isLeftClick(event)) {
-
- // abort on form elements, fixes a Firefox issue
- var src = Event.element(event);
- if(src.tagName && (
- src.tagName=='INPUT' ||
- src.tagName=='SELECT' ||
- src.tagName=='BUTTON' ||
- src.tagName=='TEXTAREA')) return;
-
- var dir = this.directions(event);
- if (dir.length > 0) {
- this.active = true;
- var offsets = Position.cumulativeOffset(this.element);
- this.startTop = offsets[1];
- this.startLeft = offsets[0];
- this.startWidth = parseInt(Element.getStyle(this.element, 'width'));
- this.startHeight = parseInt(Element.getStyle(this.element, 'height'));
- this.startX = event.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
- this.startY = event.clientY + document.body.scrollTop + document.documentElement.scrollTop;
-
- this.currentDirection = dir;
- Event.stop(event);
- }
- }
- },
- finishResize: function(event, success) {
- // this.unregisterEvents();
-
- this.active = false;
- this.resizing = false;
-
- if(this.options.zindex)
- this.element.style.zIndex = this.originalZ;
-
- if (this.options.resize) {
- this.options.resize(this.element);
- }
- },
- keyPress: function(event) {
- if(this.active) {
- if(event.keyCode==Event.KEY_ESC) {
- this.finishResize(event, false);
- Event.stop(event);
- }
- }
- },
- endResize: function(event) {
- if(this.active && this.resizing) {
- this.finishResize(event, true);
- Event.stop(event);
- }
- this.active = false;
- this.resizing = false;
- },
- draw: function(event) {
- var pointer = [Event.pointerX(event), Event.pointerY(event)];
- var style = this.element.style;
- if (this.currentDirection.indexOf('n') != -1) {
- var pointerMoved = this.startY - pointer[1];
- var margin = Element.getStyle(this.element, 'margin-top') || "0";
- var newHeight = this.startHeight + pointerMoved;
- if (newHeight > this.options.minHeight) {
- style.height = newHeight + "px";
- style.top = (this.startTop - pointerMoved - parseInt(margin)) + "px";
- }
- }
- if (this.currentDirection.indexOf('w') != -1) {
- var pointerMoved = this.startX - pointer[0];
- var margin = Element.getStyle(this.element, 'margin-left') || "0";
- var newWidth = this.startWidth + pointerMoved;
- if (newWidth > this.options.minWidth) {
- style.left = (this.startLeft - pointerMoved - parseInt(margin)) + "px";
- style.width = newWidth + "px";
- }
- }
- if (this.currentDirection.indexOf('s') != -1) {
- var newHeight = this.startHeight + pointer[1] - this.startY;
- if (newHeight > this.options.minHeight) {
- style.height = newHeight + "px";
- }
- }
- if (this.currentDirection.indexOf('e') != -1) {
- var newWidth = this.startWidth + pointer[0] - this.startX;
- if (newWidth > this.options.minWidth) {
- style.width = newWidth + "px";
- }
- }
- if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering
- },
- between: function(val, low, high) {
- return (val >= low && val < high);
- },
- directions: function(event) {
- var pointer = [Event.pointerX(event), Event.pointerY(event)];
- var offsets = Position.cumulativeOffset(this.element);
-
- var cursor = '';
- if (this.between(pointer[1] - offsets[1], 0, this.options.top)) cursor += 'n';
- if (this.between((offsets[1] + this.element.offsetHeight) - pointer[1], 0, this.options.bottom)) cursor += 's';
- if (this.between(pointer[0] - offsets[0], 0, this.options.left)) cursor += 'w';
- if (this.between((offsets[0] + this.element.offsetWidth) - pointer[0], 0, this.options.right)) cursor += 'e';
-
- return cursor;
- },
- cursor: function(event) {
- var cursor = this.directions(event);
- if (cursor.length > 0) {
- cursor += '-resize';
- } else {
- cursor = '';
- }
- this.element.style.cursor = cursor;
- },
- update: function(event) {
- if(this.active) {
- if(!this.resizing) {
- var style = this.element.style;
- this.resizing = true;
-
- if(Element.getStyle(this.element,'position')=='')
- style.position = "relative";
-
- if(this.options.zindex) {
- this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0);
- style.zIndex = this.options.zindex;
- }
- }
- this.draw(event);
-
- // fix AppleWebKit rendering
- if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
- Event.stop(event);
- return false;
- }
- }
-}
+// Copyright (c) 2005 Thomas Fakes (http://craz8.com)\r
+// \r
+// This code is substantially based on code from script.aculo.us which has the \r
+// following copyright and permission notice\r
+//\r
+// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+var Resizeable = Class.create();\r
+Resizeable.prototype = {\r
+ initialize: function(element) {\r
+ var options = Object.extend({\r
+ top: 6,\r
+ bottom: 6,\r
+ left: 6,\r
+ right: 6,\r
+ minHeight: 0,\r
+ minWidth: 0,\r
+ zindex: 1000,\r
+ resize: null\r
+ }, arguments[1] || {});\r
+\r
+ this.element = $(element);\r
+ this.handle = this.element;\r
+\r
+ Element.makePositioned(this.element); // fix IE \r
+\r
+ this.options = options;\r
+\r
+ this.active = false;\r
+ this.resizing = false; \r
+ this.currentDirection = '';\r
+\r
+ this.eventMouseDown = this.startResize.bindAsEventListener(this);\r
+ this.eventMouseUp = this.endResize.bindAsEventListener(this);\r
+ this.eventMouseMove = this.update.bindAsEventListener(this);\r
+ this.eventCursorCheck = this.cursor.bindAsEventListener(this);\r
+ this.eventKeypress = this.keyPress.bindAsEventListener(this);\r
+ \r
+ this.registerEvents();\r
+ },\r
+ destroy: function() {\r
+ Event.stopObserving(this.handle, "mousedown", this.eventMouseDown);\r
+ this.unregisterEvents();\r
+ },\r
+ registerEvents: function() {\r
+ Event.observe(document, "mouseup", this.eventMouseUp);\r
+ Event.observe(document, "mousemove", this.eventMouseMove);\r
+ Event.observe(document, "keypress", this.eventKeypress);\r
+ Event.observe(this.handle, "mousedown", this.eventMouseDown);\r
+ Event.observe(this.element, "mousemove", this.eventCursorCheck);\r
+ },\r
+ unregisterEvents: function() {\r
+ //if(!this.active) return;\r
+ //Event.stopObserving(document, "mouseup", this.eventMouseUp);\r
+ //Event.stopObserving(document, "mousemove", this.eventMouseMove);\r
+ //Event.stopObserving(document, "mousemove", this.eventCursorCheck);\r
+ //Event.stopObserving(document, "keypress", this.eventKeypress);\r
+ },\r
+ startResize: function(event) {\r
+ if(Event.isLeftClick(event)) {\r
+ \r
+ // abort on form elements, fixes a Firefox issue\r
+ var src = Event.element(event);\r
+ if(src.tagName && (\r
+ src.tagName=='INPUT' ||\r
+ src.tagName=='SELECT' ||\r
+ src.tagName=='BUTTON' ||\r
+ src.tagName=='TEXTAREA')) return;\r
+\r
+ var dir = this.directions(event);\r
+ if (dir.length > 0) { \r
+ this.active = true;\r
+ var offsets = Position.cumulativeOffset(this.element);\r
+ this.startTop = offsets[1];\r
+ this.startLeft = offsets[0];\r
+ this.startWidth = parseInt(Element.getStyle(this.element, 'width'));\r
+ this.startHeight = parseInt(Element.getStyle(this.element, 'height'));\r
+ this.startX = event.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;\r
+ this.startY = event.clientY + document.body.scrollTop + document.documentElement.scrollTop;\r
+ \r
+ this.currentDirection = dir;\r
+ Event.stop(event);\r
+ }\r
+ }\r
+ },\r
+ finishResize: function(event, success) {\r
+ // this.unregisterEvents();\r
+\r
+ this.active = false;\r
+ this.resizing = false;\r
+\r
+ if(this.options.zindex)\r
+ this.element.style.zIndex = this.originalZ;\r
+ \r
+ if (this.options.resize) {\r
+ this.options.resize(this.element);\r
+ }\r
+ },\r
+ keyPress: function(event) {\r
+ if(this.active) {\r
+ if(event.keyCode==Event.KEY_ESC) {\r
+ this.finishResize(event, false);\r
+ Event.stop(event);\r
+ }\r
+ }\r
+ },\r
+ endResize: function(event) {\r
+ if(this.active && this.resizing) {\r
+ this.finishResize(event, true);\r
+ Event.stop(event);\r
+ }\r
+ this.active = false;\r
+ this.resizing = false;\r
+ },\r
+ draw: function(event) {\r
+ var pointer = [Event.pointerX(event), Event.pointerY(event)];\r
+ var style = this.element.style;\r
+ if (this.currentDirection.indexOf('n') != -1) {\r
+ var pointerMoved = this.startY - pointer[1];\r
+ var margin = Element.getStyle(this.element, 'margin-top') || "0";\r
+ var newHeight = this.startHeight + pointerMoved;\r
+ if (newHeight > this.options.minHeight) {\r
+ style.height = newHeight + "px";\r
+ style.top = (this.startTop - pointerMoved - parseInt(margin)) + "px";\r
+ }\r
+ }\r
+ if (this.currentDirection.indexOf('w') != -1) {\r
+ var pointerMoved = this.startX - pointer[0];\r
+ var margin = Element.getStyle(this.element, 'margin-left') || "0";\r
+ var newWidth = this.startWidth + pointerMoved;\r
+ if (newWidth > this.options.minWidth) {\r
+ style.left = (this.startLeft - pointerMoved - parseInt(margin)) + "px";\r
+ style.width = newWidth + "px";\r
+ }\r
+ }\r
+ if (this.currentDirection.indexOf('s') != -1) {\r
+ var newHeight = this.startHeight + pointer[1] - this.startY;\r
+ if (newHeight > this.options.minHeight) {\r
+ style.height = newHeight + "px";\r
+ }\r
+ }\r
+ if (this.currentDirection.indexOf('e') != -1) {\r
+ var newWidth = this.startWidth + pointer[0] - this.startX;\r
+ if (newWidth > this.options.minWidth) {\r
+ style.width = newWidth + "px";\r
+ }\r
+ }\r
+ if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering\r
+ },\r
+ between: function(val, low, high) {\r
+ return (val >= low && val < high);\r
+ },\r
+ directions: function(event) {\r
+ var pointer = [Event.pointerX(event), Event.pointerY(event)];\r
+ var offsets = Position.cumulativeOffset(this.element);\r
+ \r
+ var cursor = '';\r
+ if (this.between(pointer[1] - offsets[1], 0, this.options.top)) cursor += 'n';\r
+ if (this.between((offsets[1] + this.element.offsetHeight) - pointer[1], 0, this.options.bottom)) cursor += 's';\r
+ if (this.between(pointer[0] - offsets[0], 0, this.options.left)) cursor += 'w';\r
+ if (this.between((offsets[0] + this.element.offsetWidth) - pointer[0], 0, this.options.right)) cursor += 'e';\r
+\r
+ return cursor;\r
+ },\r
+ cursor: function(event) {\r
+ var cursor = this.directions(event);\r
+ if (cursor.length > 0) {\r
+ cursor += '-resize';\r
+ } else {\r
+ cursor = '';\r
+ }\r
+ this.element.style.cursor = cursor; \r
+ },\r
+ update: function(event) {\r
+ if(this.active) {\r
+ if(!this.resizing) {\r
+ var style = this.element.style;\r
+ this.resizing = true;\r
+ \r
+ if(Element.getStyle(this.element,'position')=='') \r
+ style.position = "relative";\r
+ \r
+ if(this.options.zindex) {\r
+ this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0);\r
+ style.zIndex = this.options.zindex;\r
+ }\r
+ }\r
+ this.draw(event);\r
+\r
+ // fix AppleWebKit rendering\r
+ if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0); \r
+ Event.stop(event);\r
+ return false;\r
+ }\r
+ }\r
+}\r
-// script.aculo.us scriptaculous.js v1.6.4, Wed Sep 06 11:30:58 CEST 2006
-
-// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-var Scriptaculous = {
- Version: '1.6.4',
- require: function(libraryName) {
- // inserting via DOM fails in Safari 2.0, so brute force approach
- document.write('<script type="text/javascript" src="'+libraryName+'"></script>');
- },
- load: function() {
- if((typeof Prototype=='undefined') ||
- (typeof Element == 'undefined') ||
- (typeof Element.Methods=='undefined') ||
- parseFloat(Prototype.Version.split(".")[0] + "." +
- Prototype.Version.split(".")[1]) < 1.5)
- throw("script.aculo.us requires the Prototype JavaScript framework >= 1.5.0");
-
- $A(document.getElementsByTagName("script")).findAll( function(s) {
- return (s.src && s.src.match(/scriptaculous\.js(\?.*)?$/))
- }).each( function(s) {
- var path = s.src.replace(/scriptaculous\.js(\?.*)?$/,'');
- var includes = s.src.match(/\?.*load=([a-z,]*)/);
- (includes ? includes[1] : 'builder,effects,dragdrop,controls,slider').split(',').each(
- function(include) { Scriptaculous.require(path+include+'.js') });
- });
- }
-}
-
+// script.aculo.us scriptaculous.js v1.6.4, Wed Sep 06 11:30:58 CEST 2006\r
+\r
+// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+var Scriptaculous = {\r
+ Version: '1.6.4',\r
+ require: function(libraryName) {\r
+ // inserting via DOM fails in Safari 2.0, so brute force approach\r
+ document.write('<script type="text/javascript" src="'+libraryName+'"></script>');\r
+ },\r
+ load: function() {\r
+ if((typeof Prototype=='undefined') || \r
+ (typeof Element == 'undefined') || \r
+ (typeof Element.Methods=='undefined') ||\r
+ parseFloat(Prototype.Version.split(".")[0] + "." +\r
+ Prototype.Version.split(".")[1]) < 1.5)\r
+ throw("script.aculo.us requires the Prototype JavaScript framework >= 1.5.0");\r
+ \r
+ $A(document.getElementsByTagName("script")).findAll( function(s) {\r
+ return (s.src && s.src.match(/scriptaculous\.js(\?.*)?$/))\r
+ }).each( function(s) {\r
+ var path = s.src.replace(/scriptaculous\.js(\?.*)?$/,'');\r
+ var includes = s.src.match(/\?.*load=([a-z,]*)/);\r
+ (includes ? includes[1] : 'builder,effects,dragdrop,controls,slider').split(',').each(\r
+ function(include) { Scriptaculous.require(path+include+'.js') });\r
+ });\r
+ }\r
+}\r
+\r
Scriptaculous.load();
\ No newline at end of file
-// script.aculo.us slider.js v1.6.4, Wed Sep 06 11:30:58 CEST 2006
-
-// Copyright (c) 2005 Marty Haught, Thomas Fuchs
-//
-// See http://script.aculo.us for more info
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-if(!Control) var Control = {};
-Control.Slider = Class.create();
-
-// options:
-// axis: 'vertical', or 'horizontal' (default)
-//
-// callbacks:
-// onChange(value)
-// onSlide(value)
-Control.Slider.prototype = {
- initialize: function(handle, track, options) {
- var slider = this;
-
- if(handle instanceof Array) {
- this.handles = handle.collect( function(e) { return $(e) });
- } else {
- this.handles = [$(handle)];
- }
-
- this.track = $(track);
- this.options = options || {};
-
- this.axis = this.options.axis || 'horizontal';
- this.increment = this.options.increment || 1;
- this.step = parseInt(this.options.step || '1');
- this.range = this.options.range || $R(0,1);
-
- this.value = 0; // assure backwards compat
- this.values = this.handles.map( function() { return 0 });
- this.spans = this.options.spans ? this.options.spans.map(function(s){ return $(s) }) : false;
- this.options.startSpan = $(this.options.startSpan || null);
- this.options.endSpan = $(this.options.endSpan || null);
-
- this.restricted = this.options.restricted || false;
-
- this.maximum = this.options.maximum || this.range.end;
- this.minimum = this.options.minimum || this.range.start;
-
- // Will be used to align the handle onto the track, if necessary
- this.alignX = parseInt(this.options.alignX || '0');
- this.alignY = parseInt(this.options.alignY || '0');
-
- this.trackLength = this.maximumOffset() - this.minimumOffset();
-
- this.handleLength = this.isVertical() ?
- (this.handles[0].offsetHeight != 0 ?
- this.handles[0].offsetHeight : this.handles[0].style.height.replace(/px$/,"")) :
- (this.handles[0].offsetWidth != 0 ? this.handles[0].offsetWidth :
- this.handles[0].style.width.replace(/px$/,""));
-
- this.active = false;
- this.dragging = false;
- this.disabled = false;
-
- if(this.options.disabled) this.setDisabled();
-
- // Allowed values array
- this.allowedValues = this.options.values ? this.options.values.sortBy(Prototype.K) : false;
- if(this.allowedValues) {
- this.minimum = this.allowedValues.min();
- this.maximum = this.allowedValues.max();
- }
-
- this.eventMouseDown = this.startDrag.bindAsEventListener(this);
- this.eventMouseUp = this.endDrag.bindAsEventListener(this);
- this.eventMouseMove = this.update.bindAsEventListener(this);
-
- // Initialize handles in reverse (make sure first handle is active)
- this.handles.each( function(h,i) {
- i = slider.handles.length-1-i;
- slider.setValue(parseFloat(
- (slider.options.sliderValue instanceof Array ?
- slider.options.sliderValue[i] : slider.options.sliderValue) ||
- slider.range.start), i);
- Element.makePositioned(h); // fix IE
- Event.observe(h, "mousedown", slider.eventMouseDown);
- });
-
- Event.observe(this.track, "mousedown", this.eventMouseDown);
- Event.observe(document, "mouseup", this.eventMouseUp);
- Event.observe(document, "mousemove", this.eventMouseMove);
-
- this.initialized = true;
- },
- dispose: function() {
- var slider = this;
- Event.stopObserving(this.track, "mousedown", this.eventMouseDown);
- Event.stopObserving(document, "mouseup", this.eventMouseUp);
- Event.stopObserving(document, "mousemove", this.eventMouseMove);
- this.handles.each( function(h) {
- Event.stopObserving(h, "mousedown", slider.eventMouseDown);
- });
- },
- setDisabled: function(){
- this.disabled = true;
- },
- setEnabled: function(){
- this.disabled = false;
- },
- getNearestValue: function(value){
- if(this.allowedValues){
- if(value >= this.allowedValues.max()) return(this.allowedValues.max());
- if(value <= this.allowedValues.min()) return(this.allowedValues.min());
-
- var offset = Math.abs(this.allowedValues[0] - value);
- var newValue = this.allowedValues[0];
- this.allowedValues.each( function(v) {
- var currentOffset = Math.abs(v - value);
- if(currentOffset <= offset){
- newValue = v;
- offset = currentOffset;
- }
- });
- return newValue;
- }
- if(value > this.range.end) return this.range.end;
- if(value < this.range.start) return this.range.start;
- return value;
- },
- setValue: function(sliderValue, handleIdx){
- if(!this.active) {
- this.activeHandleIdx = handleIdx || 0;
- this.activeHandle = this.handles[this.activeHandleIdx];
- this.updateStyles();
- }
- handleIdx = handleIdx || this.activeHandleIdx || 0;
- if(this.initialized && this.restricted) {
- if((handleIdx>0) && (sliderValue<this.values[handleIdx-1]))
- sliderValue = this.values[handleIdx-1];
- if((handleIdx < (this.handles.length-1)) && (sliderValue>this.values[handleIdx+1]))
- sliderValue = this.values[handleIdx+1];
- }
- sliderValue = this.getNearestValue(sliderValue);
- this.values[handleIdx] = sliderValue;
- this.value = this.values[0]; // assure backwards compat
-
- this.handles[handleIdx].style[this.isVertical() ? 'top' : 'left'] =
- this.translateToPx(sliderValue);
-
- this.drawSpans();
- if(!this.dragging || !this.event) this.updateFinished();
- },
- setValueBy: function(delta, handleIdx) {
- this.setValue(this.values[handleIdx || this.activeHandleIdx || 0] + delta,
- handleIdx || this.activeHandleIdx || 0);
- },
- translateToPx: function(value) {
- return Math.round(
- ((this.trackLength-this.handleLength)/(this.range.end-this.range.start)) *
- (value - this.range.start)) + "px";
- },
- translateToValue: function(offset) {
- return ((offset/(this.trackLength-this.handleLength) *
- (this.range.end-this.range.start)) + this.range.start);
- },
- getRange: function(range) {
- var v = this.values.sortBy(Prototype.K);
- range = range || 0;
- return $R(v[range],v[range+1]);
- },
- minimumOffset: function(){
- return(this.isVertical() ? this.alignY : this.alignX);
- },
- maximumOffset: function(){
- return(this.isVertical() ?
- (this.track.offsetHeight != 0 ? this.track.offsetHeight :
- this.track.style.height.replace(/px$/,"")) - this.alignY :
- (this.track.offsetWidth != 0 ? this.track.offsetWidth :
- this.track.style.width.replace(/px$/,"")) - this.alignY);
- },
- isVertical: function(){
- return (this.axis == 'vertical');
- },
- drawSpans: function() {
- var slider = this;
- if(this.spans)
- $R(0, this.spans.length-1).each(function(r) { slider.setSpan(slider.spans[r], slider.getRange(r)) });
- if(this.options.startSpan)
- this.setSpan(this.options.startSpan,
- $R(0, this.values.length>1 ? this.getRange(0).min() : this.value ));
- if(this.options.endSpan)
- this.setSpan(this.options.endSpan,
- $R(this.values.length>1 ? this.getRange(this.spans.length-1).max() : this.value, this.maximum));
- },
- setSpan: function(span, range) {
- if(this.isVertical()) {
- span.style.top = this.translateToPx(range.start);
- span.style.height = this.translateToPx(range.end - range.start + this.range.start);
- } else {
- span.style.left = this.translateToPx(range.start);
- span.style.width = this.translateToPx(range.end - range.start + this.range.start);
- }
- },
- updateStyles: function() {
- this.handles.each( function(h){ Element.removeClassName(h, 'selected') });
- Element.addClassName(this.activeHandle, 'selected');
- },
- startDrag: function(event) {
- if(Event.isLeftClick(event)) {
- if(!this.disabled){
- this.active = true;
-
- var handle = Event.element(event);
- var pointer = [Event.pointerX(event), Event.pointerY(event)];
- var track = handle;
- if(track==this.track) {
- var offsets = Position.cumulativeOffset(this.track);
- this.event = event;
- this.setValue(this.translateToValue(
- (this.isVertical() ? pointer[1]-offsets[1] : pointer[0]-offsets[0])-(this.handleLength/2)
- ));
- var offsets = Position.cumulativeOffset(this.activeHandle);
- this.offsetX = (pointer[0] - offsets[0]);
- this.offsetY = (pointer[1] - offsets[1]);
- } else {
- // find the handle (prevents issues with Safari)
- while((this.handles.indexOf(handle) == -1) && handle.parentNode)
- handle = handle.parentNode;
-
- this.activeHandle = handle;
- this.activeHandleIdx = this.handles.indexOf(this.activeHandle);
- this.updateStyles();
-
- var offsets = Position.cumulativeOffset(this.activeHandle);
- this.offsetX = (pointer[0] - offsets[0]);
- this.offsetY = (pointer[1] - offsets[1]);
- }
- }
- Event.stop(event);
- }
- },
- update: function(event) {
- if(this.active) {
- if(!this.dragging) this.dragging = true;
- this.draw(event);
- // fix AppleWebKit rendering
- if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
- Event.stop(event);
- }
- },
- draw: function(event) {
- var pointer = [Event.pointerX(event), Event.pointerY(event)];
- var offsets = Position.cumulativeOffset(this.track);
- pointer[0] -= this.offsetX + offsets[0];
- pointer[1] -= this.offsetY + offsets[1];
- this.event = event;
- this.setValue(this.translateToValue( this.isVertical() ? pointer[1] : pointer[0] ));
- if(this.initialized && this.options.onSlide)
- this.options.onSlide(this.values.length>1 ? this.values : this.value, this);
- },
- endDrag: function(event) {
- if(this.active && this.dragging) {
- this.finishDrag(event, true);
- Event.stop(event);
- }
- this.active = false;
- this.dragging = false;
- },
- finishDrag: function(event, success) {
- this.active = false;
- this.dragging = false;
- this.updateFinished();
- },
- updateFinished: function() {
- if(this.initialized && this.options.onChange)
- this.options.onChange(this.values.length>1 ? this.values : this.value, this);
- this.event = null;
- }
+// script.aculo.us slider.js v1.6.4, Wed Sep 06 11:30:58 CEST 2006\r
+\r
+// Copyright (c) 2005 Marty Haught, Thomas Fuchs \r
+//\r
+// See http://script.aculo.us for more info\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+if(!Control) var Control = {};\r
+Control.Slider = Class.create();\r
+\r
+// options:\r
+// axis: 'vertical', or 'horizontal' (default)\r
+//\r
+// callbacks:\r
+// onChange(value)\r
+// onSlide(value)\r
+Control.Slider.prototype = {\r
+ initialize: function(handle, track, options) {\r
+ var slider = this;\r
+ \r
+ if(handle instanceof Array) {\r
+ this.handles = handle.collect( function(e) { return $(e) });\r
+ } else {\r
+ this.handles = [$(handle)];\r
+ }\r
+ \r
+ this.track = $(track);\r
+ this.options = options || {};\r
+\r
+ this.axis = this.options.axis || 'horizontal';\r
+ this.increment = this.options.increment || 1;\r
+ this.step = parseInt(this.options.step || '1');\r
+ this.range = this.options.range || $R(0,1);\r
+ \r
+ this.value = 0; // assure backwards compat\r
+ this.values = this.handles.map( function() { return 0 });\r
+ this.spans = this.options.spans ? this.options.spans.map(function(s){ return $(s) }) : false;\r
+ this.options.startSpan = $(this.options.startSpan || null);\r
+ this.options.endSpan = $(this.options.endSpan || null);\r
+\r
+ this.restricted = this.options.restricted || false;\r
+\r
+ this.maximum = this.options.maximum || this.range.end;\r
+ this.minimum = this.options.minimum || this.range.start;\r
+\r
+ // Will be used to align the handle onto the track, if necessary\r
+ this.alignX = parseInt(this.options.alignX || '0');\r
+ this.alignY = parseInt(this.options.alignY || '0');\r
+ \r
+ this.trackLength = this.maximumOffset() - this.minimumOffset();\r
+\r
+ this.handleLength = this.isVertical() ? \r
+ (this.handles[0].offsetHeight != 0 ? \r
+ this.handles[0].offsetHeight : this.handles[0].style.height.replace(/px$/,"")) : \r
+ (this.handles[0].offsetWidth != 0 ? this.handles[0].offsetWidth : \r
+ this.handles[0].style.width.replace(/px$/,""));\r
+\r
+ this.active = false;\r
+ this.dragging = false;\r
+ this.disabled = false;\r
+\r
+ if(this.options.disabled) this.setDisabled();\r
+\r
+ // Allowed values array\r
+ this.allowedValues = this.options.values ? this.options.values.sortBy(Prototype.K) : false;\r
+ if(this.allowedValues) {\r
+ this.minimum = this.allowedValues.min();\r
+ this.maximum = this.allowedValues.max();\r
+ }\r
+\r
+ this.eventMouseDown = this.startDrag.bindAsEventListener(this);\r
+ this.eventMouseUp = this.endDrag.bindAsEventListener(this);\r
+ this.eventMouseMove = this.update.bindAsEventListener(this);\r
+\r
+ // Initialize handles in reverse (make sure first handle is active)\r
+ this.handles.each( function(h,i) {\r
+ i = slider.handles.length-1-i;\r
+ slider.setValue(parseFloat(\r
+ (slider.options.sliderValue instanceof Array ? \r
+ slider.options.sliderValue[i] : slider.options.sliderValue) || \r
+ slider.range.start), i);\r
+ Element.makePositioned(h); // fix IE\r
+ Event.observe(h, "mousedown", slider.eventMouseDown);\r
+ });\r
+ \r
+ Event.observe(this.track, "mousedown", this.eventMouseDown);\r
+ Event.observe(document, "mouseup", this.eventMouseUp);\r
+ Event.observe(document, "mousemove", this.eventMouseMove);\r
+ \r
+ this.initialized = true;\r
+ },\r
+ dispose: function() {\r
+ var slider = this; \r
+ Event.stopObserving(this.track, "mousedown", this.eventMouseDown);\r
+ Event.stopObserving(document, "mouseup", this.eventMouseUp);\r
+ Event.stopObserving(document, "mousemove", this.eventMouseMove);\r
+ this.handles.each( function(h) {\r
+ Event.stopObserving(h, "mousedown", slider.eventMouseDown);\r
+ });\r
+ },\r
+ setDisabled: function(){\r
+ this.disabled = true;\r
+ },\r
+ setEnabled: function(){\r
+ this.disabled = false;\r
+ }, \r
+ getNearestValue: function(value){\r
+ if(this.allowedValues){\r
+ if(value >= this.allowedValues.max()) return(this.allowedValues.max());\r
+ if(value <= this.allowedValues.min()) return(this.allowedValues.min());\r
+ \r
+ var offset = Math.abs(this.allowedValues[0] - value);\r
+ var newValue = this.allowedValues[0];\r
+ this.allowedValues.each( function(v) {\r
+ var currentOffset = Math.abs(v - value);\r
+ if(currentOffset <= offset){\r
+ newValue = v;\r
+ offset = currentOffset;\r
+ } \r
+ });\r
+ return newValue;\r
+ }\r
+ if(value > this.range.end) return this.range.end;\r
+ if(value < this.range.start) return this.range.start;\r
+ return value;\r
+ },\r
+ setValue: function(sliderValue, handleIdx){\r
+ if(!this.active) {\r
+ this.activeHandleIdx = handleIdx || 0;\r
+ this.activeHandle = this.handles[this.activeHandleIdx];\r
+ this.updateStyles();\r
+ }\r
+ handleIdx = handleIdx || this.activeHandleIdx || 0;\r
+ if(this.initialized && this.restricted) {\r
+ if((handleIdx>0) && (sliderValue<this.values[handleIdx-1]))\r
+ sliderValue = this.values[handleIdx-1];\r
+ if((handleIdx < (this.handles.length-1)) && (sliderValue>this.values[handleIdx+1]))\r
+ sliderValue = this.values[handleIdx+1];\r
+ }\r
+ sliderValue = this.getNearestValue(sliderValue);\r
+ this.values[handleIdx] = sliderValue;\r
+ this.value = this.values[0]; // assure backwards compat\r
+ \r
+ this.handles[handleIdx].style[this.isVertical() ? 'top' : 'left'] = \r
+ this.translateToPx(sliderValue);\r
+ \r
+ this.drawSpans();\r
+ if(!this.dragging || !this.event) this.updateFinished();\r
+ },\r
+ setValueBy: function(delta, handleIdx) {\r
+ this.setValue(this.values[handleIdx || this.activeHandleIdx || 0] + delta, \r
+ handleIdx || this.activeHandleIdx || 0);\r
+ },\r
+ translateToPx: function(value) {\r
+ return Math.round(\r
+ ((this.trackLength-this.handleLength)/(this.range.end-this.range.start)) * \r
+ (value - this.range.start)) + "px";\r
+ },\r
+ translateToValue: function(offset) {\r
+ return ((offset/(this.trackLength-this.handleLength) * \r
+ (this.range.end-this.range.start)) + this.range.start);\r
+ },\r
+ getRange: function(range) {\r
+ var v = this.values.sortBy(Prototype.K); \r
+ range = range || 0;\r
+ return $R(v[range],v[range+1]);\r
+ },\r
+ minimumOffset: function(){\r
+ return(this.isVertical() ? this.alignY : this.alignX);\r
+ },\r
+ maximumOffset: function(){\r
+ return(this.isVertical() ? \r
+ (this.track.offsetHeight != 0 ? this.track.offsetHeight :\r
+ this.track.style.height.replace(/px$/,"")) - this.alignY : \r
+ (this.track.offsetWidth != 0 ? this.track.offsetWidth : \r
+ this.track.style.width.replace(/px$/,"")) - this.alignY);\r
+ }, \r
+ isVertical: function(){\r
+ return (this.axis == 'vertical');\r
+ },\r
+ drawSpans: function() {\r
+ var slider = this;\r
+ if(this.spans)\r
+ $R(0, this.spans.length-1).each(function(r) { slider.setSpan(slider.spans[r], slider.getRange(r)) });\r
+ if(this.options.startSpan)\r
+ this.setSpan(this.options.startSpan,\r
+ $R(0, this.values.length>1 ? this.getRange(0).min() : this.value ));\r
+ if(this.options.endSpan)\r
+ this.setSpan(this.options.endSpan, \r
+ $R(this.values.length>1 ? this.getRange(this.spans.length-1).max() : this.value, this.maximum));\r
+ },\r
+ setSpan: function(span, range) {\r
+ if(this.isVertical()) {\r
+ span.style.top = this.translateToPx(range.start);\r
+ span.style.height = this.translateToPx(range.end - range.start + this.range.start);\r
+ } else {\r
+ span.style.left = this.translateToPx(range.start);\r
+ span.style.width = this.translateToPx(range.end - range.start + this.range.start);\r
+ }\r
+ },\r
+ updateStyles: function() {\r
+ this.handles.each( function(h){ Element.removeClassName(h, 'selected') });\r
+ Element.addClassName(this.activeHandle, 'selected');\r
+ },\r
+ startDrag: function(event) {\r
+ if(Event.isLeftClick(event)) {\r
+ if(!this.disabled){\r
+ this.active = true;\r
+ \r
+ var handle = Event.element(event);\r
+ var pointer = [Event.pointerX(event), Event.pointerY(event)];\r
+ var track = handle;\r
+ if(track==this.track) {\r
+ var offsets = Position.cumulativeOffset(this.track); \r
+ this.event = event;\r
+ this.setValue(this.translateToValue( \r
+ (this.isVertical() ? pointer[1]-offsets[1] : pointer[0]-offsets[0])-(this.handleLength/2)\r
+ ));\r
+ var offsets = Position.cumulativeOffset(this.activeHandle);\r
+ this.offsetX = (pointer[0] - offsets[0]);\r
+ this.offsetY = (pointer[1] - offsets[1]);\r
+ } else {\r
+ // find the handle (prevents issues with Safari)\r
+ while((this.handles.indexOf(handle) == -1) && handle.parentNode) \r
+ handle = handle.parentNode;\r
+ \r
+ this.activeHandle = handle;\r
+ this.activeHandleIdx = this.handles.indexOf(this.activeHandle);\r
+ this.updateStyles();\r
+ \r
+ var offsets = Position.cumulativeOffset(this.activeHandle);\r
+ this.offsetX = (pointer[0] - offsets[0]);\r
+ this.offsetY = (pointer[1] - offsets[1]);\r
+ }\r
+ }\r
+ Event.stop(event);\r
+ }\r
+ },\r
+ update: function(event) {\r
+ if(this.active) {\r
+ if(!this.dragging) this.dragging = true;\r
+ this.draw(event);\r
+ // fix AppleWebKit rendering\r
+ if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);\r
+ Event.stop(event);\r
+ }\r
+ },\r
+ draw: function(event) {\r
+ var pointer = [Event.pointerX(event), Event.pointerY(event)];\r
+ var offsets = Position.cumulativeOffset(this.track);\r
+ pointer[0] -= this.offsetX + offsets[0];\r
+ pointer[1] -= this.offsetY + offsets[1];\r
+ this.event = event;\r
+ this.setValue(this.translateToValue( this.isVertical() ? pointer[1] : pointer[0] ));\r
+ if(this.initialized && this.options.onSlide)\r
+ this.options.onSlide(this.values.length>1 ? this.values : this.value, this);\r
+ },\r
+ endDrag: function(event) {\r
+ if(this.active && this.dragging) {\r
+ this.finishDrag(event, true);\r
+ Event.stop(event);\r
+ }\r
+ this.active = false;\r
+ this.dragging = false;\r
+ }, \r
+ finishDrag: function(event, success) {\r
+ this.active = false;\r
+ this.dragging = false;\r
+ this.updateFinished();\r
+ },\r
+ updateFinished: function() {\r
+ if(this.initialized && this.options.onChange) \r
+ this.options.onChange(this.values.length>1 ? this.values : this.value, this);\r
+ this.event = null;\r
+ }\r
}
\ No newline at end of file
-// Copyright (c) 2006 spinelz.org (http://script.spinelz.org/)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-/**
- * Element class
- */
-Object.extend(Element, {
-
- getTagNodes: function(element, tree) {
- return this.getElementsByNodeType(element, 1, tree);
- },
-
- getTextNodes: function(element, tree) {
- return this.getElementsByNodeType(element, 3, tree);
- },
-
- getElementsByNodeType: function(element, nodeType, tree) {
-
- element = ($(element) || document.body);
- var nodes = element.childNodes;
- var result = [];
-
- for (var i = 0; i < nodes.length; i++) {
- if (nodes[i].nodeType == nodeType)
- result.push(nodes[i]);
- if (tree && (nodes[i].nodeType == 1))
- result = result.concat(this.getElementsByNodeType(nodes[i], nodeType, tree));
- }
-
- return result;
- },
-
- getParentByClassName: function(className, element) {
- var parent = element.parentNode;
- if (!parent || (parent.tagName == 'BODY'))
- return null;
- else if (!parent.className)
- return Element.getParentByClassName(className, parent);
- else if (Element.hasClassName(parent, className))
- return parent;
- else
- return Element.getParentByClassName(className, parent);
- },
-
- getParentByTagName: function(tagNames, element) {
-
- var parent = element.parentNode;
- if (parent.tagName == 'BODY')
- return null;
-
- var index = tagNames.join('/').toUpperCase().indexOf(parent.tagName.toUpperCase(), 0);
- if (index >= 0)
- return parent;
- else
- return Element.getParentByTagName(tagNames, parent);
- },
-
- getFirstElementByClassNames: function(element, classNames, tree) {
-
- if (!element ||
- !((typeof(classNames) == 'object') && (classNames.constructor == Array))) {
- return;
- }
-
- element = (element || document.body);
- var nodes = element.childNodes;
-
- for (var i = 0; i < nodes.length; i++) {
- for (var j = 0; j < classNames.length; j++) {
- if (nodes[i].nodeType != 1) {
- continue;
-
- } else if (Element.hasClassName(nodes[i], classNames[j])) {
- return nodes[i];
-
- } else if (tree) {
- var result = this.getFirstElementByClassNames(nodes[i], classNames, tree);
- if (result) return result;
- }
- }
- }
-
- return;
- },
-
- getElementsByClassNames: function(element, classNames) {
-
- if (!element ||
- !((typeof(classNames) == 'object') && (classNames.constructor == Array))) {
- return;
- }
-
- var nodes = [];
- classNames.each(function(c) {
- nodes = nodes.concat(document.getElementsByClassName(c, element));
- });
-
- return nodes;
- },
-
- getWindowHeight: function() {
-
- if (window.innerHeight) {
- return window.innerHeight; // Mozilla, Opera, NN4
- } else if (document.documentElement && document.documentElement.offsetHeight){ // ?? IE
- return document.documentElement.offsetHeight;
- } else if (document.body && document.body.offsetHeight) {
- return document.body.offsetHeight - 20;
- }
- return 0;
- },
-
- getWindowWidth:function() {
-
- if(window.innerWidth) {
- return window.innerWidth; // Mozilla, Opera, NN4
- } else if (document.documentElement && document.documentElement.offsetWidth){ // ?? IE
- return document.documentElement.offsetWidth - 20;
- } else if (document.body && document.body.offsetWidth){
- return document.body.offsetWidth - 20;
- }
- return 0;
- },
-
- getMaxZindex: function(element) {
- element = $(element);
- if (!element) {
- element = document.body;
- }
- if (element.nodeType != 1) return 0;
-
- var maxZindex = 0;
- if (element.style) maxZindex = parseInt(Element.getStyle(element, "z-index"));
- if (isNaN(maxZindex)) maxZindex = 0;
-
- var tmpZindex = 0;
- var elements = element.childNodes;
- for (var i = 0; i < elements.length; i++) {
- if (elements[i] && elements[i].tagName) {
- tmpZindex = Element.getMaxZindex(elements[i]);
- if (maxZindex < tmpZindex) maxZindex = tmpZindex;
- }
- }
-
- return maxZindex;
- },
-
- select: function(element, value) {
- $A($(element).options).each(function(opt) {
- if (opt.value == value) {
- opt.selected = true;
- } else {
- opt.selected = false;
- }
- });
- }
-});
-
-
-/**
- * Array
- */
-Object.extend(Array.prototype, {
- insert : function(index, element) {
- this.splice(index, 0 , element);
- },
-
- remove : function(index) {
- this.splice(index, 1);
- }
-});
-
-
-/**
- * String
- */
-Object.extend(String.prototype, {
-
- getPrefix: function(delimiter) {
-
- if (!delimiter) delimiter = '_';
- return this.split(delimiter)[0];
- },
-
- getSuffix: function(delimiter) {
-
- if (!delimiter) delimiter = '_';
- return this.split(delimiter).pop();
- },
-
- appendPrefix: function(prefix, delimiter) {
-
- if (!delimiter) delimiter = '_';
- return this + delimiter + prefix;
- },
-
- appendSuffix: function(suffix, delimiter) {
-
- if (!delimiter) delimiter = '_';
- return this + delimiter + suffix;
- },
-
- // for firefox
- println: function() {
- dump(this + '\n');
- }
-});
-
-
-/**
- * CssUtil
- */
-var CssUtil = Class.create();
-
-CssUtil.appendPrefix = function(prefix, suffixes) {
- var newHash = {};
- $H(suffixes).each(function(pair) {
- newHash[pair[0]] = prefix + suffixes[pair[0]];
- });
- return newHash;
-}
-
-CssUtil.getCssRules = function(sheet) {
- return sheet.rules || sheet.cssRules;
-}
-
-CssUtil.getCssRuleBySelectorText = function(selector) {
- var rule = null;
- $A(document.styleSheets).each(function(s) {
- var rules = CssUtil.getCssRules(s);
- rule = $A(rules).detect(function(r) {
- if (!r.selectorText) return false;
- return r.selectorText.toLowerCase() == selector.toLowerCase();
- });
- if (rule) throw $break;
- });
- return rule;
-}
-
-/*
-CssUtil.require = function(file, attributes, parent) {
- var links = document.getElementsByTagName('link');
- var regex = /^.*\.css/;
- var match = file.match(regex)
- alert(file)
- regex.compile(match);
-
- $A(links).each(function(ln) {
- if (ln.href.match(regex)) {
- }
- });
-
-// attributes = Object.extend({
-// href: file,
-// media: 'screen',
-// rel: 'stylesheet',
-// type: 'text/css'}, attributes);
-// var node = Builder.node('link', attributes);
-// if (!parent) parent = document.body;
-// parent.appendChild(node);
-// alert(file);
-}
-*/
-
-CssUtil.prototype = {
-
- initialize: function(styles) {
- if (!((typeof(styles) == 'object') && (styles.constructor == Array))) {
- throw 'CssUtil#initialize: argument must be a Array object!';
- }
-
- this.styles = styles;
- },
-
- getClasses: function(key) {
- return this.styles.collect(function(s) {
- return s[key];
- });
- },
-
- joinClassNames: function(key) {
- return this.getClasses(key).join(' ');
- },
-
- addClassNames: function(element, key) {
- this.styles.each(function(s) {
- Element.addClassName(element, s[key]);
- });
- },
-
- removeClassNames: function(element, key) {
- this.styles.each(function(s) {
- Element.removeClassName(element, s[key]);
- });
- },
-
- refreshClassNames: function(element, key) {
- element.className = '';
- this.addClassNames(element, key);
- },
-
- hasClassName: function(element, key) {
- return this.styles.any(function(s) {
- return Element.hasClassName(element, s[key]);
- });
- }
-}
-
-
-/**
- * Hover
- */
-var Hover = Class.create();
-Hover.prototype = {
-
- initialize: function(element) {
- this.options = Object.extend({
- defaultClass: '',
- hoverClass: '',
- cssUtil: '',
- list: false
- }, arguments[1] || {});
-
- var element = $(element);
- if (this.options.list) {
- var nodes = element.childNodes;
- for (var i = 0; i < nodes.length; i++) {
- if (nodes[i].nodeType == 1) {
- this.build(nodes[i]);
- }
- }
- } else {
- this.build(element);
- }
- },
-
- build: function(element) {
- this.normal = this.getNormalClass(element);
- this.hover = this.getHoverClass(this.normal);
-
- if (this.options.cssUtil) {
- this.normal = this.options.cssUtil.joinClassNames(normal);
- this.hover = this.options.cssUtil.joinClassNames(hover);
- }
- this.setHoverEvent(element);
- },
-
- setHoverEvent: function(element) {
- Event.observe(element, "mouseout", this.toggle.bindAsEventListener(this, element, this.normal));
- Event.observe(element, "mouseover", this.toggle.bindAsEventListener(this, element, this.hover));
- },
-
- toggle: function(event, element, className) {
- Event.stop(event);
- element.className = className;
- },
-
- getNormalClass: function(element) {
- var className = (this.options.defaultClass || element.className);
- return (className || '');
- },
-
- getHoverClass: function(defaultClass) {
- var className = this.options.hoverClass;
- if (!className) {
- className = defaultClass.split(' ').collect(function(c) {
- return c + 'Hover';
- }).join(' ');
- }
- return className;
- }
-}
-
-
-/**
- * Date
- */
-Object.extend(Date.prototype, {
- msPerDay: function() {
- return 24 * 60 * 60 * 1000;
- },
-
- advance: function(options) {
- return new Date(this.getTime() + this.msPerDay() * options.days);
- },
-
- days: function() {
- var date = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0);
- return Math.round(date.getTime() / this.msPerDay());
- },
-
- toHash: function() {
- return {
- year: this.getFullYear(),
- month: this.getMonth(),
- day: this.getDate(),
- hour: this.getHours(),
- min: this.getMinutes(),
- sec: this.getSeconds()
- }
- },
-
- sameYear: function(date) {
- return this.getFullYear() == date.getFullYear();
- },
-
- sameMonth: function(date) {
- return this.sameYear(date) && this.getMonth() == date.getMonth();
- },
-
- sameDate: function(date) {
- return this.sameYear(date) && this.sameMonth(date) && this.getDate() == date.getDate();
- },
-
- betweenDate: function(start, finish) {
- var myDays = this.days();
- return (start.days() <= myDays && myDays <= finish.days());
- },
-
- betweenTime: function(start, finish) {
- var myTime = this.getTime();
- return (start.getTime() <= myTime && myTime <= finish.getTime());
- }
-});
-
-
-/**
- * DateUtil
- */
-var DateUtil = {
-
- dayOfWeek: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
-
- months: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
-
- daysOfMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
-
- numberOfDays: function(start, finish) {
- return finish.days() - start.days();
- },
-
- isLeapYear: function(year) {
- if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
- return true;
- return false;
- },
-
- nextDate: function(date) {
- return new Date(date.getFullYear(), date.getMonth(), date.getDate() + 1);
- },
-
- previousDate: function(date) {
- return new Date(date.getFullYear(), date.getMonth(), date.getDate() - 1);
- },
-
- afterDays: function(date, after) {
- return new Date(date.getFullYear(), date.getMonth(), date.getDate() + after);
- },
-
- getLastDate: function(year, month) {
- var last = this.daysOfMonth[month];
- if ((month == 1) && this.isLeapYear(year)) {
- return new Date(year, month, last + 1);
- }
- return new Date(year, month, last);
- },
-
- getFirstDate: function(year, month) {
- if (year.constructor == Date) {
- return new Date(year.getFullYear(), year.getMonth(), 1);
- }
- return new Date(year, month, 1);
- },
-
- getWeekTurn: function(date, firstDWeek) {
- var limit = 6 - firstDWeek + 1;
- var turn = 0;
- while (limit < date) {
- date -= 7;
- turn++;
- }
- return turn;
- },
-
- toDateString: function(date) {
- return date.toDateString();
- },
-
- toLocaleDateString: function(date) {
- return date.toLocaleDateString();
- },
-
- simpleFormat: function(formatStr) {
- return function(date) {
- var formated = formatStr.replace(/M+/g, DateUtil.zerofill((date.getMonth() + 1).toString(), 2));
- formated = formated.replace(/d+/g, DateUtil.zerofill(date.getDate().toString(), 2));
- formated = formated.replace(/y{4}/g, date.getFullYear());
- formated = formated.replace(/y{1,3}/g, new String(date.getFullYear()).substr(2));
- formated = formated.replace(/E+/g, DateUtil.dayOfWeek[date.getDay()]);
-
- return formated;
- }
- },
-
- zerofill: function(date,digit){
- var result = date;
- if(date.length < digit){
- var tmp = digit - date.length;
- for(i=0; i < tmp; i++){
- result = "0" + result;
- }
- }
- return result;
- },
-
- toDate: function(hash) {
- return new Date(hash.year, hash.month, hash.day, hash.hour, hash.min, hash.sec || 0);
- }
-}
-
-
-/**
- * ZindexManager
- */
-var ZindexManager = {
- zIndex: 1000,
-
- getIndex: function(zIndex) {
- if (zIndex) {
- if (isNaN(zIndex)) {
- zIndex = Element.getMaxZindex() + 1;
- } else if (ZindexManager.zIndex > zIndex) {
- zIndex = ZindexManager.zIndex;
- }
- } else {
- zIndex = ZindexManager.zIndex;
- }
- ZindexManager.zIndex = zIndex + 1;
- return zIndex;
- }
-}
-
-
-/**
- * Modal
- */
-var Modal = {
- maskId: 'modalMask',
- maskClass: 'modal_mask',
- maskClassIE: 'modal_mask_ie',
- element: null,
- snaps: null,
- listener: null,
- resizeListener: null,
- cover: null,
- excepteds: null,
-
- mask: function(excepted) {
- var options = Object.extend({
- cssPrefix: 'custom_',
- zIndex: null
- }, arguments[1] || {});
-
- if (Modal.element) {
- Modal._snap(excepted);
- Modal._rebuildMask();
- } else {
- Modal.snaps = [];
- Modal.excepteds = [];
- Modal._buildMask(options.cssPrefix);
- Modal.cover = new IECover(Modal.element, {transparent: true});
- }
- Modal._setZindex(excepted, options.zIndex);
- Modal._setFullSize();
- if (!Modal.hasExcepted(excepted)) Modal.excepteds.push(excepted);
- },
-
- unmask: function() {
- if (Modal.element) {
- if (Modal.snaps.length == 0) {
- Element.hide(Modal.element);
- Modal._removeEvent();
- Modal.excepteds = [];
- Element.remove(Modal.element);
- Modal.element = null;
- } else {
- Element.setStyle(Modal.element, {zIndex: Modal.snaps.pop()});
- Modal.excepteds.pop();
- }
- }
- },
-
- _addEvent: function() {
- if (!Modal.listener) {
- Modal.listener = Modal._handleEvent.bindAsEventListener();
- Modal.resizeListener = Modal._onResize.bindAsEventListener();
- }
- Event.observe(document, "keypress", Modal.listener);
- Event.observe(document, "keydown", Modal.listener);
- Event.observe(document, "keyup", Modal.listener);
- Event.observe(document, "focus", Modal.listener);
- Event.observe(window, "resize", Modal.resizeListener);
- },
-
- _removeEvent: function() {
- Event.stopObserving(document, "keypress", Modal.listener);
- Event.stopObserving(document, "keydown", Modal.listener);
- Event.stopObserving(document, "keyup", Modal.listener);
- Event.stopObserving(document, "focus", Modal.listener);
- Event.stopObserving(window, "resize", Modal.resizeListener);
- },
-
- _isMasked: function() {
- return Modal.element && Element.visible(Modal.element);
- },
-
- _snap: function(excepted) {
- var index = Element.getStyle(Modal.element, 'zIndex');
- if (index && Modal._isMasked() && !Modal.hasExcepted(excepted)) Modal.snaps.push(index);
- },
-
- _setZindex: function(excepted, zIndex) {
- zIndex = ZindexManager.getIndex(zIndex);
- Element.setStyle(Modal.element, {zIndex: zIndex});
- excepted = Element.makePositioned($(excepted));
- Element.setStyle(excepted, {zIndex: ++zIndex});
- },
-
- _setFullSize: function() {
- Modal.element.setStyle({
- width: Element.getWindowWidth() + 'px',
- height: Element.getWindowHeight() + 'px'
- });
- if (Modal.cover) Modal.cover.resetSize();
- },
-
- _buildMask: function(cssPrefix) {
- var mask = Builder.node('div', {id: Modal.maskId});
- Modal._setClassNames(mask, cssPrefix);
- document.body.appendChild(mask);
- Modal.element = mask;
- Modal._addEvent();
- },
-
- _setClassNames: function(element, cssPrefix) {
- var className = (UserAgent.isIE()) ? Modal.maskClassIE : Modal.maskClass;
- Element.addClassName(element, className);
- Element.addClassName(element, cssPrefix + className);
- },
-
- _rebuildMask: function() {
- document.body.appendChild(Modal.element);
- Element.show(Modal.element);
- },
-
- _isOutOfModal: function(src) {
- var limit = Element.getStyle(Modal.element, 'zIndex');
- var zIndex = null;
- while ((src = src.parentNode) && src != document.body) {
- if (src.style && (zIndex = Element.getStyle(src, 'zIndex'))) {
- if (zIndex > limit) {
- return true;
- } else {
- return false;
- }
- }
- }
- return false;
- },
-
- _handleEvent: function (event) {
- var src = Event.element(event);
- if (!Modal._isOutOfModal(src)) {
- Event.stop(event);
- }
- },
-
- _onResize: function(event) {
- Modal._setFullSize();
- },
-
- hasExcepted: function(excepted) {
- return Modal.excepteds && Modal.excepteds.include(excepted);
- }
-}
-
-
-/**
- * IECover
- */
-var IECover = Class.create();
-IECover.src = '/blank.html';
-IECover.prototype = {
- idSuffix: 'iecover',
-
- initialize: function(parent) {
- this.options = Object.extend({
- transparent : false,
- padding : 0
- }, arguments[1] || {});
-
- if (document.all) {
- parent = $(parent);
- this.id = parent.id.appendSuffix(this.idSuffix);
- this._build(parent);
- this.resetSize();
- }
- },
-
- resetSize: function() {
- if (this.element) {
- var parent = this.element.parentNode;
- var padding = this.options.padding;
- this.element.width = parent.offsetWidth - padding + 'px';
- this.element.height = Element.getHeight(parent) - padding + 'px';
- }
- },
-
- _build: function(parent) {
- var padding = this.options.padding / 2;
- var styles = {
- position : 'absolute',
- top : padding + 'px',
- left : padding + 'px'
- };
- if (this.options.transparent) styles.filter = 'alpha(opacity=0)';
- this.element = Builder.node('iframe', {src: IECover.src, id: this.id, frameborder: 0});
- Element.setStyle(this.element, styles);
- var firstNode = Element.down(parent, 0);
- if (firstNode) Element.makePositioned(firstNode);
- parent.insertBefore(this.element, parent.firstChild);
- }
-}
-
-/**
- * UserAgent
- */
-var UserAgent = {
- getUserAgent: function() {
- return navigator.userAgent;
- },
- isIE: function() {
- if(document.all && this.getUserAgent().toLowerCase().indexOf('msie') != -1) {
- return true;
- }
- },
- isIE7: function() {
- if(document.all && this.getUserAgent().toLowerCase().indexOf('msie 7') != -1) {
- return true;
- }
- }
-}
-
-/**
- * ShortcutManager
- */
-var ShortcutManager = {
- initialize: function() {
- var defaultOptions = {
- initialStarted: true,
- preventDefault: true
- }
- this.options = Object.extend(defaultOptions, arguments[0] || {});
- if(this.documentListener) {
- Event.stopObserving(document, 'keydown', this.documentListener);
- }
- this.documentListener = this.eventKeydown.bindAsEventListener(this);
- this.functions = new Object();
- this.functions['a'] = new Object();
- this.functions['ac'] = new Object();
- this.functions['as'] = new Object();
- this.functions['acs'] = new Object();
- this.functions['c'] = new Object();
- this.functions['cs'] = new Object();
- this.functions['n'] = new Object();
- this.functions['s'] = new Object();
- this.keyCode = {
- 'backspace': 8,
- 'tab': 9,
- 'return': 13,
- 'enter': 13,
- 'pause': 19,
- 'break': 19,
- 'caps': 20,
- 'capslock': 20,
- 'esc': 27,
- 'escape': 27,
- 'space': 32,
- 'pageup': 33,
- 'pgup': 33,
- 'pagedown': 34,
- 'pgdn': 34,
- 'end': 35,
- 'home': 36,
- 'left': 37,
- 'up': 38,
- 'right': 39,
- 'down': 40,
- 'insert': 45,
- 'delete': 46,
- '0': 48,
- '1': 49,
- '2': 50,
- '3': 51,
- '4': 52,
- '5': 53,
- '6': 54,
- '7': 55,
- '8': 56,
- '9': 57,
- 'a': 65,
- 'b': 66,
- 'c': 67,
- 'd': 68,
- 'e': 69,
- 'f': 70,
- 'g': 71,
- 'h': 72,
- 'i': 73,
- 'j': 74,
- 'k': 75,
- 'l': 76,
- 'm': 77,
- 'n': 78,
- 'o': 79,
- 'p': 80,
- 'q': 81,
- 'r': 82,
- 's': 83,
- 't': 84,
- 'u': 85,
- 'v': 86,
- 'w': 87,
- 'x': 88,
- 'y': 89,
- 'z': 90,
- 'f1': 112,
- 'f2': 113,
- 'f3': 114,
- 'f4': 115,
- 'f5': 116,
- 'f6': 117,
- 'f7': 118,
- 'f8': 119,
- 'f9': 120,
- 'f10': 121,
- 'f11': 122,
- 'f12': 123,
- 'numlock': 144,
- 'nmlk': 144,
- 'scrolllock': 145,
- 'scflk': 145
- };
- this.numKeys = {
- 96: 48,
- 97: 49,
- 98: 50,
- 99: 51,
- 100: 52,
- 101: 53,
- 102: 54,
- 103: 55,
- 104: 56,
- 105: 57
- };
- if(this.options.initialStarted) {
- this.start();
- } else {
- this.stop();
- }
- Event.observe(document, 'keydown', this.documentListener);
- },
- add: function(shortcut, callback) {
- this._add_or_remove_function(shortcut, callback);
- },
- destroy: function() {
- Event.stopObserving(document, 'keydown', this.documentListener);
- },
- eventKeydown: function(event) {
- if(this.executable) {
- var code;
- var key = '';
- event = event || window.event;
- if(event.keyCode) {
- if(event.altKey) {
- key += 'a';
- }
- if(event.ctrlKey) {
- key += 'c';
- }
- if(event.shiftKey) {
- key += 's';
- }
- if(key == '') {
- key = 'n';
- }
- code = this._mergeNumKey(event.keyCode);
- if(this.functions[key][code]) {
- this.functions[key][code]();
- if(this.options.preventDefault) {
- Event.stop(event);
- }
- }
- }
- }
- },
- remove: function(shortcut) {
- this._add_or_remove_function(shortcut);
- },
- start: function() {
- this.executable = true;
- },
- stop: function() {
- this.executable = false;
- },
- _add_or_remove_function: function(shortcut, callback) {
- var pressed_key_code;
- var additional_keys = new Array();
- var self = this;
- $A(shortcut.toLowerCase().split("+")).each(
- function(key) {
- if(key == 'alt') {
- additional_keys.push('a');
- } else if(key == 'ctrl') {
- additional_keys.push('c');
- } else if(key == 'shift') {
- additional_keys.push('s');
- } else {
- pressed_key_code = self.keyCode[key];
- }
- }
- );
- var key = additional_keys.sortBy(function(value, index) {return value;}).join('');
- if(key == '') {
- key = 'n';
- }
- if(callback) {
- this.functions[key][pressed_key_code] = callback;
- } else {
- this.functions[key][pressed_key_code] = null;
- }
- },
- _mergeNumKey: function(code) {
- return (this.numKeys[code]) ? this.numKeys[code] : code;
- }
-}
-
-
-/**
- * Function
- */
-Function.prototype.callAfterLoading = function(object) {
- object = object || this;
- if (UserAgent.isIE() && document.readyState != 'complete') {
- Event.observe(window, 'load', this.bind(object));
- } else {
- this.call(object);
- }
-}
+// Copyright (c) 2006 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+/**\r
+ * Element class\r
+ */\r
+Object.extend(Element, {\r
+\r
+ getTagNodes: function(element, tree) {\r
+ return this.getElementsByNodeType(element, 1, tree);\r
+ },\r
+ \r
+ getTextNodes: function(element, tree) {\r
+ return this.getElementsByNodeType(element, 3, tree);\r
+ },\r
+ \r
+ getElementsByNodeType: function(element, nodeType, tree) {\r
+ \r
+ element = ($(element) || document.body);\r
+ var nodes = element.childNodes;\r
+ var result = [];\r
+ \r
+ for (var i = 0; i < nodes.length; i++) {\r
+ if (nodes[i].nodeType == nodeType)\r
+ result.push(nodes[i]);\r
+ if (tree && (nodes[i].nodeType == 1)) \r
+ result = result.concat(this.getElementsByNodeType(nodes[i], nodeType, tree));\r
+ }\r
+ \r
+ return result;\r
+ },\r
+ \r
+ getParentByClassName: function(className, element) {\r
+ var parent = element.parentNode;\r
+ if (!parent || (parent.tagName == 'BODY'))\r
+ return null;\r
+ else if (!parent.className) \r
+ return Element.getParentByClassName(className, parent);\r
+ else if (Element.hasClassName(parent, className))\r
+ return parent;\r
+ else\r
+ return Element.getParentByClassName(className, parent);\r
+ },\r
+ \r
+ getParentByTagName: function(tagNames, element) {\r
+ \r
+ var parent = element.parentNode;\r
+ if (parent.tagName == 'BODY')\r
+ return null;\r
+ \r
+ var index = tagNames.join('/').toUpperCase().indexOf(parent.tagName.toUpperCase(), 0);\r
+ if (index >= 0)\r
+ return parent;\r
+ else\r
+ return Element.getParentByTagName(tagNames, parent);\r
+ },\r
+ \r
+ getFirstElementByClassNames: function(element, classNames, tree) {\r
+ \r
+ if (!element || \r
+ !((typeof(classNames) == 'object') && (classNames.constructor == Array))) {\r
+ return; \r
+ }\r
+ \r
+ element = (element || document.body);\r
+ var nodes = element.childNodes;\r
+ \r
+ for (var i = 0; i < nodes.length; i++) {\r
+ for (var j = 0; j < classNames.length; j++) {\r
+ if (nodes[i].nodeType != 1) {\r
+ continue;\r
+ \r
+ } else if (Element.hasClassName(nodes[i], classNames[j])) {\r
+ return nodes[i];\r
+ \r
+ } else if (tree) {\r
+ var result = this.getFirstElementByClassNames(nodes[i], classNames, tree);\r
+ if (result) return result;\r
+ }\r
+ }\r
+ }\r
+ \r
+ return;\r
+ },\r
+ \r
+ getElementsByClassNames: function(element, classNames) {\r
+ \r
+ if (!element || \r
+ !((typeof(classNames) == 'object') && (classNames.constructor == Array))) {\r
+ return; \r
+ }\r
+ \r
+ var nodes = [];\r
+ classNames.each(function(c) {\r
+ nodes = nodes.concat(document.getElementsByClassName(c, element));\r
+ });\r
+ \r
+ return nodes;\r
+ },\r
+ \r
+ getWindowHeight: function() {\r
+ \r
+ if (window.innerHeight) {\r
+ return window.innerHeight; // Mozilla, Opera, NN4\r
+ } else if (document.documentElement && document.documentElement.offsetHeight){ // ?? IE\r
+ return document.documentElement.offsetHeight;\r
+ } else if (document.body && document.body.offsetHeight) {\r
+ return document.body.offsetHeight - 20;\r
+ }\r
+ return 0;\r
+ },\r
+ \r
+ getWindowWidth:function() {\r
+ \r
+ if(window.innerWidth) {\r
+ return window.innerWidth; // Mozilla, Opera, NN4\r
+ } else if (document.documentElement && document.documentElement.offsetWidth){ // ?? IE\r
+ return document.documentElement.offsetWidth - 20;\r
+ } else if (document.body && document.body.offsetWidth){\r
+ return document.body.offsetWidth - 20;\r
+ }\r
+ return 0;\r
+ },\r
+ \r
+ getMaxZindex: function(element) {\r
+ element = $(element);\r
+ if (!element) {\r
+ element = document.body;\r
+ } \r
+ if (element.nodeType != 1) return 0;\r
+\r
+ var maxZindex = 0;\r
+ if (element.style) maxZindex = parseInt(Element.getStyle(element, "z-index")); \r
+ if (isNaN(maxZindex)) maxZindex = 0;\r
+\r
+ var tmpZindex = 0;\r
+ var elements = element.childNodes;\r
+ for (var i = 0; i < elements.length; i++) {\r
+ if (elements[i] && elements[i].tagName) {\r
+ tmpZindex = Element.getMaxZindex(elements[i]);\r
+ if (maxZindex < tmpZindex) maxZindex = tmpZindex;\r
+ }\r
+ }\r
+\r
+ return maxZindex;\r
+ },\r
+\r
+ select: function(element, value) {\r
+ $A($(element).options).each(function(opt) {\r
+ if (opt.value == value) {\r
+ opt.selected = true;\r
+ } else {\r
+ opt.selected = false;\r
+ }\r
+ });\r
+ }\r
+});\r
+\r
+\r
+/**\r
+ * Array\r
+ */\r
+Object.extend(Array.prototype, {\r
+ insert : function(index, element) {\r
+ this.splice(index, 0 , element);\r
+ },\r
+ \r
+ remove : function(index) {\r
+ this.splice(index, 1);\r
+ }\r
+});\r
+\r
+\r
+/**\r
+ * String\r
+ */\r
+Object.extend(String.prototype, {\r
+ \r
+ getPrefix: function(delimiter) {\r
+ \r
+ if (!delimiter) delimiter = '_';\r
+ return this.split(delimiter)[0];\r
+ },\r
+ \r
+ getSuffix: function(delimiter) {\r
+ \r
+ if (!delimiter) delimiter = '_';\r
+ return this.split(delimiter).pop();\r
+ },\r
+\r
+ appendPrefix: function(prefix, delimiter) {\r
+ \r
+ if (!delimiter) delimiter = '_';\r
+ return this + delimiter + prefix;\r
+ },\r
+ \r
+ appendSuffix: function(suffix, delimiter) {\r
+ \r
+ if (!delimiter) delimiter = '_';\r
+ return this + delimiter + suffix;\r
+ },\r
+ \r
+ // for firefox\r
+ println: function() {\r
+ dump(this + '\n');\r
+ }\r
+});\r
+\r
+\r
+/**\r
+ * CssUtil\r
+ */\r
+var CssUtil = Class.create();\r
+\r
+CssUtil.appendPrefix = function(prefix, suffixes) {\r
+ var newHash = {};\r
+ $H(suffixes).each(function(pair) {\r
+ newHash[pair[0]] = prefix + suffixes[pair[0]];\r
+ });\r
+ return newHash;\r
+}\r
+\r
+CssUtil.getCssRules = function(sheet) {\r
+ return sheet.rules || sheet.cssRules;\r
+}\r
+\r
+CssUtil.getCssRuleBySelectorText = function(selector) {\r
+ var rule = null;\r
+ $A(document.styleSheets).each(function(s) {\r
+ var rules = CssUtil.getCssRules(s);\r
+ rule = $A(rules).detect(function(r) {\r
+ if (!r.selectorText) return false;\r
+ return r.selectorText.toLowerCase() == selector.toLowerCase();\r
+ });\r
+ if (rule) throw $break;\r
+ });\r
+ return rule;\r
+}\r
+\r
+/*\r
+CssUtil.require = function(file, attributes, parent) {\r
+ var links = document.getElementsByTagName('link');\r
+ var regex = /^.*\.css/; \r
+ var match = file.match(regex)\r
+ alert(file)\r
+ regex.compile(match);\r
+\r
+ $A(links).each(function(ln) {\r
+ if (ln.href.match(regex)) {\r
+ }\r
+ });\r
+ \r
+// attributes = Object.extend({\r
+// href: file, \r
+// media: 'screen', \r
+// rel: 'stylesheet', \r
+// type: 'text/css'}, attributes);\r
+// var node = Builder.node('link', attributes);\r
+// if (!parent) parent = document.body;\r
+// parent.appendChild(node);\r
+// alert(file);\r
+}\r
+*/\r
+\r
+CssUtil.prototype = {\r
+ \r
+ initialize: function(styles) {\r
+ if (!((typeof(styles) == 'object') && (styles.constructor == Array))) {\r
+ throw 'CssUtil#initialize: argument must be a Array object!'; \r
+ }\r
+ \r
+ this.styles = styles;\r
+ },\r
+\r
+ getClasses: function(key) {\r
+ return this.styles.collect(function(s) {\r
+ return s[key];\r
+ });\r
+ },\r
+ \r
+ joinClassNames: function(key) {\r
+ return this.getClasses(key).join(' ');\r
+ },\r
+ \r
+ addClassNames: function(element, key) {\r
+ this.styles.each(function(s) {\r
+ Element.addClassName(element, s[key]);\r
+ });\r
+ },\r
+ \r
+ removeClassNames: function(element, key) {\r
+ this.styles.each(function(s) {\r
+ Element.removeClassName(element, s[key]);\r
+ });\r
+ },\r
+ \r
+ refreshClassNames: function(element, key) {\r
+ element.className = '';\r
+ this.addClassNames(element, key);\r
+ },\r
+ \r
+ hasClassName: function(element, key) {\r
+ return this.styles.any(function(s) {\r
+ return Element.hasClassName(element, s[key]);\r
+ });\r
+ }\r
+}\r
+\r
+\r
+/** \r
+ * Hover \r
+ */\r
+var Hover = Class.create();\r
+Hover.prototype = {\r
+\r
+ initialize: function(element) {\r
+ this.options = Object.extend({\r
+ defaultClass: '',\r
+ hoverClass: '',\r
+ cssUtil: '',\r
+ list: false\r
+ }, arguments[1] || {});\r
+ \r
+ var element = $(element);\r
+ if (this.options.list) {\r
+ var nodes = element.childNodes;\r
+ for (var i = 0; i < nodes.length; i++) {\r
+ if (nodes[i].nodeType == 1) {\r
+ this.build(nodes[i]);\r
+ }\r
+ }\r
+ } else {\r
+ this.build(element);\r
+ }\r
+ },\r
+ \r
+ build: function(element) {\r
+ this.normal = this.getNormalClass(element);\r
+ this.hover = this.getHoverClass(this.normal);\r
+ \r
+ if (this.options.cssUtil) {\r
+ this.normal = this.options.cssUtil.joinClassNames(normal);\r
+ this.hover = this.options.cssUtil.joinClassNames(hover); \r
+ }\r
+ this.setHoverEvent(element);\r
+ },\r
+\r
+ setHoverEvent: function(element) {\r
+ Event.observe(element, "mouseout", this.toggle.bindAsEventListener(this, element, this.normal));\r
+ Event.observe(element, "mouseover", this.toggle.bindAsEventListener(this, element, this.hover));\r
+ },\r
+\r
+ toggle: function(event, element, className) {\r
+ Event.stop(event);\r
+ element.className = className;\r
+ },\r
+\r
+ getNormalClass: function(element) {\r
+ var className = (this.options.defaultClass || element.className);\r
+ return (className || '');\r
+ },\r
+ \r
+ getHoverClass: function(defaultClass) {\r
+ var className = this.options.hoverClass;\r
+ if (!className) {\r
+ className = defaultClass.split(' ').collect(function(c) {\r
+ return c + 'Hover';\r
+ }).join(' ');\r
+ } \r
+ return className;\r
+ }\r
+}\r
+\r
+\r
+/**\r
+ * Date\r
+ */\r
+Object.extend(Date.prototype, {\r
+ msPerDay: function() {\r
+ return 24 * 60 * 60 * 1000;\r
+ },\r
+\r
+ advance: function(options) {\r
+ return new Date(this.getTime() + this.msPerDay() * options.days);\r
+ },\r
+\r
+ days: function() {\r
+ var date = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0);\r
+ return Math.round(date.getTime() / this.msPerDay());\r
+ },\r
+\r
+ toHash: function() {\r
+ return {\r
+ year: this.getFullYear(),\r
+ month: this.getMonth(),\r
+ day: this.getDate(),\r
+ hour: this.getHours(),\r
+ min: this.getMinutes(),\r
+ sec: this.getSeconds()\r
+ }\r
+ },\r
+\r
+ sameYear: function(date) {\r
+ return this.getFullYear() == date.getFullYear();\r
+ },\r
+\r
+ sameMonth: function(date) {\r
+ return this.sameYear(date) && this.getMonth() == date.getMonth();\r
+ },\r
+\r
+ sameDate: function(date) {\r
+ return this.sameYear(date) && this.sameMonth(date) && this.getDate() == date.getDate();\r
+ },\r
+\r
+ betweenDate: function(start, finish) {\r
+ var myDays = this.days();\r
+ return (start.days() <= myDays && myDays <= finish.days());\r
+ },\r
+\r
+ betweenTime: function(start, finish) {\r
+ var myTime = this.getTime();\r
+ return (start.getTime() <= myTime && myTime <= finish.getTime());\r
+ }\r
+});\r
+\r
+\r
+/**\r
+ * DateUtil\r
+ */\r
+var DateUtil = {\r
+\r
+ dayOfWeek: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\r
+\r
+ months: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\r
+\r
+ daysOfMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],\r
+\r
+ numberOfDays: function(start, finish) {\r
+ return finish.days() - start.days();\r
+ },\r
+\r
+ isLeapYear: function(year) {\r
+ if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))\r
+ return true;\r
+ return false;\r
+ }, \r
+\r
+ nextDate: function(date) {\r
+ return new Date(date.getFullYear(), date.getMonth(), date.getDate() + 1);\r
+ },\r
+\r
+ previousDate: function(date) {\r
+ return new Date(date.getFullYear(), date.getMonth(), date.getDate() - 1);\r
+ },\r
+ \r
+ afterDays: function(date, after) {\r
+ return new Date(date.getFullYear(), date.getMonth(), date.getDate() + after);\r
+ },\r
+ \r
+ getLastDate: function(year, month) {\r
+ var last = this.daysOfMonth[month];\r
+ if ((month == 1) && this.isLeapYear(year)) {\r
+ return new Date(year, month, last + 1);\r
+ }\r
+ return new Date(year, month, last);\r
+ },\r
+ \r
+ getFirstDate: function(year, month) {\r
+ if (year.constructor == Date) {\r
+ return new Date(year.getFullYear(), year.getMonth(), 1);\r
+ }\r
+ return new Date(year, month, 1);\r
+ },\r
+\r
+ getWeekTurn: function(date, firstDWeek) {\r
+ var limit = 6 - firstDWeek + 1;\r
+ var turn = 0;\r
+ while (limit < date) {\r
+ date -= 7;\r
+ turn++;\r
+ }\r
+ return turn;\r
+ },\r
+\r
+ toDateString: function(date) {\r
+ return date.toDateString();\r
+ },\r
+ \r
+ toLocaleDateString: function(date) {\r
+ return date.toLocaleDateString();\r
+ },\r
+ \r
+ simpleFormat: function(formatStr) {\r
+ return function(date) {\r
+ var formated = formatStr.replace(/M+/g, DateUtil.zerofill((date.getMonth() + 1).toString(), 2));\r
+ formated = formated.replace(/d+/g, DateUtil.zerofill(date.getDate().toString(), 2));\r
+ formated = formated.replace(/y{4}/g, date.getFullYear());\r
+ formated = formated.replace(/y{1,3}/g, new String(date.getFullYear()).substr(2));\r
+ formated = formated.replace(/E+/g, DateUtil.dayOfWeek[date.getDay()]);\r
+ \r
+ return formated;\r
+ }\r
+ },\r
+\r
+ zerofill: function(date,digit){\r
+ var result = date;\r
+ if(date.length < digit){\r
+ var tmp = digit - date.length;\r
+ for(i=0; i < tmp; i++){\r
+ result = "0" + result;\r
+ }\r
+ }\r
+ return result;\r
+ },\r
+\r
+ toDate: function(hash) {\r
+ return new Date(hash.year, hash.month, hash.day, hash.hour, hash.min, hash.sec || 0);\r
+ }\r
+}\r
+\r
+\r
+/**\r
+ * ZindexManager\r
+ */\r
+var ZindexManager = {\r
+ zIndex: 1000,\r
+\r
+ getIndex: function(zIndex) {\r
+ if (zIndex) {\r
+ if (isNaN(zIndex)) {\r
+ zIndex = Element.getMaxZindex() + 1;\r
+ } else if (ZindexManager.zIndex > zIndex) {\r
+ zIndex = ZindexManager.zIndex;\r
+ }\r
+ } else {\r
+ zIndex = ZindexManager.zIndex;\r
+ }\r
+ ZindexManager.zIndex = zIndex + 1;\r
+ return zIndex;\r
+ }\r
+}\r
+\r
+\r
+/**\r
+ * Modal\r
+ */\r
+var Modal = {\r
+ maskId: 'modalMask',\r
+ maskClass: 'modal_mask',\r
+ maskClassIE: 'modal_mask_ie',\r
+ element: null,\r
+ snaps: null,\r
+ listener: null,\r
+ resizeListener: null,\r
+ cover: null,\r
+ excepteds: null,\r
+\r
+ mask: function(excepted) {\r
+ var options = Object.extend({\r
+ cssPrefix: 'custom_',\r
+ zIndex: null\r
+ }, arguments[1] || {});\r
+\r
+ if (Modal.element) {\r
+ Modal._snap(excepted);\r
+ Modal._rebuildMask();\r
+ } else {\r
+ Modal.snaps = [];\r
+ Modal.excepteds = [];\r
+ Modal._buildMask(options.cssPrefix);\r
+ Modal.cover = new IECover(Modal.element, {transparent: true});\r
+ }\r
+ Modal._setZindex(excepted, options.zIndex);\r
+ Modal._setFullSize();\r
+ if (!Modal.hasExcepted(excepted)) Modal.excepteds.push(excepted);\r
+ },\r
+\r
+ unmask: function() {\r
+ if (Modal.element) {\r
+ if (Modal.snaps.length == 0) {\r
+ Element.hide(Modal.element);\r
+ Modal._removeEvent();\r
+ Modal.excepteds = [];\r
+ Element.remove(Modal.element);\r
+ Modal.element = null;\r
+ } else {\r
+ Element.setStyle(Modal.element, {zIndex: Modal.snaps.pop()});\r
+ Modal.excepteds.pop();\r
+ }\r
+ }\r
+ },\r
+\r
+ _addEvent: function() {\r
+ if (!Modal.listener) {\r
+ Modal.listener = Modal._handleEvent.bindAsEventListener();\r
+ Modal.resizeListener = Modal._onResize.bindAsEventListener();\r
+ }\r
+ Event.observe(document, "keypress", Modal.listener);\r
+ Event.observe(document, "keydown", Modal.listener);\r
+ Event.observe(document, "keyup", Modal.listener);\r
+ Event.observe(document, "focus", Modal.listener);\r
+ Event.observe(window, "resize", Modal.resizeListener);\r
+ },\r
+\r
+ _removeEvent: function() {\r
+ Event.stopObserving(document, "keypress", Modal.listener);\r
+ Event.stopObserving(document, "keydown", Modal.listener);\r
+ Event.stopObserving(document, "keyup", Modal.listener);\r
+ Event.stopObserving(document, "focus", Modal.listener);\r
+ Event.stopObserving(window, "resize", Modal.resizeListener);\r
+ },\r
+\r
+ _isMasked: function() {\r
+ return Modal.element && Element.visible(Modal.element);\r
+ },\r
+\r
+ _snap: function(excepted) {\r
+ var index = Element.getStyle(Modal.element, 'zIndex');\r
+ if (index && Modal._isMasked() && !Modal.hasExcepted(excepted)) Modal.snaps.push(index);\r
+ },\r
+\r
+ _setZindex: function(excepted, zIndex) {\r
+ zIndex = ZindexManager.getIndex(zIndex);\r
+ Element.setStyle(Modal.element, {zIndex: zIndex});\r
+ excepted = Element.makePositioned($(excepted));\r
+ Element.setStyle(excepted, {zIndex: ++zIndex});\r
+ },\r
+\r
+ _setFullSize: function() {\r
+ Modal.element.setStyle({\r
+ width: Element.getWindowWidth() + 'px',\r
+ height: Element.getWindowHeight() + 'px'\r
+ });\r
+ if (Modal.cover) Modal.cover.resetSize();\r
+ },\r
+\r
+ _buildMask: function(cssPrefix) {\r
+ var mask = Builder.node('div', {id: Modal.maskId});\r
+ Modal._setClassNames(mask, cssPrefix);\r
+ document.body.appendChild(mask);\r
+ Modal.element = mask;\r
+ Modal._addEvent();\r
+ },\r
+\r
+ _setClassNames: function(element, cssPrefix) {\r
+ var className = (UserAgent.isIE()) ? Modal.maskClassIE : Modal.maskClass;\r
+ Element.addClassName(element, className);\r
+ Element.addClassName(element, cssPrefix + className);\r
+ },\r
+\r
+ _rebuildMask: function() {\r
+ document.body.appendChild(Modal.element);\r
+ Element.show(Modal.element);\r
+ },\r
+\r
+ _isOutOfModal: function(src) {\r
+ var limit = Element.getStyle(Modal.element, 'zIndex');\r
+ var zIndex = null;\r
+ while ((src = src.parentNode) && src != document.body) {\r
+ if (src.style && (zIndex = Element.getStyle(src, 'zIndex'))) {\r
+ if (zIndex > limit) {\r
+ return true;\r
+ } else {\r
+ return false;\r
+ }\r
+ }\r
+ }\r
+ return false;\r
+ },\r
+\r
+ _handleEvent: function (event) {\r
+ var src = Event.element(event);\r
+ if (!Modal._isOutOfModal(src)) {\r
+ Event.stop(event);\r
+ }\r
+ },\r
+\r
+ _onResize: function(event) {\r
+ Modal._setFullSize();\r
+ },\r
+\r
+ hasExcepted: function(excepted) {\r
+ return Modal.excepteds && Modal.excepteds.include(excepted);\r
+ }\r
+}\r
+\r
+\r
+/**\r
+ * IECover\r
+ */\r
+var IECover = Class.create();\r
+IECover.src = '/blank.html';\r
+IECover.prototype = {\r
+ idSuffix: 'iecover',\r
+\r
+ initialize: function(parent) {\r
+ this.options = Object.extend({\r
+ transparent : false,\r
+ padding : 0\r
+ }, arguments[1] || {});\r
+\r
+ if (document.all) {\r
+ parent = $(parent);\r
+ this.id = parent.id.appendSuffix(this.idSuffix);\r
+ this._build(parent);\r
+ this.resetSize();\r
+ }\r
+ },\r
+\r
+ resetSize: function() {\r
+ if (this.element) {\r
+ var parent = this.element.parentNode;\r
+ var padding = this.options.padding;\r
+ this.element.width = parent.offsetWidth - padding + 'px';\r
+ this.element.height = Element.getHeight(parent) - padding + 'px';\r
+ }\r
+ },\r
+\r
+ _build: function(parent) {\r
+ var padding = this.options.padding / 2;\r
+ var styles = {\r
+ position : 'absolute',\r
+ top : padding + 'px',\r
+ left : padding + 'px'\r
+ };\r
+ if (this.options.transparent) styles.filter = 'alpha(opacity=0)';\r
+ this.element = Builder.node('iframe', {src: IECover.src, id: this.id, frameborder: 0});\r
+ Element.setStyle(this.element, styles);\r
+ var firstNode = Element.down(parent, 0);\r
+ if (firstNode) Element.makePositioned(firstNode);\r
+ parent.insertBefore(this.element, parent.firstChild);\r
+ }\r
+}\r
+\r
+/**\r
+ * UserAgent\r
+ */\r
+var UserAgent = {\r
+ getUserAgent: function() {\r
+ return navigator.userAgent;\r
+ },\r
+ isIE: function() {\r
+ if(document.all && this.getUserAgent().toLowerCase().indexOf('msie') != -1) {\r
+ return true;\r
+ }\r
+ },\r
+ isIE7: function() {\r
+ if(document.all && this.getUserAgent().toLowerCase().indexOf('msie 7') != -1) {\r
+ return true;\r
+ }\r
+ }\r
+}\r
+\r
+/**\r
+ * ShortcutManager\r
+ */\r
+var ShortcutManager = {\r
+ initialize: function() {\r
+ var defaultOptions = {\r
+ initialStarted: true,\r
+ preventDefault: true\r
+ }\r
+ this.options = Object.extend(defaultOptions, arguments[0] || {});\r
+ if(this.documentListener) {\r
+ Event.stopObserving(document, 'keydown', this.documentListener);\r
+ }\r
+ this.documentListener = this.eventKeydown.bindAsEventListener(this);\r
+ this.functions = new Object();\r
+ this.functions['a'] = new Object();\r
+ this.functions['ac'] = new Object();\r
+ this.functions['as'] = new Object();\r
+ this.functions['acs'] = new Object();\r
+ this.functions['c'] = new Object();\r
+ this.functions['cs'] = new Object();\r
+ this.functions['n'] = new Object();\r
+ this.functions['s'] = new Object();\r
+ this.keyCode = {\r
+ 'backspace': 8,\r
+ 'tab': 9,\r
+ 'return': 13,\r
+ 'enter': 13,\r
+ 'pause': 19,\r
+ 'break': 19,\r
+ 'caps': 20,\r
+ 'capslock': 20,\r
+ 'esc': 27,\r
+ 'escape': 27,\r
+ 'space': 32,\r
+ 'pageup': 33,\r
+ 'pgup': 33,\r
+ 'pagedown': 34,\r
+ 'pgdn': 34,\r
+ 'end': 35,\r
+ 'home': 36,\r
+ 'left': 37,\r
+ 'up': 38,\r
+ 'right': 39,\r
+ 'down': 40,\r
+ 'insert': 45,\r
+ 'delete': 46,\r
+ '0': 48,\r
+ '1': 49,\r
+ '2': 50,\r
+ '3': 51,\r
+ '4': 52,\r
+ '5': 53,\r
+ '6': 54,\r
+ '7': 55,\r
+ '8': 56,\r
+ '9': 57,\r
+ 'a': 65,\r
+ 'b': 66,\r
+ 'c': 67,\r
+ 'd': 68,\r
+ 'e': 69,\r
+ 'f': 70,\r
+ 'g': 71,\r
+ 'h': 72,\r
+ 'i': 73,\r
+ 'j': 74,\r
+ 'k': 75,\r
+ 'l': 76,\r
+ 'm': 77,\r
+ 'n': 78,\r
+ 'o': 79,\r
+ 'p': 80,\r
+ 'q': 81,\r
+ 'r': 82,\r
+ 's': 83,\r
+ 't': 84,\r
+ 'u': 85,\r
+ 'v': 86,\r
+ 'w': 87,\r
+ 'x': 88,\r
+ 'y': 89,\r
+ 'z': 90,\r
+ 'f1': 112,\r
+ 'f2': 113,\r
+ 'f3': 114,\r
+ 'f4': 115,\r
+ 'f5': 116,\r
+ 'f6': 117,\r
+ 'f7': 118,\r
+ 'f8': 119,\r
+ 'f9': 120,\r
+ 'f10': 121,\r
+ 'f11': 122,\r
+ 'f12': 123,\r
+ 'numlock': 144,\r
+ 'nmlk': 144,\r
+ 'scrolllock': 145,\r
+ 'scflk': 145\r
+ };\r
+ this.numKeys = {\r
+ 96: 48,\r
+ 97: 49,\r
+ 98: 50,\r
+ 99: 51,\r
+ 100: 52,\r
+ 101: 53,\r
+ 102: 54,\r
+ 103: 55,\r
+ 104: 56,\r
+ 105: 57\r
+ };\r
+ if(this.options.initialStarted) {\r
+ this.start();\r
+ } else {\r
+ this.stop();\r
+ }\r
+ Event.observe(document, 'keydown', this.documentListener);\r
+ },\r
+ add: function(shortcut, callback) {\r
+ this._add_or_remove_function(shortcut, callback);\r
+ },\r
+ destroy: function() {\r
+ Event.stopObserving(document, 'keydown', this.documentListener);\r
+ },\r
+ eventKeydown: function(event) {\r
+ if(this.executable) {\r
+ var code;\r
+ var key = '';\r
+ event = event || window.event;\r
+ if(event.keyCode) {\r
+ if(event.altKey) {\r
+ key += 'a';\r
+ }\r
+ if(event.ctrlKey) {\r
+ key += 'c';\r
+ }\r
+ if(event.shiftKey) {\r
+ key += 's';\r
+ }\r
+ if(key == '') {\r
+ key = 'n';\r
+ }\r
+ code = this._mergeNumKey(event.keyCode);\r
+ if(this.functions[key][code]) {\r
+ this.functions[key][code]();\r
+ if(this.options.preventDefault) {\r
+ Event.stop(event);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ },\r
+ remove: function(shortcut) {\r
+ this._add_or_remove_function(shortcut);\r
+ },\r
+ start: function() {\r
+ this.executable = true;\r
+ },\r
+ stop: function() {\r
+ this.executable = false;\r
+ },\r
+ _add_or_remove_function: function(shortcut, callback) {\r
+ var pressed_key_code;\r
+ var additional_keys = new Array();\r
+ var self = this;\r
+ $A(shortcut.toLowerCase().split("+")).each(\r
+ function(key) {\r
+ if(key == 'alt') {\r
+ additional_keys.push('a');\r
+ } else if(key == 'ctrl') {\r
+ additional_keys.push('c');\r
+ } else if(key == 'shift') {\r
+ additional_keys.push('s');\r
+ } else {\r
+ pressed_key_code = self.keyCode[key];\r
+ }\r
+ }\r
+ );\r
+ var key = additional_keys.sortBy(function(value, index) {return value;}).join('');\r
+ if(key == '') {\r
+ key = 'n';\r
+ }\r
+ if(callback) {\r
+ this.functions[key][pressed_key_code] = callback;\r
+ } else {\r
+ this.functions[key][pressed_key_code] = null;\r
+ }\r
+ },\r
+ _mergeNumKey: function(code) {\r
+ return (this.numKeys[code]) ? this.numKeys[code] : code;\r
+ }\r
+}\r
+\r
+\r
+/**\r
+ * Function\r
+ */\r
+Function.prototype.callAfterLoading = function(object) {\r
+ object = object || this;\r
+ if (UserAgent.isIE() && document.readyState != 'complete') {\r
+ Event.observe(window, 'load', this.bind(object));\r
+ } else {\r
+ this.call(object);\r
+ }\r
+}\r
-// script.aculo.us unittest.js v1.6.4, Wed Sep 06 11:30:58 CEST 2006
-
-// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-// (c) 2005 Jon Tirsen (http://www.tirsen.com)
-// (c) 2005 Michael Schuerig (http://www.schuerig.de/michael/)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-
-// experimental, Firefox-only
-Event.simulateMouse = function(element, eventName) {
- var options = Object.extend({
- pointerX: 0,
- pointerY: 0,
- buttons: 0
- }, arguments[2] || {});
- var oEvent = document.createEvent("MouseEvents");
- oEvent.initMouseEvent(eventName, true, true, document.defaultView,
- options.buttons, options.pointerX, options.pointerY, options.pointerX, options.pointerY,
- false, false, false, false, 0, $(element));
-
- if(this.mark) Element.remove(this.mark);
- this.mark = document.createElement('div');
- this.mark.appendChild(document.createTextNode(" "));
- document.body.appendChild(this.mark);
- this.mark.style.position = 'absolute';
- this.mark.style.top = options.pointerY + "px";
- this.mark.style.left = options.pointerX + "px";
- this.mark.style.width = "5px";
- this.mark.style.height = "5px;";
- this.mark.style.borderTop = "1px solid red;"
- this.mark.style.borderLeft = "1px solid red;"
-
- if(this.step)
- alert('['+new Date().getTime().toString()+'] '+eventName+'/'+Test.Unit.inspect(options));
-
- $(element).dispatchEvent(oEvent);
-};
-
-// Note: Due to a fix in Firefox 1.0.5/6 that probably fixed "too much", this doesn't work in 1.0.6 or DP2.
-// You need to downgrade to 1.0.4 for now to get this working
-// See https://bugzilla.mozilla.org/show_bug.cgi?id=289940 for the fix that fixed too much
-Event.simulateKey = function(element, eventName) {
- var options = Object.extend({
- ctrlKey: false,
- altKey: false,
- shiftKey: false,
- metaKey: false,
- keyCode: 0,
- charCode: 0
- }, arguments[2] || {});
-
- var oEvent = document.createEvent("KeyEvents");
- oEvent.initKeyEvent(eventName, true, true, window,
- options.ctrlKey, options.altKey, options.shiftKey, options.metaKey,
- options.keyCode, options.charCode );
- $(element).dispatchEvent(oEvent);
-};
-
-Event.simulateKeys = function(element, command) {
- for(var i=0; i<command.length; i++) {
- Event.simulateKey(element,'keypress',{charCode:command.charCodeAt(i)});
- }
-};
-
-var Test = {}
-Test.Unit = {};
-
-// security exception workaround
-Test.Unit.inspect = Object.inspect;
-
-Test.Unit.Logger = Class.create();
-Test.Unit.Logger.prototype = {
- initialize: function(log) {
- this.log = $(log);
- if (this.log) {
- this._createLogTable();
- }
- },
- start: function(testName) {
- if (!this.log) return;
- this.testName = testName;
- this.lastLogLine = document.createElement('tr');
- this.statusCell = document.createElement('td');
- this.nameCell = document.createElement('td');
- this.nameCell.appendChild(document.createTextNode(testName));
- this.messageCell = document.createElement('td');
- this.lastLogLine.appendChild(this.statusCell);
- this.lastLogLine.appendChild(this.nameCell);
- this.lastLogLine.appendChild(this.messageCell);
- this.loglines.appendChild(this.lastLogLine);
- },
- finish: function(status, summary) {
- if (!this.log) return;
- this.lastLogLine.className = status;
- this.statusCell.innerHTML = status;
- this.messageCell.innerHTML = this._toHTML(summary);
- },
- message: function(message) {
- if (!this.log) return;
- this.messageCell.innerHTML = this._toHTML(message);
- },
- summary: function(summary) {
- if (!this.log) return;
- this.logsummary.innerHTML = this._toHTML(summary);
- },
- _createLogTable: function() {
- this.log.innerHTML =
- '<div id="logsummary"></div>' +
- '<table id="logtable">' +
- '<thead><tr><th>Status</th><th>Test</th><th>Message</th></tr></thead>' +
- '<tbody id="loglines"></tbody>' +
- '</table>';
- this.logsummary = $('logsummary')
- this.loglines = $('loglines');
- },
- _toHTML: function(txt) {
- return txt.escapeHTML().replace(/\n/g,"<br/>");
- }
-}
-
-Test.Unit.Runner = Class.create();
-Test.Unit.Runner.prototype = {
- initialize: function(testcases) {
- this.options = Object.extend({
- testLog: 'testlog'
- }, arguments[1] || {});
- this.options.resultsURL = this.parseResultsURLQueryParameter();
- if (this.options.testLog) {
- this.options.testLog = $(this.options.testLog) || null;
- }
- if(this.options.tests) {
- this.tests = [];
- for(var i = 0; i < this.options.tests.length; i++) {
- if(/^test/.test(this.options.tests[i])) {
- this.tests.push(new Test.Unit.Testcase(this.options.tests[i], testcases[this.options.tests[i]], testcases["setup"], testcases["teardown"]));
- }
- }
- } else {
- if (this.options.test) {
- this.tests = [new Test.Unit.Testcase(this.options.test, testcases[this.options.test], testcases["setup"], testcases["teardown"])];
- } else {
- this.tests = [];
- for(var testcase in testcases) {
- if(/^test/.test(testcase)) {
- this.tests.push(
- new Test.Unit.Testcase(
- this.options.context ? ' -> ' + this.options.titles[testcase] : testcase,
- testcases[testcase], testcases["setup"], testcases["teardown"]
- ));
- }
- }
- }
- }
- this.currentTest = 0;
- this.logger = new Test.Unit.Logger(this.options.testLog);
- setTimeout(this.runTests.bind(this), 1000);
- },
- parseResultsURLQueryParameter: function() {
- return window.location.search.parseQuery()["resultsURL"];
- },
- // Returns:
- // "ERROR" if there was an error,
- // "FAILURE" if there was a failure, or
- // "SUCCESS" if there was neither
- getResult: function() {
- var hasFailure = false;
- for(var i=0;i<this.tests.length;i++) {
- if (this.tests[i].errors > 0) {
- return "ERROR";
- }
- if (this.tests[i].failures > 0) {
- hasFailure = true;
- }
- }
- if (hasFailure) {
- return "FAILURE";
- } else {
- return "SUCCESS";
- }
- },
- postResults: function() {
- if (this.options.resultsURL) {
- new Ajax.Request(this.options.resultsURL,
- { method: 'get', parameters: 'result=' + this.getResult(), asynchronous: false });
- }
- },
- runTests: function() {
- var test = this.tests[this.currentTest];
- if (!test) {
- // finished!
- this.postResults();
- this.logger.summary(this.summary());
- return;
- }
- if(!test.isWaiting) {
- this.logger.start(test.name);
- }
- test.run();
- if(test.isWaiting) {
- this.logger.message("Waiting for " + test.timeToWait + "ms");
- setTimeout(this.runTests.bind(this), test.timeToWait || 1000);
- } else {
- this.logger.finish(test.status(), test.summary());
- this.currentTest++;
- // tail recursive, hopefully the browser will skip the stackframe
- this.runTests();
- }
- },
- summary: function() {
- var assertions = 0;
- var failures = 0;
- var errors = 0;
- var messages = [];
- for(var i=0;i<this.tests.length;i++) {
- assertions += this.tests[i].assertions;
- failures += this.tests[i].failures;
- errors += this.tests[i].errors;
- }
- return (
- (this.options.context ? this.options.context + ': ': '') +
- this.tests.length + " tests, " +
- assertions + " assertions, " +
- failures + " failures, " +
- errors + " errors");
- }
-}
-
-Test.Unit.Assertions = Class.create();
-Test.Unit.Assertions.prototype = {
- initialize: function() {
- this.assertions = 0;
- this.failures = 0;
- this.errors = 0;
- this.messages = [];
- },
- summary: function() {
- return (
- this.assertions + " assertions, " +
- this.failures + " failures, " +
- this.errors + " errors" + "\n" +
- this.messages.join("\n"));
- },
- pass: function() {
- this.assertions++;
- },
- fail: function(message) {
- this.failures++;
- this.messages.push("Failure: " + message);
- },
- info: function(message) {
- this.messages.push("Info: " + message);
- },
- error: function(error) {
- this.errors++;
- this.messages.push(error.name + ": "+ error.message + "(" + Test.Unit.inspect(error) +")");
- },
- status: function() {
- if (this.failures > 0) return 'failed';
- if (this.errors > 0) return 'error';
- return 'passed';
- },
- assert: function(expression) {
- var message = arguments[1] || 'assert: got "' + Test.Unit.inspect(expression) + '"';
- try { expression ? this.pass() :
- this.fail(message); }
- catch(e) { this.error(e); }
- },
- assertEqual: function(expected, actual) {
- var message = arguments[2] || "assertEqual";
- try { (expected == actual) ? this.pass() :
- this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
- '", actual "' + Test.Unit.inspect(actual) + '"'); }
- catch(e) { this.error(e); }
- },
- assertEnumEqual: function(expected, actual) {
- var message = arguments[2] || "assertEnumEqual";
- try { $A(expected).length == $A(actual).length &&
- expected.zip(actual).all(function(pair) { return pair[0] == pair[1] }) ?
- this.pass() : this.fail(message + ': expected ' + Test.Unit.inspect(expected) +
- ', actual ' + Test.Unit.inspect(actual)); }
- catch(e) { this.error(e); }
- },
- assertNotEqual: function(expected, actual) {
- var message = arguments[2] || "assertNotEqual";
- try { (expected != actual) ? this.pass() :
- this.fail(message + ': got "' + Test.Unit.inspect(actual) + '"'); }
- catch(e) { this.error(e); }
- },
- assertIdentical: function(expected, actual) {
- var message = arguments[2] || "assertIdentical";
- try { (expected === actual) ? this.pass() :
- this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
- '", actual "' + Test.Unit.inspect(actual) + '"'); }
- catch(e) { this.error(e); }
- },
- assertNotIdentical: function(expected, actual) {
- var message = arguments[2] || "assertNotIdentical";
- try { !(expected === actual) ? this.pass() :
- this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
- '", actual "' + Test.Unit.inspect(actual) + '"'); }
- catch(e) { this.error(e); }
- },
- assertNull: function(obj) {
- var message = arguments[1] || 'assertNull'
- try { (obj==null) ? this.pass() :
- this.fail(message + ': got "' + Test.Unit.inspect(obj) + '"'); }
- catch(e) { this.error(e); }
- },
- assertMatch: function(expected, actual) {
- var message = arguments[2] || 'assertMatch';
- var regex = new RegExp(expected);
- try { (regex.exec(actual)) ? this.pass() :
- this.fail(message + ' : regex: "' + Test.Unit.inspect(expected) + ' did not match: ' + Test.Unit.inspect(actual) + '"'); }
- catch(e) { this.error(e); }
- },
- assertHidden: function(element) {
- var message = arguments[1] || 'assertHidden';
- this.assertEqual("none", element.style.display, message);
- },
- assertNotNull: function(object) {
- var message = arguments[1] || 'assertNotNull';
- this.assert(object != null, message);
- },
- assertType: function(expected, actual) {
- var message = arguments[2] || 'assertType';
- try {
- (actual.constructor == expected) ? this.pass() :
- this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
- '", actual "' + (actual.constructor) + '"'); }
- catch(e) { this.error(e); }
- },
- assertNotOfType: function(expected, actual) {
- var message = arguments[2] || 'assertNotOfType';
- try {
- (actual.constructor != expected) ? this.pass() :
- this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
- '", actual "' + (actual.constructor) + '"'); }
- catch(e) { this.error(e); }
- },
- assertInstanceOf: function(expected, actual) {
- var message = arguments[2] || 'assertInstanceOf';
- try {
- (actual instanceof expected) ? this.pass() :
- this.fail(message + ": object was not an instance of the expected type"); }
- catch(e) { this.error(e); }
- },
- assertNotInstanceOf: function(expected, actual) {
- var message = arguments[2] || 'assertNotInstanceOf';
- try {
- !(actual instanceof expected) ? this.pass() :
- this.fail(message + ": object was an instance of the not expected type"); }
- catch(e) { this.error(e); }
- },
- assertRespondsTo: function(method, obj) {
- var message = arguments[2] || 'assertRespondsTo';
- try {
- (obj[method] && typeof obj[method] == 'function') ? this.pass() :
- this.fail(message + ": object doesn't respond to [" + method + "]"); }
- catch(e) { this.error(e); }
- },
- assertReturnsTrue: function(method, obj) {
- var message = arguments[2] || 'assertReturnsTrue';
- try {
- var m = obj[method];
- if(!m) m = obj['is'+method.charAt(0).toUpperCase()+method.slice(1)];
- m() ? this.pass() :
- this.fail(message + ": method returned false"); }
- catch(e) { this.error(e); }
- },
- assertReturnsFalse: function(method, obj) {
- var message = arguments[2] || 'assertReturnsFalse';
- try {
- var m = obj[method];
- if(!m) m = obj['is'+method.charAt(0).toUpperCase()+method.slice(1)];
- !m() ? this.pass() :
- this.fail(message + ": method returned true"); }
- catch(e) { this.error(e); }
- },
- assertRaise: function(exceptionName, method) {
- var message = arguments[2] || 'assertRaise';
- try {
- method();
- this.fail(message + ": exception expected but none was raised"); }
- catch(e) {
- (e.name==exceptionName) ? this.pass() : this.error(e);
- }
- },
- assertElementsMatch: function() {
- var expressions = $A(arguments), elements = $A(expressions.shift());
- if (elements.length != expressions.length) {
- this.fail('assertElementsMatch: size mismatch: ' + elements.length + ' elements, ' + expressions.length + ' expressions');
- return false;
- }
- elements.zip(expressions).all(function(pair, index) {
- var element = $(pair.first()), expression = pair.last();
- if (element.match(expression)) return true;
- this.fail('assertElementsMatch: (in index ' + index + ') expected ' + expression.inspect() + ' but got ' + element.inspect());
- }.bind(this)) && this.pass();
- },
- assertElementMatches: function(element, expression) {
- this.assertElementsMatch([element], expression);
- },
- benchmark: function(operation, iterations) {
- var startAt = new Date();
- (iterations || 1).times(operation);
- var timeTaken = ((new Date())-startAt);
- this.info((arguments[2] || 'Operation') + ' finished ' +
- iterations + ' iterations in ' + (timeTaken/1000)+'s' );
- return timeTaken;
- },
- _isVisible: function(element) {
- element = $(element);
- if(!element.parentNode) return true;
- this.assertNotNull(element);
- if(element.style && Element.getStyle(element, 'display') == 'none')
- return false;
-
- return this._isVisible(element.parentNode);
- },
- assertNotVisible: function(element) {
- this.assert(!this._isVisible(element), Test.Unit.inspect(element) + " was not hidden and didn't have a hidden parent either. " + ("" || arguments[1]));
- },
- assertVisible: function(element) {
- this.assert(this._isVisible(element), Test.Unit.inspect(element) + " was not visible. " + ("" || arguments[1]));
- },
- benchmark: function(operation, iterations) {
- var startAt = new Date();
- (iterations || 1).times(operation);
- var timeTaken = ((new Date())-startAt);
- this.info((arguments[2] || 'Operation') + ' finished ' +
- iterations + ' iterations in ' + (timeTaken/1000)+'s' );
- return timeTaken;
- }
-}
-
-Test.Unit.Testcase = Class.create();
-Object.extend(Object.extend(Test.Unit.Testcase.prototype, Test.Unit.Assertions.prototype), {
- initialize: function(name, test, setup, teardown) {
- Test.Unit.Assertions.prototype.initialize.bind(this)();
- this.name = name;
-
- if(typeof test == 'string') {
- test = test.gsub(/(\.should[^\(]+\()/,'#{0}this,');
- test = test.gsub(/(\.should[^\(]+)\(this,\)/,'#{1}(this)');
- this.test = function() {
- eval('with(this){'+test+'}');
- }
- } else {
- this.test = test || function() {};
- }
-
- this.setup = setup || function() {};
- this.teardown = teardown || function() {};
- this.isWaiting = false;
- this.timeToWait = 1000;
- },
- wait: function(time, nextPart) {
- this.isWaiting = true;
- this.test = nextPart;
- this.timeToWait = time;
- },
- run: function() {
- try {
- try {
- if (!this.isWaiting) this.setup.bind(this)();
- this.isWaiting = false;
- this.test.bind(this)();
- } finally {
- if(!this.isWaiting) {
- this.teardown.bind(this)();
- }
- }
- }
- catch(e) { this.error(e); }
- }
-});
-
-// *EXPERIMENTAL* BDD-style testing to please non-technical folk
-// This draws many ideas from RSpec http://rspec.rubyforge.org/
-
-Test.setupBDDExtensionMethods = function(){
- var METHODMAP = {
- shouldEqual: 'assertEqual',
- shouldNotEqual: 'assertNotEqual',
- shouldEqualEnum: 'assertEnumEqual',
- shouldBeA: 'assertType',
- shouldNotBeA: 'assertNotOfType',
- shouldBeAn: 'assertType',
- shouldNotBeAn: 'assertNotOfType',
- shouldBeNull: 'assertNull',
- shouldNotBeNull: 'assertNotNull',
-
- shouldBe: 'assertReturnsTrue',
- shouldNotBe: 'assertReturnsFalse',
- shouldRespondTo: 'assertRespondsTo'
- };
- Test.BDDMethods = {};
- for(m in METHODMAP) {
- Test.BDDMethods[m] = eval(
- 'function(){'+
- 'var args = $A(arguments);'+
- 'var scope = args.shift();'+
- 'scope.'+METHODMAP[m]+'.apply(scope,(args || []).concat([this])); }');
- }
- [Array.prototype, String.prototype, Number.prototype].each(
- function(p){ Object.extend(p, Test.BDDMethods) }
- );
-}
-
-Test.context = function(name, spec, log){
- Test.setupBDDExtensionMethods();
-
- var compiledSpec = {};
- var titles = {};
- for(specName in spec) {
- switch(specName){
- case "setup":
- case "teardown":
- compiledSpec[specName] = spec[specName];
- break;
- default:
- var testName = 'test'+specName.gsub(/\s+/,'-').camelize();
- var body = spec[specName].toString().split('\n').slice(1);
- if(/^\{/.test(body[0])) body = body.slice(1);
- body.pop();
- body = body.map(function(statement){
- return statement.strip()
- });
- compiledSpec[testName] = body.join('\n');
- titles[testName] = specName;
- }
- }
- new Test.Unit.Runner(compiledSpec, { titles: titles, testLog: log || 'testlog', context: name });
+// script.aculo.us unittest.js v1.6.4, Wed Sep 06 11:30:58 CEST 2006\r
+\r
+// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)\r
+// (c) 2005 Jon Tirsen (http://www.tirsen.com)\r
+// (c) 2005 Michael Schuerig (http://www.schuerig.de/michael/)\r
+//\r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+// \r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+\r
+// experimental, Firefox-only\r
+Event.simulateMouse = function(element, eventName) {\r
+ var options = Object.extend({\r
+ pointerX: 0,\r
+ pointerY: 0,\r
+ buttons: 0\r
+ }, arguments[2] || {});\r
+ var oEvent = document.createEvent("MouseEvents");\r
+ oEvent.initMouseEvent(eventName, true, true, document.defaultView, \r
+ options.buttons, options.pointerX, options.pointerY, options.pointerX, options.pointerY, \r
+ false, false, false, false, 0, $(element));\r
+ \r
+ if(this.mark) Element.remove(this.mark);\r
+ this.mark = document.createElement('div');\r
+ this.mark.appendChild(document.createTextNode(" "));\r
+ document.body.appendChild(this.mark);\r
+ this.mark.style.position = 'absolute';\r
+ this.mark.style.top = options.pointerY + "px";\r
+ this.mark.style.left = options.pointerX + "px";\r
+ this.mark.style.width = "5px";\r
+ this.mark.style.height = "5px;";\r
+ this.mark.style.borderTop = "1px solid red;"\r
+ this.mark.style.borderLeft = "1px solid red;"\r
+ \r
+ if(this.step)\r
+ alert('['+new Date().getTime().toString()+'] '+eventName+'/'+Test.Unit.inspect(options));\r
+ \r
+ $(element).dispatchEvent(oEvent);\r
+};\r
+\r
+// Note: Due to a fix in Firefox 1.0.5/6 that probably fixed "too much", this doesn't work in 1.0.6 or DP2.\r
+// You need to downgrade to 1.0.4 for now to get this working\r
+// See https://bugzilla.mozilla.org/show_bug.cgi?id=289940 for the fix that fixed too much\r
+Event.simulateKey = function(element, eventName) {\r
+ var options = Object.extend({\r
+ ctrlKey: false,\r
+ altKey: false,\r
+ shiftKey: false,\r
+ metaKey: false,\r
+ keyCode: 0,\r
+ charCode: 0\r
+ }, arguments[2] || {});\r
+\r
+ var oEvent = document.createEvent("KeyEvents");\r
+ oEvent.initKeyEvent(eventName, true, true, window, \r
+ options.ctrlKey, options.altKey, options.shiftKey, options.metaKey,\r
+ options.keyCode, options.charCode );\r
+ $(element).dispatchEvent(oEvent);\r
+};\r
+\r
+Event.simulateKeys = function(element, command) {\r
+ for(var i=0; i<command.length; i++) {\r
+ Event.simulateKey(element,'keypress',{charCode:command.charCodeAt(i)});\r
+ }\r
+};\r
+\r
+var Test = {}\r
+Test.Unit = {};\r
+\r
+// security exception workaround\r
+Test.Unit.inspect = Object.inspect;\r
+\r
+Test.Unit.Logger = Class.create();\r
+Test.Unit.Logger.prototype = {\r
+ initialize: function(log) {\r
+ this.log = $(log);\r
+ if (this.log) {\r
+ this._createLogTable();\r
+ }\r
+ },\r
+ start: function(testName) {\r
+ if (!this.log) return;\r
+ this.testName = testName;\r
+ this.lastLogLine = document.createElement('tr');\r
+ this.statusCell = document.createElement('td');\r
+ this.nameCell = document.createElement('td');\r
+ this.nameCell.appendChild(document.createTextNode(testName));\r
+ this.messageCell = document.createElement('td');\r
+ this.lastLogLine.appendChild(this.statusCell);\r
+ this.lastLogLine.appendChild(this.nameCell);\r
+ this.lastLogLine.appendChild(this.messageCell);\r
+ this.loglines.appendChild(this.lastLogLine);\r
+ },\r
+ finish: function(status, summary) {\r
+ if (!this.log) return;\r
+ this.lastLogLine.className = status;\r
+ this.statusCell.innerHTML = status;\r
+ this.messageCell.innerHTML = this._toHTML(summary);\r
+ },\r
+ message: function(message) {\r
+ if (!this.log) return;\r
+ this.messageCell.innerHTML = this._toHTML(message);\r
+ },\r
+ summary: function(summary) {\r
+ if (!this.log) return;\r
+ this.logsummary.innerHTML = this._toHTML(summary);\r
+ },\r
+ _createLogTable: function() {\r
+ this.log.innerHTML =\r
+ '<div id="logsummary"></div>' +\r
+ '<table id="logtable">' +\r
+ '<thead><tr><th>Status</th><th>Test</th><th>Message</th></tr></thead>' +\r
+ '<tbody id="loglines"></tbody>' +\r
+ '</table>';\r
+ this.logsummary = $('logsummary')\r
+ this.loglines = $('loglines');\r
+ },\r
+ _toHTML: function(txt) {\r
+ return txt.escapeHTML().replace(/\n/g,"<br/>");\r
+ }\r
+}\r
+\r
+Test.Unit.Runner = Class.create();\r
+Test.Unit.Runner.prototype = {\r
+ initialize: function(testcases) {\r
+ this.options = Object.extend({\r
+ testLog: 'testlog'\r
+ }, arguments[1] || {});\r
+ this.options.resultsURL = this.parseResultsURLQueryParameter();\r
+ if (this.options.testLog) {\r
+ this.options.testLog = $(this.options.testLog) || null;\r
+ }\r
+ if(this.options.tests) {\r
+ this.tests = [];\r
+ for(var i = 0; i < this.options.tests.length; i++) {\r
+ if(/^test/.test(this.options.tests[i])) {\r
+ this.tests.push(new Test.Unit.Testcase(this.options.tests[i], testcases[this.options.tests[i]], testcases["setup"], testcases["teardown"]));\r
+ }\r
+ }\r
+ } else {\r
+ if (this.options.test) {\r
+ this.tests = [new Test.Unit.Testcase(this.options.test, testcases[this.options.test], testcases["setup"], testcases["teardown"])];\r
+ } else {\r
+ this.tests = [];\r
+ for(var testcase in testcases) {\r
+ if(/^test/.test(testcase)) {\r
+ this.tests.push(\r
+ new Test.Unit.Testcase(\r
+ this.options.context ? ' -> ' + this.options.titles[testcase] : testcase, \r
+ testcases[testcase], testcases["setup"], testcases["teardown"]\r
+ ));\r
+ }\r
+ }\r
+ }\r
+ }\r
+ this.currentTest = 0;\r
+ this.logger = new Test.Unit.Logger(this.options.testLog);\r
+ setTimeout(this.runTests.bind(this), 1000);\r
+ },\r
+ parseResultsURLQueryParameter: function() {\r
+ return window.location.search.parseQuery()["resultsURL"];\r
+ },\r
+ // Returns:\r
+ // "ERROR" if there was an error,\r
+ // "FAILURE" if there was a failure, or\r
+ // "SUCCESS" if there was neither\r
+ getResult: function() {\r
+ var hasFailure = false;\r
+ for(var i=0;i<this.tests.length;i++) {\r
+ if (this.tests[i].errors > 0) {\r
+ return "ERROR";\r
+ }\r
+ if (this.tests[i].failures > 0) {\r
+ hasFailure = true;\r
+ }\r
+ }\r
+ if (hasFailure) {\r
+ return "FAILURE";\r
+ } else {\r
+ return "SUCCESS";\r
+ }\r
+ },\r
+ postResults: function() {\r
+ if (this.options.resultsURL) {\r
+ new Ajax.Request(this.options.resultsURL, \r
+ { method: 'get', parameters: 'result=' + this.getResult(), asynchronous: false });\r
+ }\r
+ },\r
+ runTests: function() {\r
+ var test = this.tests[this.currentTest];\r
+ if (!test) {\r
+ // finished!\r
+ this.postResults();\r
+ this.logger.summary(this.summary());\r
+ return;\r
+ }\r
+ if(!test.isWaiting) {\r
+ this.logger.start(test.name);\r
+ }\r
+ test.run();\r
+ if(test.isWaiting) {\r
+ this.logger.message("Waiting for " + test.timeToWait + "ms");\r
+ setTimeout(this.runTests.bind(this), test.timeToWait || 1000);\r
+ } else {\r
+ this.logger.finish(test.status(), test.summary());\r
+ this.currentTest++;\r
+ // tail recursive, hopefully the browser will skip the stackframe\r
+ this.runTests();\r
+ }\r
+ },\r
+ summary: function() {\r
+ var assertions = 0;\r
+ var failures = 0;\r
+ var errors = 0;\r
+ var messages = [];\r
+ for(var i=0;i<this.tests.length;i++) {\r
+ assertions += this.tests[i].assertions;\r
+ failures += this.tests[i].failures;\r
+ errors += this.tests[i].errors;\r
+ }\r
+ return (\r
+ (this.options.context ? this.options.context + ': ': '') + \r
+ this.tests.length + " tests, " + \r
+ assertions + " assertions, " + \r
+ failures + " failures, " +\r
+ errors + " errors");\r
+ }\r
+}\r
+\r
+Test.Unit.Assertions = Class.create();\r
+Test.Unit.Assertions.prototype = {\r
+ initialize: function() {\r
+ this.assertions = 0;\r
+ this.failures = 0;\r
+ this.errors = 0;\r
+ this.messages = [];\r
+ },\r
+ summary: function() {\r
+ return (\r
+ this.assertions + " assertions, " + \r
+ this.failures + " failures, " +\r
+ this.errors + " errors" + "\n" +\r
+ this.messages.join("\n"));\r
+ },\r
+ pass: function() {\r
+ this.assertions++;\r
+ },\r
+ fail: function(message) {\r
+ this.failures++;\r
+ this.messages.push("Failure: " + message);\r
+ },\r
+ info: function(message) {\r
+ this.messages.push("Info: " + message);\r
+ },\r
+ error: function(error) {\r
+ this.errors++;\r
+ this.messages.push(error.name + ": "+ error.message + "(" + Test.Unit.inspect(error) +")");\r
+ },\r
+ status: function() {\r
+ if (this.failures > 0) return 'failed';\r
+ if (this.errors > 0) return 'error';\r
+ return 'passed';\r
+ },\r
+ assert: function(expression) {\r
+ var message = arguments[1] || 'assert: got "' + Test.Unit.inspect(expression) + '"';\r
+ try { expression ? this.pass() : \r
+ this.fail(message); }\r
+ catch(e) { this.error(e); }\r
+ },\r
+ assertEqual: function(expected, actual) {\r
+ var message = arguments[2] || "assertEqual";\r
+ try { (expected == actual) ? this.pass() :\r
+ this.fail(message + ': expected "' + Test.Unit.inspect(expected) + \r
+ '", actual "' + Test.Unit.inspect(actual) + '"'); }\r
+ catch(e) { this.error(e); }\r
+ },\r
+ assertEnumEqual: function(expected, actual) {\r
+ var message = arguments[2] || "assertEnumEqual";\r
+ try { $A(expected).length == $A(actual).length && \r
+ expected.zip(actual).all(function(pair) { return pair[0] == pair[1] }) ?\r
+ this.pass() : this.fail(message + ': expected ' + Test.Unit.inspect(expected) + \r
+ ', actual ' + Test.Unit.inspect(actual)); }\r
+ catch(e) { this.error(e); }\r
+ },\r
+ assertNotEqual: function(expected, actual) {\r
+ var message = arguments[2] || "assertNotEqual";\r
+ try { (expected != actual) ? this.pass() : \r
+ this.fail(message + ': got "' + Test.Unit.inspect(actual) + '"'); }\r
+ catch(e) { this.error(e); }\r
+ },\r
+ assertIdentical: function(expected, actual) { \r
+ var message = arguments[2] || "assertIdentical"; \r
+ try { (expected === actual) ? this.pass() : \r
+ this.fail(message + ': expected "' + Test.Unit.inspect(expected) + \r
+ '", actual "' + Test.Unit.inspect(actual) + '"'); } \r
+ catch(e) { this.error(e); } \r
+ },\r
+ assertNotIdentical: function(expected, actual) { \r
+ var message = arguments[2] || "assertNotIdentical"; \r
+ try { !(expected === actual) ? this.pass() : \r
+ this.fail(message + ': expected "' + Test.Unit.inspect(expected) + \r
+ '", actual "' + Test.Unit.inspect(actual) + '"'); } \r
+ catch(e) { this.error(e); } \r
+ },\r
+ assertNull: function(obj) {\r
+ var message = arguments[1] || 'assertNull'\r
+ try { (obj==null) ? this.pass() : \r
+ this.fail(message + ': got "' + Test.Unit.inspect(obj) + '"'); }\r
+ catch(e) { this.error(e); }\r
+ },\r
+ assertMatch: function(expected, actual) {\r
+ var message = arguments[2] || 'assertMatch';\r
+ var regex = new RegExp(expected);\r
+ try { (regex.exec(actual)) ? this.pass() :\r
+ this.fail(message + ' : regex: "' + Test.Unit.inspect(expected) + ' did not match: ' + Test.Unit.inspect(actual) + '"'); }\r
+ catch(e) { this.error(e); }\r
+ },\r
+ assertHidden: function(element) {\r
+ var message = arguments[1] || 'assertHidden';\r
+ this.assertEqual("none", element.style.display, message);\r
+ },\r
+ assertNotNull: function(object) {\r
+ var message = arguments[1] || 'assertNotNull';\r
+ this.assert(object != null, message);\r
+ },\r
+ assertType: function(expected, actual) {\r
+ var message = arguments[2] || 'assertType';\r
+ try { \r
+ (actual.constructor == expected) ? this.pass() : \r
+ this.fail(message + ': expected "' + Test.Unit.inspect(expected) + \r
+ '", actual "' + (actual.constructor) + '"'); }\r
+ catch(e) { this.error(e); }\r
+ },\r
+ assertNotOfType: function(expected, actual) {\r
+ var message = arguments[2] || 'assertNotOfType';\r
+ try { \r
+ (actual.constructor != expected) ? this.pass() : \r
+ this.fail(message + ': expected "' + Test.Unit.inspect(expected) + \r
+ '", actual "' + (actual.constructor) + '"'); }\r
+ catch(e) { this.error(e); }\r
+ },\r
+ assertInstanceOf: function(expected, actual) {\r
+ var message = arguments[2] || 'assertInstanceOf';\r
+ try { \r
+ (actual instanceof expected) ? this.pass() : \r
+ this.fail(message + ": object was not an instance of the expected type"); }\r
+ catch(e) { this.error(e); } \r
+ },\r
+ assertNotInstanceOf: function(expected, actual) {\r
+ var message = arguments[2] || 'assertNotInstanceOf';\r
+ try { \r
+ !(actual instanceof expected) ? this.pass() : \r
+ this.fail(message + ": object was an instance of the not expected type"); }\r
+ catch(e) { this.error(e); } \r
+ },\r
+ assertRespondsTo: function(method, obj) {\r
+ var message = arguments[2] || 'assertRespondsTo';\r
+ try {\r
+ (obj[method] && typeof obj[method] == 'function') ? this.pass() : \r
+ this.fail(message + ": object doesn't respond to [" + method + "]"); }\r
+ catch(e) { this.error(e); }\r
+ },\r
+ assertReturnsTrue: function(method, obj) {\r
+ var message = arguments[2] || 'assertReturnsTrue';\r
+ try {\r
+ var m = obj[method];\r
+ if(!m) m = obj['is'+method.charAt(0).toUpperCase()+method.slice(1)];\r
+ m() ? this.pass() : \r
+ this.fail(message + ": method returned false"); }\r
+ catch(e) { this.error(e); }\r
+ },\r
+ assertReturnsFalse: function(method, obj) {\r
+ var message = arguments[2] || 'assertReturnsFalse';\r
+ try {\r
+ var m = obj[method];\r
+ if(!m) m = obj['is'+method.charAt(0).toUpperCase()+method.slice(1)];\r
+ !m() ? this.pass() : \r
+ this.fail(message + ": method returned true"); }\r
+ catch(e) { this.error(e); }\r
+ },\r
+ assertRaise: function(exceptionName, method) {\r
+ var message = arguments[2] || 'assertRaise';\r
+ try { \r
+ method();\r
+ this.fail(message + ": exception expected but none was raised"); }\r
+ catch(e) {\r
+ (e.name==exceptionName) ? this.pass() : this.error(e); \r
+ }\r
+ },\r
+ assertElementsMatch: function() {\r
+ var expressions = $A(arguments), elements = $A(expressions.shift());\r
+ if (elements.length != expressions.length) {\r
+ this.fail('assertElementsMatch: size mismatch: ' + elements.length + ' elements, ' + expressions.length + ' expressions');\r
+ return false;\r
+ }\r
+ elements.zip(expressions).all(function(pair, index) {\r
+ var element = $(pair.first()), expression = pair.last();\r
+ if (element.match(expression)) return true;\r
+ this.fail('assertElementsMatch: (in index ' + index + ') expected ' + expression.inspect() + ' but got ' + element.inspect());\r
+ }.bind(this)) && this.pass();\r
+ },\r
+ assertElementMatches: function(element, expression) {\r
+ this.assertElementsMatch([element], expression);\r
+ },\r
+ benchmark: function(operation, iterations) {\r
+ var startAt = new Date();\r
+ (iterations || 1).times(operation);\r
+ var timeTaken = ((new Date())-startAt);\r
+ this.info((arguments[2] || 'Operation') + ' finished ' + \r
+ iterations + ' iterations in ' + (timeTaken/1000)+'s' );\r
+ return timeTaken;\r
+ },\r
+ _isVisible: function(element) {\r
+ element = $(element);\r
+ if(!element.parentNode) return true;\r
+ this.assertNotNull(element);\r
+ if(element.style && Element.getStyle(element, 'display') == 'none')\r
+ return false;\r
+ \r
+ return this._isVisible(element.parentNode);\r
+ },\r
+ assertNotVisible: function(element) {\r
+ this.assert(!this._isVisible(element), Test.Unit.inspect(element) + " was not hidden and didn't have a hidden parent either. " + ("" || arguments[1]));\r
+ },\r
+ assertVisible: function(element) {\r
+ this.assert(this._isVisible(element), Test.Unit.inspect(element) + " was not visible. " + ("" || arguments[1]));\r
+ },\r
+ benchmark: function(operation, iterations) {\r
+ var startAt = new Date();\r
+ (iterations || 1).times(operation);\r
+ var timeTaken = ((new Date())-startAt);\r
+ this.info((arguments[2] || 'Operation') + ' finished ' + \r
+ iterations + ' iterations in ' + (timeTaken/1000)+'s' );\r
+ return timeTaken;\r
+ }\r
+}\r
+\r
+Test.Unit.Testcase = Class.create();\r
+Object.extend(Object.extend(Test.Unit.Testcase.prototype, Test.Unit.Assertions.prototype), {\r
+ initialize: function(name, test, setup, teardown) {\r
+ Test.Unit.Assertions.prototype.initialize.bind(this)();\r
+ this.name = name;\r
+ \r
+ if(typeof test == 'string') {\r
+ test = test.gsub(/(\.should[^\(]+\()/,'#{0}this,');\r
+ test = test.gsub(/(\.should[^\(]+)\(this,\)/,'#{1}(this)');\r
+ this.test = function() {\r
+ eval('with(this){'+test+'}');\r
+ }\r
+ } else {\r
+ this.test = test || function() {};\r
+ }\r
+ \r
+ this.setup = setup || function() {};\r
+ this.teardown = teardown || function() {};\r
+ this.isWaiting = false;\r
+ this.timeToWait = 1000;\r
+ },\r
+ wait: function(time, nextPart) {\r
+ this.isWaiting = true;\r
+ this.test = nextPart;\r
+ this.timeToWait = time;\r
+ },\r
+ run: function() {\r
+ try {\r
+ try {\r
+ if (!this.isWaiting) this.setup.bind(this)();\r
+ this.isWaiting = false;\r
+ this.test.bind(this)();\r
+ } finally {\r
+ if(!this.isWaiting) {\r
+ this.teardown.bind(this)();\r
+ }\r
+ }\r
+ }\r
+ catch(e) { this.error(e); }\r
+ }\r
+});\r
+\r
+// *EXPERIMENTAL* BDD-style testing to please non-technical folk\r
+// This draws many ideas from RSpec http://rspec.rubyforge.org/\r
+\r
+Test.setupBDDExtensionMethods = function(){\r
+ var METHODMAP = {\r
+ shouldEqual: 'assertEqual',\r
+ shouldNotEqual: 'assertNotEqual',\r
+ shouldEqualEnum: 'assertEnumEqual',\r
+ shouldBeA: 'assertType',\r
+ shouldNotBeA: 'assertNotOfType',\r
+ shouldBeAn: 'assertType',\r
+ shouldNotBeAn: 'assertNotOfType',\r
+ shouldBeNull: 'assertNull',\r
+ shouldNotBeNull: 'assertNotNull',\r
+ \r
+ shouldBe: 'assertReturnsTrue',\r
+ shouldNotBe: 'assertReturnsFalse',\r
+ shouldRespondTo: 'assertRespondsTo'\r
+ };\r
+ Test.BDDMethods = {};\r
+ for(m in METHODMAP) {\r
+ Test.BDDMethods[m] = eval(\r
+ 'function(){'+\r
+ 'var args = $A(arguments);'+\r
+ 'var scope = args.shift();'+\r
+ 'scope.'+METHODMAP[m]+'.apply(scope,(args || []).concat([this])); }');\r
+ }\r
+ [Array.prototype, String.prototype, Number.prototype].each(\r
+ function(p){ Object.extend(p, Test.BDDMethods) }\r
+ );\r
+}\r
+\r
+Test.context = function(name, spec, log){\r
+ Test.setupBDDExtensionMethods();\r
+ \r
+ var compiledSpec = {};\r
+ var titles = {};\r
+ for(specName in spec) {\r
+ switch(specName){\r
+ case "setup":\r
+ case "teardown":\r
+ compiledSpec[specName] = spec[specName];\r
+ break;\r
+ default:\r
+ var testName = 'test'+specName.gsub(/\s+/,'-').camelize();\r
+ var body = spec[specName].toString().split('\n').slice(1);\r
+ if(/^\{/.test(body[0])) body = body.slice(1);\r
+ body.pop();\r
+ body = body.map(function(statement){ \r
+ return statement.strip()\r
+ });\r
+ compiledSpec[testName] = body.join('\n');\r
+ titles[testName] = specName;\r
+ }\r
+ }\r
+ new Test.Unit.Runner(compiledSpec, { titles: titles, testLog: log || 'testlog', context: name });\r
};
\ No newline at end of file
-.accordion{
- border-bottom: 1px solid #999999;
-}
-.accordion_panel{
- border-left: 1px solid #999999;
- border-right: 1px solid #999999;
- overflow: auto;
- visibility: visible;
-}
-
-.accordion_tab {
- position: relative;
- height: 26px;
- cursor: pointer;
-}
-
-.accordion_tab div{
- height: 26px;
-}
-
-.accordion_tabLeftInactive {
- background: url('../../images/spinelz/accordion_tab_left_inactive.gif') no-repeat;
- position: absolute;
- left: 0;
- width: 10px;
-}
-
-.accordion_tabLeftActive {
- background: url('../../images/spinelz/accordion_tab_left_active.gif') no-repeat;
- position: absolute;
- left: 0;
- width: 10px;
-}
-
-.accordion_tabMiddleInactive {
- background: url('../../images/spinelz/accordion_tab_middle_inactive.gif') repeat-x;
- margin: 0 10px;
-}
-
-.accordion_tabMiddleActive {
- background: url('../../images/spinelz/accordion_tab_middle_active.gif') repeat-x;
- margin: 0 10px;
-}
-
-.accordion_tabRightInactive {
- background: url('../../images/spinelz/accordion_tab_right_inactive.gif') no-repeat;
- position: absolute;
- top: 0;
- right: 0;
- width: 10px;
-}
-
-.accordion_tabRightActive {
- background: url('../../images/spinelz/accordion_tab_right_active.gif') no-repeat;
- position: absolute;
- top: 0;
- right: 0;
- width: 10px;
-}
+.accordion{\r
+ border-bottom: 1px solid #999999;\r
+}\r
+.accordion_panel{\r
+ border-left: 1px solid #999999;\r
+ border-right: 1px solid #999999;\r
+ overflow: auto;\r
+ visibility: visible;\r
+}\r
+\r
+.accordion_tab {\r
+ position: relative;\r
+ height: 26px;\r
+ cursor: pointer;\r
+} \r
+\r
+.accordion_tab div{\r
+ height: 26px;\r
+}\r
+\r
+.accordion_tabLeftInactive {\r
+ background: url('../../images/spinelz/accordion_tab_left_inactive.gif') no-repeat;\r
+ position: absolute;\r
+ left: 0;\r
+ width: 10px;\r
+}\r
+\r
+.accordion_tabLeftActive {\r
+ background: url('../../images/spinelz/accordion_tab_left_active.gif') no-repeat;\r
+ position: absolute;\r
+ left: 0;\r
+ width: 10px;\r
+}\r
+\r
+.accordion_tabMiddleInactive {\r
+ background: url('../../images/spinelz/accordion_tab_middle_inactive.gif') repeat-x;\r
+ margin: 0 10px;\r
+}\r
+\r
+.accordion_tabMiddleActive {\r
+ background: url('../../images/spinelz/accordion_tab_middle_active.gif') repeat-x;\r
+ margin: 0 10px;\r
+}\r
+\r
+.accordion_tabRightInactive {\r
+ background: url('../../images/spinelz/accordion_tab_right_inactive.gif') no-repeat;\r
+ position: absolute;\r
+ top: 0;\r
+ right: 0;\r
+ width: 10px;\r
+}\r
+\r
+.accordion_tabRightActive {\r
+ background: url('../../images/spinelz/accordion_tab_right_active.gif') no-repeat;\r
+ position: absolute;\r
+ top: 0;\r
+ right: 0;\r
+ width: 10px;\r
+}\r
-div.balloon_tooltip {
- position: absolute;
-}
-
-/* ---- Top ---- */
-div.balloon_top {
- width: 100%;
- height: 30px;
- position: relative;
-}
-
-div.balloon_top_left {
- position: absolute;
- top: 0;
- left: 0;
- width: 70px;
- height: 30px;
- background-image: url(../../images/spinelz/balloon_top_left.gif);
- background-repeat: no-repeat;
-}
-
-div.balloon_top_middle {
- height: 30px;
- background-image: url(../../images/spinelz/balloon_top_middle.gif);
- background-repeat: repeat-x;
- margin: 0 70px;
-}
-
-div.balloon_top_right {
- width: 70px;
- height: 30px;
- background-image: url(../../images/spinelz/balloon_top_right.gif);
- background-repeat: no-repeat;
- position: absolute;
- top: 0;
- right: 0;
-}
-
-/* ---- Middle ---- */
-div.balloon_middle {
- width: 100%;
- position: relative;
-}
-
-div.balloon_middle_left {
- position: absolute;
- top: 0;
- left: 0;
- width: 70px;
-}
-
-div.balloon_middle_left_row {
- width: 70px;
- height: 20px;
- background-image: url(../../images/spinelz/balloon_middle_left.gif);
- background-repeat: repeat-y;
-}
-
-div.balloon_middle_right {
- position: absolute;
- top: 0;
- right: 0;
- width: 70px;
-}
-
-div.balloon_middle_right_row {
- width: 70px;
- height: 20px;
- background-image: url(../../images/spinelz/balloon_middle_right.gif);
- background-repeat: repeat-y;
-}
-
-div.balloon_left_arrow {
- width: 70px;
- height: 60px;
-}
-
-div.balloon_left_up_arrow {
- width: 70px;
- height: 60px;
- background-image: url(../../images/spinelz/balloon_left_up_arrow.gif);
- background-repeat: no-repeat;
-}
-
-div.balloon_left_down_arrow {
- width: 70px;
- height: 60px;
- background-image: url(../../images/spinelz/balloon_left_down_arrow.gif);
- background-repeat: no-repeat;
-}
-
-div.balloon_right_arrow {
- width: 70px;
- height: 60px;
-}
-
-div.balloon_right_up_arrow {
- width: 70px;
- height: 60px;
- background-image: url(../../images/spinelz/balloon_right_up_arrow.gif);
- background-repeat: no-repeat;
-}
-
-div.balloon_right_down_arrow {
- width: 70px;
- height: 60px;
- background-image: url(../../images/spinelz/balloon_right_down_arrow.gif);
- background-repeat: no-repeat;
-}
-
-div.balloon_body {
- margin: 0 70px;
- background-image: url(../../images/spinelz/balloon_back.gif);
- background-repeat: no-repeat;
- background-color: #f8ffee;
- overflow: hidden;
-}
-
-/* ---- Bottom ---- */
-div.balloon_bottom {
- width: 100%;
- height: 30px;
- position: relative;
-}
-
-div.balloon_bottom_left {
- position: absolute;
- top: 0;
- left: 0;
- width: 70px;
- height: 30px;
- background-image: url(../../images/spinelz/balloon_bottom_left.gif);
- background-repeat: no-repeat;
-}
-
-div.balloon_bottom_middle {
- height: 30px;
- background-image: url(../../images/spinelz/balloon_bottom_middle.gif);
- background-repeat: repeat-x;
- margin: 0 70px;
-}
-
-div.balloon_bottom_right {
- width: 70px;
- height: 30px;
- background-image: url(../../images/spinelz/balloon_bottom_right.gif);
- background-repeat: no-repeat;
- position: absolute;
- top: 0;
- right: 0;
-}
+div.balloon_tooltip {\r
+ position: absolute;\r
+}\r
+\r
+/* ---- Top ---- */\r
+div.balloon_top {\r
+ width: 100%;\r
+ height: 30px;\r
+ position: relative;\r
+}\r
+\r
+div.balloon_top_left {\r
+ position: absolute;\r
+ top: 0;\r
+ left: 0;\r
+ width: 70px;\r
+ height: 30px;\r
+ background-image: url(../../images/spinelz/balloon_top_left.gif);\r
+ background-repeat: no-repeat;\r
+}\r
+\r
+div.balloon_top_middle {\r
+ height: 30px;\r
+ background-image: url(../../images/spinelz/balloon_top_middle.gif);\r
+ background-repeat: repeat-x;\r
+ margin: 0 70px;\r
+}\r
+\r
+div.balloon_top_right {\r
+ width: 70px;\r
+ height: 30px;\r
+ background-image: url(../../images/spinelz/balloon_top_right.gif);\r
+ background-repeat: no-repeat;\r
+ position: absolute;\r
+ top: 0;\r
+ right: 0;\r
+}\r
+\r
+/* ---- Middle ---- */\r
+div.balloon_middle {\r
+ width: 100%;\r
+ position: relative;\r
+}\r
+\r
+div.balloon_middle_left {\r
+ position: absolute;\r
+ top: 0;\r
+ left: 0;\r
+ width: 70px;\r
+}\r
+\r
+div.balloon_middle_left_row {\r
+ width: 70px;\r
+ height: 20px;\r
+ background-image: url(../../images/spinelz/balloon_middle_left.gif);\r
+ background-repeat: repeat-y;\r
+}\r
+\r
+div.balloon_middle_right {\r
+ position: absolute;\r
+ top: 0;\r
+ right: 0;\r
+ width: 70px;\r
+}\r
+\r
+div.balloon_middle_right_row {\r
+ width: 70px;\r
+ height: 20px;\r
+ background-image: url(../../images/spinelz/balloon_middle_right.gif);\r
+ background-repeat: repeat-y;\r
+}\r
+\r
+div.balloon_left_arrow {\r
+ width: 70px;\r
+ height: 60px;\r
+}\r
+\r
+div.balloon_left_up_arrow {\r
+ width: 70px;\r
+ height: 60px;\r
+ background-image: url(../../images/spinelz/balloon_left_up_arrow.gif);\r
+ background-repeat: no-repeat;\r
+}\r
+\r
+div.balloon_left_down_arrow {\r
+ width: 70px;\r
+ height: 60px;\r
+ background-image: url(../../images/spinelz/balloon_left_down_arrow.gif);\r
+ background-repeat: no-repeat;\r
+}\r
+\r
+div.balloon_right_arrow {\r
+ width: 70px;\r
+ height: 60px;\r
+}\r
+\r
+div.balloon_right_up_arrow {\r
+ width: 70px;\r
+ height: 60px;\r
+ background-image: url(../../images/spinelz/balloon_right_up_arrow.gif);\r
+ background-repeat: no-repeat;\r
+}\r
+\r
+div.balloon_right_down_arrow {\r
+ width: 70px;\r
+ height: 60px;\r
+ background-image: url(../../images/spinelz/balloon_right_down_arrow.gif);\r
+ background-repeat: no-repeat;\r
+}\r
+\r
+div.balloon_body {\r
+ margin: 0 70px;\r
+ background-image: url(../../images/spinelz/balloon_back.gif);\r
+ background-repeat: no-repeat;\r
+ background-color: #f8ffee;\r
+ overflow: hidden;\r
+}\r
+\r
+/* ---- Bottom ---- */\r
+div.balloon_bottom {\r
+ width: 100%;\r
+ height: 30px;\r
+ position: relative;\r
+}\r
+\r
+div.balloon_bottom_left {\r
+ position: absolute;\r
+ top: 0;\r
+ left: 0;\r
+ width: 70px;\r
+ height: 30px;\r
+ background-image: url(../../images/spinelz/balloon_bottom_left.gif);\r
+ background-repeat: no-repeat;\r
+}\r
+\r
+div.balloon_bottom_middle {\r
+ height: 30px;\r
+ background-image: url(../../images/spinelz/balloon_bottom_middle.gif);\r
+ background-repeat: repeat-x;\r
+ margin: 0 70px;\r
+}\r
+\r
+div.balloon_bottom_right {\r
+ width: 70px;\r
+ height: 30px;\r
+ background-image: url(../../images/spinelz/balloon_bottom_right.gif);\r
+ background-repeat: no-repeat;\r
+ position: absolute;\r
+ top: 0;\r
+ right: 0;\r
+}\r
-.calendar {
- margin: 0;
- padding: 0;
- text-decoration: none;
- text-transform: none;
- text-indent: 0;
- font-weight: normal;
- font-size: 13px;
- font-family: Verdana, monospace;
- width: 100%;
- background: #ffffff;
- color: #4F4534;
- border: 1px solid #999999;
-}
-
-/* header */
-.calendar_scheduleHandler {
- background: url('../../images/spinelz/calendar_default_handler.gif') no-repeat;
- width: 16px;
- height: 16px;
- cursor: move;
- float: left;
-}
-
-.calendar_header {
- background: url(../../images/spinelz/calender_back.gif) repeat-x;
- color: #4F4534;
- width: 100%;
- height: 26px;
- border-bottom: 1px solid #999999;
- border-collapse: collapse;
- font-size: 13px;
- font-weight: bold;
-}
-
-.calendar_preYears {
- text-align: left;
- width: 35px;
-}
-
-.calendar_years {
- text-align: center;
-}
-
-.calendar_years span {
- font-weight: bolder;
- font-size: 105%;
-}
-
-.calendar_nextYears {
- text-align: right;
- width: 35px;
-}
-
-.calendar_nextMonthMark {
- background: url('../../images/spinelz/calendar_next.gif') no-repeat;
- width: 16px;
- height: 16px;
- cursor: pointer;
- float: left;
-}
-
-.calendar_nextYearMark {
- background: url('../../images/spinelz/calendar_next_second.gif') no-repeat;;
- width: 16px;
- height: 16px;
- cursor: pointer;
- margin-left: 16px;
-}
-
-.calendar_nextWeekMark {
- background: url('../../images/spinelz/calendar_next.gif') no-repeat;;
- width: 16px;
- height: 16px;
- cursor: pointer;
- margin: 0 0 0 auto;
-}
-
-.calendar_preMonthMark {
- background: url('../../images/spinelz/calendar_pre.gif') no-repeat;;
- width: 16px;
- height: 16px;
- cursor: pointer;
- margin-left: 16px;
-}
-
-.calendar_preYearMark {
- background: url('../../images/spinelz/calendar_pre_second.gif') no-repeat;;
- width: 16px;
- height: 16px;
- cursor: pointer;
- float: left;
-}
-
-.calendar_preWeekMark {
- background: url('../../images/spinelz/calendar_pre.gif') no-repeat;;
- width: 16px;
- height: 16px;
- cursor: pointer;
-}
-
-.calendar_markHover {
- margin-left: 5px;
- margin-right: 5px;
- cursor: pointer;
- color: #FF8080;
- background-color: #E6E6FA;
-}
-
-.calendar_ym {
- margin-left: 5px;
-}
-
-.calendar_table {
- font-size: 12px;
- border-collapse: collapse;
- margin: 0;
- padding: 0;
- width: 100%;
- table-layout: fixed;
-}
-
-.calendar_table TH {
- border-right: 1px solid #999999;
- border-bottom: 1px solid gray;
- text-align: center;
- background: url(../../images/spinelz/calender_back_second.gif) #FFFFFF;
- color: #4F4534;
- cursor: pointer;
- margin: 0;
- padding: 0;
- height: 24px;
-}
-
-.calendar_table TH.right {
- border-right-style: none;
-}
-
-.calendar_table TD {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- vertical-align: text-top;
- height: 100px;
- margin: 0;
- padding: 0;
-}
-
-.calendar_table TD.right {
- border-right-style: none;
-}
-
-.calendar_table TD.bottom {
- border-bottom-style: none;
-}
-
-.calendar_date {
- cursor: pointer;
- color: #000000;
- background: #FFFFFF;
- font-weight: bold;
-}
-.calendar_holidayContainer span {
- padding: 2px;
-}
-.calendar_regularHoliday {
- cursor: pointer;
- background: #ededed;
- color: #285A94;
- font-weight: bold;
-}
-
-.calendar_holiday {
- cursor: pointer;
- background-color: #dedede;
- color: #285A94;
- font-weight: bold;
- overflow: hidden;
-}
-
-.calendar_schedule {
- cursor: pointer;
- background: url(../../images/spinelz/calendar_schedule.gif) repeat-x;
- color: #285A94;
- font-weight: bold;
-}
-
-.calendar_highlightDay {
- cursor: pointer;
- font-weight: bold;
- text-decoration: underline;
- color: red;
-}
-
-.calendar_selected {
- background: #285A94;
- color: #ffffff;
-}
-
-.calendar_dateContainer {
- width: 100%;
- overflow: hidden;
- height: 15px;
-}
-
-/*
-.calendar_holidayContainer {
- width: 100%;
- overflow: hidden;
-}
-*/
-
-.calendar_holidayName {
- margin-left: 10px;
-}
-
-.calendar_schedule .calendar_scheduleListContainer {
- color: #000000;
- margin-top: 5px;
-}
-
-.calendar_selected .calendar_scheduleListContainer {
- color: #FFFFFF;
- margin-top: 5px;
-}
-
-.calendar_scheduleListContainer UL {
- list-style: square outside;
- font-weight: normal;
- padding: 0;
- margin: 0 0 0 15px;
-}
-
-.calendar_scheduleItem {
- font-size: 10px;
-}
-
-.calendar_scheduleItem DIV {
- overflow: hidden;
- font-size: 10px;
-}
-
-/* small size */
-.calendar_small {
- border: 1px solid #999999;
- font-size: 13px;
- width: 175px;
- background: #FFFFFF;
- color: #4F4534;
-}
-
-.calendar_calendar_small {
- background: #FFFFFF;
- color: #4F4534;
- font-size: 11px;
-}
-
-.calendar_header_small {
- background: url(../../images/spinelz/calender_back.gif) repeat-x;
- color: #4F4534;
- width: 100%;
- margin: 0;
- padding: 0;
- font-size: 11px;
- font-weight: bold;
- border-collapse: collapse;
- border-bottom: 1px solid #999999;
- height: 26px;
-}
-
-.calendar_tableSmall {
- font-size: 11px;
- text-align: left;
- width: 100%;
- border-collapse: collapse;
- margin: 0 0 0 0;
- padding: 0;
- table-layout: fixed;
-}
-
-.calendar_tableSmall TH {
- text-align: center;
- background: url(../../images/spinelz/calender_back_second.gif) #FFFFFF;
- color: #4F4534;
- width: 14%;
- cursor: pointer;
- margin: 0;
- padding: 0;
- height: 24px;
-}
-
-.calendar_tableSmall TD {
- text-align: center;
- vertical-align: text-top;
- margin: 0;
- padding: 0;
- height: 20px;
- vertical-align: middle;
-}
-
-
-/* week */
-.calendar_weekContainerTable {
- width: 100%;
- border-collapse: collapse;
- margin: 0;
- padding: 0;
- font-size: 11px;
-}
-
-.calendar_weekContainerTable TH {
- background: url(../../images/spinelz/calender_back_second.gif) #FFFFFF;
- color: #4F4534;
- margin: 0;
- padding: 0;
- height: 24px;
-}
-
-.calendar_weekContainerTable TD {
- margin: 0;
- padding: 0;
-}
-
-.calendar_timeline {
- margin: 0;
- padding: 0;
- width: 50px;
-}
-
-.calendar_timelineTimeTop {
- height: 23px;
- text-align: center;
-}
-
-.calendar_timelineTime {
- height: 51px;
- border-top: 1px solid #999999;
- text-align: center;
-}
-
-.calendar_headerColumn {
- border-left: 1px solid #999999;
- border-bottom: 1px solid #999999;
- height: 23px;
- overflow: hidden;
- cursor: pointer;
-}
-
-.calendar_headerColumn a {
- position: relative;
- top: 4px;
-}
-
-.calendar_columnTopDate {
- height: 25px;
- border-left: 1px solid #999999;
- cursor: pointer;
-}
-
-.calendar_columnDate {
- height: 25px;
- border-top: 1px solid #999999;
- border-left: 1px solid #999999;
- cursor: pointer;
-}
-
-.calendar_columnOddDate {
- height: 25px;
- border-top: 1px dashed #999999;
- border-left: 1px solid #999999;
- cursor: pointer;
-}
-
-.calendar_scheduleItemSmall {
- font-size: 10px;
- height: 25px;
- width: 100%;
- background-color: #E6E6FA;
- position: absolute;
- left: 0;
- top: 0;
-/* opacity: 0.7; */
- z-index: 1000;
- overflow: hidden;
-}
-
-.calendar_scheduleItemLarge {
- font-size: 10px;
- height: 17px;
- width: 100%;
- background-color: #E6E6FA;
- position: absolute;
- left: 0;
- top: 0;
- z-index: 1000;
- overflow: hidden;
- border: 2px solid #285A94;
- cursor: pointer;
-}
-
-.calendar_scheduleItemNoBorder {
- padding-top: 2px;
- font-size: 10px;
- height: 16px;
- width: 100%;
- position: absolute;
- left: 0;
- top: 0;
- z-index: 1000;
- overflow: hidden;
- cursor: pointer;
-}
-
-.calendar_scheduleItemNoBorder div {
- height: 16px;
-}
-
-.calendar_scheduleItemSelect {
- border: 2px solid red;
-}
-
-/*
-.calendar_detailItem UL {
- list-style: square outside;
- font-weight: normal;
- padding: 0;
- margin: 0 0 0 15px;
-}
-*/
-
-.calendar_weekMainTable {
- width: 100%;
- border-collapse: collapse;
- margin: 0;
- padding: 0;
- font-size: 11px;
-}
-
-.calendar_weekMainTable TH {
- background: url(../../images/spinelz/calender_back_second.gif) #FFFFFF;
- color: #4F4534;
- margin: 0;
- padding: 0;
- text-align: center;
-}
-
-.calendar_weekMainTable TD {
- margin: 0;
- padding: 0;
-}
-
-.calendar_weekScheduleContainer {
-}
-
-.calendar_deleteImage {
- background: url(../../images/spinelz/calendar_delete.gif) no-repeat;
- position: absolute;
- top: 0;
- right: 0;
- width: 16px;
- height: 16px;
- font-size: 5px;
- cursor: pointer;
-}
-
-.calendar_privateImage {
- background: url(../../images/spinelz/calendar_private_icon.gif) no-repeat;
- float: left;
- width: 16px;
- height: 16px;
- font-size: 5px;
-}
-
-.calendar_selector {
- position: absolute;
- top: 0;
- left: 0;
- border: 2px solid #9b0f0f;
- background: #FFC0CB;
-}
-
-.calendar_scheduleItemTimeArea {
- margin-right: 3px;
- font-size: 9px;
-}
-
-.calendar_cover {
- width: 100%;
- height: 100px;
- position: absolute;
- left: 0;
- top: 0;
- z-index: 1000;
-}
+.calendar {\r
+ margin: 0;\r
+ padding: 0;\r
+ text-decoration: none;\r
+ text-transform: none;\r
+ text-indent: 0;\r
+ font-weight: normal;\r
+ font-size: 13px;\r
+ font-family: Verdana, monospace;\r
+ width: 100%;\r
+ background: #ffffff;\r
+ color: #4F4534;\r
+ border: 1px solid #999999;\r
+}\r
+\r
+/* header */\r
+.calendar_scheduleHandler {\r
+ background: url('../../images/spinelz/calendar_default_handler.gif') no-repeat;\r
+ width: 16px;\r
+ height: 16px;\r
+ cursor: move;\r
+ float: left;\r
+}\r
+\r
+.calendar_header {\r
+ background: url(../../images/spinelz/calender_back.gif) repeat-x;\r
+ color: #4F4534; \r
+ width: 100%;\r
+ height: 26px; \r
+ border-bottom: 1px solid #999999;\r
+ border-collapse: collapse;\r
+ font-size: 13px;\r
+ font-weight: bold; \r
+}\r
+\r
+.calendar_preYears {\r
+ text-align: left;\r
+ width: 35px;\r
+}\r
+\r
+.calendar_years {\r
+ text-align: center;\r
+}\r
+\r
+.calendar_years span {\r
+ font-weight: bolder;\r
+ font-size: 105%;\r
+}\r
+\r
+.calendar_nextYears {\r
+ text-align: right;\r
+ width: 35px;\r
+}\r
+\r
+.calendar_nextMonthMark {\r
+ background: url('../../images/spinelz/calendar_next.gif') no-repeat;\r
+ width: 16px;\r
+ height: 16px;\r
+ cursor: pointer;\r
+ float: left;\r
+}\r
+\r
+.calendar_nextYearMark {\r
+ background: url('../../images/spinelz/calendar_next_second.gif') no-repeat;;\r
+ width: 16px;\r
+ height: 16px;\r
+ cursor: pointer;\r
+ margin-left: 16px;\r
+}\r
+\r
+.calendar_nextWeekMark {\r
+ background: url('../../images/spinelz/calendar_next.gif') no-repeat;;\r
+ width: 16px;\r
+ height: 16px;\r
+ cursor: pointer;\r
+ margin: 0 0 0 auto;\r
+}\r
+\r
+.calendar_preMonthMark {\r
+ background: url('../../images/spinelz/calendar_pre.gif') no-repeat;;\r
+ width: 16px;\r
+ height: 16px;\r
+ cursor: pointer;\r
+ margin-left: 16px;\r
+}\r
+\r
+.calendar_preYearMark {\r
+ background: url('../../images/spinelz/calendar_pre_second.gif') no-repeat;;\r
+ width: 16px;\r
+ height: 16px;\r
+ cursor: pointer;\r
+ float: left;\r
+}\r
+\r
+.calendar_preWeekMark {\r
+ background: url('../../images/spinelz/calendar_pre.gif') no-repeat;;\r
+ width: 16px;\r
+ height: 16px;\r
+ cursor: pointer;\r
+}\r
+\r
+.calendar_markHover {\r
+ margin-left: 5px;\r
+ margin-right: 5px;\r
+ cursor: pointer;\r
+ color: #FF8080;\r
+ background-color: #E6E6FA;\r
+}\r
+\r
+.calendar_ym {\r
+ margin-left: 5px;\r
+}\r
+\r
+.calendar_table {\r
+ font-size: 12px;\r
+ border-collapse: collapse;\r
+ margin: 0;\r
+ padding: 0;\r
+ width: 100%;\r
+ table-layout: fixed;\r
+}\r
+\r
+.calendar_table TH {\r
+ border-right: 1px solid #999999;\r
+ border-bottom: 1px solid gray;\r
+ text-align: center;\r
+ background: url(../../images/spinelz/calender_back_second.gif) #FFFFFF;\r
+ color: #4F4534;\r
+ cursor: pointer;\r
+ margin: 0;\r
+ padding: 0;\r
+ height: 24px;\r
+}\r
+\r
+.calendar_table TH.right {\r
+ border-right-style: none;\r
+}\r
+\r
+.calendar_table TD {\r
+ border-right: 1px solid #999999;\r
+ border-bottom: 1px solid #999999;\r
+ vertical-align: text-top;\r
+ height: 100px;\r
+ margin: 0;\r
+ padding: 0;\r
+}\r
+\r
+.calendar_table TD.right {\r
+ border-right-style: none;\r
+}\r
+\r
+.calendar_table TD.bottom {\r
+ border-bottom-style: none;\r
+}\r
+\r
+.calendar_date {\r
+ cursor: pointer;\r
+ color: #000000;\r
+ background: #FFFFFF;\r
+ font-weight: bold;\r
+}\r
+.calendar_holidayContainer span {\r
+ padding: 2px;\r
+}\r
+.calendar_regularHoliday {\r
+ cursor: pointer;\r
+ background: #ededed;\r
+ color: #285A94;\r
+ font-weight: bold;\r
+}\r
+\r
+.calendar_holiday {\r
+ cursor: pointer;\r
+ background-color: #dedede;\r
+ color: #285A94;\r
+ font-weight: bold;\r
+ overflow: hidden;\r
+}\r
+\r
+.calendar_schedule {\r
+ cursor: pointer;\r
+ background: url(../../images/spinelz/calendar_schedule.gif) repeat-x;\r
+ color: #285A94;\r
+ font-weight: bold;\r
+}\r
+\r
+.calendar_highlightDay {\r
+ cursor: pointer;\r
+ font-weight: bold;\r
+ text-decoration: underline;\r
+ color: red;\r
+}\r
+\r
+.calendar_selected {\r
+ background: #285A94;\r
+ color: #ffffff;\r
+}\r
+\r
+.calendar_dateContainer {\r
+ width: 100%;\r
+ overflow: hidden;\r
+ height: 15px;\r
+}\r
+\r
+/*\r
+.calendar_holidayContainer {\r
+ width: 100%;\r
+ overflow: hidden;\r
+}\r
+*/\r
+\r
+.calendar_holidayName {\r
+ margin-left: 10px;\r
+}\r
+\r
+.calendar_schedule .calendar_scheduleListContainer {\r
+ color: #000000;\r
+ margin-top: 5px;\r
+}\r
+\r
+.calendar_selected .calendar_scheduleListContainer {\r
+ color: #FFFFFF;\r
+ margin-top: 5px;\r
+}\r
+\r
+.calendar_scheduleListContainer UL {\r
+ list-style: square outside;\r
+ font-weight: normal;\r
+ padding: 0;\r
+ margin: 0 0 0 15px;\r
+}\r
+\r
+.calendar_scheduleItem {\r
+ font-size: 10px;\r
+}\r
+\r
+.calendar_scheduleItem DIV {\r
+ overflow: hidden;\r
+ font-size: 10px;\r
+}\r
+\r
+/* small size */\r
+.calendar_small {\r
+ border: 1px solid #999999;\r
+ font-size: 13px;\r
+ width: 175px;\r
+ background: #FFFFFF;\r
+ color: #4F4534;\r
+}\r
+\r
+.calendar_calendar_small {\r
+ background: #FFFFFF;\r
+ color: #4F4534;\r
+ font-size: 11px;\r
+}\r
+\r
+.calendar_header_small {\r
+ background: url(../../images/spinelz/calender_back.gif) repeat-x;\r
+ color: #4F4534;\r
+ width: 100%;\r
+ margin: 0;\r
+ padding: 0;\r
+ font-size: 11px;\r
+ font-weight: bold;\r
+ border-collapse: collapse; \r
+ border-bottom: 1px solid #999999;\r
+ height: 26px;\r
+}\r
+\r
+.calendar_tableSmall {\r
+ font-size: 11px;\r
+ text-align: left;\r
+ width: 100%;\r
+ border-collapse: collapse;\r
+ margin: 0 0 0 0;\r
+ padding: 0;\r
+ table-layout: fixed;\r
+}\r
+\r
+.calendar_tableSmall TH {\r
+ text-align: center;\r
+ background: url(../../images/spinelz/calender_back_second.gif) #FFFFFF;\r
+ color: #4F4534;\r
+ width: 14%;\r
+ cursor: pointer;\r
+ margin: 0;\r
+ padding: 0;\r
+ height: 24px;\r
+}\r
+\r
+.calendar_tableSmall TD {\r
+ text-align: center;\r
+ vertical-align: text-top;\r
+ margin: 0;\r
+ padding: 0;\r
+ height: 20px;\r
+ vertical-align: middle;\r
+}\r
+\r
+\r
+/* week */\r
+.calendar_weekContainerTable {\r
+ width: 100%;\r
+ border-collapse: collapse;\r
+ margin: 0;\r
+ padding: 0;\r
+ font-size: 11px;\r
+}\r
+\r
+.calendar_weekContainerTable TH {\r
+ background: url(../../images/spinelz/calender_back_second.gif) #FFFFFF;\r
+ color: #4F4534;\r
+ margin: 0;\r
+ padding: 0;\r
+ height: 24px;\r
+}\r
+\r
+.calendar_weekContainerTable TD {\r
+ margin: 0;\r
+ padding: 0;\r
+}\r
+\r
+.calendar_timeline {\r
+ margin: 0;\r
+ padding: 0;\r
+ width: 50px;\r
+}\r
+\r
+.calendar_timelineTimeTop {\r
+ height: 23px;\r
+ text-align: center;\r
+}\r
+\r
+.calendar_timelineTime {\r
+ height: 51px;\r
+ border-top: 1px solid #999999;\r
+ text-align: center;\r
+}\r
+\r
+.calendar_headerColumn {\r
+ border-left: 1px solid #999999;\r
+ border-bottom: 1px solid #999999;\r
+ height: 23px;\r
+ overflow: hidden;\r
+ cursor: pointer;\r
+}\r
+\r
+.calendar_headerColumn a {\r
+ position: relative;\r
+ top: 4px;\r
+}\r
+\r
+.calendar_columnTopDate {\r
+ height: 25px;\r
+ border-left: 1px solid #999999;\r
+ cursor: pointer;\r
+}\r
+\r
+.calendar_columnDate {\r
+ height: 25px;\r
+ border-top: 1px solid #999999;\r
+ border-left: 1px solid #999999;\r
+ cursor: pointer;\r
+}\r
+\r
+.calendar_columnOddDate {\r
+ height: 25px;\r
+ border-top: 1px dashed #999999;\r
+ border-left: 1px solid #999999;\r
+ cursor: pointer;\r
+}\r
+\r
+.calendar_scheduleItemSmall {\r
+ font-size: 10px;\r
+ height: 25px;\r
+ width: 100%;\r
+ background-color: #E6E6FA; \r
+ position: absolute;\r
+ left: 0;\r
+ top: 0;\r
+/* opacity: 0.7; */\r
+ z-index: 1000;\r
+ overflow: hidden;\r
+}\r
+\r
+.calendar_scheduleItemLarge {\r
+ font-size: 10px;\r
+ height: 17px;\r
+ width: 100%;\r
+ background-color: #E6E6FA; \r
+ position: absolute;\r
+ left: 0;\r
+ top: 0;\r
+ z-index: 1000;\r
+ overflow: hidden;\r
+ border: 2px solid #285A94;\r
+ cursor: pointer;\r
+}\r
+\r
+.calendar_scheduleItemNoBorder {\r
+ padding-top: 2px;\r
+ font-size: 10px;\r
+ height: 16px;\r
+ width: 100%;\r
+ position: absolute;\r
+ left: 0;\r
+ top: 0;\r
+ z-index: 1000;\r
+ overflow: hidden;\r
+ cursor: pointer;\r
+}\r
+\r
+.calendar_scheduleItemNoBorder div {\r
+ height: 16px;\r
+}\r
+\r
+.calendar_scheduleItemSelect {\r
+ border: 2px solid red;\r
+}\r
+\r
+/*\r
+.calendar_detailItem UL {\r
+ list-style: square outside;\r
+ font-weight: normal;\r
+ padding: 0;\r
+ margin: 0 0 0 15px;\r
+}\r
+*/\r
+\r
+.calendar_weekMainTable {\r
+ width: 100%;\r
+ border-collapse: collapse;\r
+ margin: 0;\r
+ padding: 0;\r
+ font-size: 11px;\r
+}\r
+\r
+.calendar_weekMainTable TH {\r
+ background: url(../../images/spinelz/calender_back_second.gif) #FFFFFF;\r
+ color: #4F4534;\r
+ margin: 0;\r
+ padding: 0;\r
+ text-align: center;\r
+}\r
+\r
+.calendar_weekMainTable TD {\r
+ margin: 0;\r
+ padding: 0;\r
+}\r
+\r
+.calendar_weekScheduleContainer {\r
+}\r
+\r
+.calendar_deleteImage {\r
+ background: url(../../images/spinelz/calendar_delete.gif) no-repeat;\r
+ position: absolute;\r
+ top: 0;\r
+ right: 0;\r
+ width: 16px;\r
+ height: 16px;\r
+ font-size: 5px;\r
+ cursor: pointer;\r
+}\r
+\r
+.calendar_privateImage {\r
+ background: url(../../images/spinelz/calendar_private_icon.gif) no-repeat;\r
+ float: left;\r
+ width: 16px;\r
+ height: 16px;\r
+ font-size: 5px;\r
+}\r
+\r
+.calendar_selector {\r
+ position: absolute;\r
+ top: 0;\r
+ left: 0;\r
+ border: 2px solid #9b0f0f;\r
+ background: #FFC0CB;\r
+}\r
+\r
+.calendar_scheduleItemTimeArea {\r
+ margin-right: 3px;\r
+ font-size: 9px;\r
+}\r
+\r
+.calendar_cover {\r
+ width: 100%;\r
+ height: 100px;\r
+ position: absolute;\r
+ left: 0;\r
+ top: 0;\r
+ z-index: 1000;\r
+}\r
-.datepicker {
- border: 1px solid #999999;
- font-size: 13px;
- width: 200px;
- height: 160px;
- background: #FFFFFF;
- color: #000000;
-}
-
-.datepicker table tr td {
- padding: 0px;
- margin: 0px;
- border: none;
-}
-
-/* header */
-.datepicker_header {
- padding-top: 3px;
- width: 100%;
- height: 26px;
- background: url('../../images/spinelz/datepicker_back.gif') repeat-x;
- color: #808080;
- border-bottom: 1px solid #999999;
- font-weight: bold;
-}
-
-.datepicker_nextMonthMark {
- background: url('../../images/spinelz/datepicker_next.gif') no-repeat;
- width: 16px;
- height: 16px;
- cursor: pointer;
- float: left;
-}
-
-.datepicker_nextYearMark {
- background: url('../../images/spinelz/datepicker_next_second.gif') no-repeat;
- width: 16px;
- height: 16px;
- cursor: pointer;
- margin-left: 16px;
-}
-
-.datepicker_preMonthMark {
- background: url('../../images/spinelz/datepicker_pre.gif') no-repeat;
- width: 16px;
- height: 16px;
- cursor: pointer;
- margin-left: 16px;
-}
-
-.datepicker_preYearMark {
- background: url('../../images/spinelz/datepicker_pre_second.gif') no-repeat;
- width: 16px;
- height: 16px;
- cursor: pointer;
- float: left;
-}
-
-.datepicker_nextYears {
- text-align: right;
- width: 35px;
-}
-
-.datepicker_preYears {
- text-align: left;
- width: 35px;
-}
-
-.datepicker_years {
- text-align: center;
-}
-
-.datepicker_nextYears {
- text-align: right;
- width: 35px;
-}
-
-.datepicker_ym {
- margin-left: 10px;
-}
-
-/* calendar */
-.datepicker_calendar {
- padding-top: 5px;
- background: #FFFFFF;
- color: #000000;
-}
-
-.datepicker_table {
- font-size: 11px;
- text-align: center;
- width: 100%;
- background-position: top;
-}
-
-.datepicker_tableTh {
- color: #999999;
-}
-
-.datepicker_date {
- cursor: pointer;
- background: #FFFFFF;
- color: #000000;
- width: 14%;
-}
-
-.datepicker_holiday {
- cursor: pointer;
- background: #FFFFFF;
- font-weight: bold;
- color: #285A94;
- width: 14%;
-}
-
-.datepicker_dateHover {
- cursor: pointer;
- background: #D5DFE8;
- font-weight: bold;
- color: #674534;
- width: 14%;
-}
-
-.datepicker_holidayHover {
- cursor: pointer;
- background-color: #D5DFE8;
- font-weight: bold;
- color: #674534;
- width: 14%;
-}
-
+.datepicker {\r
+ border: 1px solid #999999;\r
+ font-size: 13px;\r
+ width: 200px;\r
+ height: 160px;\r
+ background: #FFFFFF;\r
+ color: #000000;\r
+}\r
+\r
+.datepicker table tr td {\r
+ padding: 0px;\r
+ margin: 0px;\r
+ border: none;\r
+}\r
+\r
+/* header */\r
+.datepicker_header {\r
+ padding-top: 3px;\r
+ width: 100%;\r
+ height: 26px;\r
+ background: url('../../images/spinelz/datepicker_back.gif') repeat-x;\r
+ color: #808080;\r
+ border-bottom: 1px solid #999999;\r
+ font-weight: bold;\r
+}\r
+\r
+.datepicker_nextMonthMark {\r
+ background: url('../../images/spinelz/datepicker_next.gif') no-repeat;\r
+ width: 16px;\r
+ height: 16px;\r
+ cursor: pointer;\r
+ float: left;\r
+}\r
+\r
+.datepicker_nextYearMark {\r
+ background: url('../../images/spinelz/datepicker_next_second.gif') no-repeat;\r
+ width: 16px;\r
+ height: 16px;\r
+ cursor: pointer;\r
+ margin-left: 16px;\r
+}\r
+\r
+.datepicker_preMonthMark {\r
+ background: url('../../images/spinelz/datepicker_pre.gif') no-repeat;\r
+ width: 16px;\r
+ height: 16px;\r
+ cursor: pointer;\r
+ margin-left: 16px;\r
+}\r
+\r
+.datepicker_preYearMark {\r
+ background: url('../../images/spinelz/datepicker_pre_second.gif') no-repeat;\r
+ width: 16px;\r
+ height: 16px;\r
+ cursor: pointer;\r
+ float: left;\r
+}\r
+\r
+.datepicker_nextYears {\r
+ text-align: right;\r
+ width: 35px;\r
+}\r
+\r
+.datepicker_preYears {\r
+ text-align: left;\r
+ width: 35px;\r
+}\r
+\r
+.datepicker_years {\r
+ text-align: center;\r
+}\r
+\r
+.datepicker_nextYears {\r
+ text-align: right;\r
+ width: 35px;\r
+}\r
+\r
+.datepicker_ym {\r
+ margin-left: 10px;\r
+}\r
+\r
+/* calendar */\r
+.datepicker_calendar {\r
+ padding-top: 5px;\r
+ background: #FFFFFF;\r
+ color: #000000;\r
+}\r
+\r
+.datepicker_table {\r
+ font-size: 11px;\r
+ text-align: center;\r
+ width: 100%;\r
+ background-position: top;\r
+}\r
+\r
+.datepicker_tableTh {\r
+ color: #999999;\r
+}\r
+\r
+.datepicker_date {\r
+ cursor: pointer;\r
+ background: #FFFFFF;\r
+ color: #000000;\r
+ width: 14%;\r
+}\r
+\r
+.datepicker_holiday {\r
+ cursor: pointer;\r
+ background: #FFFFFF;\r
+ font-weight: bold;\r
+ color: #285A94;\r
+ width: 14%;\r
+}\r
+\r
+.datepicker_dateHover {\r
+ cursor: pointer;\r
+ background: #D5DFE8;\r
+ font-weight: bold;\r
+ color: #674534;\r
+ width: 14%;\r
+}\r
+\r
+.datepicker_holidayHover {\r
+ cursor: pointer;\r
+ background-color: #D5DFE8;\r
+ font-weight: bold;\r
+ color: #674534;\r
+ width: 14%;\r
+}\r
+\r
-.grid_container {
- position: relative;
- width: 500px;
- height: 200px;
- overflow: scroll;
-}
-.grid_baseTable{
- background-color: #F6F6F6;
- color: #000000;
- empty-cells: show;
- z-index: 2;
-}
-.grid_headerIdCol{
- background: url(../../images/spinelz/table_back.gif) repeat-x #ffffff;
- color: #000000;
-}
-.grid_headerTable{
- background-color: #F6F6F6;
- color: #000000;
- z-index: 1;
-}
-.grid_headerRow{
- background-color: #F6F6F6;
- color: #000000;
-
-}
-.grid_headerCell{
- background-color: #F6F6F6;
- color: #000000;
-}
-
-.grid_headerCellDrag {
- background-color: #F6F6F6;
- color: #000000;
- overflow: hidden;
- cursor: move;
-}
-.grid_headerCellVal {
- background-color: #F6F6F6;
- color: #000000;
- text-align: center;
- font-weight: bold;
- overflow: hidden;
- cursor: pointer;
-}
-
-.grid_idTable {
- background-color: #F6F6F6;
- color: #000000;
- z-index: 1;
-}
-
-.grid_idRow {
- background-color: #F6F6F6;
- color: #000000;
-}
-
-.grid_idCell{
- background-color: #F6F6F6;
- color: #000000;
- overflow: hidden;
-
-}
-.grid_idCellVal{
- background-color: #F6F6F6;
- color: #000000;
- cursor: move;
- overflow: hidden;
- text-align: center;
-}
-
-.grid_cellTable{
- overflow: hidden;
-}
-.grid_cellTbody{
- position: relative;
-}
-
-.grid_cellRow{
- background-color: #F6F6F6;
- color: #000000;
- position: relative;
- overflow: hidden;
- top: 0;
- left: 0;
-}
-
-.grid_cell{
- overflow: hidden;
- background-color: #FFFFFF;
- color: #000000;
- position: relative;
-}
-
-.grid_cellVal{
- overflow: hidden;
- position: relative;
-}
-
-.grid_cellSelected{
- background-color: #becfeb;
- color: #000000;
-}
-.cellHover{
- background-color: #becfeb;
- color: #000000;
- font-weight: bold;
-}
-
-.grid_state {
- background-image: url(../../images/spinelz/grid_state.gif);
- background-repeat: no-repeat;
- background-position: 0px -22px;
- height: 11px;
- width: 11px;
- overflow: hidden;
-}
-.grid_stateEmpty {
- background-position: 0px -22px;
-}
-
-.grid_stateClose {
- cursor: pointer;
- background-position: 0px -11px;
-}
-
-.grid_stateOpen {
- cursor: pointer;
- background-position: 0px 0px;
-}
-
-.grid_inplaceEditor{
- margin: 0;
- padding: 0;
- width : 100%;
- height: 100%;
-}
+.grid_container {\r
+ position: relative;\r
+ width: 500px;\r
+ height: 200px;\r
+ overflow: scroll;\r
+}\r
+.grid_baseTable{\r
+ background-color: #F6F6F6;\r
+ color: #000000;\r
+ empty-cells: show;\r
+ z-index: 2; \r
+}\r
+.grid_headerIdCol{\r
+ background: url(../../images/spinelz/table_back.gif) repeat-x #ffffff;\r
+ color: #000000;\r
+}\r
+.grid_headerTable{\r
+ background-color: #F6F6F6;\r
+ color: #000000;\r
+ z-index: 1;\r
+}\r
+.grid_headerRow{\r
+ background-color: #F6F6F6;\r
+ color: #000000;\r
+ \r
+}\r
+.grid_headerCell{\r
+ background-color: #F6F6F6;\r
+ color: #000000;\r
+}\r
+\r
+.grid_headerCellDrag {\r
+ background-color: #F6F6F6;\r
+ color: #000000;\r
+ overflow: hidden;\r
+ cursor: move; \r
+}\r
+.grid_headerCellVal {\r
+ background-color: #F6F6F6;\r
+ color: #000000;\r
+ text-align: center;\r
+ font-weight: bold;\r
+ overflow: hidden;\r
+ cursor: pointer;\r
+}\r
+\r
+.grid_idTable {\r
+ background-color: #F6F6F6;\r
+ color: #000000;\r
+ z-index: 1; \r
+}\r
+\r
+.grid_idRow {\r
+ background-color: #F6F6F6; \r
+ color: #000000;\r
+}\r
+\r
+.grid_idCell{\r
+ background-color: #F6F6F6;\r
+ color: #000000;\r
+ overflow: hidden;\r
+ \r
+}\r
+.grid_idCellVal{\r
+ background-color: #F6F6F6;\r
+ color: #000000;\r
+ cursor: move;\r
+ overflow: hidden;\r
+ text-align: center;\r
+}\r
+\r
+.grid_cellTable{\r
+ overflow: hidden;\r
+}\r
+.grid_cellTbody{\r
+ position: relative;\r
+}\r
+\r
+.grid_cellRow{\r
+ background-color: #F6F6F6;\r
+ color: #000000;\r
+ position: relative;\r
+ overflow: hidden;\r
+ top: 0;\r
+ left: 0;\r
+}\r
+\r
+.grid_cell{\r
+ overflow: hidden;\r
+ background-color: #FFFFFF;\r
+ color: #000000;\r
+ position: relative; \r
+}\r
+\r
+.grid_cellVal{\r
+ overflow: hidden;\r
+ position: relative;\r
+}\r
+\r
+.grid_cellSelected{\r
+ background-color: #becfeb;\r
+ color: #000000;\r
+}\r
+.cellHover{\r
+ background-color: #becfeb;\r
+ color: #000000;\r
+ font-weight: bold;\r
+}\r
+\r
+.grid_state {\r
+ background-image: url(../../images/spinelz/grid_state.gif);\r
+ background-repeat: no-repeat;\r
+ background-position: 0px -22px;\r
+ height: 11px;\r
+ width: 11px;\r
+ overflow: hidden;\r
+}\r
+.grid_stateEmpty {\r
+ background-position: 0px -22px;\r
+}\r
+\r
+.grid_stateClose {\r
+ cursor: pointer;\r
+ background-position: 0px -11px;\r
+}\r
+\r
+.grid_stateOpen {\r
+ cursor: pointer; \r
+ background-position: 0px 0px;\r
+}\r
+\r
+.grid_inplaceEditor{\r
+ margin: 0;\r
+ padding: 0;\r
+ width : 100%;\r
+ height: 100%;\r
+}\r
-* {
- margin: 0;
- padding: 0;
- text-decoration: none;
- text-transform: none;
- text-indent: 0;
- font-weight: normal;
- list-style-type: none;
-}
-
-.menubar {
- background: url(../../images/spinelz/menubar_back.gif) repeat-x;
- border: 1px solid #999999;
- font-size: 0.8em;
- line-height: 1.3em;
- height: 26px;
-}
-
-.menubar_menu {
-}
-
-.menubar_menuBody {
- float: left;
- cursor: pointer;
- padding: 3px 8px;
- height: 20px;
- line-height: 1.8em;
-}
-
-.menubar_menuBodyHover {
- float: left;
- cursor: pointer;
- background: #defa93;
- padding: 3px 8px;
- height: 20px;
- line-height: 1.8em;
-}
-
-.menubar_subMenu {
-}
-
-.menubar_subMenuBody {
- background: url(../../images/spinelz/menubar_subcontents_back.gif) repeat-x #fff;
- color: #4F4534;
- padding: 0 3px;
- cursor: pointer;
-}
-
-.menubar_subMenuBodyHover {
- background: #C8CEF6;
- color: #4F4534;
- padding: 0 3px;
- cursor: pointer;
-}
-
-.menubar_subMenuBody A {
- background: #FFFFFF;
- color: gray;
- cursor: pointer;
-}
-
-.menubar_subMenuBodyHover A {
- background-color: #C8CEF6;
- color: #FFFFFF;
- cursor: pointer;
-
-}
-
-.menubar_menuContainer {
- border: 1px solid #999999;
- position: absolute;
- width: 100px;
-}
-
-.menubar_dirMark {
- position: relative;
- top: -17px;
- left: 0;
- float: right;
- color: #999999;
- cursor: pointer;
-}
-
+* {\r
+ margin: 0;\r
+ padding: 0;\r
+ text-decoration: none;\r
+ text-transform: none;\r
+ text-indent: 0;\r
+ font-weight: normal;\r
+ list-style-type: none;\r
+}\r
+\r
+.menubar {\r
+ background: url(../../images/spinelz/menubar_back.gif) repeat-x;\r
+ border: 1px solid #999999;\r
+ font-size: 0.8em;\r
+ line-height: 1.3em;\r
+ height: 26px;\r
+}\r
+\r
+.menubar_menu {\r
+}\r
+\r
+.menubar_menuBody {\r
+ float: left;\r
+ cursor: pointer;\r
+ padding: 3px 8px;\r
+ height: 20px;\r
+ line-height: 1.8em;\r
+}\r
+\r
+.menubar_menuBodyHover {\r
+ float: left;\r
+ cursor: pointer;\r
+ background: #defa93;\r
+ padding: 3px 8px;\r
+ height: 20px;\r
+ line-height: 1.8em;\r
+}\r
+\r
+.menubar_subMenu {\r
+}\r
+\r
+.menubar_subMenuBody {\r
+ background: url(../../images/spinelz/menubar_subcontents_back.gif) repeat-x #fff;\r
+ color: #4F4534;\r
+ padding: 0 3px;\r
+ cursor: pointer;\r
+}\r
+\r
+.menubar_subMenuBodyHover {\r
+ background: #C8CEF6;\r
+ color: #4F4534;\r
+ padding: 0 3px;\r
+ cursor: pointer;\r
+}\r
+\r
+.menubar_subMenuBody A {\r
+ background: #FFFFFF;\r
+ color: gray;\r
+ cursor: pointer;\r
+}\r
+\r
+.menubar_subMenuBodyHover A {\r
+ background-color: #C8CEF6;\r
+ color: #FFFFFF;\r
+ cursor: pointer;\r
+\r
+}\r
+\r
+.menubar_menuContainer {\r
+ border: 1px solid #999999;\r
+ position: absolute;\r
+ width: 100px;\r
+}\r
+\r
+.menubar_dirMark {\r
+ position: relative;\r
+ top: -17px;\r
+ left: 0;\r
+ float: right;\r
+ color: #999999;\r
+ cursor: pointer;\r
+}\r
+\r
-.modal_mask {
- position: fixed;
- top: 0px;
- right:0px;
- left: 0px;
- width: 100%;
- height: 100%;
- opacity: .2;
- background-color: #CCCCCC;
- color: #FFFFFF;
-}
-
-.modal_mask_ie {
- position: absolute;
- top: expression(eval(document.documentElement.scrollTop));
- left: expression(eval(document.documentElement.scrollLeft));
- width: 100%;
- height: 100%;
- filter: alpha(opacity=20);
- background-color: #CCCCCC;
- color: #FFFFFF;
-}
+.modal_mask {\r
+ position: fixed;\r
+ top: 0px;\r
+ right:0px;\r
+ left: 0px;\r
+ width: 100%;\r
+ height: 100%;\r
+ opacity: .2;\r
+ background-color: #CCCCCC;\r
+ color: #FFFFFF;\r
+}\r
+\r
+.modal_mask_ie {\r
+ position: absolute;\r
+ top: expression(eval(document.documentElement.scrollTop));\r
+ left: expression(eval(document.documentElement.scrollLeft));\r
+ width: 100%;\r
+ height: 100%;\r
+ filter: alpha(opacity=20); \r
+ background-color: #CCCCCC;\r
+ color: #FFFFFF;\r
+}\r
-.navPanel{
- border-bottom: 1px solid #919b9c;
-}
-
-.navPanel_panel{
- border-left: 1px solid #999999;
- border-right: 1px solid #999999;
- padding: 10px;
- overflow: auto;
-}
-
-.navPanel_tab {
- height: 26px;
- position: relative;
- cursor: pointer;
-}
-.navPanel_tab div{
- height: 26px;
-}
-.navPanel_tabLeftInactive {
- background: url('../../images/spinelz/navPanel_tab_left_inactive.gif') no-repeat;
- position: absolute;
- left: 0;
- width: 10px;
-}
-
-.navPanel_tabLeftActive {
- background: url('../../images/spinelz/navPanel_tab_left_active.gif') no-repeat;
- position: absolute;
- left: 0;
- width: 10px;
-}
-
-.navPanel_tabMiddleInactive {
- background: url('../../images/spinelz/navPanel_tab_middle_inactive.gif') repeat-x;
- margin: 0 10px;
-}
-
-.navPanel_tabMiddleActive {
- background: url('../../images/spinelz/navPanel_tab_middle_active.gif') repeat-x;
- margin: 0 10px;
-}
-
-.navPanel_tabRightInactive {
- background: url('../../images/spinelz/navPanel_tab_right_inactive.gif') no-repeat;
- position: absolute;
- top: 0;
- right: 0;
- width: 10px;
-}
-
-.navPanel_tabRightActive {
- background: url('../../images/spinelz/navPanel_tab_right_active.gif') no-repeat;
- position: absolute;
- top: 0;
- right: 0;
- width: 10px;
-}
+.navPanel{\r
+ border-bottom: 1px solid #919b9c;\r
+}\r
+\r
+.navPanel_panel{\r
+ border-left: 1px solid #999999;\r
+ border-right: 1px solid #999999;\r
+ padding: 10px;\r
+ overflow: auto;\r
+}\r
+\r
+.navPanel_tab {\r
+ height: 26px;\r
+ position: relative;\r
+ cursor: pointer;\r
+} \r
+.navPanel_tab div{\r
+ height: 26px;\r
+} \r
+.navPanel_tabLeftInactive {\r
+ background: url('../../images/spinelz/navPanel_tab_left_inactive.gif') no-repeat;\r
+ position: absolute;\r
+ left: 0;\r
+ width: 10px;\r
+}\r
+\r
+.navPanel_tabLeftActive {\r
+ background: url('../../images/spinelz/navPanel_tab_left_active.gif') no-repeat;\r
+ position: absolute;\r
+ left: 0;\r
+ width: 10px;\r
+}\r
+\r
+.navPanel_tabMiddleInactive {\r
+ background: url('../../images/spinelz/navPanel_tab_middle_inactive.gif') repeat-x;\r
+ margin: 0 10px;\r
+}\r
+\r
+.navPanel_tabMiddleActive {\r
+ background: url('../../images/spinelz/navPanel_tab_middle_active.gif') repeat-x;\r
+ margin: 0 10px;\r
+}\r
+\r
+.navPanel_tabRightInactive {\r
+ background: url('../../images/spinelz/navPanel_tab_right_inactive.gif') no-repeat;\r
+ position: absolute;\r
+ top: 0;\r
+ right: 0;\r
+ width: 10px;\r
+}\r
+\r
+.navPanel_tabRightActive {\r
+ background: url('../../images/spinelz/navPanel_tab_right_active.gif') no-repeat;\r
+ position: absolute;\r
+ top: 0;\r
+ right: 0;\r
+ width: 10px;\r
+}\r
-.selectableTable_table {
- border-collapse: collapse;
- margin: 0px;
- padding: 0px;
- width: 100%;
-}
-
-.selectableTable_tr {
- margin: 0px;
- padding: 0px;
-}
-
-.selectableTable_tr td {
- border-bottom: 1px dotted black;
- border-top: 1px dotted black;
-}
-
-.selectableTable_trSelected {
- background: url(../../images/spinelz/selectabletable_selected.gif) repeat-x;
- margin: 0px;
- padding: 0px;
-}
-
-.selectableTable_trHover {
- background-color: #eeffcc;
- margin: 0px;
- padding: 0px;
-}
+.selectableTable_table {\r
+ border-collapse: collapse;\r
+ margin: 0px;\r
+ padding: 0px;\r
+ width: 100%;\r
+}\r
+\r
+.selectableTable_tr {\r
+ margin: 0px;\r
+ padding: 0px;\r
+}\r
+\r
+.selectableTable_tr td {\r
+ border-bottom: 1px dotted black;\r
+ border-top: 1px dotted black;\r
+}\r
+\r
+.selectableTable_trSelected {\r
+ background: url(../../images/spinelz/selectabletable_selected.gif) repeat-x;\r
+ margin: 0px;\r
+ padding: 0px;\r
+}\r
+\r
+.selectableTable_trHover {\r
+ background-color: #eeffcc;\r
+ margin: 0px;\r
+ padding: 0px;\r
+}\r
-* {
- margin: 0;
- padding: 0;
- text-decoration: none;
- text-transform: none;
- text-indent: 0;
- font-weight: normal;
- list-style-type: none;
-}
-
-.sideBarBox_panelContainer {
- float: left;
- border: 1px solid #999999;
- padding: 5px;
- position: relative;
- z-index: 5;
- width: 200px;
- height: 200px;
-}
-
-.sideBarBox_tabContainer {
- position: relative;
- float: left;
- width: 40px;
-}
-
-.sideBarBox_tabContent {
-}
-
-.sideBarBox_tabTitle {
- position: relative;
- left: 10px;
-}
-
-.sideBarBox_tab div{
- cursor: pointer;
- width: 40px;
- position: relative;
- left: -1px;
-}
-
-.sideBarBox_tabTopInactive {
- background: url('../../images/spinelz/sideBarBox_tabTopInactive.gif') no-repeat;
- background-position: 0 1px;
- height: 10px;
- z-index: 1;
- font-size: 1px;
-}
-
-.sideBarBox_tabTopActive {
- background: url('../../images/spinelz/sideBarBox_tabTopActive.gif') no-repeat;
- background-position: 0 1px;
- height: 10px;
- z-index: 10;
- font-size: 1px;
-}
-
-.sideBarBox_tabMiddleInactive {
- background: url('../../images/spinelz/sideBarBox_tabMiddleInactive.gif') repeat-y;
- background-position: left top;
- top: -2px;
- z-index: 1;
-}
-
-.sideBarBox_tabMiddleActive {
- background: url('../../images/spinelz/sideBarBox_tabMiddleActive.gif') repeat-y;
- background-position: left top;
- top: -2px;
- z-index: 10;
-}
-
-.sideBarBox_tabBottomInactive {
- display: block;
- background: url('../../images/spinelz/sideBarBox_tabBottomInactive.gif') no-repeat;
- background-position: left top;
- height: 10px;
- top: -5px;
-}
-
-.sideBarBox_tabBottomActive {
- display: block;
- background: url('../../images/spinelz/sideBarBox_tabBottomActive.gif') no-repeat;
- background-position: left top;
- height: 10px;
- top: -5px;
- z-index: 10;
-}
+* {\r
+ margin: 0;\r
+ padding: 0;\r
+ text-decoration: none;\r
+ text-transform: none;\r
+ text-indent: 0;\r
+ font-weight: normal;\r
+ list-style-type: none;\r
+}\r
+\r
+.sideBarBox_panelContainer {\r
+ float: left;\r
+ border: 1px solid #999999;\r
+ padding: 5px;\r
+ position: relative;\r
+ z-index: 5;\r
+ width: 200px;\r
+ height: 200px;\r
+}\r
+\r
+.sideBarBox_tabContainer {\r
+ position: relative;\r
+ float: left;\r
+ width: 40px;\r
+}\r
+\r
+.sideBarBox_tabContent {\r
+}\r
+\r
+.sideBarBox_tabTitle {\r
+ position: relative;\r
+ left: 10px; \r
+}\r
+\r
+.sideBarBox_tab div{ \r
+ cursor: pointer;\r
+ width: 40px;\r
+ position: relative;\r
+ left: -1px;\r
+}\r
+\r
+.sideBarBox_tabTopInactive {\r
+ background: url('../../images/spinelz/sideBarBox_tabTopInactive.gif') no-repeat;\r
+ background-position: 0 1px;\r
+ height: 10px;\r
+ z-index: 1;\r
+ font-size: 1px;\r
+}\r
+\r
+.sideBarBox_tabTopActive {\r
+ background: url('../../images/spinelz/sideBarBox_tabTopActive.gif') no-repeat;\r
+ background-position: 0 1px;\r
+ height: 10px;\r
+ z-index: 10;\r
+ font-size: 1px;\r
+}\r
+\r
+.sideBarBox_tabMiddleInactive {\r
+ background: url('../../images/spinelz/sideBarBox_tabMiddleInactive.gif') repeat-y;\r
+ background-position: left top;\r
+ top: -2px;\r
+ z-index: 1;\r
+}\r
+\r
+.sideBarBox_tabMiddleActive {\r
+ background: url('../../images/spinelz/sideBarBox_tabMiddleActive.gif') repeat-y;\r
+ background-position: left top;\r
+ top: -2px;\r
+ z-index: 10;\r
+}\r
+\r
+.sideBarBox_tabBottomInactive {\r
+ display: block;\r
+ background: url('../../images/spinelz/sideBarBox_tabBottomInactive.gif') no-repeat;\r
+ background-position: left top;\r
+ height: 10px;\r
+ top: -5px;\r
+}\r
+\r
+.sideBarBox_tabBottomActive {\r
+ display: block;\r
+ background: url('../../images/spinelz/sideBarBox_tabBottomActive.gif') no-repeat;\r
+ background-position: left top;\r
+ height: 10px;\r
+ top: -5px;\r
+ z-index: 10;\r
+}\r
-
-.sortableTable_header {
- width: 100%;
- border: none;
-}
-
-.sortableTable_thead {
- background: url(../../images/spinelz/table_back.gif) repeat-x #ffffff;
- height: 26px;
- border: 1px solid #999;
-}
-
-.sortableTable_thead th {
- border: 0;
- padding: 0;
-}
-.sortableTable_tbody {
- background: #ffffff;
-}
-
-.sortableTable_tbody th {
- border: 0;
-}
-
-.sortableTable_title {
- float: left;
- width: 100%;
- font-weight: bold;
- height: 26px;
-}
-
-.sortableTable_empty {
- height: 16px;
- width: 16px;
-}
-
-.sortableTable_down {
- background: url(../../images/spinelz/sortableTable_down.gif) no-repeat;
- cursor: pointer;
- height: 16px;
- width: 16px;
- overflow: hidden;
-}
-
-.sortableTable_up {
- background: url(../../images/spinelz/sortableTable_up.gif) no-repeat;
- cursor: pointer;
- height: 16px;
- width: 16px;
- overflow: hidden;
-}
+\r
+.sortableTable_header {\r
+ width: 100%;\r
+ border: none;\r
+}\r
+\r
+.sortableTable_thead {\r
+ background: url(../../images/spinelz/table_back.gif) repeat-x #ffffff;\r
+ height: 26px;\r
+ border: 1px solid #999;\r
+}\r
+\r
+.sortableTable_thead th { \r
+ border: 0;\r
+ padding: 0;\r
+}\r
+.sortableTable_tbody {\r
+ background: #ffffff;\r
+}\r
+\r
+.sortableTable_tbody th { \r
+ border: 0;\r
+}\r
+\r
+.sortableTable_title {\r
+ float: left;\r
+ width: 100%;\r
+ font-weight: bold;\r
+ height: 26px;\r
+}\r
+\r
+.sortableTable_empty {\r
+ height: 16px;\r
+ width: 16px;\r
+}\r
+\r
+.sortableTable_down {\r
+ background: url(../../images/spinelz/sortableTable_down.gif) no-repeat;\r
+ cursor: pointer; \r
+ height: 16px;\r
+ width: 16px;\r
+ overflow: hidden;\r
+}\r
+\r
+.sortableTable_up {\r
+ background: url(../../images/spinelz/sortableTable_up.gif) no-repeat;\r
+ cursor: pointer; \r
+ height: 16px;\r
+ width: 16px;\r
+ overflow: hidden;\r
+}\r
-.switcher_state_close {
- float: left;
- background-image: url('../../images/spinelz/switcher_close.gif');
- background-repeat: no-repeat;
- cursor: pointer;
- height: 16px;
- width: 16px;
- background-position: center center;
- overflow: visible;
-}
-
-.switcher_state_open {
- float: left;
- background-image: url('../../images/spinelz/switcher_open.gif');
- background-repeat: no-repeat;
- cursor: pointer;
- height: 16px;
- width: 16px;
- background-position: center center;
- overflow: visible;
-}
-
+.switcher_state_close {\r
+ float: left;\r
+ background-image: url('../../images/spinelz/switcher_close.gif');\r
+ background-repeat: no-repeat;\r
+ cursor: pointer; \r
+ height: 16px;\r
+ width: 16px;\r
+ background-position: center center;\r
+ overflow: visible;\r
+}\r
+\r
+.switcher_state_open {\r
+ float: left;\r
+ background-image: url('../../images/spinelz/switcher_open.gif');\r
+ background-repeat: no-repeat;\r
+ cursor: pointer; \r
+ height: 16px;\r
+ width: 16px;\r
+ background-position: center center;\r
+ overflow: visible;\r
+}\r
+\r
-.tabBox_tabBox {
- margin: 0;
- padding: 0;
- text-decoration: none;
- text-transform: none;
- text-indent: 0;
- font-weight: normal;
-}
-
-.tabBox_panelContainer {
- clear: left;
- border-left: 1px solid #999999;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
-}
-
-.tabBox_tabContainer{
- height: 42px;
- background: url(../../images/spinelz/tab_bar.gif) repeat-x;
- background-position: bottom;
- padding-left: 5px;
-}
-
-.tabBox_tab {
- float: left;
-}
-
-.tabBox_tab div{
- float: left;
- height: 24px;
- cursor: pointer;
- overflow: hidden;
-}
-
-.tabBox_tabLeftInactive {
- background: url('../../images/spinelz/tabBox_tabLeftInactive.gif') no-repeat;
- width: 8px;
- margin-left: 4px;
-}
-
-.tabBox_tabLeftActive {
- background: url('../../images/spinelz/tabBox_tabLeftActive.gif') no-repeat;
- width: 8px;
- margin-left: 4px;
-}
-
-.tabBox_tabMiddleInactive {
- background: url('../../images/spinelz/tabBox_tabMiddleInactive.gif') repeat-x;
- line-height: 1.8em;
-}
-
-.tabBox_tabMiddleActive {
- background: url('../../images/spinelz/tabBox_tabMiddleActive.gif') repeat-x;
- line-height: 1.8em;
-}
-
-.tabBox_tabRightInactive {
- background: url('../../images/spinelz/tabBox_tabRightInactive.gif') no-repeat;
- width: 10px;
- padding: 0;
-}
-
-.tabBox_tabRightActive {
- background: url('../../images/spinelz/tabBox_tabRightActive.gif') no-repeat;
- width: 10px;
-}
-
-.tabBox_tabTitle {
- font-weight: bold;
- line-height: 1.5em;
- padding: 0 10px !important;
-}
-
-.tabBox_closeButton {
- border: 0;
- overflow: hidden;
- cursor: pointer;
- font-size: 5px;
- width: 16px;
- height: 16px;
- background: url('../../images/spinelz/tabBox_close.gif') no-repeat;
- position: relative;
- top: 5px;
-}
+.tabBox_tabBox {\r
+ margin: 0;\r
+ padding: 0;\r
+ text-decoration: none;\r
+ text-transform: none;\r
+ text-indent: 0;\r
+ font-weight: normal;\r
+}\r
+\r
+.tabBox_panelContainer {\r
+ clear: left;\r
+ border-left: 1px solid #999999;\r
+ border-right: 1px solid #999999;\r
+ border-bottom: 1px solid #999999;\r
+}\r
+\r
+.tabBox_tabContainer{\r
+ height: 42px;\r
+ background: url(../../images/spinelz/tab_bar.gif) repeat-x;\r
+ background-position: bottom;\r
+ padding-left: 5px;\r
+}\r
+\r
+.tabBox_tab {\r
+ float: left;\r
+}\r
+\r
+.tabBox_tab div{\r
+ float: left;\r
+ height: 24px; \r
+ cursor: pointer;\r
+ overflow: hidden;\r
+}\r
+\r
+.tabBox_tabLeftInactive {\r
+ background: url('../../images/spinelz/tabBox_tabLeftInactive.gif') no-repeat;\r
+ width: 8px;\r
+ margin-left: 4px;\r
+}\r
+\r
+.tabBox_tabLeftActive {\r
+ background: url('../../images/spinelz/tabBox_tabLeftActive.gif') no-repeat;\r
+ width: 8px;\r
+ margin-left: 4px;\r
+}\r
+\r
+.tabBox_tabMiddleInactive {\r
+ background: url('../../images/spinelz/tabBox_tabMiddleInactive.gif') repeat-x;\r
+ line-height: 1.8em;\r
+}\r
+\r
+.tabBox_tabMiddleActive {\r
+ background: url('../../images/spinelz/tabBox_tabMiddleActive.gif') repeat-x;\r
+ line-height: 1.8em;\r
+}\r
+\r
+.tabBox_tabRightInactive {\r
+ background: url('../../images/spinelz/tabBox_tabRightInactive.gif') no-repeat;\r
+ width: 10px;\r
+ padding: 0;\r
+}\r
+\r
+.tabBox_tabRightActive {\r
+ background: url('../../images/spinelz/tabBox_tabRightActive.gif') no-repeat;\r
+ width: 10px;\r
+}\r
+\r
+.tabBox_tabTitle {\r
+ font-weight: bold;\r
+ line-height: 1.5em;\r
+ padding: 0 10px !important;\r
+}\r
+\r
+.tabBox_closeButton {\r
+ border: 0;\r
+ overflow: hidden;\r
+ cursor: pointer;\r
+ font-size: 5px;\r
+ width: 16px;\r
+ height: 16px;\r
+ background: url('../../images/spinelz/tabBox_close.gif') no-repeat;\r
+ position: relative;\r
+ top: 5px;\r
+}\r
-.timepicker_container {
- margin: 0;
- padding: 0;
- text-decoration: none;
- text-transform: none;
- text-indent: 0;
- font-weight: normal;
- font-size: 13px;
- font-family: Verdana, monospace;
- width: 150px;
- background: #ffffff;
- color: #4F4534;
- border: 1px solid #999999;
-}
-
-/* header */
-.timepicker_scheduleHandler {
- background: url('../../images/spinelz/calendar_default_handler.gif') no-repeat;
- width: 16px;
- height: 16px;
- cursor: move;
- float: left;
-}
-
-.timepicker_header {
- background: url(../../images/spinelz/calender_back.gif) repeat-x;
- color: #4F4534;
- width: 100%;
- height: 26px;
- border-bottom: 1px solid #999999;
- border-collapse: collapse;
- font-size: 13px;
- font-weight: bold;
-}
-
-.timepicker_preYears {
- text-align: left;
- width: 35px;
-}
-
-.timepicker_years {
- text-align: center;
-}
-
-.timepicker_years span {
- font-weight: bolder;
- font-size: 105%;
-}
-
-.timepicker_nextYears {
- text-align: right;
- width: 35px;
-}
-
-.timepicker_nextMonthMark {
- background: url('../../images/spinelz/calendar_next.gif') no-repeat;
- width: 16px;
- height: 16px;
- cursor: pointer;
- float: left;
-}
-
-.timepicker_nextYearMark {
- background: url('../../images/spinelz/calendar_next_second.gif') no-repeat;;
- width: 16px;
- height: 16px;
- cursor: pointer;
- margin-left: 16px;
-}
-
-.timepicker_nextWeekMark {
- background: url('../../images/spinelz/calendar_next.gif') no-repeat;;
- width: 16px;
- height: 16px;
- cursor: pointer;
- margin: 0 0 0 auto;
-}
-
-.timepicker_preMonthMark {
- background: url('../../images/spinelz/calendar_pre.gif') no-repeat;;
- width: 16px;
- height: 16px;
- cursor: pointer;
- margin-left: 16px;
-}
-
-.timepicker_preYearMark {
- background: url('../../images/spinelz/calendar_pre_second.gif') no-repeat;;
- width: 16px;
- height: 16px;
- cursor: pointer;
- float: left;
-}
-
-.timepicker_preWeekMark {
- background: url('../../images/spinelz/calendar_pre.gif') no-repeat;;
- width: 16px;
- height: 16px;
- cursor: pointer;
-}
-
-.timepicker_markHover {
- margin-left: 5px;
- margin-right: 5px;
- cursor: pointer;
- color: #FF8080;
- background-color: #E6E6FA;
-}
-
-.timepicker_ym {
- margin-left: 5px;
-}
-
-.timepicker_table {
- font-size: 12px;
- border-collapse: collapse;
- margin: 0;
- padding: 0;
- width: 100%;
- table-layout: fixed;
-}
-
-.timepicker_table TH {
- border-right: 1px solid #999999;
- border-bottom: 1px solid gray;
- text-align: center;
- background: url(../../images/spinelz/calender_back_second.gif) #FFFFFF;
- color: #4F4534;
- cursor: pointer;
- margin: 0;
- padding: 0;
- height: 24px;
-}
-
-.timepicker_table TH.right {
- border-right-style: none;
-}
-
-.timepicker_table TD {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- vertical-align: text-top;
- height: 100px;
- margin: 0;
- padding: 0;
-}
-
-.timepicker_table TD.right {
- border-right-style: none;
-}
-
-.timepicker_table TD.bottom {
- border-bottom-style: none;
-}
-
-.timepicker_date {
- cursor: pointer;
- color: #000000;
- background: #FFFFFF;
- font-weight: bold;
-}
-.timepicker_holidayContainer span {
- padding: 2px;
-}
-.timepicker_regularHoliday {
- cursor: pointer;
- background: #ededed;
- color: #285A94;
- font-weight: bold;
-}
-
-.timepicker_holiday {
- cursor: pointer;
- background-color: #dedede;
- color: #285A94;
- font-weight: bold;
- overflow: hidden;
-}
-
-.timepicker_schedule {
- cursor: pointer;
- background: url(../../images/spinelz/timepicker_schedule.gif) repeat-x;
- color: #285A94;
- font-weight: bold;
-}
-
-.timepicker_highlightDay {
- cursor: pointer;
- font-weight: bold;
- text-decoration: underline;
-}
-
-.timepicker_selected {
- background: #285A94;
- color: #ffffff;
-}
-
-.timepicker_dateContainer {
- width: 100%;
- overflow: hidden;
- height: 15px;
-}
-
-/*
-.timepicker_holidayContainer {
- width: 100%;
- overflow: hidden;
-}
-*/
-
-.timepicker_holidayName {
- margin-left: 10px;
-}
-
-.timepicker_schedule .timepicker_scheduleListContainer {
- color: #000000;
- margin-top: 5px;
-}
-
-.timepicker_selected .timepicker_scheduleListContainer {
- color: #FFFFFF;
- margin-top: 5px;
-}
-
-.timepicker_scheduleListContainer UL {
- list-style: square outside;
- font-weight: normal;
- padding: 0;
- margin: 0 0 0 15px;
-}
-
-.timepicker_scheduleItem {
- font-size: 10px;
-}
-
-.timepicker_scheduleItem DIV {
- overflow: hidden;
- font-size: 10px;
-}
-
-/* small size */
-.timepicker_small {
- border: 1px solid #999999;
- font-size: 13px;
- width: 175px;
- background: #FFFFFF;
- color: #4F4534;
-}
-
-.timepicker_timepicker_small {
- background: #FFFFFF;
- color: #4F4534;
- font-size: 11px;
-}
-
-.timepicker_header_small {
- background: url(../../images/spinelz/calender_back.gif) repeat-x;
- color: #4F4534;
- width: 100%;
- margin: 0;
- padding: 0;
- font-size: 11px;
- font-weight: bold;
- border-collapse: collapse;
- border-bottom: 1px solid #999999;
- height: 26px;
-}
-
-.timepicker_tableSmall {
- font-size: 11px;
- text-align: left;
- width: 100%;
- border-collapse: collapse;
- margin: 0 0 0 0;
- padding: 0;
- table-layout: fixed;
-}
-
-.timepicker_tableSmall TH {
- text-align: center;
- background: url(../../images/spinelz/calender_back_second.gif) #FFFFFF;
- color: #4F4534;
- width: 14%;
- cursor: pointer;
- margin: 0;
- padding: 0;
- height: 24px;
-}
-
-.timepicker_tableSmall TD {
- text-align: center;
- vertical-align: text-top;
- margin: 0;
- padding: 0;
- height: 20px;
- vertical-align: middle;
-}
-
-
-/* week */
-.timepicker_weekContainerTable {
- width: 100%;
- border-collapse: collapse;
- margin: 0;
- padding: 0;
- font-size: 11px;
-}
-
-.timepicker_weekContainerTable TH {
- background: url(../../images/spinelz/calender_back_second.gif) #FFFFFF;
- color: #4F4534;
- margin: 0;
- padding: 0;
- height: 24px;
-}
-
-.timepicker_weekContainerTable TD {
- margin: 0;
- padding: 0;
-}
-
-.timepicker_timeline {
- margin: 0;
- padding: 0;
- width: 25px;
-}
-
-.timepicker_timelineTimeTop {
- height: 23px;
- text-align: center;
-}
-
-.timepicker_timelineTime_ie {
- height: 27px;
- border-top: 1px solid #999999;
- text-align: center;
-}
-
-.timepicker_timelineTime_ieTop {
- height: 28px;
- border-top: 1px solid #999999;
- text-align: center;
-}
-
-.timepicker_timelineTime {
- height: 25px;
- border-top: 1px solid #999999;
- text-align: center;
-}
-
-.timepicker_headerColumn {
- border-left: 1px solid #999999;
- border-bottom: 1px solid #999999;
- height: 23px;
- overflow: hidden;
- cursor: pointer;
-}
-
-.timepicker_headerColumn a {
- position: relative;
- top: 4px;
-}
-
-.timepicker_columnTopDate {
- height: 12px;
- border-left: 1px solid #999999;
- cursor: pointer;
-}
-
-.timepicker_columnDate {
- height: 12px;
- border-top: 1px solid #999999;
- border-left: 1px solid #999999;
- cursor: pointer;
-}
-
-.timepicker_columnOddDate {
- height: 12px;
- border-top: 1px dashed #999999;
- border-left: 1px solid #999999;
- cursor: pointer;
-}
-
-.timepicker_scheduleItemSmall {
- font-size: 10px;
- height: 25px;
- width: 100%;
- background-color: #E6E6FA;
- position: absolute;
- left: 0;
- top: 0;
-/* opacity: 0.7; */
- z-index: 1000;
- overflow: hidden;
-}
-
-.timepicker_scheduleItemLarge {
- font-size: 10px;
- height: 17px;
- width: 100%;
- background-color: #E6E6FA;
- position: absolute;
- left: 0;
- top: 0;
- z-index: 1000;
- overflow: hidden;
- border: 2px solid #285A94;
- cursor: pointer;
-}
-
-.timepicker_scheduleItemNoBorder {
- padding-top: 2px;
- font-size: 10px;
- height: 16px;
- width: 100%;
- position: absolute;
- left: 0;
- top: 0;
- z-index: 1000;
- overflow: hidden;
- cursor: pointer;
-}
-
-.timepicker_scheduleItemNoBorder div {
- height: 16px;
-}
-
-.timepicker_scheduleItemSelect {
- border: 2px solid red;
-}
-
-/*
-.timepicker_detailItem UL {
- list-style: square outside;
- font-weight: normal;
- padding: 0;
- margin: 0 0 0 15px;
-}
-*/
-
-.timepicker_weekMainTable {
- width: 100%;
- border-collapse: collapse;
- margin: 0;
- padding: 0;
- font-size: 11px;
-}
-
-.timepicker_weekMainTable TH {
- background: url(../../images/spinelz/calender_back_second.gif) #FFFFFF;
- color: #4F4534;
- margin: 0;
- padding: 0;
- text-align: center;
-}
-
-.timepicker_weekMainTable TD {
- margin: 0;
- padding: 0;
-}
-
-.timepicker_weekScheduleContainer {
-}
-
-.timepicker_deleteImage {
- background: url(../../images/spinelz/timepicker_delete.gif) no-repeat;
- position: absolute;
- top: 0;
- right: 0;
- width: 16px;
- height: 16px;
- font-size: 5px;
- cursor: pointer;
-}
-
-.timepicker_privateImage {
- background: url(../../images/spinelz/timepicker_private_icon.gif) no-repeat;
- float: left;
- width: 16px;
- height: 16px;
- font-size: 5px;
-}
-
-.timepicker_selector {
- position: absolute;
- top: 0;
- left: 0;
- border: 2px solid #9b0f0f;
- background: #FFC0CB;
-}
-
-.timepicker_scheduleItemTimeArea {
- margin-right: 3px;
- font-size: 9px;
-}
-
-.timepicker_cover {
- width: 100%;
- height: 100px;
- position: absolute;
- left: 0;
- top: 0;
- z-index: 1000;
-}
-
-.timepicker_displayToggle {
- font-weight: normal;
-}
+.timepicker_container {\r
+ margin: 0;\r
+ padding: 0;\r
+ text-decoration: none;\r
+ text-transform: none;\r
+ text-indent: 0;\r
+ font-weight: normal;\r
+ font-size: 13px;\r
+ font-family: Verdana, monospace;\r
+ width: 150px;\r
+ background: #ffffff;\r
+ color: #4F4534;\r
+ border: 1px solid #999999;\r
+}\r
+\r
+/* header */\r
+.timepicker_scheduleHandler {\r
+ background: url('../../images/spinelz/calendar_default_handler.gif') no-repeat;\r
+ width: 16px;\r
+ height: 16px;\r
+ cursor: move;\r
+ float: left;\r
+}\r
+\r
+.timepicker_header {\r
+ background: url(../../images/spinelz/calender_back.gif) repeat-x;\r
+ color: #4F4534; \r
+ width: 100%;\r
+ height: 26px; \r
+ border-bottom: 1px solid #999999;\r
+ border-collapse: collapse;\r
+ font-size: 13px;\r
+ font-weight: bold; \r
+}\r
+\r
+.timepicker_preYears {\r
+ text-align: left;\r
+ width: 35px;\r
+}\r
+\r
+.timepicker_years {\r
+ text-align: center;\r
+}\r
+\r
+.timepicker_years span {\r
+ font-weight: bolder;\r
+ font-size: 105%;\r
+}\r
+\r
+.timepicker_nextYears {\r
+ text-align: right;\r
+ width: 35px;\r
+}\r
+\r
+.timepicker_nextMonthMark {\r
+ background: url('../../images/spinelz/calendar_next.gif') no-repeat;\r
+ width: 16px;\r
+ height: 16px;\r
+ cursor: pointer;\r
+ float: left;\r
+}\r
+\r
+.timepicker_nextYearMark {\r
+ background: url('../../images/spinelz/calendar_next_second.gif') no-repeat;;\r
+ width: 16px;\r
+ height: 16px;\r
+ cursor: pointer;\r
+ margin-left: 16px;\r
+}\r
+\r
+.timepicker_nextWeekMark {\r
+ background: url('../../images/spinelz/calendar_next.gif') no-repeat;;\r
+ width: 16px;\r
+ height: 16px;\r
+ cursor: pointer;\r
+ margin: 0 0 0 auto;\r
+}\r
+\r
+.timepicker_preMonthMark {\r
+ background: url('../../images/spinelz/calendar_pre.gif') no-repeat;;\r
+ width: 16px;\r
+ height: 16px;\r
+ cursor: pointer;\r
+ margin-left: 16px;\r
+}\r
+\r
+.timepicker_preYearMark {\r
+ background: url('../../images/spinelz/calendar_pre_second.gif') no-repeat;;\r
+ width: 16px;\r
+ height: 16px;\r
+ cursor: pointer;\r
+ float: left;\r
+}\r
+\r
+.timepicker_preWeekMark {\r
+ background: url('../../images/spinelz/calendar_pre.gif') no-repeat;;\r
+ width: 16px;\r
+ height: 16px;\r
+ cursor: pointer;\r
+}\r
+\r
+.timepicker_markHover {\r
+ margin-left: 5px;\r
+ margin-right: 5px;\r
+ cursor: pointer;\r
+ color: #FF8080;\r
+ background-color: #E6E6FA;\r
+}\r
+\r
+.timepicker_ym {\r
+ margin-left: 5px;\r
+}\r
+\r
+.timepicker_table {\r
+ font-size: 12px;\r
+ border-collapse: collapse;\r
+ margin: 0;\r
+ padding: 0;\r
+ width: 100%;\r
+ table-layout: fixed;\r
+}\r
+\r
+.timepicker_table TH {\r
+ border-right: 1px solid #999999;\r
+ border-bottom: 1px solid gray;\r
+ text-align: center;\r
+ background: url(../../images/spinelz/calender_back_second.gif) #FFFFFF;\r
+ color: #4F4534;\r
+ cursor: pointer;\r
+ margin: 0;\r
+ padding: 0;\r
+ height: 24px;\r
+}\r
+\r
+.timepicker_table TH.right {\r
+ border-right-style: none;\r
+}\r
+\r
+.timepicker_table TD {\r
+ border-right: 1px solid #999999;\r
+ border-bottom: 1px solid #999999;\r
+ vertical-align: text-top;\r
+ height: 100px;\r
+ margin: 0;\r
+ padding: 0;\r
+}\r
+\r
+.timepicker_table TD.right {\r
+ border-right-style: none;\r
+}\r
+\r
+.timepicker_table TD.bottom {\r
+ border-bottom-style: none;\r
+}\r
+\r
+.timepicker_date {\r
+ cursor: pointer;\r
+ color: #000000;\r
+ background: #FFFFFF;\r
+ font-weight: bold;\r
+}\r
+.timepicker_holidayContainer span {\r
+ padding: 2px;\r
+}\r
+.timepicker_regularHoliday {\r
+ cursor: pointer;\r
+ background: #ededed;\r
+ color: #285A94;\r
+ font-weight: bold;\r
+}\r
+\r
+.timepicker_holiday {\r
+ cursor: pointer;\r
+ background-color: #dedede;\r
+ color: #285A94;\r
+ font-weight: bold;\r
+ overflow: hidden;\r
+}\r
+\r
+.timepicker_schedule {\r
+ cursor: pointer;\r
+ background: url(../../images/spinelz/timepicker_schedule.gif) repeat-x;\r
+ color: #285A94;\r
+ font-weight: bold;\r
+}\r
+\r
+.timepicker_highlightDay {\r
+ cursor: pointer;\r
+ font-weight: bold;\r
+ text-decoration: underline;\r
+}\r
+\r
+.timepicker_selected {\r
+ background: #285A94;\r
+ color: #ffffff;\r
+}\r
+\r
+.timepicker_dateContainer {\r
+ width: 100%;\r
+ overflow: hidden;\r
+ height: 15px;\r
+}\r
+\r
+/*\r
+.timepicker_holidayContainer {\r
+ width: 100%;\r
+ overflow: hidden;\r
+}\r
+*/\r
+\r
+.timepicker_holidayName {\r
+ margin-left: 10px;\r
+}\r
+\r
+.timepicker_schedule .timepicker_scheduleListContainer {\r
+ color: #000000;\r
+ margin-top: 5px;\r
+}\r
+\r
+.timepicker_selected .timepicker_scheduleListContainer {\r
+ color: #FFFFFF;\r
+ margin-top: 5px;\r
+}\r
+\r
+.timepicker_scheduleListContainer UL {\r
+ list-style: square outside;\r
+ font-weight: normal;\r
+ padding: 0;\r
+ margin: 0 0 0 15px;\r
+}\r
+\r
+.timepicker_scheduleItem {\r
+ font-size: 10px;\r
+}\r
+\r
+.timepicker_scheduleItem DIV {\r
+ overflow: hidden;\r
+ font-size: 10px;\r
+}\r
+\r
+/* small size */\r
+.timepicker_small {\r
+ border: 1px solid #999999;\r
+ font-size: 13px;\r
+ width: 175px;\r
+ background: #FFFFFF;\r
+ color: #4F4534;\r
+}\r
+\r
+.timepicker_timepicker_small {\r
+ background: #FFFFFF;\r
+ color: #4F4534;\r
+ font-size: 11px;\r
+}\r
+\r
+.timepicker_header_small {\r
+ background: url(../../images/spinelz/calender_back.gif) repeat-x;\r
+ color: #4F4534;\r
+ width: 100%;\r
+ margin: 0;\r
+ padding: 0;\r
+ font-size: 11px;\r
+ font-weight: bold;\r
+ border-collapse: collapse; \r
+ border-bottom: 1px solid #999999;\r
+ height: 26px;\r
+}\r
+\r
+.timepicker_tableSmall {\r
+ font-size: 11px;\r
+ text-align: left;\r
+ width: 100%;\r
+ border-collapse: collapse;\r
+ margin: 0 0 0 0;\r
+ padding: 0;\r
+ table-layout: fixed;\r
+}\r
+\r
+.timepicker_tableSmall TH {\r
+ text-align: center;\r
+ background: url(../../images/spinelz/calender_back_second.gif) #FFFFFF;\r
+ color: #4F4534;\r
+ width: 14%;\r
+ cursor: pointer;\r
+ margin: 0;\r
+ padding: 0;\r
+ height: 24px;\r
+}\r
+\r
+.timepicker_tableSmall TD {\r
+ text-align: center;\r
+ vertical-align: text-top;\r
+ margin: 0;\r
+ padding: 0;\r
+ height: 20px;\r
+ vertical-align: middle;\r
+}\r
+\r
+\r
+/* week */\r
+.timepicker_weekContainerTable {\r
+ width: 100%;\r
+ border-collapse: collapse;\r
+ margin: 0;\r
+ padding: 0;\r
+ font-size: 11px;\r
+}\r
+\r
+.timepicker_weekContainerTable TH {\r
+ background: url(../../images/spinelz/calender_back_second.gif) #FFFFFF;\r
+ color: #4F4534;\r
+ margin: 0;\r
+ padding: 0;\r
+ height: 24px;\r
+}\r
+\r
+.timepicker_weekContainerTable TD {\r
+ margin: 0;\r
+ padding: 0;\r
+}\r
+\r
+.timepicker_timeline {\r
+ margin: 0;\r
+ padding: 0;\r
+ width: 25px;\r
+}\r
+\r
+.timepicker_timelineTimeTop {\r
+ height: 23px;\r
+ text-align: center;\r
+}\r
+\r
+.timepicker_timelineTime_ie {\r
+ height: 27px;\r
+ border-top: 1px solid #999999;\r
+ text-align: center;\r
+}\r
+\r
+.timepicker_timelineTime_ieTop {\r
+ height: 28px;\r
+ border-top: 1px solid #999999;\r
+ text-align: center;\r
+}\r
+\r
+.timepicker_timelineTime {\r
+ height: 25px;\r
+ border-top: 1px solid #999999;\r
+ text-align: center;\r
+}\r
+\r
+.timepicker_headerColumn {\r
+ border-left: 1px solid #999999;\r
+ border-bottom: 1px solid #999999;\r
+ height: 23px;\r
+ overflow: hidden;\r
+ cursor: pointer;\r
+}\r
+\r
+.timepicker_headerColumn a {\r
+ position: relative;\r
+ top: 4px;\r
+}\r
+\r
+.timepicker_columnTopDate {\r
+ height: 12px;\r
+ border-left: 1px solid #999999;\r
+ cursor: pointer;\r
+}\r
+\r
+.timepicker_columnDate {\r
+ height: 12px;\r
+ border-top: 1px solid #999999;\r
+ border-left: 1px solid #999999;\r
+ cursor: pointer;\r
+}\r
+\r
+.timepicker_columnOddDate {\r
+ height: 12px;\r
+ border-top: 1px dashed #999999;\r
+ border-left: 1px solid #999999;\r
+ cursor: pointer;\r
+}\r
+\r
+.timepicker_scheduleItemSmall {\r
+ font-size: 10px;\r
+ height: 25px;\r
+ width: 100%;\r
+ background-color: #E6E6FA; \r
+ position: absolute;\r
+ left: 0;\r
+ top: 0;\r
+/* opacity: 0.7; */\r
+ z-index: 1000;\r
+ overflow: hidden;\r
+}\r
+\r
+.timepicker_scheduleItemLarge {\r
+ font-size: 10px;\r
+ height: 17px;\r
+ width: 100%;\r
+ background-color: #E6E6FA; \r
+ position: absolute;\r
+ left: 0;\r
+ top: 0;\r
+ z-index: 1000;\r
+ overflow: hidden;\r
+ border: 2px solid #285A94;\r
+ cursor: pointer;\r
+}\r
+\r
+.timepicker_scheduleItemNoBorder {\r
+ padding-top: 2px;\r
+ font-size: 10px;\r
+ height: 16px;\r
+ width: 100%;\r
+ position: absolute;\r
+ left: 0;\r
+ top: 0;\r
+ z-index: 1000;\r
+ overflow: hidden;\r
+ cursor: pointer;\r
+}\r
+\r
+.timepicker_scheduleItemNoBorder div {\r
+ height: 16px;\r
+}\r
+\r
+.timepicker_scheduleItemSelect {\r
+ border: 2px solid red;\r
+}\r
+\r
+/*\r
+.timepicker_detailItem UL {\r
+ list-style: square outside;\r
+ font-weight: normal;\r
+ padding: 0;\r
+ margin: 0 0 0 15px;\r
+}\r
+*/\r
+\r
+.timepicker_weekMainTable {\r
+ width: 100%;\r
+ border-collapse: collapse;\r
+ margin: 0;\r
+ padding: 0;\r
+ font-size: 11px;\r
+}\r
+\r
+.timepicker_weekMainTable TH {\r
+ background: url(../../images/spinelz/calender_back_second.gif) #FFFFFF;\r
+ color: #4F4534;\r
+ margin: 0;\r
+ padding: 0;\r
+ text-align: center;\r
+}\r
+\r
+.timepicker_weekMainTable TD {\r
+ margin: 0;\r
+ padding: 0;\r
+}\r
+\r
+.timepicker_weekScheduleContainer {\r
+}\r
+\r
+.timepicker_deleteImage {\r
+ background: url(../../images/spinelz/timepicker_delete.gif) no-repeat;\r
+ position: absolute;\r
+ top: 0;\r
+ right: 0;\r
+ width: 16px;\r
+ height: 16px;\r
+ font-size: 5px;\r
+ cursor: pointer;\r
+}\r
+\r
+.timepicker_privateImage {\r
+ background: url(../../images/spinelz/timepicker_private_icon.gif) no-repeat;\r
+ float: left;\r
+ width: 16px;\r
+ height: 16px;\r
+ font-size: 5px;\r
+}\r
+\r
+.timepicker_selector {\r
+ position: absolute;\r
+ top: 0;\r
+ left: 0;\r
+ border: 2px solid #9b0f0f;\r
+ background: #FFC0CB;\r
+}\r
+\r
+.timepicker_scheduleItemTimeArea {\r
+ margin-right: 3px;\r
+ font-size: 9px;\r
+}\r
+\r
+.timepicker_cover {\r
+ width: 100%;\r
+ height: 100px;\r
+ position: absolute;\r
+ left: 0;\r
+ top: 0;\r
+ z-index: 1000;\r
+}\r
+\r
+.timepicker_displayToggle {\r
+ font-weight: normal;\r
+}\r
-.toolbar_container {
- position: relative;
- height: 25px;
-}
-
-.toolbar_containerLeft {
- background-repeat:no-repeat;
- background-image:url('../../images/spinelz/toolbar_left.gif');
- position:absolute;
- left:0px;
- height: 25px;
- width: 2px;
-}
-
-.toolbar_containerMiddle {
- height: 25px;
- background-repeat:repeat-x;
- background-image:url('../../images/spinelz/toolbar_middle.gif');
- margin-left: 2px;
- margin-right: 3px;
- padding-top: 2px;
-}
-
-.toolbar_containerRight {
- background-repeat: no-repeat;
- background-image: url('../../images/spinelz/toolbar_right.gif');
- position:absolute;
- top: 0px;
- right:0px;
- height: 25px;
- width: 3px;
-}
-
-.toolbar_item {
- position:relative;
- margin-right:3px;
- height:20px;
- padding: 1px;
- float:left;
-}
-
-.toolbar_itemHov {
- position:relative;
- margin-right:3px;
- height:20px;
- padding: 0px;
- float:left;
- border: 1px solid #b9cfd8;
-}
-
-.toolbar_itemPres {
- position:relative;
- margin-right:3px;
- height:20px;
- padding: 0px;
- float:left;
- border-width: 1px;
- border-style: solid;
- border-color: #b9cfd8 #ffffff #ffffff #b9cfd8;
-}
-
-.toolbar_content {
- position:relative;
- height: 18px;
- font-size:11px;
- padding: 2px 5px 0 5px;
- overflow: hidden;
- cursor: pointer;
- float: left;
-}
-
-.toolbar_contentPres {
- position:relative;
- height: 18px;
- font-size:0px;
- padding: 2px 5px 0 5px;
- overflow: hidden;
- cursor: pointer;
- float: left;
- background-color: #ffffff;
- color: #000000;
-}
+.toolbar_container {\r
+ position: relative;\r
+ height: 25px;\r
+}\r
+\r
+.toolbar_containerLeft {\r
+ background-repeat:no-repeat;\r
+ background-image:url('../../images/spinelz/toolbar_left.gif');\r
+ position:absolute;\r
+ left:0px;\r
+ height: 25px; \r
+ width: 2px; \r
+}\r
+\r
+.toolbar_containerMiddle {\r
+ height: 25px; \r
+ background-repeat:repeat-x;\r
+ background-image:url('../../images/spinelz/toolbar_middle.gif');\r
+ margin-left: 2px;\r
+ margin-right: 3px;\r
+ padding-top: 2px;\r
+}\r
+\r
+.toolbar_containerRight {\r
+ background-repeat: no-repeat;\r
+ background-image: url('../../images/spinelz/toolbar_right.gif');\r
+ position:absolute;\r
+ top: 0px;\r
+ right:0px;\r
+ height: 25px; \r
+ width: 3px;\r
+}\r
+\r
+.toolbar_item {\r
+ position:relative;\r
+ margin-right:3px;\r
+ height:20px;\r
+ padding: 1px;\r
+ float:left;\r
+}\r
+\r
+.toolbar_itemHov {\r
+ position:relative;\r
+ margin-right:3px;\r
+ height:20px;\r
+ padding: 0px;\r
+ float:left;\r
+ border: 1px solid #b9cfd8; \r
+}\r
+\r
+.toolbar_itemPres {\r
+ position:relative;\r
+ margin-right:3px;\r
+ height:20px;\r
+ padding: 0px;\r
+ float:left;\r
+ border-width: 1px;\r
+ border-style: solid;\r
+ border-color: #b9cfd8 #ffffff #ffffff #b9cfd8; \r
+}\r
+\r
+.toolbar_content {\r
+ position:relative;\r
+ height: 18px;\r
+ font-size:11px;\r
+ padding: 2px 5px 0 5px;\r
+ overflow: hidden;\r
+ cursor: pointer;\r
+ float: left;\r
+}\r
+\r
+.toolbar_contentPres {\r
+ position:relative;\r
+ height: 18px;\r
+ font-size:0px;\r
+ padding: 2px 5px 0 5px;\r
+ overflow: hidden;\r
+ cursor: pointer;\r
+ float: left;\r
+ background-color: #ffffff;\r
+ color: #000000;\r
+}\r
-.treeview {
- list-style: none outside;
- font-size: 12px;
-}
-
-.treeview_dir {
- margin-top: 2px;
- height: auto;
- width: auto;
-}
-
-.treeview_dirBody {
- cursor: pointer;
- height: 15px;
- width: auto;
-}
-
-.treeview_dirBodyText {
- background-color: #FFFFFF;
- color: black;
-}
-
-.treeview_dirBodyTextActive {
- background-color: #becfeb;
- color: black;
-}
-
-.treeview_dirContainerHover {
- background-color: #becfeb;
-}
-
-.treeview_dirContainer {
- list-style: none outside;
- padding: 1px 0 3px 20px;
- margin: 0px;
- height: auto;
- width: auto;
-}
-
-.treeview_file {
- margin-top: 2px;
- margin-left: 17px;
-/* position: relative; */
-/* top: 0px; */
-/* left: 0px; */
-}
-
-.treeview_fileBody {
- height: 15px;
- cursor: pointer;
-}
-
-.treeview_fileBodyText {
- background-color: #FFFFFF;
- color: black;
-}
-
-.treeview_fileBodyTextActive {
- background-color: #becfeb;
- color: black;
-}
-
-.treeview_stateEmpty {
- float: left;
- background-image: url(../../images/spinelz/treeview_state.gif);
- background-repeat: no-repeat;
- cursor: pointer;
- height: 11px;
- width: 11px;
- margin-right: 5px;
- background-position: 0px -22px;
- overflow: hidden;
-}
-
-.treeview_stateClose {
- float: left;
- background-image: url(../../images/spinelz/treeview_state.gif);
- background-repeat: no-repeat;
- cursor: pointer;
- height: 11px;
- width: 11px;
- margin-right: 5px;
- background-position: 0px -11px;
- overflow: hidden;
-}
-
-.treeview_stateOpen {
- float: left;
- background-image: url(../../images/spinelz/treeview_state.gif);
- background-repeat: no-repeat;
- cursor: pointer;
- height: 11px;
- width: 11px;
- margin-right: 5px;
- background-position: 0px 0px;
- overflow: hidden;
-}
-
-.treeview_dirIcon {
- float: left;
- background-image: url(../../images/spinelz/treeview_dir.gif);
- background-repeat: no-repeat;
- cursor: pointer;
- height: 16px;
- width: 16px;
- margin-right: 5px;
- background-position: 0px 0px;
- overflow: hidden;
-}
-
-.treeview_fileIcon {
- float: left;
- background-image: url(../../images/spinelz/treeview_file.gif);
- background-repeat: no-repeat;
- cursor: pointer;
- height: 16px;
- width: 16px;
- margin-right: 2px;
- background-position: 0px 0px;
- overflow: hidden;
-}
+.treeview {\r
+ list-style: none outside;\r
+ font-size: 12px;\r
+}\r
+\r
+.treeview_dir {\r
+ margin-top: 2px;\r
+ height: auto;\r
+ width: auto;\r
+}\r
+\r
+.treeview_dirBody {\r
+ cursor: pointer;\r
+ height: 15px;\r
+ width: auto;\r
+}\r
+\r
+.treeview_dirBodyText {\r
+ background-color: #FFFFFF;\r
+ color: black;\r
+}\r
+\r
+.treeview_dirBodyTextActive {\r
+ background-color: #becfeb;\r
+ color: black;\r
+}\r
+\r
+.treeview_dirContainerHover {\r
+ background-color: #becfeb; \r
+}\r
+\r
+.treeview_dirContainer {\r
+ list-style: none outside;\r
+ padding: 1px 0 3px 20px;\r
+ margin: 0px;\r
+ height: auto;\r
+ width: auto;\r
+}\r
+\r
+.treeview_file {\r
+ margin-top: 2px;\r
+ margin-left: 17px;\r
+/* position: relative; */\r
+/* top: 0px; */\r
+/* left: 0px; */\r
+}\r
+\r
+.treeview_fileBody {\r
+ height: 15px;\r
+ cursor: pointer;\r
+}\r
+\r
+.treeview_fileBodyText {\r
+ background-color: #FFFFFF;\r
+ color: black;\r
+}\r
+\r
+.treeview_fileBodyTextActive {\r
+ background-color: #becfeb;\r
+ color: black;\r
+}\r
+\r
+.treeview_stateEmpty {\r
+ float: left;\r
+ background-image: url(../../images/spinelz/treeview_state.gif);\r
+ background-repeat: no-repeat;\r
+ cursor: pointer; \r
+ height: 11px;\r
+ width: 11px;\r
+ margin-right: 5px;\r
+ background-position: 0px -22px;\r
+ overflow: hidden;\r
+}\r
+\r
+.treeview_stateClose {\r
+ float: left;\r
+ background-image: url(../../images/spinelz/treeview_state.gif);\r
+ background-repeat: no-repeat;\r
+ cursor: pointer; \r
+ height: 11px;\r
+ width: 11px;\r
+ margin-right: 5px;\r
+ background-position: 0px -11px;\r
+ overflow: hidden;\r
+}\r
+\r
+.treeview_stateOpen {\r
+ float: left;\r
+ background-image: url(../../images/spinelz/treeview_state.gif);\r
+ background-repeat: no-repeat;\r
+ cursor: pointer; \r
+ height: 11px;\r
+ width: 11px;\r
+ margin-right: 5px;\r
+ background-position: 0px 0px;\r
+ overflow: hidden;\r
+}\r
+\r
+.treeview_dirIcon {\r
+ float: left;\r
+ background-image: url(../../images/spinelz/treeview_dir.gif);\r
+ background-repeat: no-repeat;\r
+ cursor: pointer; \r
+ height: 16px;\r
+ width: 16px;\r
+ margin-right: 5px;\r
+ background-position: 0px 0px;\r
+ overflow: hidden;\r
+}\r
+\r
+.treeview_fileIcon {\r
+ float: left;\r
+ background-image: url(../../images/spinelz/treeview_file.gif);\r
+ background-repeat: no-repeat;\r
+ cursor: pointer; \r
+ height: 16px;\r
+ width: 16px;\r
+ margin-right: 2px;\r
+ background-position: 0px 0px;\r
+ overflow: hidden;\r
+}\r
-.window {
- position: absolute;
- margin: 0;
- padding: 0;
- text-decoration: none;
- text-transform: none;
- text-indent: 0;
- font-weight: normal;
-}
-
-.window_header{
- width: 100%;
- height: 45px;
- position: relative;
-}
-
-.window_headerLeft{
- width: 30px;
- height: 45px;
- top: 0;
- position: absolute;
- left: 0;
- background: url('../../images/spinelz/window_top_left.gif') no-repeat;
-}
-
-.window_headerMiddle{
- height: 45px;
- top: 0;
- margin: 0 30px;
- background: url('../../images/spinelz/window_top_middle.gif') repeat-x;
- cursor: move;
- line-height: 3.0em;
- overflow: hidden;
-}
-
-.window_headerRight{
- width: 30px;
- height: 45px;
- top: 0;
- position: absolute;
- right: 0;
- background: url('../../images/spinelz/window_top_right.gif') no-repeat;
-}
-
-.window_buttonHolder{
- width: 60px;
- height: 16px;
- position: absolute;
- top: 0;
- right: 32px;
- margin-top: 10px;
-}
-
-.window_closeButton{
- float: right;
- overflow: hidden;
- font-size: 5px;
- width: 16px;
- height: 16px;
- background: url('../../images/spinelz/window_close.gif') no-repeat;
- cursor:pointer;
-}
-
-.window_maxButton{
- float: right;
- overflow: hidden;
- cursor: pointer;
- width: 16px;
- height: 16px;
- background: url('../../images/spinelz/window_max.gif') no-repeat;
-}
-
-.window_minButton{
- float: right;
- overflow: hidden;
- cursor: pointer;
- width: 16px;
- height: 16px;
- background: url('../../images/spinelz/window_min.gif') no-repeat;
-}
-
-.window_body{
- width: 100%;
- background: transparent;
- color: #000000;
- position: relative;
-}
-
-.window_bodyLeft{
- top: 0;
- width: 30px;
- position: absolute;
- left: 0;
- background: url('../../images/spinelz/window_middle_left.gif') repeat-y;
-}
-
-.window_bodyMiddle{
- top: 0;
- position: relative;
- margin: 0 30px;
- background: #fff;
- color: #000000;
- overflow: auto;
-}
-
-.window_bodyRight{
- top: 0;
- width: 30px;
- position: absolute;
- right: 0;
- background: url('../../images/spinelz/window_middle_right.gif') repeat-y;
-}
-
-.window_bottom{
- width: 100%;
- height: 35px;
- position: relative;
-}
-
-.window_bottomLeft{
- width: 30px;
- height: 35px;
- position: absolute;
- left: 0;
- background: url('../../images/spinelz/window_bottom_left.gif') no-repeat;
-}
-
-.window_bottomMiddle{
- height: 35px;
- margin: 0 30px;
- background: url('../../images/spinelz/window_bottom_middle.gif') repeat-x;
-}
-
-.window_bottomRight{
- width: 30px;
- height: 35px;
- position: absolute;
- top: 0;
- right: 0;
- background: url('../../images/spinelz/window_bottom_right.gif') no-repeat;
-}
+.window {\r
+ position: absolute;\r
+ margin: 0;\r
+ padding: 0;\r
+ text-decoration: none;\r
+ text-transform: none;\r
+ text-indent: 0;\r
+ font-weight: normal;\r
+}\r
+\r
+.window_header{\r
+ width: 100%;\r
+ height: 45px;\r
+ position: relative;\r
+}\r
+\r
+.window_headerLeft{\r
+ width: 30px;\r
+ height: 45px;\r
+ top: 0;\r
+ position: absolute;\r
+ left: 0;\r
+ background: url('../../images/spinelz/window_top_left.gif') no-repeat;\r
+}\r
+\r
+.window_headerMiddle{\r
+ height: 45px;\r
+ top: 0;\r
+ margin: 0 30px;\r
+ background: url('../../images/spinelz/window_top_middle.gif') repeat-x;\r
+ cursor: move;\r
+ line-height: 3.0em;\r
+ overflow: hidden;\r
+}\r
+\r
+.window_headerRight{\r
+ width: 30px;\r
+ height: 45px;\r
+ top: 0;\r
+ position: absolute;\r
+ right: 0;\r
+ background: url('../../images/spinelz/window_top_right.gif') no-repeat;\r
+}\r
+\r
+.window_buttonHolder{\r
+ width: 60px;\r
+ height: 16px;\r
+ position: absolute;\r
+ top: 0;\r
+ right: 32px;\r
+ margin-top: 10px;\r
+}\r
+\r
+.window_closeButton{\r
+ float: right;\r
+ overflow: hidden;\r
+ font-size: 5px;\r
+ width: 16px;\r
+ height: 16px;\r
+ background: url('../../images/spinelz/window_close.gif') no-repeat;\r
+ cursor:pointer;\r
+}\r
+\r
+.window_maxButton{\r
+ float: right;\r
+ overflow: hidden;\r
+ cursor: pointer;\r
+ width: 16px;\r
+ height: 16px;\r
+ background: url('../../images/spinelz/window_max.gif') no-repeat;\r
+}\r
+\r
+.window_minButton{\r
+ float: right;\r
+ overflow: hidden;\r
+ cursor: pointer;\r
+ width: 16px;\r
+ height: 16px;\r
+ background: url('../../images/spinelz/window_min.gif') no-repeat;\r
+}\r
+\r
+.window_body{\r
+ width: 100%;\r
+ background: transparent;\r
+ color: #000000;\r
+ position: relative;\r
+}\r
+\r
+.window_bodyLeft{\r
+ top: 0;\r
+ width: 30px;\r
+ position: absolute;\r
+ left: 0;\r
+ background: url('../../images/spinelz/window_middle_left.gif') repeat-y;\r
+}\r
+\r
+.window_bodyMiddle{\r
+ top: 0;\r
+ position: relative;\r
+ margin: 0 30px;\r
+ background: #fff;\r
+ color: #000000;\r
+ overflow: auto;\r
+}\r
+\r
+.window_bodyRight{\r
+ top: 0;\r
+ width: 30px;\r
+ position: absolute;\r
+ right: 0;\r
+ background: url('../../images/spinelz/window_middle_right.gif') repeat-y;\r
+}\r
+\r
+.window_bottom{\r
+ width: 100%;\r
+ height: 35px;\r
+ position: relative;\r
+}\r
+\r
+.window_bottomLeft{\r
+ width: 30px;\r
+ height: 35px;\r
+ position: absolute;\r
+ left: 0;\r
+ background: url('../../images/spinelz/window_bottom_left.gif') no-repeat;\r
+}\r
+\r
+.window_bottomMiddle{\r
+ height: 35px;\r
+ margin: 0 30px;\r
+ background: url('../../images/spinelz/window_bottom_middle.gif') repeat-x;\r
+}\r
+\r
+.window_bottomRight{\r
+ width: 30px;\r
+ height: 35px;\r
+ position: absolute;\r
+ top: 0;\r
+ right: 0;\r
+ background: url('../../images/spinelz/window_bottom_right.gif') no-repeat;\r
+}\r
-body { background-color: #fff; color: #333; }
-
-body, p, ol, ul, td {
- font-family: verdana, arial, helvetica, sans-serif;
- font-size: 13px;
- line-height: 18px;
-}
-
-pre {
- background-color: #eee;
- padding: 10px;
- font-size: 11px;
-}
-
-a { color: #000; }
-a:visited { color: #666; }
-a:hover { color: #fff; background-color:#000; }
-
-ul.menu {
- list-style-type: none;
-}
-
-ul.menu li {
- float: left;
- background-color: white;
- margin-left: 10px;
- border: 1px solid black;
- padding: 2px;
-}
-
-div.tabpanel div.tab-row li {
- margin: 0;
- padding: 0;
- display: inline;
- list-style-type: none;
-}
-
-div.tabpanel div.tab-row a:link,
- div.tabpanel div.tab-row a:visited {
- float: left;
- background: #f3f3f3;
- font-size: 12px;
- line-height: 14px;
- font-weight: bold;
- padding: 2px 10px 2px 10px;
- margin-right: 4px;
- border: 1px solid #ccc;
- text-decoration: none;
- color: #666;
-}
-
-div.tabpanel div.tab-row li.selected a:link,
- div.tabpanel div.tab-row a:visited.active {
- border-bottom: 1px solid #fff;
- background: #fff;
- color: #000;
-}
-
-div.tabpanel div.tab-row a:hover {
- background: #fff;
+body { background-color: #fff; color: #333; }\r
+\r
+body, p, ol, ul, td {\r
+ font-family: verdana, arial, helvetica, sans-serif;\r
+ font-size: 13px;\r
+ line-height: 18px;\r
+}\r
+\r
+pre {\r
+ background-color: #eee;\r
+ padding: 10px;\r
+ font-size: 11px;\r
+}\r
+\r
+a { color: #000; }\r
+a:visited { color: #666; }\r
+a:hover { color: #fff; background-color:#000; }\r
+\r
+ul.menu {\r
+ list-style-type: none; \r
+}\r
+\r
+ul.menu li {\r
+ float: left;\r
+ background-color: white;\r
+ margin-left: 10px;\r
+ border: 1px solid black;\r
+ padding: 2px;\r
+}\r
+\r
+div.tabpanel div.tab-row li {\r
+ margin: 0;\r
+ padding: 0;\r
+ display: inline;\r
+ list-style-type: none;\r
+}\r
+\r
+div.tabpanel div.tab-row a:link,\r
+ div.tabpanel div.tab-row a:visited {\r
+ float: left;\r
+ background: #f3f3f3;\r
+ font-size: 12px;\r
+ line-height: 14px;\r
+ font-weight: bold;\r
+ padding: 2px 10px 2px 10px;\r
+ margin-right: 4px;\r
+ border: 1px solid #ccc;\r
+ text-decoration: none;\r
+ color: #666;\r
+}\r
+\r
+div.tabpanel div.tab-row li.selected a:link,\r
+ div.tabpanel div.tab-row a:visited.active {\r
+ border-bottom: 1px solid #fff;\r
+ background: #fff;\r
+ color: #000;\r
+}\r
+\r
+div.tabpanel div.tab-row a:hover {\r
+ background: #fff;\r
}
\ No newline at end of file
-# A default log4j configuration for log4j users.
-#
-# To use this configuration, deploy it into your application's WEB-INF/classes
-# directory. You are also encouraged to edit it as you like.
-
-# Configure the console as our one appender
-log4j.appender.A1=org.apache.log4j.ConsoleAppender
-log4j.appender.A1.layout=org.apache.log4j.PatternLayout
-log4j.appender.A1.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p [%c] - %m%n
-
-# tighten logging on the DataNucleus Categories
-log4j.category.DataNucleus.JDO=WARN, A1
-log4j.category.DataNucleus.Persistence=WARN, A1
-log4j.category.DataNucleus.Cache=WARN, A1
-log4j.category.DataNucleus.MetaData=WARN, A1
-log4j.category.DataNucleus.General=WARN, A1
-log4j.category.DataNucleus.Utility=WARN, A1
-log4j.category.DataNucleus.Transaction=WARN, A1
-log4j.category.DataNucleus.Datastore=WARN, A1
-log4j.category.DataNucleus.ClassLoading=WARN, A1
-log4j.category.DataNucleus.Plugin=WARN, A1
-log4j.category.DataNucleus.ValueGeneration=WARN, A1
-log4j.category.DataNucleus.Enhancer=WARN, A1
-log4j.category.DataNucleus.SchemaTool=WARN, A1
+# A default log4j configuration for log4j users.\r
+#\r
+# To use this configuration, deploy it into your application's WEB-INF/classes\r
+# directory. You are also encouraged to edit it as you like.\r
+\r
+# Configure the console as our one appender\r
+log4j.appender.A1=org.apache.log4j.ConsoleAppender\r
+log4j.appender.A1.layout=org.apache.log4j.PatternLayout\r
+log4j.appender.A1.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p [%c] - %m%n\r
+\r
+# tighten logging on the DataNucleus Categories\r
+log4j.category.DataNucleus.JDO=WARN, A1\r
+log4j.category.DataNucleus.Persistence=WARN, A1\r
+log4j.category.DataNucleus.Cache=WARN, A1\r
+log4j.category.DataNucleus.MetaData=WARN, A1\r
+log4j.category.DataNucleus.General=WARN, A1\r
+log4j.category.DataNucleus.Utility=WARN, A1\r
+log4j.category.DataNucleus.Transaction=WARN, A1\r
+log4j.category.DataNucleus.Datastore=WARN, A1\r
+log4j.category.DataNucleus.ClassLoading=WARN, A1\r
+log4j.category.DataNucleus.Plugin=WARN, A1\r
+log4j.category.DataNucleus.ValueGeneration=WARN, A1\r
+log4j.category.DataNucleus.Enhancer=WARN, A1\r
+log4j.category.DataNucleus.SchemaTool=WARN, A1\r
-<?xml version="1.0" encoding="utf-8"?>
-<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
- <application></application>
- <version>1</version>
-
- <!-- Configure java.util.logging -->
- <system-properties>
- <property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
- </system-properties>
-
- <sessions-enabled>true</sessions-enabled>
-
+<?xml version="1.0" encoding="utf-8"?>\r
+<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">\r
+ <application></application>\r
+ <version>1</version>\r
+ \r
+ <!-- Configure java.util.logging -->\r
+ <system-properties>\r
+ <property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>\r
+ </system-properties>\r
+ \r
+ <sessions-enabled>true</sessions-enabled>\r
+ \r
</appengine-web-app>
\ No newline at end of file
-<?xml version="1.0" encoding="utf-8"?>
-<jdoconfig xmlns="http://java.sun.com/xml/ns/jdo/jdoconfig"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:noNamespaceSchemaLocation="http://java.sun.com/xml/ns/jdo/jdoconfig">
-
- <persistence-manager-factory name="transactions-optional">
- <property name="javax.jdo.PersistenceManagerFactoryClass"
- value="org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManagerFactory"/>
- <property name="javax.jdo.option.ConnectionURL" value="appengine"/>
- <property name="javax.jdo.option.NontransactionalRead" value="true"/>
- <property name="javax.jdo.option.NontransactionalWrite" value="true"/>
- <property name="javax.jdo.option.RetainValues" value="true"/>
- <property name="datanucleus.appengine.autoCreateDatastoreTxns" value="true"/>
- </persistence-manager-factory>
-</jdoconfig>
+<?xml version="1.0" encoding="utf-8"?>\r
+<jdoconfig xmlns="http://java.sun.com/xml/ns/jdo/jdoconfig"\r
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\r
+ xsi:noNamespaceSchemaLocation="http://java.sun.com/xml/ns/jdo/jdoconfig">\r
+\r
+ <persistence-manager-factory name="transactions-optional">\r
+ <property name="javax.jdo.PersistenceManagerFactoryClass"\r
+ value="org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManagerFactory"/>\r
+ <property name="javax.jdo.option.ConnectionURL" value="appengine"/>\r
+ <property name="javax.jdo.option.NontransactionalRead" value="true"/>\r
+ <property name="javax.jdo.option.NontransactionalWrite" value="true"/>\r
+ <property name="javax.jdo.option.RetainValues" value="true"/>\r
+ <property name="datanucleus.appengine.autoCreateDatastoreTxns" value="true"/>\r
+ </persistence-manager-factory>\r
+</jdoconfig>\r
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
- <link rel="stylesheet" type="text/css" href="layout/style.css">
- <title></title>
- </head>
- <body>
- <div id="header">
- <h1>マンガネットワーク</h1>
- </div>
- <p />
- <div id="menu">
- <ul class="menu">
- <li><a href="/UserListPage">ユーザマスタ管理</a></li>
- <li>グループマスタ管理</li>
- <li>マンガマスタ管理</li>
- </ul>
- <p style="clear: both;"/>
- </div>
- <hr style="border: #00306b 1px solid;"/>
- <div id="body">
- <wicket:child />
- </div>
- <p/>
- <div id="footer">
- <span style="text-align: center;">powered by Wicket</span>
- </div>
- </body>
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"\r
+ "http://www.w3.org/TR/html4/loose.dtd">\r
+<html>\r
+ <head>\r
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">\r
+ <link rel="stylesheet" type="text/css" href="layout/style.css">\r
+ <title></title>\r
+ </head>\r
+ <body>\r
+ <div id="header">\r
+ <h1>マンガネットワーク</h1>\r
+ </div>\r
+ <p />\r
+ <div id="menu">\r
+ <ul class="menu">\r
+ <li><a href="/UserListPage">ユーザマスタ管理</a></li>\r
+ <li>グループマスタ管理</li>\r
+ <li>マンガマスタ管理</li>\r
+ </ul>\r
+ <p style="clear: both;"/>\r
+ </div>\r
+ <hr style="border: #00306b 1px solid;"/>\r
+ <div id="body"> \r
+ <wicket:child />\r
+ </div>\r
+ <p/>\r
+ <div id="footer">\r
+ <span style="text-align: center;">powered by Wicket</span>\r
+ </div>\r
+ </body>\r
</html>
\ No newline at end of file
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
- <wicket:link>
- <link rel="stylesheet" type="text/css" href="stylesheets/style.css">
- </wicket:link>
- <title></title>
- </head>
- <body>
- <div id="feedback" wicket:id="feedback" />
- <div id="header">
- <h1>マンガネットワーク</h1>
- </div>
- <div id="body">
- <wicket:child />
- </div>
- <p/>
- <div id="footer">
- <span style="text-align: center;">powered by Wicket</span>
- </div>
- </body>
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"\r
+ "http://www.w3.org/TR/html4/loose.dtd">\r
+<html>\r
+ <head>\r
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">\r
+ <wicket:link>\r
+ <link rel="stylesheet" type="text/css" href="stylesheets/style.css">\r
+ </wicket:link>\r
+ <title></title>\r
+ </head>\r
+ <body>\r
+ <div id="feedback" wicket:id="feedback" />\r
+ <div id="header">\r
+ <h1>マンガネットワーク</h1>\r
+ </div>\r
+ <div id="body"> \r
+ <wicket:child />\r
+ </div>\r
+ <p/>\r
+ <div id="footer">\r
+ <span style="text-align: center;">powered by Wicket</span>\r
+ </div>\r
+ </body>\r
</html>
\ No newline at end of file
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-<body>
- <wicket:extend>
- Home
- <span wicket:id="label" />
- </wicket:extend>
-</body>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"\r
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
+\r
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<body>\r
+ <wicket:extend>\r
+ Home\r
+ <span wicket:id="label" />\r
+ </wicket:extend>\r
+</body>\r
</html>
\ No newline at end of file
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-<body>
- <wicket:extend>
-
- <form wicket:id="form">
- <table border="0">
- <tr>
- <td>ユーザ名</td>
- <td><input type="text" wicket:id="userName" /></td>
- </tr>
- <tr>
- <td>パスワード</td>
- <td><input type="password" wicket:id="password" /></td>
- </tr>
- <tr>
- <td colspan="2"><input type="submit" value="ログイン" /></td>
- </tr>
- </table>
- </form>
- </wicket:extend>
-</body>
-</html>
-
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"\r
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
+\r
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<body>\r
+ <wicket:extend>\r
+ \r
+ <form wicket:id="form">\r
+ <table border="0">\r
+ <tr>\r
+ <td>ユーザ名</td>\r
+ <td><input type="text" wicket:id="userName" /></td>\r
+ </tr>\r
+ <tr>\r
+ <td>パスワード</td>\r
+ <td><input type="password" wicket:id="password" /></td>\r
+ </tr>\r
+ <tr>\r
+ <td colspan="2"><input type="submit" value="ログイン" /></td>\r
+ </tr>\r
+ </table>\r
+ </form> \r
+ </wicket:extend>\r
+</body>\r
+</html>\r
+\r
-<html>
- <title>マンガネットワーク</title>
- <head>
- <wicket:link>
- <script type="text/javascript" src="javascripts/spinelz_lib/prototype.js"></script>
- <script type="text/javascript" src="javascripts/spinelz_lib/scriptaculous.js"></script>
- <script type="text/javascript" src="javascripts/spinelz_lib/spinelz_util.js"></script>
- <script type="text/javascript" src="javascripts/spinelz/menubar.js"></script>
- <link rel="stylesheet" href="stylesheets/spinelz/menubar.css" type="text/css" />
- </wicket:link>
- </head>
- <body>
- <div id="header">
- <h1>マンガネットワーク</h1>
- </div>
- <div id="menucontents">
- <div>ホーム</div>
- <div>本
- <div>検索</div>
- <div>登録</div>
- </div>
- <div>ワークフロー
- <div>検索</div>
- <div>登録</div>
- </div>
- <div>連絡
- <div>登録</div>
- </div>
- <div>ユーザ情報
- <div>参照</div>
- </div>
- </div>
-
- <script type="text/javascript">
- var menubar = new MenuBar('menucontents');
- var foo = function() {
- alert('foo function was called.');
- }
- </script>
-
- <wicket:child />
-
- </body>
-</html>
+<html>\r
+ <title>マンガネットワーク</title>\r
+ <head>\r
+ <wicket:link>\r
+ <script type="text/javascript" src="javascripts/spinelz_lib/prototype.js"></script>\r
+ <script type="text/javascript" src="javascripts/spinelz_lib/scriptaculous.js"></script>\r
+ <script type="text/javascript" src="javascripts/spinelz_lib/spinelz_util.js"></script>\r
+ <script type="text/javascript" src="javascripts/spinelz/menubar.js"></script>\r
+ <link rel="stylesheet" href="stylesheets/spinelz/menubar.css" type="text/css" />\r
+ </wicket:link>\r
+ </head>\r
+ <body>\r
+ <div id="header">\r
+ <h1>マンガネットワーク</h1>\r
+ </div>\r
+ <div id="menucontents">\r
+ <div>ホーム</div>\r
+ <div>本\r
+ <div>検索</div>\r
+ <div>登録</div>\r
+ </div>\r
+ <div>ワークフロー\r
+ <div>検索</div>\r
+ <div>登録</div>\r
+ </div>\r
+ <div>連絡\r
+ <div>登録</div>\r
+ </div>\r
+ <div>ユーザ情報\r
+ <div>参照</div>\r
+ </div>\r
+ </div>\r
+\r
+ <script type="text/javascript">\r
+ var menubar = new MenuBar('menucontents');\r
+ var foo = function() {\r
+ alert('foo function was called.');\r
+ }\r
+ </script>\r
+\r
+ <wicket:child />\r
+\r
+ </body>\r
+</html>\r
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
- <link rel="stylesheet" type="text/css" href="css/test.css">
- <title></title>
- </head>
- <body>
- <div id="header">
- <h1>マンガネットワーク</h1>
- </div>
- <div id="menu">
- <ul class="menu">
- <li><a href="/UserListPage">ユーザマスタ管理</a></li>
- <li>グループマスタ管理</li>
- <li>マンガマスタ管理</li>
- </ul>
- <p style="clear: both;"/>
- </div>
- <p />
- <div id="body">
- <wicket:child />
- </div>
-
- <div id="footer">
-
- </div>
- </body>
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"\r
+ "http://www.w3.org/TR/html4/loose.dtd">\r
+<html>\r
+ <head>\r
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">\r
+ <link rel="stylesheet" type="text/css" href="css/test.css">\r
+ <title></title>\r
+ </head>\r
+ <body>\r
+ <div id="header">\r
+ <h1>マンガネットワーク</h1>\r
+ </div>\r
+ <div id="menu">\r
+ <ul class="menu">\r
+ <li><a href="/UserListPage">ユーザマスタ管理</a></li>\r
+ <li>グループマスタ管理</li>\r
+ <li>マンガマスタ管理</li>\r
+ </ul>\r
+ <p style="clear: both;"/>\r
+ </div>\r
+ <p />\r
+ <div id="body"> \r
+ <wicket:child />\r
+ </div>\r
+ \r
+ <div id="footer">\r
+ \r
+ </div>\r
+ </body>\r
</html>
\ No newline at end of file
-// Copyright (c) 2005 spinelz.org (http://script.spinelz.org)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-
-Accordion = Class.create();
-Accordion.className = {
- accordion : 'accordion',
- panel: 'accordion_panel',
- tab : 'accordion_tab',
- tabLeftInactive : 'accordion_tabLeftInactive',
- tabLeftActive: 'accordion_tabLeftActive',
- tabMiddleInactive : 'accordion_tabMiddleInactive',
- tabMiddleActive : 'accordion_tabMiddleActive',
- tabRightInactive : 'accordion_tabRightInactive',
- tabRightActive : 'accordion_tabRightActive'
-}
-
-Accordion.prototype = {
-
- initialize: function(element) {
- var options = Object.extend({
- cssPrefix: 'custom_',
- selected: 1,
- duration: 0.5
- }, arguments[1] || {});
-
- this.options = options;
- this.element = $(element);
- Element.setStyle(this.element, {visibility: 'hidden'});
- Element.hide(this.element);
-
- var customCss = CssUtil.appendPrefix(this.options.cssPrefix, Accordion.className);
- this.classNames = new CssUtil([Accordion.className, customCss]);
-
- this.classNames.addClassNames(this.element, 'accordion');
-
- this.selected = (this.options.selected > 0) ? this.options.selected - 1 : 0 ;
- this.start();
-
- Element.setStyle(this.element, {visibility: 'visible'});
- Element.show(this.element);
- this.effecting = false;
- },
-
- start: function() {
- this.tabs = [];
- this.panels = [];
- this.panelList = [];
-
- this.tabId = this.element.id + '_tab';
- this.tabLeftId = this.tabId + '_left';
- this.tabMiddleId = this.tabId + '_middle';
- this.tabRightId = this.tabId + '_right';
- this.panelId = this.element.id + '_panel';
-
- this.build();
- },
-
- build: function() {
- Element.cleanWhitespace(this.element);
- this.panelList = this.element.childNodes;
-
- for (var i = 0; i < this.panelList.length; i++) {
- if (this.panelList[i].nodeType != 1) {
- Element.remove(this.panelList[i]);
- i--;
- continue;
- }
- Element.cleanWhitespace(this.panelList[i]);
- var navSet = this.panelList[i].childNodes;
- this.buildTab(navSet[0], i);
- this.buildPanel(navSet[0], i);
- }
- this.selectTab();
- },
-
-
- buildTab: function(tabTitle, i) {
- var tab = Builder.node('div', {id:this.tabId + i});
- this.classNames.addClassNames(tab, 'tab');
- var tabLeft = Builder.node('div', {id:this.tabLeftId + i});
- var tabMiddle = Builder.node('div', {id:this.tabMiddleId + i});
- tabMiddle.appendChild(tabTitle);
- var tabRight = Builder.node('div', {id:this.tabRightId + i});
-
- tab.appendChild(tabLeft);
- tab.appendChild(tabMiddle);
- tab.appendChild(tabRight);
- Event.observe(tab, 'click', this.selectTab.bindAsEventListener(this));
-
- this.tabs[i] = tab;
- this.setTabInactive(tab);
- this.panelList[i].appendChild(tab);
- },
-
- buildPanel: function(panelContent, i) {
- var panel = Builder.node('div', {id:this.panelId + i});
- this.classNames.addClassNames(panel, 'panel');
-
- panel.appendChild(panelContent);
- Element.hide(panel);
- this.panels[i] = panel;
- this.panelList[i].appendChild(panel);
- },
-
- selectTab: function(e) {
- if (this.effecting) return;
- if (!e) {
- if (!this.panels[this.selected]) this.selected = 0;
- Element.show(this.panels[this.selected]);
- this.setTabActive(this.tabs[this.selected]);
- return;
- }
-
- var targetElement = Event.element(e);
- var targetIndex = this.getTargetIndex(targetElement);
- if (targetIndex == this.selected) return;
-
- var currentPanel = this.panels[this.selected];
- var targetPanel = this.panels[targetIndex];
- this.setTabInactive(this.tabs[this.selected]);
- this.setTabActive(this.tabs[targetIndex]);
-
- this.effecting = true;
- new Effect.Parallel(
- [
- new Effect.BlindUp(currentPanel, {sync: true}),
- new Effect.BlindDown(targetPanel, {sync: true})
- ],
- {
- duration: this.options.duration,
- beforeStart: function() { this.effecting = true; }.bind(this),
- afterFinish: function() { this.effecting = false; }.bind(this)
- }
- );
-
- this.selected = targetIndex;
- },
-
- setTabActive: function(tab) {
- var tabChildren = tab.childNodes;
-
- this.classNames.refreshClassNames(tabChildren[0], 'tabLeftActive');
- this.classNames.refreshClassNames(tabChildren[1], 'tabMiddleActive');
- this.classNames.refreshClassNames(tabChildren[2], 'tabRightActive');
- },
-
- setTabInactive: function(tab) {
- var tabChildren = tab.childNodes;
-
- this.classNames.refreshClassNames(tabChildren[0], 'tabLeftInactive');
- this.classNames.refreshClassNames(tabChildren[1], 'tabMiddleInactive');
- this.classNames.refreshClassNames(tabChildren[2], 'tabRightInactive');
- },
-
- getTargetIndex: function(element) {
- while(element) {
- if (element.id && element.id.indexOf(this.tabId, 0) >= 0) {
- var index = element.id.substring(this.tabId.length);
- if (!isNaN(index)) {
- return index;
- }
- }
- element = element.parentNode;
- }
- }
-}
+// Copyright (c) 2005 spinelz.org (http://script.spinelz.org)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+\r
+Accordion = Class.create();\r
+Accordion.className = {\r
+ accordion : 'accordion',\r
+ panel: 'accordion_panel',\r
+ tab : 'accordion_tab',\r
+ tabLeftInactive : 'accordion_tabLeftInactive',\r
+ tabLeftActive: 'accordion_tabLeftActive',\r
+ tabMiddleInactive : 'accordion_tabMiddleInactive',\r
+ tabMiddleActive : 'accordion_tabMiddleActive',\r
+ tabRightInactive : 'accordion_tabRightInactive',\r
+ tabRightActive : 'accordion_tabRightActive'\r
+}\r
+\r
+Accordion.prototype = {\r
+ \r
+ initialize: function(element) {\r
+ var options = Object.extend({\r
+ cssPrefix: 'custom_',\r
+ selected: 1,\r
+ duration: 0.5\r
+ }, arguments[1] || {});\r
+ \r
+ this.options = options;\r
+ this.element = $(element);\r
+ Element.setStyle(this.element, {visibility: 'hidden'});\r
+ Element.hide(this.element);\r
+\r
+ var customCss = CssUtil.appendPrefix(this.options.cssPrefix, Accordion.className);\r
+ this.classNames = new CssUtil([Accordion.className, customCss]);\r
+ \r
+ this.classNames.addClassNames(this.element, 'accordion');\r
+ \r
+ this.selected = (this.options.selected > 0) ? this.options.selected - 1 : 0 ;\r
+ this.start();\r
+ \r
+ Element.setStyle(this.element, {visibility: 'visible'});\r
+ Element.show(this.element);\r
+ this.effecting = false;\r
+ },\r
+ \r
+ start: function() {\r
+ this.tabs = [];\r
+ this.panels = [];\r
+ this.panelList = [];\r
+\r
+ this.tabId = this.element.id + '_tab';\r
+ this.tabLeftId = this.tabId + '_left';\r
+ this.tabMiddleId = this.tabId + '_middle';\r
+ this.tabRightId = this.tabId + '_right';\r
+ this.panelId = this.element.id + '_panel';\r
+ \r
+ this.build(); \r
+ }, \r
+ \r
+ build: function() {\r
+ Element.cleanWhitespace(this.element);\r
+ this.panelList = this.element.childNodes;\r
+ \r
+ for (var i = 0; i < this.panelList.length; i++) {\r
+ if (this.panelList[i].nodeType != 1) {\r
+ Element.remove(this.panelList[i]);\r
+ i--;\r
+ continue;\r
+ }\r
+ Element.cleanWhitespace(this.panelList[i]);\r
+ var navSet = this.panelList[i].childNodes;\r
+ this.buildTab(navSet[0], i);\r
+ this.buildPanel(navSet[0], i);\r
+ }\r
+ this.selectTab();\r
+ },\r
+ \r
+ \r
+ buildTab: function(tabTitle, i) { \r
+ var tab = Builder.node('div', {id:this.tabId + i});\r
+ this.classNames.addClassNames(tab, 'tab'); \r
+ var tabLeft = Builder.node('div', {id:this.tabLeftId + i});\r
+ var tabMiddle = Builder.node('div', {id:this.tabMiddleId + i});\r
+ tabMiddle.appendChild(tabTitle);\r
+ var tabRight = Builder.node('div', {id:this.tabRightId + i});\r
+ \r
+ tab.appendChild(tabLeft);\r
+ tab.appendChild(tabMiddle);\r
+ tab.appendChild(tabRight);\r
+ Event.observe(tab, 'click', this.selectTab.bindAsEventListener(this));\r
+\r
+ this.tabs[i] = tab;\r
+ this.setTabInactive(tab);\r
+ this.panelList[i].appendChild(tab);\r
+ },\r
+ \r
+ buildPanel: function(panelContent, i) {\r
+ var panel = Builder.node('div', {id:this.panelId + i});\r
+ this.classNames.addClassNames(panel, 'panel');\r
+ \r
+ panel.appendChild(panelContent);\r
+ Element.hide(panel);\r
+ this.panels[i] = panel;\r
+ this.panelList[i].appendChild(panel);\r
+ },\r
+ \r
+ selectTab: function(e) {\r
+ if (this.effecting) return;\r
+ if (!e) {\r
+ if (!this.panels[this.selected]) this.selected = 0;\r
+ Element.show(this.panels[this.selected]);\r
+ this.setTabActive(this.tabs[this.selected]);\r
+ return;\r
+ }\r
+\r
+ var targetElement = Event.element(e);\r
+ var targetIndex = this.getTargetIndex(targetElement);\r
+ if (targetIndex == this.selected) return;\r
+ \r
+ var currentPanel = this.panels[this.selected];\r
+ var targetPanel = this.panels[targetIndex];\r
+ this.setTabInactive(this.tabs[this.selected]);\r
+ this.setTabActive(this.tabs[targetIndex]);\r
+\r
+ this.effecting = true;\r
+ new Effect.Parallel(\r
+ [\r
+ new Effect.BlindUp(currentPanel, {sync: true}),\r
+ new Effect.BlindDown(targetPanel, {sync: true})\r
+ ],\r
+ {\r
+ duration: this.options.duration,\r
+ beforeStart: function() { this.effecting = true; }.bind(this),\r
+ afterFinish: function() { this.effecting = false; }.bind(this)\r
+ }\r
+ );\r
+\r
+ this.selected = targetIndex; \r
+ },\r
+ \r
+ setTabActive: function(tab) {\r
+ var tabChildren = tab.childNodes;\r
+\r
+ this.classNames.refreshClassNames(tabChildren[0], 'tabLeftActive');\r
+ this.classNames.refreshClassNames(tabChildren[1], 'tabMiddleActive');\r
+ this.classNames.refreshClassNames(tabChildren[2], 'tabRightActive');\r
+ },\r
+ \r
+ setTabInactive: function(tab) {\r
+ var tabChildren = tab.childNodes;\r
+ \r
+ this.classNames.refreshClassNames(tabChildren[0], 'tabLeftInactive');\r
+ this.classNames.refreshClassNames(tabChildren[1], 'tabMiddleInactive');\r
+ this.classNames.refreshClassNames(tabChildren[2], 'tabRightInactive');\r
+ },\r
+\r
+ getTargetIndex: function(element) {\r
+ while(element) {\r
+ if (element.id && element.id.indexOf(this.tabId, 0) >= 0) {\r
+ var index = element.id.substring(this.tabId.length);\r
+ if (!isNaN(index)) {\r
+ return index;\r
+ }\r
+ }\r
+ element = element.parentNode;\r
+ }\r
+ }\r
+}\r
-// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-var AjaxHistory = {
- _callback: null,
- _currentIframeHash: '',
- _currentLocationHash: '',
- _prefix: 'ajax_history_',
- add: function(hash) {
- AjaxHistoryPageManager.setHash(this._prefix + hash);
- },
- checkIframeHash: function() {
- var iframeHash = AjaxHistoryIframeManager.getHash().substr(this._prefix.length);
- if(this._currentIframeHash != iframeHash) {
- this._currentIframeHash = iframeHash;
- this._currentLocationHash = iframeHash;
- AjaxHistoryPageManager.setHash((iframeHash) ? this._prefix + iframeHash : '');
- this.doEvent(iframeHash);
- } else {
- this.checkLocationHash();
- }
- },
- checkHash: function() {
- if(UserAgent.isIE()) {
- this.checkIframeHash();
- } else {
- this.checkLocationHash();
- }
- },
- checkLocationHash: function() {
- var locationHash = AjaxHistoryPageManager.getHash().substr(this._prefix.length);
- if(this._currentLocationHash != locationHash) {
- this._currentLocationHash = locationHash;
- if(UserAgent.isIE()) {
- AjaxHistoryIframeManager.setHash(this._prefix + locationHash);
- } else {
- this.doEvent(locationHash);
- }
- }
- },
- doEvent: function(hash) {
- if(this._callback) {
- this._callback.call(null, hash);
- }
- },
- init: function(callback) {
- this._callback = callback;
- if(UserAgent.isIE()) {
- AjaxHistoryIframeManager.create();
- }
- var self = this;
- var hashHandler = function() {self.checkHash();}
- setInterval(hashHandler, 100);
- }
-}
-
-var AjaxHistoryIframeManager = {
- _id : 'ajax_history_frame',
- _element: null,
- _src: IECover.src,
- create: function() {
- document.write('<iframe id="' + this._id + '" src="' + this._src + '" style="display: none;"></iframe>');
- this._element = $(this._id);
- },
- getHash: function() {
- var iframeDocument = this._element.contentWindow.document;
- return iframeDocument.location.hash.replace(/^#/, '');
- },
- setHash: function(query) {
- var iframeDocument = this._element.contentWindow.document;
- iframeDocument.open();
- iframeDocument.close();
- iframeDocument.location.hash = query;
- }
-}
-
-var AjaxHistoryPageManager = {
- _delimiter: '#',
- _location: 'window.location.href',
- _query: '',
- getLocation: function() {
- return eval(this._location);
- },
- getHash: function() {
- var url_elements = this.getLocation().split(this._delimiter);
- return (url_elements.length > 1) ? url_elements[url_elements.length - 1] : this._query;
- },
- getUrl: function() {
- var url_elements = this.getLocation().split(this._delimiter);
- return url_elements[0];
- },
- setHash: function(query) {
- window.location.hash = query;
- }
-}
+// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+var AjaxHistory = {\r
+ _callback: null,\r
+ _currentIframeHash: '',\r
+ _currentLocationHash: '',\r
+ _prefix: 'ajax_history_',\r
+ add: function(hash) {\r
+ AjaxHistoryPageManager.setHash(this._prefix + hash);\r
+ },\r
+ checkIframeHash: function() {\r
+ var iframeHash = AjaxHistoryIframeManager.getHash().substr(this._prefix.length);\r
+ if(this._currentIframeHash != iframeHash) {\r
+ this._currentIframeHash = iframeHash;\r
+ this._currentLocationHash = iframeHash;\r
+ AjaxHistoryPageManager.setHash((iframeHash) ? this._prefix + iframeHash : '');\r
+ this.doEvent(iframeHash);\r
+ } else {\r
+ this.checkLocationHash();\r
+ }\r
+ },\r
+ checkHash: function() {\r
+ if(UserAgent.isIE()) {\r
+ this.checkIframeHash();\r
+ } else {\r
+ this.checkLocationHash();\r
+ }\r
+ },\r
+ checkLocationHash: function() {\r
+ var locationHash = AjaxHistoryPageManager.getHash().substr(this._prefix.length);\r
+ if(this._currentLocationHash != locationHash) {\r
+ this._currentLocationHash = locationHash;\r
+ if(UserAgent.isIE()) {\r
+ AjaxHistoryIframeManager.setHash(this._prefix + locationHash);\r
+ } else {\r
+ this.doEvent(locationHash);\r
+ }\r
+ }\r
+ },\r
+ doEvent: function(hash) {\r
+ if(this._callback) {\r
+ this._callback.call(null, hash);\r
+ }\r
+ },\r
+ init: function(callback) {\r
+ this._callback = callback;\r
+ if(UserAgent.isIE()) {\r
+ AjaxHistoryIframeManager.create();\r
+ }\r
+ var self = this;\r
+ var hashHandler = function() {self.checkHash();}\r
+ setInterval(hashHandler, 100);\r
+ }\r
+}\r
+\r
+var AjaxHistoryIframeManager = {\r
+ _id : 'ajax_history_frame',\r
+ _element: null,\r
+ _src: IECover.src,\r
+ create: function() {\r
+ document.write('<iframe id="' + this._id + '" src="' + this._src + '" style="display: none;"></iframe>');\r
+ this._element = $(this._id);\r
+ },\r
+ getHash: function() {\r
+ var iframeDocument = this._element.contentWindow.document;\r
+ return iframeDocument.location.hash.replace(/^#/, '');\r
+ },\r
+ setHash: function(query) {\r
+ var iframeDocument = this._element.contentWindow.document;\r
+ iframeDocument.open();\r
+ iframeDocument.close();\r
+ iframeDocument.location.hash = query;\r
+ }\r
+}\r
+\r
+var AjaxHistoryPageManager = {\r
+ _delimiter: '#',\r
+ _location: 'window.location.href',\r
+ _query: '',\r
+ getLocation: function() {\r
+ return eval(this._location);\r
+ },\r
+ getHash: function() {\r
+ var url_elements = this.getLocation().split(this._delimiter);\r
+ return (url_elements.length > 1) ? url_elements[url_elements.length - 1] : this._query;\r
+ },\r
+ getUrl: function() {\r
+ var url_elements = this.getLocation().split(this._delimiter);\r
+ return url_elements[0];\r
+ },\r
+ setHash: function(query) {\r
+ window.location.hash = query;\r
+ }\r
+}\r
-// Copyright (c) 2006 spinelz.org (http://script.spinelz.org/)
-//
-// This code is substantially based on code from script.aculo.us which has the
-// following copyright and permission notice
-//
-// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
-
-var Balloon = Class.create()
-Balloon.classNames = {
- tooltip: 'balloon_tooltip',
- top: 'balloon_top',
- topLeft: 'balloon_top_left',
- topMiddle: 'balloon_top_middle',
- topRight: 'balloon_top_right',
- middle: 'balloon_middle',
- middleLeft: 'balloon_middle_left',
- middleRight: 'balloon_middle_right',
- middleLeftRowT: 'balloon_middle_left_row',
- middleLeftRowB: 'balloon_middle_left_row',
- middleRightRowT: 'balloon_middle_right_row',
- middleRightRowB: 'balloon_middle_right_row',
- leftArrow: 'balloon_left_arrow',
- rightArrow: 'balloon_right_arrow',
- leftUpArrow: 'balloon_left_up_arrow',
- leftDownArrow: 'balloon_left_down_arrow',
- rightUpArrow: 'balloon_right_up_arrow',
- rightDownArrow: 'balloon_right_down_arrow',
- body: 'balloon_body',
- bottom: 'balloon_bottom',
- bottomLeft: 'balloon_bottom_left',
- bottomMiddle: 'balloon_bottom_middle',
- bottomRight: 'balloon_bottom_right'
-}
-Balloon.allBalloons = [];
-Balloon.closeAll = function(){
- Balloon.allBalloons.each(function(b){
- b.close();
- });
-}
-Balloon.eventSetting = false;
-Balloon.prototype = {
- initialize : function (target, message){
- this.target = $(target);
-
- this.options = Object.extend({
- cssPrefix: 'custom_',
- trigger: this.target,
- tipId: this.target.id + '_balloon',
- events: ['click'],
- width: 300,
- height: 200
- }, arguments[2] || {});
-
- var customCss = CssUtil.appendPrefix(this.options.cssPrefix, Balloon.classNames);
- this.classNames = new CssUtil([Balloon.classNames, customCss]);
-
- this.tipNode = this._buildTipNode(message);
- Element.hide(this.tipNode);
- this._setMessage(message);
- document.body.appendChild(this.tipNode);
- this._setEvent();
- Balloon.allBalloons.push(this)
- this._setSize();
- },
-
- _setEvent: function() {
- var self = this;
- this.options.events.each(function(e) {
- Event.observe(self.options.trigger, e, self.open.bindAsEventListener(self));
- });
-
- Event.observe(this.tipNode, 'click', this.close.bind(this), true)
-
- if (!Balloon.eventSetting) {
- Event.observe(document, 'click', Balloon.closeAll, true);
- Balloon.eventSetting = true;
- }
- },
-
- _buildTipNode : function() {
- var tipNode = Builder.node('div', {id: this.options.tipId});
- this.classNames.addClassNames(tipNode, 'tooltip');
- tipNode.appendChild(this._buildTop());
- tipNode.appendChild(this._buildMiddle());
- tipNode.appendChild(this._buildBottom());
- return tipNode;
- },
-
- _setMessage: function(message) {
- var type = message.constructor;
- if (type == String) {
- this.body.innerHTML = message;
- } else if (type == Object) {
- this.body.appendChild(message);
- }
- },
-
- _buildTop: function() {
- return this._buildMulti('top', ['topLeft', 'topMiddle', 'topRight'], true);
- },
-
- _buildBottom: function() {
- return this._buildMulti('bottom', ['bottomLeft', 'bottomMiddle', 'bottomRight'], true);
- },
-
- _buildMiddle: function() {
- this.middle = Builder.node('div');
- this.classNames.addClassNames(this.middle, 'middle');
- this.middle.appendChild(
- this._buildMulti('middleLeft', ['middleLeftRowT', 'leftArrow', 'middleLeftRowB'], true));
- this.middle.appendChild(this._buildMulti('body', [], true));
- this.middle.appendChild(
- this._buildMulti('middleRight', ['middleRightRowT', 'rightArrow', 'middleRightRowB'], true));
- return this.middle;
- },
-
- _buildMulti: function(main, subs, hold) {
- var topNode = Builder.node('div');
- this.classNames.addClassNames(topNode, main);
- if (hold) this[main] = topNode;
- var self = this;
- var node = null;
- subs.each(function(s) {
- node = Builder.node('div');
- self.classNames.addClassNames(node, s);
- topNode.appendChild(node);
- if (hold) self[s] = node;
- });
- return topNode;
- },
-
- _setPosition: function() {
- var scrollPosition = Position.realOffset(this.tipNode);
- var screenWidth = document.documentElement.clientWidth;
- var screenHeight = document.documentElement.clientHeight;
-
- var positionList = Position.cumulativeOffset(this.target);
- var dimension = Element.getDimensions(this.target);
- var tipNodeLeft = Math.round(positionList[0] + dimension.width);
- var tipDimension = Element.getDimensions(this.tipNode);
- var tipNodeTop = Math.round(positionList[1] - tipDimension.height / 2);
-
- var addLR = 'left';
- var remLR = 'right';
-
- if((tmpY = tipNodeTop - scrollPosition[1]) < 0) {
- tipNodeTop -= tmpY;
- }
- if( (tipNodeLeft+tipDimension.width) > (screenWidth+scrollPosition[0]) ) {
- tipNodeLeft = Math.round(positionList[0] - tipDimension.width);
- addLR = 'right';
- remLR = 'left';
- }
-
- var y = positionList[1] - tipNodeTop;
- this._setArrow(addLR, y);
- this._unsetArrow(remLR);
-
- Element.setStyle(this.tipNode, {
- top: tipNodeTop + 'px',
- left: tipNodeLeft + 'px',
- zIndex: ZindexManager.getIndex()
- });
- },
-
- _setArrow: function(lr, y) {
- var headerH = (this.options.height - this.middleH) / 2;
- var topH, bottomH, h, ud;
- var minH = 10; // for ie
- if (lr == 'left') {
- h = this.middleH - this.leftArrowH;
- } else {
- h = this.middleH - this.rightArrowH;
- }
- if (headerH > y) {
- topH = minH;
- bottomH = h - topH;
- ud = 'up';
- } else if ((this.middleH + headerH) < y) {
- bottomH = minH;
- topH = h - bottomH;
- ud = 'down';
- } else {
- topH = y - headerH;
- topH = (topH < minH) ? minH : topH;
- bottomH = h - topH;
- ud = 'up';
- }
- if (lr == 'left') {
- if (ud == 'up') {
- this.classNames.refreshClassNames(this.leftArrow, 'leftUpArrow');
- Element.setStyle(this.leftArrow, {height: this.leftArrowH + 'px'});
- Element.setStyle(this.middleLeftRowT, {height: topH + 'px'});
- Element.setStyle(this.middleLeftRowB, {height: bottomH + 'px'});
- } else {
- this.classNames.refreshClassNames(this.leftArrow, 'leftDownArrow');
- Element.setStyle(this.leftArrow, {height: this.leftArrowH + 'px'});
- Element.setStyle(this.middleLeftRowT, {height: topH + 'px'});
- Element.setStyle(this.middleLeftRowB, {height: bottomH + 'px'});
- }
- } else {
- if (ud == 'up') {
- this.classNames.refreshClassNames(this.rightArrow, 'rightUpArrow');
- Element.setStyle(this.rightArrow, {height: this.rightArrowH + 'px'});
- Element.setStyle(this.middleRightRowT, {height: topH + 'px'});
- Element.setStyle(this.middleRightRowB, {height: bottomH + 'px'});
- } else {
- this.classNames.refreshClassNames(this.rightArrow, 'rightDownArrow');
- Element.setStyle(this.rightArrow, {height: this.rightArrowH + 'px'});
- Element.setStyle(this.middleRightRowT, {height: topH + 'px'});
- Element.setStyle(this.middleRightRowB, {height: bottomH + 'px'});
- }
- }
- },
-
- _unsetArrow: function(direction) {
- if (direction == 'left') {
- var h = (this.middleH - this.leftArrowH) / 2;
- this.classNames.refreshClassNames(this.leftArrow, 'middleLeftRowB');
- Element.setStyle(this.leftArrow, {height: this.leftArrowH + 'px'});
- Element.setStyle(this.middleLeftRowT, {height: h + 'px'});
- Element.setStyle(this.middleLeftRowB, {height: h + 'px'});
- } else {
- var h = (this.middleH - this.rightArrowH) / 2;
- this.classNames.refreshClassNames(this.rightArrow, 'middleRightRowB');
- Element.setStyle(this.rightArrow, {height: this.rightArrowH + 'px'});
- Element.setStyle(this.middleRightRowT, {height: h + 'px'});
- Element.setStyle(this.middleRightRowB, {height: h + 'px'});
- }
- },
-
- _setSize: function() {
- var width = this.options.width;
- var height = this.options.height;
- Element.setStyle(this.tipNode, {
- width: width + 'px',
- height: height + 'px'
- });
-
- var topH = parseInt(Element.getStyle(this.top, 'height'));
- var bottomH = parseInt(Element.getStyle(this.bottom, 'height'));
- var middleH = this.options.height - topH - bottomH;
-
- var style = {height: middleH + 'px'};
- Element.setStyle(this.middle, style);
- Element.setStyle(this.middleLeft, style);
- Element.setStyle(this.middleRight, style);
- Element.setStyle(this.body, style);
-
- this.leftArrowH = parseInt(Element.getStyle(this.leftArrow, 'height'));
- this.rightArrowH = parseInt(Element.getStyle(this.rightArrow, 'height'));
- this.middleH = middleH;
- },
-
- open : function() {
- if (!Element.visible(this.tipNode)) {
- this._setPosition();
- Effect.Appear(this.tipNode);
- }
- },
-
- close : function(){
- if (Element.visible(this.tipNode)) {
- this._setPosition();
- Effect.Fade(this.tipNode);
- }
- }
-}
+// Copyright (c) 2006 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// This code is substantially based on code from script.aculo.us which has the \r
+// following copyright and permission notice\r
+//\r
+// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE\r
+\r
+var Balloon = Class.create()\r
+Balloon.classNames = {\r
+ tooltip: 'balloon_tooltip',\r
+ top: 'balloon_top',\r
+ topLeft: 'balloon_top_left',\r
+ topMiddle: 'balloon_top_middle',\r
+ topRight: 'balloon_top_right',\r
+ middle: 'balloon_middle',\r
+ middleLeft: 'balloon_middle_left',\r
+ middleRight: 'balloon_middle_right',\r
+ middleLeftRowT: 'balloon_middle_left_row',\r
+ middleLeftRowB: 'balloon_middle_left_row',\r
+ middleRightRowT: 'balloon_middle_right_row',\r
+ middleRightRowB: 'balloon_middle_right_row',\r
+ leftArrow: 'balloon_left_arrow',\r
+ rightArrow: 'balloon_right_arrow',\r
+ leftUpArrow: 'balloon_left_up_arrow',\r
+ leftDownArrow: 'balloon_left_down_arrow',\r
+ rightUpArrow: 'balloon_right_up_arrow',\r
+ rightDownArrow: 'balloon_right_down_arrow',\r
+ body: 'balloon_body',\r
+ bottom: 'balloon_bottom',\r
+ bottomLeft: 'balloon_bottom_left',\r
+ bottomMiddle: 'balloon_bottom_middle',\r
+ bottomRight: 'balloon_bottom_right'\r
+}\r
+Balloon.allBalloons = [];\r
+Balloon.closeAll = function(){\r
+ Balloon.allBalloons.each(function(b){\r
+ b.close();\r
+ });\r
+}\r
+Balloon.eventSetting = false;\r
+Balloon.prototype = {\r
+ initialize : function (target, message){\r
+ this.target = $(target);\r
+\r
+ this.options = Object.extend({\r
+ cssPrefix: 'custom_',\r
+ trigger: this.target,\r
+ tipId: this.target.id + '_balloon',\r
+ events: ['click'],\r
+ width: 300,\r
+ height: 200\r
+ }, arguments[2] || {});\r
+ \r
+ var customCss = CssUtil.appendPrefix(this.options.cssPrefix, Balloon.classNames);\r
+ this.classNames = new CssUtil([Balloon.classNames, customCss]);\r
+\r
+ this.tipNode = this._buildTipNode(message);\r
+ Element.hide(this.tipNode);\r
+ this._setMessage(message);\r
+ document.body.appendChild(this.tipNode);\r
+ this._setEvent();\r
+ Balloon.allBalloons.push(this)\r
+ this._setSize();\r
+ },\r
+\r
+ _setEvent: function() {\r
+ var self = this;\r
+ this.options.events.each(function(e) {\r
+ Event.observe(self.options.trigger, e, self.open.bindAsEventListener(self));\r
+ });\r
+\r
+ Event.observe(this.tipNode, 'click', this.close.bind(this), true) \r
+\r
+ if (!Balloon.eventSetting) {\r
+ Event.observe(document, 'click', Balloon.closeAll, true);\r
+ Balloon.eventSetting = true;\r
+ }\r
+ },\r
+\r
+ _buildTipNode : function() {\r
+ var tipNode = Builder.node('div', {id: this.options.tipId});\r
+ this.classNames.addClassNames(tipNode, 'tooltip');\r
+ tipNode.appendChild(this._buildTop());\r
+ tipNode.appendChild(this._buildMiddle());\r
+ tipNode.appendChild(this._buildBottom());\r
+ return tipNode;\r
+ },\r
+\r
+ _setMessage: function(message) {\r
+ var type = message.constructor;\r
+ if (type == String) {\r
+ this.body.innerHTML = message;\r
+ } else if (type == Object) {\r
+ this.body.appendChild(message);\r
+ }\r
+ },\r
+\r
+ _buildTop: function() {\r
+ return this._buildMulti('top', ['topLeft', 'topMiddle', 'topRight'], true);\r
+ },\r
+\r
+ _buildBottom: function() {\r
+ return this._buildMulti('bottom', ['bottomLeft', 'bottomMiddle', 'bottomRight'], true);\r
+ },\r
+\r
+ _buildMiddle: function() {\r
+ this.middle = Builder.node('div');\r
+ this.classNames.addClassNames(this.middle, 'middle');\r
+ this.middle.appendChild(\r
+ this._buildMulti('middleLeft', ['middleLeftRowT', 'leftArrow', 'middleLeftRowB'], true));\r
+ this.middle.appendChild(this._buildMulti('body', [], true));\r
+ this.middle.appendChild(\r
+ this._buildMulti('middleRight', ['middleRightRowT', 'rightArrow', 'middleRightRowB'], true));\r
+ return this.middle;\r
+ },\r
+\r
+ _buildMulti: function(main, subs, hold) {\r
+ var topNode = Builder.node('div');\r
+ this.classNames.addClassNames(topNode, main);\r
+ if (hold) this[main] = topNode;\r
+ var self = this;\r
+ var node = null;\r
+ subs.each(function(s) {\r
+ node = Builder.node('div');\r
+ self.classNames.addClassNames(node, s);\r
+ topNode.appendChild(node);\r
+ if (hold) self[s] = node;\r
+ });\r
+ return topNode;\r
+ },\r
+\r
+ _setPosition: function() {\r
+ var scrollPosition = Position.realOffset(this.tipNode);\r
+ var screenWidth = document.documentElement.clientWidth;\r
+ var screenHeight = document.documentElement.clientHeight;\r
+ \r
+ var positionList = Position.cumulativeOffset(this.target);\r
+ var dimension = Element.getDimensions(this.target);\r
+ var tipNodeLeft = Math.round(positionList[0] + dimension.width);\r
+ var tipDimension = Element.getDimensions(this.tipNode);\r
+ var tipNodeTop = Math.round(positionList[1] - tipDimension.height / 2);\r
+\r
+ var addLR = 'left';\r
+ var remLR = 'right';\r
+\r
+ if((tmpY = tipNodeTop - scrollPosition[1]) < 0) {\r
+ tipNodeTop -= tmpY;\r
+ }\r
+ if( (tipNodeLeft+tipDimension.width) > (screenWidth+scrollPosition[0]) ) {\r
+ tipNodeLeft = Math.round(positionList[0] - tipDimension.width);\r
+ addLR = 'right';\r
+ remLR = 'left';\r
+ }\r
+ \r
+ var y = positionList[1] - tipNodeTop;\r
+ this._setArrow(addLR, y);\r
+ this._unsetArrow(remLR);\r
+\r
+ Element.setStyle(this.tipNode, {\r
+ top: tipNodeTop + 'px',\r
+ left: tipNodeLeft + 'px',\r
+ zIndex: ZindexManager.getIndex()\r
+ });\r
+ },\r
+\r
+ _setArrow: function(lr, y) {\r
+ var headerH = (this.options.height - this.middleH) / 2;\r
+ var topH, bottomH, h, ud;\r
+ var minH = 10; // for ie\r
+ if (lr == 'left') {\r
+ h = this.middleH - this.leftArrowH;\r
+ } else {\r
+ h = this.middleH - this.rightArrowH;\r
+ }\r
+ if (headerH > y) {\r
+ topH = minH;\r
+ bottomH = h - topH;\r
+ ud = 'up';\r
+ } else if ((this.middleH + headerH) < y) {\r
+ bottomH = minH;\r
+ topH = h - bottomH;\r
+ ud = 'down';\r
+ } else {\r
+ topH = y - headerH;\r
+ topH = (topH < minH) ? minH : topH;\r
+ bottomH = h - topH;\r
+ ud = 'up';\r
+ }\r
+ if (lr == 'left') {\r
+ if (ud == 'up') {\r
+ this.classNames.refreshClassNames(this.leftArrow, 'leftUpArrow');\r
+ Element.setStyle(this.leftArrow, {height: this.leftArrowH + 'px'});\r
+ Element.setStyle(this.middleLeftRowT, {height: topH + 'px'});\r
+ Element.setStyle(this.middleLeftRowB, {height: bottomH + 'px'});\r
+ } else {\r
+ this.classNames.refreshClassNames(this.leftArrow, 'leftDownArrow');\r
+ Element.setStyle(this.leftArrow, {height: this.leftArrowH + 'px'});\r
+ Element.setStyle(this.middleLeftRowT, {height: topH + 'px'});\r
+ Element.setStyle(this.middleLeftRowB, {height: bottomH + 'px'});\r
+ }\r
+ } else {\r
+ if (ud == 'up') {\r
+ this.classNames.refreshClassNames(this.rightArrow, 'rightUpArrow');\r
+ Element.setStyle(this.rightArrow, {height: this.rightArrowH + 'px'});\r
+ Element.setStyle(this.middleRightRowT, {height: topH + 'px'});\r
+ Element.setStyle(this.middleRightRowB, {height: bottomH + 'px'});\r
+ } else {\r
+ this.classNames.refreshClassNames(this.rightArrow, 'rightDownArrow');\r
+ Element.setStyle(this.rightArrow, {height: this.rightArrowH + 'px'});\r
+ Element.setStyle(this.middleRightRowT, {height: topH + 'px'});\r
+ Element.setStyle(this.middleRightRowB, {height: bottomH + 'px'});\r
+ }\r
+ }\r
+ },\r
+\r
+ _unsetArrow: function(direction) {\r
+ if (direction == 'left') {\r
+ var h = (this.middleH - this.leftArrowH) / 2;\r
+ this.classNames.refreshClassNames(this.leftArrow, 'middleLeftRowB');\r
+ Element.setStyle(this.leftArrow, {height: this.leftArrowH + 'px'});\r
+ Element.setStyle(this.middleLeftRowT, {height: h + 'px'});\r
+ Element.setStyle(this.middleLeftRowB, {height: h + 'px'});\r
+ } else {\r
+ var h = (this.middleH - this.rightArrowH) / 2;\r
+ this.classNames.refreshClassNames(this.rightArrow, 'middleRightRowB');\r
+ Element.setStyle(this.rightArrow, {height: this.rightArrowH + 'px'});\r
+ Element.setStyle(this.middleRightRowT, {height: h + 'px'});\r
+ Element.setStyle(this.middleRightRowB, {height: h + 'px'});\r
+ }\r
+ },\r
+\r
+ _setSize: function() {\r
+ var width = this.options.width;\r
+ var height = this.options.height;\r
+ Element.setStyle(this.tipNode, {\r
+ width: width + 'px',\r
+ height: height + 'px'\r
+ });\r
+\r
+ var topH = parseInt(Element.getStyle(this.top, 'height'));\r
+ var bottomH = parseInt(Element.getStyle(this.bottom, 'height'));\r
+ var middleH = this.options.height - topH - bottomH;\r
+\r
+ var style = {height: middleH + 'px'};\r
+ Element.setStyle(this.middle, style);\r
+ Element.setStyle(this.middleLeft, style);\r
+ Element.setStyle(this.middleRight, style);\r
+ Element.setStyle(this.body, style);\r
+\r
+ this.leftArrowH = parseInt(Element.getStyle(this.leftArrow, 'height'));\r
+ this.rightArrowH = parseInt(Element.getStyle(this.rightArrow, 'height'));\r
+ this.middleH = middleH;\r
+ },\r
+\r
+ open : function() {\r
+ if (!Element.visible(this.tipNode)) {\r
+ this._setPosition();\r
+ Effect.Appear(this.tipNode);\r
+ }\r
+ },\r
+\r
+ close : function(){\r
+ if (Element.visible(this.tipNode)) {\r
+ this._setPosition();\r
+ Effect.Fade(this.tipNode);\r
+ }\r
+ }\r
+}\r
-// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-var AbstractBarChart = Class.create();
-AbstractBarChart.prototype = {
-
- initialize: function(element, params) {
- this.options = Object.extend({
- title: '',
- graduation: true,
- graduationMin: 0,
- graduationMax: 30,
- graduationInterval: 10,
- graduationRange: 50,
- titleFont: 'normal bold 20px serif'
- }, arguments[2] || {});
-
- this.fontSize = 'normal normal 12px serif';
- this.graduationLine = '2px solid gray';
- this.element = $(element);
- Element.setStyle(this.element, {visibility: 'hidden'});
- Element.hide(this.element);
- this.params = params;
-
- this.init();
-
- this.hide();
- this.refresh();
- Element.setStyle(this.element, {visibility: 'visible'});
- Element.show(this.element);
- },
-
- build: function() {
- return Builder.node(
- 'DIV',
- [this.buildTitle(), this.buildGraduationLine(), this.buildContent()]);
- },
-
- buildTitle: function() {
- return Builder.node(
- 'DIV',
- {style: 'font: ' + this.options.titleFont + '; margin-bottom: 5px; text-align: center;'},
- [this.options.title]
- );
- },
-
- show: function() {
- Element.show(this.element);
- },
-
- hide: function() {
- Element.hide(this.element);
- },
-
- refresh: function(subject) {
- if (this.chart) this.remove();
-
- this.chart = this.build();
- this.element.appendChild(this.chart);
- },
-
- getParam: function(name) {
- return this.params.detect(function(child) {
- return (child.getName() == name);
- });
- },
-
- remove: function() {
- var chart = this.chart;
- var element = this.element;
-
- $A(this.element.childNodes).any(function(child) {
- if (child == chart) {
- element.removeChild(child);
- return true;
- }
- return false;
- });
-
- this.chart = null;
- },
-
- getChartSize: function() {
- return this.getPlusChartSize() + this.getMinusChartSize();
- },
-
- getPlusChartSize: function() {
- if (this.options.graduationMax <= 0) return 0;
- return this.options.graduationMax / this.options.graduationInterval * this.options.graduationRange;
- },
-
- getMinusChartSize: function() {
- if (this.options.graduationMin >= 0) return 0;
- return Math.abs(this.options.graduationMin) / this.options.graduationInterval * this.options.graduationRange;
- },
-
- getBarSize: function(param) {
- var size = param.getValue() / this.options.graduationInterval * this.options.graduationRange;
- return Math.abs(size);
- },
-
- getFontSize: function() {
- var arr = this.fontSize.split(' ');
- if (arr.length == 0) return 0;
-
- var size = arr.detect(function(child) {
- return child.match(/px$/);
- });
- if (!size) return 0;
-
- var index = size.indexOf('px');
- if (index < 1) return 0;
-
- size = size.substring(0, index);
- if (isNaN(size)) return 0;
-
- return parseInt(size);
- }
-}
-
-var HorizontalBarChart = Class.create();
-Object.extend(Object.extend(HorizontalBarChart.prototype, AbstractBarChart.prototype), {
-
- init: function() {
- this.nameWidth = 125;
- this.valueWidth = 50;
- this.itemInterval = 35;
- this.adjustWidth = (document.all) ? 5 : 0;
- },
-
- buildGraduationLine: function() {
- if (!this.options.graduation)
- return Builder.node('DIV', {style: 'margin-bottom: 5px; text-align: center;'});
-
- var array = new Array();
- var i = this.options.graduationMin;
- //var width = (document.all) ? this.options.graduationRange : this.options.graduationRange - 2;
- var width = this.options.graduationRange;
-
- var style = new StyleManager();
- style.cache('border-left', this.graduationLine);
- style.cache('height', '5px');
- style.cache('font-size', '5px');
-
- while (i <= this.options.graduationMax) {
-
- var j = i + this.options.graduationInterval;
- if (j <= this.options.graduationMax)
- style.add('border-top', this.graduationLine);
-
- var elm = Builder.node(
- 'DIV',
- {style: 'float: left; font: ' + this.fontSize + '; width: ' + width + 'px;'},
- [
- Builder.node('DIV', [i]),
- Builder.node('DIV', {style: style.output()})
- ]
- );
-
- array.push(elm);
- i = j;
- style.clear();
- }
- return Builder.node('DIV', {style: 'margin-left: ' + (this.nameWidth + this.valueWidth) + 'px; padding-bottom: ' + this.itemInterval + 'px;'}, array);
- },
-
- buildContent: function() {
- var nodes = new Array();
-
- var valueStyle = new StyleManager();
- valueStyle.cache('font', this.fontSize);
- valueStyle.cache('text-align', 'right');
-
- for (var i = 0; i < this.params.length; i++) {
- var child = this.params[i];
-
- var maxSize;
- if (child.getValue() > 0) maxSize = this.getPlusChartSize();
- else maxSize = this.getMinusChartSize();
-
- var barSize = this.getBarSize(child);
- barSize = (barSize > maxSize) ? maxSize : barSize;
-
- var barNode;
- if (child.options.image) {
- if (child.getValue() > 0) {
-
- barNode = Builder.node('DIV',
- [
- Builder.node(
- 'IMG',
- {
- src: child.options.image,
- alt: 'bar',
- width: barSize + 'px',
- height: child.options.imageHeight + 'px',
- style: 'float: left; margin-left: ' + (this.getMinusChartSize() + this.valueWidth) + 'px;'
- }),
- Builder.node(
- 'DIV',
- {style: 'font: ' + this.fontSize + ';'},
- [child.getValue()])
- ]);
- } else {
- // IE fix
- var leftMargin = this.getMinusChartSize() - barSize;
- var width;
- if (document.all && leftMargin > 125) {
- width = leftMargin + this.valueWidth;
- leftMargin = 0;
- } else {
- width = this.valueWidth;
- }
-
- valueStyle.add('margin-left', leftMargin + 'px');
- valueStyle.add('width', width + 'px');
- valueStyle.add('float', 'left');
-
- barNode = Builder.node(
- 'DIV',
- [
- Builder.node('DIV', {style: valueStyle.output()}, [child.getValue()]),
- Builder.node('IMG', {src: child.options.image, alt: 'bar', width: barSize + 'px', height: child.options.imageHeight + 'px'})
- ]);
- }
-
- } else {
- if (child.getValue() > 0) {
- barNode = Builder.node(
- 'DIV',
- {style: 'font: ' + this.fontSize + '; margin-left: ' + (this.getMinusChartSize() + this.nameWidth + this.valueWidth + this.adjustWidth) + 'px; border-left: ' + barSize + 'px solid ' + child.options.color + ';'},
- [child.getValue()]
- );
- } else {
- var width = (document.all) ? (this.valueWidth + barSize) : this.valueWidth;
-
- valueStyle.add('margin-left', (this.nameWidth + this.getMinusChartSize() - barSize) + 'px');
- valueStyle.add('width', width + 'px');
- valueStyle.add('border-right', barSize + 'px solid ' + child.options.color);
-
- barNode = Builder.node(
- 'DIV',
- [
- Builder.node('DIV', {style: valueStyle.output()}, [child.getValue()])
- ]
- );
- }
- }
-
- var elm = Builder.node(
- 'DIV',
- {style: 'margin-bottom: 10px;'},
- [
- Builder.node('DIV', {style: 'text-align: right; font: ' + this.fontSize + ';float: left; width: ' + this.nameWidth + 'px;'}, [child.getName()]),
- barNode
- ]);
-
- nodes.push(elm);
- valueStyle.clear();
- }
-
- return nodes;
- }
-});
-
-var VerticalBarChart = Class.create();
-Object.extend(Object.extend(VerticalBarChart.prototype, AbstractBarChart.prototype), {
-
- init: function() {
- },
-
- buildGraduationLine: function() {
- if (!this.options.graduation) return Builder.node('DIV');
-
- var numberArray = new Array();
- var lineArray = new Array();
- var i = this.options.graduationMax;
- var next;
- var lineHeight = (document.all) ? this.options.graduationRange : this.options.graduationRange - 2;
- var marginTop = lineHeight - this.getFontSize();
-
- var numberStyle = new StyleManager();
- numberStyle.cache('font', this.fontSize);
-
- var lineStyle = new StyleManager();
- lineStyle.cache('font', this.fontSize);
-
- while (i >= this.options.graduationMin) {
- next = i - this.options.graduationInterval;
- lineHeight = (document.all) ? lineHeight - 0.3: lineHeight - 0.1;
-
- if (i == this.options.graduationMax) {
- lineStyle.add('margin-top', '0px');
-
- } else if (next < this.options.graduationMin) {
- numberStyle.add('margin-top', marginTop + 'px');
- lineStyle.add('border-left', this.graduationLine);
- lineStyle.add('border-top', this.graduationLine);
- lineStyle.add('border-bottom', this.graduationLine)
- lineStyle.add('height', lineHeight + 'px');
- lineStyle.add('width', '100%');
-
- } else {
- numberStyle.add('margin-top', marginTop + 'px');
- lineStyle.add('border-left', this.graduationLine);
- lineStyle.add('border-top', this.graduationLine);
- lineStyle.add('height', lineHeight + 'px');
- lineStyle.add('width', '100%');
- }
-
- numberArray.push(Builder.node('DIV', {style: numberStyle.output()}, [i]));
-
- if (i == this.options.graduationMax) {
- lineArray.push(Builder.node('DIV', {style: lineStyle.output()}, [Builder.node('BR')]));
- } else {
- lineArray.push(Builder.node('DIV', {style: lineStyle.output()}));
- }
-
- numberStyle.clear();
- lineStyle.clear();
-
- marginTop -= (document.all) ? 0.05 : 0.1;
- i = next;
- }
-
- return [
- Builder.node('DIV', {style: 'float: left; margin-left: 10px; width: 25px; text-align: right;'}, numberArray),
- Builder.node('DIV', {style: 'float: left; margin-right: 10px; margin-left: 10px; width: 5px;'}, lineArray)
- ];
- },
-
- buildContent: function() {
- var nodes = new Array();
-
- for (var i = 0; i < this.params.length; i++) {
- var child = this.params[i];
-
- var maxSize;
- if (child.getValue() > 0) maxSize = this.getPlusChartSize();
- else maxSize = this.getMinusChartSize();
-
- var barSize = this.getBarSize(child);
- barSize = (barSize > maxSize) ? maxSize : barSize;
-
- var bar;
- if (child.options.image) {
- bar = Builder.node('IMG', {src: child.getImage(), alt: 'bar', width: '10px', height: barSize + 'px'});
- } else {
- bar = Builder.node('DIV', {style: 'border-top: ' + barSize + 'px solid ' + child.options.color + '; width: 10px; font-size: 0;'});
- }
-
- var elm;
- if (child.getValue() > 0) {
- elm = Builder.node(
- 'DIV',
- {style: 'float: left; margin-right: 10px; width: 25px;'},
- [
- Builder.node('DIV', {style: 'margin-top: ' + (maxSize - barSize) + 'px; font: ' + this.fontSize + ';'}, [child.getValue()]),
- bar,
- Builder.node('DIV', {style: 'margin-top: ' + (this.getMinusChartSize() + 15) + 'px; font: ' + this.fontSize + '; padding-top: 5px; width: 10px;'}, [child.getName()])
- ]);
- } else {
- elm = Builder.node(
- 'DIV',
- {style: 'float: left; margin-right: 10px; width: 25px;'},
- [
- Builder.node('DIV', {style: 'margin-top: ' + (this.getPlusChartSize() + this.getFontSize()) + 'px'}),
- bar,
- Builder.node('DIV', {style: 'font: ' + this.fontSize + ';'}, [child.getValue()]),
- Builder.node('DIV', {style: 'margin-top: ' + (maxSize + 15 - (this.getFontSize() + barSize)) + 'px; font: ' + this.fontSize + '; padding-top: 5px; width: 10px;'}, [child.getName()])
- ]);
- }
-
- nodes.push(elm);
- }
-
- nodes.push(Builder.node('DIV', {style: 'clear: left;'}));
- return nodes;
- }
-});
-
-var ChartParameter = Class.create();
-ChartParameter.prototype = {
-
- initialize: function(name, value) {
- if (isNaN(value)) throw '[ChartParameter] value property must be number!(' + value + ')';
-
- this.name = name;
- this.value = value;
-
- this.options = Object.extend({
- color: '#FF0000',
- barHeight: '15',
- image: false,
- imageHeight: '15',
- action: false
- }, arguments[2] || {});
- },
-
- getName: function() {
- return this.name;
- },
-
- getValue: function() {
- return this.value;
- },
-
- setValue: function(value) {
- if (!value || isNaN(value)) this.value = 0;
- else this.value = value;
- },
-
- getImage: function() {
- return this.options.image;
- }
-}
-
-var StyleManager = Class.create();
-StyleManager.prototype = {
-
- initialize: function() {
- this.cacheItems = new Array();
- this.items = new Array();
- },
-
- cache: function(style) {
- if (typeof(style) == 'object')
- this.cacheItems.push(style);
- else if (arguments[1])
- this.cacheItems.push(new StyleItem(style, arguments[1]));
- },
-
- add: function(style) {
- if (typeof(style) == 'object')
- this.items.push(style);
- else if (arguments[1])
- this.items.push(new StyleItem(style, arguments[1]));
- },
-
- get: function(name) {
- return this.items.detect(function(child) {
- return child.getName() == name;
- });
- },
-
- remove: function(name) {
- this.items = this.items.findAll(function(child) {
- return child.getName() != name;
- });
- },
-
- clear: function(name) {
- this.items = new Array();
- },
-
- modify: function(name, value) {
- var item = this.get(name);
-
- if (item) item.setValue(value);
- else this.add(name, value);
- },
-
- output: function() {
- var style = '';
-
- this.cacheItems.each(function(child) {
- style += child.toString();
- });
-
- this.items.each(function(child) {
- style += child.toString();
- });
-
- return style;
- }
-}
-
-var StyleItem = Class.create();
-StyleItem.prototype = {
-
- initialize: function(name, value) {
- this.name = name;
- this.value = value;
- },
-
- setName: function(name) {
- this.name = name;
- },
-
- setValue: function(value) {
- this.value = value;
- },
-
- getName: function() {
- return this.name;
- },
-
- getValue: function() {
- return this.value;
- },
-
- toString: function() {
- return this.getName() + ':' + this.getValue() + '; ';
- }
-}
-
+// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+var AbstractBarChart = Class.create();\r
+AbstractBarChart.prototype = {\r
+\r
+ initialize: function(element, params) {\r
+ this.options = Object.extend({\r
+ title: '',\r
+ graduation: true,\r
+ graduationMin: 0,\r
+ graduationMax: 30,\r
+ graduationInterval: 10, \r
+ graduationRange: 50,\r
+ titleFont: 'normal bold 20px serif'\r
+ }, arguments[2] || {});\r
+ \r
+ this.fontSize = 'normal normal 12px serif';\r
+ this.graduationLine = '2px solid gray';\r
+ this.element = $(element);\r
+ Element.setStyle(this.element, {visibility: 'hidden'});\r
+ Element.hide(this.element);\r
+ this.params = params;\r
+ \r
+ this.init();\r
+ \r
+ this.hide();\r
+ this.refresh();\r
+ Element.setStyle(this.element, {visibility: 'visible'});\r
+ Element.show(this.element);\r
+ },\r
+ \r
+ build: function() {\r
+ return Builder.node(\r
+ 'DIV',\r
+ [this.buildTitle(), this.buildGraduationLine(), this.buildContent()]);\r
+ },\r
+ \r
+ buildTitle: function() {\r
+ return Builder.node(\r
+ 'DIV', \r
+ {style: 'font: ' + this.options.titleFont + '; margin-bottom: 5px; text-align: center;'},\r
+ [this.options.title]\r
+ );\r
+ },\r
+ \r
+ show: function() {\r
+ Element.show(this.element);\r
+ }, \r
+ \r
+ hide: function() {\r
+ Element.hide(this.element);\r
+ },\r
+ \r
+ refresh: function(subject) {\r
+ if (this.chart) this.remove();\r
+ \r
+ this.chart = this.build();\r
+ this.element.appendChild(this.chart);\r
+ },\r
+ \r
+ getParam: function(name) {\r
+ return this.params.detect(function(child) {\r
+ return (child.getName() == name);\r
+ });\r
+ },\r
+ \r
+ remove: function() {\r
+ var chart = this.chart;\r
+ var element = this.element;\r
+ \r
+ $A(this.element.childNodes).any(function(child) {\r
+ if (child == chart) {\r
+ element.removeChild(child);\r
+ return true;\r
+ }\r
+ return false;\r
+ });\r
+ \r
+ this.chart = null;\r
+ },\r
+ \r
+ getChartSize: function() {\r
+ return this.getPlusChartSize() + this.getMinusChartSize();\r
+ },\r
+ \r
+ getPlusChartSize: function() {\r
+ if (this.options.graduationMax <= 0) return 0;\r
+ return this.options.graduationMax / this.options.graduationInterval * this.options.graduationRange;\r
+ },\r
+ \r
+ getMinusChartSize: function() {\r
+ if (this.options.graduationMin >= 0) return 0;\r
+ return Math.abs(this.options.graduationMin) / this.options.graduationInterval * this.options.graduationRange;\r
+ },\r
+ \r
+ getBarSize: function(param) {\r
+ var size = param.getValue() / this.options.graduationInterval * this.options.graduationRange;\r
+ return Math.abs(size);\r
+ },\r
+ \r
+ getFontSize: function() {\r
+ var arr = this.fontSize.split(' ');\r
+ if (arr.length == 0) return 0;\r
+ \r
+ var size = arr.detect(function(child) {\r
+ return child.match(/px$/);\r
+ });\r
+ if (!size) return 0;\r
+ \r
+ var index = size.indexOf('px');\r
+ if (index < 1) return 0;\r
+ \r
+ size = size.substring(0, index);\r
+ if (isNaN(size)) return 0;\r
+ \r
+ return parseInt(size);\r
+ }\r
+}\r
+\r
+var HorizontalBarChart = Class.create();\r
+Object.extend(Object.extend(HorizontalBarChart.prototype, AbstractBarChart.prototype), {\r
+ \r
+ init: function() {\r
+ this.nameWidth = 125;\r
+ this.valueWidth = 50;\r
+ this.itemInterval = 35;\r
+ this.adjustWidth = (document.all) ? 5 : 0;\r
+ },\r
+ \r
+ buildGraduationLine: function() {\r
+ if (!this.options.graduation)\r
+ return Builder.node('DIV', {style: 'margin-bottom: 5px; text-align: center;'});\r
+ \r
+ var array = new Array();\r
+ var i = this.options.graduationMin;\r
+ //var width = (document.all) ? this.options.graduationRange : this.options.graduationRange - 2;\r
+ var width = this.options.graduationRange;\r
+ \r
+ var style = new StyleManager();\r
+ style.cache('border-left', this.graduationLine);\r
+ style.cache('height', '5px');\r
+ style.cache('font-size', '5px');\r
+ \r
+ while (i <= this.options.graduationMax) {\r
+ \r
+ var j = i + this.options.graduationInterval; \r
+ if (j <= this.options.graduationMax)\r
+ style.add('border-top', this.graduationLine);\r
+ \r
+ var elm = Builder.node(\r
+ 'DIV', \r
+ {style: 'float: left; font: ' + this.fontSize + '; width: ' + width + 'px;'}, \r
+ [\r
+ Builder.node('DIV', [i]),\r
+ Builder.node('DIV', {style: style.output()})\r
+ ]\r
+ );\r
+ \r
+ array.push(elm);\r
+ i = j;\r
+ style.clear();\r
+ }\r
+ return Builder.node('DIV', {style: 'margin-left: ' + (this.nameWidth + this.valueWidth) + 'px; padding-bottom: ' + this.itemInterval + 'px;'}, array);\r
+ },\r
+ \r
+ buildContent: function() {\r
+ var nodes = new Array();\r
+ \r
+ var valueStyle = new StyleManager();\r
+ valueStyle.cache('font', this.fontSize);\r
+ valueStyle.cache('text-align', 'right');\r
+ \r
+ for (var i = 0; i < this.params.length; i++) {\r
+ var child = this.params[i];\r
+ \r
+ var maxSize;\r
+ if (child.getValue() > 0) maxSize = this.getPlusChartSize();\r
+ else maxSize = this.getMinusChartSize();\r
+ \r
+ var barSize = this.getBarSize(child);\r
+ barSize = (barSize > maxSize) ? maxSize : barSize;\r
+ \r
+ var barNode;\r
+ if (child.options.image) {\r
+ if (child.getValue() > 0) {\r
+ \r
+ barNode = Builder.node('DIV', \r
+ [\r
+ Builder.node(\r
+ 'IMG', \r
+ {\r
+ src: child.options.image,\r
+ alt: 'bar',\r
+ width: barSize + 'px', \r
+ height: child.options.imageHeight + 'px', \r
+ style: 'float: left; margin-left: ' + (this.getMinusChartSize() + this.valueWidth) + 'px;'\r
+ }),\r
+ Builder.node(\r
+ 'DIV', \r
+ {style: 'font: ' + this.fontSize + ';'}, \r
+ [child.getValue()])\r
+ ]);\r
+ } else {\r
+ // IE fix\r
+ var leftMargin = this.getMinusChartSize() - barSize;\r
+ var width;\r
+ if (document.all && leftMargin > 125) {\r
+ width = leftMargin + this.valueWidth;\r
+ leftMargin = 0;\r
+ } else {\r
+ width = this.valueWidth;\r
+ }\r
+ \r
+ valueStyle.add('margin-left', leftMargin + 'px');\r
+ valueStyle.add('width', width + 'px');\r
+ valueStyle.add('float', 'left');\r
+ \r
+ barNode = Builder.node(\r
+ 'DIV', \r
+ [\r
+ Builder.node('DIV', {style: valueStyle.output()}, [child.getValue()]),\r
+ Builder.node('IMG', {src: child.options.image, alt: 'bar', width: barSize + 'px', height: child.options.imageHeight + 'px'})\r
+ ]);\r
+ }\r
+ \r
+ } else {\r
+ if (child.getValue() > 0) {\r
+ barNode = Builder.node(\r
+ 'DIV', \r
+ {style: 'font: ' + this.fontSize + '; margin-left: ' + (this.getMinusChartSize() + this.nameWidth + this.valueWidth + this.adjustWidth) + 'px; border-left: ' + barSize + 'px solid ' + child.options.color + ';'},\r
+ [child.getValue()]\r
+ );\r
+ } else {\r
+ var width = (document.all) ? (this.valueWidth + barSize) : this.valueWidth;\r
+ \r
+ valueStyle.add('margin-left', (this.nameWidth + this.getMinusChartSize() - barSize) + 'px');\r
+ valueStyle.add('width', width + 'px');\r
+ valueStyle.add('border-right', barSize + 'px solid ' + child.options.color);\r
+ \r
+ barNode = Builder.node(\r
+ 'DIV', \r
+ [\r
+ Builder.node('DIV', {style: valueStyle.output()}, [child.getValue()])\r
+ ]\r
+ );\r
+ }\r
+ }\r
+ \r
+ var elm = Builder.node(\r
+ 'DIV', \r
+ {style: 'margin-bottom: 10px;'}, \r
+ [\r
+ Builder.node('DIV', {style: 'text-align: right; font: ' + this.fontSize + ';float: left; width: ' + this.nameWidth + 'px;'}, [child.getName()]),\r
+ barNode\r
+ ]);\r
+ \r
+ nodes.push(elm);\r
+ valueStyle.clear();\r
+ }\r
+ \r
+ return nodes;\r
+ }\r
+});\r
+\r
+var VerticalBarChart = Class.create();\r
+Object.extend(Object.extend(VerticalBarChart.prototype, AbstractBarChart.prototype), {\r
+ \r
+ init: function() {\r
+ },\r
+ \r
+ buildGraduationLine: function() {\r
+ if (!this.options.graduation) return Builder.node('DIV');\r
+ \r
+ var numberArray = new Array();\r
+ var lineArray = new Array();\r
+ var i = this.options.graduationMax;\r
+ var next;\r
+ var lineHeight = (document.all) ? this.options.graduationRange : this.options.graduationRange - 2;\r
+ var marginTop = lineHeight - this.getFontSize();\r
+ \r
+ var numberStyle = new StyleManager();\r
+ numberStyle.cache('font', this.fontSize);\r
+ \r
+ var lineStyle = new StyleManager();\r
+ lineStyle.cache('font', this.fontSize);\r
+ \r
+ while (i >= this.options.graduationMin) {\r
+ next = i - this.options.graduationInterval;\r
+ lineHeight = (document.all) ? lineHeight - 0.3: lineHeight - 0.1;\r
+ \r
+ if (i == this.options.graduationMax) {\r
+ lineStyle.add('margin-top', '0px');\r
+ \r
+ } else if (next < this.options.graduationMin) {\r
+ numberStyle.add('margin-top', marginTop + 'px');\r
+ lineStyle.add('border-left', this.graduationLine);\r
+ lineStyle.add('border-top', this.graduationLine);\r
+ lineStyle.add('border-bottom', this.graduationLine)\r
+ lineStyle.add('height', lineHeight + 'px');\r
+ lineStyle.add('width', '100%');\r
+ \r
+ } else {\r
+ numberStyle.add('margin-top', marginTop + 'px');\r
+ lineStyle.add('border-left', this.graduationLine);\r
+ lineStyle.add('border-top', this.graduationLine);\r
+ lineStyle.add('height', lineHeight + 'px');\r
+ lineStyle.add('width', '100%');\r
+ } \r
+ \r
+ numberArray.push(Builder.node('DIV', {style: numberStyle.output()}, [i]));\r
+ \r
+ if (i == this.options.graduationMax) {\r
+ lineArray.push(Builder.node('DIV', {style: lineStyle.output()}, [Builder.node('BR')]));\r
+ } else {\r
+ lineArray.push(Builder.node('DIV', {style: lineStyle.output()}));\r
+ }\r
+ \r
+ numberStyle.clear();\r
+ lineStyle.clear();\r
+ \r
+ marginTop -= (document.all) ? 0.05 : 0.1; \r
+ i = next;\r
+ }\r
+ \r
+ return [\r
+ Builder.node('DIV', {style: 'float: left; margin-left: 10px; width: 25px; text-align: right;'}, numberArray),\r
+ Builder.node('DIV', {style: 'float: left; margin-right: 10px; margin-left: 10px; width: 5px;'}, lineArray)\r
+ ];\r
+ },\r
+ \r
+ buildContent: function() {\r
+ var nodes = new Array();\r
+ \r
+ for (var i = 0; i < this.params.length; i++) {\r
+ var child = this.params[i];\r
+ \r
+ var maxSize;\r
+ if (child.getValue() > 0) maxSize = this.getPlusChartSize();\r
+ else maxSize = this.getMinusChartSize();\r
+ \r
+ var barSize = this.getBarSize(child);\r
+ barSize = (barSize > maxSize) ? maxSize : barSize;\r
+ \r
+ var bar;\r
+ if (child.options.image) {\r
+ bar = Builder.node('IMG', {src: child.getImage(), alt: 'bar', width: '10px', height: barSize + 'px'});\r
+ } else {\r
+ bar = Builder.node('DIV', {style: 'border-top: ' + barSize + 'px solid ' + child.options.color + '; width: 10px; font-size: 0;'});\r
+ }\r
+ \r
+ var elm;\r
+ if (child.getValue() > 0) {\r
+ elm = Builder.node(\r
+ 'DIV', \r
+ {style: 'float: left; margin-right: 10px; width: 25px;'},\r
+ [\r
+ Builder.node('DIV', {style: 'margin-top: ' + (maxSize - barSize) + 'px; font: ' + this.fontSize + ';'}, [child.getValue()]),\r
+ bar,\r
+ Builder.node('DIV', {style: 'margin-top: ' + (this.getMinusChartSize() + 15) + 'px; font: ' + this.fontSize + '; padding-top: 5px; width: 10px;'}, [child.getName()])\r
+ ]);\r
+ } else {\r
+ elm = Builder.node(\r
+ 'DIV', \r
+ {style: 'float: left; margin-right: 10px; width: 25px;'},\r
+ [\r
+ Builder.node('DIV', {style: 'margin-top: ' + (this.getPlusChartSize() + this.getFontSize()) + 'px'}),\r
+ bar,\r
+ Builder.node('DIV', {style: 'font: ' + this.fontSize + ';'}, [child.getValue()]),\r
+ Builder.node('DIV', {style: 'margin-top: ' + (maxSize + 15 - (this.getFontSize() + barSize)) + 'px; font: ' + this.fontSize + '; padding-top: 5px; width: 10px;'}, [child.getName()])\r
+ ]);\r
+ }\r
+ \r
+ nodes.push(elm);\r
+ }\r
+ \r
+ nodes.push(Builder.node('DIV', {style: 'clear: left;'}));\r
+ return nodes;\r
+ }\r
+});\r
+\r
+var ChartParameter = Class.create();\r
+ChartParameter.prototype = {\r
+\r
+ initialize: function(name, value) {\r
+ if (isNaN(value)) throw '[ChartParameter] value property must be number!(' + value + ')';\r
+ \r
+ this.name = name;\r
+ this.value = value;\r
+ \r
+ this.options = Object.extend({\r
+ color: '#FF0000',\r
+ barHeight: '15',\r
+ image: false,\r
+ imageHeight: '15',\r
+ action: false\r
+ }, arguments[2] || {});\r
+ },\r
+ \r
+ getName: function() {\r
+ return this.name;\r
+ },\r
+ \r
+ getValue: function() {\r
+ return this.value;\r
+ },\r
+ \r
+ setValue: function(value) {\r
+ if (!value || isNaN(value)) this.value = 0;\r
+ else this.value = value;\r
+ },\r
+ \r
+ getImage: function() {\r
+ return this.options.image;\r
+ }\r
+}\r
+\r
+var StyleManager = Class.create();\r
+StyleManager.prototype = {\r
+ \r
+ initialize: function() {\r
+ this.cacheItems = new Array();\r
+ this.items = new Array();\r
+ },\r
+ \r
+ cache: function(style) {\r
+ if (typeof(style) == 'object') \r
+ this.cacheItems.push(style);\r
+ else if (arguments[1])\r
+ this.cacheItems.push(new StyleItem(style, arguments[1]));\r
+ },\r
+ \r
+ add: function(style) {\r
+ if (typeof(style) == 'object') \r
+ this.items.push(style);\r
+ else if (arguments[1]) \r
+ this.items.push(new StyleItem(style, arguments[1]));\r
+ },\r
+ \r
+ get: function(name) {\r
+ return this.items.detect(function(child) {\r
+ return child.getName() == name;\r
+ });\r
+ },\r
+ \r
+ remove: function(name) {\r
+ this.items = this.items.findAll(function(child) {\r
+ return child.getName() != name;\r
+ });\r
+ },\r
+ \r
+ clear: function(name) {\r
+ this.items = new Array();\r
+ },\r
+ \r
+ modify: function(name, value) {\r
+ var item = this.get(name);\r
+ \r
+ if (item) item.setValue(value);\r
+ else this.add(name, value);\r
+ },\r
+ \r
+ output: function() {\r
+ var style = '';\r
+ \r
+ this.cacheItems.each(function(child) {\r
+ style += child.toString();\r
+ });\r
+ \r
+ this.items.each(function(child) {\r
+ style += child.toString();\r
+ });\r
+ \r
+ return style;\r
+ }\r
+}\r
+\r
+var StyleItem = Class.create();\r
+StyleItem.prototype = {\r
+ \r
+ initialize: function(name, value) {\r
+ this.name = name;\r
+ this.value = value;\r
+ },\r
+ \r
+ setName: function(name) {\r
+ this.name = name;\r
+ },\r
+ \r
+ setValue: function(value) {\r
+ this.value = value;\r
+ },\r
+ \r
+ getName: function() {\r
+ return this.name;\r
+ },\r
+ \r
+ getValue: function() {\r
+ return this.value;\r
+ },\r
+ \r
+ toString: function() {\r
+ return this.getName() + ':' + this.getValue() + '; ';\r
+ }\r
+}\r
+\r
-// Copyright (c) 2006 spinelz.org (http://script.spinelz.org/)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-var Calendar = Class.create();
-Calendar.className = {
- container: 'calendar',
- header: 'calendar_header',
- preYears: 'calendar_preYears',
- nextYears: 'calendar_nextYears',
- years: 'calendar_years',
- mark: 'calendar_mark',
- ym: 'calendar_ym',
- table: 'calendar_table',
- thRight: 'right',
- tdRight: 'right',
- tdBottom: 'bottom',
- date: 'calendar_date',
- holiday: 'calendar_holiday',
- regularHoliday: 'calendar_regularHoliday',
- schedule: 'calendar_schedule',
- highlightDay: 'calendar_highlightDay',
- scheduleListContainer: 'calendar_scheduleListContainer',
- scheduleItem: 'calendar_scheduleItem',
- scheduleTimeArea: 'calendar_scheduleItemTimeArea',
- scheduleHandler: 'calendar_scheduleHandler',
- holidayName: 'calendar_holidayName',
-// holidayContainer: 'calendar_holidayContainer',
- dateContainer: 'calendar_dateContainer',
- tableHeader: 'calendar_tableHeader',
- rowContent: 'calendar_rowContent',
- selected: 'calendar_selected',
-
- nextYearMark: 'calendar_nextYearMark',
- nextMonthMark: 'calendar_nextMonthMark',
- nextWeekMark: 'calendar_nextWeekMark',
- preYearMark: 'calendar_preYearMark',
- preMonthMark: 'calendar_preMonthMark',
- preWeekMark: 'calendar_preWeekMark',
-
- weekTable: 'calendar_weekContainerTable',
- weekMainTable: 'calendar_weekMainTable',
- timeLine: 'calendar_timeline',
- timeLineTimeTop: 'calendar_timelineTimeTop',
- timeLineTime: 'calendar_timelineTime',
- headerColumn: 'calendar_headerColumn',
- columnTopDate: 'calendar_columnTopDate',
- columnDate: 'calendar_columnDate',
- columnDateOdd: 'calendar_columnOddDate',
- scheduleItemSamll: 'calendar_scheduleItemSmall',
- scheduleItemLarge: 'calendar_scheduleItemLarge',
- scheduleItemNoBorder: 'calendar_scheduleItemNoBorder',
- scheduleItemSelect: 'calendar_scheduleItemSelect',
- deleteImg: 'calendar_deleteImage',
- privateImg: 'calendar_privateImage',
- scheduleContainer: 'calendar_weekScheduleContainer',
- selector: 'calendar_selector',
- cover: 'calendar_cover'
-}
-
-Calendar.smallClassName = {
- container: 'calendar_small',
- header: 'calendar_header_small',
- calendar: 'calendar_calendar_small',
- table: 'calendar_tableSmall'
-}
-
-Calendar.size = {
- large: 'large',
- small: 'small'
-}
-
-/**
- * Calendar Class
- */
-Calendar.prototype = {
-
- initialize: function(element) {
- this.building = true;
- this.element = $(element);
- Element.setStyle(this.element, {visibility: 'hidden'});
- Element.hide(this.element);
-
- this.options = Object.extend({
- initDate: new Date(),
- cssPrefix: 'custom_',
- holidays: [],
- schedules: [],
- size: Calendar.size.large,
- regularHoliday: [0, 6],
- displayIndexes: [0, 1, 2, 3, 4, 5, 6],
- displayTime: [{hour: 0, min: 0}, {hour: 24, min: 0}],
- weekIndex: 0,
- dblclickListener: null,
- afterSelect: Prototype.emptyFunction,
- beforeRefresh: Prototype.emptyFunction,
- changeSchedule: Prototype.emptyFunction,
- changeCalendar: Prototype.emptyFunction,
- displayType: 'month',
- highlightDay: true,
- beforeRemoveSchedule: function() {return true;},
- dblclickSchedule: null,
- updateTirm: Prototype.emptyFunction,
- displayTimeLine: true,
- clickDateText: null,
- monthHeaderFormat: null,
- weekHeaderFormat: null,
- weekSubHeaderFormat: null,
- dayHeaderFormat: null,
- dayOfWeek: DateUtil.dayOfWeek
- }, arguments[1] || {});
-
- this.options.holidays = this.toHolidayHash(this.options.holidays);
-// this.options.schedules = this.toScheduleHash(this.options.schedules);
-
- this.setIndex();
-
- this.classNames = null;
- if (this.options.size == Calendar.size.large) {
- this.classNames = Calendar.className;
- } else {
- this.classNames = $H({}).merge(Calendar.className);
- this.classNames = this.classNames.merge(Calendar.smallClassName);
- }
- var customCss = CssUtil.appendPrefix(this.options.cssPrefix, this.classNames);
- this.classNames = new CssUtil([this.classNames, customCss]);
-
- this.date = this.options.initDate;
-
- this.calendar = this.build();
- this.element.appendChild(this.calendar);
-
- Event.observe(document, "mouseup", this.onMouseUp.bindAsEventListener(this));
- Element.setStyle(this.element, {visibility: 'visible'});
- Element.show(this.element);
- this.builder.afterBuild();
- this.windowResize = this.onResize.bind(this);
- if (this.options.size != 'small') Event.observe(window, "resize", this.windowResize);
- this.building = false;
- },
-
- onResize: function() {
- try {
- var oldDimentions = this.builder.containerDimensions;
- var dimentions = Element.getDimensions(this.builder.container);
- if (dimentions.height != oldDimentions.height || dimentions.width != oldDimentions.width) {
- this.refresh();
- }
- } catch(e) {}
- },
-
- destroy: function() {
- Event.stopObserving(window, 'resize', this.windowResize);
- },
-
- setIndex: function() {
- var options = this.options;
- var bottom = [];
- var up = [];
- var index = null;
- options.displayIndexes.sort();
- options.displayIndexes.each(function(i) {
- if (index == null) {
- if (options.weekIndex <= i) {
- index = i;
- up.push(i);
- } else {
- bottom.push(i);
- }
- } else {
- up.push(i);
- }
- });
- options.displayIndexes = up.concat(bottom);
- this.setLastWday();
- },
-
- setLastWday: function() {
- var firstIndex = this.options.weekIndex;
- var sat = 6;
- var sun = 0;
- var week = $R(firstIndex, sat, false).toArray();
- if (firstIndex != sun) {
- week = week.concat($R(sun, firstIndex - 1, false).toArray());
- }
- this.lastWday = week.last();
- this.wdays = week;
- },
-
- build: function() {
- if (this.builder) {
- this.builder.destroy();
- }
-
- if (this.options.displayType == 'week') {
- this.builder = new CalendarWeek(this);
- } else if (this.options.displayType == 'day') {
- this.builder = new CalendarDay(this);
- } else {
- this.builder = new CalendarMonth(this);
- }
-
- this.builder.beforeBuild();
- return this.builder.build();
- },
-
- /*** Calendar ***/
- /********************************** public method **********************************/
- undo: function() {
- if (this.cached) {
- this.cached.start = this.cached.start_old;
- this.cached.finish = this.cached.finish_old;
- this.cached = null;
- this.refreshSchedule();
- }
- },
-
- hideSatSun: function() {
- var sun = 0;
- var sat = 6;
- this.options.displayIndexes = this.options.displayIndexes.without(sun, sat);
- this.setIndex();
- this.refresh();
- },
-
- showSatSun: function() {
- var sun = 0;
- var sat = 6;
- var indexes = this.options.displayIndexes;
- if (!indexes.include(sun)) {
- indexes.push(sun);
- }
- if (!indexes.include(sat)) {
- indexes.push(sat);
- }
- this.setIndex();
- this.refresh();
- },
-
- changeDisplayIndexes: function(indexes) {
- this.options.displayIndexes = indexes;
- this.setIndex();
- this.refresh();
- },
-
- changeDisplayTime: function(time) {
- this.options.displayTime = time;
- this.refresh();
- },
-
- refresh: function() {
- try {
- if (!this.building) {
- this.building = true;
- this.options.beforeRefresh(this);
- this.destroy();
- this.selectedBase = null;
- Element.remove(this.calendar);
- this.calendar = this.build();
- this.element.appendChild(this.calendar);
- this.builder.afterBuild();
- if (this.options.size != 'small') Event.observe(window, 'resize', this.windowResize);
- this.building = false;
- }
- } catch (e) {}
- },
-
- changeCalendar: function(event) {
- this.builder.changeCalendar(event);
- },
-
- changeDisplayType: function(type) {
- this.options.displayType = type;
- this.refresh();
- },
-
- selectDate: function(event) {
- var calendar = this;
- this.abstractSelect(event, function(date, element) {
- if (calendar.selectedBase || calendar.hasSelectedDate()) {
- if (event.ctrlKey) {
- if (Element.hasClassName(element, Calendar.className.selected)) {
- calendar.addSelectedClass(element);
- return;
- }
- } else if (calendar.selectedBase) {
- var selectedId = calendar.selectedBase.id;
- $(selectedId).className = calendar.selectedBase.className;
- calendar.clearSelected();
- if (selectedId == element.id) {
- calendar.selectedBase = null;
- return;
- }
- }
- }
-
- calendar.selectedBase = {id: element.id, date: date, className: element.className};
- calendar.addSelectedClass(element);
- if (date && calendar.options.displayType == 'month' && calendar.options.size == Calendar.size.small) {
- calendar.options.afterSelect(date, calendar);
- }
- });
-
- if (calendar.options.displayType != 'month' || calendar.options.size != Calendar.size.small) {
- this.mouseDown = true;
- }
- },
-
- clearSelect: function() {
- // BETA
- this.selectedBase = null;
- this.clearSelected();
- },
-
- showDayOfWeek: function(dayOfWeek) {
- var indexes = this.options.displayIndexes;
- this.recurrence(dayOfWeek, function(d) {
- if (!indexes.include(d)) {
- indexes.push(d);
- }
- });
- this.setIndex();
- this.refresh();
- },
-
- hideDayOfWeek: function(dayOfWeek) {
- var indexes = this.options.displayIndexes;
- var self = this;
- this.recurrence(dayOfWeek, function(d) {
- var index = self.findIndex(indexes, d);
- if (index) {
- indexes.remove(index);
- } else if (!index.isNaN) {
- indexes.shift();
- }
- });
- this.refresh();
- },
-
- addHoliday: function(object) {
- object = this.inspectArgument(object);
- var newHash = this.toHolidayHash(object);
- this.options.holidays = this.options.holidays.merge(newHash);
- this.refresh();
- },
-
- removeHoliday: function(date) {
- var calendar = this;
- date = calendar.inspectDateArgument(date);
- if (!date) return;
-
- this.recurrence(date, function(d) {
- var key = d.toDateString();
- if (calendar.options.holidays[key])
- delete calendar.options.holidays[key];
- });
- this.refresh();
- },
-
- refreshHoliday: function(object, rebuild) {
- object = this.inspectArgument(object);
- this.options.holidays = this.toHolidayHash(object);
- if (rebuild) this.refresh();
- },
-
- clearHoliday: function() {
- this.refreshHoliday([], true);
- },
-
- getHoliday: function(date) {
- date = this.inspectDateArgument(date);
- if (!date) return;
-
- var calendar = this;
- var holidays = [];
- this.recurrence(date, function(o) {
- var h = calendar.options.holidays[o.toDateString()];
- if (h) holidays.push(h);
- });
-
- return holidays;
- },
-
- addSchedule: function(schedule) {
- var schedules = this.options.schedules;
- if (schedule.constructor == Array) {
- schedule.each(function(s) {
- var find = schedules.detect(function(tmp) {return s.id == tmp.id});
- if (!find) schedules.push(s);
- });
- } else {
- var find = schedules.detect(function(tmp) {return tmp.id == schedule.id});
- if (!find) schedules.push(schedule);
- }
- this.refreshSchedule();
- },
-
- replaceSchedule: function(schedules) {
- this.options.schedules = schedules;
- this.refreshSchedule();
- },
-
- removeSchedule: function(ids, refresh) {
- if (ids.constructor != Array) ids = [ids];
- var self = this;
- ids.each(function(id) {
- var index = null;
- self.options.schedules.each(function(s, i) {
- if (s.id == id) {
- index = i;
- throw $break;
- }
- });
-
- if (index != null) {
- var schedule = self.options.schedules[index];
- if (schedule) {
- self.options.schedules.remove(index);
- }
- }
- });
- if (refresh) this.refreshSchedule();
- },
-
- refreshSchedule: function() {
- this.builder.scheduleNodes.each(function(node) {
- Element.remove(node);
- });
- this.builder.afterBuild();
- },
-
- mergeSchedule: function(schedule) {
- var index = -1;
- this.options.schedules.each(function(s, i) {
- if (s.id == schedule.id) {
- index = i;
- throw $break;
- }
- });
- if (index != -1) {
- this.options.schedules[index] = schedule;
- this.refreshSchedule();
- } else {
- this.addSchedule(schedule);
- }
- },
-
- clearSchedule: function() {
- this.options.schedules = [];
- this.refreshSchedule();
- },
-
- getSchedule: function(object) {
- var result = [];
- var calendar = this;
- object = this.inspectArgument(object || {});
-
- this.recurrence(object, function(o) {
- var schedule = calendar.options.schedules[o.date.toDateString()];
- if (!schedule) return;
-
- if (o.start) {
- schedule = schedule.detect(function(s) {
- return ((s.start.hour == o.start.hour) && (s.start.min == o.start.min));
- });
- if (schedule) result.push(schedule);
- } else if (o.number) {
- schedule = schedule[o.number];
- if (schedule) result.push(schedule);
- } else {
- result = result.concat(schedule);
- }
- });
-
- return result;
- },
-
- getSelected: function() {
- return this.element.getElementsByClassName(Calendar.className.selected, this.element);
- },
-
- changeSchedule: function() {
- var calendar = this;
- return function(drag, drop) {
- var array = drag.id.split('_');
- var i = array.pop();
- var date = array.pop();
-
- date = calendar.getDate(date);
- var newDate = calendar.getDate(drop);
-
- var schedule = calendar.getSchedule({date: date, number: i});
- if (schedule.length != 1) return;
-
- schedule = schedule.pop();
- schedule.date = newDate;
- calendar.removeSchedule({date: date, number: i}, false);
- calendar.addSchedule(schedule);
-
- calendar.options.changeSchedule(schedule);
- }
- },
-
- getSelectedDates: function() {
- return this.builder.getSelectedDates();
- },
-
- getSelectedTerm: function() {
- return this.builder.getSelectedTerm();
- },
-
- /********************************** private method **********************************/
- abstractSelect: function(event, method) {
- this.builder.abstractSelect(event, method);
- },
-
- createRange: function(a, b) {
- var range = null;
- if (a <= b)
- range = $R(a, b);
- else
- range = $R(b, a);
- return range;
- },
-
- formatTime: function(time) {
- var hour = (time.hour < 10) ? '0' + time.hour : time.hour;
- var min = (time.min < 10) ? '0' + time.min : time.min;
- return hour + ':' + min;
- },
-
- clearSelected: function() {
- var elements = this.getSelected();
- var self = this;
- elements.each(function(e) {
- if (Element.hasClassName(e, Calendar.className.selected))
- self.removeSelectedClass(e);
- });
- },
-
- onDblClick: function(event) {
- this.abstractSelect(event, this.options.dblclickListener);
- },
-
- onMouseUp: function(event) {
- var e = event || window.event;
- var calendar = this;
- if (calendar.mouseDown) {
- setTimeout(function() {
- calendar.mouseDown = false;
- calendar.options.afterSelect(event);
- }, 10);
- }
- },
-
- setRegularHolidayClass: function(node) {
- this.classNames.refreshClassNames(node, 'regularHoliday');
- },
-
- setHolidayClass: function(node) {
- this.classNames.refreshClassNames(node, 'holiday');
- },
-
- setWorkdayClass: function(node) {
- this.classNames.refreshClassNames(node, 'date');
- },
-
- setScheduleClass: function(node) {
- this.classNames.refreshClassNames(node, 'schedule');
- },
-
- addHighlightClass: function(node) {
- Element.addClassName(node, Calendar.className.highlightDay);
- },
-
- addSelectedClass: function(node) {
- Element.addClassName(node, Calendar.className.selected);
- },
-
- removeSelectedClass: function(node) {
- Element.removeClassName(node, Calendar.className.selected);
- },
-
- getDatasWithMonthAndYear: function(array) {
- var calendar = this;
- var result = array.findAll(function(h) {
- return calendar.isSameYearAndMonth(h.date);
- });
-
- return result;
- },
-
- isSameYearAndMonth: function(a, b) {
- if (a.constructor == Date) {
- if (!b) b = this.date;
- return ((a.getYear() == b.getYear()) && (a.getMonth() == b.getMonth()));
- } else {
- return (a.year == b.year && a.month == b.month && a.day == a.day);
- }
- },
-
- isSameDate: function(a, b) {
- if (a.constructor == Date) {
- if (!b) b = this.date;
- return (this.isSameYearAndMonth(a, b) && (a.getDate() == b.getDate()));
- } else {
- return (this.isSameYearAndMonth(a, b) && a.day == b.day);
- }
- },
-
- isSameTime: function(a, b) {
- return ((a.hour == b.hour) && (a.min == b.min));
- },
-
- betweenDate: function(schedule, date) {
- var start = this.toDateNumber(schedule.start);
- var finish = this.toDateNumber(schedule.finish);
- date = this.toDateNumber(date);
- return start <= date && date <= finish;
- },
-
- toDateNumber: function(date) {
- if (date.constructor == Date) {
- return date.getFullYear() * 10000 + date.getMonth() * 100 + date.getDate();
- } else {
- return date.year * 10000 + date.month * 100 + date.day;
- }
- },
-
- getTimeDiff: function(a, b) {
- var time = {hour: b.hour - a.hour, min: b.min - a.min};
- if (time.min >= 60) {
- time.hour++;
- time.min -= 60;
- } else if (time.min < 0) {
- time.hour--;
- time.min += 60;
- }
- return time;
- },
-
- findIndex: function(array, value) {
- var index = null;
- array.each(function(v, i) {
- if (v == value) {
- index = i;
- throw $break;
- }
- });
- return index;
- },
-
- recurrence: function(object, method) {
- var calendar = this;
- if (object.constructor == Array) {
- object.each(function(o) {calendar.recurrence(o, method)});
- } else if (object.keys) {
- object.each(function(pair) {calendar.recurrence(pair[1], method)});
- } else {
- method(object);
- }
- },
-
- toHolidayHash: function(object) {
- var calendar = this;
- var hash = {};
-
- this.recurrence(object, function(o) {
- if (!o.name) return;
- if (o.date.constructor == Object)
- o.date = new Date(o.date.year, o.date.month, o.date.day);
-
- hash[o.date.toDateString()] = o;
- });
- return $H(hash);
- },
-
-// toScheduleHash: function(object) {
-// var calendar = this;
-// var hash = {};
-//
-// this.recurrence(object, function(o) {
-// if (!o.description) return;
-// if (o.date.constructor == Object)
-// o.date = new Date(o.date.year, o.date.month, o.date.day);
-//
-// var date = o.date.toDateString();
-// o.date = date;
-//
-// if (hash[date]) {
-// hash[date].push(o);
-// hash[date].sort(calendar.sortSchedule);
-// } else {
-// hash[date] = [o];
-// }
-// });
-// return $H(hash);
-// },
-
- inspectArgument: function(object, time) {
- return this.builder.inspectArgument(object, time);
- },
-
- inspectDateArgument: function(date) {
- return this.builder.inspectDateArgument(date);
- },
-
- sortSchedule: function(a, b) {
- if (a.start.hour == b.start.hour) {
- if (a.start.min == b.start.min)
- return 0;
- if (a.start.min < b.start.min)
- return -1;
- return 1;
- }
- if (a.start.hour < b.start.hour) return -1;
-
- return 1;
- },
-
- hasSelectedDate: function() {
- return (this.getSelected().length != 0);
- },
-
- getDate: function(element) {
- return this.builder.getDate(element);
- },
-
- isRegularHoliday: function(day) {
- return this.options.regularHoliday.include(day);
- },
-
- isHoliday: function(date) {
- return this.options.holidays[date.toDateString()];
- },
-
- isScheduleDay: function(date) {
- return this.options.schedules[date.toDateString()];
- },
-
- cacheSchedule: function(schedule) {
- this.cached = schedule;
- schedule.start_old = Object.clone(schedule.start);
- schedule.finish_old = Object.clone(schedule.finish);
- }
-}
-
-
-/**
- * AbstractCalendar Class
- */
-var AbstractCalendar = Class.create();
-AbstractCalendar.id = {
- container: 'container',
- scheduleContainer: 'scheduleContainer',
- selector: 'selector'
-}
-AbstractCalendar.prototype = {
- destroy: Prototype.emptyFunction,
- beforeBuild: Prototype.emptyFunction,
-
- build: function() {
- this.header = this.buildHeader();
- var node = Builder.node(
- 'DIV',
- {
- id: this.getContainerId(),
- className: this.calendar.classNames.joinClassNames('container')
- },
- [this.header, this.buildCalendar()]);
-
- return node;
- },
-
- buildHeader: function() {
- var headerNodes = Builder.node('TR');
- headerNodes.appendChild(this.buildHeaderLeft());
- headerNodes.appendChild(this.buildHeaderCenter());
- headerNodes.appendChild(this.buildHeaderRight());
-
- className = this.calendar.classNames.joinClassNames('header');
- var tbody = Builder.node('TBODY', [headerNodes]);
- return Builder.node('TABLE', {className: className}, [tbody]);
- },
-
- buildSelector: function() {
- // create selector
- var selector = Builder.node('DIV', {id: this.getSelectorId()});
- this.calendar.classNames.addClassNames(selector, 'selector');
- Element.setOpacity(selector, 0.6);
- Element.hide(selector);
- Element.setStyle(selector, {zIndex: ZindexManager.getIndex()})
- return selector;
- },
-
- buildCover: function() {
- this.cover = Builder.node('div', {id: this.calendar.element.id.appendSuffix('cover')});
- this.calendar.classNames.addClassNames(this.cover, 'cover');
- Event.observe(this.cover, 'mousedown', this.calendar.selectDate.bindAsEventListener(this.calendar));
- if (this.calendar.options.displayType != 'month' || this.calendar.options.size != 'samll') {
- Event.observe(this.cover, 'mousemove', this.multipleSelection.bindAsEventListener(this));
- }
- return this.cover;
- },
-
- buildScheduleContainer: function() {
- this.container = Builder.node('DIV', {style: 'position: relative', id: this.getScheduleContainerId()});
- return this.container;
- },
-
- // the default is empty.
- // overwride this method.
- setScheduleContainerEvent: Prototype.emptyFunction,
-
- changeCalendar: function(event) {
- var element = Event.element(event);
- var date = this.calendar.date;
- var oldDate = new Date(date.toDateString());
-
- if (Element.hasClassName(element, Calendar.className.preYearMark)) {
- date.setFullYear(date.getFullYear() - 1);
- } else if (Element.hasClassName(element, Calendar.className.preMonthMark)) {
- date.setDate(1);
- date.setMonth(date.getMonth() - 1);
- } else if (Element.hasClassName(element, Calendar.className.preWeekMark)) {
- date.setDate(date.getDate() - 7);
- } else if (Element.hasClassName(element, Calendar.className.nextYearMark)) {
- date.setFullYear(date.getFullYear() + 1);
- } else if (Element.hasClassName(element, Calendar.className.nextMonthMark)) {
- date.setDate(1);
- date.setMonth(date.getMonth() + 1);
- } else if (Element.hasClassName(element, Calendar.className.nextWeekMark)) {
- date.setDate(date.getDate() + 7);
- }
-
- this.calendar.options.changeCalendar(date, oldDate);
- this.calendar.refresh();
- },
-
- clickDeleteImage: function(schedule) {
- if (this.calendar.options.beforeRemoveSchedule(schedule)) {
- this.calendar.removeSchedule(schedule.id, true);
- }
- },
-
- showDeleteImage: function(img) {
- Element.show(img);
- },
-
- hideDeleteImage: function(img) {
- Element.hide(img);
- },
-
- _constrain: function(n, lower, upper) {
- if (n > upper) return upper;
- else if (n < lower) return lower;
- else return n;
- },
-
- getContainerId: function() {
- return this.calendar.element.id.appendSuffix(AbstractCalendar.id.container);
- },
-
- getScheduleContainerId: function() {
- return this.calendar.element.id.appendSuffix(AbstractCalendar.id.scheduleContainer);
- },
-
- setColumnWidth: function() {
- var adjustSize = this.getAdjustSize();
- var container = $(this.getScheduleContainerId()) || this.container;
- var indexes = this.calendar.options.displayIndexes;
- this.column.width = container.offsetWidth / indexes.length - adjustSize;
- if (this.column.width < 0) this.column.width = 0;
- },
-
- setCover: function() {
- var container = $(this.getScheduleContainerId()) || this.container;
- if (!this.cover) {
- container.appendChild(this.buildCover());
- }
- Element.setStyle(this.cover, {height: Element.getHeight(container) + 'px'});
- },
-
- getDragDistance: function() {
- var adjustSize = this.getAdjustSize();
-// return [this.column.width + adjustSize, this.column.height];
- return [this.column.width + adjustSize, this.column.height / 2];
- },
-
- getWeek: function() {
- var date = this.calendar.date;
- var baseDay = date.getDay();
- var baseDayIndex = date.getDay();
- var findBaseDay = false;
-
- return this.calendar.options.displayIndexes.map(function(week, i) {
- var diff = week - baseDay;
- if (!findBaseDay && (diff > 0)) diff -= 7;
- if (baseDayIndex == week) findBaseDay = true;
- return DateUtil.afterDays(date, diff);
- });
- },
-
- isSameStartDate: function(schedule, date) {
- return ((date.getFullYear() == schedule.start.year) &&
- (date.getMonth() == schedule.start.month) && (date.getDate() == schedule.start.day));
- },
-
- isSameFinishDate: function(schedule, date) {
- return ((date.getFullYear() == schedule.finish.year) &&
- (date.getMonth() == schedule.finish.month) && (date.getDate() == schedule.finish.day));
- },
-
- getSelectorId: function() {
- return this.calendar.element.id.appendSuffix(AbstractCalendar.id.selector);
- },
-
- clickDateText: function(event, date) {
- Event.stop(event);
- this.calendar.date = date;
- this.calendar.options.displayType = 'day';
- this.calendar.refresh();
- },
-
- getAdjustSize: function() {
- return UserAgent.isIE() ? 3 : 3;
- },
-
- setContainerInfo: function() {
- this.container = $(this.getScheduleContainerId());
- this.containerDimensions = Element.getDimensions(this.container);
- this.containerOffset = Position.cumulativeOffset(this.container);
- },
-
- mouseOverSubSchedule: function(items) {
- items.each(function(item) {
- Element.addClassName(item, Calendar.className.scheduleItemSelect);
- });
- },
-
- mouseOutSubSchedule: function(items) {
- items.each(function(item) {
- Element.removeClassName(item, Calendar.className.scheduleItemSelect);
- });
- },
-
- toDate: function(hash) {
- return DateUtil.toDate(hash);
- }
-}
-
-
-/**
- * CalenderMonth Class
- */
-var CalendarMonth = Class.create();
-CalendarMonth.id = {
- year: 'year',
- month: 'month',
- column: 'column',
- nextYear: 'nextYear',
- nextMonth: 'nextMonth',
- preYear: 'preYear',
- preMonth: 'preMonth',
- calTable: 'calTable',
- scheduleContainer: 'scheduleContainer',
- container: 'container'
-}
-Object.extend(CalendarMonth.prototype, AbstractCalendar.prototype);
-Object.extend(CalendarMonth.prototype, {
-
- initialize: function(calendar) {
- this.calendar = calendar;
- this.week = this.getWeek();
- },
-
- /*** Month ***/
- /********************************** build functions **********************************/
- buildHeaderLeft: function() {
- var container = Builder.node('TD');
- this.calendar.classNames.addClassNames(container, 'preYears');
-
- var id = this.calendar.element.id.appendSuffix(CalendarMonth.id.preYear);
- var node = Builder.node('DIV', {id: id});
- this.calendar.classNames.addClassNames(node, 'preYearMark');
- Event.observe(node, "click", this.calendar.changeCalendar.bindAsEventListener(this.calendar));
- container.appendChild(node);
-
- id = this.calendar.element.id.appendSuffix(CalendarMonth.id.preMonth);
- node = Builder.node('DIV', {id: id});
- this.calendar.classNames.addClassNames(node, 'preMonthMark');
- Event.observe(node, "click", this.calendar.changeCalendar.bindAsEventListener(this.calendar));
- container.appendChild(node);
-
- return container;
- },
-
- buildHeaderCenter: function() {
- var text = [];
- if (this.calendar.options.monthHeaderFormat) {
- var date = this.calendar.date;
- var templ = new Template(this.calendar.options.monthHeaderFormat);
- text = [templ.evaluate({year: date.getFullYear(), month: date.getMonth() + 1}), ' '];
- }
- var contents = [];
-
- var id = this.calendar.element.id.appendSuffix(CalendarMonth.id.month);
- var node = Builder.node('SPAN', {id: id}, [text[0] || DateUtil.months[this.calendar.date.getMonth()]]);
- this.calendar.classNames.addClassNames(node, 'ym');
- contents.push(node);
-
- id = this.calendar.element.id.appendSuffix(CalendarMonth.id.year);
- node = Builder.node('SPAN', {id: id}, [text[1] || this.calendar.date.getFullYear()]);
- this.calendar.classNames.addClassNames(node, 'ym');
- contents.push(node);
-
- var container = Builder.node('TD', contents);
- this.calendar.classNames.addClassNames(container, 'years');
-
- return container;
- },
-
- buildHeaderRight: function() {
- var container = Builder.node('TD');
- this.calendar.classNames.addClassNames(container, 'nextYears');
-
- var id = this.calendar.element.id.appendSuffix(CalendarMonth.id.nextMonth);
- var node = Builder.node('DIV', {id: id});
- this.calendar.classNames.addClassNames(node, 'nextMonthMark');
- Event.observe(node, "click", this.calendar.changeCalendar.bindAsEventListener(this.calendar));
- container.appendChild(node);
-
- id = this.calendar.element.id.appendSuffix(CalendarMonth.id.nextYear);
- node = Builder.node('DIV', {id: id});
- this.calendar.classNames.addClassNames(node, 'nextYearMark');
- Event.observe(node, "click", this.calendar.changeCalendar.bindAsEventListener(this.calendar));
- container.appendChild(node);
-
- return container;
- },
-
- buildCalendar: function() {
- var container = Builder.node('DIV');
- var scheduleContainer = Builder.node('DIV',
- {id: this.getScheduleContainerId(), style: 'position: relative'},
- [this.buildTableData()]);
- this.setScheduleContainerEvent(scheduleContainer);
-
- // create selector
- var selector = this.buildSelector();
- scheduleContainer.appendChild(selector);
- return Builder.node('DIV', [this.buildTableHeader(), scheduleContainer]);
- },
-
- buildTableHeader: function() {
- var weekArray = new Array();
- var self = this;
- var tbody = Builder.node('TBODY');
- var tr = Builder.node('TR', weekArray);
- var width = 100 / this.calendar.options.displayIndexes.length + '%';
- var lastIndex = this.calendar.options.displayIndexes.last();
-
- tbody.appendChild(tr);
-
- this.calendar.options.displayIndexes.each(function(i) {
- var id = self.calendar.element.id.appendSuffix(CalendarMonth.id.column);
- var text = self.calendar.options.dayOfWeek[i];
- var node = Builder.node('TH', {id: id.appendSuffix(i)}, [text]);
- node.width = width;
- weekArray.push(node);
- if (lastIndex == i) {
- self.calendar.classNames.addClassNames(node, 'thRight');
- }
- Event.observe(node, 'click', self.selectDay.bindAsEventListener(self));
- tr.appendChild(node);
- });
-
- return Builder.node('TABLE',
- {className: this.calendar.classNames.joinClassNames('table')}, [tbody]);
- },
-
- buildTableData: function() {
- var indexes = this.calendar.options.displayIndexes;
- var today = new Date();
- var year = this.calendar.date.getFullYear();
- var month = this.calendar.date.getMonth();
- var firstDay = DateUtil.getFirstDate(year, month).getDay();
- var lastDate = DateUtil.getLastDate(year, month).getDate();
- var trs = new Array();
- var tds = new Array();
- var width = 100 / indexes.length + '%';
- var lastIndex = indexes.last();
- var node, hday, sday, tmp_date, isOutside, i = null;
-
- // set start index
- var weekIndex = this.calendar.options.weekIndex;
- var length = DateUtil.dayOfWeek.length * 5;
- var i = null;
- var day = 1;
- if (weekIndex <= firstDay) {
- i = weekIndex;
- length += i;
- } else {
- i = weekIndex - 7;
- length -= i;
- }
-
- var diff = firstDay - weekIndex;
- if (diff < 0) diff + indexes.length;
- if ((lastDate + diff) > length) {
- length += indexes.length;
- }
-
- var wday = weekIndex;
-
- var find = 0;
- for (; i < length; i++) {
- if (indexes.include(wday)) {
- if (i < firstDay) {
- tmp_date = new Date(
- this.calendar.date.getFullYear(),
- this.calendar.date.getMonth(),
- i - firstDay + 1
- );
- node = Builder.node('TD');
- node.innerHTML = ' ';
- node.date = tmp_date;
- node.width = width;
- tds.push(node);
- } else if (day > lastDate) {
- tmp_date = new Date(
- this.calendar.date.getFullYear(),
- this.calendar.date.getMonth(),
- day
- );
- node = Builder.node('TD');
- node.innerHTML = ' ';
- node.date = tmp_date;
- tds.push(node);
- } else {
- if (i == firstDay) length += find;
- tmp_date = new Date(
- this.calendar.date.getFullYear(),
- this.calendar.date.getMonth(),
- day
- );
- hday = this.calendar.options.holidays[tmp_date.toDateString()];
-
- if (this.calendar.options.size == Calendar.size.large) {
- node = this.buildLargeRow(tmp_date, hday, sday, today);
- if (this.calendar.options.dblclickListener) {
- Event.observe(node, 'dblclick', this.calendar.onDblClick.bindAsEventListener(this.calendar));
- }
- } else {
- sday = this.calendar.options.schedules.detect(function(schedule) {
- var startDate = DateUtil.toDate(schedule.start);
- return tmp_date.sameDate(startDate)
- });
- node = this.buildSmallRow(tmp_date, hday, sday, today);
- Event.observe(node, 'mousedown', this.calendar.selectDate.bindAsEventListener(this.calendar));
- }
-
- node.width = width;
- node.date = tmp_date;
-
- tds.push(node);
- }
- find++;
- }
-
- if (i >= firstDay) {
- day++;
- }
-
- if (wday == lastIndex) {
- trs.push(Builder.node('TR', tds));
- this.calendar.classNames.addClassNames(tds[tds.length - 1], 'tdRight');
- tds = new Array();
- }
-
- if (wday >= 6) {
- wday = 0;
- } else {
- wday++;
- }
- }
-
- this.rowMax = trs.length - 1;
- var tbody = Builder.node('TBODY', [trs]);
- this.calendarTable = Builder.node(
- 'TABLE',
- {
- id: this.getCalendarTableId(),
- className: this.calendar.classNames.joinClassNames('table')
- },
- [tbody]);
- return this.calendarTable;
- },
-
- buildLargeRow: function(date, holiday, schedule, today) {
- var calendar = this;
- var row = Builder.node('TD', {id: this.getDateId(date)});
- var dateContainer = Builder.node('DIV');
-
- this.calendar.classNames.addClassNames(dateContainer, 'dateContainer');
- row.appendChild(dateContainer);
-
- var dateNode = null;
- var clickDateText = this.calendar.options.clickDateText;
- if (clickDateText) {
- dateNode = Builder.node('A', {href: '#'}, [date.getDate()]);
- Event.observe(dateContainer, 'mousedown', clickDateText.bindAsEventListener(this, date));
- } else if (clickDateText == null) {
- dateNode = Builder.node('A', {href: '#'}, [date.getDate()]);
- Event.observe(dateContainer, 'mousedown', this.clickDateText.bindAsEventListener(this, date));
- } else {
- dateNode = Builder.node('SPAN', [date.getDate()]);
- Element.setStyle(dateNode, {textDecoration: 'none'});
- }
- if (date.days() == today.days()) {
- this.calendar.addHighlightClass(dateNode);
- }
- dateContainer.appendChild(dateNode);
-
- if (holiday) {
- this.calendar.setHolidayClass(row);
- var name = Builder.node(
- 'SPAN',
- {className: this.calendar.classNames.joinClassNames('holidayName')},
- holiday.name
- );
- dateContainer.appendChild(name);
- if (holiday.onclick) {
- Event.observe(name, "click", holiday.onclick.bindAsEventListener(this));
- }
- } else if (this.calendar.isRegularHoliday(date.getDay())) {
- this.calendar.setRegularHolidayClass(row);
- } else {
- this.calendar.setWorkdayClass(row);
- }
-
- return row;
- },
-
- buildSmallRow: function(date, holiday, schedule, today) {
- var row = Builder.node('TD', {id: this.getDateId(date)}, [date.getDate()]);
- if (schedule) {
- this.calendar.setScheduleClass(row);
- var first = schedule[0];
- if (first) row.title = first.description.stripTags();
- } else if (holiday) {
- this.calendar.setHolidayClass(row);
- row.title = holiday.name.stripTags();
- } else if (this.calendar.isRegularHoliday(date.getDay())) {
- this.calendar.setRegularHolidayClass(row);
- } else {
- this.calendar.setWorkdayClass(row);
- }
-
- if (date.days() == today.days()) {
- this.calendar.addHighlightClass(row);
- }
- return row;
- },
-
- beforeBuild: function() {
- this.column = {};
- var rule = CssUtil.getCssRuleBySelectorText('.' + Calendar.className.table + ' td');
- this.column.height = parseInt(rule.style['height'], 10);
-
- rule = CssUtil.getCssRuleBySelectorText('.' + Calendar.className.dateContainer);
- this.column.dateTextHeight = parseInt(rule.style['height'], 10);
- },
-
- /**********************************
- ***** for make schedule item *****
- **********************************/
- buildSchedule: function(schedule) {
- var id = 'scheduleItem_' + schedule.id;
- var canEdit = (schedule.edit == undefined || schedule.edit);
- var item = Builder.node('DIV', {id: id});
- var start = DateUtil.toDate(schedule.start);
- var finish = DateUtil.toDate(schedule.finish);
- if (start.sameDate(finish)) {
- this.calendar.classNames.addClassNames(item, 'scheduleItemNoBorder');
- } else {
- this.calendar.classNames.addClassNames(item, 'scheduleItemLarge');
- }
-
- if (canEdit) {
- var deleteImg = Builder.node('DIV',
- {
- id: 'scheduleDeleteImg_' + schedule.id,
- className: this.calendar.classNames.joinClassNames('deleteImg')
- }
- );
- Element.hide(deleteImg);
- item.appendChild(deleteImg);
-
- // set click event on a image.
- Event.observe(deleteImg, 'click', this.clickDeleteImage.bind(this, schedule));
- Event.observe(item, 'mouseover', this.showDeleteImage.bind(this, deleteImg));
- Event.observe(item, 'mouseout', this.hideDeleteImage.bind(this, deleteImg));
- }
-
- // set dblclick event on a schedule item.
- if (this.calendar.options.dblclickSchedule) {
- Event.observe(
- item, 'dblclick', this.calendar.options.dblclickSchedule.bind(this, schedule));
- }
-
- // drag handler
- var handler = null;
- if (canEdit) {
- handler = Builder.node('DIV', {className: this.calendar.classNames.joinClassNames('scheduleHandler')});
- item.appendChild(handler);
- }
-
- var icon = null;
- if (schedule.icon) {
- icon = Builder.node('IMG', {src: schedule.icon, alt: 'icon', style: 'float: left;'});
- item.appendChild(icon);
- }
-
- // private mark
- if (!schedule.publicity) {
- icon = Builder.node('DIV', {id: 'private_img_' + schedule.id});
- this.calendar.classNames.addClassNames(icon, 'privateImg');
- item.appendChild(icon);
- }
-
- var body = Builder.node('DIV');
- var text = this.getTimeText(schedule.start, schedule.finish);
- text = Builder.node('DIV', {id: id + '_text', style: 'float: left;'}, [text]);
- this.calendar.classNames.addClassNames(text, 'scheduleTimeArea');
- item.appendChild(text);
- var description = schedule.description.unescapeHTML();
- item.appendChild(Builder.node('DIV', {id: id + '_description'}, [description]));
-
- item.title = description;
- item.schedule = schedule;
-
- return [item, handler];
- },
-
- adjustScheduleStyle: function(item, rowIndex, cellIndex, holder) {
- var self = this;
- var height = parseInt(Element.getStyle(item, 'height'), 10);
- var top = parseInt(Element.getStyle(item, 'top'), 10);
- var range = this.getScheduleRange(item);
- var tops = [];
-
- holder.each(function(holded) {
- var holdedRange = self.getScheduleRange(holded);
- if (range.any(function(r) {return holdedRange.include(r)})) {
- tops.push(holded.topIndex);
- }
- });
-
- var index = $R(0, tops.length, true).detect(function(i) {return !tops.include(i)});
- if (isNaN(index)) index = tops.length;
- item.topIndex = index;
- Element.setStyle(item, {top: top + (height + 2) * index + 'px'});
- },
-
- getScheduleRange: function(item) {
- return $R(0, item.length, true).map(function(i) {return item.cellIndex + i});
- },
-
- setScheduleBaseStyle: function(item, rowIndex, cellIndex, length) {
- var oneDay = this.column.height;
- var top = oneDay * rowIndex + this.column.dateTextHeight;
- var adjustSize = this.getAdjustSize();
- Element.setStyle(item, {
- top: top + 'px',
- width: this.column.width * length + adjustSize * (length - 1) + 'px',
- left: this.column.width * cellIndex + cellIndex * adjustSize + 'px'
- });
- },
-
- afterBuild: function() {
- this.scheduleNodes = [];
- if (this.calendar.options.size != Calendar.size.small) {
- this.setContainerInfo();
- this.setColumnWidth();
- this.setCover();
- this.setSelector();
- var self = this;
- var indexes = this.calendar.options.displayIndexes;
- var distance = this.getDragDistance();
- var holders = $R(0, $(this.getCalendarTableId()).rows.length).map(function() {return []});
- var date = this.calendar.date;
- var calStartDate = DateUtil.getFirstDate(date.getFullYear(), date.getMonth());
- var calStart = calStartDate.days();
- var calFinish = DateUtil.getLastDate(date.getFullYear(), date.getMonth()).days();
-
- self.calendar.options.schedules.each(function(schedule, index) {
- var startDate = self.toDate(schedule.start);
- var start = startDate.days();
- var finishDate = self.toDate(schedule.finish);
- var finish = finishDate.days();
- var days = self.getDayDiff(schedule);
-
- if ((start >= calStart && start <= calFinish) || (finish >= calStart && finish <= calFinish)) {
- if (!calStartDate.sameMonth(startDate)) startDate = calStartDate;
- self.setSchedule(schedule, holders, distance, days);
- }
- });
- }
- },
-
- setSchedule: function(schedule, holders, distance, days) {
- var items = [];
- var rowMax = 6;
- var startDate = DateUtil.toDate(schedule.start);
- var date = startDate;
- var indexes = this.calendar.options.displayIndexes;
- var targetDate = this.calendar.options.initDate;
-
- while (days >= 0) {
- if (date.getMonth() != startDate.getMonth()) break;
- var lastWday = this.getLastWday(date);
-
- var length = days + 1;
- var firstDay = date.getDay();
- var finishDate = date.advance({days: length - 1});
-
- if (finishDate.getTime() > lastWday.getTime()) {
- finishDate = lastWday;
- length = finishDate.days() - date.days() + 1;
- }
- var finishDay = finishDate.getDay();
- var wdays = null;
- if (firstDay <= finishDay) {
- wdays = $R(firstDay, finishDay, false);
- } else {
- wdays = $R(0, finishDay, false).toArray().concat($R(firstDay, rowMax, false).toArray());
- }
- var itemLength = wdays.findAll(function(day) {
- return indexes.include(day);
- }).length;
-
- var cellDate = new Date(date.getTime());
- while (cellDate.days() <= finishDate.days()) {
- if (cellDate.getMonth() == targetDate.getMonth()) {
- var cellPosition = this.getCellPosition(cellDate.getDate());
- if (cellPosition) {
- var rowIndex = cellPosition.rowIndex;
- var cellIndex = cellPosition.cellIndex;
-
- // create a schedule node.
- var result = this.buildSchedule(schedule);
- var item = result.first();
- item.length = itemLength;
- item.cellIndex = cellIndex;
- this.container.appendChild(item);
-
- // set style(position and size) of a schedule item.
- this.setScheduleBaseStyle(item, rowIndex, cellIndex, itemLength);
- var left = this.adjustScheduleStyle(item, rowIndex, cellIndex, holders[rowIndex]);
-
- if (schedule.edit == undefined || schedule.edit) {
- this.setDraggable(item, result.last(), distance);
- this.setResize(item);
- }
-
- holders[rowIndex].push(item);
- this.scheduleNodes.push(item);
- break;
- } else if (indexes.include(cellDate.getDay())) {
- itemLength--;
- }
- } else if (indexes.include(cellDate.getDay())) {
- itemLength--;
- }
- cellDate = cellDate.advance({days: 1});
- }
-
- if (items.length == 0) {
- days -= length;
- } else {
- days =- 7;
- }
-
- var date = finishDate.advance({days: 1});
- if (item) items.push(item);
- }
-
- var self = this;
- items.each(function(item) {
- Event.observe(item, 'mouseover', self.mouseOverSubSchedule.bind(this, items));
- Event.observe(item, 'mouseout', self.mouseOutSubSchedule.bind(this, items));
- });
- },
-
- getLastWday: function(date) {
- var index = this.calendar.wdays.indexOf(date.getDay()) + 1;
- return date.advance({days: this.calendar.wdays.length - index});
- },
-
- setSelector: function() {
- var selector = $(this.getSelectorId());
- Element.setStyle(selector, {
- width: this.column.width + 'px',
- height: this.column.height - 2 + 'px'
- });
- },
-
- // set draggalbe event
- setDraggable: function(item, handle, distance) {
- var self = this;
- var offset = Position.cumulativeOffset(this.container);
- var selector = $(this.getSelectorId());
- var cWidth = this.column.width;
- var cHeight = this.column.height;
- var rowMax = this.rowMax;
- var cellMax = this.calendar.options.displayIndexes.length - 1;
- var adjustSize = this.getAdjustSize();
-
- new Draggable(item,
- {
- handle: handle,
- scroll: window,
- starteffect: Prototype.emptyFunction,
- endeffect: Prototype.emptyFunction,
- onStart: function(draggalbe) {
- Element.show(selector);
- },
- onDrag: function(draggable, event) {
- var element = draggable.element;
- var top = parseInt(Element.getStyle(element, 'top'), 10);
- var rowIndex = Math.floor(top / cHeight);
- var left = parseInt(Element.getStyle(element, 'left'), 10);
- var cellIndex = Math.floor(left / cWidth);
-
- if ((cellIndex >= 0 && rowIndex >= 0) &&
- (cellIndex <= cellMax && rowIndex <= rowMax)) {
- Element.setStyle(selector, {
- left: cWidth * cellIndex + adjustSize * cellIndex + 'px',
- top: cHeight * rowIndex + 'px'
- });
- }
- },
- onEnd: function(draggable) {
- Element.hide(selector);
- self.changeSchedule(draggable);
- }
- }
- );
- },
-
- // set resize event
- setResize: function(item) {
- var self = this;
- new CalendarResizeableEx(item, {
- left: 0,
- top: 0,
- bottom: 0,
- distance: this.column.width,
- restriction: true,
- resize: function(element) {
- self.updateTirm(element);
- }
- });
- },
-
- /********************************** public method **********************************/
- getDate: function(element) {
- if (!element) return;
- var date = this.calendar.date;
- if (element.constructor == String)
- return new Date(date.getFullYear(), date.getMonth(), element);
- else
- return new Date(date.getFullYear(), date.getMonth(), element.id.getSuffix());
- },
-
- abstractSelect: function(event, method) {
- var element = null;
- if (this.calendar.options.size == 'large') {
- element = this.findClickedElement(event);
- } else {
- element = Event.element(event);
- if (element.tagName != 'TD') {
- element = Element.getParentByTagName(['TD'], element);
- }
- }
- if (element && element.id) {
- var date = this.getDate(element);
- method(date, element);
- }
- },
-
- getSelectedTerm: function() {
- var self = this;
- var elements = this.calendar.getSelected();
- if (elements && elements.length > 0) {
- return [elements.first(), elements.last()].map(function(e) {
- return self.getDate(e);
- });
- }
- return null;
- },
-
- /********************************** private method **********************************/
- selectDay: function(event) {
- var calendar = this.calendar;
- var th = Event.element(event);
- if (th.tagName != 'TH')
- th = Element.getParentByTagName('TH', th);
-
- this.iterateTable({doCell: function(cell) {
- if ((cell.cellIndex == th.cellIndex) && cell.id)
- calendar.addSelectedClass(cell);
- }});
- },
-
- inspectArgument: function(object, time) {
- var self = this;
- var dates = this.calendar.getSelected();
- var result = [];
-
- self.calendar.recurrence(object, function(o) {
- if (!o.date) {
- dates.each(function(d) {
- var param = {};
- if (!o.date) {
- param = {date: self.getDate(d)};
- if (time) {
- param.start = {hour: 0, min: 0};
- param.finish = {hour: 0, min: 0};
- }
- }
- Object.extend(param, o);
- result.push(param);
- });
- } else if (o.date.constructor == Object) {
- o.date = new Date(o.date.year, o.date.month, o.date.day);
- result.push(o);
- } else {
- result.push(o);
- }
- });
- return result;
- },
-
- inspectDateArgument: function(date) {
- if (date) {
- map = [];
- this.calendar.recurrence(date, function(d) {
- if (d.constructor == Object)
- map.push(new Date(d.year, d.month, d.day));
- else
- map.push(d);
- });
- return map;
- } else {
- var calendar = this;
- var dates = this.calendar.getSelected();
- if (dates.length == 0) return null;
-
- return dates.collect(function(d) {
- return calendar.getDate(d);
- });
- }
- },
-
- findClickedElement: function(event) {
- var container = $(this.getScheduleContainerId());
- var position = Position.cumulativeOffset(container);
- var scrollTop = Position.realOffset(container).last();
- scrollTop -= document.documentElement.scrollTop || document.body.scrollTop;
- var x = Event.pointerX(event) - position[0];
- var y = Event.pointerY(event) - position[1] + scrollTop;
- var rowIndex = Math.floor(y / this.column.height);
- var cellIndex = Math.floor(x / this.column.width);
- return $(this.calendarTable.rows[rowIndex].cells[cellIndex]);
- },
-
- multipleSelection: function(event) {
- if (!this.calendar.selectedBase || !this.calendar.mouseDown) return;
- var self = this;
- var calendar = this.calendar;
- var selected = this.calendar.selectedBase;
-
- this.abstractSelect(event, function(date, element) {
- var selectedElement = $(selected.id);
-
- var range = calendar.createRange(
- parseInt(selectedElement.id.getSuffix()),
- parseInt(element.id.getSuffix())
- );
-
- self.iterateTable({doCell: function(cell) {
- if (cell.tagName != 'TD' || !cell.id) throw $continue;
- var id = parseInt(cell.id.getSuffix());
-
- if (range.include(id)) {
- calendar.addSelectedClass(cell);
- } else {
- calendar.removeSelectedClass(cell);
- }
- }});
- });
- },
-
- iterateTable: function() {
- var options = Object.extend({
- doTable: null,
- doRow: null,
- doCell: null
- }, arguments[0]);
-
- var calendar = $(this.getCalendarTableId());
- if (options.doTable) {
- options.doTable(calendar)
- };
-
- $A(calendar.rows).each(function(row) {
- if (options.doRow) {
- options.doRow(row);
- }
- $A(row.cells).each(function(cell) {
- if (options.doCell) {
- options.doCell(cell);
- }
- });
- });
- },
-
- findRow: function(rowIndex) {
- var table = $(this.getCalendarTableId());
- return $A(table.rows).detect(function(row) {
- return row.rowIndex == rowIndex;
- });
- },
-
- findCell: function(rowIndex, cellIndex) {
- return $A(this.findRow(rowIndex).cells).detect(function(cell) {
- return cell.cellIndex == cellIndex;
- });
- },
-
- getCalendarTableId: function() {
- return this.calendar.element.id.appendSuffix(CalendarMonth.id.calTable);
- },
-
- getDateId: function(date) {
- var day = null;
- if (date.constructor == Date) {
- day = date.getDate();
- } else {
- day = date;
- }
- return this.calendar.element.id.appendSuffix(day);
- },
-
- getCell: function(day) {
- return $(this.getDateId(day));
- },
-
- getCellPosition: function(day) {
- var cell = this.getCell(day);
- if (cell) {
- var row = Element.getParentByTagName(['tr'], cell);
- return {cellIndex: cell.cellIndex, rowIndex: row.rowIndex};
- }
- },
-
- changeSchedule: function(draggable) {
- var element = draggable.element;
- var schedule = element.schedule;
-
- var top = parseInt(Element.getStyle(element, 'top'), 10);
- var rowIndex = Math.floor(top / this.column.height);
- var left = parseInt(Element.getStyle(element, 'left'), 10);
- var cellIndex = Math.floor(left / this.column.width);
- var table = $(this.getCalendarTableId());
- var rowMax = table.rows.length - 1;
- var cellMax = this.calendar.options.displayIndexes.length - 1;
-
- if ((cellIndex >= 0 && rowIndex >= 0) &&
- (cellIndex <= cellMax && rowIndex <= rowMax)) {
- var cell = this.findCell(rowIndex, cellIndex);
- var date = cell.date;
- var diff = this.getDayDiff(schedule);
-
- var finish = date.advance({days: diff});
- if (
- schedule.start.month == date.getMonth() &&
- schedule.start.day == date.getDate() &&
- schedule.finish.month == finish.getMonth() &&
- schedule.finish.day == finish.getDate()
- ) {this.calendar.refreshSchedule(); return;}
-
- schedule.start.month = date.getMonth();
- schedule.start.day = date.getDate();
- schedule.finish.month = finish.getMonth();
- schedule.finish.day = finish.getDate();
-
- this.calendar.refreshSchedule();
- this.calendar.options.changeSchedule(schedule);
- } else {
- this.calendar.refreshSchedule();
- }
- },
-
- updateTirm: function(element) {
- var schedule = element.schedule;
- var width = parseInt(Element.getStyle(element, 'width'));
- var top = parseInt(Element.getStyle(element, 'top'));
- var left = parseInt(Element.getStyle(element, 'left'));
- var cellIndex = Math.round((left + width) / this.column.width) - 1;
- var rowIndex = Math.round(top / this.column.height);
- var cell = this.findCell(rowIndex, cellIndex);
-
- var oldFinish = schedule.finish;
- var newFinish = cell.date.toHash();
- newFinish.hour = oldFinish.hour;
- newFinish.min = oldFinish.min;
-
- if (DateUtil.toDate(schedule.start).getTime() >= DateUtil.toDate(newFinish).getTime()) {
- var maxHour = 23;
- var maxMin = 55;
- if (schedule.start.hour == maxHour && schedule.start.min == maxMin) {
- this.calendar.refreshSchedule();
- this.calendar.options.updateTirm();
- return;
- } else {
- newFinish.hour = maxHour;
- newFinish.min = maxMin;
- }
- }
- schedule.finish = newFinish;
-
- this.calendar.refreshSchedule();
- this.calendar.options.updateTirm(schedule);
- },
-
- getTimeText: function(start, finish) {
- var calendar = this.calendar;
- return calendar.formatTime(start);
- },
-
- getDayDiff: function(schedule) {
- return DateUtil.numberOfDays(this.toDate(schedule.start), this.toDate(schedule.finish));
- }
-});
-
-
-/**
- * CalendarWeek Class
- */
-var CalendarWeek= Class.create();
-CalendarWeek.id = {
- columnContainer: 'columnContainer',
- columnHeader: 'columnHeader',
- column: 'column',
- next: 'next',
- pre: 'pre'
-}
-Object.extend(CalendarWeek.prototype, AbstractCalendar.prototype);
-Object.extend(CalendarWeek.prototype, {
-
- initialize: function(calendar) {
- this.calendar = calendar;
- this.week = this.getWeek();
- this.setDisplayTime();
- },
-
- /*** Week ***/
- /********************************** build functions **********************************/
- buildHeaderLeft: function() {
- var container = Builder.node('TD');
- this.calendar.classNames.addClassNames(container, 'preYears');
-
- var id = this.calendar.element.id.appendSuffix(CalendarWeek.id.pre);
- var node = Builder.node('DIV', {id: id});
- this.calendar.classNames.addClassNames(node, 'preWeekMark');
- Event.observe(node, "click", this.calendar.changeCalendar.bindAsEventListener(this.calendar));
- container.appendChild(node);
-
- return container;
- },
-
- buildHeaderCenter: function() {
- var contents = [];
- var texts = [];
- if (this.calendar.options.weekHeaderFormat) {
- texts = [this.formatHeaderDate(this.week.first()), '-', this.formatHeaderDate(this.week.last())];
- }(this.week[0], this.week.last()) || [];
-
- var node = Builder.node('SPAN', [texts[0] || this.week[0].toDateString()]);
- this.calendar.classNames.addClassNames(node, 'ym');
- contents.push(node);
-
- node = Builder.node('SPAN', [texts[1] || '-']);
- this.calendar.classNames.addClassNames(node, 'ym');
- contents.push(node);
-
- node = Builder.node('SPAN', [texts.last() || this.week.last().toDateString()]);
- this.calendar.classNames.addClassNames(node, 'ym');
- contents.push(node);
-
- var container = Builder.node('TD', contents);
- this.calendar.classNames.addClassNames(container, 'years');
-
- return container;
- },
-
- formatHeaderDate: function(date) {
- if (this.calendar.options.weekHeaderFormat) {
- return new Template(this.calendar.options.weekHeaderFormat).
- evaluate({year: date.getFullYear(), month: date.getMonth() + 1, day: date.getDate()});
- }
- return '';
- },
-
- buildHeaderRight: function() {
- var container = Builder.node('TD', {align: 'right'});
- this.calendar.classNames.addClassNames(container, 'nextYears');
-
- var id = this.calendar.element.id.appendSuffix(CalendarWeek.id.next);
- var node = Builder.node('DIV', {id: id});
- this.calendar.classNames.addClassNames(node, 'nextWeekMark');
- Event.observe(node, "click", this.calendar.changeCalendar.bindAsEventListener(this.calendar));
- container.appendChild(node);
-
- return container;
- },
-
- buildCalendar: function() {
- var table = Builder.node('TABLE', {id: CalendarWeek.id.columnContainer});
- var tbody = Builder.node('TBODY');
-
- this.calendar.classNames.addClassNames(table, 'weekTable');
- table.appendChild(tbody);
- var tr = Builder.node('TR');
- tbody.appendChild(tr);
-
- if (this.calendar.options.displayTimeLine) {
- tr.appendChild(this.buildTimeLine());
- }
- tr.appendChild(this.buildCalendarContainer());
-
- return table;
- },
-
- buildTimeLine: function() {
- var time = new Date();
- var hour = 0, hoursOfDay = 24;
- time.setHours(hour);
- time.setMinutes(0);
- var nodes = [];
-
- var node = Builder.node('DIV');
- this.calendar.classNames.addClassNames(node, 'timeLineTimeTop');
- nodes.push(node);
- while (hour < hoursOfDay) {
- if (this.includeDisplayTime(hour)) {
- node = Builder.node('DIV', [this.formatTime(time)]);
- this.calendar.classNames.addClassNames(node, 'timeLineTime');
- nodes.push(node);
- }
- hour++;
- time.setHours(hour);
- }
-
- var td = Builder.node('TD', nodes);
- this.calendar.classNames.addClassNames(td, 'timeLine');
- return td;
- },
-
- buildCalendarContainer: function() {
- var table = Builder.node('TABLE');
- var tbody = Builder.node('TBODY');
- table.appendChild(tbody);
- this.calendar.classNames.addClassNames(table, 'weekMainTable');
-
- tbody.appendChild(this.buildCalendarHeader());
- tbody.appendChild(this.buildCalendarMain());
-
- return Builder.node('TD', [table]);
- },
-
- buildCalendarHeader: function() {
- var indexes = this.calendar.options.displayIndexes;
- var ths = [];
- var self = this;
- var today = new Date().days();
- var width = 100 / indexes.length + '%';
- var clickDateText = this.calendar.options.clickDateText;
- var subHeaderTempl = (this.calendar.options.weekSubHeaderFormat) ? new Template(this.calendar.options.weekSubHeaderFormat) : null;
-
- this.week.each(function(w, index) {
- var text = null;
- if (subHeaderTempl) {
- text = subHeaderTempl.evaluate({month: w.getMonth() + 1, day: w.getDate(), wday: self.calendar.options.dayOfWeek[w.getDay()]});
- } else {
- text = w.toDateString().split(' ');
- text.pop();
- text = text.join(' ');
- }
- var link = Builder.node('A', {href: '#'}, [text]);
- if (w.days() == today) self.calendar.addHighlightClass(link);
- var node = Builder.node('DIV', [link]);
- self.calendar.classNames.addClassNames(node, 'headerColumn');
-
- if (clickDateText) {
- Event.observe(node, 'mousedown', clickDateText.bindAsEventListener(self, w));
- } else {
- Event.observe(node, 'mousedown', self.clickDateText.bindAsEventListener(self, w));
- }
-
- var id = self.calendar.element.id.appendSuffix(CalendarWeek.id.column);
- var th = Builder.node('TH', {id: id.appendSuffix(index)}, [node]);
- th.width = width;
- ths.push(th);
- });
-
- var table = Builder.node('TABLE');
- var tbody = Builder.node('TBODY');
- table.appendChild(tbody);
- tbody.appendChild(Builder.node('TR', ths));
- this.calendar.classNames.addClassNames(table, 'weekMainTable');
- return Builder.node('TR', [Builder.node('TD', [table])]);
- },
-
- buildCalendarMain: function() {
- var indexes = this.calendar.options.displayIndexes;
- var self = this;
- var tds = [];
- var width = 100.0 / indexes.length + '%';
-
- this.week.each(function(w, index) {
- var schedules = self.calendar.options.schedules[w.toDateString()];
- var nodes = [];
- var i = 0, j = 0;
-
- while (i < 24) {
- if (self.includeDisplayTime(i)) {
- var node = Builder.node('DIV', {id: self.getDateId(w, i)});
- var hour = i / 1;
- var min = i % 1 * 60;
- node.date = new Date(w.getFullYear(), w.getMonth(), w.getDate(), hour, min, 0);
-
- if (nodes.length == 0) {
- self.calendar.classNames.addClassNames(node, 'columnTopDate');
- } else if (i % 1 == 0) {
- self.calendar.classNames.addClassNames(node, 'columnDate');
- } else {
- self.calendar.classNames.addClassNames(node, 'columnDateOdd');
- }
- self.setColumnEvent(node);
- nodes.push(node);
- }
- i += 0.5;
- }
-
- var td = Builder.node('TD', nodes);
- td.width = width;
- tds.push(td);
- });
-
- this.calendarTable = Builder.node('TABLE', {style: 'position: relative'});
- var tbody = Builder.node('TBODY');
- this.calendarTable.appendChild(tbody);
- tbody.appendChild(Builder.node('TR', tds));
- this.calendar.classNames.addClassNames(this.calendarTable, 'weekMainTable');
- var container = this.buildScheduleContainer();
- container.appendChild(this.calendarTable);
- this.setScheduleContainerEvent(container);
- this.calendar.classNames.addClassNames(container, 'scheduleContainer');
- return Builder.node('TR', [Builder.node('TD', [container])]);
- },
-
- setColumnEvent: function(node) {
- // do nothing
- },
-
- beforeBuild: function() {
- this.column = {};
- var rule = CssUtil.getCssRuleBySelectorText('.' + Calendar.className.columnDate);
- this.column.height = parseInt(rule.style['height'], 10) + 1;
- },
-
- /**********************************
- ***** for make schedule item *****
- **********************************/
- buildSchedule: function(schedule) {
- var id = 'scheduleItem_' + schedule.id;
- var canEdit = (schedule.edit == undefined || schedule.edit);
- var item = Builder.node('DIV', {id: id});
- this.calendar.classNames.addClassNames(item, 'scheduleItemLarge');
-
- if (canEdit) {
- var deleteImg = Builder.node('DIV',
- {
- id: 'scheduleDeleteImg_' + schedule.id,
- className: this.calendar.classNames.joinClassNames('deleteImg')
- });
- Element.hide(deleteImg);
- item.appendChild(deleteImg);
-
- // set event on a image.
- Event.observe(deleteImg, 'click', this.clickDeleteImage.bind(this, schedule));
- Event.observe(item, 'mouseover', this.showDeleteImage.bind(this, deleteImg));
- Event.observe(item, 'mouseout', this.hideDeleteImage.bind(this, deleteImg));
- }
-
- // set dblclick event on a schedule item.
- if (this.calendar.options.dblclickSchedule) {
- Event.observe(
- item, 'dblclick', this.calendar.options.dblclickSchedule.bind(this, schedule));
- }
-
- // drag handler
- var handler = null;
- if (canEdit) {
- handler = Builder.node('DIV', {className: this.calendar.classNames.joinClassNames('scheduleHandler')});
- item.appendChild(handler);
- }
-
- var icon = null;
- if (schedule.icon) {
- icon = Builder.node('IMG', {src: schedule.icon, alt: 'icon', style: 'float: left;'});
- item.appendChild(icon);
- }
-
- // private mark
- if (!schedule.publicity) {
- icon = Builder.node('DIV', {id: 'private_img_' + schedule.id});
- this.calendar.classNames.addClassNames(icon, 'privateImg');
- item.appendChild(icon);
- }
-
- var text = this.getTimeText(schedule.start, schedule.finish);
- text = Builder.node('DIV', {id: id + '_text'}, [text]);
- this.calendar.classNames.addClassNames(text, 'scheduleTimeArea');
-
- item.appendChild(text);
- var description = schedule.description.unescapeHTML();
- item.appendChild(Builder.node('DIV', {id: id + '_description'}, [description]));
- item.title = description;
- item.schedule = schedule;
-
- return [item, handler];
- },
-
- adjustScheduleStyle: function(item, index, holder) {
- var schedule = item.schedule;
- var time = this.convertHours(schedule);
- var start = time[0];
- var finish = time[1];
- var same = [];
- var self = this;
-
- holder.each(function(h) {
- var hTime = self.convertHours(h.schedule);
- var hStart = hTime[0];
- var hFinish = hTime[1];
-
- if (
- ((hStart <= start) && (hFinish > start)) || ((hStart < finish) && (hFinish >= finish)) ||
- ((start <= hStart) && (finish > hStart)) || ((start < hFinish) && (finish >= hFinish))
- ) {
- same.push(h);
- }
- });
-
- var adjustSize = index * this.getAdjustSize();
- var left = this.column.width * index + adjustSize;
- if (same.length == 0) {
- Element.setStyle(item, {left: left + 'px'});
- } else {
- same.push(item);
- var width = parseInt(Element.getStyle(item, 'width'), 10) / (same.length) - 2;
- same.each(function(s, i) {
- var adjustLeft = left + width * i + (2 * i);
-// if (i != 0) adjustLeft += 2;
- Element.setStyle(s, {
- width: width + 'px',
- left: adjustLeft + 'px'
- });
- });
- }
- return left;
- },
-
- setScheduleBaseStyle: function(item) {
- var schedule = item.schedule;
- if (!this.calendar.isSameDate(schedule.start, schedule.finish)) {
- schedule.finish.hour = 24;
- schedule.finish.min = 0;
- }
-
- var time = this.convertHours(schedule);
- var startTime = time.first();
- var finishTime = time.last();
- var oneHour = this.column.height * 2;
- var diff = this.calendar.getTimeDiff(schedule.start, schedule.finish);
- var rate = (diff.hour + (diff.min / 60)) || 1;
-
- var over = 0;
- var top = 0;
- var height = 0;
-
- var includeStart = this.includeDisplayTime(startTime);
- var includeFinish = this.includeDisplayTime(finishTime);
- if (!includeStart && !includeFinish) {
- if ((this.startTime <= startTime && this.startTime <= finishTime) ||
- (startTime < this.finishTime && finishTime < this.finishTime)) {
- top = height = 0;
- Element.hide(item);
- } else {
- top = 0;
- height = oneHour * (this.finishTime - this.startTime) - 3;
- }
- } else {
- if (includeStart) {
- top = oneHour * (startTime - this.startTime);
- height = oneHour * rate - 3;
- } else {
- top = 0;
- over = this.startTime - startTime;
- height = oneHour * (rate - over);
- }
-
- if (includeFinish) {
- } else {
- over = finishTime - this.finishTime;
- height -= oneHour * over;
- }
- }
-
- try {
- Element.setStyle(item, {
- top: top + 'px',
- width: this.column.width + 'px',
- height: height + 'px'
- });
- } catch (e) {}
- },
-
- afterBuild: function() {
- this.setContainerInfo();
- this.setColumnWidth();
- this.setCover();
- var self = this;
- var container = $(this.getScheduleContainerId());
- var distance = this.getDragDistance();
- this.scheduleNodes = [];
- var holders = this.week.map(function() {return []});
- var weekSize = this.week.legth - 1;
-
- this.calendar.options.schedules.each(function(schedule) {
- var items = [];
- var sub, subItem = null;
- self.week.each(function(date, index) {
- if (self.calendar.betweenDate(schedule, date)) {
- if (self.isSameStartDate(schedule, date) && self.isSameFinishDate(schedule, date)) {
- items.push(self.setSchedule(schedule, index, holders, container, distance));
- } else {
- sub = self.copyOneDaySchedule(schedule, date);
- subItem = self.setSchedule(sub, index, holders, container, distance);
- subItem.originalSchedule = schedule;
- items.push(subItem);
- }
- } else if (sub) {
- throw $break;
- }
- });
-
- items.each(function(item) {
- Event.observe(item, 'mouseover', self.mouseOverSubSchedule.bind(this, items));
- Event.observe(item, 'mouseout', self.mouseOutSubSchedule.bind(this, items));
- });
- });
- },
-
- copyOneDaySchedule: function(schedule, date) {
- var sub = null;
- if (this.isSameStartDate(schedule, date)) {
- sub = this.copySchedule(schedule, date);
- sub.finish.hour = 24;
- sub.finish.min = 0;
- } else if (this.isSameFinishDate(schedule, date)) {
- sub = this.copySchedule(schedule, date);
- sub.start.hour = 0;
- sub.start.min = 0;
- } else {
- sub = this.copySchedule(schedule, date);
- sub.start.hour = 0;
- sub.start.min = 0;
- sub.finish.hour = 24;
- sub.finish.min = 0;
- }
- return sub;
- },
-
- copySchedule: function(schedule, date) {
- sub = Object.extend({}, schedule);
- sub.start = {
- year: date.getFullYear(),
- month: date.getMonth(),
- day: date.getDate(),
- hour: schedule.start.hour,
- min: schedule.start.min
- }
- sub.finish = {
- year: date.getFullYear(),
- month: date.getMonth(),
- day: date.getDate(),
- hour: schedule.finish.hour,
- min: schedule.finish.min
- }
- return sub;
- },
-
- setSchedule: function(schedule, index, holders, container, distance) {
- // create a schedule node.
- var result = this.buildSchedule(schedule);
- var item = result.first();
- container.appendChild(item);
-
- // set style(position and size) of a schedule item.
- this.setScheduleBaseStyle(item);
- var left = this.adjustScheduleStyle(item, index, holders[index]);
- var adjustSize = index * this.getAdjustSize();
- var snapLeft = this.column.width + adjustSize + 'px';
-
- if (schedule.edit == undefined || schedule.edit) {
- this.setDraggable(item, result.last(), container, distance);
- this.setResize(item);
- }
-
- holders[index].push(item);
- this.scheduleNodes.push(item);
- return item;
- },
-
- getDragDistance: function() {
- var adjustSize = this.getAdjustSize();
- return [this.column.width + adjustSize, this.column.height / 2];
- },
-
- // set draggalbe event
- setDraggable: function(item, handle, container, distance) {
- var self = this;
- new Draggable(item,
- {
- handle: handle,
- scroll: window,
- starteffect: Prototype.emptyFunction,
- endeffect: Prototype.emptyFunction,
- snap: function(x, y) {
- var eDimensions = Element.getDimensions(item);
- var pDimensions = Element.getDimensions(container);
- var xy = [x, y].map(function(v, i) { return Math.floor(v/distance[i]) * distance[i] });
- xy = [
- self._constrain(xy[0], 0, pDimensions.width - eDimensions.width),
- self._constrain(xy[1], 0, pDimensions.height - eDimensions.height)
- ];
- return xy;
- },
- onEnd: function(draggable, event) {
- self.changeSchedule(draggable, event);
- },
- change: function(draggable) {
- self.changeTimeDisplay(draggable.element);
- }
- }
- );
- },
-
- // set resize event
- setResize: function(item) {
- new CalendarResizeableEx(item, {
- left: 0,
- right: 0,
- distance: this.column.height / 2,
- restriction: true,
- resize: function(element) {
- this.updateTirm(element);
- }.bind(this),
- change: function(element) {
- this.changeTimeDisplay(element);
- }.bind(this)
- });
- },
-
- /********************************** public method **********************************/
- getDate: function(element) {
- return element.date;
- },
-
- abstractSelect: function(event, method) {
- var element = this.findClickedElement(event);
- if (element) {
- if (Element.hasClassName(element, Calendar.className.columnDate) ||
- Element.hasClassName(element, Calendar.className.columnDateOdd) ||
- Element.hasClassName(element, Calendar.className.columnTopDate)) {
-
- var date = this.getDate(element);
- method(date, element);
- }
- }
- },
-
- getSelectedTerm: function() {
- var self = this;
- var elements = this.calendar.getSelected();
- if (elements && elements.length > 0) {
- var last = elements.last();
- if (last) {
- last = last.date;
- } else {
- last = elements.first().date;
- }
- last = new Date(last.getFullYear(), last.getMonth(),
- last.getDate(), last.getHours(), last.getMinutes(), 0);
- last.setMinutes(last.getMinutes() + 30);
-
- return [elements.first().date, last];
- }
- },
-
- /*** Week ***/
- /********************************** private method **********************************/
- setWidth: function(node) {
- Element.setStyle(node, {width: this.column.width + 'px'});
- },
-
- inspectArgument: function(object, time) {
- if (object.date) return object;
-
- var self = this;
- var dates = this.calendar.getSelected();
- var result = [];
- this.calendar.recurrence(object, function(o) {
- var param = {};
- if (!o.date) {
- param = {date: self.getDate(dates[0])};
- if (!o.start)
- param.start = dates[0].time;
- if (!o.finish)
- param.finish = dates[dates.length - 1].time;
- }
- Object.extend(param, o);
- result.push(param);
- });
-
- return result;
- },
-
- inspectDateArgument: function(date) {
- if (date) return date;
-
- var calendar = this;
- var dates = this.getSelected();
- if (dates.length == 0) return null;
-
- return dates.collect(function(d) {
- return calendar.getDate(d);
- });
- },
-
- addColumnClass: function(element) {
- if (document.all)
- this.calendar.classNames.addClassNames(element, 'columnWin');
- else
- this.calendar.classNames.addClassNames(element, 'column');
- },
-
- getHeaderId: function() {
- return this.calendar.element.id.appendSuffix(CalendarWeek.id.columnHeader);
- },
-
- getColumnId: function(i) {
- return this.calendar.element.id.appendSuffix(CalendarWeek.id.column + '_' + i);
- },
-
- changeSchedule: function(draggable, event) {
- var element = draggable.element;
- var schedule = element.schedule;
- var time = this.getTimeByElement(element);
- this.calendar.cacheSchedule(schedule);
-
- var container = $(this.getScheduleContainerId());
- var dimensions = Element.getDimensions(container);
- var offset = Position.cumulativeOffset(container);
- var scroll = Position.realOffset(container);
- var scrollLeft = scroll[0] - (document.documentElement.scrollLeft || document.body.scrollLeft || 0);
- var scrollTop = scroll[1] - (document.documentElement.scrollTop || document.body.scrollTop || 0);
-
- var x = Event.pointerX(event) + scrollLeft;
- var y = Event.pointerY(event) + scrollTop;
-
- if (
- offset[0] > x ||
- (offset[0] + dimensions.width) < x ||
- offset[1] > y ||
- (offset[1] + dimensions.height) < y
- ) {this.calendar.refreshSchedule(); return};
-
- var left = parseInt(Element.getStyle(element, 'left'));
- var weekIndex = Math.round(left / this.column.width);
- var date = this.week[weekIndex];
-
- if (
- schedule.start.year == date.getFullYear() &&
- schedule.start.month == date.getMonth() &&
- schedule.start.day == date.getDate() &&
- schedule.start.hour == time[0].hour &&
- schedule.start.min == time[0].min &&
- schedule.finish.year == date.getFullYear() &&
- schedule.finish.month == date.getMonth() &&
- schedule.finish.day == date.getDate() &&
- schedule.finish.hour == time[1].hour &&
- schedule.finish.min == time[1].min
- ) {this.calendar.refreshSchedule(); return};
-
- if (element.originalSchedule) schedule = element.originalSchedule;
- var newStart = {
- year: date.getFullYear(),
- month: date.getMonth(),
- day: date.getDate(),
- hour: time[0].hour,
- min: time[0].min
- }
- var diff = DateUtil.toDate(newStart).getTime() - DateUtil.toDate(schedule.start).getTime();
- schedule.start = newStart;
- schedule.finish = new Date(DateUtil.toDate(schedule.finish).getTime() + diff).toHash();
-
- this.calendar.refreshSchedule();
- this.calendar.options.changeSchedule(schedule);
- },
-
- updateTirm: function(element) {
- var schedule = element.schedule;
- var time = this.getTimeByElement(element);
- this.calendar.cacheSchedule(schedule);
-
- var left = parseInt(Element.getStyle(element, 'left'));
- var weekIndex = Math.round(left / this.column.width);
- var date = this.week[weekIndex];
-
- var isChange = this.isChengeSchedule(element, time);
- if (element.originalSchedule) schedule = element.originalSchedule;
-
- if (isChange.start) {
- schedule.start.year = date.getFullYear();
- schedule.start.month = date.getMonth();
- schedule.start.day = date.getDate();
- schedule.start.hour = time[0].hour;
- schedule.start.min = time[0].min;
- } else if (isChange.finish) {
- schedule.finish.year = date.getFullYear();
- schedule.finish.month = date.getMonth();
- schedule.finish.day = date.getDate();
- schedule.finish.hour = time[1].hour;
- schedule.finish.min = time[1].min;
- } else {
- return;
- }
-
- this.calendar.refreshSchedule();
- this.calendar.options.updateTirm(schedule);
- },
-
- changeTimeDisplay: function(element) {
- var schedule = element.schedule;
- var time = this.getTimeByElement(element);
-
- var textNode = Element.getElementsByClassName(element, Calendar.className.scheduleTimeArea)[0];
- var text = this.getTimeText(time[0], time[1]);
- textNode.innerHTML = text;
- },
-
- findClickedElement: function(event) {
- var container = $(this.getScheduleContainerId());
- var position = Position.cumulativeOffset(container);
- var scrollTop = Position.realOffset(container).last();
- scrollTop -= document.documentElement.scrollTop || document.body.scrollTop;
- var x = Event.pointerX(event) - position[0];
- var y = Event.pointerY(event) - position[1] + scrollTop;
-
- var cellIndex = Math.floor(y / this.column.height);
- var rowIndex = Math.floor(x / this.column.width);
- return $(this.calendarTable.rows[0].cells[rowIndex]).down(cellIndex);
- },
-
- multipleSelection: function(event) {
- if (!this.calendar.selectedBase || !this.calendar.mouseDown) return;
- var self = this;
- var calendar = this.calendar;
- var selected = this.calendar.selectedBase;
-
- this.abstractSelect(event, function(date, element) {
- var selectedElement = $(selected.id);
- if (selectedElement.date.getDate() != element.date.getDate()) return;
-
- var nodes = $A(selectedElement.parentNode.childNodes);
- var ids = [parseInt(selected.id.getSuffix()), parseInt(element.id.getSuffix())];
- ids.sort(function(a, b) {return a - b;});
-
- nodes.each(function(n) {
- if (!n.id) throw $continue;
- var id = parseInt(n.id.getSuffix());
- if ((id < ids[0]) || (ids[1] < id)) {
- calendar.removeSelectedClass(n);
- } else if (!Element.hasClassName(n, Calendar.className.selected)) {
- calendar.addSelectedClass(n);
- }
- });
- });
- },
-
- getTimeByElement: function(element) {
- var schedule = element.schedule;
- var top = parseInt(Element.getStyle(element, 'top'), 10);
- var height = parseInt(Element.getStyle(element, 'height'), 10);
- var oneHour = this.column.height * 2;
- var distance = 0.25;
-
- var startTime = top / oneHour + this.startTime;
- startTime = Math.round(startTime / distance) * distance;
-
- var finishTime = height / oneHour + startTime;
- finishTime = Math.round(finishTime / distance) * distance;
-
- var start = {};
- start.hour = Math.floor(startTime);
- start.min = (startTime - start.hour) * 60;
-
- var finish = {};
- finish.hour = Math.floor(finishTime);
- finish.min = (finishTime - finish.hour) * 60;
-
- if (finish.min == 60) {
- finish.hour += 1;
- finish.min = 0;
- }
-
- return [start, finish];
- },
-
- getDateId: function(date, i) {
- var id = this.calendar.element.id.appendSuffix(date.getDate());
- return id.appendSuffix(i * 10);
- },
-
- dateIdToTime: function(id) {
- id = id.getSuffix() / 10;
- var hour = Math.floor(id);
- return {hour: hour, min: (id - hour) * 60};
- },
-
- formatTime: function(date) {
- var time = date.toTimeString();
- time = time.split(' ');
- time = time[0].split(':');
- time.pop();
- return time.join(':');
- },
-
- /**
- * hours are 0, 0.5, 1, ..., 23.5, 24
- */
- includeDisplayTime: function(hours) {
- return (this.startTime <= hours) && (hours < this.finishTime);
- },
-
- /**
- * exsample
- *
- * {hour: 1, min: 30} => 1.5
- */
- convertHours: function(schedule) {
- return [
- schedule.start.hour + schedule.start.min / 60,
- schedule.finish.hour + schedule.finish.min / 60
- ];
- },
-
- setDisplayTime: function() {
- this.startTime = this.calendar.options.displayTime.first().hour;
- var finishTime = this.calendar.options.displayTime.last();
- this.finishTime = Math.ceil(finishTime.hour + finishTime.min / 60);
- },
-
- getTimeText: function(start, finish) {
- var calendar = this.calendar;
- return calendar.formatTime(start) + ' - ' + calendar.formatTime(finish);
- },
-
- isChengeSchedule: function(scheduleElement, newTime) {
- var schedule = scheduleElement.schedule;
- var changeStart = ((schedule.start.hour != newTime[0].hour) || (schedule.start.min != newTime[0].min));
- var changeFinish = ((schedule.finish.hour != newTime[1].hour) || (schedule.finish.min != newTime[1].min));
-
- if (scheduleElement.originalSchedule) {
- if (changeStart && changeFinish) {
- var currentDateStart = DateUtil.toDate(schedule.start).getTime();
- var OriginalDateStart = DateUtil.toDate(scheduleElement.originalSchedule.start).getTime();
- if (currentDateStart == OriginalDateStart) {
- changeFinish = false;
- } else {
- changeStart = false;
- }
- }
- }
- return {start: changeStart, finish: changeFinish};
- }
-});
-
-
-/**
- * CalendarDay Class
- */
-var CalendarDay = Class.create();
-CalendarDay.id = {
- header: 'dayHeader'
-}
-Object.extend(CalendarDay.prototype, CalendarWeek.prototype);
-Object.extend(CalendarDay.prototype, {
-
- initialize: function(calendar) {
- var day = calendar.date.getDay();
- this.calendar = calendar;
- this.setDisplayTime();
-
- this.calendar.options.displayIndexesOld = this.calendar.options.displayIndexes;
- this.calendar.options.displayIndexes = [day];
- this.calendar.options.weekIndexOld = this.calendar.options.weekIndex;
- this.calendar.options.weekIndex = day;
- this.week = this.getWeek();
- },
-
- destroy: function() {
- this.calendar.options.displayIndexes = this.calendar.options.displayIndexesOld;
- this.calendar.options.weekIndex = this.calendar.options.weekIndexOld;
- delete this.calendar.options.displayIndexesOld;
- delete this.calendar.options.weekIndexOld;
- },
-
- /*** Day ***/
- /********************************** build functions **********************************/
- buildHeaderCenter: function() {
- var headerText = this.calendar.date.toDateString();
- if (this.calendar.options.dayHeaderFormat) {
- var date = this.calendar.date;
- headerText = new Template(this.calendar.options.dayHeaderFormat).evaluate(
- {year: date.getFullYear(), month: date.getMonth() + 1, day: date.getDate()});
- }
- var container = Builder.node('TD');
- this.calendar.classNames.addClassNames(container, 'years');
-
- var id = this.calendar.element.id.appendSuffix(CalendarDay.id.header);
- var node = Builder.node('SPAN', {id: id}, [headerText]);
- this.calendar.classNames.addClassNames(node, 'ym');
- container.appendChild(node);
-
- return container;
- },
-
- /*** Day ***/
- /********************************** private method **********************************/
- changeCalendar: function(event) {
- var element = Event.element(event);
- var oldDate = new Date(this.calendar.date.toDateString());
-
- if (Element.hasClassName(element, Calendar.className.preWeekMark)) {
- this.calendar.date.setDate(this.calendar.date.getDate() - 1);
- } else if (Element.hasClassName(element, Calendar.className.nextWeekMark)) {
- this.calendar.date.setDate(this.calendar.date.getDate() + 1);
- }
-
- this.calendar.options.changeCalendar(this.calendar.date, oldDate);
- this.calendar.refresh();
- }
-});
-
-
-//
-// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-var CalendarResizeableEx = Class.create();
-Object.extend(CalendarResizeableEx.prototype, Resizeable.prototype);
-Object.extend(CalendarResizeableEx.prototype, {
- initialize: function(element) {
- var options = Object.extend({
- top: 6,
- bottom: 6,
- left: 6,
- right: 6,
- minHeight: 0,
- minWidth: 0,
- zindex: 1000,
- resize: null,
- distance: 1, // add by spinelz
- change: Prototype.emptyFunction,
- restriction: true
- }, arguments[1] || {});
-
- this.element = $(element);
- this.handle = this.element;
-
- Element.makePositioned(this.element); // fix IE
-
- this.options = options;
-
- this.active = false;
- this.resizing = false;
- this.currentDirection = '';
-
- this.eventMouseDown = this.startResize.bindAsEventListener(this);
- this.eventMouseUp = this.endResize.bindAsEventListener(this);
- this.eventMouseMove = this.update.bindAsEventListener(this);
- this.eventCursorCheck = this.cursor.bindAsEventListener(this);
- this.eventKeypress = this.keyPress.bindAsEventListener(this);
-
- this.registerEvents();
- },
-
- startResize: function(event) {
- Event.stop(event);
- if(Event.isLeftClick(event)) {
-
- // abort on form elements, fixes a Firefox issue
- var src = Event.element(event);
- if(src.tagName && (
- src.tagName=='INPUT' ||
- src.tagName=='SELECT' ||
- src.tagName=='BUTTON' ||
- src.tagName=='TEXTAREA')) return;
-
- var dir = this.directions(event);
- if (dir.length > 0) {
- this.active = true;
-// var offsets = Position.cumulativeOffset(this.element);
- this.startTop = parseInt(Element.getStyle(this.element, 'top'), 10);
- this.startLeft = parseInt(Element.getStyle(this.element, 'left'), 10);
- this.startWidth = parseInt(Element.getStyle(this.element, 'width'), 10);
- this.startHeight = parseInt(Element.getStyle(this.element, 'height'), 10);
- this.startX = event.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
- this.startY = event.clientY + document.body.scrollTop + document.documentElement.scrollTop;
-
- this.currentDirection = dir;
-
- if (this.options.restriction) {
- var container = this.element.parentNode;
- this.restDimensions = Element.getDimensions(container);
- this.restOffset = Position.cumulativeOffset(container);
- }
- }
- }
- },
-
- draw: function(event) {
- Event.stop(event);
- var pointer = [Event.pointerX(event), Event.pointerY(event)];
- var style = this.element.style;
-
- if (this.currentDirection.indexOf('n') != -1) {
- if (this.restOffset[1] >= pointer[1]) return;
- var pointerMoved = this.startY - pointer[1];
-// var margin = Element.getStyle(this.element, 'margin-top') || "0";
- var newHeight = this.map(this.startHeight + pointerMoved);
- if (newHeight > this.options.minHeight) {
- style.height = newHeight + "px";
- style.top = this.map(this.startTop - pointerMoved) + "px";
- }
- }
- if (this.currentDirection.indexOf('w') != -1) {
- var pointerMoved = this.map(this.startX - pointer[0]);
- var margin = Element.getStyle(this.element, 'margin-left') || "0";
- var newWidth = this.startWidth + pointerMoved;
- if (newWidth > this.options.minWidth) {
- style.left = (this.startLeft - pointerMoved - parseInt(margin)) + "px";
- style.width = newWidth + "px";
- }
- }
- if (this.currentDirection.indexOf('s') != -1) {
- var bottom = this.restDimensions.height + this.restOffset[1];
- var pointerMoved = pointer[1] - this.startY;
- if (bottom <= pointer[1]) return;
- var newHeight = this.map(this.startHeight + pointer[1] - this.startY);
- if (newHeight > this.options.minHeight) {
- style.height = newHeight + "px";
-// style.top = this.startTop + "px";
- }
- }
- if (this.currentDirection.indexOf('e') != -1) {
- var newWidth = this.map(this.startWidth + pointer[0] - this.startX);
- if (newWidth > this.options.minWidth) {
- style.width = newWidth + "px";
- }
- }
- if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering
- this.options.change(this.element);
- },
-
- directions: function(event) {
- var pointer = [Event.pointerX(event), Event.pointerY(event)];
- var offsets = Position.cumulativeOffset(this.element);
- var bodyScrollTop = document.documentElement.scrollTop || document.body.scrollTop;
- var scroll = Position.realOffset(this.element)[1] - bodyScrollTop;
-
- var cursor = '';
- if (this.between(pointer[1] - offsets[1] + scroll, 0, this.options.top)) cursor += 'n';
- if (this.between((offsets[1] + this.element.offsetHeight) - pointer[1] - scroll, 0, this.options.bottom)) cursor += 's';
- if (this.between(pointer[0] - offsets[0], 0, this.options.left)) cursor += 'w';
- if (this.between((offsets[0] + this.element.offsetWidth) - pointer[0], 0, this.options.right)) cursor += 'e';
-
- return cursor;
- },
-
- map: function(length) {
- return Math.round(length / this.options.distance) * this.options.distance;
- }
-});
+// Copyright (c) 2006 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+var Calendar = Class.create();\r
+Calendar.className = {\r
+ container: 'calendar',\r
+ header: 'calendar_header',\r
+ preYears: 'calendar_preYears',\r
+ nextYears: 'calendar_nextYears',\r
+ years: 'calendar_years',\r
+ mark: 'calendar_mark',\r
+ ym: 'calendar_ym',\r
+ table: 'calendar_table',\r
+ thRight: 'right',\r
+ tdRight: 'right',\r
+ tdBottom: 'bottom',\r
+ date: 'calendar_date',\r
+ holiday: 'calendar_holiday',\r
+ regularHoliday: 'calendar_regularHoliday',\r
+ schedule: 'calendar_schedule',\r
+ highlightDay: 'calendar_highlightDay',\r
+ scheduleListContainer: 'calendar_scheduleListContainer',\r
+ scheduleItem: 'calendar_scheduleItem',\r
+ scheduleTimeArea: 'calendar_scheduleItemTimeArea',\r
+ scheduleHandler: 'calendar_scheduleHandler',\r
+ holidayName: 'calendar_holidayName',\r
+// holidayContainer: 'calendar_holidayContainer',\r
+ dateContainer: 'calendar_dateContainer',\r
+ tableHeader: 'calendar_tableHeader',\r
+ rowContent: 'calendar_rowContent',\r
+ selected: 'calendar_selected',\r
+\r
+ nextYearMark: 'calendar_nextYearMark',\r
+ nextMonthMark: 'calendar_nextMonthMark',\r
+ nextWeekMark: 'calendar_nextWeekMark',\r
+ preYearMark: 'calendar_preYearMark',\r
+ preMonthMark: 'calendar_preMonthMark',\r
+ preWeekMark: 'calendar_preWeekMark',\r
+ \r
+ weekTable: 'calendar_weekContainerTable',\r
+ weekMainTable: 'calendar_weekMainTable',\r
+ timeLine: 'calendar_timeline',\r
+ timeLineTimeTop: 'calendar_timelineTimeTop',\r
+ timeLineTime: 'calendar_timelineTime',\r
+ headerColumn: 'calendar_headerColumn',\r
+ columnTopDate: 'calendar_columnTopDate',\r
+ columnDate: 'calendar_columnDate',\r
+ columnDateOdd: 'calendar_columnOddDate',\r
+ scheduleItemSamll: 'calendar_scheduleItemSmall',\r
+ scheduleItemLarge: 'calendar_scheduleItemLarge',\r
+ scheduleItemNoBorder: 'calendar_scheduleItemNoBorder',\r
+ scheduleItemSelect: 'calendar_scheduleItemSelect',\r
+ deleteImg: 'calendar_deleteImage',\r
+ privateImg: 'calendar_privateImage',\r
+ scheduleContainer: 'calendar_weekScheduleContainer',\r
+ selector: 'calendar_selector',\r
+ cover: 'calendar_cover'\r
+}\r
+\r
+Calendar.smallClassName = {\r
+ container: 'calendar_small',\r
+ header: 'calendar_header_small',\r
+ calendar: 'calendar_calendar_small',\r
+ table: 'calendar_tableSmall'\r
+}\r
+\r
+Calendar.size = {\r
+ large: 'large',\r
+ small: 'small'\r
+}\r
+\r
+/**\r
+ * Calendar Class\r
+ */\r
+Calendar.prototype = {\r
+ \r
+ initialize: function(element) {\r
+ this.building = true;\r
+ this.element = $(element);\r
+ Element.setStyle(this.element, {visibility: 'hidden'});\r
+ Element.hide(this.element);\r
+\r
+ this.options = Object.extend({\r
+ initDate: new Date(),\r
+ cssPrefix: 'custom_',\r
+ holidays: [],\r
+ schedules: [],\r
+ size: Calendar.size.large,\r
+ regularHoliday: [0, 6],\r
+ displayIndexes: [0, 1, 2, 3, 4, 5, 6],\r
+ displayTime: [{hour: 0, min: 0}, {hour: 24, min: 0}],\r
+ weekIndex: 0,\r
+ dblclickListener: null,\r
+ afterSelect: Prototype.emptyFunction,\r
+ beforeRefresh: Prototype.emptyFunction,\r
+ changeSchedule: Prototype.emptyFunction,\r
+ changeCalendar: Prototype.emptyFunction,\r
+ displayType: 'month',\r
+ highlightDay: true,\r
+ beforeRemoveSchedule: function() {return true;},\r
+ dblclickSchedule: null,\r
+ updateTirm: Prototype.emptyFunction,\r
+ displayTimeLine: true,\r
+ clickDateText: null,\r
+ monthHeaderFormat: null,\r
+ weekHeaderFormat: null,\r
+ weekSubHeaderFormat: null,\r
+ dayHeaderFormat: null,\r
+ dayOfWeek: DateUtil.dayOfWeek\r
+ }, arguments[1] || {});\r
+\r
+ this.options.holidays = this.toHolidayHash(this.options.holidays);\r
+// this.options.schedules = this.toScheduleHash(this.options.schedules);\r
+ \r
+ this.setIndex();\r
+ \r
+ this.classNames = null;\r
+ if (this.options.size == Calendar.size.large) {\r
+ this.classNames = Calendar.className;\r
+ } else {\r
+ this.classNames = $H({}).merge(Calendar.className);\r
+ this.classNames = this.classNames.merge(Calendar.smallClassName);\r
+ }\r
+ var customCss = CssUtil.appendPrefix(this.options.cssPrefix, this.classNames);\r
+ this.classNames = new CssUtil([this.classNames, customCss]);\r
+ \r
+ this.date = this.options.initDate;\r
+ \r
+ this.calendar = this.build();\r
+ this.element.appendChild(this.calendar);\r
+\r
+ Event.observe(document, "mouseup", this.onMouseUp.bindAsEventListener(this));\r
+ Element.setStyle(this.element, {visibility: 'visible'});\r
+ Element.show(this.element);\r
+ this.builder.afterBuild();\r
+ this.windowResize = this.onResize.bind(this);\r
+ if (this.options.size != 'small') Event.observe(window, "resize", this.windowResize);\r
+ this.building = false;\r
+ },\r
+\r
+ onResize: function() {\r
+ try {\r
+ var oldDimentions = this.builder.containerDimensions;\r
+ var dimentions = Element.getDimensions(this.builder.container);\r
+ if (dimentions.height != oldDimentions.height || dimentions.width != oldDimentions.width) {\r
+ this.refresh();\r
+ }\r
+ } catch(e) {}\r
+ },\r
+\r
+ destroy: function() {\r
+ Event.stopObserving(window, 'resize', this.windowResize);\r
+ },\r
+\r
+ setIndex: function() {\r
+ var options = this.options;\r
+ var bottom = [];\r
+ var up = [];\r
+ var index = null;\r
+ options.displayIndexes.sort();\r
+ options.displayIndexes.each(function(i) {\r
+ if (index == null) {\r
+ if (options.weekIndex <= i) {\r
+ index = i;\r
+ up.push(i);\r
+ } else {\r
+ bottom.push(i);\r
+ }\r
+ } else {\r
+ up.push(i);\r
+ }\r
+ });\r
+ options.displayIndexes = up.concat(bottom);\r
+ this.setLastWday();\r
+ },\r
+\r
+ setLastWday: function() {\r
+ var firstIndex = this.options.weekIndex;\r
+ var sat = 6;\r
+ var sun = 0;\r
+ var week = $R(firstIndex, sat, false).toArray();\r
+ if (firstIndex != sun) {\r
+ week = week.concat($R(sun, firstIndex - 1, false).toArray());\r
+ }\r
+ this.lastWday = week.last();\r
+ this.wdays = week;\r
+ },\r
+ \r
+ build: function() {\r
+ if (this.builder) {\r
+ this.builder.destroy();\r
+ }\r
+ \r
+ if (this.options.displayType == 'week') {\r
+ this.builder = new CalendarWeek(this);\r
+ } else if (this.options.displayType == 'day') {\r
+ this.builder = new CalendarDay(this);\r
+ } else {\r
+ this.builder = new CalendarMonth(this);\r
+ }\r
+\r
+ this.builder.beforeBuild();\r
+ return this.builder.build();\r
+ },\r
+ \r
+ /*** Calendar ***/\r
+ /********************************** public method **********************************/\r
+ undo: function() {\r
+ if (this.cached) {\r
+ this.cached.start = this.cached.start_old;\r
+ this.cached.finish = this.cached.finish_old;\r
+ this.cached = null;\r
+ this.refreshSchedule();\r
+ }\r
+ },\r
+\r
+ hideSatSun: function() {\r
+ var sun = 0;\r
+ var sat = 6;\r
+ this.options.displayIndexes = this.options.displayIndexes.without(sun, sat);\r
+ this.setIndex();\r
+ this.refresh();\r
+ },\r
+\r
+ showSatSun: function() {\r
+ var sun = 0;\r
+ var sat = 6;\r
+ var indexes = this.options.displayIndexes;\r
+ if (!indexes.include(sun)) {\r
+ indexes.push(sun);\r
+ }\r
+ if (!indexes.include(sat)) {\r
+ indexes.push(sat);\r
+ }\r
+ this.setIndex();\r
+ this.refresh();\r
+ },\r
+\r
+ changeDisplayIndexes: function(indexes) {\r
+ this.options.displayIndexes = indexes;\r
+ this.setIndex();\r
+ this.refresh();\r
+ },\r
+\r
+ changeDisplayTime: function(time) {\r
+ this.options.displayTime = time;\r
+ this.refresh();\r
+ },\r
+\r
+ refresh: function() {\r
+ try {\r
+ if (!this.building) {\r
+ this.building = true;\r
+ this.options.beforeRefresh(this);\r
+ this.destroy();\r
+ this.selectedBase = null;\r
+ Element.remove(this.calendar);\r
+ this.calendar = this.build();\r
+ this.element.appendChild(this.calendar);\r
+ this.builder.afterBuild();\r
+ if (this.options.size != 'small') Event.observe(window, 'resize', this.windowResize);\r
+ this.building = false;\r
+ }\r
+ } catch (e) {}\r
+ },\r
+ \r
+ changeCalendar: function(event) {\r
+ this.builder.changeCalendar(event);\r
+ },\r
+\r
+ changeDisplayType: function(type) {\r
+ this.options.displayType = type;\r
+ this.refresh();\r
+ },\r
+\r
+ selectDate: function(event) {\r
+ var calendar = this;\r
+ this.abstractSelect(event, function(date, element) {\r
+ if (calendar.selectedBase || calendar.hasSelectedDate()) {\r
+ if (event.ctrlKey) {\r
+ if (Element.hasClassName(element, Calendar.className.selected)) {\r
+ calendar.addSelectedClass(element);\r
+ return;\r
+ }\r
+ } else if (calendar.selectedBase) {\r
+ var selectedId = calendar.selectedBase.id;\r
+ $(selectedId).className = calendar.selectedBase.className;\r
+ calendar.clearSelected();\r
+ if (selectedId == element.id) {\r
+ calendar.selectedBase = null;\r
+ return;\r
+ }\r
+ }\r
+ }\r
+\r
+ calendar.selectedBase = {id: element.id, date: date, className: element.className};\r
+ calendar.addSelectedClass(element);\r
+ if (date && calendar.options.displayType == 'month' && calendar.options.size == Calendar.size.small) {\r
+ calendar.options.afterSelect(date, calendar);\r
+ }\r
+ });\r
+\r
+ if (calendar.options.displayType != 'month' || calendar.options.size != Calendar.size.small) {\r
+ this.mouseDown = true;\r
+ }\r
+ },\r
+\r
+ clearSelect: function() {\r
+ // BETA\r
+ this.selectedBase = null;\r
+ this.clearSelected();\r
+ },\r
+\r
+ showDayOfWeek: function(dayOfWeek) {\r
+ var indexes = this.options.displayIndexes;\r
+ this.recurrence(dayOfWeek, function(d) {\r
+ if (!indexes.include(d)) {\r
+ indexes.push(d);\r
+ }\r
+ });\r
+ this.setIndex();\r
+ this.refresh();\r
+ },\r
+\r
+ hideDayOfWeek: function(dayOfWeek) {\r
+ var indexes = this.options.displayIndexes;\r
+ var self = this;\r
+ this.recurrence(dayOfWeek, function(d) {\r
+ var index = self.findIndex(indexes, d);\r
+ if (index) {\r
+ indexes.remove(index);\r
+ } else if (!index.isNaN) {\r
+ indexes.shift();\r
+ }\r
+ });\r
+ this.refresh();\r
+ },\r
+\r
+ addHoliday: function(object) {\r
+ object = this.inspectArgument(object);\r
+ var newHash = this.toHolidayHash(object);\r
+ this.options.holidays = this.options.holidays.merge(newHash);\r
+ this.refresh();\r
+ },\r
+\r
+ removeHoliday: function(date) {\r
+ var calendar = this;\r
+ date = calendar.inspectDateArgument(date);\r
+ if (!date) return;\r
+\r
+ this.recurrence(date, function(d) {\r
+ var key = d.toDateString();\r
+ if (calendar.options.holidays[key])\r
+ delete calendar.options.holidays[key];\r
+ });\r
+ this.refresh();\r
+ },\r
+\r
+ refreshHoliday: function(object, rebuild) {\r
+ object = this.inspectArgument(object);\r
+ this.options.holidays = this.toHolidayHash(object);\r
+ if (rebuild) this.refresh();\r
+ },\r
+\r
+ clearHoliday: function() {\r
+ this.refreshHoliday([], true);\r
+ },\r
+\r
+ getHoliday: function(date) {\r
+ date = this.inspectDateArgument(date);\r
+ if (!date) return;\r
+\r
+ var calendar = this;\r
+ var holidays = [];\r
+ this.recurrence(date, function(o) {\r
+ var h = calendar.options.holidays[o.toDateString()];\r
+ if (h) holidays.push(h);\r
+ });\r
+\r
+ return holidays; \r
+ },\r
+\r
+ addSchedule: function(schedule) {\r
+ var schedules = this.options.schedules;\r
+ if (schedule.constructor == Array) {\r
+ schedule.each(function(s) {\r
+ var find = schedules.detect(function(tmp) {return s.id == tmp.id});\r
+ if (!find) schedules.push(s);\r
+ });\r
+ } else {\r
+ var find = schedules.detect(function(tmp) {return tmp.id == schedule.id});\r
+ if (!find) schedules.push(schedule);\r
+ }\r
+ this.refreshSchedule();\r
+ },\r
+\r
+ replaceSchedule: function(schedules) {\r
+ this.options.schedules = schedules;\r
+ this.refreshSchedule();\r
+ },\r
+\r
+ removeSchedule: function(ids, refresh) {\r
+ if (ids.constructor != Array) ids = [ids];\r
+ var self = this;\r
+ ids.each(function(id) {\r
+ var index = null;\r
+ self.options.schedules.each(function(s, i) {\r
+ if (s.id == id) {\r
+ index = i;\r
+ throw $break;\r
+ }\r
+ });\r
+\r
+ if (index != null) {\r
+ var schedule = self.options.schedules[index];\r
+ if (schedule) {\r
+ self.options.schedules.remove(index);\r
+ }\r
+ }\r
+ });\r
+ if (refresh) this.refreshSchedule();\r
+ },\r
+\r
+ refreshSchedule: function() {\r
+ this.builder.scheduleNodes.each(function(node) {\r
+ Element.remove(node);\r
+ });\r
+ this.builder.afterBuild();\r
+ },\r
+\r
+ mergeSchedule: function(schedule) {\r
+ var index = -1;\r
+ this.options.schedules.each(function(s, i) {\r
+ if (s.id == schedule.id) {\r
+ index = i;\r
+ throw $break;\r
+ }\r
+ });\r
+ if (index != -1) {\r
+ this.options.schedules[index] = schedule;\r
+ this.refreshSchedule();\r
+ } else {\r
+ this.addSchedule(schedule);\r
+ }\r
+ },\r
+\r
+ clearSchedule: function() {\r
+ this.options.schedules = [];\r
+ this.refreshSchedule();\r
+ },\r
+\r
+ getSchedule: function(object) {\r
+ var result = [];\r
+ var calendar = this;\r
+ object = this.inspectArgument(object || {});\r
+\r
+ this.recurrence(object, function(o) {\r
+ var schedule = calendar.options.schedules[o.date.toDateString()];\r
+ if (!schedule) return;\r
+\r
+ if (o.start) {\r
+ schedule = schedule.detect(function(s) {\r
+ return ((s.start.hour == o.start.hour) && (s.start.min == o.start.min));\r
+ });\r
+ if (schedule) result.push(schedule);\r
+ } else if (o.number) {\r
+ schedule = schedule[o.number];\r
+ if (schedule) result.push(schedule);\r
+ } else {\r
+ result = result.concat(schedule);\r
+ }\r
+ });\r
+\r
+ return result;\r
+ },\r
+\r
+ getSelected: function() {\r
+ return this.element.getElementsByClassName(Calendar.className.selected, this.element);\r
+ },\r
+\r
+ changeSchedule: function() {\r
+ var calendar = this;\r
+ return function(drag, drop) {\r
+ var array = drag.id.split('_');\r
+ var i = array.pop();\r
+ var date = array.pop();\r
+ \r
+ date = calendar.getDate(date); \r
+ var newDate = calendar.getDate(drop);\r
+ \r
+ var schedule = calendar.getSchedule({date: date, number: i});\r
+ if (schedule.length != 1) return;\r
+\r
+ schedule = schedule.pop();\r
+ schedule.date = newDate;\r
+ calendar.removeSchedule({date: date, number: i}, false);\r
+ calendar.addSchedule(schedule);\r
+\r
+ calendar.options.changeSchedule(schedule);\r
+ }\r
+ },\r
+\r
+ getSelectedDates: function() {\r
+ return this.builder.getSelectedDates();\r
+ },\r
+\r
+ getSelectedTerm: function() {\r
+ return this.builder.getSelectedTerm();\r
+ },\r
+ \r
+ /********************************** private method **********************************/\r
+ abstractSelect: function(event, method) {\r
+ this.builder.abstractSelect(event, method);\r
+ },\r
+\r
+ createRange: function(a, b) {\r
+ var range = null;\r
+ if (a <= b)\r
+ range = $R(a, b);\r
+ else\r
+ range = $R(b, a);\r
+ return range;\r
+ },\r
+\r
+ formatTime: function(time) {\r
+ var hour = (time.hour < 10) ? '0' + time.hour : time.hour;\r
+ var min = (time.min < 10) ? '0' + time.min : time.min;\r
+ return hour + ':' + min;\r
+ },\r
+\r
+ clearSelected: function() {\r
+ var elements = this.getSelected();\r
+ var self = this;\r
+ elements.each(function(e) {\r
+ if (Element.hasClassName(e, Calendar.className.selected))\r
+ self.removeSelectedClass(e);\r
+ });\r
+ },\r
+\r
+ onDblClick: function(event) {\r
+ this.abstractSelect(event, this.options.dblclickListener);\r
+ },\r
+\r
+ onMouseUp: function(event) {\r
+ var e = event || window.event;\r
+ var calendar = this;\r
+ if (calendar.mouseDown) {\r
+ setTimeout(function() {\r
+ calendar.mouseDown = false;\r
+ calendar.options.afterSelect(event);\r
+ }, 10);\r
+ }\r
+ },\r
+\r
+ setRegularHolidayClass: function(node) {\r
+ this.classNames.refreshClassNames(node, 'regularHoliday');\r
+ },\r
+\r
+ setHolidayClass: function(node) {\r
+ this.classNames.refreshClassNames(node, 'holiday');\r
+ },\r
+\r
+ setWorkdayClass: function(node) {\r
+ this.classNames.refreshClassNames(node, 'date');\r
+ },\r
+\r
+ setScheduleClass: function(node) {\r
+ this.classNames.refreshClassNames(node, 'schedule');\r
+ },\r
+\r
+ addHighlightClass: function(node) {\r
+ Element.addClassName(node, Calendar.className.highlightDay);\r
+ },\r
+\r
+ addSelectedClass: function(node) {\r
+ Element.addClassName(node, Calendar.className.selected);\r
+ },\r
+\r
+ removeSelectedClass: function(node) {\r
+ Element.removeClassName(node, Calendar.className.selected);\r
+ },\r
+\r
+ getDatasWithMonthAndYear: function(array) {\r
+ var calendar = this;\r
+ var result = array.findAll(function(h) {\r
+ return calendar.isSameYearAndMonth(h.date);\r
+ });\r
+\r
+ return result;\r
+ },\r
+\r
+ isSameYearAndMonth: function(a, b) {\r
+ if (a.constructor == Date) {\r
+ if (!b) b = this.date;\r
+ return ((a.getYear() == b.getYear()) && (a.getMonth() == b.getMonth()));\r
+ } else {\r
+ return (a.year == b.year && a.month == b.month && a.day == a.day);\r
+ }\r
+ }, \r
+\r
+ isSameDate: function(a, b) {\r
+ if (a.constructor == Date) {\r
+ if (!b) b = this.date;\r
+ return (this.isSameYearAndMonth(a, b) && (a.getDate() == b.getDate()));\r
+ } else {\r
+ return (this.isSameYearAndMonth(a, b) && a.day == b.day);\r
+ }\r
+ }, \r
+\r
+ isSameTime: function(a, b) {\r
+ return ((a.hour == b.hour) && (a.min == b.min));\r
+ },\r
+\r
+ betweenDate: function(schedule, date) {\r
+ var start = this.toDateNumber(schedule.start);\r
+ var finish = this.toDateNumber(schedule.finish);\r
+ date = this.toDateNumber(date);\r
+ return start <= date && date <= finish;\r
+ },\r
+\r
+ toDateNumber: function(date) {\r
+ if (date.constructor == Date) {\r
+ return date.getFullYear() * 10000 + date.getMonth() * 100 + date.getDate();\r
+ } else {\r
+ return date.year * 10000 + date.month * 100 + date.day;\r
+ }\r
+ },\r
+\r
+ getTimeDiff: function(a, b) {\r
+ var time = {hour: b.hour - a.hour, min: b.min - a.min};\r
+ if (time.min >= 60) {\r
+ time.hour++;\r
+ time.min -= 60;\r
+ } else if (time.min < 0) {\r
+ time.hour--;\r
+ time.min += 60;\r
+ }\r
+ return time;\r
+ },\r
+\r
+ findIndex: function(array, value) {\r
+ var index = null;\r
+ array.each(function(v, i) {\r
+ if (v == value) {\r
+ index = i;\r
+ throw $break;\r
+ }\r
+ });\r
+ return index;\r
+ },\r
+\r
+ recurrence: function(object, method) {\r
+ var calendar = this;\r
+ if (object.constructor == Array) {\r
+ object.each(function(o) {calendar.recurrence(o, method)});\r
+ } else if (object.keys) {\r
+ object.each(function(pair) {calendar.recurrence(pair[1], method)});\r
+ } else {\r
+ method(object);\r
+ }\r
+ },\r
+\r
+ toHolidayHash: function(object) {\r
+ var calendar = this;\r
+ var hash = {};\r
+\r
+ this.recurrence(object, function(o) {\r
+ if (!o.name) return;\r
+ if (o.date.constructor == Object)\r
+ o.date = new Date(o.date.year, o.date.month, o.date.day);\r
+\r
+ hash[o.date.toDateString()] = o;\r
+ });\r
+ return $H(hash);\r
+ },\r
+\r
+// toScheduleHash: function(object) {\r
+// var calendar = this;\r
+// var hash = {};\r
+//\r
+// this.recurrence(object, function(o) {\r
+// if (!o.description) return;\r
+// if (o.date.constructor == Object)\r
+// o.date = new Date(o.date.year, o.date.month, o.date.day);\r
+//\r
+// var date = o.date.toDateString();\r
+// o.date = date;\r
+//\r
+// if (hash[date]) {\r
+// hash[date].push(o);\r
+// hash[date].sort(calendar.sortSchedule);\r
+// } else {\r
+// hash[date] = [o];\r
+// }\r
+// });\r
+// return $H(hash);\r
+// },\r
+\r
+ inspectArgument: function(object, time) {\r
+ return this.builder.inspectArgument(object, time);\r
+ },\r
+\r
+ inspectDateArgument: function(date) {\r
+ return this.builder.inspectDateArgument(date);\r
+ },\r
+\r
+ sortSchedule: function(a, b) {\r
+ if (a.start.hour == b.start.hour) {\r
+ if (a.start.min == b.start.min)\r
+ return 0;\r
+ if (a.start.min < b.start.min)\r
+ return -1;\r
+ return 1;\r
+ }\r
+ if (a.start.hour < b.start.hour) return -1;\r
+\r
+ return 1;\r
+ },\r
+\r
+ hasSelectedDate: function() {\r
+ return (this.getSelected().length != 0);\r
+ },\r
+\r
+ getDate: function(element) {\r
+ return this.builder.getDate(element);\r
+ },\r
+\r
+ isRegularHoliday: function(day) {\r
+ return this.options.regularHoliday.include(day);\r
+ },\r
+\r
+ isHoliday: function(date) {\r
+ return this.options.holidays[date.toDateString()];\r
+ },\r
+\r
+ isScheduleDay: function(date) {\r
+ return this.options.schedules[date.toDateString()];\r
+ },\r
+\r
+ cacheSchedule: function(schedule) {\r
+ this.cached = schedule;\r
+ schedule.start_old = Object.clone(schedule.start);\r
+ schedule.finish_old = Object.clone(schedule.finish);\r
+ }\r
+}\r
+\r
+\r
+/**\r
+ * AbstractCalendar Class\r
+ */\r
+var AbstractCalendar = Class.create();\r
+AbstractCalendar.id = {\r
+ container: 'container',\r
+ scheduleContainer: 'scheduleContainer',\r
+ selector: 'selector'\r
+}\r
+AbstractCalendar.prototype = {\r
+ destroy: Prototype.emptyFunction,\r
+ beforeBuild: Prototype.emptyFunction,\r
+\r
+ build: function() {\r
+ this.header = this.buildHeader();\r
+ var node = Builder.node(\r
+ 'DIV', \r
+ {\r
+ id: this.getContainerId(),\r
+ className: this.calendar.classNames.joinClassNames('container')\r
+ },\r
+ [this.header, this.buildCalendar()]);\r
+\r
+ return node;\r
+ },\r
+\r
+ buildHeader: function() {\r
+ var headerNodes = Builder.node('TR');\r
+ headerNodes.appendChild(this.buildHeaderLeft());\r
+ headerNodes.appendChild(this.buildHeaderCenter());\r
+ headerNodes.appendChild(this.buildHeaderRight());\r
+ \r
+ className = this.calendar.classNames.joinClassNames('header');\r
+ var tbody = Builder.node('TBODY', [headerNodes]);\r
+ return Builder.node('TABLE', {className: className}, [tbody]);\r
+ },\r
+\r
+ buildSelector: function() {\r
+ // create selector\r
+ var selector = Builder.node('DIV', {id: this.getSelectorId()});\r
+ this.calendar.classNames.addClassNames(selector, 'selector');\r
+ Element.setOpacity(selector, 0.6);\r
+ Element.hide(selector);\r
+ Element.setStyle(selector, {zIndex: ZindexManager.getIndex()})\r
+ return selector;\r
+ },\r
+\r
+ buildCover: function() {\r
+ this.cover = Builder.node('div', {id: this.calendar.element.id.appendSuffix('cover')});\r
+ this.calendar.classNames.addClassNames(this.cover, 'cover');\r
+ Event.observe(this.cover, 'mousedown', this.calendar.selectDate.bindAsEventListener(this.calendar));\r
+ if (this.calendar.options.displayType != 'month' || this.calendar.options.size != 'samll') {\r
+ Event.observe(this.cover, 'mousemove', this.multipleSelection.bindAsEventListener(this));\r
+ }\r
+ return this.cover;\r
+ },\r
+\r
+ buildScheduleContainer: function() {\r
+ this.container = Builder.node('DIV', {style: 'position: relative', id: this.getScheduleContainerId()});\r
+ return this.container;\r
+ },\r
+\r
+ // the default is empty.\r
+ // overwride this method.\r
+ setScheduleContainerEvent: Prototype.emptyFunction,\r
+\r
+ changeCalendar: function(event) {\r
+ var element = Event.element(event);\r
+ var date = this.calendar.date;\r
+ var oldDate = new Date(date.toDateString());\r
+\r
+ if (Element.hasClassName(element, Calendar.className.preYearMark)) {\r
+ date.setFullYear(date.getFullYear() - 1);\r
+ } else if (Element.hasClassName(element, Calendar.className.preMonthMark)) {\r
+ date.setDate(1);\r
+ date.setMonth(date.getMonth() - 1);\r
+ } else if (Element.hasClassName(element, Calendar.className.preWeekMark)) {\r
+ date.setDate(date.getDate() - 7);\r
+ } else if (Element.hasClassName(element, Calendar.className.nextYearMark)) {\r
+ date.setFullYear(date.getFullYear() + 1);\r
+ } else if (Element.hasClassName(element, Calendar.className.nextMonthMark)) {\r
+ date.setDate(1);\r
+ date.setMonth(date.getMonth() + 1);\r
+ } else if (Element.hasClassName(element, Calendar.className.nextWeekMark)) {\r
+ date.setDate(date.getDate() + 7);\r
+ }\r
+\r
+ this.calendar.options.changeCalendar(date, oldDate);\r
+ this.calendar.refresh();\r
+ },\r
+\r
+ clickDeleteImage: function(schedule) {\r
+ if (this.calendar.options.beforeRemoveSchedule(schedule)) {\r
+ this.calendar.removeSchedule(schedule.id, true);\r
+ }\r
+ },\r
+\r
+ showDeleteImage: function(img) {\r
+ Element.show(img);\r
+ },\r
+\r
+ hideDeleteImage: function(img) {\r
+ Element.hide(img);\r
+ },\r
+\r
+ _constrain: function(n, lower, upper) {\r
+ if (n > upper) return upper; \r
+ else if (n < lower) return lower;\r
+ else return n;\r
+ },\r
+\r
+ getContainerId: function() {\r
+ return this.calendar.element.id.appendSuffix(AbstractCalendar.id.container);\r
+ },\r
+\r
+ getScheduleContainerId: function() {\r
+ return this.calendar.element.id.appendSuffix(AbstractCalendar.id.scheduleContainer);\r
+ },\r
+\r
+ setColumnWidth: function() {\r
+ var adjustSize = this.getAdjustSize();\r
+ var container = $(this.getScheduleContainerId()) || this.container;\r
+ var indexes = this.calendar.options.displayIndexes;\r
+ this.column.width = container.offsetWidth / indexes.length - adjustSize;\r
+ if (this.column.width < 0) this.column.width = 0;\r
+ },\r
+\r
+ setCover: function() {\r
+ var container = $(this.getScheduleContainerId()) || this.container;\r
+ if (!this.cover) {\r
+ container.appendChild(this.buildCover());\r
+ }\r
+ Element.setStyle(this.cover, {height: Element.getHeight(container) + 'px'});\r
+ },\r
+\r
+ getDragDistance: function() {\r
+ var adjustSize = this.getAdjustSize();\r
+// return [this.column.width + adjustSize, this.column.height];\r
+ return [this.column.width + adjustSize, this.column.height / 2];\r
+ },\r
+\r
+ getWeek: function() {\r
+ var date = this.calendar.date;\r
+ var baseDay = date.getDay();\r
+ var baseDayIndex = date.getDay();\r
+ var findBaseDay = false;\r
+\r
+ return this.calendar.options.displayIndexes.map(function(week, i) {\r
+ var diff = week - baseDay;\r
+ if (!findBaseDay && (diff > 0)) diff -= 7;\r
+ if (baseDayIndex == week) findBaseDay = true;\r
+ return DateUtil.afterDays(date, diff);\r
+ });\r
+ },\r
+\r
+ isSameStartDate: function(schedule, date) {\r
+ return ((date.getFullYear() == schedule.start.year) &&\r
+ (date.getMonth() == schedule.start.month) && (date.getDate() == schedule.start.day));\r
+ },\r
+\r
+ isSameFinishDate: function(schedule, date) {\r
+ return ((date.getFullYear() == schedule.finish.year) &&\r
+ (date.getMonth() == schedule.finish.month) && (date.getDate() == schedule.finish.day));\r
+ },\r
+\r
+ getSelectorId: function() {\r
+ return this.calendar.element.id.appendSuffix(AbstractCalendar.id.selector);\r
+ },\r
+\r
+ clickDateText: function(event, date) {\r
+ Event.stop(event);\r
+ this.calendar.date = date;\r
+ this.calendar.options.displayType = 'day';\r
+ this.calendar.refresh();\r
+ },\r
+\r
+ getAdjustSize: function() {\r
+ return UserAgent.isIE() ? 3 : 3;\r
+ },\r
+\r
+ setContainerInfo: function() {\r
+ this.container = $(this.getScheduleContainerId());\r
+ this.containerDimensions = Element.getDimensions(this.container);\r
+ this.containerOffset = Position.cumulativeOffset(this.container);\r
+ },\r
+\r
+ mouseOverSubSchedule: function(items) {\r
+ items.each(function(item) {\r
+ Element.addClassName(item, Calendar.className.scheduleItemSelect);\r
+ });\r
+ },\r
+\r
+ mouseOutSubSchedule: function(items) {\r
+ items.each(function(item) {\r
+ Element.removeClassName(item, Calendar.className.scheduleItemSelect);\r
+ });\r
+ },\r
+\r
+ toDate: function(hash) {\r
+ return DateUtil.toDate(hash);\r
+ }\r
+}\r
+\r
+\r
+/**\r
+ * CalenderMonth Class\r
+ */\r
+var CalendarMonth = Class.create();\r
+CalendarMonth.id = {\r
+ year: 'year',\r
+ month: 'month',\r
+ column: 'column',\r
+ nextYear: 'nextYear',\r
+ nextMonth: 'nextMonth',\r
+ preYear: 'preYear',\r
+ preMonth: 'preMonth',\r
+ calTable: 'calTable',\r
+ scheduleContainer: 'scheduleContainer',\r
+ container: 'container'\r
+}\r
+Object.extend(CalendarMonth.prototype, AbstractCalendar.prototype);\r
+Object.extend(CalendarMonth.prototype, {\r
+\r
+ initialize: function(calendar) {\r
+ this.calendar = calendar;\r
+ this.week = this.getWeek();\r
+ },\r
+\r
+ /*** Month ***/\r
+ /********************************** build functions **********************************/\r
+ buildHeaderLeft: function() {\r
+ var container = Builder.node('TD');\r
+ this.calendar.classNames.addClassNames(container, 'preYears');\r
+\r
+ var id = this.calendar.element.id.appendSuffix(CalendarMonth.id.preYear);\r
+ var node = Builder.node('DIV', {id: id});\r
+ this.calendar.classNames.addClassNames(node, 'preYearMark');\r
+ Event.observe(node, "click", this.calendar.changeCalendar.bindAsEventListener(this.calendar));\r
+ container.appendChild(node);\r
+\r
+ id = this.calendar.element.id.appendSuffix(CalendarMonth.id.preMonth);\r
+ node = Builder.node('DIV', {id: id});\r
+ this.calendar.classNames.addClassNames(node, 'preMonthMark');\r
+ Event.observe(node, "click", this.calendar.changeCalendar.bindAsEventListener(this.calendar));\r
+ container.appendChild(node);\r
+\r
+ return container;\r
+ },\r
+\r
+ buildHeaderCenter: function() {\r
+ var text = [];\r
+ if (this.calendar.options.monthHeaderFormat) {\r
+ var date = this.calendar.date;\r
+ var templ = new Template(this.calendar.options.monthHeaderFormat);\r
+ text = [templ.evaluate({year: date.getFullYear(), month: date.getMonth() + 1}), ' '];\r
+ }\r
+ var contents = [];\r
+\r
+ var id = this.calendar.element.id.appendSuffix(CalendarMonth.id.month);\r
+ var node = Builder.node('SPAN', {id: id}, [text[0] || DateUtil.months[this.calendar.date.getMonth()]]);\r
+ this.calendar.classNames.addClassNames(node, 'ym');\r
+ contents.push(node);\r
+\r
+ id = this.calendar.element.id.appendSuffix(CalendarMonth.id.year);\r
+ node = Builder.node('SPAN', {id: id}, [text[1] || this.calendar.date.getFullYear()]);\r
+ this.calendar.classNames.addClassNames(node, 'ym');\r
+ contents.push(node);\r
+\r
+ var container = Builder.node('TD', contents);\r
+ this.calendar.classNames.addClassNames(container, 'years');\r
+\r
+ return container;\r
+ },\r
+\r
+ buildHeaderRight: function() {\r
+ var container = Builder.node('TD');\r
+ this.calendar.classNames.addClassNames(container, 'nextYears');\r
+\r
+ var id = this.calendar.element.id.appendSuffix(CalendarMonth.id.nextMonth);\r
+ var node = Builder.node('DIV', {id: id});\r
+ this.calendar.classNames.addClassNames(node, 'nextMonthMark');\r
+ Event.observe(node, "click", this.calendar.changeCalendar.bindAsEventListener(this.calendar));\r
+ container.appendChild(node);\r
+\r
+ id = this.calendar.element.id.appendSuffix(CalendarMonth.id.nextYear);\r
+ node = Builder.node('DIV', {id: id});\r
+ this.calendar.classNames.addClassNames(node, 'nextYearMark');\r
+ Event.observe(node, "click", this.calendar.changeCalendar.bindAsEventListener(this.calendar));\r
+ container.appendChild(node);\r
+\r
+ return container;\r
+ },\r
+ \r
+ buildCalendar: function() {\r
+ var container = Builder.node('DIV');\r
+ var scheduleContainer = Builder.node('DIV',\r
+ {id: this.getScheduleContainerId(), style: 'position: relative'},\r
+ [this.buildTableData()]);\r
+ this.setScheduleContainerEvent(scheduleContainer);\r
+\r
+ // create selector\r
+ var selector = this.buildSelector();\r
+ scheduleContainer.appendChild(selector);\r
+ return Builder.node('DIV', [this.buildTableHeader(), scheduleContainer]);\r
+ },\r
+ \r
+ buildTableHeader: function() {\r
+ var weekArray = new Array();\r
+ var self = this;\r
+ var tbody = Builder.node('TBODY');\r
+ var tr = Builder.node('TR', weekArray);\r
+ var width = 100 / this.calendar.options.displayIndexes.length + '%';\r
+ var lastIndex = this.calendar.options.displayIndexes.last();\r
+\r
+ tbody.appendChild(tr);\r
+\r
+ this.calendar.options.displayIndexes.each(function(i) {\r
+ var id = self.calendar.element.id.appendSuffix(CalendarMonth.id.column);\r
+ var text = self.calendar.options.dayOfWeek[i];\r
+ var node = Builder.node('TH', {id: id.appendSuffix(i)}, [text]);\r
+ node.width = width;\r
+ weekArray.push(node);\r
+ if (lastIndex == i) {\r
+ self.calendar.classNames.addClassNames(node, 'thRight');\r
+ }\r
+ Event.observe(node, 'click', self.selectDay.bindAsEventListener(self));\r
+ tr.appendChild(node);\r
+ });\r
+ \r
+ return Builder.node('TABLE', \r
+ {className: this.calendar.classNames.joinClassNames('table')}, [tbody]);\r
+ },\r
+ \r
+ buildTableData: function() {\r
+ var indexes = this.calendar.options.displayIndexes;\r
+ var today = new Date();\r
+ var year = this.calendar.date.getFullYear();\r
+ var month = this.calendar.date.getMonth();\r
+ var firstDay = DateUtil.getFirstDate(year, month).getDay();\r
+ var lastDate = DateUtil.getLastDate(year, month).getDate();\r
+ var trs = new Array();\r
+ var tds = new Array();\r
+ var width = 100 / indexes.length + '%';\r
+ var lastIndex = indexes.last();\r
+ var node, hday, sday, tmp_date, isOutside, i = null;\r
+\r
+ // set start index\r
+ var weekIndex = this.calendar.options.weekIndex;\r
+ var length = DateUtil.dayOfWeek.length * 5;\r
+ var i = null;\r
+ var day = 1;\r
+ if (weekIndex <= firstDay) {\r
+ i = weekIndex;\r
+ length += i;\r
+ } else {\r
+ i = weekIndex - 7;\r
+ length -= i;\r
+ }\r
+\r
+ var diff = firstDay - weekIndex;\r
+ if (diff < 0) diff + indexes.length;\r
+ if ((lastDate + diff) > length) {\r
+ length += indexes.length;\r
+ }\r
+\r
+ var wday = weekIndex;\r
+ \r
+ var find = 0;\r
+ for (; i < length; i++) {\r
+ if (indexes.include(wday)) {\r
+ if (i < firstDay) {\r
+ tmp_date = new Date(\r
+ this.calendar.date.getFullYear(),\r
+ this.calendar.date.getMonth(),\r
+ i - firstDay + 1\r
+ );\r
+ node = Builder.node('TD');\r
+ node.innerHTML = ' ';\r
+ node.date = tmp_date;\r
+ node.width = width;\r
+ tds.push(node);\r
+ } else if (day > lastDate) {\r
+ tmp_date = new Date(\r
+ this.calendar.date.getFullYear(),\r
+ this.calendar.date.getMonth(),\r
+ day\r
+ );\r
+ node = Builder.node('TD');\r
+ node.innerHTML = ' ';\r
+ node.date = tmp_date;\r
+ tds.push(node);\r
+ } else {\r
+ if (i == firstDay) length += find;\r
+ tmp_date = new Date(\r
+ this.calendar.date.getFullYear(),\r
+ this.calendar.date.getMonth(),\r
+ day\r
+ );\r
+ hday = this.calendar.options.holidays[tmp_date.toDateString()];\r
+\r
+ if (this.calendar.options.size == Calendar.size.large) {\r
+ node = this.buildLargeRow(tmp_date, hday, sday, today);\r
+ if (this.calendar.options.dblclickListener) {\r
+ Event.observe(node, 'dblclick', this.calendar.onDblClick.bindAsEventListener(this.calendar));\r
+ }\r
+ } else {\r
+ sday = this.calendar.options.schedules.detect(function(schedule) {\r
+ var startDate = DateUtil.toDate(schedule.start);\r
+ return tmp_date.sameDate(startDate)\r
+ });\r
+ node = this.buildSmallRow(tmp_date, hday, sday, today);\r
+ Event.observe(node, 'mousedown', this.calendar.selectDate.bindAsEventListener(this.calendar));\r
+ }\r
+\r
+ node.width = width;\r
+ node.date = tmp_date;\r
+\r
+ tds.push(node);\r
+ }\r
+ find++;\r
+ }\r
+\r
+ if (i >= firstDay) {\r
+ day++;\r
+ }\r
+\r
+ if (wday == lastIndex) {\r
+ trs.push(Builder.node('TR', tds));\r
+ this.calendar.classNames.addClassNames(tds[tds.length - 1], 'tdRight');\r
+ tds = new Array();\r
+ }\r
+\r
+ if (wday >= 6) {\r
+ wday = 0;\r
+ } else {\r
+ wday++;\r
+ }\r
+ }\r
+\r
+ this.rowMax = trs.length - 1;\r
+ var tbody = Builder.node('TBODY', [trs]);\r
+ this.calendarTable = Builder.node(\r
+ 'TABLE', \r
+ {\r
+ id: this.getCalendarTableId(),\r
+ className: this.calendar.classNames.joinClassNames('table')\r
+ },\r
+ [tbody]);\r
+ return this.calendarTable;\r
+ },\r
+\r
+ buildLargeRow: function(date, holiday, schedule, today) {\r
+ var calendar = this;\r
+ var row = Builder.node('TD', {id: this.getDateId(date)});\r
+ var dateContainer = Builder.node('DIV');\r
+\r
+ this.calendar.classNames.addClassNames(dateContainer, 'dateContainer');\r
+ row.appendChild(dateContainer);\r
+\r
+ var dateNode = null;\r
+ var clickDateText = this.calendar.options.clickDateText;\r
+ if (clickDateText) {\r
+ dateNode = Builder.node('A', {href: '#'}, [date.getDate()]);\r
+ Event.observe(dateContainer, 'mousedown', clickDateText.bindAsEventListener(this, date));\r
+ } else if (clickDateText == null) {\r
+ dateNode = Builder.node('A', {href: '#'}, [date.getDate()]);\r
+ Event.observe(dateContainer, 'mousedown', this.clickDateText.bindAsEventListener(this, date));\r
+ } else {\r
+ dateNode = Builder.node('SPAN', [date.getDate()]);\r
+ Element.setStyle(dateNode, {textDecoration: 'none'});\r
+ }\r
+ if (date.days() == today.days()) {\r
+ this.calendar.addHighlightClass(dateNode);\r
+ }\r
+ dateContainer.appendChild(dateNode);\r
+\r
+ if (holiday) {\r
+ this.calendar.setHolidayClass(row);\r
+ var name = Builder.node(\r
+ 'SPAN', \r
+ {className: this.calendar.classNames.joinClassNames('holidayName')},\r
+ holiday.name\r
+ );\r
+ dateContainer.appendChild(name);\r
+ if (holiday.onclick) {\r
+ Event.observe(name, "click", holiday.onclick.bindAsEventListener(this));\r
+ }\r
+ } else if (this.calendar.isRegularHoliday(date.getDay())) {\r
+ this.calendar.setRegularHolidayClass(row);\r
+ } else {\r
+ this.calendar.setWorkdayClass(row);\r
+ }\r
+\r
+ return row;\r
+ },\r
+\r
+ buildSmallRow: function(date, holiday, schedule, today) {\r
+ var row = Builder.node('TD', {id: this.getDateId(date)}, [date.getDate()]);\r
+ if (schedule) {\r
+ this.calendar.setScheduleClass(row);\r
+ var first = schedule[0];\r
+ if (first) row.title = first.description.stripTags();\r
+ } else if (holiday) {\r
+ this.calendar.setHolidayClass(row);\r
+ row.title = holiday.name.stripTags();\r
+ } else if (this.calendar.isRegularHoliday(date.getDay())) {\r
+ this.calendar.setRegularHolidayClass(row);\r
+ } else {\r
+ this.calendar.setWorkdayClass(row);\r
+ }\r
+\r
+ if (date.days() == today.days()) {\r
+ this.calendar.addHighlightClass(row);\r
+ }\r
+ return row;\r
+ },\r
+\r
+ beforeBuild: function() {\r
+ this.column = {};\r
+ var rule = CssUtil.getCssRuleBySelectorText('.' + Calendar.className.table + ' td');\r
+ this.column.height = parseInt(rule.style['height'], 10);\r
+ \r
+ rule = CssUtil.getCssRuleBySelectorText('.' + Calendar.className.dateContainer);\r
+ this.column.dateTextHeight = parseInt(rule.style['height'], 10);\r
+ },\r
+\r
+ /**********************************\r
+ ***** for make schedule item *****\r
+ **********************************/\r
+ buildSchedule: function(schedule) {\r
+ var id = 'scheduleItem_' + schedule.id;\r
+ var canEdit = (schedule.edit == undefined || schedule.edit);\r
+ var item = Builder.node('DIV', {id: id});\r
+ var start = DateUtil.toDate(schedule.start);\r
+ var finish = DateUtil.toDate(schedule.finish);\r
+ if (start.sameDate(finish)) {\r
+ this.calendar.classNames.addClassNames(item, 'scheduleItemNoBorder');\r
+ } else {\r
+ this.calendar.classNames.addClassNames(item, 'scheduleItemLarge');\r
+ }\r
+\r
+ if (canEdit) {\r
+ var deleteImg = Builder.node('DIV',\r
+ {\r
+ id: 'scheduleDeleteImg_' + schedule.id,\r
+ className: this.calendar.classNames.joinClassNames('deleteImg')\r
+ }\r
+ );\r
+ Element.hide(deleteImg);\r
+ item.appendChild(deleteImg);\r
+\r
+ // set click event on a image.\r
+ Event.observe(deleteImg, 'click', this.clickDeleteImage.bind(this, schedule));\r
+ Event.observe(item, 'mouseover', this.showDeleteImage.bind(this, deleteImg));\r
+ Event.observe(item, 'mouseout', this.hideDeleteImage.bind(this, deleteImg));\r
+ }\r
+\r
+ // set dblclick event on a schedule item.\r
+ if (this.calendar.options.dblclickSchedule) {\r
+ Event.observe(\r
+ item, 'dblclick', this.calendar.options.dblclickSchedule.bind(this, schedule));\r
+ }\r
+\r
+ // drag handler\r
+ var handler = null;\r
+ if (canEdit) {\r
+ handler = Builder.node('DIV', {className: this.calendar.classNames.joinClassNames('scheduleHandler')});\r
+ item.appendChild(handler);\r
+ }\r
+\r
+ var icon = null;\r
+ if (schedule.icon) {\r
+ icon = Builder.node('IMG', {src: schedule.icon, alt: 'icon', style: 'float: left;'});\r
+ item.appendChild(icon);\r
+ }\r
+\r
+ // private mark\r
+ if (!schedule.publicity) {\r
+ icon = Builder.node('DIV', {id: 'private_img_' + schedule.id});\r
+ this.calendar.classNames.addClassNames(icon, 'privateImg');\r
+ item.appendChild(icon);\r
+ }\r
+\r
+ var body = Builder.node('DIV');\r
+ var text = this.getTimeText(schedule.start, schedule.finish);\r
+ text = Builder.node('DIV', {id: id + '_text', style: 'float: left;'}, [text]);\r
+ this.calendar.classNames.addClassNames(text, 'scheduleTimeArea');\r
+ item.appendChild(text);\r
+ var description = schedule.description.unescapeHTML();\r
+ item.appendChild(Builder.node('DIV', {id: id + '_description'}, [description]));\r
+\r
+ item.title = description;\r
+ item.schedule = schedule;\r
+\r
+ return [item, handler];\r
+ },\r
+\r
+ adjustScheduleStyle: function(item, rowIndex, cellIndex, holder) {\r
+ var self = this;\r
+ var height = parseInt(Element.getStyle(item, 'height'), 10);\r
+ var top = parseInt(Element.getStyle(item, 'top'), 10);\r
+ var range = this.getScheduleRange(item);\r
+ var tops = [];\r
+\r
+ holder.each(function(holded) {\r
+ var holdedRange = self.getScheduleRange(holded);\r
+ if (range.any(function(r) {return holdedRange.include(r)})) {\r
+ tops.push(holded.topIndex);\r
+ }\r
+ });\r
+\r
+ var index = $R(0, tops.length, true).detect(function(i) {return !tops.include(i)});\r
+ if (isNaN(index)) index = tops.length;\r
+ item.topIndex = index;\r
+ Element.setStyle(item, {top: top + (height + 2) * index + 'px'});\r
+ },\r
+\r
+ getScheduleRange: function(item) {\r
+ return $R(0, item.length, true).map(function(i) {return item.cellIndex + i});\r
+ },\r
+\r
+ setScheduleBaseStyle: function(item, rowIndex, cellIndex, length) {\r
+ var oneDay = this.column.height;\r
+ var top = oneDay * rowIndex + this.column.dateTextHeight;\r
+ var adjustSize = this.getAdjustSize();\r
+ Element.setStyle(item, {\r
+ top: top + 'px',\r
+ width: this.column.width * length + adjustSize * (length - 1) + 'px',\r
+ left: this.column.width * cellIndex + cellIndex * adjustSize + 'px'\r
+ });\r
+ },\r
+\r
+ afterBuild: function() {\r
+ this.scheduleNodes = [];\r
+ if (this.calendar.options.size != Calendar.size.small) {\r
+ this.setContainerInfo();\r
+ this.setColumnWidth();\r
+ this.setCover();\r
+ this.setSelector();\r
+ var self = this;\r
+ var indexes = this.calendar.options.displayIndexes;\r
+ var distance = this.getDragDistance();\r
+ var holders = $R(0, $(this.getCalendarTableId()).rows.length).map(function() {return []});\r
+ var date = this.calendar.date;\r
+ var calStartDate = DateUtil.getFirstDate(date.getFullYear(), date.getMonth());\r
+ var calStart = calStartDate.days();\r
+ var calFinish = DateUtil.getLastDate(date.getFullYear(), date.getMonth()).days();\r
+ \r
+ self.calendar.options.schedules.each(function(schedule, index) {\r
+ var startDate = self.toDate(schedule.start);\r
+ var start = startDate.days();\r
+ var finishDate = self.toDate(schedule.finish);\r
+ var finish = finishDate.days();\r
+ var days = self.getDayDiff(schedule);\r
+ \r
+ if ((start >= calStart && start <= calFinish) || (finish >= calStart && finish <= calFinish)) {\r
+ if (!calStartDate.sameMonth(startDate)) startDate = calStartDate;\r
+ self.setSchedule(schedule, holders, distance, days);\r
+ }\r
+ });\r
+ }\r
+ },\r
+\r
+ setSchedule: function(schedule, holders, distance, days) {\r
+ var items = [];\r
+ var rowMax = 6;\r
+ var startDate = DateUtil.toDate(schedule.start);\r
+ var date = startDate;\r
+ var indexes = this.calendar.options.displayIndexes;\r
+ var targetDate = this.calendar.options.initDate;\r
+\r
+ while (days >= 0) {\r
+ if (date.getMonth() != startDate.getMonth()) break;\r
+ var lastWday = this.getLastWday(date);\r
+\r
+ var length = days + 1;\r
+ var firstDay = date.getDay();\r
+ var finishDate = date.advance({days: length - 1});\r
+\r
+ if (finishDate.getTime() > lastWday.getTime()) {\r
+ finishDate = lastWday; \r
+ length = finishDate.days() - date.days() + 1;\r
+ }\r
+ var finishDay = finishDate.getDay();\r
+ var wdays = null;\r
+ if (firstDay <= finishDay) {\r
+ wdays = $R(firstDay, finishDay, false);\r
+ } else {\r
+ wdays = $R(0, finishDay, false).toArray().concat($R(firstDay, rowMax, false).toArray());\r
+ }\r
+ var itemLength = wdays.findAll(function(day) {\r
+ return indexes.include(day);\r
+ }).length;\r
+\r
+ var cellDate = new Date(date.getTime());\r
+ while (cellDate.days() <= finishDate.days()) {\r
+ if (cellDate.getMonth() == targetDate.getMonth()) {\r
+ var cellPosition = this.getCellPosition(cellDate.getDate());\r
+ if (cellPosition) {\r
+ var rowIndex = cellPosition.rowIndex;\r
+ var cellIndex = cellPosition.cellIndex;\r
+ \r
+ // create a schedule node.\r
+ var result = this.buildSchedule(schedule);\r
+ var item = result.first();\r
+ item.length = itemLength;\r
+ item.cellIndex = cellIndex;\r
+ this.container.appendChild(item);\r
+ \r
+ // set style(position and size) of a schedule item.\r
+ this.setScheduleBaseStyle(item, rowIndex, cellIndex, itemLength);\r
+ var left = this.adjustScheduleStyle(item, rowIndex, cellIndex, holders[rowIndex]);\r
+ \r
+ if (schedule.edit == undefined || schedule.edit) {\r
+ this.setDraggable(item, result.last(), distance);\r
+ this.setResize(item);\r
+ }\r
+ \r
+ holders[rowIndex].push(item);\r
+ this.scheduleNodes.push(item);\r
+ break;\r
+ } else if (indexes.include(cellDate.getDay())) {\r
+ itemLength--;\r
+ }\r
+ } else if (indexes.include(cellDate.getDay())) {\r
+ itemLength--;\r
+ }\r
+ cellDate = cellDate.advance({days: 1});\r
+ }\r
+ \r
+ if (items.length == 0) {\r
+ days -= length;\r
+ } else {\r
+ days =- 7;\r
+ }\r
+\r
+ var date = finishDate.advance({days: 1});\r
+ if (item) items.push(item);\r
+ }\r
+\r
+ var self = this;\r
+ items.each(function(item) {\r
+ Event.observe(item, 'mouseover', self.mouseOverSubSchedule.bind(this, items));\r
+ Event.observe(item, 'mouseout', self.mouseOutSubSchedule.bind(this, items));\r
+ });\r
+ },\r
+\r
+ getLastWday: function(date) {\r
+ var index = this.calendar.wdays.indexOf(date.getDay()) + 1;\r
+ return date.advance({days: this.calendar.wdays.length - index});\r
+ },\r
+\r
+ setSelector: function() {\r
+ var selector = $(this.getSelectorId());\r
+ Element.setStyle(selector, {\r
+ width: this.column.width + 'px',\r
+ height: this.column.height - 2 + 'px'\r
+ });\r
+ },\r
+\r
+ // set draggalbe event\r
+ setDraggable: function(item, handle, distance) {\r
+ var self = this;\r
+ var offset = Position.cumulativeOffset(this.container);\r
+ var selector = $(this.getSelectorId());\r
+ var cWidth = this.column.width;\r
+ var cHeight = this.column.height;\r
+ var rowMax = this.rowMax;\r
+ var cellMax = this.calendar.options.displayIndexes.length - 1;\r
+ var adjustSize = this.getAdjustSize();\r
+\r
+ new Draggable(item, \r
+ {\r
+ handle: handle,\r
+ scroll: window,\r
+ starteffect: Prototype.emptyFunction,\r
+ endeffect: Prototype.emptyFunction,\r
+ onStart: function(draggalbe) {\r
+ Element.show(selector);\r
+ },\r
+ onDrag: function(draggable, event) {\r
+ var element = draggable.element;\r
+ var top = parseInt(Element.getStyle(element, 'top'), 10);\r
+ var rowIndex = Math.floor(top / cHeight);\r
+ var left = parseInt(Element.getStyle(element, 'left'), 10);\r
+ var cellIndex = Math.floor(left / cWidth);\r
+\r
+ if ((cellIndex >= 0 && rowIndex >= 0) &&\r
+ (cellIndex <= cellMax && rowIndex <= rowMax)) {\r
+ Element.setStyle(selector, {\r
+ left: cWidth * cellIndex + adjustSize * cellIndex + 'px',\r
+ top: cHeight * rowIndex + 'px'\r
+ });\r
+ }\r
+ },\r
+ onEnd: function(draggable) {\r
+ Element.hide(selector);\r
+ self.changeSchedule(draggable);\r
+ }\r
+ }\r
+ );\r
+ },\r
+\r
+ // set resize event\r
+ setResize: function(item) {\r
+ var self = this;\r
+ new CalendarResizeableEx(item, {\r
+ left: 0,\r
+ top: 0,\r
+ bottom: 0,\r
+ distance: this.column.width,\r
+ restriction: true,\r
+ resize: function(element) {\r
+ self.updateTirm(element);\r
+ }\r
+ });\r
+ },\r
+\r
+ /********************************** public method **********************************/\r
+ getDate: function(element) {\r
+ if (!element) return;\r
+ var date = this.calendar.date;\r
+ if (element.constructor == String)\r
+ return new Date(date.getFullYear(), date.getMonth(), element);\r
+ else\r
+ return new Date(date.getFullYear(), date.getMonth(), element.id.getSuffix());\r
+ },\r
+\r
+ abstractSelect: function(event, method) {\r
+ var element = null;\r
+ if (this.calendar.options.size == 'large') {\r
+ element = this.findClickedElement(event);\r
+ } else {\r
+ element = Event.element(event);\r
+ if (element.tagName != 'TD') {\r
+ element = Element.getParentByTagName(['TD'], element);\r
+ }\r
+ }\r
+ if (element && element.id) {\r
+ var date = this.getDate(element);\r
+ method(date, element);\r
+ }\r
+ },\r
+\r
+ getSelectedTerm: function() {\r
+ var self = this;\r
+ var elements = this.calendar.getSelected();\r
+ if (elements && elements.length > 0) {\r
+ return [elements.first(), elements.last()].map(function(e) {\r
+ return self.getDate(e);\r
+ });\r
+ }\r
+ return null;\r
+ },\r
+\r
+ /********************************** private method **********************************/\r
+ selectDay: function(event) {\r
+ var calendar = this.calendar;\r
+ var th = Event.element(event);\r
+ if (th.tagName != 'TH')\r
+ th = Element.getParentByTagName('TH', th);\r
+\r
+ this.iterateTable({doCell: function(cell) {\r
+ if ((cell.cellIndex == th.cellIndex) && cell.id)\r
+ calendar.addSelectedClass(cell);\r
+ }});\r
+ },\r
+\r
+ inspectArgument: function(object, time) {\r
+ var self = this;\r
+ var dates = this.calendar.getSelected();\r
+ var result = [];\r
+\r
+ self.calendar.recurrence(object, function(o) {\r
+ if (!o.date) {\r
+ dates.each(function(d) {\r
+ var param = {};\r
+ if (!o.date) {\r
+ param = {date: self.getDate(d)};\r
+ if (time) {\r
+ param.start = {hour: 0, min: 0};\r
+ param.finish = {hour: 0, min: 0};\r
+ }\r
+ }\r
+ Object.extend(param, o);\r
+ result.push(param);\r
+ });\r
+ } else if (o.date.constructor == Object) {\r
+ o.date = new Date(o.date.year, o.date.month, o.date.day);\r
+ result.push(o);\r
+ } else {\r
+ result.push(o);\r
+ }\r
+ });\r
+ return result;\r
+ },\r
+\r
+ inspectDateArgument: function(date) {\r
+ if (date) {\r
+ map = [];\r
+ this.calendar.recurrence(date, function(d) {\r
+ if (d.constructor == Object) \r
+ map.push(new Date(d.year, d.month, d.day));\r
+ else \r
+ map.push(d);\r
+ });\r
+ return map;\r
+ } else {\r
+ var calendar = this;\r
+ var dates = this.calendar.getSelected();\r
+ if (dates.length == 0) return null;\r
+\r
+ return dates.collect(function(d) {\r
+ return calendar.getDate(d);\r
+ });\r
+ }\r
+ },\r
+\r
+ findClickedElement: function(event) {\r
+ var container = $(this.getScheduleContainerId());\r
+ var position = Position.cumulativeOffset(container);\r
+ var scrollTop = Position.realOffset(container).last();\r
+ scrollTop -= document.documentElement.scrollTop || document.body.scrollTop;\r
+ var x = Event.pointerX(event) - position[0];\r
+ var y = Event.pointerY(event) - position[1] + scrollTop;\r
+ var rowIndex = Math.floor(y / this.column.height);\r
+ var cellIndex = Math.floor(x / this.column.width);\r
+ return $(this.calendarTable.rows[rowIndex].cells[cellIndex]);\r
+ },\r
+\r
+ multipleSelection: function(event) {\r
+ if (!this.calendar.selectedBase || !this.calendar.mouseDown) return;\r
+ var self = this;\r
+ var calendar = this.calendar;\r
+ var selected = this.calendar.selectedBase;\r
+\r
+ this.abstractSelect(event, function(date, element) {\r
+ var selectedElement = $(selected.id);\r
+\r
+ var range = calendar.createRange(\r
+ parseInt(selectedElement.id.getSuffix()),\r
+ parseInt(element.id.getSuffix())\r
+ );\r
+\r
+ self.iterateTable({doCell: function(cell) {\r
+ if (cell.tagName != 'TD' || !cell.id) throw $continue;\r
+ var id = parseInt(cell.id.getSuffix());\r
+ \r
+ if (range.include(id)) {\r
+ calendar.addSelectedClass(cell);\r
+ } else {\r
+ calendar.removeSelectedClass(cell);\r
+ }\r
+ }});\r
+ });\r
+ },\r
+\r
+ iterateTable: function() {\r
+ var options = Object.extend({\r
+ doTable: null,\r
+ doRow: null,\r
+ doCell: null\r
+ }, arguments[0]);\r
+ \r
+ var calendar = $(this.getCalendarTableId());\r
+ if (options.doTable) {\r
+ options.doTable(calendar)\r
+ };\r
+\r
+ $A(calendar.rows).each(function(row) {\r
+ if (options.doRow) {\r
+ options.doRow(row);\r
+ }\r
+ $A(row.cells).each(function(cell) {\r
+ if (options.doCell) {\r
+ options.doCell(cell);\r
+ }\r
+ });\r
+ });\r
+ },\r
+\r
+ findRow: function(rowIndex) {\r
+ var table = $(this.getCalendarTableId());\r
+ return $A(table.rows).detect(function(row) {\r
+ return row.rowIndex == rowIndex;\r
+ });\r
+ },\r
+\r
+ findCell: function(rowIndex, cellIndex) {\r
+ return $A(this.findRow(rowIndex).cells).detect(function(cell) {\r
+ return cell.cellIndex == cellIndex;\r
+ });\r
+ },\r
+\r
+ getCalendarTableId: function() {\r
+ return this.calendar.element.id.appendSuffix(CalendarMonth.id.calTable);\r
+ },\r
+\r
+ getDateId: function(date) {\r
+ var day = null;\r
+ if (date.constructor == Date) {\r
+ day = date.getDate();\r
+ } else {\r
+ day = date;\r
+ }\r
+ return this.calendar.element.id.appendSuffix(day);\r
+ },\r
+\r
+ getCell: function(day) {\r
+ return $(this.getDateId(day));\r
+ },\r
+\r
+ getCellPosition: function(day) {\r
+ var cell = this.getCell(day);\r
+ if (cell) {\r
+ var row = Element.getParentByTagName(['tr'], cell);\r
+ return {cellIndex: cell.cellIndex, rowIndex: row.rowIndex};\r
+ }\r
+ },\r
+\r
+ changeSchedule: function(draggable) {\r
+ var element = draggable.element;\r
+ var schedule = element.schedule;\r
+\r
+ var top = parseInt(Element.getStyle(element, 'top'), 10);\r
+ var rowIndex = Math.floor(top / this.column.height);\r
+ var left = parseInt(Element.getStyle(element, 'left'), 10);\r
+ var cellIndex = Math.floor(left / this.column.width);\r
+ var table = $(this.getCalendarTableId());\r
+ var rowMax = table.rows.length - 1;\r
+ var cellMax = this.calendar.options.displayIndexes.length - 1;\r
+\r
+ if ((cellIndex >= 0 && rowIndex >= 0) &&\r
+ (cellIndex <= cellMax && rowIndex <= rowMax)) {\r
+ var cell = this.findCell(rowIndex, cellIndex);\r
+ var date = cell.date;\r
+ var diff = this.getDayDiff(schedule);\r
+\r
+ var finish = date.advance({days: diff});\r
+ if (\r
+ schedule.start.month == date.getMonth() &&\r
+ schedule.start.day == date.getDate() &&\r
+ schedule.finish.month == finish.getMonth() &&\r
+ schedule.finish.day == finish.getDate()\r
+ ) {this.calendar.refreshSchedule(); return;}\r
+\r
+ schedule.start.month = date.getMonth();\r
+ schedule.start.day = date.getDate();\r
+ schedule.finish.month = finish.getMonth();\r
+ schedule.finish.day = finish.getDate();\r
+\r
+ this.calendar.refreshSchedule();\r
+ this.calendar.options.changeSchedule(schedule);\r
+ } else {\r
+ this.calendar.refreshSchedule();\r
+ }\r
+ },\r
+\r
+ updateTirm: function(element) {\r
+ var schedule = element.schedule;\r
+ var width = parseInt(Element.getStyle(element, 'width'));\r
+ var top = parseInt(Element.getStyle(element, 'top'));\r
+ var left = parseInt(Element.getStyle(element, 'left'));\r
+ var cellIndex = Math.round((left + width) / this.column.width) - 1;\r
+ var rowIndex = Math.round(top / this.column.height);\r
+ var cell = this.findCell(rowIndex, cellIndex);\r
+\r
+ var oldFinish = schedule.finish;\r
+ var newFinish = cell.date.toHash();\r
+ newFinish.hour = oldFinish.hour;\r
+ newFinish.min = oldFinish.min;\r
+\r
+ if (DateUtil.toDate(schedule.start).getTime() >= DateUtil.toDate(newFinish).getTime()) {\r
+ var maxHour = 23;\r
+ var maxMin = 55;\r
+ if (schedule.start.hour == maxHour && schedule.start.min == maxMin) {\r
+ this.calendar.refreshSchedule();\r
+ this.calendar.options.updateTirm();\r
+ return;\r
+ } else {\r
+ newFinish.hour = maxHour;\r
+ newFinish.min = maxMin;\r
+ }\r
+ }\r
+ schedule.finish = newFinish;\r
+\r
+ this.calendar.refreshSchedule();\r
+ this.calendar.options.updateTirm(schedule);\r
+ },\r
+\r
+ getTimeText: function(start, finish) {\r
+ var calendar = this.calendar;\r
+ return calendar.formatTime(start);\r
+ },\r
+\r
+ getDayDiff: function(schedule) {\r
+ return DateUtil.numberOfDays(this.toDate(schedule.start), this.toDate(schedule.finish));\r
+ }\r
+});\r
+\r
+\r
+/**\r
+ * CalendarWeek Class\r
+ */\r
+var CalendarWeek= Class.create();\r
+CalendarWeek.id = {\r
+ columnContainer: 'columnContainer',\r
+ columnHeader: 'columnHeader',\r
+ column: 'column',\r
+ next: 'next',\r
+ pre: 'pre'\r
+}\r
+Object.extend(CalendarWeek.prototype, AbstractCalendar.prototype);\r
+Object.extend(CalendarWeek.prototype, {\r
+\r
+ initialize: function(calendar) {\r
+ this.calendar = calendar;\r
+ this.week = this.getWeek();\r
+ this.setDisplayTime();\r
+ },\r
+\r
+ /*** Week ***/\r
+ /********************************** build functions **********************************/\r
+ buildHeaderLeft: function() {\r
+ var container = Builder.node('TD');\r
+ this.calendar.classNames.addClassNames(container, 'preYears');\r
+\r
+ var id = this.calendar.element.id.appendSuffix(CalendarWeek.id.pre);\r
+ var node = Builder.node('DIV', {id: id});\r
+ this.calendar.classNames.addClassNames(node, 'preWeekMark');\r
+ Event.observe(node, "click", this.calendar.changeCalendar.bindAsEventListener(this.calendar));\r
+ container.appendChild(node);\r
+\r
+ return container;\r
+ },\r
+\r
+ buildHeaderCenter: function() {\r
+ var contents = [];\r
+ var texts = [];\r
+ if (this.calendar.options.weekHeaderFormat) {\r
+ texts = [this.formatHeaderDate(this.week.first()), '-', this.formatHeaderDate(this.week.last())];\r
+ }(this.week[0], this.week.last()) || [];\r
+\r
+ var node = Builder.node('SPAN', [texts[0] || this.week[0].toDateString()]);\r
+ this.calendar.classNames.addClassNames(node, 'ym');\r
+ contents.push(node);\r
+\r
+ node = Builder.node('SPAN', [texts[1] || '-']);\r
+ this.calendar.classNames.addClassNames(node, 'ym');\r
+ contents.push(node);\r
+\r
+ node = Builder.node('SPAN', [texts.last() || this.week.last().toDateString()]);\r
+ this.calendar.classNames.addClassNames(node, 'ym');\r
+ contents.push(node);\r
+\r
+ var container = Builder.node('TD', contents);\r
+ this.calendar.classNames.addClassNames(container, 'years');\r
+\r
+ return container;\r
+ },\r
+\r
+ formatHeaderDate: function(date) {\r
+ if (this.calendar.options.weekHeaderFormat) {\r
+ return new Template(this.calendar.options.weekHeaderFormat).\r
+ evaluate({year: date.getFullYear(), month: date.getMonth() + 1, day: date.getDate()});\r
+ }\r
+ return '';\r
+ },\r
+\r
+ buildHeaderRight: function() {\r
+ var container = Builder.node('TD', {align: 'right'});\r
+ this.calendar.classNames.addClassNames(container, 'nextYears');\r
+\r
+ var id = this.calendar.element.id.appendSuffix(CalendarWeek.id.next);\r
+ var node = Builder.node('DIV', {id: id});\r
+ this.calendar.classNames.addClassNames(node, 'nextWeekMark');\r
+ Event.observe(node, "click", this.calendar.changeCalendar.bindAsEventListener(this.calendar));\r
+ container.appendChild(node);\r
+\r
+ return container;\r
+ },\r
+\r
+ buildCalendar: function() {\r
+ var table = Builder.node('TABLE', {id: CalendarWeek.id.columnContainer});\r
+ var tbody = Builder.node('TBODY');\r
+\r
+ this.calendar.classNames.addClassNames(table, 'weekTable');\r
+ table.appendChild(tbody);\r
+ var tr = Builder.node('TR');\r
+ tbody.appendChild(tr);\r
+\r
+ if (this.calendar.options.displayTimeLine) {\r
+ tr.appendChild(this.buildTimeLine());\r
+ }\r
+ tr.appendChild(this.buildCalendarContainer());\r
+\r
+ return table;\r
+ },\r
+\r
+ buildTimeLine: function() {\r
+ var time = new Date();\r
+ var hour = 0, hoursOfDay = 24;\r
+ time.setHours(hour);\r
+ time.setMinutes(0);\r
+ var nodes = [];\r
+\r
+ var node = Builder.node('DIV');\r
+ this.calendar.classNames.addClassNames(node, 'timeLineTimeTop');\r
+ nodes.push(node);\r
+ while (hour < hoursOfDay) {\r
+ if (this.includeDisplayTime(hour)) {\r
+ node = Builder.node('DIV', [this.formatTime(time)]);\r
+ this.calendar.classNames.addClassNames(node, 'timeLineTime');\r
+ nodes.push(node);\r
+ }\r
+ hour++;\r
+ time.setHours(hour);\r
+ }\r
+\r
+ var td = Builder.node('TD', nodes);\r
+ this.calendar.classNames.addClassNames(td, 'timeLine');\r
+ return td;\r
+ },\r
+ \r
+ buildCalendarContainer: function() {\r
+ var table = Builder.node('TABLE');\r
+ var tbody = Builder.node('TBODY');\r
+ table.appendChild(tbody);\r
+ this.calendar.classNames.addClassNames(table, 'weekMainTable');\r
+\r
+ tbody.appendChild(this.buildCalendarHeader());\r
+ tbody.appendChild(this.buildCalendarMain());\r
+ \r
+ return Builder.node('TD', [table]);\r
+ },\r
+\r
+ buildCalendarHeader: function() {\r
+ var indexes = this.calendar.options.displayIndexes;\r
+ var ths = [];\r
+ var self = this;\r
+ var today = new Date().days();\r
+ var width = 100 / indexes.length + '%';\r
+ var clickDateText = this.calendar.options.clickDateText;\r
+ var subHeaderTempl = (this.calendar.options.weekSubHeaderFormat) ? new Template(this.calendar.options.weekSubHeaderFormat) : null;\r
+\r
+ this.week.each(function(w, index) {\r
+ var text = null;\r
+ if (subHeaderTempl) {\r
+ text = subHeaderTempl.evaluate({month: w.getMonth() + 1, day: w.getDate(), wday: self.calendar.options.dayOfWeek[w.getDay()]});\r
+ } else {\r
+ text = w.toDateString().split(' ');\r
+ text.pop();\r
+ text = text.join(' ');\r
+ }\r
+ var link = Builder.node('A', {href: '#'}, [text]);\r
+ if (w.days() == today) self.calendar.addHighlightClass(link);\r
+ var node = Builder.node('DIV', [link]);\r
+ self.calendar.classNames.addClassNames(node, 'headerColumn');\r
+\r
+ if (clickDateText) {\r
+ Event.observe(node, 'mousedown', clickDateText.bindAsEventListener(self, w));\r
+ } else {\r
+ Event.observe(node, 'mousedown', self.clickDateText.bindAsEventListener(self, w));\r
+ }\r
+\r
+ var id = self.calendar.element.id.appendSuffix(CalendarWeek.id.column);\r
+ var th = Builder.node('TH', {id: id.appendSuffix(index)}, [node]);\r
+ th.width = width;\r
+ ths.push(th);\r
+ });\r
+\r
+ var table = Builder.node('TABLE');\r
+ var tbody = Builder.node('TBODY');\r
+ table.appendChild(tbody);\r
+ tbody.appendChild(Builder.node('TR', ths));\r
+ this.calendar.classNames.addClassNames(table, 'weekMainTable');\r
+ return Builder.node('TR', [Builder.node('TD', [table])]);\r
+ },\r
+\r
+ buildCalendarMain: function() {\r
+ var indexes = this.calendar.options.displayIndexes;\r
+ var self = this;\r
+ var tds = [];\r
+ var width = 100.0 / indexes.length + '%';\r
+\r
+ this.week.each(function(w, index) {\r
+ var schedules = self.calendar.options.schedules[w.toDateString()];\r
+ var nodes = [];\r
+ var i = 0, j = 0;\r
+\r
+ while (i < 24) {\r
+ if (self.includeDisplayTime(i)) {\r
+ var node = Builder.node('DIV', {id: self.getDateId(w, i)});\r
+ var hour = i / 1;\r
+ var min = i % 1 * 60;\r
+ node.date = new Date(w.getFullYear(), w.getMonth(), w.getDate(), hour, min, 0);\r
+\r
+ if (nodes.length == 0) {\r
+ self.calendar.classNames.addClassNames(node, 'columnTopDate');\r
+ } else if (i % 1 == 0) {\r
+ self.calendar.classNames.addClassNames(node, 'columnDate');\r
+ } else {\r
+ self.calendar.classNames.addClassNames(node, 'columnDateOdd');\r
+ }\r
+ self.setColumnEvent(node);\r
+ nodes.push(node);\r
+ }\r
+ i += 0.5;\r
+ }\r
+\r
+ var td = Builder.node('TD', nodes);\r
+ td.width = width;\r
+ tds.push(td);\r
+ });\r
+\r
+ this.calendarTable = Builder.node('TABLE', {style: 'position: relative'});\r
+ var tbody = Builder.node('TBODY');\r
+ this.calendarTable.appendChild(tbody);\r
+ tbody.appendChild(Builder.node('TR', tds));\r
+ this.calendar.classNames.addClassNames(this.calendarTable, 'weekMainTable');\r
+ var container = this.buildScheduleContainer();\r
+ container.appendChild(this.calendarTable);\r
+ this.setScheduleContainerEvent(container);\r
+ this.calendar.classNames.addClassNames(container, 'scheduleContainer');\r
+ return Builder.node('TR', [Builder.node('TD', [container])]);\r
+ },\r
+\r
+ setColumnEvent: function(node) {\r
+ // do nothing\r
+ },\r
+\r
+ beforeBuild: function() {\r
+ this.column = {};\r
+ var rule = CssUtil.getCssRuleBySelectorText('.' + Calendar.className.columnDate);\r
+ this.column.height = parseInt(rule.style['height'], 10) + 1;\r
+ },\r
+\r
+ /**********************************\r
+ ***** for make schedule item *****\r
+ **********************************/\r
+ buildSchedule: function(schedule) {\r
+ var id = 'scheduleItem_' + schedule.id;\r
+ var canEdit = (schedule.edit == undefined || schedule.edit);\r
+ var item = Builder.node('DIV', {id: id});\r
+ this.calendar.classNames.addClassNames(item, 'scheduleItemLarge');\r
+\r
+ if (canEdit) {\r
+ var deleteImg = Builder.node('DIV',\r
+ {\r
+ id: 'scheduleDeleteImg_' + schedule.id,\r
+ className: this.calendar.classNames.joinClassNames('deleteImg')\r
+ });\r
+ Element.hide(deleteImg);\r
+ item.appendChild(deleteImg);\r
+ \r
+ // set event on a image.\r
+ Event.observe(deleteImg, 'click', this.clickDeleteImage.bind(this, schedule));\r
+ Event.observe(item, 'mouseover', this.showDeleteImage.bind(this, deleteImg));\r
+ Event.observe(item, 'mouseout', this.hideDeleteImage.bind(this, deleteImg));\r
+ }\r
+\r
+ // set dblclick event on a schedule item.\r
+ if (this.calendar.options.dblclickSchedule) {\r
+ Event.observe(\r
+ item, 'dblclick', this.calendar.options.dblclickSchedule.bind(this, schedule));\r
+ }\r
+\r
+ // drag handler\r
+ var handler = null;\r
+ if (canEdit) {\r
+ handler = Builder.node('DIV', {className: this.calendar.classNames.joinClassNames('scheduleHandler')});\r
+ item.appendChild(handler);\r
+ }\r
+\r
+ var icon = null;\r
+ if (schedule.icon) {\r
+ icon = Builder.node('IMG', {src: schedule.icon, alt: 'icon', style: 'float: left;'});\r
+ item.appendChild(icon);\r
+ }\r
+\r
+ // private mark\r
+ if (!schedule.publicity) {\r
+ icon = Builder.node('DIV', {id: 'private_img_' + schedule.id});\r
+ this.calendar.classNames.addClassNames(icon, 'privateImg');\r
+ item.appendChild(icon);\r
+ }\r
+\r
+ var text = this.getTimeText(schedule.start, schedule.finish);\r
+ text = Builder.node('DIV', {id: id + '_text'}, [text]);\r
+ this.calendar.classNames.addClassNames(text, 'scheduleTimeArea');\r
+\r
+ item.appendChild(text);\r
+ var description = schedule.description.unescapeHTML();\r
+ item.appendChild(Builder.node('DIV', {id: id + '_description'}, [description]));\r
+ item.title = description;\r
+ item.schedule = schedule;\r
+\r
+ return [item, handler];\r
+ },\r
+\r
+ adjustScheduleStyle: function(item, index, holder) {\r
+ var schedule = item.schedule;\r
+ var time = this.convertHours(schedule);\r
+ var start = time[0];\r
+ var finish = time[1];\r
+ var same = [];\r
+ var self = this;\r
+\r
+ holder.each(function(h) {\r
+ var hTime = self.convertHours(h.schedule);\r
+ var hStart = hTime[0];\r
+ var hFinish = hTime[1];\r
+\r
+ if (\r
+ ((hStart <= start) && (hFinish > start)) || ((hStart < finish) && (hFinish >= finish)) ||\r
+ ((start <= hStart) && (finish > hStart)) || ((start < hFinish) && (finish >= hFinish))\r
+ ) {\r
+ same.push(h);\r
+ }\r
+ });\r
+\r
+ var adjustSize = index * this.getAdjustSize();\r
+ var left = this.column.width * index + adjustSize;\r
+ if (same.length == 0) {\r
+ Element.setStyle(item, {left: left + 'px'});\r
+ } else {\r
+ same.push(item);\r
+ var width = parseInt(Element.getStyle(item, 'width'), 10) / (same.length) - 2;\r
+ same.each(function(s, i) {\r
+ var adjustLeft = left + width * i + (2 * i);\r
+// if (i != 0) adjustLeft += 2;\r
+ Element.setStyle(s, {\r
+ width: width + 'px',\r
+ left: adjustLeft + 'px'\r
+ });\r
+ });\r
+ }\r
+ return left;\r
+ },\r
+\r
+ setScheduleBaseStyle: function(item) {\r
+ var schedule = item.schedule;\r
+ if (!this.calendar.isSameDate(schedule.start, schedule.finish)) {\r
+ schedule.finish.hour = 24;\r
+ schedule.finish.min = 0;\r
+ }\r
+\r
+ var time = this.convertHours(schedule);\r
+ var startTime = time.first();\r
+ var finishTime = time.last();\r
+ var oneHour = this.column.height * 2;\r
+ var diff = this.calendar.getTimeDiff(schedule.start, schedule.finish);\r
+ var rate = (diff.hour + (diff.min / 60)) || 1;\r
+\r
+ var over = 0;\r
+ var top = 0;\r
+ var height = 0;\r
+\r
+ var includeStart = this.includeDisplayTime(startTime);\r
+ var includeFinish = this.includeDisplayTime(finishTime);\r
+ if (!includeStart && !includeFinish) {\r
+ if ((this.startTime <= startTime && this.startTime <= finishTime) ||\r
+ (startTime < this.finishTime && finishTime < this.finishTime)) {\r
+ top = height = 0;\r
+ Element.hide(item);\r
+ } else {\r
+ top = 0;\r
+ height = oneHour * (this.finishTime - this.startTime) - 3;\r
+ }\r
+ } else {\r
+ if (includeStart) {\r
+ top = oneHour * (startTime - this.startTime);\r
+ height = oneHour * rate - 3;\r
+ } else {\r
+ top = 0;\r
+ over = this.startTime - startTime;\r
+ height = oneHour * (rate - over);\r
+ }\r
+\r
+ if (includeFinish) {\r
+ } else {\r
+ over = finishTime - this.finishTime;\r
+ height -= oneHour * over;\r
+ }\r
+ }\r
+\r
+ try {\r
+ Element.setStyle(item, {\r
+ top: top + 'px',\r
+ width: this.column.width + 'px',\r
+ height: height + 'px'\r
+ });\r
+ } catch (e) {}\r
+ },\r
+\r
+ afterBuild: function() {\r
+ this.setContainerInfo();\r
+ this.setColumnWidth();\r
+ this.setCover();\r
+ var self = this;\r
+ var container = $(this.getScheduleContainerId());\r
+ var distance = this.getDragDistance();\r
+ this.scheduleNodes = [];\r
+ var holders = this.week.map(function() {return []});\r
+ var weekSize = this.week.legth - 1;\r
+\r
+ this.calendar.options.schedules.each(function(schedule) {\r
+ var items = [];\r
+ var sub, subItem = null;\r
+ self.week.each(function(date, index) {\r
+ if (self.calendar.betweenDate(schedule, date)) {\r
+ if (self.isSameStartDate(schedule, date) && self.isSameFinishDate(schedule, date)) {\r
+ items.push(self.setSchedule(schedule, index, holders, container, distance));\r
+ } else {\r
+ sub = self.copyOneDaySchedule(schedule, date);\r
+ subItem = self.setSchedule(sub, index, holders, container, distance);\r
+ subItem.originalSchedule = schedule;\r
+ items.push(subItem);\r
+ }\r
+ } else if (sub) {\r
+ throw $break;\r
+ }\r
+ });\r
+\r
+ items.each(function(item) {\r
+ Event.observe(item, 'mouseover', self.mouseOverSubSchedule.bind(this, items));\r
+ Event.observe(item, 'mouseout', self.mouseOutSubSchedule.bind(this, items));\r
+ });\r
+ });\r
+ },\r
+\r
+ copyOneDaySchedule: function(schedule, date) {\r
+ var sub = null;\r
+ if (this.isSameStartDate(schedule, date)) {\r
+ sub = this.copySchedule(schedule, date);\r
+ sub.finish.hour = 24;\r
+ sub.finish.min = 0;\r
+ } else if (this.isSameFinishDate(schedule, date)) {\r
+ sub = this.copySchedule(schedule, date);\r
+ sub.start.hour = 0;\r
+ sub.start.min = 0;\r
+ } else {\r
+ sub = this.copySchedule(schedule, date);\r
+ sub.start.hour = 0;\r
+ sub.start.min = 0;\r
+ sub.finish.hour = 24;\r
+ sub.finish.min = 0;\r
+ }\r
+ return sub;\r
+ },\r
+\r
+ copySchedule: function(schedule, date) {\r
+ sub = Object.extend({}, schedule);\r
+ sub.start = {\r
+ year: date.getFullYear(),\r
+ month: date.getMonth(),\r
+ day: date.getDate(),\r
+ hour: schedule.start.hour,\r
+ min: schedule.start.min\r
+ }\r
+ sub.finish = {\r
+ year: date.getFullYear(),\r
+ month: date.getMonth(),\r
+ day: date.getDate(),\r
+ hour: schedule.finish.hour,\r
+ min: schedule.finish.min\r
+ }\r
+ return sub;\r
+ },\r
+\r
+ setSchedule: function(schedule, index, holders, container, distance) {\r
+ // create a schedule node.\r
+ var result = this.buildSchedule(schedule);\r
+ var item = result.first();\r
+ container.appendChild(item);\r
+\r
+ // set style(position and size) of a schedule item.\r
+ this.setScheduleBaseStyle(item);\r
+ var left = this.adjustScheduleStyle(item, index, holders[index]);\r
+ var adjustSize = index * this.getAdjustSize();\r
+ var snapLeft = this.column.width + adjustSize + 'px';\r
+\r
+ if (schedule.edit == undefined || schedule.edit) {\r
+ this.setDraggable(item, result.last(), container, distance);\r
+ this.setResize(item);\r
+ }\r
+\r
+ holders[index].push(item);\r
+ this.scheduleNodes.push(item);\r
+ return item;\r
+ },\r
+\r
+ getDragDistance: function() {\r
+ var adjustSize = this.getAdjustSize();\r
+ return [this.column.width + adjustSize, this.column.height / 2];\r
+ },\r
+\r
+ // set draggalbe event\r
+ setDraggable: function(item, handle, container, distance) {\r
+ var self = this;\r
+ new Draggable(item, \r
+ {\r
+ handle: handle,\r
+ scroll: window,\r
+ starteffect: Prototype.emptyFunction,\r
+ endeffect: Prototype.emptyFunction,\r
+ snap: function(x, y) {\r
+ var eDimensions = Element.getDimensions(item);\r
+ var pDimensions = Element.getDimensions(container);\r
+ var xy = [x, y].map(function(v, i) { return Math.floor(v/distance[i]) * distance[i] });\r
+ xy = [\r
+ self._constrain(xy[0], 0, pDimensions.width - eDimensions.width),\r
+ self._constrain(xy[1], 0, pDimensions.height - eDimensions.height)\r
+ ];\r
+ return xy;\r
+ },\r
+ onEnd: function(draggable, event) {\r
+ self.changeSchedule(draggable, event);\r
+ },\r
+ change: function(draggable) {\r
+ self.changeTimeDisplay(draggable.element);\r
+ }\r
+ }\r
+ );\r
+ },\r
+\r
+ // set resize event\r
+ setResize: function(item) {\r
+ new CalendarResizeableEx(item, {\r
+ left: 0,\r
+ right: 0,\r
+ distance: this.column.height / 2,\r
+ restriction: true,\r
+ resize: function(element) {\r
+ this.updateTirm(element);\r
+ }.bind(this),\r
+ change: function(element) {\r
+ this.changeTimeDisplay(element);\r
+ }.bind(this)\r
+ });\r
+ },\r
+\r
+ /********************************** public method **********************************/\r
+ getDate: function(element) {\r
+ return element.date;\r
+ },\r
+\r
+ abstractSelect: function(event, method) {\r
+ var element = this.findClickedElement(event);\r
+ if (element) {\r
+ if (Element.hasClassName(element, Calendar.className.columnDate) ||\r
+ Element.hasClassName(element, Calendar.className.columnDateOdd) ||\r
+ Element.hasClassName(element, Calendar.className.columnTopDate)) {\r
+\r
+ var date = this.getDate(element);\r
+ method(date, element);\r
+ }\r
+ }\r
+ }, \r
+\r
+ getSelectedTerm: function() {\r
+ var self = this;\r
+ var elements = this.calendar.getSelected();\r
+ if (elements && elements.length > 0) {\r
+ var last = elements.last();\r
+ if (last) {\r
+ last = last.date;\r
+ } else {\r
+ last = elements.first().date;\r
+ }\r
+ last = new Date(last.getFullYear(), last.getMonth(),\r
+ last.getDate(), last.getHours(), last.getMinutes(), 0);\r
+ last.setMinutes(last.getMinutes() + 30);\r
+ \r
+ return [elements.first().date, last];\r
+ }\r
+ },\r
+\r
+ /*** Week ***/\r
+ /********************************** private method **********************************/\r
+ setWidth: function(node) {\r
+ Element.setStyle(node, {width: this.column.width + 'px'});\r
+ },\r
+\r
+ inspectArgument: function(object, time) {\r
+ if (object.date) return object;\r
+\r
+ var self = this;\r
+ var dates = this.calendar.getSelected();\r
+ var result = [];\r
+ this.calendar.recurrence(object, function(o) {\r
+ var param = {};\r
+ if (!o.date) {\r
+ param = {date: self.getDate(dates[0])};\r
+ if (!o.start)\r
+ param.start = dates[0].time;\r
+ if (!o.finish)\r
+ param.finish = dates[dates.length - 1].time;\r
+ }\r
+ Object.extend(param, o);\r
+ result.push(param);\r
+ });\r
+\r
+ return result;\r
+ },\r
+\r
+ inspectDateArgument: function(date) {\r
+ if (date) return date;\r
+\r
+ var calendar = this;\r
+ var dates = this.getSelected();\r
+ if (dates.length == 0) return null;\r
+\r
+ return dates.collect(function(d) {\r
+ return calendar.getDate(d);\r
+ });\r
+ },\r
+\r
+ addColumnClass: function(element) {\r
+ if (document.all)\r
+ this.calendar.classNames.addClassNames(element, 'columnWin');\r
+ else\r
+ this.calendar.classNames.addClassNames(element, 'column');\r
+ },\r
+\r
+ getHeaderId: function() {\r
+ return this.calendar.element.id.appendSuffix(CalendarWeek.id.columnHeader);\r
+ },\r
+\r
+ getColumnId: function(i) {\r
+ return this.calendar.element.id.appendSuffix(CalendarWeek.id.column + '_' + i);\r
+ },\r
+\r
+ changeSchedule: function(draggable, event) {\r
+ var element = draggable.element;\r
+ var schedule = element.schedule;\r
+ var time = this.getTimeByElement(element);\r
+ this.calendar.cacheSchedule(schedule);\r
+\r
+ var container = $(this.getScheduleContainerId());\r
+ var dimensions = Element.getDimensions(container);\r
+ var offset = Position.cumulativeOffset(container);\r
+ var scroll = Position.realOffset(container);\r
+ var scrollLeft = scroll[0] - (document.documentElement.scrollLeft || document.body.scrollLeft || 0);\r
+ var scrollTop = scroll[1] - (document.documentElement.scrollTop || document.body.scrollTop || 0);\r
+\r
+ var x = Event.pointerX(event) + scrollLeft;\r
+ var y = Event.pointerY(event) + scrollTop;\r
+\r
+ if (\r
+ offset[0] > x ||\r
+ (offset[0] + dimensions.width) < x ||\r
+ offset[1] > y ||\r
+ (offset[1] + dimensions.height) < y\r
+ ) {this.calendar.refreshSchedule(); return};\r
+\r
+ var left = parseInt(Element.getStyle(element, 'left'));\r
+ var weekIndex = Math.round(left / this.column.width);\r
+ var date = this.week[weekIndex];\r
+\r
+ if (\r
+ schedule.start.year == date.getFullYear() &&\r
+ schedule.start.month == date.getMonth() &&\r
+ schedule.start.day == date.getDate() &&\r
+ schedule.start.hour == time[0].hour &&\r
+ schedule.start.min == time[0].min &&\r
+ schedule.finish.year == date.getFullYear() &&\r
+ schedule.finish.month == date.getMonth() &&\r
+ schedule.finish.day == date.getDate() &&\r
+ schedule.finish.hour == time[1].hour &&\r
+ schedule.finish.min == time[1].min\r
+ ) {this.calendar.refreshSchedule(); return};\r
+\r
+ if (element.originalSchedule) schedule = element.originalSchedule; \r
+ var newStart = {\r
+ year: date.getFullYear(),\r
+ month: date.getMonth(),\r
+ day: date.getDate(),\r
+ hour: time[0].hour,\r
+ min: time[0].min\r
+ }\r
+ var diff = DateUtil.toDate(newStart).getTime() - DateUtil.toDate(schedule.start).getTime();\r
+ schedule.start = newStart;\r
+ schedule.finish = new Date(DateUtil.toDate(schedule.finish).getTime() + diff).toHash();\r
+\r
+ this.calendar.refreshSchedule();\r
+ this.calendar.options.changeSchedule(schedule);\r
+ },\r
+\r
+ updateTirm: function(element) {\r
+ var schedule = element.schedule;\r
+ var time = this.getTimeByElement(element);\r
+ this.calendar.cacheSchedule(schedule);\r
+\r
+ var left = parseInt(Element.getStyle(element, 'left'));\r
+ var weekIndex = Math.round(left / this.column.width);\r
+ var date = this.week[weekIndex];\r
+\r
+ var isChange = this.isChengeSchedule(element, time);\r
+ if (element.originalSchedule) schedule = element.originalSchedule;\r
+\r
+ if (isChange.start) {\r
+ schedule.start.year = date.getFullYear();\r
+ schedule.start.month = date.getMonth();\r
+ schedule.start.day = date.getDate();\r
+ schedule.start.hour = time[0].hour;\r
+ schedule.start.min = time[0].min;\r
+ } else if (isChange.finish) {\r
+ schedule.finish.year = date.getFullYear();\r
+ schedule.finish.month = date.getMonth();\r
+ schedule.finish.day = date.getDate();\r
+ schedule.finish.hour = time[1].hour;\r
+ schedule.finish.min = time[1].min;\r
+ } else {\r
+ return;\r
+ }\r
+\r
+ this.calendar.refreshSchedule();\r
+ this.calendar.options.updateTirm(schedule);\r
+ },\r
+\r
+ changeTimeDisplay: function(element) {\r
+ var schedule = element.schedule;\r
+ var time = this.getTimeByElement(element);\r
+\r
+ var textNode = Element.getElementsByClassName(element, Calendar.className.scheduleTimeArea)[0];\r
+ var text = this.getTimeText(time[0], time[1]);\r
+ textNode.innerHTML = text;\r
+ },\r
+ \r
+ findClickedElement: function(event) {\r
+ var container = $(this.getScheduleContainerId());\r
+ var position = Position.cumulativeOffset(container);\r
+ var scrollTop = Position.realOffset(container).last();\r
+ scrollTop -= document.documentElement.scrollTop || document.body.scrollTop;\r
+ var x = Event.pointerX(event) - position[0];\r
+ var y = Event.pointerY(event) - position[1] + scrollTop;\r
+\r
+ var cellIndex = Math.floor(y / this.column.height);\r
+ var rowIndex = Math.floor(x / this.column.width);\r
+ return $(this.calendarTable.rows[0].cells[rowIndex]).down(cellIndex);\r
+ },\r
+\r
+ multipleSelection: function(event) {\r
+ if (!this.calendar.selectedBase || !this.calendar.mouseDown) return;\r
+ var self = this;\r
+ var calendar = this.calendar;\r
+ var selected = this.calendar.selectedBase;\r
+\r
+ this.abstractSelect(event, function(date, element) {\r
+ var selectedElement = $(selected.id);\r
+ if (selectedElement.date.getDate() != element.date.getDate()) return;\r
+\r
+ var nodes = $A(selectedElement.parentNode.childNodes);\r
+ var ids = [parseInt(selected.id.getSuffix()), parseInt(element.id.getSuffix())];\r
+ ids.sort(function(a, b) {return a - b;});\r
+\r
+ nodes.each(function(n) {\r
+ if (!n.id) throw $continue;\r
+ var id = parseInt(n.id.getSuffix());\r
+ if ((id < ids[0]) || (ids[1] < id)) {\r
+ calendar.removeSelectedClass(n);\r
+ } else if (!Element.hasClassName(n, Calendar.className.selected)) {\r
+ calendar.addSelectedClass(n);\r
+ }\r
+ });\r
+ });\r
+ },\r
+\r
+ getTimeByElement: function(element) {\r
+ var schedule = element.schedule;\r
+ var top = parseInt(Element.getStyle(element, 'top'), 10);\r
+ var height = parseInt(Element.getStyle(element, 'height'), 10);\r
+ var oneHour = this.column.height * 2;\r
+ var distance = 0.25;\r
+\r
+ var startTime = top / oneHour + this.startTime;\r
+ startTime = Math.round(startTime / distance) * distance;\r
+\r
+ var finishTime = height / oneHour + startTime;\r
+ finishTime = Math.round(finishTime / distance) * distance;\r
+\r
+ var start = {};\r
+ start.hour = Math.floor(startTime);\r
+ start.min = (startTime - start.hour) * 60;\r
+\r
+ var finish = {};\r
+ finish.hour = Math.floor(finishTime);\r
+ finish.min = (finishTime - finish.hour) * 60;\r
+\r
+ if (finish.min == 60) {\r
+ finish.hour += 1;\r
+ finish.min = 0;\r
+ }\r
+\r
+ return [start, finish];\r
+ },\r
+\r
+ getDateId: function(date, i) {\r
+ var id = this.calendar.element.id.appendSuffix(date.getDate());\r
+ return id.appendSuffix(i * 10);\r
+ },\r
+\r
+ dateIdToTime: function(id) {\r
+ id = id.getSuffix() / 10;\r
+ var hour = Math.floor(id);\r
+ return {hour: hour, min: (id - hour) * 60};\r
+ },\r
+\r
+ formatTime: function(date) {\r
+ var time = date.toTimeString();\r
+ time = time.split(' ');\r
+ time = time[0].split(':');\r
+ time.pop();\r
+ return time.join(':');\r
+ },\r
+\r
+ /**\r
+ * hours are 0, 0.5, 1, ..., 23.5, 24\r
+ */\r
+ includeDisplayTime: function(hours) {\r
+ return (this.startTime <= hours) && (hours < this.finishTime);\r
+ },\r
+\r
+ /**\r
+ * exsample\r
+ *\r
+ * {hour: 1, min: 30} => 1.5\r
+ */\r
+ convertHours: function(schedule) {\r
+ return [\r
+ schedule.start.hour + schedule.start.min / 60,\r
+ schedule.finish.hour + schedule.finish.min / 60\r
+ ];\r
+ },\r
+\r
+ setDisplayTime: function() {\r
+ this.startTime = this.calendar.options.displayTime.first().hour;\r
+ var finishTime = this.calendar.options.displayTime.last();\r
+ this.finishTime = Math.ceil(finishTime.hour + finishTime.min / 60);\r
+ },\r
+\r
+ getTimeText: function(start, finish) {\r
+ var calendar = this.calendar;\r
+ return calendar.formatTime(start) + ' - ' + calendar.formatTime(finish);\r
+ },\r
+\r
+ isChengeSchedule: function(scheduleElement, newTime) {\r
+ var schedule = scheduleElement.schedule;\r
+ var changeStart = ((schedule.start.hour != newTime[0].hour) || (schedule.start.min != newTime[0].min));\r
+ var changeFinish = ((schedule.finish.hour != newTime[1].hour) || (schedule.finish.min != newTime[1].min));\r
+\r
+ if (scheduleElement.originalSchedule) {\r
+ if (changeStart && changeFinish) {\r
+ var currentDateStart = DateUtil.toDate(schedule.start).getTime();\r
+ var OriginalDateStart = DateUtil.toDate(scheduleElement.originalSchedule.start).getTime();\r
+ if (currentDateStart == OriginalDateStart) {\r
+ changeFinish = false;\r
+ } else {\r
+ changeStart = false;\r
+ }\r
+ }\r
+ }\r
+ return {start: changeStart, finish: changeFinish};\r
+ }\r
+});\r
+\r
+\r
+/**\r
+ * CalendarDay Class\r
+ */\r
+var CalendarDay = Class.create();\r
+CalendarDay.id = {\r
+ header: 'dayHeader' \r
+}\r
+Object.extend(CalendarDay.prototype, CalendarWeek.prototype);\r
+Object.extend(CalendarDay.prototype, {\r
+\r
+ initialize: function(calendar) {\r
+ var day = calendar.date.getDay();\r
+ this.calendar = calendar;\r
+ this.setDisplayTime();\r
+\r
+ this.calendar.options.displayIndexesOld = this.calendar.options.displayIndexes;\r
+ this.calendar.options.displayIndexes = [day];\r
+ this.calendar.options.weekIndexOld = this.calendar.options.weekIndex;\r
+ this.calendar.options.weekIndex = day;\r
+ this.week = this.getWeek();\r
+ },\r
+\r
+ destroy: function() {\r
+ this.calendar.options.displayIndexes = this.calendar.options.displayIndexesOld;\r
+ this.calendar.options.weekIndex = this.calendar.options.weekIndexOld;\r
+ delete this.calendar.options.displayIndexesOld;\r
+ delete this.calendar.options.weekIndexOld;\r
+ },\r
+\r
+ /*** Day ***/\r
+ /********************************** build functions **********************************/\r
+ buildHeaderCenter: function() {\r
+ var headerText = this.calendar.date.toDateString();\r
+ if (this.calendar.options.dayHeaderFormat) {\r
+ var date = this.calendar.date;\r
+ headerText = new Template(this.calendar.options.dayHeaderFormat).evaluate(\r
+ {year: date.getFullYear(), month: date.getMonth() + 1, day: date.getDate()});\r
+ }\r
+ var container = Builder.node('TD');\r
+ this.calendar.classNames.addClassNames(container, 'years');\r
+\r
+ var id = this.calendar.element.id.appendSuffix(CalendarDay.id.header);\r
+ var node = Builder.node('SPAN', {id: id}, [headerText]);\r
+ this.calendar.classNames.addClassNames(node, 'ym');\r
+ container.appendChild(node);\r
+\r
+ return container;\r
+ },\r
+\r
+ /*** Day ***/\r
+ /********************************** private method **********************************/\r
+ changeCalendar: function(event) {\r
+ var element = Event.element(event);\r
+ var oldDate = new Date(this.calendar.date.toDateString());\r
+\r
+ if (Element.hasClassName(element, Calendar.className.preWeekMark)) {\r
+ this.calendar.date.setDate(this.calendar.date.getDate() - 1);\r
+ } else if (Element.hasClassName(element, Calendar.className.nextWeekMark)) {\r
+ this.calendar.date.setDate(this.calendar.date.getDate() + 1);\r
+ }\r
+\r
+ this.calendar.options.changeCalendar(this.calendar.date, oldDate);\r
+ this.calendar.refresh();\r
+ }\r
+});\r
+\r
+\r
+//\r
+// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+var CalendarResizeableEx = Class.create();\r
+Object.extend(CalendarResizeableEx.prototype, Resizeable.prototype);\r
+Object.extend(CalendarResizeableEx.prototype, {\r
+ initialize: function(element) {\r
+ var options = Object.extend({\r
+ top: 6,\r
+ bottom: 6,\r
+ left: 6,\r
+ right: 6,\r
+ minHeight: 0,\r
+ minWidth: 0,\r
+ zindex: 1000,\r
+ resize: null,\r
+ distance: 1, // add by spinelz\r
+ change: Prototype.emptyFunction,\r
+ restriction: true\r
+ }, arguments[1] || {});\r
+\r
+ this.element = $(element);\r
+ this.handle = this.element;\r
+\r
+ Element.makePositioned(this.element); // fix IE \r
+\r
+ this.options = options;\r
+\r
+ this.active = false;\r
+ this.resizing = false; \r
+ this.currentDirection = '';\r
+\r
+ this.eventMouseDown = this.startResize.bindAsEventListener(this);\r
+ this.eventMouseUp = this.endResize.bindAsEventListener(this);\r
+ this.eventMouseMove = this.update.bindAsEventListener(this);\r
+ this.eventCursorCheck = this.cursor.bindAsEventListener(this);\r
+ this.eventKeypress = this.keyPress.bindAsEventListener(this);\r
+ \r
+ this.registerEvents();\r
+ },\r
+\r
+ startResize: function(event) {\r
+ Event.stop(event);\r
+ if(Event.isLeftClick(event)) {\r
+ \r
+ // abort on form elements, fixes a Firefox issue\r
+ var src = Event.element(event);\r
+ if(src.tagName && (\r
+ src.tagName=='INPUT' ||\r
+ src.tagName=='SELECT' ||\r
+ src.tagName=='BUTTON' ||\r
+ src.tagName=='TEXTAREA')) return;\r
+\r
+ var dir = this.directions(event);\r
+ if (dir.length > 0) { \r
+ this.active = true;\r
+// var offsets = Position.cumulativeOffset(this.element);\r
+ this.startTop = parseInt(Element.getStyle(this.element, 'top'), 10);\r
+ this.startLeft = parseInt(Element.getStyle(this.element, 'left'), 10);\r
+ this.startWidth = parseInt(Element.getStyle(this.element, 'width'), 10);\r
+ this.startHeight = parseInt(Element.getStyle(this.element, 'height'), 10);\r
+ this.startX = event.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;\r
+ this.startY = event.clientY + document.body.scrollTop + document.documentElement.scrollTop;\r
+ \r
+ this.currentDirection = dir;\r
+\r
+ if (this.options.restriction) {\r
+ var container = this.element.parentNode;\r
+ this.restDimensions = Element.getDimensions(container);\r
+ this.restOffset = Position.cumulativeOffset(container);\r
+ }\r
+ }\r
+ }\r
+ },\r
+\r
+ draw: function(event) {\r
+ Event.stop(event);\r
+ var pointer = [Event.pointerX(event), Event.pointerY(event)];\r
+ var style = this.element.style;\r
+\r
+ if (this.currentDirection.indexOf('n') != -1) {\r
+ if (this.restOffset[1] >= pointer[1]) return;\r
+ var pointerMoved = this.startY - pointer[1];\r
+// var margin = Element.getStyle(this.element, 'margin-top') || "0";\r
+ var newHeight = this.map(this.startHeight + pointerMoved);\r
+ if (newHeight > this.options.minHeight) {\r
+ style.height = newHeight + "px";\r
+ style.top = this.map(this.startTop - pointerMoved) + "px";\r
+ }\r
+ }\r
+ if (this.currentDirection.indexOf('w') != -1) {\r
+ var pointerMoved = this.map(this.startX - pointer[0]);\r
+ var margin = Element.getStyle(this.element, 'margin-left') || "0";\r
+ var newWidth = this.startWidth + pointerMoved;\r
+ if (newWidth > this.options.minWidth) {\r
+ style.left = (this.startLeft - pointerMoved - parseInt(margin)) + "px";\r
+ style.width = newWidth + "px";\r
+ }\r
+ }\r
+ if (this.currentDirection.indexOf('s') != -1) {\r
+ var bottom = this.restDimensions.height + this.restOffset[1];\r
+ var pointerMoved = pointer[1] - this.startY;\r
+ if (bottom <= pointer[1]) return;\r
+ var newHeight = this.map(this.startHeight + pointer[1] - this.startY);\r
+ if (newHeight > this.options.minHeight) {\r
+ style.height = newHeight + "px";\r
+// style.top = this.startTop + "px";\r
+ }\r
+ }\r
+ if (this.currentDirection.indexOf('e') != -1) {\r
+ var newWidth = this.map(this.startWidth + pointer[0] - this.startX);\r
+ if (newWidth > this.options.minWidth) {\r
+ style.width = newWidth + "px";\r
+ }\r
+ }\r
+ if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering\r
+ this.options.change(this.element);\r
+ },\r
+\r
+ directions: function(event) {\r
+ var pointer = [Event.pointerX(event), Event.pointerY(event)];\r
+ var offsets = Position.cumulativeOffset(this.element);\r
+ var bodyScrollTop = document.documentElement.scrollTop || document.body.scrollTop;\r
+ var scroll = Position.realOffset(this.element)[1] - bodyScrollTop;\r
+\r
+ var cursor = '';\r
+ if (this.between(pointer[1] - offsets[1] + scroll, 0, this.options.top)) cursor += 'n';\r
+ if (this.between((offsets[1] + this.element.offsetHeight) - pointer[1] - scroll, 0, this.options.bottom)) cursor += 's';\r
+ if (this.between(pointer[0] - offsets[0], 0, this.options.left)) cursor += 'w';\r
+ if (this.between((offsets[0] + this.element.offsetWidth) - pointer[0], 0, this.options.right)) cursor += 'e';\r
+\r
+ return cursor;\r
+ },\r
+\r
+ map: function(length) {\r
+ return Math.round(length / this.options.distance) * this.options.distance;\r
+ }\r
+});\r
-// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-var DatePicker = Class.create();
-DatePicker.className = {
- container: 'datepicker',
- header: 'datepicker_header',
- footer: 'datepicker_footer',
- preYears: 'datepicker_preYears',
- nextYears: 'datepicker_nextYears',
- years: 'datepicker_years',
- calendar: 'datepicker_calendar',
- date: 'datepicker_date',
- holiday: 'datepicker_holiday',
- ym: 'datepicker_ym',
- table: 'datepicker_table',
- tableTh: 'datepicker_tableTh',
- nextMonthMark: 'datepicker_nextMonthMark',
- nextYearMark: 'datepicker_nextYearMark',
- preMonthMark: 'datepicker_preMonthMark',
- preYearMark: 'datepicker_preYearMark',
- zIndex: null
-}
-DatePicker.prototype = {
-
- initialize: function(element, target, trigger) {
- this.element = $(element);
- Element.setStyle(this.element, {visibility: 'hidden'});
- this.target = $(target);
- this.date = new Date();
-
- this.options = Object.extend({
- month: this.date.getMonth() + 1,
- date: this.date.getDate(),
- year: this.date.getFullYear(),
- format: DateUtil.toLocaleDateString,
- cssPrefix: 'custom_',
- callBack: Prototype.emptyFunction,
- standTo: false,
- beforeShow: Prototype.emptyFunction,
- headerFormat: null,
- dayOfWeek: DateUtil.dayOfWeek
- }, arguments[3] || {});
-
- var customCss = CssUtil.appendPrefix(this.options.cssPrefix, DatePicker.className);
- this.classNames = new CssUtil([DatePicker.className, customCss]);
-
- this.format = this.options.format;
- this.callBack = this.options.callBack;
-
- this.date.setMonth(this.options.month - 1);
- this.date.setDate(this.options.date);
- this.date.setFullYear(this.options.year);
-
- this.calendar = this.build();
- this.element.appendChild(this.calendar);
- this.cover = new IECover(this.element);
-
- this.doclistener = this.hide.bindAsEventListener(this);
- Event.observe($(trigger), "click", this.show.bindAsEventListener(this));
- this.hide();
- Element.setStyle(this.element, {visibility: 'visible'});
- },
-
- build: function() {
- var node =
- Builder.node(
- 'DIV',
- {className: this.classNames.joinClassNames('container')},
- [
- this.buildHeader(),
- this.buildCalendar(),
- this.buildFooter()
- ]);
-
- return node;
- },
-
- buildHeader: function() {
- var headerNodes = Builder.node('TR');
- headerNodes.appendChild(this.buildHeaderLeft());
- headerNodes.appendChild(this.buildHeaderCenter());
- headerNodes.appendChild(this.buildHeaderRight());
-
- className = this.classNames.joinClassNames('header');
- var tbody = Builder.node('TBODY', [headerNodes]);
- return Builder.node('TABLE', {className: className}, [tbody]);
- },
-
- buildFooter: function() {
- var footer = Builder.node('DIV');
- this.classNames.addClassNames(footer, 'footer');
- return footer;
- },
-
- buildHeaderLeft: function() {
- var container = Builder.node('TD');
- this.classNames.addClassNames(container, 'preYears');
-
- var id = this.element.id.appendSuffix('preYear');
- var node = Builder.node('DIV', {id: id});
- this.classNames.addClassNames(node, 'preYearMark');
- Event.observe(node, "click", this.changeCalendar.bindAsEventListener(this));
- container.appendChild(node);
-
- id = this.element.id.appendSuffix('preMonth');
- node = Builder.node('DIV', {id: id});
- this.classNames.addClassNames(node, 'preMonthMark');
- Event.observe(node, "click", this.changeCalendar.bindAsEventListener(this));
- container.appendChild(node);
-
- return container;
- },
-
- buildHeaderCenter: function() {
- var contents = [];
- var yearMonth = this.getHeaderYearMonth();
-
- var id = this.element.id.appendSuffix('nextMonth');
- var node = Builder.node('SPAN', {id: id}, [yearMonth[0]]);
- this.classNames.addClassNames(node, 'ym');
- contents.push(node);
-
- id = this.element.id.appendSuffix('nextYear');
- node = Builder.node('SPAN', {id: id}, [yearMonth[1]]);
- this.classNames.addClassNames(node, 'ym');
- contents.push(node);
-
- var container = Builder.node('TD', contents);
- this.classNames.addClassNames(container, 'years');
-
- return container;
- },
-
- getHeaderYearMonth: function() {
- if (this.options.headerFormat) {
- var tmpl = new Template(this.options.headerFormat);
- return [tmpl.evaluate({year: this.date.getFullYear(), month: this.date.getMonth() + 1}), ' '];
- }
- return [DateUtil.months[this.date.getMonth()], this.date.getFullYear()];
- },
-
- buildHeaderRight: function() {
- var container = Builder.node('TD');
- this.classNames.addClassNames(container, 'nextYears');
-
- var id = this.element.id.appendSuffix('nextMonth');
- var node = Builder.node('DIV', {id: id});
- this.classNames.addClassNames(node, 'nextMonthMark');
- Event.observe(node, "click", this.changeCalendar.bindAsEventListener(this));
- container.appendChild(node);
-
- id = this.element.id.appendSuffix('nextYear');
- node = Builder.node('DIV', {id: id});
- this.classNames.addClassNames(node, 'nextYearMark');
- Event.observe(node, "click", this.changeCalendar.bindAsEventListener(this));
- container.appendChild(node);
-
- return container;
- },
-
- multiBuild: function(tagType, params, className, hover, clickEvent) {
- var children = [];
- for (var i = 0; i < params.length; i++) {
- var node;
-
- node = Builder.node(tagType, [params[i]]);
- if (className)
- this.classNames.addClassNames(node, className);
-
- if (hover)
- new Hover(node);
-
- if (clickEvent)
- Event.observe(node, "click", clickEvent.bindAsEventListener(this));
-
- children.push(node);
- }
-
- return children;
- },
-
- buildCalendar: function() {
- var className = this.classNames.joinClassNames('table');
- var node = Builder.node('TBODY', [this.buildTableHeader(), this.buildTableData()]);
- var table = Builder.node('TABLE', {className: className}, [node]);
-
- className = this.classNames.joinClassNames('calendar');
- return Builder.node('DIV', {className: className}, [table]);
- },
-
- buildTableHeader: function() {
- var weekArray = new Array();
- var className = this.classNames.joinClassNames('tableTh');
- for (var i = 0; i < DateUtil.dayOfWeek.length; i++) {
- weekArray.push(
- Builder.node('TH', {className: className}, [this.options.dayOfWeek[i]]));
- }
-
- return Builder.node('TR', weekArray);
- },
-
- buildTableData: function() {
- var length = DateUtil.dayOfWeek.length * 6;
- var year = this.date.getFullYear();
- var month = this.date.getMonth();
- var firstDay = DateUtil.getFirstDate(year, month).getDay();
- var lastDate = DateUtil.getLastDate(year, month).getDate();
- var trs = new Array();
- var tds = new Array();
-
- for (var i = 0, day = 1; i <= length; i++) {
- if ((i < firstDay) || day > lastDate) {
- tds.push(Builder.node('TD'));
-
- } else {
- var className;
- if ((i % 7 == 0) || ((i+1) % 7 == 0))
- className = 'holiday';
- else
- className = 'date';
-
- var defaultClass = this.classNames.joinClassNames(className);
- node = Builder.node('TD', {className: defaultClass}, [day]);
- new Hover(node);
- Event.observe(node, "click", this.selectDate.bindAsEventListener(this));
- tds.push(node);
- day++;
- }
-
- if ((i + 1) % 7 == 0) {
- trs.push(Builder.node('TR', tds));
- tds = new Array();
- }
- }
-
- return trs;
- },
-
- refresh: function() {
- this.element.innerHTML = '';
- this.calendar = this.build();
- this.element.appendChild(this.calendar);
- new IECover(this.element);
- },
-
- getMonth: function() {
- return DateUtil.months[this.date.getMonth()];
- },
-
- changeCalendar: function(event) {
- var element = Event.element(event);
- if (Element.hasClassName(element, DatePicker.className.preYearMark)) {
- this.date.setFullYear(this.date.getFullYear() - 1);
- } else if (Element.hasClassName(element, DatePicker.className.nextYearMark)) {
- this.date.setFullYear(this.date.getFullYear() + 1);
- } else if (Element.hasClassName(element, DatePicker.className.preMonthMark)) {
- var pre = this.date.getMonth() - 1;
- if (pre < 0) {
- pre = 11;
- this.date.setFullYear(this.date.getFullYear() - 1);
- }
- this.date.setMonth(pre);
- } else if (Element.hasClassName(element, DatePicker.className.nextMonthMark)) {
- var next = this.date.getMonth() + 1;
- if (next > 11) {
- next = 0;
- this.date.setFullYear(this.date.getFullYear() + 1);
- }
- this.date.setMonth(next);
- }
-
- this.refresh();
- if (event) Event.stop(event);
- },
-
- selectDate: function(event) {
- var src = Event.element(event);
- var text = Element.getTextNodes(src)[0];
-
- this.date.setDate(text.nodeValue);
- var value = this.formatDateString();
-
- if (this.target.value || this.target.value == '') {
- this.target.value = value;
- } else {
- this.target.innerHTML = value;
- }
-
- this.hide();
- this.classNames.refreshClassNames(src, 'date');
-
- this.callBack(this);
- },
-
- show: function(event) {
- var styles = $H({zIndex: ZindexManager.getIndex(this.options.zIndex)});
- if (this.options.standTo) {
- this.defaultParent = this.element.parentNode;
- document.body.appendChild(this.element);
- styles = styles.merge({
- position: 'absolute',
- left: Event.pointerX(event) + 'px',
- top: Event.pointerY(event) + 'px'
- });
- }
-
- Element.setStyle(this.element, styles);
- Element.show(this.element);
- this.cover.resetSize();
- Event.observe(document, "click", this.doclistener);
- if (event) {
- Event.stop(event);
- }
- },
-
- hide: function() {
- Event.stopObserving(document, "click", this.doclistener);
- Element.hide(this.element);
- if (this.defaultParent) {
- this.defaultParent.appendChild(this.element);
- }
- },
-
- addTrigger: function(trigger) {
- Event.observe($(trigger), 'click', this.show.bindAsEventListener(this));
- },
-
- changeTarget: function(target) {
- this.target = $(target);
- },
-
- formatDateString: function() {
- var string = '';
- if (this.format.constructor == Function) {
- string = this.format(this.date);
- } else if (this.format.constructor == String) {
- string = this.date.strftime(this.format);
- }
- return string;
- }
-}
+// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+var DatePicker = Class.create();\r
+DatePicker.className = {\r
+ container: 'datepicker',\r
+ header: 'datepicker_header',\r
+ footer: 'datepicker_footer',\r
+ preYears: 'datepicker_preYears',\r
+ nextYears: 'datepicker_nextYears',\r
+ years: 'datepicker_years',\r
+ calendar: 'datepicker_calendar',\r
+ date: 'datepicker_date',\r
+ holiday: 'datepicker_holiday',\r
+ ym: 'datepicker_ym',\r
+ table: 'datepicker_table',\r
+ tableTh: 'datepicker_tableTh',\r
+ nextMonthMark: 'datepicker_nextMonthMark',\r
+ nextYearMark: 'datepicker_nextYearMark',\r
+ preMonthMark: 'datepicker_preMonthMark',\r
+ preYearMark: 'datepicker_preYearMark',\r
+ zIndex: null\r
+}\r
+DatePicker.prototype = {\r
+ \r
+ initialize: function(element, target, trigger) {\r
+ this.element = $(element);\r
+ Element.setStyle(this.element, {visibility: 'hidden'});\r
+ this.target = $(target);\r
+ this.date = new Date();\r
+\r
+ this.options = Object.extend({\r
+ month: this.date.getMonth() + 1,\r
+ date: this.date.getDate(),\r
+ year: this.date.getFullYear(),\r
+ format: DateUtil.toLocaleDateString,\r
+ cssPrefix: 'custom_',\r
+ callBack: Prototype.emptyFunction,\r
+ standTo: false,\r
+ beforeShow: Prototype.emptyFunction,\r
+ headerFormat: null,\r
+ dayOfWeek: DateUtil.dayOfWeek\r
+ }, arguments[3] || {});\r
+ \r
+ var customCss = CssUtil.appendPrefix(this.options.cssPrefix, DatePicker.className);\r
+ this.classNames = new CssUtil([DatePicker.className, customCss]);\r
+ \r
+ this.format = this.options.format;\r
+ this.callBack = this.options.callBack;\r
+ \r
+ this.date.setMonth(this.options.month - 1);\r
+ this.date.setDate(this.options.date);\r
+ this.date.setFullYear(this.options.year);\r
+ \r
+ this.calendar = this.build();\r
+ this.element.appendChild(this.calendar);\r
+ this.cover = new IECover(this.element);\r
+ \r
+ this.doclistener = this.hide.bindAsEventListener(this);\r
+ Event.observe($(trigger), "click", this.show.bindAsEventListener(this));\r
+ this.hide();\r
+ Element.setStyle(this.element, {visibility: 'visible'});\r
+ },\r
+ \r
+ build: function() {\r
+ var node = \r
+ Builder.node(\r
+ 'DIV', \r
+ {className: this.classNames.joinClassNames('container')},\r
+ [\r
+ this.buildHeader(),\r
+ this.buildCalendar(),\r
+ this.buildFooter()\r
+ ]);\r
+ \r
+ return node;\r
+ },\r
+ \r
+ buildHeader: function() {\r
+ var headerNodes = Builder.node('TR');\r
+ headerNodes.appendChild(this.buildHeaderLeft());\r
+ headerNodes.appendChild(this.buildHeaderCenter());\r
+ headerNodes.appendChild(this.buildHeaderRight());\r
+ \r
+ className = this.classNames.joinClassNames('header');\r
+ var tbody = Builder.node('TBODY', [headerNodes]);\r
+ return Builder.node('TABLE', {className: className}, [tbody]);\r
+ },\r
+\r
+ buildFooter: function() {\r
+ var footer = Builder.node('DIV');\r
+ this.classNames.addClassNames(footer, 'footer');\r
+ return footer;\r
+ },\r
+\r
+ buildHeaderLeft: function() {\r
+ var container = Builder.node('TD');\r
+ this.classNames.addClassNames(container, 'preYears');\r
+\r
+ var id = this.element.id.appendSuffix('preYear');\r
+ var node = Builder.node('DIV', {id: id});\r
+ this.classNames.addClassNames(node, 'preYearMark');\r
+ Event.observe(node, "click", this.changeCalendar.bindAsEventListener(this));\r
+ container.appendChild(node);\r
+\r
+ id = this.element.id.appendSuffix('preMonth');\r
+ node = Builder.node('DIV', {id: id});\r
+ this.classNames.addClassNames(node, 'preMonthMark');\r
+ Event.observe(node, "click", this.changeCalendar.bindAsEventListener(this));\r
+ container.appendChild(node);\r
+\r
+ return container;\r
+ },\r
+\r
+ buildHeaderCenter: function() {\r
+ var contents = [];\r
+ var yearMonth = this.getHeaderYearMonth();\r
+\r
+ var id = this.element.id.appendSuffix('nextMonth');\r
+ var node = Builder.node('SPAN', {id: id}, [yearMonth[0]]);\r
+ this.classNames.addClassNames(node, 'ym');\r
+ contents.push(node);\r
+\r
+ id = this.element.id.appendSuffix('nextYear');\r
+ node = Builder.node('SPAN', {id: id}, [yearMonth[1]]);\r
+ this.classNames.addClassNames(node, 'ym');\r
+ contents.push(node);\r
+\r
+ var container = Builder.node('TD', contents);\r
+ this.classNames.addClassNames(container, 'years');\r
+\r
+ return container;\r
+ },\r
+\r
+ getHeaderYearMonth: function() {\r
+ if (this.options.headerFormat) {\r
+ var tmpl = new Template(this.options.headerFormat);\r
+ return [tmpl.evaluate({year: this.date.getFullYear(), month: this.date.getMonth() + 1}), ' '];\r
+ }\r
+ return [DateUtil.months[this.date.getMonth()], this.date.getFullYear()];\r
+ },\r
+\r
+ buildHeaderRight: function() {\r
+ var container = Builder.node('TD');\r
+ this.classNames.addClassNames(container, 'nextYears');\r
+\r
+ var id = this.element.id.appendSuffix('nextMonth');\r
+ var node = Builder.node('DIV', {id: id});\r
+ this.classNames.addClassNames(node, 'nextMonthMark');\r
+ Event.observe(node, "click", this.changeCalendar.bindAsEventListener(this));\r
+ container.appendChild(node);\r
+\r
+ id = this.element.id.appendSuffix('nextYear');\r
+ node = Builder.node('DIV', {id: id});\r
+ this.classNames.addClassNames(node, 'nextYearMark');\r
+ Event.observe(node, "click", this.changeCalendar.bindAsEventListener(this));\r
+ container.appendChild(node);\r
+\r
+ return container;\r
+ },\r
+ \r
+ multiBuild: function(tagType, params, className, hover, clickEvent) {\r
+ var children = [];\r
+ for (var i = 0; i < params.length; i++) {\r
+ var node;\r
+ \r
+ node = Builder.node(tagType, [params[i]]);\r
+ if (className)\r
+ this.classNames.addClassNames(node, className);\r
+ \r
+ if (hover)\r
+ new Hover(node);\r
+ \r
+ if (clickEvent)\r
+ Event.observe(node, "click", clickEvent.bindAsEventListener(this));\r
+ \r
+ children.push(node);\r
+ }\r
+ \r
+ return children;\r
+ },\r
+ \r
+ buildCalendar: function() {\r
+ var className = this.classNames.joinClassNames('table');\r
+ var node = Builder.node('TBODY', [this.buildTableHeader(), this.buildTableData()]);\r
+ var table = Builder.node('TABLE', {className: className}, [node]);\r
+ \r
+ className = this.classNames.joinClassNames('calendar');\r
+ return Builder.node('DIV', {className: className}, [table]);\r
+ },\r
+ \r
+ buildTableHeader: function() {\r
+ var weekArray = new Array();\r
+ var className = this.classNames.joinClassNames('tableTh');\r
+ for (var i = 0; i < DateUtil.dayOfWeek.length; i++) {\r
+ weekArray.push(\r
+ Builder.node('TH', {className: className}, [this.options.dayOfWeek[i]]));\r
+ }\r
+ \r
+ return Builder.node('TR', weekArray);\r
+ },\r
+ \r
+ buildTableData: function() {\r
+ var length = DateUtil.dayOfWeek.length * 6;\r
+ var year = this.date.getFullYear();\r
+ var month = this.date.getMonth();\r
+ var firstDay = DateUtil.getFirstDate(year, month).getDay();\r
+ var lastDate = DateUtil.getLastDate(year, month).getDate();\r
+ var trs = new Array();\r
+ var tds = new Array();\r
+ \r
+ for (var i = 0, day = 1; i <= length; i++) {\r
+ if ((i < firstDay) || day > lastDate) {\r
+ tds.push(Builder.node('TD'));\r
+ \r
+ } else {\r
+ var className;\r
+ if ((i % 7 == 0) || ((i+1) % 7 == 0))\r
+ className = 'holiday';\r
+ else\r
+ className = 'date';\r
+ \r
+ var defaultClass = this.classNames.joinClassNames(className);\r
+ node = Builder.node('TD', {className: defaultClass}, [day]);\r
+ new Hover(node);\r
+ Event.observe(node, "click", this.selectDate.bindAsEventListener(this));\r
+ tds.push(node);\r
+ day++;\r
+ }\r
+ \r
+ if ((i + 1) % 7 == 0) {\r
+ trs.push(Builder.node('TR', tds));\r
+ tds = new Array();\r
+ }\r
+ }\r
+ \r
+ return trs;\r
+ },\r
+ \r
+ refresh: function() {\r
+ this.element.innerHTML = '';\r
+ this.calendar = this.build();\r
+ this.element.appendChild(this.calendar);\r
+ new IECover(this.element);\r
+ },\r
+ \r
+ getMonth: function() {\r
+ return DateUtil.months[this.date.getMonth()];\r
+ },\r
+ \r
+ changeCalendar: function(event) {\r
+ var element = Event.element(event);\r
+ if (Element.hasClassName(element, DatePicker.className.preYearMark)) {\r
+ this.date.setFullYear(this.date.getFullYear() - 1);\r
+ } else if (Element.hasClassName(element, DatePicker.className.nextYearMark)) {\r
+ this.date.setFullYear(this.date.getFullYear() + 1);\r
+ } else if (Element.hasClassName(element, DatePicker.className.preMonthMark)) {\r
+ var pre = this.date.getMonth() - 1;\r
+ if (pre < 0) {\r
+ pre = 11;\r
+ this.date.setFullYear(this.date.getFullYear() - 1);\r
+ }\r
+ this.date.setMonth(pre);\r
+ } else if (Element.hasClassName(element, DatePicker.className.nextMonthMark)) {\r
+ var next = this.date.getMonth() + 1;\r
+ if (next > 11) {\r
+ next = 0;\r
+ this.date.setFullYear(this.date.getFullYear() + 1);\r
+ }\r
+ this.date.setMonth(next);\r
+ }\r
+ \r
+ this.refresh();\r
+ if (event) Event.stop(event);\r
+ },\r
+ \r
+ selectDate: function(event) {\r
+ var src = Event.element(event);\r
+ var text = Element.getTextNodes(src)[0];\r
+\r
+ this.date.setDate(text.nodeValue);\r
+ var value = this.formatDateString();\r
+ \r
+ if (this.target.value || this.target.value == '') {\r
+ this.target.value = value;\r
+ } else {\r
+ this.target.innerHTML = value;\r
+ }\r
+ \r
+ this.hide();\r
+ this.classNames.refreshClassNames(src, 'date');\r
+ \r
+ this.callBack(this);\r
+ },\r
+ \r
+ show: function(event) {\r
+ var styles = $H({zIndex: ZindexManager.getIndex(this.options.zIndex)});\r
+ if (this.options.standTo) {\r
+ this.defaultParent = this.element.parentNode;\r
+ document.body.appendChild(this.element);\r
+ styles = styles.merge({ \r
+ position: 'absolute',\r
+ left: Event.pointerX(event) + 'px',\r
+ top: Event.pointerY(event) + 'px'\r
+ });\r
+ }\r
+\r
+ Element.setStyle(this.element, styles);\r
+ Element.show(this.element);\r
+ this.cover.resetSize();\r
+ Event.observe(document, "click", this.doclistener);\r
+ if (event) {\r
+ Event.stop(event);\r
+ }\r
+ },\r
+ \r
+ hide: function() {\r
+ Event.stopObserving(document, "click", this.doclistener);\r
+ Element.hide(this.element);\r
+ if (this.defaultParent) {\r
+ this.defaultParent.appendChild(this.element);\r
+ }\r
+ },\r
+ \r
+ addTrigger: function(trigger) {\r
+ Event.observe($(trigger), 'click', this.show.bindAsEventListener(this));\r
+ },\r
+ \r
+ changeTarget: function(target) {\r
+ this.target = $(target);\r
+ },\r
+\r
+ formatDateString: function() {\r
+ var string = '';\r
+ if (this.format.constructor == Function) {\r
+ string = this.format(this.date);\r
+ } else if (this.format.constructor == String) {\r
+ string = this.date.strftime(this.format);\r
+ }\r
+ return string;\r
+ }\r
+}\r
-// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Grid = Class.create();
-Grid.className = {
- container: 'grid_container',
-
- baseTable: 'grid_baseTable',
- baseRow: 'grid_baseRow',
- baseCell: 'grid_baseCell',
-
- headerTable: 'grid_headerTable',
- headerRow: 'grid_headerRow',
- headerCell: 'grid_headerCell',
- headerCellDrag: 'grid_headerCellDrag',
- headerCellSort: 'grid_headerCellVal',
-
- idTable: 'grid_idTable',
- idRow: 'grid_idRow',
- idCell: 'grid_idCell',
- idCellVal: 'grid_idCellVal',
-
- cellTable: 'grid_cellTable',
- cellTbody: 'grid_cellTbody',
- cellRow: 'grid_cellRow',
- cell: 'grid_cell',
- cellVal: 'grid_cellVal',
- cellSelected: 'grid_cellSelected',
- state: 'grid_state',
- stateEmpty: 'grid_stateEmpty',
- stateOpen: 'grid_stateOpen',
- stateClose: 'grid_stateClose',
-
- inplaceEditor: 'grid_inplaceEditor'
-}
-Grid.scrollTop = 0;
-Grid.scrollLeft = 0;
-Grid.options = {}
-Grid.options.baseTable = {
- border:1,
- frame : 'border',
- cellSpacing:0,
- cellPadding:0
-}
-Grid.options.headerTable = {
- border:1,
- frame : 'border',
- cellSpacing:0,
- cellPadding:0
-}
-Grid.options.idTable = {
- border:1,
- frame : 'border',
- cellSpacing:0,
- cellPadding:0
-}
-Grid.options.cellTable = {
- border:1,
- frame : 'border',
- cellSpacing:0,
- cellPadding:0
-}
-Grid.prototype = {
-
- initialize : function(element) {
-
- this.element = $(element);
- Element.setStyle(this.element, {visibility: 'hidden'});
- Element.hide(this.element);
-
- var options = Object.extend({
- cssPrefix: 'custum_',
- cellMinWidth: 10,
- cellMinHeight: 10,
- cellDefaultWidth: 72,
- cellDefaultHeight: 25,
- defaultRowLength: 10,
- baseWidth: 40,
- baseHeight: 25,
- baseTop: 0,
- baseLeft: 0,
- cellEditUrl: '',
- updateGridUrl: '',
- updateGridReceiver: '',
- hierarchy: false,
- hierarchyCol: false,
- hierarchyIndent: 20,
- sortOptions: {}
- }, arguments[1] || {});
-
- this.options = options;
- this.custumCss = CssUtil.appendPrefix(options.cssPrefix, Grid.className);
- this.cssUtil = new CssUtil([Grid.className, this.custumCss]);
- this.cssUtil.addClassNames(this.element, 'container');
- this.hierarchyCol = this.options.hierarchyCol ? $(this.options.hierarchyCol) : false;
- this.hierarchyColIndex = this.hierarchyCol ? this.hierarchyCol.cellIndex : 0;
- Element.makePositioned(this.element);
- Position.includeScrollOffsets = true;
- this.stateDivWidth = parseInt(CssUtil.getCssRuleBySelectorText('.' + Grid.className.state).style.width, 10);
-
- this.marginSize = this.options.marginSize ? this.options.marginSize : 4;
- this.stateIndent = 15;
-
- this.rowIdBase = this.element.id + '_row_';
- this.topLevelList = new Array();
- this.removeList = new Array();
- this.build();
- this.removeList.each(function(r) {
- r.parentNode.removeChild(r);
- });
- var sortOptions = {
- relate : this.idTable,
- handle:this.headerTable,
- callBack:this.finishSort.bind(this)
- };
- sortOptions = $H(sortOptions).merge(this.options.sortOptions);
- this.sortTable = new SortableTableGridEx(this.cellTable, sortOptions);
- Element.setStyle(this.element, {visibility: 'visible'});
- Element.show(this.element);
- },
-
- build: function() {
- Element.cleanWhitespace(this.element);
- this.cellTable = this.element.childNodes[0];
- Element.cleanWhitespace(this.cellTable);
-
- this.colLength = this.cellTable.tHead.rows[0].cells.length;
- this.rowLength = this.cellTable.tBodies[0].rows.length;
- if (this.rowLength == 0)this.rowLength = this.options.defaultRowLength;
- this.buildBaseTable();
- this.buildHeaderTable();
- this.buildIdTable();
- this.buildCellTable();
-
- Event.observe(this.element, 'scroll', this.fixTablePosition.bindAsEventListener(this));
- },
-
- buildBaseTable: function() {
-
- this.baseTable = Builder.node('table', Grid.options.baseTable);
- this.cssUtil.addClassNames(this.baseTable, 'baseTable');
- with (this.baseTable.style) {
- width = this.options.baseWidth + 'px';
- height = this.options.baseHeight + 'px';
- position = 'absolute';
- top = this.options.baseTop + 'px';
- left = this.options.baseLeft + 'px';
- }
-
- var row = this.baseTable.insertRow(0);
- var cell = row.insertCell(0);
-
- this.cssUtil.addClassNames(row, 'baseRow');
- this.cssUtil.addClassNames(cell, 'baseCell');
-
- this.element.appendChild(this.baseTable);
- },
-
- buildHeaderTable: function() {
- this.headerTable = Builder.node('table', Grid.options.headerTable);
- this.cssUtil.addClassNames(this.headerTable, 'headerTable');
-
- var thead = this.cellTable.tHead;
- var row = thead.rows[0];
- row.id = this.element.id + '_headerTable_row';
- var cells = row.cells;
- Element.cleanWhitespace(thead);
- Element.cleanWhitespace(row);
-
- this.cssUtil.addClassNames(row, 'headerRow');
- for (var i = 0; i < cells.length; i++) {
- var cell = cells[i];
- var value = cell.firstChild;
- var title = cell.innerHTML;
- this.buildHeaderCell(cell, title, i);
- this.removeList.push(value);
- }
- this.headerTable.appendChild(thead);
- with (this.headerTable.style) {
- width = this.options.cellDefaultWidth * this.colLength + 'px';
- height = this.baseTable.style.height;
- position= 'absolute';
- top = Element.getStyle(this.baseTable, 'top');
- left = parseInt(Element.getStyle(this.baseTable, 'left')) + parseInt(Element.getStyle(this.baseTable, 'width')) + 'px';
- }
- this.element.appendChild(this.headerTable);
- Sortable.create(
- row,
- {
- tag:'td',
- handle:Grid.className.headerCellDrag,
- constraint:true,
- overlap:'horizontal',
- scroll:this.element,
- onUpdate:this.updateCellLine.bind(this)
- });
- },
-
- buildHeaderCell : function(cell, title, index) {
-
- cell.id = this.element.id + '_header_col_' + index;
-
- var drag = Builder.node('div');
- var sort = Builder.node('div');
-
- this.cssUtil.addClassNames(cell, 'headerCell');
- this.cssUtil.addClassNames(drag, 'headerCellDrag');
- this.cssUtil.addClassNames(sort, 'headerCellSort');
-
- cell.style.width = this.options.cellDefaultWidth + 'px';
- var dragWidth = parseInt(Element.getStyle(cell, 'width')) - (this.marginSize * 2);
- var sortWidth = dragWidth - (this.marginSize * 2);
- var cellHeight = this.options.baseHeight - (Grid.options.headerTable.border * 4);
- with (drag.style) {
- width = dragWidth + 'px';
- height = cellHeight + 'px';
- marginLeft = this.marginSize + 'px';
- marginRight = this.marginSize + 'px';
- }
- with (sort.style) {
- width = sortWidth + 'px';
- height = cellHeight + 'px';
- marginLeft = this.marginSize + 'px';
- marginRight = this.marginSize + 'px';
- }
-
- sort.innerHTML = title;
- drag.appendChild(sort);
- cell.appendChild(drag);
-
- new ResizeableGridEx(cell, {minWidth: this.options.cellMinWidth, top:0,right:2, bottom:0, left:0 ,draw:this.updateCellWidth.bind(this)});
- Event.observe(cell, 'mousedown', this.setSelectedColumn.bindAsEventListener(this));
- Event.observe(drag, 'mousedown', this.setSelectedColumn.bindAsEventListener(this));
- Event.observe(sort, 'mousedown', this.setSelectedColumn.bindAsEventListener(this));
- },
-
- buildIdTable: function() {
-
- this.idTable = Builder.node('table', Grid.options.idTable);
- this.cssUtil.addClassNames(this.idTable, 'idTable');
- for (var i = 0; i < this.rowLength; i++) {
-
- var row = this.idTable.insertRow(i);
- this.buildIdRow(row, i);
- }
-
- with(this.idTable.style) {
- width = this.options.baseWidth + 'px';
- position = 'absolute';
- top = parseInt(Element.getStyle(this.baseTable, 'top')) + parseInt(Element.getStyle(this.baseTable, 'height')) + 'px';
- left = Element.getStyle(this.baseTable, 'left');
- }
-
- this.element.appendChild(this.idTable);
- var tbody = this.idTable.tBodies[0];
- tbody.id = this.element.id + '_idTable_tbody';
- Sortable.create(
- tbody,
- {
- tag:'tr',
- handle:Grid.className.idCellVal,
- scroll:this.element,
- constraint:true,
- overlap:'vertical',
- onUpdate:this.updateRowLine.bind(this)
- });
- },
-
- buildIdRow : function(row, index) {
- row.id = this.rowIdBase + '_id_' + index;
-
- var cell = row.insertCell(0);
- var valueDiv = Builder.node('div');
-
- this.cssUtil.addClassNames(row, 'idRow');
- this.cssUtil.addClassNames(cell, 'idCell');
- this.cssUtil.addClassNames(valueDiv, 'idCellVal');
-
- with (cell.style) {
- width = this.options.baseWidth + 'px';
- height = this.options.cellDefaultHeight + 'px';
- }
- with (valueDiv.style) {
- marginTop = this.marginSize + 'px';
- marginBottom = this.marginSize + 'px';
- width = this.options.baseWidth - (Grid.options.idTable.border * 4) + 'px';
- height = this.options.cellDefaultHeight - (this.marginSize * 2) + 'px';
- }
-
- valueDiv.innerHTML = index + 1;
- cell.appendChild(valueDiv);
-
- new ResizeableGridEx(cell, {minHeight: this.options.cellMinHeight, top:0, right: 0, bottom: 2, left: 0, draw:this.updateCellHeight.bind(this)});
-
- Event.observe(row, 'mousedown', this.setSelectedRow.bindAsEventListener(this));
- Event.observe(cell, 'mousedown', this.setSelectedRow.bindAsEventListener(this));
- Event.observe(valueDiv, 'mousedown', this.setSelectedRow.bindAsEventListener(this));
- },
-
- buildCellTable: function() {
- var tbody = this.cellTable.tBodies[0];
- Element.cleanWhitespace(tbody);
- with(this.cellTable){
- border = Grid.options.cellTable.border;
- cellSpacing = Grid.options.cellTable.cellSpacing;
- cellPadding = Grid.options.cellTable.cellPadding;
- }
- this.cssUtil.addClassNames(this.cellTable, 'cellTable');
- this.cssUtil.addClassNames(tbody, 'cellTbody');
- this.element.appendChild(this.cellTable);
- var rows = this.cellTable.rows;
-
- if (!rows || rows.length == 0) {
- for(var i = 0; i < this.rowLength; i++) {
-
- var newRow = this.cellTable.insertRow(i);
- newRow.id = this.rowIdBase + i;
- this.cssUtil.addClassNames(newRow, 'cellRow');
-
- for (var j = 0; j < this.colLength; j++) {
- var newCell = newRow.insertCell(j);
- this.buildCell(newCell, j, "");
- }
- if (this.options.hierarchy) {
- this.setHierarchyRow(newRow);
- }
- }
-
- } else {
- for (var i = 0; i < this.rowLength; i++) {
- var row = rows[i];
- Element.cleanWhitespace(row);
- this.cssUtil.addClassNames(row, 'cellRow');
- row.id = this.rowIdBase + i;
- var cells = row.cells;
-
- for (var j = 0; j < cells.length; j++) {
- var cell = cells[j];
- Element.cleanWhitespace(cell);
- this.buildCell(cell, j, Element.collectTextNodes(cell));
- this.removeList.push(cell.firstChild);
- }
- if (this.options.hierarchy) {
- this.setHierarchyRow(row);
- }
- }
- }
-
- with (this.cellTable.style) {
- width = this.options.cellDefaultWidth * this.colLength + 'px';
- position = 'absolute';
- top = parseInt(Element.getStyle(this.baseTable, 'top')) + parseInt(Element.getStyle(this.baseTable, 'height')) + 'px';
- left = parseInt(Element.getStyle(this.baseTable, 'left')) + parseInt(Element.getStyle(this.baseTable, 'width')) + 'px';
- }
-
- this.cellTable.getIdRow = this.getIdRow.bind(this);
- },
-
- buildCell : function(cell, cellIdIndex, value) {
-
- var cellValueDiv = Builder.node('div');
- cellValueDiv.innerHTML = value;
-
- cell.appendChild(cellValueDiv);
- cell.id = cell.parentNode.id + '_col_' + cellIdIndex;
-
- this.cssUtil.addClassNames(cell, 'cell');
- this.cssUtil.addClassNames(cellValueDiv, 'cellVal');
-
- with (cell.style) {
- width = Element.getStyle(this.getHeaderCell(cell), 'width');
- height = Element.getStyle(this.getIdRow(cell.parentNode).cells[0], 'height');
- }
- with (cellValueDiv.style) {
- width = cell.style.width;
- height = cell.style.height;
- marginTop = '0px';
- marginBottom = '0px';
- }
-
- Event.observe(cell, 'click', this.setSelectedCell.bindAsEventListener(this));
-
- var ajax = new Ajax.InPlaceEditor(cellValueDiv, this.options.cellEditUrl,
- {
- formClassName: this.cssUtil.joinClassNames('inplaceEditor'),
- rows: 2,
- cols:12,
- okButton: false,
- cancelLink:false,
- submitOnBlur:true,
- hoverClassName: "cellHover",
- highlightcolor: "#becfeb",
- highlightendcolor: "#becfeb",
- onComplete: this.showStateDiv.bind(this),
- callback : this.createInplaceEditorParams.bind(this),
- formId : cell.id + '_form'
- }
- );
- cellValueDiv.ajax = ajax;
- Event.stopObserving(cellValueDiv, 'click', ajax.onclickListener);
- Event.stopObserving(cellValueDiv, 'mouseover', ajax.mouseoverListener);
- Event.stopObserving(cellValueDiv, 'mouseout', ajax.mouseoutListener);
-
-
- Event.observe(cellValueDiv, 'dblclick', this.setTextAreaSize.bindAsEventListener(this));
- if (this.options.hierarchy && cell.cellIndex == this.hierarchyColIndex) {
- Event.observe(cellValueDiv, 'dblclick', this.hideStateDiv.bindAsEventListener(this));
- }
- Event.observe(cellValueDiv, 'dblclick', ajax.onclickListener);
-
- },
-
- addColumn: function(index, colTitle, values) {
- var headerRow = this.headerTable.rows[0];
- var insertIndex = (!isNaN(index)) ? index : this.colLength;
- var colIdIndex = this.colLength;
- var headerCell = headerRow.insertCell(insertIndex);
- this.buildHeaderCell(headerCell, colTitle, insertIndex);
-
- var rows = this.cellTable.rows;
- var idRows = this.idTable.rows;
- for (var i = 0; i < rows.length; i++) {
-
- var cell = rows[i].insertCell(insertIndex);
- var cellValue = "";
- if (values && values[i]) {
- cellValue = values[i];
- }
- this.buildCell(cell, colIdIndex, cellValue);
- }
-
- this.headerTable.style.width = parseInt(Element.getStyle(this.headerTable, 'width')) + this.options.cellDefaultWidth + 'px';
- this.cellTable.style.width = this.headerTable.style.width;
-
- var sortableOptions = Sortable.options(headerRow);
-
- sortableOptions.draggables.push(
- new Draggable(
- headerCell,
- {
- revert: true,
- constraint: true,
- scroll: this.element,
- handle: Element.getElementsByClassName(headerCell, Grid.className.headerCellDrag)[0]
- }
- )
- );
- Droppables.add(headerCell, {overlap:'horizontal', containment:headerRow, onHover:Sortable.onHover, greedy:true});
- sortableOptions.droppables.push(headerCell);
- this.sortTable.addEvent(Element.getElementsByClassName(headerCell, Grid.className.headerCellSort)[0]);
- this.colLength += 1;
- },
-
- deleteColumn : function(index) {
- if((isNaN(index)) || index >= this.colLength) {
- return;
- }
- var headerRow = this.headerTable.rows[0];
- if (!headerRow) return;
- var headerCell = headerRow.cells[index];
- if (!headerCell) return;
-
- var width = headerCell.offsetWidth;
- var rows = this.cellTable.rows;
- headerRow.deleteCell(index);
-
- for (var i = 0; i < rows.length; i++) {
- rows[i].deleteCell(index);
- }
-
- var headerTableWidth = parseInt(Element.getStyle(this.headerTable, 'width')) - width;
-
- this.headerTable.style.width = headerTableWidth >= 0 ? headerTableWidth + 'px' : '0px';
- this.cellTable.style.width = this.headerTable.style.width;
- this.colLength -= 1;
- this.fixTablePosition();
- },
-
- addRow : function(index, values) {
- var insertIndex = (!isNaN(index)) ? index : this.idTable.rows.length;
- var rowIdIndex = this.idTable.rows.length;
- var idRow = this.idTable.insertRow(index);
- idRow.id = this.rowIdBase + '_id_' + rowIdIndex;
- this.buildIdRow(idRow, rowIdIndex);
- this.updateId();
-
- var cellRow = this.cellTable.insertRow(insertIndex);
- cellRow.id = this.rowIdBase + rowIdIndex;
- this.cssUtil.addClassNames(cellRow, 'cellRow');
- var headerCells = this.headerTable.rows[0].cells;
-
- for (var i = 0; i < headerCells.length; i++) {
- var headerCell = headerCells[i];
- var colIdIndex = headerCell.id.substring(headerCell.id.indexOf('_col_',0) + '_col_'.length);
- var cell = cellRow.insertCell(i);
- var cellValue = (values && values[i]) ? values[i] : "";
- this.buildCell(cell, colIdIndex, cellValue);
- }
-
- this.sortTable.defaultOrder.insert(index, cellRow);
-
- var idTbody = this.idTable.tBodies[0];
- var sortableOptions = Sortable.options(idTbody);
-
- sortableOptions.draggables.push(
- new Draggable(
- idRow,
- {
- revert: true,
- constraint: true,
- scroll: this.element,
- handle: Element.getElementsByClassName(idRow, Grid.className.idCellVal)[0]
- }
- )
- );
- Droppables.add(idRow, {overlap:'vertical', containment:idTbody, onHover:Sortable.onHover, greedy:true});
- sortableOptions.droppables.push(idRow);
- this.rowLength += 1;
- return cellRow;
- },
-
- deleteRow : function(index) {
- if(isNaN(index) || index >= this.rowLength) {
- return;
- }
-
- var targetId = null;
- if (this.cellTable.rows[index])
- targetId = this.cellTable.rows[index].id;
- else
- return;
-
- this.sortTable.defaultOrder.reverse();
- var newOrder = new Array();
-
- for (var i = 0; this.sortTable.defaultOrder.length > 0; i++) {
- var row = this.sortTable.defaultOrder.pop();
- if (row.id == targetId) {
- continue;
- }
- newOrder.push(row);
- }
-
- this.sortTable.defaultOrder = newOrder;
- this.idTable.deleteRow(index);
- this.cellTable.deleteRow(index);
-
- this.fixTablePosition();
- this.rowLength -= 1;
- this.updateId();
- },
-
- getHeaderCell : function(cell) {
- return this.headerTable.rows[0].cells[cell.cellIndex];
- },
-
- getCells : function(index) {
- var rows = this.cellTable.rows;
- var columns = new Array();
- for (var i = 0; i < rows.length; i++){
- columns.push(rows[i].cells[index]);
- }
- return columns;
- },
-
- getRow : function(index) {
- return this.cellTable.rows[index];
- },
-
- getIdRow : function(cellRow) {
- var id = cellRow.id;
- var index = id.substring(this.rowIdBase.length);
- var targetRow = $(this.rowIdBase + '_id_' + index);
- return targetRow;
- },
-
- getColTitle : function(index) {
- var headerCell = this.headerTable.rows[0].cells[index];
- var title = Element.collectTextNodes(headerCell);
- return title;
- },
-
- finishSort : function() {
- for (var i = 0; i < this.cellTable.rows.length; i++) {
- this.idTable.tBodies[0].appendChild(this.getIdRow(this.cellTable.rows[i]));
- }
- this.updateId();
- },
-
- setSelectedCell : function(event) {
- this.removeSelectedClasses();
- var src = Event.element(event);
-
- if (src.tagName.toUpperCase() != 'TH' && src.tagName.toUpperCase() != 'TD') {
- src = Element.getParentByTagName(['TH,TD'], src);
- }
-
- this.targetCell = src;
-
- if (this.targetCell) {
- this.targetColIndex = this.targetCell.cellIndex;
- this.targetRowIndex = this.targetCell.parentNode.rowIndex;
- this.targetColumn = this.getCells(this.targetColIndex);
- this.targetRow = this.getRow(this.targetRowIndex);
- }
-
- this.cssUtil.addClassNames(this.targetCell, 'cellSelected');
- var childNodes = Element.getTagNodes(this.targetCell, true);
- for (var i = 0; i < childNodes.length; i++) {
- this.cssUtil.addClassNames(childNodes[i], 'cellSelected');
- }
- },
-
- setSelectedColumn : function(event) {
- this.removeSelectedClasses();
-
- this.targetCell = null;
- this.targetRowIndex = null;
- this.targetRow = null;
- this.targetIdRow = null;
- var src = Event.element(event);
- if (src && (src.tagName.toUpperCase() == 'TH' || src.tagName.toUpperCase() == 'TD')) {
- this.targetHeaderCell = src;
- } else {
- this.targetHeaderCell = Element.getParentByTagName(['TH,TD'], src);
- }
- if (this.targetHeaderCell) {
- this.targetColIndex = this.targetHeaderCell.cellIndex;
- this.targetColumn = this.getCells(this.targetColIndex);
- this.cssUtil.addClassNames(this.targetHeaderCell, 'cellSelected');
- var childNodes = Element.getTagNodes(this.targetHeaderCell, true);
- for (var i = 0; i < childNodes.length; i++) {
- this.cssUtil.addClassNames(childNodes[i], 'cellSelected');
- }
- for(var i = 0; i < this.targetColumn.length; i++) {
- this.cssUtil.addClassNames(this.targetColumn[i], 'cellSelected');
- var cellChildNodes = Element.getTagNodes(this.targetColumn[i], true);
- for (var j = 0; j < cellChildNodes.length; j++) {
- this.cssUtil.addClassNames(cellChildNodes.length[j], 'cellSelected');
- }
- }
- }
- },
-
- setSelectedRow : function(event) {
- this.removeSelectedClasses();
- var src = Event.element(event);
- if (src && src.tagName.toUpperCase() == 'TR') {
- this.targetIdRow = src;
- } else {
- this.targetIdRow = Element.getParentByTagName(['TR'], src);
- }
- if (this.targetIdRow) {
- this.targetRowIndex = this.targetIdRow.rowIndex;
- this.targetRow = this.getRow(this.targetRowIndex);
-
- this.cssUtil.addClassNames(this.targetRow, 'cellSelected');
- var childNodes = Element.getTagNodes(this.targetRow, true);
- for (var i = 0; i < childNodes.length; i++) {
- this.cssUtil.addClassNames(childNodes[i], 'cellSelected');
- }
- this.cssUtil.addClassNames(this.targetIdRow, 'cellSelected');
- childNodes = Element.getTagNodes(this.targetIdRow, true);
- for (var i = 0; i < childNodes.length; i++) {
- this.cssUtil.addClassNames(childNodes[i], 'cellSelected');
- }
- }
-
- },
-
- removeSelectedClasses : function() {
- if (this.targetHeaderCell) {
- this.cssUtil.removeClassNames(this.targetHeaderCell, 'cellSelected');
- var childNodes = Element.getTagNodes(this.targetHeaderCell, true);
- for (var i = 0; i < childNodes.length; i++) {
- this.cssUtil.removeClassNames(childNodes[i], 'cellSelected');
- }
- for(var i = 0; i < this.targetColumn.length; i++) {
- this.cssUtil.removeClassNames(this.targetColumn[i], 'cellSelected');
- var cellChildNodes = Element.getTagNodes(this.targetColumn[i], true);
- for (var j = 0; j < cellChildNodes.length; j++) {
- this.cssUtil.removeClassNames(cellChildNodes.length[j], 'cellSelected');
- }
- }
-
- }
- if (this.targetCell) {
- this.cssUtil.removeClassNames(this.targetCell, 'cellSelected');
- var childNodes = Element.getTagNodes(this.targetCell, true);
- for (var i = 0; i < childNodes.length; i++) {
- this.cssUtil.removeClassNames(childNodes[i], 'cellSelected');
- }
-
- }
-
- if (this.targetRow) {
- this.cssUtil.removeClassNames(this.targetRow, 'cellSelected');
- var childNodes = Element.getTagNodes(this.targetRow, true);
- for (var i = 0; i < childNodes.length; i++) {
- this.cssUtil.removeClassNames(childNodes[i], 'cellSelected');
- }
- this.cssUtil.removeClassNames(this.targetIdRow, 'cellSelected');
- childNodes = Element.getTagNodes(this.targetIdRow, true);
- for (var i = 0; i < childNodes.length; i++) {
- this.cssUtil.removeClassNames(childNodes[i], 'cellSelected');
- }
- }
-
- this.targetHeaderCell = null;
- this.targetColumn = null;
- this.targetColIndex = null;
- this.targetCell = null;
- this.targetRowIndex = null;
- this.targetRow = null;
- this.targetIdRow = null;
- },
-
- updateId : function() {
- var rows = this.idTable.rows;
- for (var i = 0; i < rows.length; i++) {
- var idValue = document.getElementsByClassName(this.custumCss.idCellVal, rows[i])[0];
-
- idValue.innerHTML = i + 1;
- }
- },
-
- updateRowLine : function(target) {
- var targetCellRow = this.cellTable.rows[this.targetRowIndex];
- var updateRowIndex = this.targetIdRow.rowIndex;
- var cellTableBody = targetCellRow.parentNode;
- var cellTableRows = cellTableBody.rows;
-
- if (this.options.hierarchy) {
- var checkRow = cellTableBody.rows[this.targetIdRow.rowIndex];
- if (this.isParentRow(checkRow, targetCellRow)) {
- var idBody = this.idTable.tBodies[0];
- idBody.insertBefore(this.targetIdRow, idBody.rows[this.targetRowIndex]);
- return;
- }
- }
- if (updateRowIndex == cellTableRows.length - 1) {
- cellTableBody.appendChild(targetCellRow);
- } else if (this.targetRowIndex < updateRowIndex) {
- cellTableBody.insertBefore(targetCellRow, cellTableRows[updateRowIndex + 1]);
- } else {
- cellTableBody.insertBefore(targetCellRow, cellTableRows[updateRowIndex]);
- }
- if (this.options.hierarchy) {
- this.updateOutline(targetCellRow);
- }
- this.targetRowIndex = updateRowIndex;
- this.updateId();
- },
- updateCellLine : function(target){
- var targetCells = this.getCells(this.targetColIndex);
- var updateColIndex = this.targetHeaderCell.cellIndex;
-
- var rows = this.cellTable.rows;
-
- for (var i = 0; i < rows.length; i++) {
- var cells = rows[i].cells;
- var targetCell = targetCells[i];
-
- if (updateColIndex == cells.length -1) {
- rows[i].appendChild(targetCell);
- } else if (this.targetColIndex < updateColIndex) {
- rows[i].insertBefore(targetCell, cells[updateColIndex + 1]);
- } else {
- rows[i].insertBefore(targetCell, cells[updateColIndex]);
- }
- }
- this.targetColIndex = updateColIndex;
- },
-
- updateCellWidth : function(newStyle, headColumn) {
-
- if(newStyle.width > this.options.cellMinWidth) {
- var dragDiv = Element.getElementsByClassName(headColumn, Grid.className.headerCellDrag)[0];
- var sortDiv = Element.getElementsByClassName(headColumn, Grid.className.headerCellSort)[0];
- var val = newStyle.width - (parseInt(Element.getStyle(headColumn, 'width')));
-
- val = parseInt(val);
-
- this.headerTable.style.width = (parseInt(Element.getStyle(this.headerTable, 'width')) + val) + 'px';
-
- dragDiv.style.width = newStyle.width - (this.marginSize * 2) + 'px';
- sortDiv.style.width = parseInt(Element.getStyle(dragDiv, 'width')) - (this.marginSize * 2) + 'px';
-
- var index = headColumn.cellIndex ;
- var rows = this.cellTable.rows;
-
- this.cellTable.style.width = this.headerTable.style.width
-
- for(var i = 0; i < rows.length; i++){
- var cell = rows[i].cells[index];
- var cellValueDiv = Element.getElementsByClassName(cell, Grid.className.cellVal)[0];
- cellValueDiv.style.width = newStyle.width + 'px';
- cell.style.width = newStyle.width + 'px';
- }
-
- }
- },
-
- updateCellHeight : function(newStyle, idCell) {
- if(newStyle.height > this.options.cellMinHeight) {
- var row = idCell.parentNode;
- var index = row.rowIndex;
- var idValueDiv = Element.getElementsByClassName(idCell, Grid.className.idCellVal)[0];
- idValueDiv.style.height = newStyle.height - (this.marginSize * 2) + 'px';
- var padding = parseInt(idValueDiv.style.paddingTop);
- var cellRow = this.cellTable.rows[index];
- var cells = cellRow.cells;
- for (var i = 0; i < cells.length; i++) {
- cells[i].style.height = newStyle.height + 'px';
- var cellValueDiv = Element.getElementsByClassName(cells[i], Grid.className.cellVal)[0];
- cellValueDiv.style.height = newStyle.height + 'px';
- }
- }
- },
-
- setTextAreaSize : function(event) {
- var target = Event.element(event);
- var rows = parseInt(Element.getStyle(target, 'height'));
- var cols = parseInt(Element.getStyle(target, 'width'));
- target.ajax.options.rows = Math.round(rows/20);
- target.ajax.options.cols = Math.round(cols/20);
- },
-
- fixTablePosition : function(event) {
- Grid.scrollTop = this.element.scrollTop;
- Grid.scrollLeft = this.element.scrollLeft;
- this.baseTable.style.top = Grid.scrollTop + 'px';
- this.baseTable.style.left = Grid.scrollLeft + 'px';
- this.headerTable.style.top = Grid.scrollTop + 'px';
- this.idTable.style.left = Grid.scrollLeft + 'px';
- },
-
-//----------ajax request param method---------------------------------------------------------------------------
- createInplaceEditorParams : function(form, value) {
- var rowIndexEnd = form.id.indexOf('_col_', 0);
- var rowIndex = form.id.substring(this.rowIdBase.length, rowIndexEnd);
-
- var colIndexStart = rowIndexEnd + '_col_'.length;
- var colIndexEnd = form.id.indexOf('_form', 0);
- var colIndex = form.id.substring(colIndexStart, colIndexEnd);
- var jsonRowObj = this.rowDataToJsonObj(rowIndex);
-
- var targetColTitle = this.getColTitle(colIndex);
- jsonRowObj.each(function(j) {
- if (j.column == targetColTitle) {
- j.value = value;
- throw $break;
- }
- });
- var jsonRowText = JSON.stringify(jsonRowObj);
- var params = {
- rowData: jsonRowText,
- column: targetColTitle,
- value: value
- };
- return $H(params).toQueryString();
- },
-
- gridDataToJsonObj : function() {
- var rows = this.cellTable.rows;
- var jsonDataList = [];
- for (var i = 0; i < this.rowLength; i++) {
- var rowData = this.rowDataToJsonObj(i);
- jsonDataList.push(rowData);
- }
- return jsonDataList;
- },
-
- rowDataToJsonObj : function(index) {
- var jsonRowObj = [];
- var row = $A(this.cellTable.rows).detect(function(r) {return r.id.getSuffix() == index});
- for (var i = 0; i < this.colLength; i++) {
- var jsonCellObj = {};
- jsonCellObj['column'] = this.getColTitle(i);
- jsonCellObj['value'] = Element.collectTextNodes(row.cells[i]);
- jsonRowObj.push(jsonCellObj);
- }
- return jsonRowObj;
- },
-
- updateGridData : function() {
-
- var jsonDataText = JSON.stringify(this.gridDataToJsonObj());
- var params = 'id=' + encodeURIComponent(this.element.id) + '&data=' + encodeURIComponent(jsonDataText);
-
- new Ajax.Updater(
- this.options.updateGridReceiver,
- this.options.updateGridUrl,
- {
- parameters: params,
- evalScripts: true, asynchronous:true
-
- }
- );
- },
-
-//----------hierarchy grid method---------------------------------------------------------------------------
- setHierarchyRow : function(row, outlineLevel, outlineNum){
- row.outlineLevel = outlineLevel || 1;
- row.list = row.list || new Array();
- if (row.outlineLevel == 1) {
- this.topLevelList.push(row);
- row.outlineNum = outlineNum || this.topLevelList.length;
- } else {
- var parentRow = this.getParentRow(row);
- parentRow.list.push(row);
- var num = parentRow.length;
- row.outlineNum = outlineNum || parentRow.outlineNum + '.' + parentRow.list.length;
-
- }
-
- this.buildStateDiv(row.cells[this.hierarchyColIndex]);
- this.setOutlineIndent(row);
- this.setFontWeight(row);
- },
-
- buildStateDiv : function (cell) {
- var stateDiv = Builder.node('div');
- var valueDiv = Element.getElementsByClassName(cell, Grid.className.cellVal)[0];
- this.cssUtil.addClassNames(stateDiv, 'state');
- cell.insertBefore(stateDiv, valueDiv);
-
- if (document.all) {
- stateDiv.style.position = "absolute";
- } else {
- stateDiv.style.position = "relative";
- stateDiv.style.cssFloat = "left";
- }
- this.addStateClass(cell, stateDiv);
- Event.observe(stateDiv, 'click', this.toggleState.bindAsEventListener(this));
- },
-
- addStateClass : function (cell, stateDiv) {
- var row = cell.parentNode;
- if (row.list.length == 0) {
- this.cssUtil.addClassNames(stateDiv, 'stateEmpty');
- } else if (this.options.open){
- this.cssUtil.addClassNames(stateDiv, 'stateOpen');
- } else {
- this.cssUtil.addClassNames(stateDiv, 'stateClose');
- this.closeRow(row);
- }
- },
-
- toggleState : function(event) {
- var src = Event.element(event);
- var row = src.parentNode.parentNode;
-
- if (!Element.hasClassName(src, Grid.className.stateEmpty)) {
- if (Element.hasClassName(src, Grid.className.stateOpen)) {
- this.closeRow(row.list);
- this.cssUtil.removeClassNames(src, 'stateOpen');
- this.cssUtil.addClassNames(src, 'stateClose');
- } else {
- this.openRow(row.list);
- this.cssUtil.removeClassNames(src, 'stateClose');
- this.cssUtil.addClassNames(src, 'stateOpen');
- }
- }
- },
-
- openRow : function(list) {
- for (var i = 0; i < list.length; i++) {
- var row = list[i];
- Element.show(row);
- Element.show(this.getIdRow(row));
- var stateDiv = Element.getElementsByClassName(row.cells[this.hierarchyColIndex], Grid.className.state)[0];
- if (Element.hasClassName(stateDiv, Grid.className.stateOpen)) {
- this.openRow(row.list)
- }
- }
- },
-
- closeRow : function(list) {
- for (var i = 0; i < list.length; i++) {
- Element.hide(list[i]);
- Element.hide(this.getIdRow(list[i]));
- this.closeRow(list[i].list)
- }
- },
-
-
- showStateDiv : function(transport, element) {
- var row = Element.getParentByTagName(['TR'], element);
- var state = Element.getElementsByClassName(row, Grid.className.state)[0];
- Element.show(state);
- },
-
- hideStateDiv : function(event) {
- var src = Event.element(event);
- var row = Element.getParentByTagName(['TR'], src);
- var state = Element.getElementsByClassName(row, Grid.className.state)[0];
-
- Element.hide(state);
- },
-
- addHierarchyRow : function(index, values) {
- if (this.colLength == 0) {
- return;
- }
- var newRow = this.addRow(index, values);
-
- newRow.list = new Array();
- var previousRow = newRow.previousSibling;
- var parentRow = null;
- var parentList = null;
- var insertIndex = 0;
- if (!previousRow) {
- newRow.outlineLevel = 1;
- parentList = this.topLevelList;
- } else if (previousRow.list.length > 0) {
- newRow.outlineLevel = previousRow.outlineLevel + 1;
- parentRow = previousRow;
- parentList = parentRow.list;
- } else {
- newRow.outlineLevel = previousRow.outlineLevel;
- parentRow = this.getParentRow(previousRow);
- parentList = parentRow ? parentRow.list : this.topLevelList;
- insertIndex = parentList.indexOf(previousRow) + 1;
- }
- parentList.insert(insertIndex, newRow);
- this.buildStateDiv(newRow.cells[this.hierarchyColIndex]);
- for (var i = insertIndex; i < parentList.length; i++) {
- if (parentList[i].outlineLevel != 1) {
- parentList[i].outlineNum = parentRow.outlineNum + '.' + (i + 1);
- } else {
- parentList[i].outlineNum = i + 1;
- }
- this.setOutline(parentList[i]);
- }
-
- },
-
- deleteHierarchyRow : function(index) {
- if(isNaN(index) || index >= this.rowLength) {
- return;
- }
- var row = this.getRow(index);
- if (!row) {
- return;
- }
- var parentRow = this.getParentRow(row);
- var parentList = parentRow ? parentRow.list : this.topLevelList;
- var removeIndex = parentList.indexOf(row);
- var childList = row.list;
-
- for (var i = 0; i < childList.length; i++) {
- this.deleteChildRow(childList[i]);
- }
- parentList.remove(removeIndex);
- this.deleteRow(index);
-
- for (var i = removeIndex; i < parentList.length; i++) {
- var updateRow = parentList[i];
- if (updateRow.outlineLevel == 1) {
- updateRow.outlineNum = i + 1;
- } else {
- updateRow.outlineNum = this.getParentRow(updateRow).outlineNum + '.' + (i + 1);
- }
- this.setOutline(parentList[i]);
- }
- this.setFontWeight(parentRow);
- },
-
- deleteChildRow : function(childRow) {
- var list = childRow.list;
-
- for (var i = 0; i < list.length; i++) {
- this.deleteChildRow(list[i]);
- }
- this.deleteRow(childRow.rowIndex);
- },
-
- levelUp : function(row) {
- if (!row) {
- return;
- }
- var previousRow = row.previousSibling;
- if (row.outlineLevel == 1 || !previousRow) {
- return;
- }
-
- var parentRow = this.getParentRow(row);
- var currentList = parentRow.list;
-
- var newParentRow = this.getParentRow(parentRow);
- var targetList = newParentRow ? newParentRow.list : this.topLevelList;
-
- var currentIndex = currentList.indexOf(row);
- var targetIndex = targetList.indexOf(parentRow) + 1;
-
- row.outlineLevel -= 1;
- targetList.insert(targetIndex, row);
- currentList.remove(currentIndex);
-
- while (currentList[currentIndex]) {
- var moveRow = currentList[currentIndex];
- row.list.push(moveRow);
- currentList.remove(currentIndex);
- }
-
- if (row.outlineLevel != 1) {
- row.outlineNum = newParentRow.outlineNum + '.' + (targetIndex + 1);
- } else {
- row.outlineNum = targetIndex + 1;
- }
-
- this.setOutline(row);
-
- for (var i = targetIndex + 1; i < targetList.length; i++) {
- if (targetList[i].outlineLevel != 1) {
- targetList[i].outlineNum = newParentRow.outlineNum + '.' + (i + 1);
- } else {
- targetList[i].outlineNum = i + 1;
- }
- this.setOutline(targetList[i]);
- }
-
- this.setFontWeight(row);
- this.setFontWeight(parentRow);
- this.setFontWeight(newParentRow);
- this.setStateClass(row);
- this.setStateClass(previousRow);
- },
-
- levelDown : function(row) {
- if (!row) {
- return;
- }
- var previousRow = row.previousSibling;
- var parentRow = this.getParentRow(row);
- if (!previousRow || parentRow == previousRow) {
- return;
- }
- var currentList = (row.outlineLevel == 1) ? this.topLevelList : parentRow.list;
- var currentIndex = currentList.indexOf(row);
-
- row.outlineLevel += 1;
-
- var newParentRow = this.getParentRow(row);
- var targetList = newParentRow.list;
- var targetIndex = targetList.length;
-
- currentList.remove(currentIndex);
- targetList.push(row);
-
- row.outlineNum = newParentRow.outlineNum + '.' + (targetIndex + 1);
- this.setOutline(row);
- for (var i = currentIndex; i < currentList.length; i++) {
- if (currentList[i].outlineLevel != 1) {
- currentList[i].outlineNum = parentRow.outlineNum + '.' + (i + 1);
- } else {
- currentList[i].outlineNum = i + 1;
- }
- this.setOutline(currentList[i]);
- }
-
- for (var i = targetIndex + 1; i < targetList.length; i++) {
- targetList[i].outlineNum = newParentRow.outlineNum + '.' + (i + 1);
- this.setOutline(targetList[i]);
- }
-
- this.setFontWeight(row);
- this.setFontWeight(parentRow);
- this.setFontWeight(newParentRow);
- this.setStateClass(row);
- this.setStateClass(previousRow);
-
- },
-
- setStateClass : function(row) {
- if (!row.list) return;
- var stateDiv = Element.getElementsByClassName(row.cells[this.hierarchyColIndex], Grid.className.state)[0];
-
- if (Element.hasClassName(stateDiv, Grid.className.stateEmpty) && row.list.length > 0) {
- this.cssUtil.removeClassNames(stateDiv, 'stateEmpty');
- this.cssUtil.addClassNames(stateDiv, 'stateOpen');
- } else if (!Element.hasClassName(stateDiv, Grid.className.stateEmpty) && row.list.length == 0) {
- this.cssUtil.removeClassNames(stateDiv, 'stateOpen');
- this.cssUtil.addClassNames(stateDiv, 'stateEmpty');
- }
- },
-
- setOutline : function(row) {
- var childList = row.list;
- if (!childList) return;
- for(var i = 0; i < childList.length; i++) {
- var childRow = childList[i];
- childRow.outlineLevel = row.outlineLevel + 1;
- childRow.outlineNum = row.outlineNum + '.' + (i + 1);
- this.setOutline(childRow);
- }
- this.setOutlineIndent(row);
- },
-
- setOutlineIndent : function(row) {
- var cell = row.cells[this.hierarchyColIndex];
- if (!cell) {
- return;
- }
- var cellValueDiv = Element.getElementsByClassName(cell, Grid.className.cellVal)[0];
- var stateDiv = Element.getElementsByClassName(cell, Grid.className.state)[0];
- if (!stateDiv) return;
- var stateDivWidth = stateDiv.offsetWidth || this.stateDivWidth;
- var left = this.options.hierarchyIndent * (row.outlineLevel - 1);
- var valueLeft = document.all ? left + stateDivWidth : left;
- cellValueDiv.style.left = valueLeft + 'px';
- stateDiv.style.left = left + 'px';
- },
-
- setFontWeight : function(row) {
- if (row) {
- if (!row.list) return;
- if (row.list.length > 0){
- row.style.fontWeight = 'bold';
- } else {
- row.style.fontWeight = 'normal';
- }
- }
- },
-
- updateOutline : function(row) {
- var previousRow = row.previousSibling;
- var newParentRow = null;
- var insertIndex = 0;
- var newParentList = null;
-
- if (!previousRow.list) return;
- if (!previousRow) {
- newParentList = this.topLevelList;
- }else if(previousRow.list.length > 0) {
- newParentRow = previousRow;
- newParentList = newParentRow.list;
- } else {
- newParentRow = this.getParentRow(previousRow);
- newParentList = newParentRow ? newParentRow.list : this.topLevelList;
- insertIndex = newParentList.indexOf(previousRow) + 1;
- }
- var parentRow = this.getParentRowByIndex(row, this.targetRowIndex);
- var parentList = null;
-
- var outlineNumBase = '';
- if (parentRow) {
- parentList = parentRow.list;
- outlineNumBase = parentRow.outlineNum + '.';
- } else {
- parentList = this.topLevelList;
- if (!parentList) return;
- }
- var removeIndex = parentList.indexOf(row);
-
- if (parentList == newParentList && removeIndex < insertIndex) {
- insertIndex -= 1;
- parentList.remove(removeIndex);
- parentList.insert(insertIndex, row);
- for (var i = removeIndex; i < parentList.length; i++) {
- try {
- parentList[i].outlineNum = outlineNumBase + (i + 1);
- this.setOutline(parentList[i]);
- } catch (e) {}
- }
-
- } else {
- parentList.remove(removeIndex);
- newParentList.insert(insertIndex, row);
- for (var i = removeIndex; i < parentList.length; i++) {
- parentList[i].outlineNum = outlineNumBase + (i + 1);
- this.setOutline(parentList[i]);
- }
- var newOutlineNumBase = newParentRow ? newParentRow.outlineNum + '.' : '';
- var newOutlineLevelBase = newParentRow ? newParentRow.outlineLevel : 0;
- row.outlineNum = newOutlineNumBase + (insertIndex + 1);
- row.outlineLevel = newOutlineLevelBase + 1;
- for (var i = insertIndex; i < newParentList.length; i++) {
- newParentList[i].outlineNum = newOutlineNumBase + (i + 1);
- this.setOutline(newParentList[i]);
- }
- this.setOutline(row);
- }
- this.setFontWeight(row);
- this.setStateClass(row);
- if (parentRow) {
- this.setFontWeight(parentRow);
- this.setStateClass(parentRow);
- }
- if (newParentRow) {
- this.setFontWeight(newParentRow);
- this.setStateClass(newParentRow);
- }
- this.updateHierarchyRowLine(row);
- },
-
- updateHierarchyRowLine : function(row, existingRow) {
- if (!row.list) return;
- var rowIndex = row.rowIndex;
- var cellBody = this.cellTable.tBodies[0];
- var idBody = this.idTable.tBodies[0];
- if (!existingRow) {
- existingRow = cellBody.rows[rowIndex + 1]
- }
-
- for (var i = 0; i < row.list.length; i++) {
- if (!existingRow) {
- cellBody.appendChild(row.list[i]);
- idBody.appendChild(this.getIdRow(row.list[i]));
- } else {
- cellBody.insertBefore(row.list[i], existingRow);
- idBody.insertBefore(this.getIdRow(row.list[i]), this.getIdRow(existingRow));
- }
- this.updateHierarchyRowLine(row.list[i], existingRow);
- }
- },
-
- getParentRow : function(row) {
- if (row.outlineLevel == 1) {
- return null;
- }
-
- var previousRow = row.previousSibling;
- if (!previousRow) {
- return null;
- }
- try {
- while (previousRow.outlineLevel != (row.outlineLevel - 1)) {
- previousRow = previousRow.previousSibling;
- }
- return previousRow;
- } catch (e) {}
- },
-
- getParentRowByIndex : function(row, index) {
- if (row.outlineLevel == 1) {
- return null;
- }
- if (this.targetRowIndex) {
- for(var i = 0; i < this.targetRowIndex + 1; i++) {
- if (!this.cellTable.rows[i].list) return;
- if (this.cellTable.rows[i].list.indexOf(row) != -1) {
- return this.cellTable.rows[i];
- }
- }
- }
- return null;
- },
-
- getPreviousRootRow : function(row) {
- var previousRow = row.previousSibling;
- if (!previousRow) {
- return;
- }
- while (previousRow.outlineLevel != 1) {
- previousRow = previousRow.previousSibling;
- }
-
- return previousRow;
- },
-
- isParentRow : function(row, parentRow) {
- var temp = this.getParentRow(row);
- if (!temp) {
- return false;
- } else if (temp == parentRow) {
- return true;
- } else {
- return this.isParentRow(temp, parentRow);
- }
- }
-}
+// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+Grid = Class.create();\r
+Grid.className = {\r
+ container: 'grid_container',\r
+ \r
+ baseTable: 'grid_baseTable',\r
+ baseRow: 'grid_baseRow',\r
+ baseCell: 'grid_baseCell',\r
+ \r
+ headerTable: 'grid_headerTable',\r
+ headerRow: 'grid_headerRow',\r
+ headerCell: 'grid_headerCell',\r
+ headerCellDrag: 'grid_headerCellDrag',\r
+ headerCellSort: 'grid_headerCellVal',\r
+ \r
+ idTable: 'grid_idTable',\r
+ idRow: 'grid_idRow',\r
+ idCell: 'grid_idCell',\r
+ idCellVal: 'grid_idCellVal',\r
+ \r
+ cellTable: 'grid_cellTable',\r
+ cellTbody: 'grid_cellTbody',\r
+ cellRow: 'grid_cellRow',\r
+ cell: 'grid_cell',\r
+ cellVal: 'grid_cellVal',\r
+ cellSelected: 'grid_cellSelected',\r
+ state: 'grid_state',\r
+ stateEmpty: 'grid_stateEmpty',\r
+ stateOpen: 'grid_stateOpen',\r
+ stateClose: 'grid_stateClose',\r
+ \r
+ inplaceEditor: 'grid_inplaceEditor'\r
+}\r
+Grid.scrollTop = 0;\r
+Grid.scrollLeft = 0;\r
+Grid.options = {}\r
+Grid.options.baseTable = {\r
+ border:1,\r
+ frame : 'border',\r
+ cellSpacing:0,\r
+ cellPadding:0\r
+}\r
+Grid.options.headerTable = {\r
+ border:1,\r
+ frame : 'border',\r
+ cellSpacing:0,\r
+ cellPadding:0\r
+}\r
+Grid.options.idTable = {\r
+ border:1,\r
+ frame : 'border',\r
+ cellSpacing:0,\r
+ cellPadding:0\r
+}\r
+Grid.options.cellTable = {\r
+ border:1,\r
+ frame : 'border',\r
+ cellSpacing:0,\r
+ cellPadding:0\r
+}\r
+Grid.prototype = {\r
+ \r
+ initialize : function(element) {\r
+ \r
+ this.element = $(element);\r
+ Element.setStyle(this.element, {visibility: 'hidden'});\r
+ Element.hide(this.element);\r
+\r
+ var options = Object.extend({\r
+ cssPrefix: 'custum_',\r
+ cellMinWidth: 10,\r
+ cellMinHeight: 10,\r
+ cellDefaultWidth: 72,\r
+ cellDefaultHeight: 25,\r
+ defaultRowLength: 10,\r
+ baseWidth: 40,\r
+ baseHeight: 25,\r
+ baseTop: 0,\r
+ baseLeft: 0,\r
+ cellEditUrl: '',\r
+ updateGridUrl: '',\r
+ updateGridReceiver: '',\r
+ hierarchy: false,\r
+ hierarchyCol: false,\r
+ hierarchyIndent: 20,\r
+ sortOptions: {}\r
+ }, arguments[1] || {});\r
+ \r
+ this.options = options;\r
+ this.custumCss = CssUtil.appendPrefix(options.cssPrefix, Grid.className);\r
+ this.cssUtil = new CssUtil([Grid.className, this.custumCss]);\r
+ this.cssUtil.addClassNames(this.element, 'container');\r
+ this.hierarchyCol = this.options.hierarchyCol ? $(this.options.hierarchyCol) : false;\r
+ this.hierarchyColIndex = this.hierarchyCol ? this.hierarchyCol.cellIndex : 0;\r
+ Element.makePositioned(this.element);\r
+ Position.includeScrollOffsets = true;\r
+ this.stateDivWidth = parseInt(CssUtil.getCssRuleBySelectorText('.' + Grid.className.state).style.width, 10);\r
+ \r
+ this.marginSize = this.options.marginSize ? this.options.marginSize : 4;\r
+ this.stateIndent = 15;\r
+ \r
+ this.rowIdBase = this.element.id + '_row_';\r
+ this.topLevelList = new Array();\r
+ this.removeList = new Array();\r
+ this.build();\r
+ this.removeList.each(function(r) {\r
+ r.parentNode.removeChild(r);\r
+ });\r
+ var sortOptions = {\r
+ relate : this.idTable,\r
+ handle:this.headerTable,\r
+ callBack:this.finishSort.bind(this)\r
+ };\r
+ sortOptions = $H(sortOptions).merge(this.options.sortOptions);\r
+ this.sortTable = new SortableTableGridEx(this.cellTable, sortOptions);\r
+ Element.setStyle(this.element, {visibility: 'visible'});\r
+ Element.show(this.element);\r
+ },\r
+ \r
+ build: function() { \r
+ Element.cleanWhitespace(this.element);\r
+ this.cellTable = this.element.childNodes[0];\r
+ Element.cleanWhitespace(this.cellTable);\r
+ \r
+ this.colLength = this.cellTable.tHead.rows[0].cells.length;\r
+ this.rowLength = this.cellTable.tBodies[0].rows.length;\r
+ if (this.rowLength == 0)this.rowLength = this.options.defaultRowLength;\r
+ this.buildBaseTable();\r
+ this.buildHeaderTable();\r
+ this.buildIdTable();\r
+ this.buildCellTable();\r
+ \r
+ Event.observe(this.element, 'scroll', this.fixTablePosition.bindAsEventListener(this));\r
+ },\r
+ \r
+ buildBaseTable: function() {\r
+\r
+ this.baseTable = Builder.node('table', Grid.options.baseTable);\r
+ this.cssUtil.addClassNames(this.baseTable, 'baseTable');\r
+ with (this.baseTable.style) {\r
+ width = this.options.baseWidth + 'px';\r
+ height = this.options.baseHeight + 'px';\r
+ position = 'absolute';\r
+ top = this.options.baseTop + 'px';\r
+ left = this.options.baseLeft + 'px';\r
+ }\r
+ \r
+ var row = this.baseTable.insertRow(0);\r
+ var cell = row.insertCell(0);\r
+ \r
+ this.cssUtil.addClassNames(row, 'baseRow');\r
+ this.cssUtil.addClassNames(cell, 'baseCell');\r
+ \r
+ this.element.appendChild(this.baseTable);\r
+ },\r
+ \r
+ buildHeaderTable: function() {\r
+ this.headerTable = Builder.node('table', Grid.options.headerTable);\r
+ this.cssUtil.addClassNames(this.headerTable, 'headerTable');\r
+ \r
+ var thead = this.cellTable.tHead;\r
+ var row = thead.rows[0];\r
+ row.id = this.element.id + '_headerTable_row';\r
+ var cells = row.cells;\r
+ Element.cleanWhitespace(thead);\r
+ Element.cleanWhitespace(row);\r
+ \r
+ this.cssUtil.addClassNames(row, 'headerRow');\r
+ for (var i = 0; i < cells.length; i++) {\r
+ var cell = cells[i];\r
+ var value = cell.firstChild;\r
+ var title = cell.innerHTML;\r
+ this.buildHeaderCell(cell, title, i);\r
+ this.removeList.push(value);\r
+ }\r
+ this.headerTable.appendChild(thead);\r
+ with (this.headerTable.style) {\r
+ width = this.options.cellDefaultWidth * this.colLength + 'px';\r
+ height = this.baseTable.style.height;\r
+ position= 'absolute';\r
+ top = Element.getStyle(this.baseTable, 'top');\r
+ left = parseInt(Element.getStyle(this.baseTable, 'left')) + parseInt(Element.getStyle(this.baseTable, 'width')) + 'px';\r
+ }\r
+ this.element.appendChild(this.headerTable);\r
+ Sortable.create(\r
+ row, \r
+ {\r
+ tag:'td',\r
+ handle:Grid.className.headerCellDrag,\r
+ constraint:true,\r
+ overlap:'horizontal',\r
+ scroll:this.element,\r
+ onUpdate:this.updateCellLine.bind(this)\r
+ });\r
+ },\r
+ \r
+ buildHeaderCell : function(cell, title, index) {\r
+\r
+ cell.id = this.element.id + '_header_col_' + index;\r
+ \r
+ var drag = Builder.node('div');\r
+ var sort = Builder.node('div');\r
+ \r
+ this.cssUtil.addClassNames(cell, 'headerCell');\r
+ this.cssUtil.addClassNames(drag, 'headerCellDrag');\r
+ this.cssUtil.addClassNames(sort, 'headerCellSort');\r
+ \r
+ cell.style.width = this.options.cellDefaultWidth + 'px';\r
+ var dragWidth = parseInt(Element.getStyle(cell, 'width')) - (this.marginSize * 2);\r
+ var sortWidth = dragWidth - (this.marginSize * 2);\r
+ var cellHeight = this.options.baseHeight - (Grid.options.headerTable.border * 4);\r
+ with (drag.style) {\r
+ width = dragWidth + 'px';\r
+ height = cellHeight + 'px';\r
+ marginLeft = this.marginSize + 'px';\r
+ marginRight = this.marginSize + 'px';\r
+ }\r
+ with (sort.style) {\r
+ width = sortWidth + 'px';\r
+ height = cellHeight + 'px';\r
+ marginLeft = this.marginSize + 'px';\r
+ marginRight = this.marginSize + 'px';\r
+ }\r
+ \r
+ sort.innerHTML = title;\r
+ drag.appendChild(sort);\r
+ cell.appendChild(drag);\r
+ \r
+ new ResizeableGridEx(cell, {minWidth: this.options.cellMinWidth, top:0,right:2, bottom:0, left:0 ,draw:this.updateCellWidth.bind(this)});\r
+ Event.observe(cell, 'mousedown', this.setSelectedColumn.bindAsEventListener(this));\r
+ Event.observe(drag, 'mousedown', this.setSelectedColumn.bindAsEventListener(this));\r
+ Event.observe(sort, 'mousedown', this.setSelectedColumn.bindAsEventListener(this)); \r
+ },\r
+ \r
+ buildIdTable: function() {\r
+\r
+ this.idTable = Builder.node('table', Grid.options.idTable);\r
+ this.cssUtil.addClassNames(this.idTable, 'idTable');\r
+ for (var i = 0; i < this.rowLength; i++) {\r
+ \r
+ var row = this.idTable.insertRow(i);\r
+ this.buildIdRow(row, i);\r
+ }\r
+ \r
+ with(this.idTable.style) {\r
+ width = this.options.baseWidth + 'px';\r
+ position = 'absolute';\r
+ top = parseInt(Element.getStyle(this.baseTable, 'top')) + parseInt(Element.getStyle(this.baseTable, 'height')) + 'px';\r
+ left = Element.getStyle(this.baseTable, 'left');\r
+ }\r
+ \r
+ this.element.appendChild(this.idTable);\r
+ var tbody = this.idTable.tBodies[0];\r
+ tbody.id = this.element.id + '_idTable_tbody';\r
+ Sortable.create(\r
+ tbody, \r
+ {\r
+ tag:'tr',\r
+ handle:Grid.className.idCellVal,\r
+ scroll:this.element,\r
+ constraint:true,\r
+ overlap:'vertical',\r
+ onUpdate:this.updateRowLine.bind(this)\r
+ });\r
+ },\r
+ \r
+ buildIdRow : function(row, index) {\r
+ row.id = this.rowIdBase + '_id_' + index;\r
+ \r
+ var cell = row.insertCell(0);\r
+ var valueDiv = Builder.node('div');\r
+\r
+ this.cssUtil.addClassNames(row, 'idRow');\r
+ this.cssUtil.addClassNames(cell, 'idCell');\r
+ this.cssUtil.addClassNames(valueDiv, 'idCellVal'); \r
+ \r
+ with (cell.style) {\r
+ width = this.options.baseWidth + 'px';\r
+ height = this.options.cellDefaultHeight + 'px';\r
+ }\r
+ with (valueDiv.style) {\r
+ marginTop = this.marginSize + 'px';\r
+ marginBottom = this.marginSize + 'px';\r
+ width = this.options.baseWidth - (Grid.options.idTable.border * 4) + 'px';\r
+ height = this.options.cellDefaultHeight - (this.marginSize * 2) + 'px';\r
+ }\r
+\r
+ valueDiv.innerHTML = index + 1;\r
+ cell.appendChild(valueDiv);\r
+ \r
+ new ResizeableGridEx(cell, {minHeight: this.options.cellMinHeight, top:0, right: 0, bottom: 2, left: 0, draw:this.updateCellHeight.bind(this)});\r
+ \r
+ Event.observe(row, 'mousedown', this.setSelectedRow.bindAsEventListener(this));\r
+ Event.observe(cell, 'mousedown', this.setSelectedRow.bindAsEventListener(this));\r
+ Event.observe(valueDiv, 'mousedown', this.setSelectedRow.bindAsEventListener(this)); \r
+ },\r
+ \r
+ buildCellTable: function() {\r
+ var tbody = this.cellTable.tBodies[0];\r
+ Element.cleanWhitespace(tbody);\r
+ with(this.cellTable){\r
+ border = Grid.options.cellTable.border;\r
+ cellSpacing = Grid.options.cellTable.cellSpacing;\r
+ cellPadding = Grid.options.cellTable.cellPadding;\r
+ }\r
+ this.cssUtil.addClassNames(this.cellTable, 'cellTable');\r
+ this.cssUtil.addClassNames(tbody, 'cellTbody');\r
+ this.element.appendChild(this.cellTable);\r
+ var rows = this.cellTable.rows;\r
+ \r
+ if (!rows || rows.length == 0) {\r
+ for(var i = 0; i < this.rowLength; i++) {\r
+ \r
+ var newRow = this.cellTable.insertRow(i);\r
+ newRow.id = this.rowIdBase + i;\r
+ this.cssUtil.addClassNames(newRow, 'cellRow');\r
+ \r
+ for (var j = 0; j < this.colLength; j++) {\r
+ var newCell = newRow.insertCell(j);\r
+ this.buildCell(newCell, j, "");\r
+ }\r
+ if (this.options.hierarchy) {\r
+ this.setHierarchyRow(newRow);\r
+ }\r
+ } \r
+ \r
+ } else {\r
+ for (var i = 0; i < this.rowLength; i++) {\r
+ var row = rows[i];\r
+ Element.cleanWhitespace(row);\r
+ this.cssUtil.addClassNames(row, 'cellRow');\r
+ row.id = this.rowIdBase + i;\r
+ var cells = row.cells;\r
+\r
+ for (var j = 0; j < cells.length; j++) {\r
+ var cell = cells[j];\r
+ Element.cleanWhitespace(cell);\r
+ this.buildCell(cell, j, Element.collectTextNodes(cell));\r
+ this.removeList.push(cell.firstChild);\r
+ }\r
+ if (this.options.hierarchy) {\r
+ this.setHierarchyRow(row);\r
+ } \r
+ }\r
+ }\r
+ \r
+ with (this.cellTable.style) {\r
+ width = this.options.cellDefaultWidth * this.colLength + 'px';\r
+ position = 'absolute';\r
+ top = parseInt(Element.getStyle(this.baseTable, 'top')) + parseInt(Element.getStyle(this.baseTable, 'height')) + 'px';\r
+ left = parseInt(Element.getStyle(this.baseTable, 'left')) + parseInt(Element.getStyle(this.baseTable, 'width')) + 'px';\r
+ }\r
+ \r
+ this.cellTable.getIdRow = this.getIdRow.bind(this); \r
+ },\r
+\r
+ buildCell : function(cell, cellIdIndex, value) {\r
+\r
+ var cellValueDiv = Builder.node('div');\r
+ cellValueDiv.innerHTML = value;\r
+ \r
+ cell.appendChild(cellValueDiv);\r
+ cell.id = cell.parentNode.id + '_col_' + cellIdIndex;\r
+ \r
+ this.cssUtil.addClassNames(cell, 'cell');\r
+ this.cssUtil.addClassNames(cellValueDiv, 'cellVal');\r
+ \r
+ with (cell.style) {\r
+ width = Element.getStyle(this.getHeaderCell(cell), 'width');\r
+ height = Element.getStyle(this.getIdRow(cell.parentNode).cells[0], 'height');\r
+ } \r
+ with (cellValueDiv.style) {\r
+ width = cell.style.width;\r
+ height = cell.style.height;\r
+ marginTop = '0px';\r
+ marginBottom = '0px';\r
+ }\r
+ \r
+ Event.observe(cell, 'click', this.setSelectedCell.bindAsEventListener(this));\r
+ \r
+ var ajax = new Ajax.InPlaceEditor(cellValueDiv, this.options.cellEditUrl,\r
+ {\r
+ formClassName: this.cssUtil.joinClassNames('inplaceEditor'), \r
+ rows: 2, \r
+ cols:12, \r
+ okButton: false, \r
+ cancelLink:false, \r
+ submitOnBlur:true, \r
+ hoverClassName: "cellHover",\r
+ highlightcolor: "#becfeb",\r
+ highlightendcolor: "#becfeb",\r
+ onComplete: this.showStateDiv.bind(this),\r
+ callback : this.createInplaceEditorParams.bind(this),\r
+ formId : cell.id + '_form'\r
+ }\r
+ );\r
+ cellValueDiv.ajax = ajax;\r
+ Event.stopObserving(cellValueDiv, 'click', ajax.onclickListener);\r
+ Event.stopObserving(cellValueDiv, 'mouseover', ajax.mouseoverListener);\r
+ Event.stopObserving(cellValueDiv, 'mouseout', ajax.mouseoutListener);\r
+ \r
+\r
+ Event.observe(cellValueDiv, 'dblclick', this.setTextAreaSize.bindAsEventListener(this));\r
+ if (this.options.hierarchy && cell.cellIndex == this.hierarchyColIndex) {\r
+ Event.observe(cellValueDiv, 'dblclick', this.hideStateDiv.bindAsEventListener(this));\r
+ }\r
+ Event.observe(cellValueDiv, 'dblclick', ajax.onclickListener);\r
+ \r
+ },\r
+ \r
+ addColumn: function(index, colTitle, values) {\r
+ var headerRow = this.headerTable.rows[0];\r
+ var insertIndex = (!isNaN(index)) ? index : this.colLength;\r
+ var colIdIndex = this.colLength;\r
+ var headerCell = headerRow.insertCell(insertIndex);\r
+ this.buildHeaderCell(headerCell, colTitle, insertIndex);\r
+ \r
+ var rows = this.cellTable.rows;\r
+ var idRows = this.idTable.rows;\r
+ for (var i = 0; i < rows.length; i++) {\r
+ \r
+ var cell = rows[i].insertCell(insertIndex);\r
+ var cellValue = "";\r
+ if (values && values[i]) {\r
+ cellValue = values[i];\r
+ }\r
+ this.buildCell(cell, colIdIndex, cellValue);\r
+ }\r
+ \r
+ this.headerTable.style.width = parseInt(Element.getStyle(this.headerTable, 'width')) + this.options.cellDefaultWidth + 'px';\r
+ this.cellTable.style.width = this.headerTable.style.width;\r
+ \r
+ var sortableOptions = Sortable.options(headerRow);\r
+ \r
+ sortableOptions.draggables.push(\r
+ new Draggable(\r
+ headerCell, \r
+ {\r
+ revert: true,\r
+ constraint: true,\r
+ scroll: this.element,\r
+ handle: Element.getElementsByClassName(headerCell, Grid.className.headerCellDrag)[0]\r
+ }\r
+ )\r
+ );\r
+ Droppables.add(headerCell, {overlap:'horizontal', containment:headerRow, onHover:Sortable.onHover, greedy:true});\r
+ sortableOptions.droppables.push(headerCell); \r
+ this.sortTable.addEvent(Element.getElementsByClassName(headerCell, Grid.className.headerCellSort)[0]);\r
+ this.colLength += 1;\r
+ },\r
+ \r
+ deleteColumn : function(index) {\r
+ if((isNaN(index)) || index >= this.colLength) {\r
+ return;\r
+ }\r
+ var headerRow = this.headerTable.rows[0];\r
+ if (!headerRow) return;\r
+ var headerCell = headerRow.cells[index];\r
+ if (!headerCell) return;\r
+ \r
+ var width = headerCell.offsetWidth;\r
+ var rows = this.cellTable.rows;\r
+ headerRow.deleteCell(index);\r
+ \r
+ for (var i = 0; i < rows.length; i++) {\r
+ rows[i].deleteCell(index);\r
+ }\r
+ \r
+ var headerTableWidth = parseInt(Element.getStyle(this.headerTable, 'width')) - width;\r
+ \r
+ this.headerTable.style.width = headerTableWidth >= 0 ? headerTableWidth + 'px' : '0px';\r
+ this.cellTable.style.width = this.headerTable.style.width;\r
+ this.colLength -= 1;\r
+ this.fixTablePosition();\r
+ },\r
+ \r
+ addRow : function(index, values) {\r
+ var insertIndex = (!isNaN(index)) ? index : this.idTable.rows.length;\r
+ var rowIdIndex = this.idTable.rows.length;\r
+ var idRow = this.idTable.insertRow(index);\r
+ idRow.id = this.rowIdBase + '_id_' + rowIdIndex;\r
+ this.buildIdRow(idRow, rowIdIndex);\r
+ this.updateId();\r
+ \r
+ var cellRow = this.cellTable.insertRow(insertIndex);\r
+ cellRow.id = this.rowIdBase + rowIdIndex;\r
+ this.cssUtil.addClassNames(cellRow, 'cellRow');\r
+ var headerCells = this.headerTable.rows[0].cells;\r
+ \r
+ for (var i = 0; i < headerCells.length; i++) {\r
+ var headerCell = headerCells[i];\r
+ var colIdIndex = headerCell.id.substring(headerCell.id.indexOf('_col_',0) + '_col_'.length);\r
+ var cell = cellRow.insertCell(i);\r
+ var cellValue = (values && values[i]) ? values[i] : "";\r
+ this.buildCell(cell, colIdIndex, cellValue);\r
+ }\r
+\r
+ this.sortTable.defaultOrder.insert(index, cellRow);\r
+ \r
+ var idTbody = this.idTable.tBodies[0];\r
+ var sortableOptions = Sortable.options(idTbody);\r
+ \r
+ sortableOptions.draggables.push(\r
+ new Draggable(\r
+ idRow,\r
+ {\r
+ revert: true,\r
+ constraint: true,\r
+ scroll: this.element,\r
+ handle: Element.getElementsByClassName(idRow, Grid.className.idCellVal)[0]\r
+ }\r
+ )\r
+ );\r
+ Droppables.add(idRow, {overlap:'vertical', containment:idTbody, onHover:Sortable.onHover, greedy:true});\r
+ sortableOptions.droppables.push(idRow); \r
+ this.rowLength += 1;\r
+ return cellRow;\r
+ },\r
+ \r
+ deleteRow : function(index) {\r
+ if(isNaN(index) || index >= this.rowLength) {\r
+ return;\r
+ }\r
+ \r
+ var targetId = null;\r
+ if (this.cellTable.rows[index])\r
+ targetId = this.cellTable.rows[index].id;\r
+ else\r
+ return;\r
+ \r
+ this.sortTable.defaultOrder.reverse();\r
+ var newOrder = new Array();\r
+ \r
+ for (var i = 0; this.sortTable.defaultOrder.length > 0; i++) {\r
+ var row = this.sortTable.defaultOrder.pop();\r
+ if (row.id == targetId) {\r
+ continue;\r
+ }\r
+ newOrder.push(row);\r
+ }\r
+ \r
+ this.sortTable.defaultOrder = newOrder;\r
+ this.idTable.deleteRow(index);\r
+ this.cellTable.deleteRow(index);\r
+ \r
+ this.fixTablePosition();\r
+ this.rowLength -= 1;\r
+ this.updateId();\r
+ },\r
+ \r
+ getHeaderCell : function(cell) {\r
+ return this.headerTable.rows[0].cells[cell.cellIndex];\r
+ },\r
+ \r
+ getCells : function(index) {\r
+ var rows = this.cellTable.rows;\r
+ var columns = new Array();\r
+ for (var i = 0; i < rows.length; i++){\r
+ columns.push(rows[i].cells[index]);\r
+ }\r
+ return columns;\r
+ },\r
+ \r
+ getRow : function(index) {\r
+ return this.cellTable.rows[index];\r
+ },\r
+ \r
+ getIdRow : function(cellRow) {\r
+ var id = cellRow.id;\r
+ var index = id.substring(this.rowIdBase.length);\r
+ var targetRow = $(this.rowIdBase + '_id_' + index);\r
+ return targetRow;\r
+ },\r
+ \r
+ getColTitle : function(index) {\r
+ var headerCell = this.headerTable.rows[0].cells[index];\r
+ var title = Element.collectTextNodes(headerCell);\r
+ return title;\r
+ },\r
+ \r
+ finishSort : function() {\r
+ for (var i = 0; i < this.cellTable.rows.length; i++) {\r
+ this.idTable.tBodies[0].appendChild(this.getIdRow(this.cellTable.rows[i]));\r
+ }\r
+ this.updateId();\r
+ },\r
+ \r
+ setSelectedCell : function(event) {\r
+ this.removeSelectedClasses();\r
+ var src = Event.element(event);\r
+\r
+ if (src.tagName.toUpperCase() != 'TH' && src.tagName.toUpperCase() != 'TD') { \r
+ src = Element.getParentByTagName(['TH,TD'], src);\r
+ } \r
+ \r
+ this.targetCell = src;\r
+ \r
+ if (this.targetCell) {\r
+ this.targetColIndex = this.targetCell.cellIndex;\r
+ this.targetRowIndex = this.targetCell.parentNode.rowIndex;\r
+ this.targetColumn = this.getCells(this.targetColIndex);\r
+ this.targetRow = this.getRow(this.targetRowIndex);\r
+ }\r
+ \r
+ this.cssUtil.addClassNames(this.targetCell, 'cellSelected');\r
+ var childNodes = Element.getTagNodes(this.targetCell, true); \r
+ for (var i = 0; i < childNodes.length; i++) {\r
+ this.cssUtil.addClassNames(childNodes[i], 'cellSelected');\r
+ }\r
+ },\r
+ \r
+ setSelectedColumn : function(event) {\r
+ this.removeSelectedClasses();\r
+ \r
+ this.targetCell = null;\r
+ this.targetRowIndex = null;\r
+ this.targetRow = null;\r
+ this.targetIdRow = null;\r
+ var src = Event.element(event);\r
+ if (src && (src.tagName.toUpperCase() == 'TH' || src.tagName.toUpperCase() == 'TD')) { \r
+ this.targetHeaderCell = src;\r
+ } else {\r
+ this.targetHeaderCell = Element.getParentByTagName(['TH,TD'], src);\r
+ }\r
+ if (this.targetHeaderCell) {\r
+ this.targetColIndex = this.targetHeaderCell.cellIndex;\r
+ this.targetColumn = this.getCells(this.targetColIndex);\r
+ this.cssUtil.addClassNames(this.targetHeaderCell, 'cellSelected');\r
+ var childNodes = Element.getTagNodes(this.targetHeaderCell, true);\r
+ for (var i = 0; i < childNodes.length; i++) {\r
+ this.cssUtil.addClassNames(childNodes[i], 'cellSelected');\r
+ }\r
+ for(var i = 0; i < this.targetColumn.length; i++) {\r
+ this.cssUtil.addClassNames(this.targetColumn[i], 'cellSelected');\r
+ var cellChildNodes = Element.getTagNodes(this.targetColumn[i], true); \r
+ for (var j = 0; j < cellChildNodes.length; j++) {\r
+ this.cssUtil.addClassNames(cellChildNodes.length[j], 'cellSelected');\r
+ }\r
+ }\r
+ }\r
+ },\r
+\r
+ setSelectedRow : function(event) {\r
+ this.removeSelectedClasses();\r
+ var src = Event.element(event);\r
+ if (src && src.tagName.toUpperCase() == 'TR') { \r
+ this.targetIdRow = src;\r
+ } else {\r
+ this.targetIdRow = Element.getParentByTagName(['TR'], src);\r
+ }\r
+ if (this.targetIdRow) {\r
+ this.targetRowIndex = this.targetIdRow.rowIndex;\r
+ this.targetRow = this.getRow(this.targetRowIndex);\r
+ \r
+ this.cssUtil.addClassNames(this.targetRow, 'cellSelected');\r
+ var childNodes = Element.getTagNodes(this.targetRow, true);\r
+ for (var i = 0; i < childNodes.length; i++) {\r
+ this.cssUtil.addClassNames(childNodes[i], 'cellSelected');\r
+ }\r
+ this.cssUtil.addClassNames(this.targetIdRow, 'cellSelected');\r
+ childNodes = Element.getTagNodes(this.targetIdRow, true);\r
+ for (var i = 0; i < childNodes.length; i++) {\r
+ this.cssUtil.addClassNames(childNodes[i], 'cellSelected');\r
+ } \r
+ }\r
+ \r
+ },\r
+ \r
+ removeSelectedClasses : function() {\r
+ if (this.targetHeaderCell) {\r
+ this.cssUtil.removeClassNames(this.targetHeaderCell, 'cellSelected');\r
+ var childNodes = Element.getTagNodes(this.targetHeaderCell, true);\r
+ for (var i = 0; i < childNodes.length; i++) {\r
+ this.cssUtil.removeClassNames(childNodes[i], 'cellSelected');\r
+ }\r
+ for(var i = 0; i < this.targetColumn.length; i++) {\r
+ this.cssUtil.removeClassNames(this.targetColumn[i], 'cellSelected');\r
+ var cellChildNodes = Element.getTagNodes(this.targetColumn[i], true); \r
+ for (var j = 0; j < cellChildNodes.length; j++) {\r
+ this.cssUtil.removeClassNames(cellChildNodes.length[j], 'cellSelected');\r
+ }\r
+ }\r
+ \r
+ }\r
+ if (this.targetCell) {\r
+ this.cssUtil.removeClassNames(this.targetCell, 'cellSelected');\r
+ var childNodes = Element.getTagNodes(this.targetCell, true); \r
+ for (var i = 0; i < childNodes.length; i++) {\r
+ this.cssUtil.removeClassNames(childNodes[i], 'cellSelected');\r
+ }\r
+ \r
+ }\r
+ \r
+ if (this.targetRow) {\r
+ this.cssUtil.removeClassNames(this.targetRow, 'cellSelected');\r
+ var childNodes = Element.getTagNodes(this.targetRow, true);\r
+ for (var i = 0; i < childNodes.length; i++) {\r
+ this.cssUtil.removeClassNames(childNodes[i], 'cellSelected');\r
+ }\r
+ this.cssUtil.removeClassNames(this.targetIdRow, 'cellSelected');\r
+ childNodes = Element.getTagNodes(this.targetIdRow, true);\r
+ for (var i = 0; i < childNodes.length; i++) {\r
+ this.cssUtil.removeClassNames(childNodes[i], 'cellSelected');\r
+ } \r
+ }\r
+ \r
+ this.targetHeaderCell = null;\r
+ this.targetColumn = null;\r
+ this.targetColIndex = null;\r
+ this.targetCell = null;\r
+ this.targetRowIndex = null;\r
+ this.targetRow = null;\r
+ this.targetIdRow = null; \r
+ },\r
+ \r
+ updateId : function() {\r
+ var rows = this.idTable.rows;\r
+ for (var i = 0; i < rows.length; i++) {\r
+ var idValue = document.getElementsByClassName(this.custumCss.idCellVal, rows[i])[0];\r
+ \r
+ idValue.innerHTML = i + 1;\r
+ }\r
+ },\r
+ \r
+ updateRowLine : function(target) {\r
+ var targetCellRow = this.cellTable.rows[this.targetRowIndex];\r
+ var updateRowIndex = this.targetIdRow.rowIndex;\r
+ var cellTableBody = targetCellRow.parentNode;\r
+ var cellTableRows = cellTableBody.rows;\r
+ \r
+ if (this.options.hierarchy) {\r
+ var checkRow = cellTableBody.rows[this.targetIdRow.rowIndex];\r
+ if (this.isParentRow(checkRow, targetCellRow)) {\r
+ var idBody = this.idTable.tBodies[0];\r
+ idBody.insertBefore(this.targetIdRow, idBody.rows[this.targetRowIndex]);\r
+ return;\r
+ }\r
+ }\r
+ if (updateRowIndex == cellTableRows.length - 1) {\r
+ cellTableBody.appendChild(targetCellRow);\r
+ } else if (this.targetRowIndex < updateRowIndex) {\r
+ cellTableBody.insertBefore(targetCellRow, cellTableRows[updateRowIndex + 1]);\r
+ } else {\r
+ cellTableBody.insertBefore(targetCellRow, cellTableRows[updateRowIndex]);\r
+ }\r
+ if (this.options.hierarchy) {\r
+ this.updateOutline(targetCellRow);\r
+ }\r
+ this.targetRowIndex = updateRowIndex;\r
+ this.updateId();\r
+ },\r
+ updateCellLine : function(target){\r
+ var targetCells = this.getCells(this.targetColIndex);\r
+ var updateColIndex = this.targetHeaderCell.cellIndex;\r
+ \r
+ var rows = this.cellTable.rows;\r
+ \r
+ for (var i = 0; i < rows.length; i++) {\r
+ var cells = rows[i].cells;\r
+ var targetCell = targetCells[i];\r
+ \r
+ if (updateColIndex == cells.length -1) {\r
+ rows[i].appendChild(targetCell);\r
+ } else if (this.targetColIndex < updateColIndex) {\r
+ rows[i].insertBefore(targetCell, cells[updateColIndex + 1]);\r
+ } else {\r
+ rows[i].insertBefore(targetCell, cells[updateColIndex]);\r
+ }\r
+ }\r
+ this.targetColIndex = updateColIndex;\r
+ },\r
+ \r
+ updateCellWidth : function(newStyle, headColumn) {\r
+ \r
+ if(newStyle.width > this.options.cellMinWidth) {\r
+ var dragDiv = Element.getElementsByClassName(headColumn, Grid.className.headerCellDrag)[0];\r
+ var sortDiv = Element.getElementsByClassName(headColumn, Grid.className.headerCellSort)[0];\r
+ var val = newStyle.width - (parseInt(Element.getStyle(headColumn, 'width')));\r
+ \r
+ val = parseInt(val);\r
+ \r
+ this.headerTable.style.width = (parseInt(Element.getStyle(this.headerTable, 'width')) + val) + 'px';\r
+ \r
+ dragDiv.style.width = newStyle.width - (this.marginSize * 2) + 'px';\r
+ sortDiv.style.width = parseInt(Element.getStyle(dragDiv, 'width')) - (this.marginSize * 2) + 'px';\r
+ \r
+ var index = headColumn.cellIndex ;\r
+ var rows = this.cellTable.rows;\r
+\r
+ this.cellTable.style.width = this.headerTable.style.width\r
+ \r
+ for(var i = 0; i < rows.length; i++){\r
+ var cell = rows[i].cells[index];\r
+ var cellValueDiv = Element.getElementsByClassName(cell, Grid.className.cellVal)[0];\r
+ cellValueDiv.style.width = newStyle.width + 'px';\r
+ cell.style.width = newStyle.width + 'px';\r
+ }\r
+ \r
+ }\r
+ },\r
+ \r
+ updateCellHeight : function(newStyle, idCell) {\r
+ if(newStyle.height > this.options.cellMinHeight) {\r
+ var row = idCell.parentNode;\r
+ var index = row.rowIndex;\r
+ var idValueDiv = Element.getElementsByClassName(idCell, Grid.className.idCellVal)[0];\r
+ idValueDiv.style.height = newStyle.height - (this.marginSize * 2) + 'px';\r
+ var padding = parseInt(idValueDiv.style.paddingTop);\r
+ var cellRow = this.cellTable.rows[index]; \r
+ var cells = cellRow.cells;\r
+ for (var i = 0; i < cells.length; i++) {\r
+ cells[i].style.height = newStyle.height + 'px';\r
+ var cellValueDiv = Element.getElementsByClassName(cells[i], Grid.className.cellVal)[0];\r
+ cellValueDiv.style.height = newStyle.height + 'px';\r
+ }\r
+ }\r
+ },\r
+ \r
+ setTextAreaSize : function(event) {\r
+ var target = Event.element(event);\r
+ var rows = parseInt(Element.getStyle(target, 'height'));\r
+ var cols = parseInt(Element.getStyle(target, 'width'));\r
+ target.ajax.options.rows = Math.round(rows/20);\r
+ target.ajax.options.cols = Math.round(cols/20);\r
+ },\r
+ \r
+ fixTablePosition : function(event) {\r
+ Grid.scrollTop = this.element.scrollTop;\r
+ Grid.scrollLeft = this.element.scrollLeft;\r
+ this.baseTable.style.top = Grid.scrollTop + 'px';\r
+ this.baseTable.style.left = Grid.scrollLeft + 'px';\r
+ this.headerTable.style.top = Grid.scrollTop + 'px';\r
+ this.idTable.style.left = Grid.scrollLeft + 'px';\r
+ },\r
+ \r
+//----------ajax request param method---------------------------------------------------------------------------\r
+ createInplaceEditorParams : function(form, value) {\r
+ var rowIndexEnd = form.id.indexOf('_col_', 0);\r
+ var rowIndex = form.id.substring(this.rowIdBase.length, rowIndexEnd);\r
+\r
+ var colIndexStart = rowIndexEnd + '_col_'.length;\r
+ var colIndexEnd = form.id.indexOf('_form', 0);\r
+ var colIndex = form.id.substring(colIndexStart, colIndexEnd);\r
+ var jsonRowObj = this.rowDataToJsonObj(rowIndex);\r
+\r
+ var targetColTitle = this.getColTitle(colIndex);\r
+ jsonRowObj.each(function(j) {\r
+ if (j.column == targetColTitle) {\r
+ j.value = value;\r
+ throw $break;\r
+ }\r
+ });\r
+ var jsonRowText = JSON.stringify(jsonRowObj);\r
+ var params = {\r
+ rowData: jsonRowText,\r
+ column: targetColTitle,\r
+ value: value\r
+ };\r
+ return $H(params).toQueryString();\r
+ },\r
+ \r
+ gridDataToJsonObj : function() {\r
+ var rows = this.cellTable.rows;\r
+ var jsonDataList = [];\r
+ for (var i = 0; i < this.rowLength; i++) {\r
+ var rowData = this.rowDataToJsonObj(i);\r
+ jsonDataList.push(rowData);\r
+ }\r
+ return jsonDataList; \r
+ },\r
+ \r
+ rowDataToJsonObj : function(index) {\r
+ var jsonRowObj = [];\r
+ var row = $A(this.cellTable.rows).detect(function(r) {return r.id.getSuffix() == index});\r
+ for (var i = 0; i < this.colLength; i++) {\r
+ var jsonCellObj = {};\r
+ jsonCellObj['column'] = this.getColTitle(i);\r
+ jsonCellObj['value'] = Element.collectTextNodes(row.cells[i]);\r
+ jsonRowObj.push(jsonCellObj);\r
+ }\r
+ return jsonRowObj;\r
+ },\r
+ \r
+ updateGridData : function() {\r
+ \r
+ var jsonDataText = JSON.stringify(this.gridDataToJsonObj());\r
+ var params = 'id=' + encodeURIComponent(this.element.id) + '&data=' + encodeURIComponent(jsonDataText);\r
+\r
+ new Ajax.Updater(\r
+ this.options.updateGridReceiver, \r
+ this.options.updateGridUrl,\r
+ { \r
+ parameters: params, \r
+ evalScripts: true, asynchronous:true\r
+ \r
+ }\r
+ ); \r
+ },\r
+\r
+//----------hierarchy grid method---------------------------------------------------------------------------\r
+ setHierarchyRow : function(row, outlineLevel, outlineNum){\r
+ row.outlineLevel = outlineLevel || 1;\r
+ row.list = row.list || new Array();\r
+ if (row.outlineLevel == 1) {\r
+ this.topLevelList.push(row);\r
+ row.outlineNum = outlineNum || this.topLevelList.length;\r
+ } else {\r
+ var parentRow = this.getParentRow(row);\r
+ parentRow.list.push(row);\r
+ var num = parentRow.length;\r
+ row.outlineNum = outlineNum || parentRow.outlineNum + '.' + parentRow.list.length;\r
+ \r
+ }\r
+ \r
+ this.buildStateDiv(row.cells[this.hierarchyColIndex]);\r
+ this.setOutlineIndent(row);\r
+ this.setFontWeight(row);\r
+ },\r
+ \r
+ buildStateDiv : function (cell) {\r
+ var stateDiv = Builder.node('div');\r
+ var valueDiv = Element.getElementsByClassName(cell, Grid.className.cellVal)[0];\r
+ this.cssUtil.addClassNames(stateDiv, 'state');\r
+ cell.insertBefore(stateDiv, valueDiv);\r
+ \r
+ if (document.all) {\r
+ stateDiv.style.position = "absolute";\r
+ } else {\r
+ stateDiv.style.position = "relative";\r
+ stateDiv.style.cssFloat = "left";\r
+ }\r
+ this.addStateClass(cell, stateDiv);\r
+ Event.observe(stateDiv, 'click', this.toggleState.bindAsEventListener(this));\r
+ },\r
+ \r
+ addStateClass : function (cell, stateDiv) {\r
+ var row = cell.parentNode;\r
+ if (row.list.length == 0) {\r
+ this.cssUtil.addClassNames(stateDiv, 'stateEmpty');\r
+ } else if (this.options.open){\r
+ this.cssUtil.addClassNames(stateDiv, 'stateOpen');\r
+ } else {\r
+ this.cssUtil.addClassNames(stateDiv, 'stateClose');\r
+ this.closeRow(row);\r
+ }\r
+ },\r
+ \r
+ toggleState : function(event) {\r
+ var src = Event.element(event);\r
+ var row = src.parentNode.parentNode;\r
+\r
+ if (!Element.hasClassName(src, Grid.className.stateEmpty)) {\r
+ if (Element.hasClassName(src, Grid.className.stateOpen)) {\r
+ this.closeRow(row.list);\r
+ this.cssUtil.removeClassNames(src, 'stateOpen');\r
+ this.cssUtil.addClassNames(src, 'stateClose');\r
+ } else {\r
+ this.openRow(row.list);\r
+ this.cssUtil.removeClassNames(src, 'stateClose');\r
+ this.cssUtil.addClassNames(src, 'stateOpen');\r
+ }\r
+ }\r
+ },\r
+ \r
+ openRow : function(list) {\r
+ for (var i = 0; i < list.length; i++) {\r
+ var row = list[i];\r
+ Element.show(row);\r
+ Element.show(this.getIdRow(row));\r
+ var stateDiv = Element.getElementsByClassName(row.cells[this.hierarchyColIndex], Grid.className.state)[0];\r
+ if (Element.hasClassName(stateDiv, Grid.className.stateOpen)) {\r
+ this.openRow(row.list)\r
+ }\r
+ }\r
+ },\r
+ \r
+ closeRow : function(list) {\r
+ for (var i = 0; i < list.length; i++) {\r
+ Element.hide(list[i]);\r
+ Element.hide(this.getIdRow(list[i]));\r
+ this.closeRow(list[i].list)\r
+ } \r
+ },\r
+\r
+ \r
+ showStateDiv : function(transport, element) {\r
+ var row = Element.getParentByTagName(['TR'], element);\r
+ var state = Element.getElementsByClassName(row, Grid.className.state)[0];\r
+ Element.show(state); \r
+ },\r
+ \r
+ hideStateDiv : function(event) {\r
+ var src = Event.element(event);\r
+ var row = Element.getParentByTagName(['TR'], src);\r
+ var state = Element.getElementsByClassName(row, Grid.className.state)[0];\r
+ \r
+ Element.hide(state);\r
+ },\r
+ \r
+ addHierarchyRow : function(index, values) {\r
+ if (this.colLength == 0) {\r
+ return;\r
+ }\r
+ var newRow = this.addRow(index, values);\r
+ \r
+ newRow.list = new Array();\r
+ var previousRow = newRow.previousSibling;\r
+ var parentRow = null;\r
+ var parentList = null;\r
+ var insertIndex = 0;\r
+ if (!previousRow) {\r
+ newRow.outlineLevel = 1;\r
+ parentList = this.topLevelList;\r
+ } else if (previousRow.list.length > 0) {\r
+ newRow.outlineLevel = previousRow.outlineLevel + 1;\r
+ parentRow = previousRow;\r
+ parentList = parentRow.list;\r
+ } else {\r
+ newRow.outlineLevel = previousRow.outlineLevel;\r
+ parentRow = this.getParentRow(previousRow);\r
+ parentList = parentRow ? parentRow.list : this.topLevelList;\r
+ insertIndex = parentList.indexOf(previousRow) + 1;\r
+ }\r
+ parentList.insert(insertIndex, newRow);\r
+ this.buildStateDiv(newRow.cells[this.hierarchyColIndex]);\r
+ for (var i = insertIndex; i < parentList.length; i++) {\r
+ if (parentList[i].outlineLevel != 1) {\r
+ parentList[i].outlineNum = parentRow.outlineNum + '.' + (i + 1);\r
+ } else {\r
+ parentList[i].outlineNum = i + 1;\r
+ }\r
+ this.setOutline(parentList[i]);\r
+ } \r
+ \r
+ },\r
+ \r
+ deleteHierarchyRow : function(index) {\r
+ if(isNaN(index) || index >= this.rowLength) {\r
+ return;\r
+ }\r
+ var row = this.getRow(index);\r
+ if (!row) {\r
+ return;\r
+ }\r
+ var parentRow = this.getParentRow(row);\r
+ var parentList = parentRow ? parentRow.list : this.topLevelList;\r
+ var removeIndex = parentList.indexOf(row);\r
+ var childList = row.list;\r
+ \r
+ for (var i = 0; i < childList.length; i++) {\r
+ this.deleteChildRow(childList[i]);\r
+ }\r
+ parentList.remove(removeIndex);\r
+ this.deleteRow(index);\r
+ \r
+ for (var i = removeIndex; i < parentList.length; i++) {\r
+ var updateRow = parentList[i];\r
+ if (updateRow.outlineLevel == 1) {\r
+ updateRow.outlineNum = i + 1;\r
+ } else {\r
+ updateRow.outlineNum = this.getParentRow(updateRow).outlineNum + '.' + (i + 1);\r
+ }\r
+ this.setOutline(parentList[i]);\r
+ }\r
+ this.setFontWeight(parentRow);\r
+ },\r
+ \r
+ deleteChildRow : function(childRow) {\r
+ var list = childRow.list;\r
+ \r
+ for (var i = 0; i < list.length; i++) {\r
+ this.deleteChildRow(list[i]);\r
+ }\r
+ this.deleteRow(childRow.rowIndex);\r
+ }, \r
+ \r
+ levelUp : function(row) {\r
+ if (!row) {\r
+ return;\r
+ }\r
+ var previousRow = row.previousSibling;\r
+ if (row.outlineLevel == 1 || !previousRow) {\r
+ return;\r
+ }\r
+ \r
+ var parentRow = this.getParentRow(row);\r
+ var currentList = parentRow.list;\r
+ \r
+ var newParentRow = this.getParentRow(parentRow);\r
+ var targetList = newParentRow ? newParentRow.list : this.topLevelList;\r
+ \r
+ var currentIndex = currentList.indexOf(row);\r
+ var targetIndex = targetList.indexOf(parentRow) + 1;\r
+\r
+ row.outlineLevel -= 1;\r
+ targetList.insert(targetIndex, row);\r
+ currentList.remove(currentIndex);\r
+ \r
+ while (currentList[currentIndex]) {\r
+ var moveRow = currentList[currentIndex];\r
+ row.list.push(moveRow);\r
+ currentList.remove(currentIndex);\r
+ }\r
+ \r
+ if (row.outlineLevel != 1) {\r
+ row.outlineNum = newParentRow.outlineNum + '.' + (targetIndex + 1);\r
+ } else {\r
+ row.outlineNum = targetIndex + 1;\r
+ }\r
+ \r
+ this.setOutline(row);\r
+\r
+ for (var i = targetIndex + 1; i < targetList.length; i++) {\r
+ if (targetList[i].outlineLevel != 1) {\r
+ targetList[i].outlineNum = newParentRow.outlineNum + '.' + (i + 1);\r
+ } else {\r
+ targetList[i].outlineNum = i + 1;\r
+ }\r
+ this.setOutline(targetList[i]);\r
+ }\r
+\r
+ this.setFontWeight(row);\r
+ this.setFontWeight(parentRow);\r
+ this.setFontWeight(newParentRow); \r
+ this.setStateClass(row);\r
+ this.setStateClass(previousRow);\r
+ },\r
+ \r
+ levelDown : function(row) {\r
+ if (!row) {\r
+ return;\r
+ }\r
+ var previousRow = row.previousSibling;\r
+ var parentRow = this.getParentRow(row);\r
+ if (!previousRow || parentRow == previousRow) {\r
+ return;\r
+ }\r
+ var currentList = (row.outlineLevel == 1) ? this.topLevelList : parentRow.list;\r
+ var currentIndex = currentList.indexOf(row);\r
+ \r
+ row.outlineLevel += 1;\r
+ \r
+ var newParentRow = this.getParentRow(row);\r
+ var targetList = newParentRow.list;\r
+ var targetIndex = targetList.length;\r
+ \r
+ currentList.remove(currentIndex);\r
+ targetList.push(row);\r
+ \r
+ row.outlineNum = newParentRow.outlineNum + '.' + (targetIndex + 1);\r
+ this.setOutline(row);\r
+ for (var i = currentIndex; i < currentList.length; i++) {\r
+ if (currentList[i].outlineLevel != 1) {\r
+ currentList[i].outlineNum = parentRow.outlineNum + '.' + (i + 1);\r
+ } else {\r
+ currentList[i].outlineNum = i + 1;\r
+ }\r
+ this.setOutline(currentList[i]);\r
+ }\r
+ \r
+ for (var i = targetIndex + 1; i < targetList.length; i++) {\r
+ targetList[i].outlineNum = newParentRow.outlineNum + '.' + (i + 1);\r
+ this.setOutline(targetList[i]);\r
+ }\r
+ \r
+ this.setFontWeight(row);\r
+ this.setFontWeight(parentRow);\r
+ this.setFontWeight(newParentRow);\r
+ this.setStateClass(row);\r
+ this.setStateClass(previousRow);\r
+ \r
+ },\r
+ \r
+ setStateClass : function(row) {\r
+ if (!row.list) return; \r
+ var stateDiv = Element.getElementsByClassName(row.cells[this.hierarchyColIndex], Grid.className.state)[0];\r
+ \r
+ if (Element.hasClassName(stateDiv, Grid.className.stateEmpty) && row.list.length > 0) {\r
+ this.cssUtil.removeClassNames(stateDiv, 'stateEmpty');\r
+ this.cssUtil.addClassNames(stateDiv, 'stateOpen');\r
+ } else if (!Element.hasClassName(stateDiv, Grid.className.stateEmpty) && row.list.length == 0) {\r
+ this.cssUtil.removeClassNames(stateDiv, 'stateOpen');\r
+ this.cssUtil.addClassNames(stateDiv, 'stateEmpty');\r
+ }\r
+ },\r
+ \r
+ setOutline : function(row) {\r
+ var childList = row.list;\r
+ if (!childList) return;\r
+ for(var i = 0; i < childList.length; i++) {\r
+ var childRow = childList[i];\r
+ childRow.outlineLevel = row.outlineLevel + 1;\r
+ childRow.outlineNum = row.outlineNum + '.' + (i + 1);\r
+ this.setOutline(childRow);\r
+ }\r
+ this.setOutlineIndent(row); \r
+ },\r
+ \r
+ setOutlineIndent : function(row) {\r
+ var cell = row.cells[this.hierarchyColIndex];\r
+ if (!cell) {\r
+ return;\r
+ }\r
+ var cellValueDiv = Element.getElementsByClassName(cell, Grid.className.cellVal)[0];\r
+ var stateDiv = Element.getElementsByClassName(cell, Grid.className.state)[0];\r
+ if (!stateDiv) return;\r
+ var stateDivWidth = stateDiv.offsetWidth || this.stateDivWidth;\r
+ var left = this.options.hierarchyIndent * (row.outlineLevel - 1);\r
+ var valueLeft = document.all ? left + stateDivWidth : left;\r
+ cellValueDiv.style.left = valueLeft + 'px';\r
+ stateDiv.style.left = left + 'px';\r
+ },\r
+ \r
+ setFontWeight : function(row) {\r
+ if (row) {\r
+ if (!row.list) return;\r
+ if (row.list.length > 0){\r
+ row.style.fontWeight = 'bold';\r
+ } else {\r
+ row.style.fontWeight = 'normal'; \r
+ }\r
+ }\r
+ },\r
+ \r
+ updateOutline : function(row) {\r
+ var previousRow = row.previousSibling;\r
+ var newParentRow = null;\r
+ var insertIndex = 0;\r
+ var newParentList = null;\r
+ \r
+ if (!previousRow.list) return;\r
+ if (!previousRow) {\r
+ newParentList = this.topLevelList;\r
+ }else if(previousRow.list.length > 0) {\r
+ newParentRow = previousRow;\r
+ newParentList = newParentRow.list;\r
+ } else {\r
+ newParentRow = this.getParentRow(previousRow);\r
+ newParentList = newParentRow ? newParentRow.list : this.topLevelList;\r
+ insertIndex = newParentList.indexOf(previousRow) + 1;\r
+ }\r
+ var parentRow = this.getParentRowByIndex(row, this.targetRowIndex);\r
+ var parentList = null;\r
+\r
+ var outlineNumBase = '';\r
+ if (parentRow) {\r
+ parentList = parentRow.list;\r
+ outlineNumBase = parentRow.outlineNum + '.';\r
+ } else {\r
+ parentList = this.topLevelList;\r
+ if (!parentList) return;\r
+ }\r
+ var removeIndex = parentList.indexOf(row);\r
+ \r
+ if (parentList == newParentList && removeIndex < insertIndex) { \r
+ insertIndex -= 1;\r
+ parentList.remove(removeIndex);\r
+ parentList.insert(insertIndex, row);\r
+ for (var i = removeIndex; i < parentList.length; i++) {\r
+ try {\r
+ parentList[i].outlineNum = outlineNumBase + (i + 1);\r
+ this.setOutline(parentList[i]); \r
+ } catch (e) {}\r
+ }\r
+ \r
+ } else {\r
+ parentList.remove(removeIndex);\r
+ newParentList.insert(insertIndex, row);\r
+ for (var i = removeIndex; i < parentList.length; i++) {\r
+ parentList[i].outlineNum = outlineNumBase + (i + 1);\r
+ this.setOutline(parentList[i]); \r
+ }\r
+ var newOutlineNumBase = newParentRow ? newParentRow.outlineNum + '.' : '';\r
+ var newOutlineLevelBase = newParentRow ? newParentRow.outlineLevel : 0;\r
+ row.outlineNum = newOutlineNumBase + (insertIndex + 1);\r
+ row.outlineLevel = newOutlineLevelBase + 1;\r
+ for (var i = insertIndex; i < newParentList.length; i++) {\r
+ newParentList[i].outlineNum = newOutlineNumBase + (i + 1);\r
+ this.setOutline(newParentList[i]);\r
+ }\r
+ this.setOutline(row); \r
+ }\r
+ this.setFontWeight(row);\r
+ this.setStateClass(row);\r
+ if (parentRow) {\r
+ this.setFontWeight(parentRow);\r
+ this.setStateClass(parentRow);\r
+ }\r
+ if (newParentRow) {\r
+ this.setFontWeight(newParentRow);\r
+ this.setStateClass(newParentRow);\r
+ }\r
+ this.updateHierarchyRowLine(row);\r
+ },\r
+ \r
+ updateHierarchyRowLine : function(row, existingRow) {\r
+ if (!row.list) return;\r
+ var rowIndex = row.rowIndex;\r
+ var cellBody = this.cellTable.tBodies[0];\r
+ var idBody = this.idTable.tBodies[0];\r
+ if (!existingRow) {\r
+ existingRow = cellBody.rows[rowIndex + 1]\r
+ }\r
+ \r
+ for (var i = 0; i < row.list.length; i++) {\r
+ if (!existingRow) {\r
+ cellBody.appendChild(row.list[i]);\r
+ idBody.appendChild(this.getIdRow(row.list[i]));\r
+ } else {\r
+ cellBody.insertBefore(row.list[i], existingRow);\r
+ idBody.insertBefore(this.getIdRow(row.list[i]), this.getIdRow(existingRow));\r
+ }\r
+ this.updateHierarchyRowLine(row.list[i], existingRow);\r
+ }\r
+ },\r
+ \r
+ getParentRow : function(row) {\r
+ if (row.outlineLevel == 1) {\r
+ return null;\r
+ }\r
+\r
+ var previousRow = row.previousSibling;\r
+ if (!previousRow) {\r
+ return null;\r
+ }\r
+ try {\r
+ while (previousRow.outlineLevel != (row.outlineLevel - 1)) {\r
+ previousRow = previousRow.previousSibling;\r
+ }\r
+ return previousRow;\r
+ } catch (e) {}\r
+ },\r
+ \r
+ getParentRowByIndex : function(row, index) {\r
+ if (row.outlineLevel == 1) {\r
+ return null;\r
+ }\r
+ if (this.targetRowIndex) {\r
+ for(var i = 0; i < this.targetRowIndex + 1; i++) {\r
+ if (!this.cellTable.rows[i].list) return;\r
+ if (this.cellTable.rows[i].list.indexOf(row) != -1) {\r
+ return this.cellTable.rows[i];\r
+ }\r
+ }\r
+ }\r
+ return null;\r
+ },\r
+ \r
+ getPreviousRootRow : function(row) {\r
+ var previousRow = row.previousSibling;\r
+ if (!previousRow) {\r
+ return;\r
+ }\r
+ while (previousRow.outlineLevel != 1) {\r
+ previousRow = previousRow.previousSibling;\r
+ } \r
+ \r
+ return previousRow;\r
+ },\r
+ \r
+ isParentRow : function(row, parentRow) {\r
+ var temp = this.getParentRow(row);\r
+ if (!temp) {\r
+ return false;\r
+ } else if (temp == parentRow) {\r
+ return true;\r
+ } else {\r
+ return this.isParentRow(temp, parentRow);\r
+ }\r
+ }\r
+}\r
-// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)
-//
-// This code is substantially based on code from Thomas Fakes(http://craz8.com)
-// which has the following copyright and permission notice
-//
-// Copyright (c) 2005 Thomas Fakes (http://craz8.com)
-//
-// This code is substantially based on code from script.aculo.us which has the
-// following copyright and permission notice
-//
-// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-ResizeableGridEx = Class.create();
-Object.extend(Object.extend(ResizeableGridEx.prototype, Resizeable.prototype), {
-
- draw: function(event) {
-
- var pointer = [Event.pointerX(event), Event.pointerY(event)];
- var style = this.element.style;
- var newHeight = 0;
- var newWidth = 0;
- var newTop = 0;
- var newLeft = 0;
- if (this.currentDirection.indexOf('n') != -1) {
- var pointerMoved = this.startY - pointer[1];
- var margin = Element.getStyle(this.element, 'margin-top') || "0";
- newHeight = this.startHeight + pointerMoved;
- newTop = (this.startTop - pointerMoved - parseInt(margin)) + "px";
- }
- if (this.currentDirection.indexOf('w') != -1) {
- var pointerMoved = this.startX - pointer[0];
- var margin = Element.getStyle(this.element, 'margin-left') || "0";
- newWidth = this.startWidth + pointerMoved;
- newLeft = (this.startLeft - pointerMoved - parseInt(margin)) + "px";
- }
- if (this.currentDirection.indexOf('s') != -1) {
- newHeight = this.startHeight + pointer[1] - this.startY;
- }
- if (this.currentDirection.indexOf('e') != -1) {
- newWidth = this.startWidth + pointer[0] - this.startX;
- }
- var newStyle = {
- height: newHeight,
- width: newWidth,
- top: newTop,
- left: newLeft
- }
- if (this.options.draw) {
- this.options.draw(newStyle, this.element);
- }
-
- if (newHeight && newHeight > this.options.minHeight) {
-
- style.top = newStyle.top;
-
- style.height = newStyle.height + "px";
-
- }
- if (newWidth && newWidth > this.options.minWidth) {
-
- style.left = newStyle.left;
- style.width = newStyle.width + "px";
-
-
- }
- if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering
- },
-
- directions: function(event) {
- var pointer = [Event.pointerX(event) + Grid.scrollLeft, Event.pointerY(event) + Grid.scrollTop];
- //var pointer = [Event.pointerX(event), Event.pointerY(event)];
- var offsets = Position.cumulativeOffset(this.element);
- var cursor = '';
- if (this.between(pointer[1] - offsets[1], 0, this.options.top)) cursor += 'n';
- if (this.between((offsets[1] + this.element.offsetHeight) - pointer[1], 0, this.options.bottom)) cursor += 's';
- if (this.between(pointer[0] - offsets[0], 0, this.options.left)) cursor += 'w';
- if (this.between((offsets[0] + this.element.offsetWidth) - pointer[0], 0, this.options.right)) cursor += 'e';
-
- return cursor;
- }
-});
+// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// This code is substantially based on code from Thomas Fakes(http://craz8.com) \r
+// which has the following copyright and permission notice\r
+// \r
+// Copyright (c) 2005 Thomas Fakes (http://craz8.com)\r
+// \r
+// This code is substantially based on code from script.aculo.us which has the \r
+// following copyright and permission notice\r
+//\r
+// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+ResizeableGridEx = Class.create();\r
+Object.extend(Object.extend(ResizeableGridEx.prototype, Resizeable.prototype), {\r
+\r
+ draw: function(event) {\r
+ \r
+ var pointer = [Event.pointerX(event), Event.pointerY(event)];\r
+ var style = this.element.style;\r
+ var newHeight = 0;\r
+ var newWidth = 0;\r
+ var newTop = 0;\r
+ var newLeft = 0;\r
+ if (this.currentDirection.indexOf('n') != -1) {\r
+ var pointerMoved = this.startY - pointer[1];\r
+ var margin = Element.getStyle(this.element, 'margin-top') || "0";\r
+ newHeight = this.startHeight + pointerMoved;\r
+ newTop = (this.startTop - pointerMoved - parseInt(margin)) + "px";\r
+ }\r
+ if (this.currentDirection.indexOf('w') != -1) {\r
+ var pointerMoved = this.startX - pointer[0];\r
+ var margin = Element.getStyle(this.element, 'margin-left') || "0";\r
+ newWidth = this.startWidth + pointerMoved;\r
+ newLeft = (this.startLeft - pointerMoved - parseInt(margin)) + "px";\r
+ }\r
+ if (this.currentDirection.indexOf('s') != -1) {\r
+ newHeight = this.startHeight + pointer[1] - this.startY;\r
+ }\r
+ if (this.currentDirection.indexOf('e') != -1) {\r
+ newWidth = this.startWidth + pointer[0] - this.startX;\r
+ }\r
+ var newStyle = {\r
+ height: newHeight,\r
+ width: newWidth,\r
+ top: newTop,\r
+ left: newLeft\r
+ }\r
+ if (this.options.draw) {\r
+ this.options.draw(newStyle, this.element);\r
+ }\r
+ \r
+ if (newHeight && newHeight > this.options.minHeight) {\r
+\r
+ style.top = newStyle.top;\r
+ \r
+ style.height = newStyle.height + "px";\r
+ \r
+ }\r
+ if (newWidth && newWidth > this.options.minWidth) {\r
+ \r
+ style.left = newStyle.left;\r
+ style.width = newStyle.width + "px";\r
+ \r
+\r
+ }\r
+ if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering\r
+ },\r
+\r
+ directions: function(event) {\r
+ var pointer = [Event.pointerX(event) + Grid.scrollLeft, Event.pointerY(event) + Grid.scrollTop];\r
+ //var pointer = [Event.pointerX(event), Event.pointerY(event)]; \r
+ var offsets = Position.cumulativeOffset(this.element);\r
+ var cursor = '';\r
+ if (this.between(pointer[1] - offsets[1], 0, this.options.top)) cursor += 'n';\r
+ if (this.between((offsets[1] + this.element.offsetHeight) - pointer[1], 0, this.options.bottom)) cursor += 's';\r
+ if (this.between(pointer[0] - offsets[0], 0, this.options.left)) cursor += 'w';\r
+ if (this.between((offsets[0] + this.element.offsetWidth) - pointer[0], 0, this.options.right)) cursor += 'e';\r
+ \r
+ return cursor;\r
+ }\r
+});\r
-// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-
-SortableTableGridEx = Class.create();
-Object.extend(Object.extend(SortableTableGridEx.prototype, SortableTable.prototype), {
-
- initialize: function(element) {
- this.element = $(element);
- Element.setStyle(this.element, {visibility: 'hidden'});
-
- var options = Object.extend({
- ascImg: false,
- descImg: false,
- handle: false,
- callBack: false
- }, arguments[1] || {});
- this.options = options;
-
- this.handle = options.handle ? $(options.handle) : this.element.rows[0];
- this.ascImg = options.ascImg ? options.ascImg : 'images/spinelz/sortableTable_down.gif';
- this.descImg = options.descImg ? options.descImg : 'images/spinelz/sortableTable_up.gif';
- this.sortType = options.sortType;
-
- this.currentOrder = 'default';
- this.defaultOrder = new Array();
- for (var i = 0; i < this.element.rows.length; i++) {
- this.defaultOrder[i] = this.element.rows[i];
- }
- this.addEvents();
- Element.setStyle(this.element, {visibility: 'visible'});
- },
-
- addEvents: function() {
- var rows = this.handle.rows[0];
- if (!rows) return;
-
- for (var i = 0; i < rows.cells.length; i++) {
- Element.cleanWhitespace(rows.cells[i]);
- Element.cleanWhitespace(rows.cells[i].firstChild);
- this.addEvent(rows.cells[i].firstChild.firstChild);
- }
- },
-
- addEvent: function(handle) {
- if (handle) {
- handle.style.cursor = 'pointer';
- Event.observe(handle, 'click', this.sortTable.bindAsEventListener(this));
- }
- },
-
- sortTable: function(event) {
- var target = Event.element(event);
- if (target.tagName.toUpperCase() == 'IMG') {
- target = target.parentNode;
- }
- var cell = target;
- if (cell.tagName.toUpperCase() != 'TD' && cell.tagName.toUpperCase() != 'TH') {
- cell = Element.getParentByTagName(['TD','TH'], cell);
- }
- var tmpColumn = cell.cellIndex;
- if (this.targetColumn != tmpColumn) {
- this.currentOrder = 'default';
- }
- this.targetColumn = tmpColumn;
-
- var newRows = new Array();
- for (var i = 0; i < this.element.rows.length; i++) {
- newRows[i] = this.element.rows[i];
- }
- if (newRows.length < 1) return;
-
- if (this.currentOrder == 'default') {
- newRows.sort(this.getSortFunc());
- this.currentOrder = 'asc';
-
- } else if (this.currentOrder == 'asc') {
- newRows = newRows.reverse();
- this.currentOrder = 'desc';
- } else if (this.currentOrder == 'desc') {
- newRows = this.defaultOrder;
- this.currentOrder = 'default';
- }
-
- for (var i = 0; i < newRows.length; i++) {
- this.element.tBodies[0].appendChild(newRows[i]);
- }
-
- this.mark(target);
- if (this.options.callBack) this.options.callBack(this.element);
- },
-
- mark: function(cell) {
- var row = this.options.handle ? this.options.handle.rows[0] : this.element.rows[0];
-
- var imgs = row.getElementsByTagName('IMG');
-
- for (var i = 0; i < imgs.length; i++){
- var parent = imgs[i].parentNode;
- parent.removeChild(imgs[i]);
- }
- var imgFile;
- if (this.currentOrder == 'asc') imgFile = this.ascImg;
- else if (this.currentOrder == 'desc') imgFile = this.descImg;
-
- if (imgFile)
- cell.appendChild(Builder.node('IMG', {src: imgFile, alt: 'sortImg'}));
- }
-
-});
-
+// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+\r
+SortableTableGridEx = Class.create();\r
+Object.extend(Object.extend(SortableTableGridEx.prototype, SortableTable.prototype), {\r
+\r
+ initialize: function(element) {\r
+ this.element = $(element);\r
+ Element.setStyle(this.element, {visibility: 'hidden'});\r
+\r
+ var options = Object.extend({\r
+ ascImg: false,\r
+ descImg: false,\r
+ handle: false,\r
+ callBack: false\r
+ }, arguments[1] || {});\r
+ this.options = options;\r
+ \r
+ this.handle = options.handle ? $(options.handle) : this.element.rows[0];\r
+ this.ascImg = options.ascImg ? options.ascImg : 'images/spinelz/sortableTable_down.gif';\r
+ this.descImg = options.descImg ? options.descImg : 'images/spinelz/sortableTable_up.gif';\r
+ this.sortType = options.sortType;\r
+ \r
+ this.currentOrder = 'default';\r
+ this.defaultOrder = new Array();\r
+ for (var i = 0; i < this.element.rows.length; i++) {\r
+ this.defaultOrder[i] = this.element.rows[i];\r
+ } \r
+ this.addEvents();\r
+ Element.setStyle(this.element, {visibility: 'visible'});\r
+ },\r
+ \r
+ addEvents: function() {\r
+ var rows = this.handle.rows[0];\r
+ if (!rows) return;\r
+ \r
+ for (var i = 0; i < rows.cells.length; i++) {\r
+ Element.cleanWhitespace(rows.cells[i]);\r
+ Element.cleanWhitespace(rows.cells[i].firstChild);\r
+ this.addEvent(rows.cells[i].firstChild.firstChild); \r
+ }\r
+ },\r
+ \r
+ addEvent: function(handle) {\r
+ if (handle) {\r
+ handle.style.cursor = 'pointer';\r
+ Event.observe(handle, 'click', this.sortTable.bindAsEventListener(this));\r
+ }\r
+ },\r
+ \r
+ sortTable: function(event) {\r
+ var target = Event.element(event);\r
+ if (target.tagName.toUpperCase() == 'IMG') {\r
+ target = target.parentNode;\r
+ }\r
+ var cell = target;\r
+ if (cell.tagName.toUpperCase() != 'TD' && cell.tagName.toUpperCase() != 'TH') {\r
+ cell = Element.getParentByTagName(['TD','TH'], cell);\r
+ }\r
+ var tmpColumn = cell.cellIndex;\r
+ if (this.targetColumn != tmpColumn) {\r
+ this.currentOrder = 'default';\r
+ }\r
+ this.targetColumn = tmpColumn;\r
+ \r
+ var newRows = new Array();\r
+ for (var i = 0; i < this.element.rows.length; i++) {\r
+ newRows[i] = this.element.rows[i];\r
+ }\r
+ if (newRows.length < 1) return;\r
+ \r
+ if (this.currentOrder == 'default') {\r
+ newRows.sort(this.getSortFunc());\r
+ this.currentOrder = 'asc';\r
+ \r
+ } else if (this.currentOrder == 'asc') {\r
+ newRows = newRows.reverse();\r
+ this.currentOrder = 'desc';\r
+ } else if (this.currentOrder == 'desc') {\r
+ newRows = this.defaultOrder;\r
+ this.currentOrder = 'default';\r
+ }\r
+ \r
+ for (var i = 0; i < newRows.length; i++) {\r
+ this.element.tBodies[0].appendChild(newRows[i]);\r
+ }\r
+ \r
+ this.mark(target);\r
+ if (this.options.callBack) this.options.callBack(this.element); \r
+ },\r
+ \r
+ mark: function(cell) {\r
+ var row = this.options.handle ? this.options.handle.rows[0] : this.element.rows[0];\r
+ \r
+ var imgs = row.getElementsByTagName('IMG');\r
+\r
+ for (var i = 0; i < imgs.length; i++){\r
+ var parent = imgs[i].parentNode;\r
+ parent.removeChild(imgs[i]);\r
+ }\r
+ var imgFile;\r
+ if (this.currentOrder == 'asc') imgFile = this.ascImg;\r
+ else if (this.currentOrder == 'desc') imgFile = this.descImg;\r
+ \r
+ if (imgFile)\r
+ cell.appendChild(Builder.node('IMG', {src: imgFile, alt: 'sortImg'}));\r
+ } \r
+\r
+});\r
+\r
-// Copyright (c) 2006 spinelz.org (http://script.spinelz.org/)
-//
-// This code is substantially based on code from script.aculo.us which has the
-// following copyright and permission notice
-//
-// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-InPlaceEditorEx = Class.create();
-Object.extend(Object.extend(InPlaceEditorEx.prototype, Ajax.InPlaceEditor.prototype), {
- /*********************************************
- * Edit
- * The URL option is unnecessary because
- * of updating without Ajax.
- *********************************************
- initialize: function(element, url, options) {
- this.url = url;
- *********************************************/
- initialize: function(element, options) {
- /*********************************************/
- this.element = $(element);
-
- this.options = Object.extend({
- okButton: true,
- okText: "ok",
- cancelLink: true,
- cancelText: "cancel",
- savingText: "Saving...",
- clickToEditText: "Click to edit",
- okText: "ok",
- rows: 1,
- onComplete: function(transport, element) {
- new Effect.Highlight(element, {startcolor: this.options.highlightcolor});
- },
- onFailure: function(transport) {
- alert("Error communicating with the server: " + transport.responseText.stripTags());
- },
- callback: function(form) {
- return Form.serialize(form);
- },
- handleLineBreaks: true,
- loadingText: 'Loading...',
- savingClassName: 'inplaceeditor-saving',
- loadingClassName: 'inplaceeditor-loading',
- formClassName: 'inplaceeditor-form',
- highlightcolor: Ajax.InPlaceEditor.defaultHighlightColor,
- highlightendcolor: "#FFFFFF",
- externalControl: null,
- submitOnBlur: false,
- ajaxOptions: {},
- evalScripts: false
- }, options || {});
-
- if(!this.options.formId && this.element.id) {
- this.options.formId = this.element.id + "-inplaceeditor";
- if ($(this.options.formId)) {
- // there's already a form with that name, don't specify an id
- this.options.formId = null;
- }
- }
-
- if (this.options.externalControl) {
- this.options.externalControl = $(this.options.externalControl);
- }
-
- this.originalBackground = Element.getStyle(this.element, 'background-color');
- if (!this.originalBackground) {
- this.originalBackground = "transparent";
- }
-
- this.element.title = this.options.clickToEditText;
-
- /*********************************************
- * Edit
- * The event to enter edit mode is changed
- * from single-click to double-click.
- *********************************************
- this.onclickListener = this.enterEditMode.bindAsEventListener(this);
- this.mouseoverListener = this.enterHover.bindAsEventListener(this);
- this.mouseoutListener = this.leaveHover.bindAsEventListener(this);
- Event.observe(this.element, 'click', this.onclickListener);
- Event.observe(this.element, 'mouseover', this.mouseoverListener);
- Event.observe(this.element, 'mouseout', this.mouseoutListener);
- if (this.options.externalControl) {
- Event.observe(this.options.externalControl, 'click', this.onclickListener);
- Event.observe(this.options.externalControl, 'mouseover', this.mouseoverListener);
- Event.observe(this.options.externalControl, 'mouseout', this.mouseoutListener);
- }
- *********************************************/
- this.ondblclickListener = this.enterEditMode.bindAsEventListener(this);
- this.mouseoverListener = this.enterHover.bindAsEventListener(this);
- this.mouseoutListener = this.leaveHover.bindAsEventListener(this);
- Event.observe(this.element, 'dblclick', this.ondblclickListener);
- Event.observe(this.element, 'mouseover', this.mouseoverListener);
- Event.observe(this.element, 'mouseout', this.mouseoutListener);
- if (this.options.externalControl) {
- Event.observe(this.options.externalControl, 'dblclick', this.ondblclickListener);
- Event.observe(this.options.externalControl, 'mouseover', this.mouseoverListener);
- Event.observe(this.options.externalControl, 'mouseout', this.mouseoutListener);
- }
- /*********************************************/
- },
- getText: function() {
- return this.element.innerHTML.unescapeHTML();
- },
- onSubmit: function() {
- var value = this.editField.value.escapeHTML();
- if(value == '') {
- this.onclickCancel();
- return false;
- } else {
- this.onLoading();
- this.element.innerHTML = value;
- new InPlaceEditorEx(this.element.id, this.options);
- return true;
- }
- },
- removeForm: function() {
- if(this.form) {
- if(this.form.parentNode) {
- var childNodes = this.form.parentNode.childNodes;
- for(var i = 0; i < childNodes.length; i++) {
- childNodes[i].data = '';
- }
- Element.remove(this.form);
- }
- this.form = null;
- }
- }
-});
+// Copyright (c) 2006 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// This code is substantially based on code from script.aculo.us which has the \r
+// following copyright and permission notice\r
+//\r
+// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+InPlaceEditorEx = Class.create();\r
+Object.extend(Object.extend(InPlaceEditorEx.prototype, Ajax.InPlaceEditor.prototype), {\r
+ /*********************************************\r
+ * Edit\r
+ * The URL option is unnecessary because\r
+ * of updating without Ajax.\r
+ *********************************************\r
+ initialize: function(element, url, options) {\r
+ this.url = url;\r
+ *********************************************/\r
+ initialize: function(element, options) {\r
+ /*********************************************/\r
+ this.element = $(element);\r
+\r
+ this.options = Object.extend({\r
+ okButton: true,\r
+ okText: "ok",\r
+ cancelLink: true,\r
+ cancelText: "cancel",\r
+ savingText: "Saving...",\r
+ clickToEditText: "Click to edit",\r
+ okText: "ok",\r
+ rows: 1,\r
+ onComplete: function(transport, element) {\r
+ new Effect.Highlight(element, {startcolor: this.options.highlightcolor});\r
+ },\r
+ onFailure: function(transport) {\r
+ alert("Error communicating with the server: " + transport.responseText.stripTags());\r
+ },\r
+ callback: function(form) {\r
+ return Form.serialize(form);\r
+ },\r
+ handleLineBreaks: true,\r
+ loadingText: 'Loading...',\r
+ savingClassName: 'inplaceeditor-saving',\r
+ loadingClassName: 'inplaceeditor-loading',\r
+ formClassName: 'inplaceeditor-form',\r
+ highlightcolor: Ajax.InPlaceEditor.defaultHighlightColor,\r
+ highlightendcolor: "#FFFFFF",\r
+ externalControl: null,\r
+ submitOnBlur: false,\r
+ ajaxOptions: {},\r
+ evalScripts: false\r
+ }, options || {});\r
+\r
+ if(!this.options.formId && this.element.id) {\r
+ this.options.formId = this.element.id + "-inplaceeditor";\r
+ if ($(this.options.formId)) {\r
+ // there's already a form with that name, don't specify an id\r
+ this.options.formId = null;\r
+ }\r
+ }\r
+ \r
+ if (this.options.externalControl) {\r
+ this.options.externalControl = $(this.options.externalControl);\r
+ }\r
+ \r
+ this.originalBackground = Element.getStyle(this.element, 'background-color');\r
+ if (!this.originalBackground) {\r
+ this.originalBackground = "transparent";\r
+ }\r
+ \r
+ this.element.title = this.options.clickToEditText;\r
+ \r
+ /*********************************************\r
+ * Edit\r
+ * The event to enter edit mode is changed\r
+ * from single-click to double-click.\r
+ *********************************************\r
+ this.onclickListener = this.enterEditMode.bindAsEventListener(this);\r
+ this.mouseoverListener = this.enterHover.bindAsEventListener(this);\r
+ this.mouseoutListener = this.leaveHover.bindAsEventListener(this);\r
+ Event.observe(this.element, 'click', this.onclickListener);\r
+ Event.observe(this.element, 'mouseover', this.mouseoverListener);\r
+ Event.observe(this.element, 'mouseout', this.mouseoutListener);\r
+ if (this.options.externalControl) {\r
+ Event.observe(this.options.externalControl, 'click', this.onclickListener);\r
+ Event.observe(this.options.externalControl, 'mouseover', this.mouseoverListener);\r
+ Event.observe(this.options.externalControl, 'mouseout', this.mouseoutListener);\r
+ }\r
+ *********************************************/\r
+ this.ondblclickListener = this.enterEditMode.bindAsEventListener(this);\r
+ this.mouseoverListener = this.enterHover.bindAsEventListener(this);\r
+ this.mouseoutListener = this.leaveHover.bindAsEventListener(this);\r
+ Event.observe(this.element, 'dblclick', this.ondblclickListener);\r
+ Event.observe(this.element, 'mouseover', this.mouseoverListener);\r
+ Event.observe(this.element, 'mouseout', this.mouseoutListener);\r
+ if (this.options.externalControl) {\r
+ Event.observe(this.options.externalControl, 'dblclick', this.ondblclickListener);\r
+ Event.observe(this.options.externalControl, 'mouseover', this.mouseoverListener);\r
+ Event.observe(this.options.externalControl, 'mouseout', this.mouseoutListener);\r
+ }\r
+ /*********************************************/\r
+ },\r
+ getText: function() {\r
+ return this.element.innerHTML.unescapeHTML();\r
+ },\r
+ onSubmit: function() {\r
+ var value = this.editField.value.escapeHTML();\r
+ if(value == '') {\r
+ this.onclickCancel();\r
+ return false;\r
+ } else {\r
+ this.onLoading();\r
+ this.element.innerHTML = value;\r
+ new InPlaceEditorEx(this.element.id, this.options);\r
+ return true;\r
+ }\r
+ },\r
+ removeForm: function() {\r
+ if(this.form) {\r
+ if(this.form.parentNode) {\r
+ var childNodes = this.form.parentNode.childNodes;\r
+ for(var i = 0; i < childNodes.length; i++) {\r
+ childNodes[i].data = '';\r
+ }\r
+ Element.remove(this.form);\r
+ }\r
+ this.form = null;\r
+ }\r
+ }\r
+});\r
-// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-var MenuBar = Class.create();
-MenuBar.cssNames = {
- container: 'menubar',
- menu: 'menubar_menu',
- menuBody: 'menubar_menuBody',
- menuBodyHover: 'menubar_menuBodyHover',
- subMenu: 'menubar_subMenu',
- subMenuBody: 'menubar_subMenuBody',
- subMenuBodyHover: 'menubar_subMenuBodyHover',
- subMenuContainer: 'menubar_menuContainer',
- dirMark: 'menubar_dirMark'
-}
-
-MenuBar.mark = {
- dir: '>>'
-}
-
-MenuBar.prototype = {
-
- initialize: function(element) {
- this.options = Object.extend({
- hideOnClickSubmenu: true
- }, arguments[1]);
-
- this.element = $(element);
- Element.setStyle(this.element, {visibility: 'hidden'});
- Element.hide(this.element);
-
- var options = Object.extend({
- cssPrefix: 'custom_'
- }, arguments[1] || {});
-
- var customCss = CssUtil.appendPrefix(options.cssPrefix, MenuBar.cssNames);
- this.classNames = new CssUtil([MenuBar.cssNames, customCss]);
-
- this.clicked = [];
- var topMenus = [];
- var nodes = this.element.childNodes;
-
- for (var i = 0; i < nodes.length; i++) {
- if (nodes[i].nodeType == 1) {
- this.build(nodes[i], 'menu');
- topMenus.push(nodes[i]);
- }
- }
-
- this.menubar = Builder.node('DIV', topMenus)
- this.classNames.addClassNames(this.menubar, 'container');
- this.element.appendChild(this.menubar);
-
- Event.observe(document, "click", this.hideAllTrigger(this.menubar).bindAsEventListener(this));
- Element.setStyle(this.element, {visibility: 'visible'});
- Element.show(this.element);
- },
-
- build: function(element, className) {
- this.classNames.addClassNames(element, className);
-
- var bodyContents = new Array();
- var subMenus = new Array();
- var nodes = element.childNodes;
-
- for (var i = 0; i < nodes.length; i++) {
- if (nodes[i].nodeType == 1 && nodes[i].tagName == 'DIV') {
- this.build(nodes[i], 'subMenu');
- subMenus.push(nodes[i]);
- } else {
- bodyContents.push(nodes[i]);
- }
- }
-
- var bodyClass= className + 'Body';
- var body = Builder.node('DIV', bodyContents);
- this.classNames.addClassNames(body, bodyClass);
- new Hover(body);
- element.appendChild(body);
-
- if (subMenus.length > 0) {
- if (className == 'subMenu') {
- var subMenu = Builder.node('DIV', [MenuBar.mark.dir]);
- this.classNames.addClassNames(subMenu, 'dirMark');
- body.appendChild(subMenu);
- }
-
- var container = Builder.node('DIV', subMenus);
- this.classNames.addClassNames(container, 'subMenuContainer');
- element.appendChild(container);
-
- this.hide(container);
- }
- Event.observe(element, "click", this.onClick.bindAsEventListener(this, body));
- },
-
- onClick: function(event, menuBody) {
- var menu = menuBody.parentNode;
- var parentContainer = this.getParentContainer(menu);
-
- var container = this.getContainer(menu);
- var className = MenuBar.cssNames.menu;
- if (Element.hasClassName(menu, className)) {
- if (this.clicked.length > 0) {
- this.hideAll(this.menubar);
- this.clicked = [];
- }
- if (container) this.showAtBottom(container, menuBody);
-
- } else {
- if (container) {
- var lastMenuBody = this.clicked.pop();
- var lastMenu = lastMenuBody.parentNode;
- var lastContainer = this.getContainer(lastMenu);
- var lastParentContainer = this.getParentContainer(lastMenu);
-
- if (lastMenu == menu) {
- this.hide(container);
-
- } else if (Element.hasClassName(lastContainer, MenuBar.cssNames.container)) {
- this.clicked.push(last);
-
- } else if (lastParentContainer == parentContainer) {
- this.hide(lastContainer);
-
- } else {
- this.clicked.push(lastMenuBody);
- }
- this.showAtLeft(container, menu);
- } else if (this.options.hideOnClickSubmenu) {
- this.hideAll(this.menubar);
- }
- }
-
- if (container) this.clicked.push(menuBody);
- Event.stop(event);
- },
-
- showAtBottom: function(contents, menuBody) {
- var offset = Position.positionedOffset(menuBody);
- var height = 0;
-
- if (menuBody.style.height) height = Element.getHeight(menuBody);
- else height = menuBody.clientHeight;
- height += offset[1];
- height += (document.all) ? 4 : 3;
-
- contents.style.top = height + 'px';
- contents.style.left = offset[0] + 'px';
-
- this.show(contents);
- },
-
- showAtLeft: function(contents, menuBody) {
- var offset = Position.positionedOffset(menuBody);
-
- contents.style.top = (offset[1] - 1) + 'px';
- contents.style.left = (offset[0] + menuBody.offsetWidth + 2) + 'px';
-
- this.show(contents);
- },
-
- hideAllTrigger: function(element) {
- return function(event) {
- if (!this.isMenuElement(Event.element(event))) this.hideAll(element);
- }
- },
-
- hideAll: function(element) {
- var nodes = element.childNodes;
- for (var i = 0; i < nodes.length; i++) {
- if (nodes[i].nodeType == 1) {
- if (Element.hasClassName(nodes[i], MenuBar.cssNames.subMenuContainer)) {
- this.hide(nodes[i]);
- }
-
- this.hideAll(nodes[i]);
- }
- }
- },
-
- show: function(element) {
- element.style.visibility = 'visible';
- },
-
- hide: function(element) {
- element.style.visibility = 'hidden';
- },
-
- getContainer: function(element) {
-
- if (!element) return;
- return document.getElementsByClassName(MenuBar.cssNames.subMenuContainer, element)[0];
- },
-
- getParentContainer: function(element) {
- var container = Element.getParentByClassName(MenuBar.cssNames.subMenuContainer, element);
- if (!container) {
- container = Element.getParentByClassName(MenuBar.cssNames.container, element);
- }
-
- return container;
- },
-
- isMenuElement: function(element) {
- return Element.hasClassName(element, MenuBar.cssNames.menuBodyHover)
- || Element.hasClassName(element, MenuBar.cssNames.subMenuBodyHover)
- || Element.hasClassName(element, MenuBar.cssNames.dirMark);
- }
-}
+// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+var MenuBar = Class.create();\r
+MenuBar.cssNames = {\r
+ container: 'menubar',\r
+ menu: 'menubar_menu',\r
+ menuBody: 'menubar_menuBody',\r
+ menuBodyHover: 'menubar_menuBodyHover',\r
+ subMenu: 'menubar_subMenu',\r
+ subMenuBody: 'menubar_subMenuBody',\r
+ subMenuBodyHover: 'menubar_subMenuBodyHover',\r
+ subMenuContainer: 'menubar_menuContainer',\r
+ dirMark: 'menubar_dirMark'\r
+}\r
+\r
+MenuBar.mark = {\r
+ dir: '>>'\r
+}\r
+\r
+MenuBar.prototype = {\r
+\r
+ initialize: function(element) {\r
+ this.options = Object.extend({\r
+ hideOnClickSubmenu: true\r
+ }, arguments[1]);\r
+\r
+ this.element = $(element);\r
+ Element.setStyle(this.element, {visibility: 'hidden'});\r
+ Element.hide(this.element);\r
+ \r
+ var options = Object.extend({\r
+ cssPrefix: 'custom_'\r
+ }, arguments[1] || {});\r
+ \r
+ var customCss = CssUtil.appendPrefix(options.cssPrefix, MenuBar.cssNames);\r
+ this.classNames = new CssUtil([MenuBar.cssNames, customCss]);\r
+ \r
+ this.clicked = [];\r
+ var topMenus = [];\r
+ var nodes = this.element.childNodes;\r
+ \r
+ for (var i = 0; i < nodes.length; i++) {\r
+ if (nodes[i].nodeType == 1) {\r
+ this.build(nodes[i], 'menu');\r
+ topMenus.push(nodes[i]);\r
+ } \r
+ }\r
+ \r
+ this.menubar = Builder.node('DIV', topMenus)\r
+ this.classNames.addClassNames(this.menubar, 'container');\r
+ this.element.appendChild(this.menubar);\r
+ \r
+ Event.observe(document, "click", this.hideAllTrigger(this.menubar).bindAsEventListener(this));\r
+ Element.setStyle(this.element, {visibility: 'visible'});\r
+ Element.show(this.element);\r
+ },\r
+ \r
+ build: function(element, className) {\r
+ this.classNames.addClassNames(element, className);\r
+ \r
+ var bodyContents = new Array();\r
+ var subMenus = new Array();\r
+ var nodes = element.childNodes;\r
+ \r
+ for (var i = 0; i < nodes.length; i++) {\r
+ if (nodes[i].nodeType == 1 && nodes[i].tagName == 'DIV') {\r
+ this.build(nodes[i], 'subMenu');\r
+ subMenus.push(nodes[i]);\r
+ } else {\r
+ bodyContents.push(nodes[i]);\r
+ }\r
+ }\r
+ \r
+ var bodyClass= className + 'Body';\r
+ var body = Builder.node('DIV', bodyContents);\r
+ this.classNames.addClassNames(body, bodyClass);\r
+ new Hover(body);\r
+ element.appendChild(body);\r
+ \r
+ if (subMenus.length > 0) {\r
+ if (className == 'subMenu') {\r
+ var subMenu = Builder.node('DIV', [MenuBar.mark.dir]);\r
+ this.classNames.addClassNames(subMenu, 'dirMark');\r
+ body.appendChild(subMenu);\r
+ }\r
+ \r
+ var container = Builder.node('DIV', subMenus);\r
+ this.classNames.addClassNames(container, 'subMenuContainer');\r
+ element.appendChild(container);\r
+ \r
+ this.hide(container);\r
+ }\r
+ Event.observe(element, "click", this.onClick.bindAsEventListener(this, body));\r
+ },\r
+ \r
+ onClick: function(event, menuBody) {\r
+ var menu = menuBody.parentNode;\r
+ var parentContainer = this.getParentContainer(menu);\r
+ \r
+ var container = this.getContainer(menu);\r
+ var className = MenuBar.cssNames.menu;\r
+ if (Element.hasClassName(menu, className)) {\r
+ if (this.clicked.length > 0) {\r
+ this.hideAll(this.menubar);\r
+ this.clicked = [];\r
+ }\r
+ if (container) this.showAtBottom(container, menuBody);\r
+\r
+ } else {\r
+ if (container) {\r
+ var lastMenuBody = this.clicked.pop();\r
+ var lastMenu = lastMenuBody.parentNode;\r
+ var lastContainer = this.getContainer(lastMenu);\r
+ var lastParentContainer = this.getParentContainer(lastMenu);\r
+ \r
+ if (lastMenu == menu) {\r
+ this.hide(container);\r
+ \r
+ } else if (Element.hasClassName(lastContainer, MenuBar.cssNames.container)) {\r
+ this.clicked.push(last);\r
+ \r
+ } else if (lastParentContainer == parentContainer) {\r
+ this.hide(lastContainer);\r
+ \r
+ } else {\r
+ this.clicked.push(lastMenuBody);\r
+ }\r
+ this.showAtLeft(container, menu);\r
+ } else if (this.options.hideOnClickSubmenu) {\r
+ this.hideAll(this.menubar);\r
+ }\r
+ }\r
+ \r
+ if (container) this.clicked.push(menuBody);\r
+ Event.stop(event);\r
+ },\r
+ \r
+ showAtBottom: function(contents, menuBody) {\r
+ var offset = Position.positionedOffset(menuBody);\r
+ var height = 0;\r
+ \r
+ if (menuBody.style.height) height = Element.getHeight(menuBody);\r
+ else height = menuBody.clientHeight;\r
+ height += offset[1];\r
+ height += (document.all) ? 4 : 3;\r
+ \r
+ contents.style.top = height + 'px';\r
+ contents.style.left = offset[0] + 'px';\r
+ \r
+ this.show(contents);\r
+ },\r
+ \r
+ showAtLeft: function(contents, menuBody) {\r
+ var offset = Position.positionedOffset(menuBody);\r
+ \r
+ contents.style.top = (offset[1] - 1) + 'px';\r
+ contents.style.left = (offset[0] + menuBody.offsetWidth + 2) + 'px';\r
+ \r
+ this.show(contents);\r
+ },\r
+\r
+ hideAllTrigger: function(element) {\r
+ return function(event) {\r
+ if (!this.isMenuElement(Event.element(event))) this.hideAll(element);\r
+ }\r
+ },\r
+ \r
+ hideAll: function(element) {\r
+ var nodes = element.childNodes;\r
+ for (var i = 0; i < nodes.length; i++) {\r
+ if (nodes[i].nodeType == 1) {\r
+ if (Element.hasClassName(nodes[i], MenuBar.cssNames.subMenuContainer)) {\r
+ this.hide(nodes[i]);\r
+ }\r
+ \r
+ this.hideAll(nodes[i]);\r
+ }\r
+ }\r
+ },\r
+ \r
+ show: function(element) {\r
+ element.style.visibility = 'visible';\r
+ }, \r
+ \r
+ hide: function(element) {\r
+ element.style.visibility = 'hidden';\r
+ },\r
+ \r
+ getContainer: function(element) {\r
+ \r
+ if (!element) return;\r
+ return document.getElementsByClassName(MenuBar.cssNames.subMenuContainer, element)[0];\r
+ },\r
+ \r
+ getParentContainer: function(element) {\r
+ var container = Element.getParentByClassName(MenuBar.cssNames.subMenuContainer, element);\r
+ if (!container) {\r
+ container = Element.getParentByClassName(MenuBar.cssNames.container, element);\r
+ }\r
+ \r
+ return container;\r
+ },\r
+\r
+ isMenuElement: function(element) {\r
+ return Element.hasClassName(element, MenuBar.cssNames.menuBodyHover)\r
+ || Element.hasClassName(element, MenuBar.cssNames.subMenuBodyHover)\r
+ || Element.hasClassName(element, MenuBar.cssNames.dirMark);\r
+ }\r
+}\r
-// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-NavPanel = Class.create();
-NavPanel.className = {
- navPanel : 'navPanel',
- panel: 'navPanel_panel',
- tab : 'navPanel_tab',
- tabLeftInactive : 'navPanel_tabLeftInactive',
- tabLeftActive: 'navPanel_tabLeftActive',
- tabMiddleInactive : 'navPanel_tabMiddleInactive',
- tabMiddleActive : 'navPanel_tabMiddleActive',
- tabRightInactive : 'navPanel_tabRightInactive',
- tabRightActive : 'navPanel_tabRightActive'
-}
-NavPanel.prototype = {
-
- initialize: function(element) {
- var options = Object.extend({
- selected: 1,
- cssPrefix: 'custom_'
- }, arguments[1] || {});
-
- this.options = options;
- this.element = $(element);
- Element.setStyle(this.element, {visibility: 'hidden'});
- Element.hide(this.element);
-
- var customCss = CssUtil.appendPrefix(this.options.cssPrefix, NavPanel.className);
- this.classNames = new CssUtil([NavPanel.className, customCss]);
-
- this.classNames.addClassNames(this.element, 'navPanel');
-
- this.selected = (this.options.selected > 0) ? this.options.selected - 1 : 0 ;
- this.start();
-
- Element.setStyle(this.element, {visibility: 'visible'});
- Element.show(this.element);
- },
-
- start: function() {
- this.tabs = [];
- this.panels = [];
- this.panelList = [];
-
- this.tabId = this.element.id + '_tab';
- this.tabLeftId = this.tabId + '_left';
- this.tabMiddleId = this.tabId + '_middle';
- this.tabRightId = this.tabId + '_right';
- this.panelId = this.element.id + '_panel';
-
- this.build();
- },
-
- build: function() {
- Element.cleanWhitespace(this.element);
- this.panelList = this.element.childNodes;
-
- for (var i = 0; i < this.panelList.length; i++) {
- if (this.panelList[i].nodeType != 1) {
- Element.remove(this.panelList[i]);
- i--;
- continue;
- }
- Element.cleanWhitespace(this.panelList[i]);
- var navSet = this.panelList[i].childNodes;
- this.buildTab(navSet[0], i);
- this.buildPanel(navSet[0], i);
- }
- this.selectTab();
- },
-
-
- buildTab: function(tabTitle, i) {
- var tab = Builder.node('div', {id:this.tabId + i});
- this.classNames.addClassNames(tab, 'tab');
- var tabLeft = Builder.node('div', {id:this.tabLeftId + i});
- var tabMiddle = Builder.node('div', {id:this.tabMiddleId + i});
- tabMiddle.appendChild(tabTitle);
- var tabRight = Builder.node('div',{id:this.tabRightId + i});
-
- tab.appendChild(tabLeft);
- tab.appendChild(tabMiddle);
- tab.appendChild(tabRight);
- Event.observe(tab, 'click', this.selectTab.bindAsEventListener(this));
-
- this.tabs[i] = tab;
- this.setTabInactive(tab);
- this.panelList[i].appendChild(tab);
- },
-
- buildPanel: function(panelContent, i) {
- var panel = Builder.node('div', {id:this.panelId + i});
- this.classNames.addClassNames(panel, 'panel');
- panel.appendChild(panelContent);
- Element.hide(panel);
- this.panels[i] = panel;
- this.panelList[i].appendChild(panel);
- },
-
- selectTab: function(e) {
- if (!e) {
- if (!this.panels[this.selected]) this.selected = 0;
- Element.show(this.panels[this.selected]);
- this.setTabActive(this.tabs[this.selected]);
- return;
- }
-
- var targetElement = Event.element(e);
- var targetIndex = this.getTargetIndex(targetElement);
- if (targetIndex == this.selected) {
- return;
- }
-
- var currentPanel = this.panels[this.selected];
- var targetPanel = this.panels[targetIndex];
- this.setTabInactive(this.tabs[this.selected]);
- this.setTabActive(this.tabs[targetIndex]);
- Element.show(targetPanel);
- Element.hide(currentPanel);
- this.selected = targetIndex;
- },
-
- setTabActive: function(tab) {
- var tabChildren = tab.childNodes;
-
- this.classNames.refreshClassNames(tabChildren[0], 'tabLeftActive');
- this.classNames.refreshClassNames(tabChildren[1], 'tabMiddleActive');
- this.classNames.refreshClassNames(tabChildren[2], 'tabRightActive');
- },
-
- setTabInactive: function(tab) {
- var tabChildren = tab.childNodes;
-
- this.classNames.refreshClassNames(tabChildren[0], 'tabLeftInactive');
- this.classNames.refreshClassNames(tabChildren[1], 'tabMiddleInactive');
- this.classNames.refreshClassNames(tabChildren[2], 'tabRightInactive');
- },
-
- getTargetIndex: function(element) {
-
- while(element) {
- if (element.id && element.id.indexOf(this.tabId, 0) >= 0) {
- var index = element.id.substring(this.tabId.length);
- if (!isNaN(index)) {
- return index;
- }
- }
- element = element.parentNode;
- }
- }
-}
+// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+NavPanel = Class.create();\r
+NavPanel.className = {\r
+ navPanel : 'navPanel',\r
+ panel: 'navPanel_panel',\r
+ tab : 'navPanel_tab',\r
+ tabLeftInactive : 'navPanel_tabLeftInactive',\r
+ tabLeftActive: 'navPanel_tabLeftActive',\r
+ tabMiddleInactive : 'navPanel_tabMiddleInactive',\r
+ tabMiddleActive : 'navPanel_tabMiddleActive',\r
+ tabRightInactive : 'navPanel_tabRightInactive',\r
+ tabRightActive : 'navPanel_tabRightActive'\r
+}\r
+NavPanel.prototype = {\r
+ \r
+ initialize: function(element) {\r
+ var options = Object.extend({\r
+ selected: 1,\r
+ cssPrefix: 'custom_'\r
+ }, arguments[1] || {});\r
+ \r
+ this.options = options;\r
+ this.element = $(element);\r
+ Element.setStyle(this.element, {visibility: 'hidden'});\r
+ Element.hide(this.element);\r
+ \r
+ var customCss = CssUtil.appendPrefix(this.options.cssPrefix, NavPanel.className);\r
+ this.classNames = new CssUtil([NavPanel.className, customCss]);\r
+ \r
+ this.classNames.addClassNames(this.element, 'navPanel');\r
+ \r
+ this.selected = (this.options.selected > 0) ? this.options.selected - 1 : 0 ;\r
+ this.start();\r
+ \r
+ Element.setStyle(this.element, {visibility: 'visible'});\r
+ Element.show(this.element);\r
+ },\r
+ \r
+ start: function() {\r
+ this.tabs = [];\r
+ this.panels = [];\r
+ this.panelList = [];\r
+\r
+ this.tabId = this.element.id + '_tab';\r
+ this.tabLeftId = this.tabId + '_left';\r
+ this.tabMiddleId = this.tabId + '_middle';\r
+ this.tabRightId = this.tabId + '_right';\r
+ this.panelId = this.element.id + '_panel';\r
+ \r
+ this.build(); \r
+ }, \r
+ \r
+ build: function() {\r
+ Element.cleanWhitespace(this.element);\r
+ this.panelList = this.element.childNodes;\r
+ \r
+ for (var i = 0; i < this.panelList.length; i++) {\r
+ if (this.panelList[i].nodeType != 1) {\r
+ Element.remove(this.panelList[i]);\r
+ i--;\r
+ continue;\r
+ }\r
+ Element.cleanWhitespace(this.panelList[i]);\r
+ var navSet = this.panelList[i].childNodes;\r
+ this.buildTab(navSet[0], i);\r
+ this.buildPanel(navSet[0], i);\r
+ }\r
+ this.selectTab();\r
+ },\r
+ \r
+ \r
+ buildTab: function(tabTitle, i) {\r
+ var tab = Builder.node('div', {id:this.tabId + i});\r
+ this.classNames.addClassNames(tab, 'tab');\r
+ var tabLeft = Builder.node('div', {id:this.tabLeftId + i});\r
+ var tabMiddle = Builder.node('div', {id:this.tabMiddleId + i});\r
+ tabMiddle.appendChild(tabTitle);\r
+ var tabRight = Builder.node('div',{id:this.tabRightId + i});\r
+ \r
+ tab.appendChild(tabLeft);\r
+ tab.appendChild(tabMiddle);\r
+ tab.appendChild(tabRight);\r
+ Event.observe(tab, 'click', this.selectTab.bindAsEventListener(this));\r
+\r
+ this.tabs[i] = tab;\r
+ this.setTabInactive(tab);\r
+ this.panelList[i].appendChild(tab);\r
+ },\r
+ \r
+ buildPanel: function(panelContent, i) {\r
+ var panel = Builder.node('div', {id:this.panelId + i});\r
+ this.classNames.addClassNames(panel, 'panel');\r
+ panel.appendChild(panelContent);\r
+ Element.hide(panel);\r
+ this.panels[i] = panel;\r
+ this.panelList[i].appendChild(panel);\r
+ },\r
+ \r
+ selectTab: function(e) {\r
+ if (!e) {\r
+ if (!this.panels[this.selected]) this.selected = 0;\r
+ Element.show(this.panels[this.selected]);\r
+ this.setTabActive(this.tabs[this.selected]);\r
+ return;\r
+ }\r
+ \r
+ var targetElement = Event.element(e);\r
+ var targetIndex = this.getTargetIndex(targetElement);\r
+ if (targetIndex == this.selected) {\r
+ return;\r
+ }\r
+ \r
+ var currentPanel = this.panels[this.selected];\r
+ var targetPanel = this.panels[targetIndex];\r
+ this.setTabInactive(this.tabs[this.selected]);\r
+ this.setTabActive(this.tabs[targetIndex]);\r
+ Element.show(targetPanel);\r
+ Element.hide(currentPanel);\r
+ this.selected = targetIndex; \r
+ },\r
+ \r
+ setTabActive: function(tab) {\r
+ var tabChildren = tab.childNodes;\r
+\r
+ this.classNames.refreshClassNames(tabChildren[0], 'tabLeftActive');\r
+ this.classNames.refreshClassNames(tabChildren[1], 'tabMiddleActive');\r
+ this.classNames.refreshClassNames(tabChildren[2], 'tabRightActive');\r
+ },\r
+ \r
+ setTabInactive: function(tab) {\r
+ var tabChildren = tab.childNodes;\r
+ \r
+ this.classNames.refreshClassNames(tabChildren[0], 'tabLeftInactive');\r
+ this.classNames.refreshClassNames(tabChildren[1], 'tabMiddleInactive');\r
+ this.classNames.refreshClassNames(tabChildren[2], 'tabRightInactive');\r
+ },\r
+\r
+ getTargetIndex: function(element) {\r
+\r
+ while(element) {\r
+ if (element.id && element.id.indexOf(this.tabId, 0) >= 0) {\r
+ var index = element.id.substring(this.tabId.length);\r
+ if (!isNaN(index)) {\r
+ return index;\r
+ }\r
+ }\r
+ element = element.parentNode;\r
+ }\r
+ }\r
+}\r
-// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-var SelectableTable = Class.create();
-
-SelectableTable.classNames = {
- table: 'selectableTable_table',
- tr: 'selectableTable_tr',
- trHover: 'selectableTable_trHover',
- trSelected: 'selectableTable_trSelected'
-}
-
-SelectableTable.prototype = {
- initialize: function(element) {
- this.element = $(element);
- Element.setStyle(this.element, {visibility: 'hidden'});
- var defaultOptions = {
- arrayDefaultData: [],
- flagAllowUnselect: true,
- flagInitialAllowMultiple: false,
- flagKeypressAvailable: false,
- flagKeypressDeleteAvailable: false,
- flagKeypressInsertAvailable: false,
- functionPostAdd: Prototype.emptyFunction,
- functionPostDelete: Prototype.emptyFunction,
- functionPostPressLeft: Prototype.emptyFunction,
- functionPostPressRight: Prototype.emptyFunction,
- functionPostSelect: Prototype.emptyFunction,
- functionPostUnselect: Prototype.emptyFunction,
- functionPreAdd: function() {return true;},
- functionPreDelete: function() {return true;},
- functionSubmit: Prototype.emptyFunction,
- initialSelected: null,
- prefixTrId: 'selectable_table_',
- prefixCSS: 'custom_'
- }
- this.options = Object.extend(defaultOptions, arguments[1] || {});
- this.classNames = new CssUtil([SelectableTable.classNames, CssUtil.appendPrefix(this.options.prefixCSS, SelectableTable.classNames)]);
- this.documentListener = this.eventKeypress.bindAsEventListener(this);
- this.flagAllowMultiple = this.options.flagInitialAllowMultiple;
- this.flagAvailable = true;
- this.focused = null;
- this.lastSelected = null;
- this.newNumber = 1;
- this.selected = new Object();
- this.build();
- if(arguments[2]) {
- this.selectEffect(this.buildTrId(arguments[2]));
- }
- Element.setStyle(this.element, {visibility: 'visible'});
- },
-
- add: function() {
- if(!this.flagAvailable) {return;}
- if(!this.options.functionPreAdd(this)) {return;}
- if(arguments[0] == null) {arguments[0] = this.options.arrayDefaultData;}
- if(typeof(arguments[0]) != 'string') {
- arguments = arguments[0];
- }
- if(arguments[0] == null) {return;}
- var objTr, objTd;
- objTr = document.createElement('tr');
- objTr.id = 'new_' + this.newNumber;
- this.buildTr(objTr);
- for(var i = 0; i < arguments.length; i++) {
- objTd = document.createElement('td');
- objTd.innerHTML = arguments[i];
- objTr.appendChild(objTd);
- }
- this.element.tBodies[0].appendChild(objTr);
- this.newNumber++;
- this.options.functionPostAdd(this);
- },
-
- build: function() {
- var lines = this.element.tBodies[0].rows;
- this.classNames.addClassNames(this.element, 'table');
- Event.observe(document, 'keypress', this.documentListener);
- for(var i = 0; i < lines.length; i++) {
- this.buildTr(lines[i]);
- }
- var selected = this.options.initialSelected
- if(selected) {
- this.selectEffect(this.buildTrId(selected));
- }
- },
-
- buildTr: function(objTr) {
- objTr.id = this.buildTrId(objTr.id);
- this.classNames.addClassNames(objTr, 'tr');
- Event.observe(objTr, 'click', this.eventClick.bindAsEventListener(this));
- Event.observe(objTr, 'dblclick', this.eventDoubleClick.bindAsEventListener(this));
- Event.observe(objTr, 'mouseout', this.eventFocusOut.bindAsEventListener(this));
- Event.observe(objTr, 'mouseover', this.eventFocusOver.bindAsEventListener(this));
- },
-
- buildTrId: function(strId) {
- return this.options.prefixTrId + strId
- },
-
- deleteAll: function() {
- if(!this.flagAvailable) {return;}
- if(!this.options.functionPreDelete(this)) {return;}
- for(var trId in this.selected) {
- this.element.tBodies[0].removeChild($(trId));
- delete this.selected[trId];
- }
- this.focused = null;
- this.options.functionPostDelete(this);
- },
-
- eventClick: function(event) {
- if(!this.flagAvailable) {return;}
- if(event.shiftKey) {
- this.selectOrUnselectRange(Event.findElement(event, 'tr').id);
- } else {
- this.selectOrUnselect(Event.findElement(event, 'tr').id, event.ctrlKey);
- }
- },
-
- eventDoubleClick: function(event) {
- if(!this.flagAvailable) {return;}
- if(this.flagAllowMultiple) {
- this.select(Event.findElement(event, 'tr').id, false);
- this.submit();
- }
- },
-
- eventFocusOut: function(event) {
- if(!this.flagAvailable) {return;}
- this.focusOff();
- },
-
- eventFocusOver: function(event) {
- if(!this.flagAvailable) {return;}
- this.focusOn(Event.findElement(event, 'tr').id);
- Event.findElement(event, 'tr').focus();
- },
-
- eventKeypress: function(event) {
- if(!this.flagAvailable) {return;}
- if(!this.options.flagKeypressAvailable) {return;}
- switch(event.keyCode) {
- case 13: //Enter
- if(event.shiftKey) {
- this.selectOrUnselectRange(this.focused);
- } else {
- this.selectOrUnselect(this.focused, event.ctrlKey);
- }
- break;
- case 37: //Left
- this.options.functionPostPressLeft(this);
- break;
- case 38: //Up
- this.focusMove('up');
- break;
- case 39: //Right
- this.options.functionPostPressRight(this);
- break;
- case 40: //Down
- this.focusMove('down');
- break;
- case 45: //Insert
- if(this.options.flagKeypressInsertAvailable) {this.add();}
- break;
- case 46: //Delete
- if(this.options.flagKeypressDeleteAvailable) {this.deleteAll();}
- break;
- }
- },
-
- focusMove: function(direction) {
- if(!this.flagAvailable) {return;}
- if(this.focused == null) {
- this.focusOn(this.element.tBodies[0].rows[0].id);
- } else {
- var rowIndex = $(this.focused).rowIndex;
- var correctionValue, flagEdge;
- switch(direction) {
- case 'down':
- correctionValue = 1;
- flagEdge = this.isBottom(rowIndex);
- break;
- case 'up':
- correctionValue = -1;
- flagEdge = this.isTop(rowIndex);
- break;
- }
- if(!flagEdge) {
- this.focusOn(this.element.rows[rowIndex + correctionValue].id);
- }
- }
- },
-
- focusOff: function() {
- if(!this.flagAvailable) {return;}
- if(this.focused != null) {
- var objTr = $(this.focused);
- this.classNames.removeClassNames(objTr, 'trHover');
- this.focused = null;
- }
- },
-
- focusOn: function(trId) {
- if(!this.flagAvailable) {return;}
- if($(trId) != null) {
- this.focusOff();
- this.classNames.addClassNames($(trId), 'trHover');
- this.focused = trId;
- }
- },
-
- getSelected: function() {
- var selectedIdList = new Array();
- for(var trId in this.selected) {
- selectedIdList.push(trId.replace(this.options.prefixTrId, ''));
- }
- return selectedIdList;
- },
-
- getSelectedElement: function(id) {
- var trId = this.options.prefixTrId + id;
- return $(trId)
- },
-
- isBottom: function(rowIndex) {
- return (rowIndex == this.element.rows.length - 1) ? true : false;
- },
-
- isTop: function(rowIndex) {
- return (rowIndex == this.element.tBodies[0].rows[0].rowIndex) ? true : false;
- },
-
- makeAvailable: function() {
- this.flagAvailable = true;
- },
-
- makeMultiple: function() {
- this.flagAllowMultiple = true;
- },
-
- makeSingular: function() {
- this.flagAllowMultiple = false;
- this.unselectAll();
- },
-
- makeUnavailable: function() {
- this.flagAvailable = false;
- },
-
- removeEventFromDocument: function() {
- Event.stopObserving(document, 'keypress', this.documentListener);
- },
-
- select: function(trId, ctrl) {
- if(!this.flagAvailable) {return;}
- this.selectEffect(trId, ctrl);
- this.lastSelected = trId;
- this.options.functionPostSelect(this);
- if(!this.flagAllowMultiple) {
- this.submit();
- }
- },
-
- selectAll: function() {
- if(!this.flagAvailable) {return;}
- if(!this.flagAllowMultiple) {return;}
- this.selected = new Object();
- var lines = this.element.tBodies[0].rows;
- for(var i = 0; i < lines.length; i++) {
- this.select(lines[i].id, true);
- }
- },
-
- selectEffect: function(trId, ctrl) {
- if($(trId)) {
- if(!this.flagAllowMultiple || !ctrl) {
- this.unselectAll();
- }
- this.classNames.addClassNames($(trId), 'trSelected');
- this.selected[trId] = true;
- }
- },
-
- selectOrUnselect: function(trId, ctrl) {
- if(!this.flagAvailable) {return;}
- if(trId == null) {return;}
- if(ctrl && this.selected[trId]) {
- if(!this.flagAllowMultiple && !this.options.flagAllowUnselect) {return;}
- this.unselect(trId);
- } else {
- this.select(trId, ctrl);
- }
- },
-
- selectOrUnselectRange: function(trId) {
- if(!this.flagAvailable) {return;}
- if(trId == null) {return;}
- if(this.lastSelected == null || this.lastSelected == trId) {
- this.selectOrUnselect(trId);
- return;
- }
- var flagSelect = false;
- var lines = this.element.tBodies[0].rows;
- var lastSelected = this.lastSelected
- for(var i = 0; i < lines.length; i++) {
- if(lines[i].id == trId || lines[i].id == lastSelected) {
- flagSelect = (flagSelect) ? false : true;
- } else if(!flagSelect) {
- continue;
- }
- if(this.selected[lastSelected]) {
- this.select(lines[i].id, true);
- } else {
- this.unselect(lines[i].id);
- }
- }
- },
-
- submit: function(trId) {
- if(!this.flagAvailable) {return;}
- var selected = this.getSelected();
- this.options.functionSubmit(selected[0]);
- },
-
- unselect: function(trId) {
- if(!this.flagAvailable) {return;}
- this.classNames.removeClassNames($(trId), 'trSelected');
- delete this.selected[trId];
- this.lastSelected = trId;
- this.options.functionPostUnselect(this);
- },
-
- unselectAll: function() {
- if(!this.flagAvailable) {return;}
- var lines = this.element.tBodies[0].rows;
- for(var i = 0; i < lines.length; i++) {
- this.unselect(lines[i].id);
- }
- }
-}
-
-var SelectableTableManager = Class.create();
-SelectableTableManager.prototype = {
- initialize: function() {
- this.active = null,
- this.list = {}
- },
- activate: function(key) {
- this.stop();
- if(this.list[key]) {
- this.list[key].makeAvailable();
- this.active = this.list[key];
- } else {
- this.active = null;
- }
- },
- push: function(key, element) {
- this.list[key] = element;
- },
- start: function() {
- if(this.active) {
- this.active.makeAvailable();
- }
- },
- stop: function() {
- $H(this.list).each(
- function(el) {
- if(el[1]) {
- el[1].makeUnavailable();
- }
- }
- );
- }
-}
+// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+var SelectableTable = Class.create();\r
+\r
+SelectableTable.classNames = {\r
+ table: 'selectableTable_table',\r
+ tr: 'selectableTable_tr',\r
+ trHover: 'selectableTable_trHover',\r
+ trSelected: 'selectableTable_trSelected'\r
+}\r
+\r
+SelectableTable.prototype = {\r
+ initialize: function(element) {\r
+ this.element = $(element);\r
+ Element.setStyle(this.element, {visibility: 'hidden'});\r
+ var defaultOptions = {\r
+ arrayDefaultData: [],\r
+ flagAllowUnselect: true,\r
+ flagInitialAllowMultiple: false,\r
+ flagKeypressAvailable: false,\r
+ flagKeypressDeleteAvailable: false,\r
+ flagKeypressInsertAvailable: false,\r
+ functionPostAdd: Prototype.emptyFunction,\r
+ functionPostDelete: Prototype.emptyFunction,\r
+ functionPostPressLeft: Prototype.emptyFunction,\r
+ functionPostPressRight: Prototype.emptyFunction,\r
+ functionPostSelect: Prototype.emptyFunction,\r
+ functionPostUnselect: Prototype.emptyFunction,\r
+ functionPreAdd: function() {return true;},\r
+ functionPreDelete: function() {return true;},\r
+ functionSubmit: Prototype.emptyFunction,\r
+ initialSelected: null,\r
+ prefixTrId: 'selectable_table_',\r
+ prefixCSS: 'custom_'\r
+ }\r
+ this.options = Object.extend(defaultOptions, arguments[1] || {});\r
+ this.classNames = new CssUtil([SelectableTable.classNames, CssUtil.appendPrefix(this.options.prefixCSS, SelectableTable.classNames)]);\r
+ this.documentListener = this.eventKeypress.bindAsEventListener(this);\r
+ this.flagAllowMultiple = this.options.flagInitialAllowMultiple;\r
+ this.flagAvailable = true;\r
+ this.focused = null;\r
+ this.lastSelected = null;\r
+ this.newNumber = 1;\r
+ this.selected = new Object();\r
+ this.build();\r
+ if(arguments[2]) {\r
+ this.selectEffect(this.buildTrId(arguments[2]));\r
+ }\r
+ Element.setStyle(this.element, {visibility: 'visible'});\r
+ },\r
+\r
+ add: function() {\r
+ if(!this.flagAvailable) {return;}\r
+ if(!this.options.functionPreAdd(this)) {return;}\r
+ if(arguments[0] == null) {arguments[0] = this.options.arrayDefaultData;}\r
+ if(typeof(arguments[0]) != 'string') {\r
+ arguments = arguments[0];\r
+ }\r
+ if(arguments[0] == null) {return;}\r
+ var objTr, objTd;\r
+ objTr = document.createElement('tr');\r
+ objTr.id = 'new_' + this.newNumber;\r
+ this.buildTr(objTr);\r
+ for(var i = 0; i < arguments.length; i++) {\r
+ objTd = document.createElement('td');\r
+ objTd.innerHTML = arguments[i];\r
+ objTr.appendChild(objTd);\r
+ }\r
+ this.element.tBodies[0].appendChild(objTr);\r
+ this.newNumber++;\r
+ this.options.functionPostAdd(this);\r
+ },\r
+\r
+ build: function() {\r
+ var lines = this.element.tBodies[0].rows;\r
+ this.classNames.addClassNames(this.element, 'table');\r
+ Event.observe(document, 'keypress', this.documentListener);\r
+ for(var i = 0; i < lines.length; i++) {\r
+ this.buildTr(lines[i]);\r
+ }\r
+ var selected = this.options.initialSelected\r
+ if(selected) {\r
+ this.selectEffect(this.buildTrId(selected));\r
+ }\r
+ },\r
+\r
+ buildTr: function(objTr) {\r
+ objTr.id = this.buildTrId(objTr.id);\r
+ this.classNames.addClassNames(objTr, 'tr');\r
+ Event.observe(objTr, 'click', this.eventClick.bindAsEventListener(this));\r
+ Event.observe(objTr, 'dblclick', this.eventDoubleClick.bindAsEventListener(this));\r
+ Event.observe(objTr, 'mouseout', this.eventFocusOut.bindAsEventListener(this));\r
+ Event.observe(objTr, 'mouseover', this.eventFocusOver.bindAsEventListener(this));\r
+ },\r
+\r
+ buildTrId: function(strId) {\r
+ return this.options.prefixTrId + strId\r
+ },\r
+\r
+ deleteAll: function() {\r
+ if(!this.flagAvailable) {return;}\r
+ if(!this.options.functionPreDelete(this)) {return;}\r
+ for(var trId in this.selected) {\r
+ this.element.tBodies[0].removeChild($(trId));\r
+ delete this.selected[trId];\r
+ }\r
+ this.focused = null;\r
+ this.options.functionPostDelete(this);\r
+ },\r
+\r
+ eventClick: function(event) {\r
+ if(!this.flagAvailable) {return;}\r
+ if(event.shiftKey) {\r
+ this.selectOrUnselectRange(Event.findElement(event, 'tr').id);\r
+ } else {\r
+ this.selectOrUnselect(Event.findElement(event, 'tr').id, event.ctrlKey);\r
+ }\r
+ },\r
+\r
+ eventDoubleClick: function(event) {\r
+ if(!this.flagAvailable) {return;}\r
+ if(this.flagAllowMultiple) {\r
+ this.select(Event.findElement(event, 'tr').id, false);\r
+ this.submit();\r
+ }\r
+ },\r
+\r
+ eventFocusOut: function(event) {\r
+ if(!this.flagAvailable) {return;}\r
+ this.focusOff();\r
+ },\r
+\r
+ eventFocusOver: function(event) {\r
+ if(!this.flagAvailable) {return;}\r
+ this.focusOn(Event.findElement(event, 'tr').id);\r
+ Event.findElement(event, 'tr').focus();\r
+ },\r
+\r
+ eventKeypress: function(event) {\r
+ if(!this.flagAvailable) {return;}\r
+ if(!this.options.flagKeypressAvailable) {return;}\r
+ switch(event.keyCode) {\r
+ case 13: //Enter\r
+ if(event.shiftKey) {\r
+ this.selectOrUnselectRange(this.focused);\r
+ } else {\r
+ this.selectOrUnselect(this.focused, event.ctrlKey);\r
+ }\r
+ break;\r
+ case 37: //Left\r
+ this.options.functionPostPressLeft(this);\r
+ break;\r
+ case 38: //Up\r
+ this.focusMove('up');\r
+ break;\r
+ case 39: //Right\r
+ this.options.functionPostPressRight(this);\r
+ break;\r
+ case 40: //Down\r
+ this.focusMove('down');\r
+ break;\r
+ case 45: //Insert\r
+ if(this.options.flagKeypressInsertAvailable) {this.add();}\r
+ break;\r
+ case 46: //Delete\r
+ if(this.options.flagKeypressDeleteAvailable) {this.deleteAll();}\r
+ break;\r
+ }\r
+ },\r
+\r
+ focusMove: function(direction) {\r
+ if(!this.flagAvailable) {return;}\r
+ if(this.focused == null) {\r
+ this.focusOn(this.element.tBodies[0].rows[0].id);\r
+ } else {\r
+ var rowIndex = $(this.focused).rowIndex;\r
+ var correctionValue, flagEdge;\r
+ switch(direction) {\r
+ case 'down':\r
+ correctionValue = 1;\r
+ flagEdge = this.isBottom(rowIndex);\r
+ break;\r
+ case 'up':\r
+ correctionValue = -1;\r
+ flagEdge = this.isTop(rowIndex);\r
+ break;\r
+ }\r
+ if(!flagEdge) {\r
+ this.focusOn(this.element.rows[rowIndex + correctionValue].id);\r
+ }\r
+ }\r
+ },\r
+\r
+ focusOff: function() {\r
+ if(!this.flagAvailable) {return;}\r
+ if(this.focused != null) {\r
+ var objTr = $(this.focused);\r
+ this.classNames.removeClassNames(objTr, 'trHover');\r
+ this.focused = null;\r
+ }\r
+ },\r
+\r
+ focusOn: function(trId) {\r
+ if(!this.flagAvailable) {return;}\r
+ if($(trId) != null) {\r
+ this.focusOff();\r
+ this.classNames.addClassNames($(trId), 'trHover');\r
+ this.focused = trId;\r
+ }\r
+ },\r
+\r
+ getSelected: function() {\r
+ var selectedIdList = new Array();\r
+ for(var trId in this.selected) {\r
+ selectedIdList.push(trId.replace(this.options.prefixTrId, ''));\r
+ }\r
+ return selectedIdList;\r
+ },\r
+\r
+ getSelectedElement: function(id) {\r
+ var trId = this.options.prefixTrId + id;\r
+ return $(trId)\r
+ },\r
+\r
+ isBottom: function(rowIndex) {\r
+ return (rowIndex == this.element.rows.length - 1) ? true : false;\r
+ },\r
+\r
+ isTop: function(rowIndex) {\r
+ return (rowIndex == this.element.tBodies[0].rows[0].rowIndex) ? true : false;\r
+ },\r
+\r
+ makeAvailable: function() {\r
+ this.flagAvailable = true;\r
+ },\r
+\r
+ makeMultiple: function() {\r
+ this.flagAllowMultiple = true;\r
+ },\r
+\r
+ makeSingular: function() {\r
+ this.flagAllowMultiple = false;\r
+ this.unselectAll();\r
+ },\r
+\r
+ makeUnavailable: function() {\r
+ this.flagAvailable = false;\r
+ },\r
+\r
+ removeEventFromDocument: function() {\r
+ Event.stopObserving(document, 'keypress', this.documentListener);\r
+ },\r
+\r
+ select: function(trId, ctrl) {\r
+ if(!this.flagAvailable) {return;}\r
+ this.selectEffect(trId, ctrl);\r
+ this.lastSelected = trId;\r
+ this.options.functionPostSelect(this);\r
+ if(!this.flagAllowMultiple) {\r
+ this.submit();\r
+ }\r
+ },\r
+\r
+ selectAll: function() {\r
+ if(!this.flagAvailable) {return;}\r
+ if(!this.flagAllowMultiple) {return;}\r
+ this.selected = new Object();\r
+ var lines = this.element.tBodies[0].rows;\r
+ for(var i = 0; i < lines.length; i++) {\r
+ this.select(lines[i].id, true);\r
+ }\r
+ },\r
+\r
+ selectEffect: function(trId, ctrl) {\r
+ if($(trId)) {\r
+ if(!this.flagAllowMultiple || !ctrl) {\r
+ this.unselectAll();\r
+ }\r
+ this.classNames.addClassNames($(trId), 'trSelected');\r
+ this.selected[trId] = true;\r
+ }\r
+ },\r
+\r
+ selectOrUnselect: function(trId, ctrl) {\r
+ if(!this.flagAvailable) {return;}\r
+ if(trId == null) {return;}\r
+ if(ctrl && this.selected[trId]) {\r
+ if(!this.flagAllowMultiple && !this.options.flagAllowUnselect) {return;}\r
+ this.unselect(trId);\r
+ } else {\r
+ this.select(trId, ctrl);\r
+ }\r
+ },\r
+\r
+ selectOrUnselectRange: function(trId) {\r
+ if(!this.flagAvailable) {return;}\r
+ if(trId == null) {return;}\r
+ if(this.lastSelected == null || this.lastSelected == trId) {\r
+ this.selectOrUnselect(trId);\r
+ return;\r
+ }\r
+ var flagSelect = false;\r
+ var lines = this.element.tBodies[0].rows;\r
+ var lastSelected = this.lastSelected\r
+ for(var i = 0; i < lines.length; i++) {\r
+ if(lines[i].id == trId || lines[i].id == lastSelected) {\r
+ flagSelect = (flagSelect) ? false : true;\r
+ } else if(!flagSelect) {\r
+ continue;\r
+ }\r
+ if(this.selected[lastSelected]) {\r
+ this.select(lines[i].id, true);\r
+ } else {\r
+ this.unselect(lines[i].id);\r
+ }\r
+ }\r
+ },\r
+\r
+ submit: function(trId) {\r
+ if(!this.flagAvailable) {return;}\r
+ var selected = this.getSelected();\r
+ this.options.functionSubmit(selected[0]);\r
+ },\r
+\r
+ unselect: function(trId) {\r
+ if(!this.flagAvailable) {return;}\r
+ this.classNames.removeClassNames($(trId), 'trSelected');\r
+ delete this.selected[trId];\r
+ this.lastSelected = trId;\r
+ this.options.functionPostUnselect(this);\r
+ },\r
+\r
+ unselectAll: function() {\r
+ if(!this.flagAvailable) {return;}\r
+ var lines = this.element.tBodies[0].rows;\r
+ for(var i = 0; i < lines.length; i++) {\r
+ this.unselect(lines[i].id);\r
+ }\r
+ }\r
+}\r
+\r
+var SelectableTableManager = Class.create();\r
+SelectableTableManager.prototype = {\r
+ initialize: function() {\r
+ this.active = null,\r
+ this.list = {}\r
+ },\r
+ activate: function(key) {\r
+ this.stop();\r
+ if(this.list[key]) {\r
+ this.list[key].makeAvailable();\r
+ this.active = this.list[key];\r
+ } else {\r
+ this.active = null;\r
+ }\r
+ },\r
+ push: function(key, element) {\r
+ this.list[key] = element;\r
+ },\r
+ start: function() {\r
+ if(this.active) {\r
+ this.active.makeAvailable();\r
+ }\r
+ },\r
+ stop: function() {\r
+ $H(this.list).each(\r
+ function(el) {\r
+ if(el[1]) {\r
+ el[1].makeUnavailable();\r
+ }\r
+ }\r
+ );\r
+ }\r
+}\r
-// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-
-SideBarBox = Class.create();
-
-SideBarBox.className = {
- panelContainer : 'sideBarBox_panelContainer',
- tabContainer : 'sideBarBox_tabContainer',
- title : 'sideBarBox_tabTitle',
- tab : 'sideBarBox_tab',
- tabTopInactive : 'sideBarBox_tabTopInactive',
- tabTopActive : 'sideBarBox_tabTopActive',
- tabMiddleInactive : 'sideBarBox_tabMiddleInactive',
- tabMiddleActive : 'sideBarBox_tabMiddleActive',
- tabBottomInactive : 'sideBarBox_tabBottomInactive',
- tabBottomActive : 'sideBarBox_tabBottomActive'
-}
-
-SideBarBox.prototype = {
-
- initialize: function(element) {
- var options = Object.extend({
- selected: 1,
- beforeSelect: function() {return true},
- afterSelect: Prototype.emptyFunction,
- visible: false,
- close: true,
- cssPrefix: 'custom_'
- }, arguments[1] || {});
-
- this.options = options;
- this.element = $(element);
- Element.setStyle(this.element, {visibility: 'hidden'});
-
- var customCss = CssUtil.appendPrefix(this.options.cssPrefix, SideBarBox.className);
- this.classNames = new CssUtil([SideBarBox.className, customCss]);
-
- this.start();
- Element.setStyle(this.element, {visibility: 'visible'});
- },
-
- start: function() {
- this.tabs = [];
- this.panelContents = [];
- this.tabSets = [];
-
- this.visible = this.options.visible;
- this.selected = (this.options.selected > 0) ? this.options.selected - 1 : 0 ;
- this.selected = (this.visible) ? this.selected : -1;
-
- this.tabId = this.element.id + '_tab';
- this.tabTopId = this.tabId + '_top';
- this.tabMiddleId = this.tabId + '_middle';
- this.tabBottomId = this.tabId + '_bottom';
- this.tabContainerId = this.element.id + '_tabContainer';
- this.panelId = this.element.id + '_panel';
- this.panelContainerId = this.element.id + '_panelContainer';
-
- this.tabContainer = null;
- this.panelContainer = null;
-
- this.buildTabBox();
- },
-
- buildTabBox: function() {
- this.buildContainers();
-
- Element.cleanWhitespace(this.element);
- this.tabSets = this.element.childNodes;
- if (this.visible && this.selected >= this.tabSets.length) {
- this.selected = 0;
- }
- var i = 0;
- while(this.tabSets.length > 0){
- var tabSet = this.tabSets[0];
- var tabPanel = $A(tabSet.childNodes).detect(function(c) {
- return (c.nodeType == 1) && (c.tagName.toLowerCase() == 'div');
- });
- this.buildPanel(tabPanel, i);
- this.buildTab(tabSet, i);
- i++;
- }
- this.addContainers();
- },
-
- buildContainers : function() {
- this.tabContainer = Builder.node('div',{id:this.tabContainerId});
- this.classNames.addClassNames(this.tabContainer, 'tabContainer');
- this.panelContainer = Builder.node('div',
- {
- id:this.panelContainerId
- }
- );
- this.classNames.addClassNames(this.panelContainer, 'panelContainer');
-
- if (!this.visible) {
- Element.hide(this.panelContainer);
- }
- },
-
- addContainers : function() {
- this.element.appendChild(this.panelContainer);
- this.element.appendChild(this.tabContainer);
- this.element.appendChild(Builder.node('div', {style:'clear: left'}));
- },
-
- buildTab: function(tab, i) {
- var tabTitle = tab.childNodes;
- tab.id = this.tabId + i;
- this.classNames.addClassNames(tab, 'tab');
- var top = Builder.node('div',{id: this.tabTopId + i});
- var middle = Builder.node('div', {id: this.tabMiddleId + i}, $A(tabTitle));
- var bottom = Builder.node('div', {id: this.tabBottomId + i});
-
- tab.appendChild(top);
- tab.appendChild(middle);
- tab.appendChild(bottom);
- Event.observe(tab, 'click', this.selectTab.bindAsEventListener(this));
-
- this.tabs[i] = tab;
- this.tabContainer.appendChild(tab);
- if ( i != this.selected) {
- this.setTabInactive(tab);
- } else {
- this.setTabActive(tab);
- }
- },
-
- buildPanel: function(panelContent, i) {
- var panel = Builder.node('div', {id: this.panelId + i});
- panel.appendChild(panelContent);
- this.panelContents[i] = panel;
- if(i != this.selected) {
- Element.hide(panel);
- }
- this.panelContainer.appendChild(panel);
- },
-
- selectTab: function(e) {
- if (!this.options.beforeSelect()) return;
- if (!e) {
- this.setTabActive(this.tabs[this.selected]);
- Element.show(this.panelList[this.selected]);
- return;
- }
-
- var currentPanel = this.panelContents[this.selected];
- var currentTab = this.tabs[this.selected];
-
- var targetElement = null;
- if (e.nodeType) {
- targetElement = e;
- } else {
- targetElement = Event.element(e);
- }
- var targetIndex = this.getTargetIndex(targetElement);
- var targetPanel = this.panelContents[targetIndex];
- var targetTab = this.tabs[targetIndex];
- if (this.visible) {
- if (targetTab.id == currentTab.id) {
- if (this.options.close) {
- Effect.SlideRightOutOfView(this.panelContainer);
- this.visible = false;
- this.selected = -1;
- this.setTabInactive(currentTab);
- Element.toggle(targetPanel);
- }
- } else {
- this.setTabActive(targetTab);
- this.setTabInactive(currentTab);
- Element.toggle(currentPanel);
- Element.toggle(targetPanel);
- this.selected = targetIndex;
- }
- } else {
- this.setTabActive(targetTab);
- Element.toggle(targetPanel);
- Effect.SlideRightIntoView(this.panelContainer);
- this.visible = true;
- this.selected = targetIndex;
- }
- this.options.afterSelect(targetPanel, currentPanel);
- },
-
- setTabActive: function(tab) {
- var tabChildren = tab.childNodes;
-
- this.classNames.refreshClassNames(tabChildren[0], 'tabTopActive');
- this.classNames.refreshClassNames(tabChildren[1], 'tabMiddleActive');
- this.classNames.refreshClassNames(tabChildren[2], 'tabBottomActive');
- },
-
- setTabInactive: function(tab) {
- var tabChildren = tab.childNodes;
-
- this.classNames.refreshClassNames(tabChildren[0], 'tabTopInactive');
- this.classNames.refreshClassNames(tabChildren[1], 'tabMiddleInactive');
- this.classNames.refreshClassNames(tabChildren[2], 'tabBottomInactive');
- },
-
- getTargetIndex: function(element) {
- while(element) {
- if (element.id && element.id.indexOf(this.tabId, 0) >= 0) {
- var index = element.id.substring(this.tabId.length);
- if (!isNaN(index)) {
- return index;
- }
- }
- element = element.parentNode;
- }
- },
-
- hasNextTab: function() {
- return this.getNextTab() ? true : false;
- },
-
- hasPreviousTab: function() {
- return this.getPreviousTab() ? true : false;
- },
-
- getNextTab: function() {
- return Element.next(this.getCurrentTab());
- },
-
- getPreviousTab: function() {
- return Element.previous(this.getCurrentTab());
- },
-
- selectNextTab: function() {
- this.selectTab(this.getNextTab());
- },
-
- selectPreviousTab: function() {
- this.selectTab(this.getPreviousTab());
- },
-
- tabCount: function() {
- return this.tabs.inject(0, function(i, t) {
- return t ? ++i : i;
- })
- },
-
- getCurrentPanel: function() {
- return this.panelContents[this.selected];
- },
-
- getCurrentTab: function() {
- return this.tabs[this.selected];
- }
-}
+// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+\r
+SideBarBox = Class.create();\r
+\r
+SideBarBox.className = {\r
+ panelContainer : 'sideBarBox_panelContainer',\r
+ tabContainer : 'sideBarBox_tabContainer',\r
+ title : 'sideBarBox_tabTitle',\r
+ tab : 'sideBarBox_tab',\r
+ tabTopInactive : 'sideBarBox_tabTopInactive',\r
+ tabTopActive : 'sideBarBox_tabTopActive',\r
+ tabMiddleInactive : 'sideBarBox_tabMiddleInactive',\r
+ tabMiddleActive : 'sideBarBox_tabMiddleActive',\r
+ tabBottomInactive : 'sideBarBox_tabBottomInactive',\r
+ tabBottomActive : 'sideBarBox_tabBottomActive' \r
+}\r
+\r
+SideBarBox.prototype = {\r
+ \r
+ initialize: function(element) {\r
+ var options = Object.extend({\r
+ selected: 1,\r
+ beforeSelect: function() {return true},\r
+ afterSelect: Prototype.emptyFunction,\r
+ visible: false,\r
+ close: true,\r
+ cssPrefix: 'custom_'\r
+ }, arguments[1] || {});\r
+ \r
+ this.options = options;\r
+ this.element = $(element);\r
+ Element.setStyle(this.element, {visibility: 'hidden'});\r
+ \r
+ var customCss = CssUtil.appendPrefix(this.options.cssPrefix, SideBarBox.className);\r
+ this.classNames = new CssUtil([SideBarBox.className, customCss]);\r
+ \r
+ this.start();\r
+ Element.setStyle(this.element, {visibility: 'visible'});\r
+ },\r
+ \r
+ start: function() {\r
+ this.tabs = [];\r
+ this.panelContents = [];\r
+ this.tabSets = [];\r
+ \r
+ this.visible = this.options.visible;\r
+ this.selected = (this.options.selected > 0) ? this.options.selected - 1 : 0 ;\r
+ this.selected = (this.visible) ? this.selected : -1;\r
+ \r
+ this.tabId = this.element.id + '_tab';\r
+ this.tabTopId = this.tabId + '_top';\r
+ this.tabMiddleId = this.tabId + '_middle';\r
+ this.tabBottomId = this.tabId + '_bottom';\r
+ this.tabContainerId = this.element.id + '_tabContainer';\r
+ this.panelId = this.element.id + '_panel';\r
+ this.panelContainerId = this.element.id + '_panelContainer';\r
+\r
+ this.tabContainer = null; \r
+ this.panelContainer = null;\r
+ \r
+ this.buildTabBox(); \r
+ },\r
+ \r
+ buildTabBox: function() {\r
+ this.buildContainers();\r
+ \r
+ Element.cleanWhitespace(this.element);\r
+ this.tabSets = this.element.childNodes;\r
+ if (this.visible && this.selected >= this.tabSets.length) {\r
+ this.selected = 0;\r
+ }\r
+ var i = 0;\r
+ while(this.tabSets.length > 0){\r
+ var tabSet = this.tabSets[0];\r
+ var tabPanel = $A(tabSet.childNodes).detect(function(c) {\r
+ return (c.nodeType == 1) && (c.tagName.toLowerCase() == 'div');\r
+ });\r
+ this.buildPanel(tabPanel, i); \r
+ this.buildTab(tabSet, i);\r
+ i++;\r
+ }\r
+ this.addContainers();\r
+ },\r
+ \r
+ buildContainers : function() {\r
+ this.tabContainer = Builder.node('div',{id:this.tabContainerId});\r
+ this.classNames.addClassNames(this.tabContainer, 'tabContainer');\r
+ this.panelContainer = Builder.node('div',\r
+ {\r
+ id:this.panelContainerId\r
+ }\r
+ );\r
+ this.classNames.addClassNames(this.panelContainer, 'panelContainer');\r
+\r
+ if (!this.visible) {\r
+ Element.hide(this.panelContainer);\r
+ }\r
+ },\r
+ \r
+ addContainers : function() {\r
+ this.element.appendChild(this.panelContainer);\r
+ this.element.appendChild(this.tabContainer);\r
+ this.element.appendChild(Builder.node('div', {style:'clear: left'}));\r
+ },\r
+ \r
+ buildTab: function(tab, i) {\r
+ var tabTitle = tab.childNodes;\r
+ tab.id = this.tabId + i;\r
+ this.classNames.addClassNames(tab, 'tab');\r
+ var top = Builder.node('div',{id: this.tabTopId + i});\r
+ var middle = Builder.node('div', {id: this.tabMiddleId + i}, $A(tabTitle));\r
+ var bottom = Builder.node('div', {id: this.tabBottomId + i});\r
+ \r
+ tab.appendChild(top);\r
+ tab.appendChild(middle);\r
+ tab.appendChild(bottom);\r
+ Event.observe(tab, 'click', this.selectTab.bindAsEventListener(this));\r
+ \r
+ this.tabs[i] = tab;\r
+ this.tabContainer.appendChild(tab);\r
+ if ( i != this.selected) {\r
+ this.setTabInactive(tab);\r
+ } else {\r
+ this.setTabActive(tab);\r
+ }\r
+ },\r
+ \r
+ buildPanel: function(panelContent, i) {\r
+ var panel = Builder.node('div', {id: this.panelId + i});\r
+ panel.appendChild(panelContent);\r
+ this.panelContents[i] = panel;\r
+ if(i != this.selected) {\r
+ Element.hide(panel);\r
+ }\r
+ this.panelContainer.appendChild(panel);\r
+ },\r
+ \r
+ selectTab: function(e) {\r
+ if (!this.options.beforeSelect()) return;\r
+ if (!e) {\r
+ this.setTabActive(this.tabs[this.selected]);\r
+ Element.show(this.panelList[this.selected]);\r
+ return;\r
+ }\r
+\r
+ var currentPanel = this.panelContents[this.selected];\r
+ var currentTab = this.tabs[this.selected];\r
+\r
+ var targetElement = null;\r
+ if (e.nodeType) {\r
+ targetElement = e; \r
+ } else {\r
+ targetElement = Event.element(e);\r
+ }\r
+ var targetIndex = this.getTargetIndex(targetElement);\r
+ var targetPanel = this.panelContents[targetIndex];\r
+ var targetTab = this.tabs[targetIndex];\r
+ if (this.visible) {\r
+ if (targetTab.id == currentTab.id) {\r
+ if (this.options.close) {\r
+ Effect.SlideRightOutOfView(this.panelContainer);\r
+ this.visible = false;\r
+ this.selected = -1;\r
+ this.setTabInactive(currentTab);\r
+ Element.toggle(targetPanel);\r
+ }\r
+ } else {\r
+ this.setTabActive(targetTab);\r
+ this.setTabInactive(currentTab);\r
+ Element.toggle(currentPanel);\r
+ Element.toggle(targetPanel);\r
+ this.selected = targetIndex;\r
+ }\r
+ } else {\r
+ this.setTabActive(targetTab);\r
+ Element.toggle(targetPanel);\r
+ Effect.SlideRightIntoView(this.panelContainer);\r
+ this.visible = true; \r
+ this.selected = targetIndex;\r
+ }\r
+ this.options.afterSelect(targetPanel, currentPanel);\r
+ },\r
+ \r
+ setTabActive: function(tab) {\r
+ var tabChildren = tab.childNodes;\r
+\r
+ this.classNames.refreshClassNames(tabChildren[0], 'tabTopActive');\r
+ this.classNames.refreshClassNames(tabChildren[1], 'tabMiddleActive');\r
+ this.classNames.refreshClassNames(tabChildren[2], 'tabBottomActive');\r
+ },\r
+ \r
+ setTabInactive: function(tab) {\r
+ var tabChildren = tab.childNodes;\r
+ \r
+ this.classNames.refreshClassNames(tabChildren[0], 'tabTopInactive');\r
+ this.classNames.refreshClassNames(tabChildren[1], 'tabMiddleInactive');\r
+ this.classNames.refreshClassNames(tabChildren[2], 'tabBottomInactive');\r
+ },\r
+ \r
+ getTargetIndex: function(element) {\r
+ while(element) {\r
+ if (element.id && element.id.indexOf(this.tabId, 0) >= 0) {\r
+ var index = element.id.substring(this.tabId.length);\r
+ if (!isNaN(index)) {\r
+ return index;\r
+ }\r
+ }\r
+ element = element.parentNode;\r
+ }\r
+ },\r
+\r
+ hasNextTab: function() {\r
+ return this.getNextTab() ? true : false;\r
+ },\r
+\r
+ hasPreviousTab: function() {\r
+ return this.getPreviousTab() ? true : false;\r
+ },\r
+\r
+ getNextTab: function() {\r
+ return Element.next(this.getCurrentTab());\r
+ },\r
+\r
+ getPreviousTab: function() {\r
+ return Element.previous(this.getCurrentTab());\r
+ },\r
+\r
+ selectNextTab: function() {\r
+ this.selectTab(this.getNextTab());\r
+ },\r
+\r
+ selectPreviousTab: function() {\r
+ this.selectTab(this.getPreviousTab());\r
+ },\r
+\r
+ tabCount: function() {\r
+ return this.tabs.inject(0, function(i, t) {\r
+ return t ? ++i : i;\r
+ })\r
+ },\r
+\r
+ getCurrentPanel: function() {\r
+ return this.panelContents[this.selected];\r
+ },\r
+\r
+ getCurrentTab: function() {\r
+ return this.tabs[this.selected];\r
+ }\r
+}\r
-// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)
-//
-// This code is substantially based on code from script.aculo.us which has the
-// following copyright and permission notice
-//
-// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Effect.SlideRightIntoView = function(element) {
- element = $(element);
- Element.cleanWhitespace(element);
-
- var oldInnerRight = element.firstChild.style.right;
- var elementDimensions = Element.getDimensions(element);
- return new Effect.Scale(element, 100,
- Object.extend({ scaleContent: false,
- scaleY: false,
- scaleFrom: 0,
- scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
- restoreAfterFinish: true,
- afterSetup: function(effect) {
- Element.makePositioned(effect.element.firstChild);
- if (window.opera) effect.element.firstChild.style.left = "";
- Element.makeClipping(effect.element);
- element.style.width = '0';
- Element.show(element);
- },
- afterUpdateInternal: function(effect) {
- effect.element.firstChild.style.right =
- (effect.dims[1] - effect.element.clientWidth) + 'px'; },
- afterFinishInternal: function(effect) {
- Element.undoClipping(effect.element);
- Element.undoPositioned(effect.element.firstChild);
- effect.element.firstChild.style.right = oldInnerRight; }
- }, arguments[1] || {})
- );
-}
-
-Effect.SlideRightOutOfView = function(element) {
- element = $(element);
- Element.cleanWhitespace(element);
- var oldInnerRight = element.firstChild.style.right;
- return new Effect.Scale(element, 0,
- Object.extend({ scaleContent: false,
- scaleY: false,
- scaleMode: 'box',
- scaleFrom: 100,
- restoreAfterFinish: true,
- beforeStartInternal: function(effect) {
- Element.makePositioned(effect.element.firstChild);
- if (window.opera) effect.element.firstChild.style.left = "";
- Element.makeClipping(effect.element);
- Element.show(element);
- },
- afterUpdateInternal: function(effect) {
- effect.element.firstChild.style.right =
- (effect.dims[1] - effect.element.clientWidth) + 'px'; },
- afterFinishInternal: function(effect) {
- Element.hide(effect.element);
- Element.undoClipping(effect.element);
- Element.undoPositioned(effect.element.firstChild);
- effect.element.firstChild.style.right = oldInnerRight; }
- }, arguments[1] || {})
- );
-}
+// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// This code is substantially based on code from script.aculo.us which has the \r
+// following copyright and permission notice\r
+//\r
+// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+Effect.SlideRightIntoView = function(element) {\r
+ element = $(element);\r
+ Element.cleanWhitespace(element);\r
+\r
+ var oldInnerRight = element.firstChild.style.right;\r
+ var elementDimensions = Element.getDimensions(element);\r
+ return new Effect.Scale(element, 100, \r
+ Object.extend({ scaleContent: false, \r
+ scaleY: false, \r
+ scaleFrom: 0,\r
+ scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, \r
+ restoreAfterFinish: true,\r
+ afterSetup: function(effect) {\r
+ Element.makePositioned(effect.element.firstChild);\r
+ if (window.opera) effect.element.firstChild.style.left = "";\r
+ Element.makeClipping(effect.element);\r
+ element.style.width = '0';\r
+ Element.show(element); \r
+ }, \r
+ afterUpdateInternal: function(effect) { \r
+ effect.element.firstChild.style.right = \r
+ (effect.dims[1] - effect.element.clientWidth) + 'px'; },\r
+ afterFinishInternal: function(effect) { \r
+ Element.undoClipping(effect.element); \r
+ Element.undoPositioned(effect.element.firstChild);\r
+ effect.element.firstChild.style.right = oldInnerRight; }\r
+ }, arguments[1] || {})\r
+ );\r
+}\r
+\r
+Effect.SlideRightOutOfView = function(element) {\r
+ element = $(element);\r
+ Element.cleanWhitespace(element);\r
+ var oldInnerRight = element.firstChild.style.right;\r
+ return new Effect.Scale(element, 0, \r
+ Object.extend({ scaleContent: false, \r
+ scaleY: false, \r
+ scaleMode: 'box',\r
+ scaleFrom: 100,\r
+ restoreAfterFinish: true,\r
+ beforeStartInternal: function(effect) { \r
+ Element.makePositioned(effect.element.firstChild);\r
+ if (window.opera) effect.element.firstChild.style.left = "";\r
+ Element.makeClipping(effect.element);\r
+ Element.show(element); \r
+ }, \r
+ afterUpdateInternal: function(effect) { \r
+ effect.element.firstChild.style.right = \r
+ (effect.dims[1] - effect.element.clientWidth) + 'px'; },\r
+ afterFinishInternal: function(effect) { \r
+ Element.hide(effect.element);\r
+ Element.undoClipping(effect.element); \r
+ Element.undoPositioned(effect.element.firstChild);\r
+ effect.element.firstChild.style.right = oldInnerRight; }\r
+ }, arguments[1] || {})\r
+ );\r
+}\r
-// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-var SortableTable = Class.create();
-
-SortableTable.classNames = {
- header: 'sortableTable_header',
- title: 'sortableTable_title',
- empty: 'sortableTable_empty',
- down: 'sortableTable_down',
- up: 'sortableTable_up',
- mark: 'sortableTable_mark',
- thead: 'sortableTable_thead',
- tbody: 'sortableTable_tbody'
-}
-
-SortableTable.prototype = {
-
- initialize: function(element) {
- this.element = $(element);
- Element.setStyle(this.element, {visibility: 'hidden'});
-
- var options = Object.extend({
- sortType: false,
- cssPrefix: 'custom_'
- }, arguments[1] || {});
-
- var customCss = CssUtil.appendPrefix(options.cssPrefix, SortableTable.classNames);
- this.classNames = new CssUtil([SortableTable.classNames, customCss]);
-
- this.sortType = options.sortType;
-
- this.currentOrder = 'default';
- this.defaultOrder = new Array();
- for (var i = 1; i < this.element.rows.length; i++) {
- this.defaultOrder[i - 1] = this.element.rows[i];
- }
-
- this.build();
- Element.setStyle(this.element, {visibility: 'visible'});
- },
-
- build: function() {
- thead = this.element.tHead;
- this.classNames.addClassNames(thead, 'thead');
- tbody = thead.nextSibling;
- while ((tbody.nodeType != 1) || (tbody.tagName.toLowerCase() != 'tbody')) {
- tbody = tbody.nextSibling;
- }
- this.classNames.addClassNames(tbody, 'tbody');
- var rows = this.element.rows[0];
- if (!rows) return;
-
- for (var i = 0; i < rows.cells.length; i++) {
-
- var cell = rows.cells[i];
- cell.style.cursor = 'pointer';
-
- Element.cleanWhitespace(cell);
- var title = Builder.node('DIV', $A(cell.childNodes));
- this.classNames.addClassNames(title, 'title');
-
- var img = Builder.node('DIV');
- this.classNames.addClassNames(img, 'mark');
- this.classNames.addClassNames(img, 'empty');
-
- var header = Builder.node('DIV', [title, img]);
- this.classNames.addClassNames(header, 'header');
- cell.appendChild(header);
-
- var titleWidth = title.offsetWidth;
- var imgWidth = img.offsetWidth;
-
- title.style.width = (titleWidth + imgWidth) + 'px';
- Event.observe(rows.cells[i], 'click', this.sortTable.bindAsEventListener(this));
- }
- },
-
- sortTable: function(event) {
- var cell = Event.element(event);
-
- if (cell.tagName.toUpperCase() != 'TD' && cell.tagName.toUpperCase() != 'TH') {
- cell = Element.getParentByTagName(['TD','TH'], cell);
- }
-
- var tmpColumn = cell.cellIndex;
- if (this.targetColumn != tmpColumn) {
- this.currentOrder = 'default';
- }
- this.targetColumn = tmpColumn;
-
- var newRows = new Array();
- for (var i = 1; i < this.element.rows.length; i++) {
- newRows[i - 1] = this.element.rows[i];
- }
- if (newRows.length < 1) return;
-
- if (this.currentOrder == 'default') {
- newRows.sort(this.getSortFunc());
- this.currentOrder = 'asc';
- } else if (this.currentOrder == 'asc') {
- newRows = newRows.reverse();
- this.currentOrder = 'desc';
- } else if (this.currentOrder == 'desc') {
- newRows = this.defaultOrder;
- this.currentOrder = 'default';
- }
-
- for (var i = 0; i < newRows.length; i++) {
- this.element.tBodies[0].appendChild(newRows[i]);
- }
-
- this.mark(cell);
- },
-
- mark: function(cell) {
- var images = document.getElementsByClassName(SortableTable.classNames.mark, this.element);
- var targetImg = document.getElementsByClassName(SortableTable.classNames.mark, cell)[0];
-
- for (var i = 0; i < images.length; i++) {
- var parent = images[i].parentNode;
- var title = document.getElementsByClassName(SortableTable.classNames.title, parent)[0];
- var titleWidth = title.offsetWidth;
-
- if (targetImg == images[i]) {
-
- var imgWidth = targetImg.offsetWidth;
-
- if (this.currentOrder == 'asc') {
- this.classNames.addClassNames(targetImg, 'down');
- this.classNames.removeClassNames(targetImg, 'empty');
- if (!document.all) title.style.width = (titleWidth - imgWidth) + 'px';
-
- } else if (this.currentOrder == 'desc') {
- this.classNames.addClassNames(targetImg, 'up');
- this.classNames.removeClassNames(targetImg, 'down');
-
- } else if (this.currentOrder == 'default') {
- this.classNames.addClassNames(targetImg, 'empty');
- this.classNames.removeClassNames(targetImg, 'up');
- if (!document.all) title.style.width = (titleWidth + imgWidth) + 'px';
- }
-
- } else {
-
- if (Element.hasClassName(images[i], SortableTable.classNames.empty))
- continue;
-
- else if (Element.hasClassName(images[i], SortableTable.classNames.down))
- this.classNames.removeClassNames(images[i], 'down');
-
- else if (Element.hasClassName(images[i], SortableTable.classNames.up))
- this.classNames.removeClassNames(images[i], 'up');
-
- var imgWidth = targetImg.offsetWidth;
- this.classNames.addClassNames(images[i], 'empty');
- if (!document.all) title.style.width = (titleWidth + imgWidth) + 'px';
- }
- }
- },
-
- getSortFunc: function() {
- if (!this.sortType || !this.sortType[this.targetColumn])
- return SortFunction.string(this);
-
- var type = this.getSortType();
-
- if (!this.sortType || !type) {
- return SortFunction.string(this);
- } else if (type == SortFunction.numeric) {
- return SortFunction.number(this);
- }
-
- return SortFunction.date(this);
- },
-
- getSortType: function() {
- return this.sortType[this.targetColumn];
- }
-}
-
-var SortFunction = Class.create();
-SortFunction = {
- string: 'string',
- numeric: 'numeric',
- mmddyyyy: 'mmddyyyy',
- mmddyy: 'mmddyy',
- yyyymmdd: 'yyyymmdd',
- yymmdd: 'yymmdd',
- ddmmyyyy: 'ddmmyyyy',
- ddmmyy: 'ddmmyy',
-
- date: function(grid) {
- return function(fst, snd) {
- var aValue = Element.collectTextNodes(fst.cells[grid.targetColumn]);
- var bValue = Element.collectTextNodes(snd.cells[grid.targetColumn]);
- var date1, date2;
-
- var date1 = SortFunction.getDateString(aValue, grid.getSortType());
- var date2 = SortFunction.getDateString(bValue, grid.getSortType());
-
- if (date1 == date2) return 0;
- if (date1 < date2) return -1;
-
- return 1;
- }
- },
-
- number: function(grid) {
- return function(fst, snd) {
- var aValue = parseFloat(Element.collectTextNodes(fst.cells[grid.targetColumn]));
- if (isNaN(aValue)) aValue = 0;
- var bValue = parseFloat(Element.collectTextNodes(snd.cells[grid.targetColumn]));
- if (isNaN(bValue)) bValue = 0;
-
- return aValue - bValue;
- }
- },
-
- string: function(grid) {
- return function(fst, snd) {
- var aValue = Element.collectTextNodes(fst.cells[grid.targetColumn]);
- var bValue = Element.collectTextNodes(snd.cells[grid.targetColumn]);
- if (aValue == bValue) return 0;
- if (aValue < bValue) return -1;
- return 1;
- }
- },
-
- getDateString: function(date, type) {
- var array = date.split('/');
-
- if ((type == SortFunction.mmddyyyy) ||
- (type == SortFunction.mmddyy)) {
- var newArray = new Array();
- newArray.push(array[2]);
- newArray.push(array[0]);
- newArray.push(array[1]);
- } else if ((type == SortFunction.ddmmyyyy) ||
- (type == SortFunction.ddmmyy)) {
- var newArray = new Array();
- newArray.push(array[2]);
- newArray.push(array[1]);
- newArray.push(array[0]);
- } else {
- newArray = array;
- }
-
- return newArray.join();
- }
-}
-
+// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+var SortableTable = Class.create();\r
+\r
+SortableTable.classNames = {\r
+ header: 'sortableTable_header',\r
+ title: 'sortableTable_title',\r
+ empty: 'sortableTable_empty',\r
+ down: 'sortableTable_down',\r
+ up: 'sortableTable_up',\r
+ mark: 'sortableTable_mark',\r
+ thead: 'sortableTable_thead',\r
+ tbody: 'sortableTable_tbody'\r
+}\r
+\r
+SortableTable.prototype = {\r
+ \r
+ initialize: function(element) {\r
+ this.element = $(element);\r
+ Element.setStyle(this.element, {visibility: 'hidden'});\r
+\r
+ var options = Object.extend({\r
+ sortType: false,\r
+ cssPrefix: 'custom_'\r
+ }, arguments[1] || {});\r
+ \r
+ var customCss = CssUtil.appendPrefix(options.cssPrefix, SortableTable.classNames);\r
+ this.classNames = new CssUtil([SortableTable.classNames, customCss]);\r
+ \r
+ this.sortType = options.sortType;\r
+ \r
+ this.currentOrder = 'default';\r
+ this.defaultOrder = new Array();\r
+ for (var i = 1; i < this.element.rows.length; i++) {\r
+ this.defaultOrder[i - 1] = this.element.rows[i];\r
+ }\r
+ \r
+ this.build();\r
+ Element.setStyle(this.element, {visibility: 'visible'});\r
+ },\r
+ \r
+ build: function() {\r
+ thead = this.element.tHead;\r
+ this.classNames.addClassNames(thead, 'thead');\r
+ tbody = thead.nextSibling;\r
+ while ((tbody.nodeType != 1) || (tbody.tagName.toLowerCase() != 'tbody')) {\r
+ tbody = tbody.nextSibling;\r
+ }\r
+ this.classNames.addClassNames(tbody, 'tbody');\r
+ var rows = this.element.rows[0];\r
+ if (!rows) return;\r
+ \r
+ for (var i = 0; i < rows.cells.length; i++) {\r
+ \r
+ var cell = rows.cells[i];\r
+ cell.style.cursor = 'pointer';\r
+ \r
+ Element.cleanWhitespace(cell);\r
+ var title = Builder.node('DIV', $A(cell.childNodes));\r
+ this.classNames.addClassNames(title, 'title');\r
+ \r
+ var img = Builder.node('DIV');\r
+ this.classNames.addClassNames(img, 'mark');\r
+ this.classNames.addClassNames(img, 'empty');\r
+\r
+ var header = Builder.node('DIV', [title, img]);\r
+ this.classNames.addClassNames(header, 'header');\r
+ cell.appendChild(header);\r
+ \r
+ var titleWidth = title.offsetWidth;\r
+ var imgWidth = img.offsetWidth;\r
+ \r
+ title.style.width = (titleWidth + imgWidth) + 'px';\r
+ Event.observe(rows.cells[i], 'click', this.sortTable.bindAsEventListener(this));\r
+ }\r
+ },\r
+\r
+ sortTable: function(event) {\r
+ var cell = Event.element(event);\r
+\r
+ if (cell.tagName.toUpperCase() != 'TD' && cell.tagName.toUpperCase() != 'TH') {\r
+ cell = Element.getParentByTagName(['TD','TH'], cell);\r
+ }\r
+\r
+ var tmpColumn = cell.cellIndex;\r
+ if (this.targetColumn != tmpColumn) {\r
+ this.currentOrder = 'default';\r
+ }\r
+ this.targetColumn = tmpColumn;\r
+ \r
+ var newRows = new Array();\r
+ for (var i = 1; i < this.element.rows.length; i++) {\r
+ newRows[i - 1] = this.element.rows[i];\r
+ }\r
+ if (newRows.length < 1) return;\r
+ \r
+ if (this.currentOrder == 'default') {\r
+ newRows.sort(this.getSortFunc());\r
+ this.currentOrder = 'asc';\r
+ } else if (this.currentOrder == 'asc') {\r
+ newRows = newRows.reverse();\r
+ this.currentOrder = 'desc';\r
+ } else if (this.currentOrder == 'desc') {\r
+ newRows = this.defaultOrder;\r
+ this.currentOrder = 'default';\r
+ }\r
+ \r
+ for (var i = 0; i < newRows.length; i++) {\r
+ this.element.tBodies[0].appendChild(newRows[i]);\r
+ }\r
+ \r
+ this.mark(cell);\r
+ },\r
+ \r
+ mark: function(cell) {\r
+ var images = document.getElementsByClassName(SortableTable.classNames.mark, this.element);\r
+ var targetImg = document.getElementsByClassName(SortableTable.classNames.mark, cell)[0];\r
+ \r
+ for (var i = 0; i < images.length; i++) {\r
+ var parent = images[i].parentNode;\r
+ var title = document.getElementsByClassName(SortableTable.classNames.title, parent)[0];\r
+ var titleWidth = title.offsetWidth;\r
+ \r
+ if (targetImg == images[i]) {\r
+ \r
+ var imgWidth = targetImg.offsetWidth;\r
+ \r
+ if (this.currentOrder == 'asc') {\r
+ this.classNames.addClassNames(targetImg, 'down');\r
+ this.classNames.removeClassNames(targetImg, 'empty');\r
+ if (!document.all) title.style.width = (titleWidth - imgWidth) + 'px';\r
+ \r
+ } else if (this.currentOrder == 'desc') {\r
+ this.classNames.addClassNames(targetImg, 'up');\r
+ this.classNames.removeClassNames(targetImg, 'down');\r
+ \r
+ } else if (this.currentOrder == 'default') {\r
+ this.classNames.addClassNames(targetImg, 'empty');\r
+ this.classNames.removeClassNames(targetImg, 'up');\r
+ if (!document.all) title.style.width = (titleWidth + imgWidth) + 'px';\r
+ }\r
+ \r
+ } else {\r
+ \r
+ if (Element.hasClassName(images[i], SortableTable.classNames.empty))\r
+ continue;\r
+ \r
+ else if (Element.hasClassName(images[i], SortableTable.classNames.down))\r
+ this.classNames.removeClassNames(images[i], 'down');\r
+ \r
+ else if (Element.hasClassName(images[i], SortableTable.classNames.up))\r
+ this.classNames.removeClassNames(images[i], 'up');\r
+ \r
+ var imgWidth = targetImg.offsetWidth;\r
+ this.classNames.addClassNames(images[i], 'empty');\r
+ if (!document.all) title.style.width = (titleWidth + imgWidth) + 'px';\r
+ }\r
+ }\r
+ },\r
+\r
+ getSortFunc: function() {\r
+ if (!this.sortType || !this.sortType[this.targetColumn])\r
+ return SortFunction.string(this);\r
+ \r
+ var type = this.getSortType();\r
+ \r
+ if (!this.sortType || !type) {\r
+ return SortFunction.string(this);\r
+ } else if (type == SortFunction.numeric) {\r
+ return SortFunction.number(this);\r
+ } \r
+ \r
+ return SortFunction.date(this);\r
+ },\r
+ \r
+ getSortType: function() {\r
+ return this.sortType[this.targetColumn];\r
+ }\r
+}\r
+\r
+var SortFunction = Class.create();\r
+SortFunction = {\r
+ string: 'string',\r
+ numeric: 'numeric',\r
+ mmddyyyy: 'mmddyyyy',\r
+ mmddyy: 'mmddyy',\r
+ yyyymmdd: 'yyyymmdd',\r
+ yymmdd: 'yymmdd',\r
+ ddmmyyyy: 'ddmmyyyy',\r
+ ddmmyy: 'ddmmyy',\r
+ \r
+ date: function(grid) {\r
+ return function(fst, snd) {\r
+ var aValue = Element.collectTextNodes(fst.cells[grid.targetColumn]);\r
+ var bValue = Element.collectTextNodes(snd.cells[grid.targetColumn]);\r
+ var date1, date2;\r
+ \r
+ var date1 = SortFunction.getDateString(aValue, grid.getSortType());\r
+ var date2 = SortFunction.getDateString(bValue, grid.getSortType());\r
+ \r
+ if (date1 == date2) return 0;\r
+ if (date1 < date2) return -1;\r
+ \r
+ return 1;\r
+ }\r
+ },\r
+ \r
+ number: function(grid) {\r
+ return function(fst, snd) {\r
+ var aValue = parseFloat(Element.collectTextNodes(fst.cells[grid.targetColumn]));\r
+ if (isNaN(aValue)) aValue = 0;\r
+ var bValue = parseFloat(Element.collectTextNodes(snd.cells[grid.targetColumn])); \r
+ if (isNaN(bValue)) bValue = 0;\r
+ \r
+ return aValue - bValue;\r
+ }\r
+ },\r
+ \r
+ string: function(grid) {\r
+ return function(fst, snd) {\r
+ var aValue = Element.collectTextNodes(fst.cells[grid.targetColumn]);\r
+ var bValue = Element.collectTextNodes(snd.cells[grid.targetColumn]);\r
+ if (aValue == bValue) return 0;\r
+ if (aValue < bValue) return -1;\r
+ return 1;\r
+ }\r
+ },\r
+ \r
+ getDateString: function(date, type) {\r
+ var array = date.split('/');\r
+\r
+ if ((type == SortFunction.mmddyyyy) ||\r
+ (type == SortFunction.mmddyy)) {\r
+ var newArray = new Array();\r
+ newArray.push(array[2]);\r
+ newArray.push(array[0]);\r
+ newArray.push(array[1]);\r
+ } else if ((type == SortFunction.ddmmyyyy) ||\r
+ (type == SortFunction.ddmmyy)) {\r
+ var newArray = new Array();\r
+ newArray.push(array[2]);\r
+ newArray.push(array[1]);\r
+ newArray.push(array[0]);\r
+ } else {\r
+ newArray = array;\r
+ }\r
+ \r
+ return newArray.join();\r
+ }\r
+}\r
+\r
-var Switcher = Class.create();
-Switcher.classNames = {
- open: 'switcher_state_open',
- close: 'switcher_state_close'
-}
-Switcher.prototype = {
- initialize: function(sw, content) {
- this.options = Object.extend({
- open: false,
- duration: 0.4,
- beforeOpen: Prototype.emptyFunction,
- afterOpen: Prototype.emptyFunction,
- beforeClose: Prototype.emptyFunction,
- afterClose: Prototype.emptyFunction,
- effect: false,
- cssPrefix: 'custom_'
- }, arguments[2] || {});
-
- this.sw = $(sw);
- this.content = $(content);
-
- var customCss = CssUtil.appendPrefix(this.options.cssPrefix, Switcher.classNames);
- this.classNames = new CssUtil([Switcher.classNames, customCss]);
-
- if (this.options.open) {
- Element.show(this.content);
- this.classNames.addClassNames(this.sw, 'open');
- } else {
- Element.hide(this.content);
- this.classNames.addClassNames(this.sw, 'close');
- }
-
- Event.observe(this.sw, 'click', this.toggle.bind(this));
- },
-
- toggle: function() {
- if (Element.hasClassName(this.sw, Switcher.classNames.close)) {
- this.open();
- }else {
- this.close();
- }
- },
-
- open: function() {
- this.options.beforeOpen(this.content);
- this.classNames.refreshClassNames(this.sw, 'open');
- if (this.options.effect) {
- new Effect.BlindDown(this.content, {duration: this.options.duration});
- } else {
- Element.show(this.content);
- }
- this.options.afterOpen(this.content);
- },
-
- close: function() {
- this.options.beforeClose(this.content);
- this.classNames.refreshClassNames(this.sw, 'close');
- if (this.options.effect) {
- new Effect.BlindUp(this.content, {duration: this.options.duration});
- } else {
- Element.hide(this.content);
- }
- this.options.afterClose(this.content);
- }
-}
+var Switcher = Class.create();\r
+Switcher.classNames = {\r
+ open: 'switcher_state_open',\r
+ close: 'switcher_state_close'\r
+}\r
+Switcher.prototype = {\r
+ initialize: function(sw, content) {\r
+ this.options = Object.extend({\r
+ open: false,\r
+ duration: 0.4,\r
+ beforeOpen: Prototype.emptyFunction,\r
+ afterOpen: Prototype.emptyFunction,\r
+ beforeClose: Prototype.emptyFunction,\r
+ afterClose: Prototype.emptyFunction,\r
+ effect: false,\r
+ cssPrefix: 'custom_'\r
+ }, arguments[2] || {});\r
+\r
+ this.sw = $(sw);\r
+ this.content = $(content);\r
+\r
+ var customCss = CssUtil.appendPrefix(this.options.cssPrefix, Switcher.classNames);\r
+ this.classNames = new CssUtil([Switcher.classNames, customCss]);\r
+\r
+ if (this.options.open) {\r
+ Element.show(this.content);\r
+ this.classNames.addClassNames(this.sw, 'open');\r
+ } else {\r
+ Element.hide(this.content);\r
+ this.classNames.addClassNames(this.sw, 'close');\r
+ }\r
+\r
+ Event.observe(this.sw, 'click', this.toggle.bind(this));\r
+ },\r
+\r
+ toggle: function() {\r
+ if (Element.hasClassName(this.sw, Switcher.classNames.close)) {\r
+ this.open();\r
+ }else {\r
+ this.close();\r
+ }\r
+ },\r
+\r
+ open: function() {\r
+ this.options.beforeOpen(this.content);\r
+ this.classNames.refreshClassNames(this.sw, 'open');\r
+ if (this.options.effect) {\r
+ new Effect.BlindDown(this.content, {duration: this.options.duration});\r
+ } else {\r
+ Element.show(this.content);\r
+ }\r
+ this.options.afterOpen(this.content);\r
+ },\r
+\r
+ close: function() {\r
+ this.options.beforeClose(this.content);\r
+ this.classNames.refreshClassNames(this.sw, 'close');\r
+ if (this.options.effect) {\r
+ new Effect.BlindUp(this.content, {duration: this.options.duration});\r
+ } else {\r
+ Element.hide(this.content);\r
+ }\r
+ this.options.afterClose(this.content);\r
+ }\r
+}\r
-// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-TabBox = Class.create();
-TabBox.className = {
- tabBox: 'tabBox_tabBox',
- panelContainer: 'tabBox_panelContainer',
- tabContainer: 'tabBox_tabContainer',
- tab: 'tabBox_tab',
- tabLeftInactive: 'tabBox_tabLeftInactive',
- tabLeftActive: 'tabBox_tabLeftActive',
- tabMiddleInactive: 'tabBox_tabMiddleInactive',
- tabMiddleActive: 'tabBox_tabMiddleActive',
- tabRightInactive: 'tabBox_tabRightInactive',
- tabRightActive: 'tabBox_tabRightActive',
- tabTitle: 'tabBox_tabTitle',
- closeButton: 'tabBox_closeButton'
-}
-TabBox.prototype = {
-
- initialize: function(element) {
- var options = Object.extend({
- selected: 1,
- cssPrefix: 'custom_',
- beforeSelect: function() {return true},
- afterSelect: Prototype.emptyFunction,
- onRemove: function() {return true},
- sortable: false,
- closeButton: false,
- afterSort: Prototype.emptyFunction,
- onSort: Prototype.emptyFunction,
- lazyLoadUrl: [],
- onLazyLoad: Prototype.emptyFunction,
- afterLazyLoad: Prototype.emptyFunction,
- lazyLoadFailure: Prototype.emptyFunction,
- failureLimitOver: Prototype.emptyFunction,
- failureLimit: 5,
- tabRow: null,
- titleLength: null
- }, arguments[1] || {});
-
- this.options = options;
- this.element = $(element);
- Element.setStyle(this.element, {visibility: 'hidden'});
- Element.hide(this.element);
- this.selected = (this.options.selected > 0) ? this.options.selected - 1 : 0 ;
-
- var customCss = CssUtil.appendPrefix(this.options.cssPrefix, TabBox.className);
- this.classNames = new CssUtil([TabBox.className, customCss]);
- this.classNames.addClassNames(this.element, 'tabBox');
-
- this.start();
- Element.setStyle(this.element, {visibility: 'visible'});
- Element.show(this.element);
-
- if (this.options.lazyLoadUrl.length > 0) this.lazyLoad(0);
- },
-
- start: function() {
- this.tabs = [];
- this.panelList = [];
-
- this.tabId = this.element.id + '_tab';
- this.tabLeftId = this.tabId + '_left';
- this.tabMiddleId = this.tabId + '_middle';
- this.tabRightId = this.tabId + '_right';
- this.tabContainerId = this.element.id + '_tabContainer';
- this.panelId = this.element.id + '_panel';
- this.panelContainerId = this.element.id + '_panelContainer';
-
- this.tabContainer = null;
- this.panelContainer = null;
- this.build();
- if (this.options.sortable) this.setDrag();
- },
-
- setDrag: function() {
- Sortable.create(this.tabContainerId, {
- tag: 'div',
- overlap: 'horizontal',
- constraint: 'horizontal',
- onChange: this.options.onSort,
- onUpdate: this.options.afterSort,
- starteffect: Prototype.emptyFunction,
- endeffect: Prototype.emptyFunction
- });
- },
-
- build: function() {
- this.buildContainers();
-
- Element.cleanWhitespace(this.element);
- var tabSets = this.element.childNodes;
-
- if (tabSets.length <= this.selected) {
- this.selected = 0;
- }
- var i = 0;
- while(tabSets.length > 0) {
- this.buildTabSet(tabSets[0], i);
- i++;
- }
- this.addContainers();
- this.selectTab();
- },
-
- buildTabSet: function(element, i) {
- if (element.nodeType != 1) {
- Element.remove(element);
- return;
- }
- Element.cleanWhitespace(element);
- var panelContents = element.childNodes[1];
- this.buildPanel(panelContents, i);
- this.buildTab(element, i);
- },
-
- buildContainers : function() {
- this.tabContainer = Builder.node('div',{id:this.tabContainerId});
- this.classNames.addClassNames(this.tabContainer, 'tabContainer');
-
- this.panelContainer = Builder.node('div', {id:this.panelContainerId});
- this.classNames.addClassNames(this.panelContainer, 'panelContainer');
- },
-
- addContainers : function() {
- this.element.appendChild(this.tabContainer);
- this.element.appendChild(this.panelContainer);
- },
-
- buildTab: function(tab, i) {
- tab.id = this.tabId + i
- this.classNames.addClassNames(tab, 'tab');
- var tabTitle = Builder.node('div', [$A(tab.childNodes)]);
- this.classNames.addClassNames(tabTitle, 'tabTitle');
- var tabLeft = Builder.node('div', {id:this.tabLeftId + i});
- var tabMiddle = Builder.node('div', {id:this.tabMiddleId + i}, [tabTitle]);
- var tabRight = Builder.node('div',{id:this.tabRightId + i});
-
- tab.appendChild(tabLeft);
- tab.appendChild(tabMiddle);
- tab.appendChild(tabRight);
- Event.observe(tab, 'click', this.selectTab.bindAsEventListener(this));
- Event.observe(tab, 'mouseover', this.onMouseOver.bindAsEventListener(this));
- Event.observe(tab, 'mouseout', this.onMouseOut.bindAsEventListener(this));
-
- if (this.options.closeButton) {
- var button = Builder.node('div', {
- id: this.element.id.appendSuffix('closeButton_' + i)
- });
- this.classNames.addClassNames(button, 'closeButton');
- tabMiddle.appendChild(button);
- Event.observe(button, 'click', this.onRemove.bindAsEventListener(this));
- }
-
- if (this.options.tabRow && !isNaN(this.options.tabRow) && (i % this.options.tabRow == 0)) {
- Element.setStyle(tab, {clear: 'left', styleFloat: 'none'});
- }
-
- this.setTitle(tabMiddle);
- this.tabs[i] = tab;
- this.setTabInactive(tab);
- this.tabContainer.appendChild(tab);
- },
-
- setTitle: function(container) {
- var node = Element.getTextNodes(container, true)[0];
- title = node.nodeValue.replace(/^(\s)*/, '');
- title = title.replace(/(\s)*$/, '');
- var sortTitle = title;
- if (this.options.titleLength && !isNaN(this.options.titleLength)) {
- sortTitle = title.substring(0, this.options.titleLength);
- }
- node.nodeValue = sortTitle;
- container.parentNode.title = title;
- },
-
- buildPanel: function(panelContent, i) {
- var panel = Builder.node('div', {id: this.panelId + i});
- panel.appendChild(panelContent);
- Element.hide(panel);
- this.panelList[i] = panel;
- this.panelContainer.appendChild(panel);
- },
-
- selectTab: function(e){
- if (!this.options.beforeSelect()) return;
- if (!e) {
- this.setTabActive(this.tabs[this.selected]);
- Element.show(this.panelList[this.selected]);
- return;
- }
- var currentPanel = this.getCurrentPanel();
- var currentTab = this.getCurrentTab();
-
- var targetElement = null;
- if (e.nodeType) {
- targetElement = e;
- } else {
- targetElement = Event.element(e);
- }
- var targetIndex = this.getTargetIndex(targetElement);
- if (targetIndex == this.selected) {
- return;
- }
- var targetPanel = this.panelList[targetIndex];
- var targetTab = this.tabs[targetIndex];
-
- if (currentTab) this.setTabInactive(currentTab);
- this.setTabActive(targetTab);
-
- if (currentPanel) Element.toggle(currentPanel);
- Element.toggle(targetPanel);
-
- this.selected = targetIndex;
- this.options.afterSelect(targetPanel, currentPanel);
- },
-
- setTabActive: function(tab) {
- var tabChildren = tab.childNodes;
- this.classNames.refreshClassNames(tabChildren[0], 'tabLeftActive');
- this.classNames.refreshClassNames(tabChildren[1], 'tabMiddleActive');
- this.classNames.refreshClassNames(tabChildren[2], 'tabRightActive');
- },
-
- setTabInactive: function(tab) {
- var tabChildren = tab.childNodes;
- this.classNames.refreshClassNames(tabChildren[0], 'tabLeftInactive');
- this.classNames.refreshClassNames(tabChildren[1], 'tabMiddleInactive');
- this.classNames.refreshClassNames(tabChildren[2], 'tabRightInactive');
- },
-
- getTargetIndex: function(element) {
- while(element) {
- if (element.id && element.id.indexOf(this.tabId, 0) >= 0) {
- var index = element.id.substring(this.tabId.length);
- if (!isNaN(index)) {
- return index;
- }
- }
- element = element.parentNode;
- }
- },
-
- onRemove: function(event) {
- Event.stop(event);
- var element = Event.element(event);
- var index = this.getTargetIndex(element);
- var tab = this.tabs[index];
- if (this.options.onRemove(tab)) {
- this.remove(tab);
- }
- },
-
- remove: function(tab) {
- if (tab) {
- var index = this.getTargetIndex(tab);
- var nextActiveTab = this.getNextTab();
- if (!nextActiveTab) nextActiveTab = this.getPreviousTab();
- Element.remove(tab);
- Element.remove(this.panelList[index]);
- this.tabs[index] = null;
- this.panelList[index] = null;
-
- if (index == this.selected) {
- if (nextActiveTab) {
- this.selectTab(nextActiveTab);
- }
- }
- }
- },
-
- addByElement: function(element) {
- this.buildTabSet($(element), this.tabs.length);
- if (this.options.sortable) this.setDrag();
- },
-
- add: function(title, content) {
- var contents = [];
- var node = Builder.node('div');
- node.innerHTML = title;
- contents.push(node);
- node = Builder.node('div');
- node.innerHTML = content;
- contents.push(node);
- this.addByElement(Builder.node('div', contents));
- },
-
- lazyLoad: function(index) {
- this.errorCount = 0;
- this.loadedList = [];
- this.load(index);
- },
-
- load: function(index) {
- var container = this.panelList[index];
- var url = this.options.lazyLoadUrl[index];
- var self = this;
- if (container && url) {
- new Ajax.Updater(
- {success: container},
- url,
- {
- onSuccess: function() {
- self.setLoaded(index);
- self.options.onLazyLoad(container, self);
- self.load(++index);
- if (self.isFinishLazyLoad()) self.options.afterLazyLoad(self);
- },
- onFailure: function() {
- self.errorCount++;
- self.options.lazyLoadFailure(container, self);
- if (self.errorCount <= self.options.failureLimit) {
- self.load(index);
- } else {
- self.options.failureLimitOver(self);
- }
- },
- asynchronous: true,
- evalScripts: true
- }
- );
- }
- },
-
- isFinishLazyLoad: function() {
- return this.loadedList.length == this.panelList.length;
- },
-
- setLoaded: function(i) {
- this.loadedList.push(i);
- },
-
- onMouseOver: function(event) {
- var targetElement = Event.element(event);
- var targetIndex = this.getTargetIndex(targetElement);
- if (targetIndex != this.selected) {
- var targetTab = this.tabs[targetIndex];
- this.setTabActive(targetTab);
- }
- },
-
- onMouseOut: function(event) {
- var targetElement = Event.element(event);
- var targetIndex = this.getTargetIndex(targetElement);
- if (targetIndex != this.selected) {
- var targetTab = this.tabs[targetIndex];
- this.setTabInactive(targetTab);
- }
- },
-
- hasNextTab: function() {
- return this.getNextTab() ? true : false;
- },
-
- hasPreviousTab: function() {
- return this.getPreviousTab() ? true : false;
- },
-
- getNextTab: function() {
- return Element.next(this.getCurrentTab());
- },
-
- getPreviousTab: function() {
- return Element.previous(this.getCurrentTab());
- },
-
- selectNextTab: function() {
- this.selectTab(this.getNextTab());
- },
-
- selectPreviousTab: function() {
- this.selectTab(this.getPreviousTab());
- },
-
- tabCount: function() {
- return this.tabs.inject(0, function(i, t) {
- return t ? ++i : i;
- })
- },
-
- getCurrentPanel: function() {
- return this.panelList[this.selected];
- },
-
- getCurrentTab: function() {
- return this.tabs[this.selected];
- }
-}
+// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+TabBox = Class.create();\r
+TabBox.className = {\r
+ tabBox: 'tabBox_tabBox',\r
+ panelContainer: 'tabBox_panelContainer',\r
+ tabContainer: 'tabBox_tabContainer',\r
+ tab: 'tabBox_tab',\r
+ tabLeftInactive: 'tabBox_tabLeftInactive',\r
+ tabLeftActive: 'tabBox_tabLeftActive',\r
+ tabMiddleInactive: 'tabBox_tabMiddleInactive',\r
+ tabMiddleActive: 'tabBox_tabMiddleActive',\r
+ tabRightInactive: 'tabBox_tabRightInactive',\r
+ tabRightActive: 'tabBox_tabRightActive',\r
+ tabTitle: 'tabBox_tabTitle',\r
+ closeButton: 'tabBox_closeButton'\r
+}\r
+TabBox.prototype = {\r
+ \r
+ initialize: function(element) {\r
+ var options = Object.extend({\r
+ selected: 1,\r
+ cssPrefix: 'custom_',\r
+ beforeSelect: function() {return true},\r
+ afterSelect: Prototype.emptyFunction,\r
+ onRemove: function() {return true},\r
+ sortable: false,\r
+ closeButton: false,\r
+ afterSort: Prototype.emptyFunction,\r
+ onSort: Prototype.emptyFunction,\r
+ lazyLoadUrl: [],\r
+ onLazyLoad: Prototype.emptyFunction,\r
+ afterLazyLoad: Prototype.emptyFunction,\r
+ lazyLoadFailure: Prototype.emptyFunction,\r
+ failureLimitOver: Prototype.emptyFunction,\r
+ failureLimit: 5,\r
+ tabRow: null,\r
+ titleLength: null\r
+ }, arguments[1] || {});\r
+ \r
+ this.options = options;\r
+ this.element = $(element);\r
+ Element.setStyle(this.element, {visibility: 'hidden'});\r
+ Element.hide(this.element);\r
+ this.selected = (this.options.selected > 0) ? this.options.selected - 1 : 0 ;\r
+ \r
+ var customCss = CssUtil.appendPrefix(this.options.cssPrefix, TabBox.className);\r
+ this.classNames = new CssUtil([TabBox.className, customCss]);\r
+ this.classNames.addClassNames(this.element, 'tabBox');\r
+ \r
+ this.start();\r
+ Element.setStyle(this.element, {visibility: 'visible'});\r
+ Element.show(this.element);\r
+\r
+ if (this.options.lazyLoadUrl.length > 0) this.lazyLoad(0);\r
+ },\r
+ \r
+ start: function() {\r
+ this.tabs = [];\r
+ this.panelList = [];\r
+\r
+ this.tabId = this.element.id + '_tab';\r
+ this.tabLeftId = this.tabId + '_left';\r
+ this.tabMiddleId = this.tabId + '_middle';\r
+ this.tabRightId = this.tabId + '_right';\r
+ this.tabContainerId = this.element.id + '_tabContainer';\r
+ this.panelId = this.element.id + '_panel';\r
+ this.panelContainerId = this.element.id + '_panelContainer';\r
+ \r
+ this.tabContainer = null; \r
+ this.panelContainer = null;\r
+ this.build(); \r
+ if (this.options.sortable) this.setDrag();\r
+ },\r
+\r
+ setDrag: function() {\r
+ Sortable.create(this.tabContainerId, {\r
+ tag: 'div',\r
+ overlap: 'horizontal',\r
+ constraint: 'horizontal',\r
+ onChange: this.options.onSort,\r
+ onUpdate: this.options.afterSort,\r
+ starteffect: Prototype.emptyFunction,\r
+ endeffect: Prototype.emptyFunction\r
+ });\r
+ },\r
+ \r
+ build: function() {\r
+ this.buildContainers();\r
+ \r
+ Element.cleanWhitespace(this.element);\r
+ var tabSets = this.element.childNodes;\r
+ \r
+ if (tabSets.length <= this.selected) {\r
+ this.selected = 0;\r
+ }\r
+ var i = 0;\r
+ while(tabSets.length > 0) {\r
+ this.buildTabSet(tabSets[0], i);\r
+ i++;\r
+ }\r
+ this.addContainers();\r
+ this.selectTab();\r
+ },\r
+\r
+ buildTabSet: function(element, i) {\r
+ if (element.nodeType != 1) {\r
+ Element.remove(element);\r
+ return;\r
+ }\r
+ Element.cleanWhitespace(element);\r
+ var panelContents = element.childNodes[1];\r
+ this.buildPanel(panelContents, i); \r
+ this.buildTab(element, i);\r
+ },\r
+\r
+ buildContainers : function() {\r
+ this.tabContainer = Builder.node('div',{id:this.tabContainerId});\r
+ this.classNames.addClassNames(this.tabContainer, 'tabContainer');\r
+ \r
+ this.panelContainer = Builder.node('div', {id:this.panelContainerId});\r
+ this.classNames.addClassNames(this.panelContainer, 'panelContainer'); \r
+ },\r
+ \r
+ addContainers : function() {\r
+ this.element.appendChild(this.tabContainer);\r
+ this.element.appendChild(this.panelContainer);\r
+ },\r
+\r
+ buildTab: function(tab, i) {\r
+ tab.id = this.tabId + i\r
+ this.classNames.addClassNames(tab, 'tab');\r
+ var tabTitle = Builder.node('div', [$A(tab.childNodes)]); \r
+ this.classNames.addClassNames(tabTitle, 'tabTitle');\r
+ var tabLeft = Builder.node('div', {id:this.tabLeftId + i});\r
+ var tabMiddle = Builder.node('div', {id:this.tabMiddleId + i}, [tabTitle]);\r
+ var tabRight = Builder.node('div',{id:this.tabRightId + i});\r
+ \r
+ tab.appendChild(tabLeft);\r
+ tab.appendChild(tabMiddle);\r
+ tab.appendChild(tabRight);\r
+ Event.observe(tab, 'click', this.selectTab.bindAsEventListener(this));\r
+ Event.observe(tab, 'mouseover', this.onMouseOver.bindAsEventListener(this));\r
+ Event.observe(tab, 'mouseout', this.onMouseOut.bindAsEventListener(this));\r
+\r
+ if (this.options.closeButton) {\r
+ var button = Builder.node('div', {\r
+ id: this.element.id.appendSuffix('closeButton_' + i)\r
+ });\r
+ this.classNames.addClassNames(button, 'closeButton');\r
+ tabMiddle.appendChild(button);\r
+ Event.observe(button, 'click', this.onRemove.bindAsEventListener(this));\r
+ }\r
+\r
+ if (this.options.tabRow && !isNaN(this.options.tabRow) && (i % this.options.tabRow == 0)) {\r
+ Element.setStyle(tab, {clear: 'left', styleFloat: 'none'});\r
+ }\r
+\r
+ this.setTitle(tabMiddle);\r
+ this.tabs[i] = tab;\r
+ this.setTabInactive(tab);\r
+ this.tabContainer.appendChild(tab); \r
+ },\r
+\r
+ setTitle: function(container) {\r
+ var node = Element.getTextNodes(container, true)[0];\r
+ title = node.nodeValue.replace(/^(\s)*/, '');\r
+ title = title.replace(/(\s)*$/, '');\r
+ var sortTitle = title;\r
+ if (this.options.titleLength && !isNaN(this.options.titleLength)) {\r
+ sortTitle = title.substring(0, this.options.titleLength);\r
+ }\r
+ node.nodeValue = sortTitle;\r
+ container.parentNode.title = title;\r
+ },\r
+ \r
+ buildPanel: function(panelContent, i) {\r
+ var panel = Builder.node('div', {id: this.panelId + i});\r
+ panel.appendChild(panelContent);\r
+ Element.hide(panel);\r
+ this.panelList[i] = panel;\r
+ this.panelContainer.appendChild(panel);\r
+ },\r
+ \r
+ selectTab: function(e){\r
+ if (!this.options.beforeSelect()) return;\r
+ if (!e) {\r
+ this.setTabActive(this.tabs[this.selected]);\r
+ Element.show(this.panelList[this.selected]);\r
+ return;\r
+ }\r
+ var currentPanel = this.getCurrentPanel();\r
+ var currentTab = this.getCurrentTab();\r
+ \r
+ var targetElement = null;\r
+ if (e.nodeType) {\r
+ targetElement = e; \r
+ } else {\r
+ targetElement = Event.element(e);\r
+ }\r
+ var targetIndex = this.getTargetIndex(targetElement);\r
+ if (targetIndex == this.selected) {\r
+ return;\r
+ }\r
+ var targetPanel = this.panelList[targetIndex];\r
+ var targetTab = this.tabs[targetIndex];\r
+ \r
+ if (currentTab) this.setTabInactive(currentTab);\r
+ this.setTabActive(targetTab);\r
+\r
+ if (currentPanel) Element.toggle(currentPanel);\r
+ Element.toggle(targetPanel);\r
+\r
+ this.selected = targetIndex;\r
+ this.options.afterSelect(targetPanel, currentPanel);\r
+ },\r
+ \r
+ setTabActive: function(tab) {\r
+ var tabChildren = tab.childNodes;\r
+ this.classNames.refreshClassNames(tabChildren[0], 'tabLeftActive');\r
+ this.classNames.refreshClassNames(tabChildren[1], 'tabMiddleActive');\r
+ this.classNames.refreshClassNames(tabChildren[2], 'tabRightActive');\r
+ },\r
+ \r
+ setTabInactive: function(tab) {\r
+ var tabChildren = tab.childNodes;\r
+ this.classNames.refreshClassNames(tabChildren[0], 'tabLeftInactive');\r
+ this.classNames.refreshClassNames(tabChildren[1], 'tabMiddleInactive');\r
+ this.classNames.refreshClassNames(tabChildren[2], 'tabRightInactive');\r
+ },\r
+\r
+ getTargetIndex: function(element) {\r
+ while(element) {\r
+ if (element.id && element.id.indexOf(this.tabId, 0) >= 0) {\r
+ var index = element.id.substring(this.tabId.length);\r
+ if (!isNaN(index)) {\r
+ return index;\r
+ }\r
+ }\r
+ element = element.parentNode;\r
+ }\r
+ },\r
+\r
+ onRemove: function(event) {\r
+ Event.stop(event);\r
+ var element = Event.element(event);\r
+ var index = this.getTargetIndex(element);\r
+ var tab = this.tabs[index];\r
+ if (this.options.onRemove(tab)) {\r
+ this.remove(tab);\r
+ }\r
+ },\r
+\r
+ remove: function(tab) {\r
+ if (tab) {\r
+ var index = this.getTargetIndex(tab);\r
+ var nextActiveTab = this.getNextTab();\r
+ if (!nextActiveTab) nextActiveTab = this.getPreviousTab();\r
+ Element.remove(tab);\r
+ Element.remove(this.panelList[index]);\r
+ this.tabs[index] = null;\r
+ this.panelList[index] = null;\r
+ \r
+ if (index == this.selected) {\r
+ if (nextActiveTab) {\r
+ this.selectTab(nextActiveTab);\r
+ }\r
+ }\r
+ }\r
+ },\r
+\r
+ addByElement: function(element) {\r
+ this.buildTabSet($(element), this.tabs.length);\r
+ if (this.options.sortable) this.setDrag();\r
+ },\r
+\r
+ add: function(title, content) {\r
+ var contents = [];\r
+ var node = Builder.node('div');\r
+ node.innerHTML = title;\r
+ contents.push(node);\r
+ node = Builder.node('div');\r
+ node.innerHTML = content;\r
+ contents.push(node);\r
+ this.addByElement(Builder.node('div', contents));\r
+ },\r
+\r
+ lazyLoad: function(index) {\r
+ this.errorCount = 0;\r
+ this.loadedList = [];\r
+ this.load(index);\r
+ },\r
+\r
+ load: function(index) {\r
+ var container = this.panelList[index];\r
+ var url = this.options.lazyLoadUrl[index];\r
+ var self = this;\r
+ if (container && url) {\r
+ new Ajax.Updater(\r
+ {success: container},\r
+ url,\r
+ {\r
+ onSuccess: function() {\r
+ self.setLoaded(index);\r
+ self.options.onLazyLoad(container, self);\r
+ self.load(++index);\r
+ if (self.isFinishLazyLoad()) self.options.afterLazyLoad(self);\r
+ },\r
+ onFailure: function() {\r
+ self.errorCount++;\r
+ self.options.lazyLoadFailure(container, self);\r
+ if (self.errorCount <= self.options.failureLimit) {\r
+ self.load(index);\r
+ } else {\r
+ self.options.failureLimitOver(self);\r
+ }\r
+ },\r
+ asynchronous: true, \r
+ evalScripts: true\r
+ }\r
+ );\r
+ }\r
+ },\r
+\r
+ isFinishLazyLoad: function() {\r
+ return this.loadedList.length == this.panelList.length;\r
+ },\r
+\r
+ setLoaded: function(i) {\r
+ this.loadedList.push(i);\r
+ },\r
+\r
+ onMouseOver: function(event) {\r
+ var targetElement = Event.element(event);\r
+ var targetIndex = this.getTargetIndex(targetElement);\r
+ if (targetIndex != this.selected) {\r
+ var targetTab = this.tabs[targetIndex];\r
+ this.setTabActive(targetTab);\r
+ }\r
+ },\r
+\r
+ onMouseOut: function(event) {\r
+ var targetElement = Event.element(event);\r
+ var targetIndex = this.getTargetIndex(targetElement);\r
+ if (targetIndex != this.selected) {\r
+ var targetTab = this.tabs[targetIndex];\r
+ this.setTabInactive(targetTab);\r
+ }\r
+ },\r
+\r
+ hasNextTab: function() {\r
+ return this.getNextTab() ? true : false;\r
+ },\r
+\r
+ hasPreviousTab: function() {\r
+ return this.getPreviousTab() ? true : false;\r
+ },\r
+\r
+ getNextTab: function() {\r
+ return Element.next(this.getCurrentTab());\r
+ },\r
+\r
+ getPreviousTab: function() {\r
+ return Element.previous(this.getCurrentTab());\r
+ },\r
+\r
+ selectNextTab: function() {\r
+ this.selectTab(this.getNextTab());\r
+ },\r
+\r
+ selectPreviousTab: function() {\r
+ this.selectTab(this.getPreviousTab());\r
+ },\r
+\r
+ tabCount: function() {\r
+ return this.tabs.inject(0, function(i, t) {\r
+ return t ? ++i : i;\r
+ })\r
+ },\r
+\r
+ getCurrentPanel: function() {\r
+ return this.panelList[this.selected];\r
+ },\r
+\r
+ getCurrentTab: function() {\r
+ return this.tabs[this.selected];\r
+ }\r
+}\r
-// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-
-/**
- * TimePicker
- */
-var TimePicker = Class.create();
-TimePicker.className = {
- container: 'timepicker_container',
-// container: 'timepicker',
- header: 'timepicker_header',
- preYears: 'timepicker_preYears',
- nextYears: 'timepicker_nextYears',
- years: 'timepicker_years',
- mark: 'timepicker_mark',
- ym: 'timepicker_ym',
- table: 'timepicker_table',
- thRight: 'right',
- tdRight: 'right',
- tdBottom: 'bottom',
- date: 'timepicker_date',
- holiday: 'timepicker_holiday',
- regularHoliday: 'timepicker_regularHoliday',
- schedule: 'timepicker_schedule',
- highlightDay: 'timepicker_highlightDay',
- scheduleListContainer: 'timepicker_scheduleListContainer',
- scheduleItem: 'timepicker_scheduleItem',
- scheduleTimeArea: 'timepicker_scheduleItemTimeArea',
- scheduleHandler: 'timepicker_scheduleHandler',
- holidayName: 'timepicker_holidayName',
- dateContainer: 'timepicker_dateContainer',
- tableHeader: 'timepicker_tableHeader',
- rowContent: 'timepicker_rowContent',
- selected: 'timepicker_selected',
- displayToggle: 'timepicker_displayToggle',
-
- nextYearMark: 'timepicker_nextYearMark',
- nextMonthMark: 'timepicker_nextMonthMark',
- nextWeekMark: 'timepicker_nextWeekMark',
- preYearMark: 'timepicker_preYearMark',
- preMonthMark: 'timepicker_preMonthMark',
- preWeekMark: 'timepicker_preWeekMark',
-
- weekTable: 'timepicker_weekContainerTable',
- weekMainTable: 'timepicker_weekMainTable',
- timeLine: 'timepicker_timeline',
- timeLineTimeTop: 'timepicker_timelineTimeTop',
- timeLineTime: 'timepicker_timelineTime',
- timeLineTimeIe: 'timepicker_timelineTime_ie',
- timeLineTimeIeTop: 'timepicker_timelineTime_ieTop',
- headerColumn: 'timepicker_headerColumn',
- columnTopDate: 'timepicker_columnTopDate',
- columnDate: 'timepicker_columnDate',
- columnDateOdd: 'timepicker_columnOddDate',
- scheduleItemSamll: 'timepicker_scheduleItemSmall',
- scheduleItemLarge: 'timepicker_scheduleItemLarge',
- scheduleItemSelect: 'timepicker_scheduleItemSelect',
- deleteImg: 'timepicker_deleteImage',
- privateImg: 'timepicker_privateImage',
- scheduleContainer: 'timepicker_weekScheduleContainer',
- selector: 'timepicker_selector',
- cover: 'timepicker_cover'
-}
-Object.extend(TimePicker.prototype, Calendar.prototype);
-Object.extend(TimePicker.prototype, {
- initialize: function(element) {
- this.options = Object.extend({
- initDate: new Date(),
- cssPrefix: 'custom_',
- holidays: [],
- schedules: [],
- size: Calendar.size.large,
- regularHoliday: [0, 6],
- displayIndexes: [0, 1, 2, 3, 4, 5, 6],
- displayTime: [{hour: 0, min: 0}, {hour: 24, min: 0}],
- weekIndex: 0,
- dblclickListener: null,
- afterSelect: Prototype.emptyFunction,
- beforeRefresh: Prototype.emptyFunction,
- changeSchedule: Prototype.emptyFunction,
- changeCalendar: Prototype.emptyFunction,
- displayType: 'month',
- highlightDay: true,
- beforeRemoveSchedule: function() {return true;},
- dblclickSchedule: null,
- updateTirm: Prototype.emptyFunction,
- displayTimeLine: true,
- clickDateText: null,
- getMonthHeaderText: Prototype.emptyFunction,
- getMonthSubHeaderText: Prototype.emptyFunction,
- getWeekHeaderText: Prototype.emptyFunction,
- getWeekSubHeaderText: Prototype.emptyFunction,
- getDayHeaderText: Prototype.emptyFunction,
-
- setPosition: true,
- headerTitle: '',
- standardTime: false,
- oneDayLabel: '24H',
- standardTimeLabel: 'standard'
- }, arguments[1] || {});
-
- if (this.options.standardTime) {
- this.options.displayTime = this.options.standardTime;
- this.options.oneDay = [{hour: 0, min: 0}, {hour: 24, min: 0}];
- }
-
- this.element = $(element);
- this.date = new Date();
- var customCss = CssUtil.appendPrefix(this.options.cssPrefix, TimePicker.className);
- this.classNames = new CssUtil([TimePicker.className, customCss]);
-
- this.builder = new TimePickerBuilder(this);
- this.builder.beforeBuild();
- this.calendar = this.builder.build();
- this.builder.afterBuild();
- this.element.appendChild(this.calendar);
- Element.hide(element);
- Element.setStyle(this.element, {position: 'absolute'});
-
-// Event.observe(document, 'click', this.hide.bind(this));
- Event.observe(document, "mouseup", this.onMouseUp.bindAsEventListener(this));
- },
-
- refresh: function() {
- this.options.beforeRefresh(this);
- this.destroy();
- this.selectedBase = null;
- Element.remove(this.calendar);
- this.builder = new TimePickerBuilder(this);
- this.builder.beforeBuild();
- this.calendar = this.builder.build();
- this.element.appendChild(this.calendar);
- this.builder.afterBuild();
-// Event.observe(window, 'resize', this.windowResize);
- },
-
- show: function(event, triggerId) {
- Event.stop(event);
- var pointer = [Event.pointerX(event), Event.pointerY(event)];
- if (this.options.setPosition.constructor == Function) {
- this.options.setPosition(this.element, pointer);
- } else if (this.options.setPosition) {
- var parentOffset = Position.cumulativeOffset(this.element.parentNode);
- Element.setStyle(this.element, {
- left: pointer[0] - parentOffset[0] + 'px',
- top: pointer[1] - parentOffset[1] + 'px'
- });
- }
- Element.setStyle(this.element, {zIndex: ZindexManager.getIndex()});
- Element.show(this.element);
- this.builder.setColumnWidth();
- this.builder.setCover();
- },
-
- hide: function() {
- Element.hide(this.element);
- this.clearSelected();
- },
-
- setTrigger: function(trigger, targets) {
- trigger = $(trigger);
- Event.observe(trigger, 'click', this.show.bindAsEventListener(this));
- },
-
- setTargets: function(targets) {
- this.targets = targets;
- },
-
- onMouseUp: function(event) {
- var calendar = this;
- var dimention = Element.getDimensions(this.element);
- var position = Position.cumulativeOffset(this.element);
- var x = Event.pointerX(event);
- var y = Event.pointerY(event);
-
- if ((x < position[0]) || ((position[0] + dimention.width) < x) ||
- (y < position[1]) || ((position[1] + dimention.height) < y)) {
- this.hide();
- }
-
- if (calendar.mouseDown) {
- setTimeout(function() {
- if (calendar.mouseDown) {
- calendar.mouseDown = false;
- calendar.hide();
- }
- }, 10);
- }
-
- var term = this.builder.getSelectedTerm();
- if (term) {
- var start = term.first();
- var finish = term.last();
- this.setTime(this.targets.start.hour, start.getHours());
- this.setTime(this.targets.start.min, start.getMinutes());
- this.setTime(this.targets.finish.hour, finish.getHours());
- this.setTime(this.targets.finish.min, finish.getMinutes());
- this.hide();
- }
- },
-
- setTime: function(target, value) {
- $A($(target).options).each(function(option) {
- if (option.value == value) {
- option.selected = true;
- } else {
- option.selected = false;
- }
- });
- }
-});
-
-
-/**
- * TimePickerBuilder
- */
-var TimePickerBuilder = Class.create();
-Object.extend(TimePickerBuilder.prototype, CalendarDay.prototype);
-Object.extend(TimePickerBuilder.prototype, {
- initialize: function(calendar) {
- var day = calendar.date.getDay();
- this.calendar = calendar;
- this.setDisplayTime();
- this.calendar.options.displayIndexesOld = this.calendar.options.displayIndexes;
- this.calendar.options.displayIndexes = [day];
- this.calendar.options.weekIndexOld = this.calendar.options.weekIndex;
- this.calendar.options.weekIndex = day;
- this.week = this.getWeek();
- },
-
- buildHeader: function() {
- var headerNodes = Builder.node('TR');
- headerNodes.appendChild(this.buildHeaderCenter());
-
- className = this.calendar.classNames.joinClassNames('header');
- var tbody = Builder.node('TBODY', [headerNodes]);
- return Builder.node('TABLE', {className: className}, [tbody]);
- },
-
- buildHeaderCenter: function() {
- var contents = [];
- var node = Builder.node('SPAN', [this.calendar.options.headerTitle]);
- contents.push(node);
- var container = Builder.node('TD', contents);
- return container;
- },
-
- buildTimeLine: function() {
- var time = new Date();
- var hour = 0, hoursOfDay = 24;
- time.setHours(hour);
- time.setMinutes(0);
- var nodes = [];
- var timelineClass = 'timeLineTime';
- var timelineTopClass = 'timeLineTime'
- if (UserAgent.isIE()) {
- timelineClass = 'timeLineTimeIe';
- timelineTopClass = 'timeLineTimeIeTop';
- }
-
- var node = Builder.node('DIV');
- this.calendar.classNames.addClassNames(node, 'timeLineTimeTop');
- nodes.push(node);
- while (hour < hoursOfDay) {
- if (this.includeDisplayTime(hour)) {
- node = Builder.node('DIV', [this.formatTime(time)]);
- if (nodes.length == 0) {
- this.calendar.classNames.addClassNames(node, timelineTopClass);
- } else {
- this.calendar.classNames.addClassNames(node, timelineClass);
- }
- nodes.push(node);
- }
- hour++;
- time.setHours(hour);
- }
-
- var td = Builder.node('TD', nodes);
- this.calendar.classNames.addClassNames(td, 'timeLine');
- return td;
- },
-
- buildCalendarHeader: function() {
- var node = null;
- if (this.calendar.options.displayTime == this.calendar.options.standardTime) {
- node = Builder.node('DIV', [this.calendar.options.oneDayLabel]);
- } else {
- node = Builder.node('DIV', [this.calendar.options.standardTimeLabel]);
- }
- Event.observe(node, 'click', this.toggleDisplayTime.bindAsEventListener(this, node));
- this.calendar.classNames.addClassNames(node, 'headerColumn');
- return Builder.node('TR', [Builder.node('TD', {align: 'center'}, [node])]);
- },
-
- abstractSelect: function(event, method) {
- var element = this.findClickedElement(event);
- if (element) {
- if (Element.hasClassName(element, TimePicker.className.columnDate) ||
- Element.hasClassName(element, TimePicker.className.columnDateOdd) ||
- Element.hasClassName(element, TimePicker.className.columnTopDate)) {
-
- var date = this.getDate(element);
- method(date, element);
- }
- }
- },
-
- toggleDisplayTime: function(event, element) {
- Event.stop(event);
-// var text = Element.getTextNodes(element).first().nodeValue;
- if (this.calendar.options.displayTime == this.calendar.options.oneDay) {
- this.calendar.options.displayTime = this.calendar.options.standardTime;
- } else {
- this.calendar.options.displayTime = this.calendar.options.oneDay;
- }
- this.calendar.refresh();
- },
-
- findClickedElement: function(event) {
- var container = $(this.getScheduleContainerId());
- var position = Position.cumulativeOffset(container);
- var x = Event.pointerX(event) - position[0];
- var y = Event.pointerY(event) - position[1];
- var descendans = this.calendarTable.rows[0].cells[0].getElementsByTagName('div');
- var height = parseInt(Element.getHeight(container), 10) / descendans.length;
- var cellIndex = Math.floor(y / height);
- return descendans[cellIndex];
- },
-
- beforeBuild: function() {
- this.column = {};
- var rule = CssUtil.getCssRuleBySelectorText('.' + TimePicker.className.columnDate);
- this.column.height = parseInt(rule.style['height'], 10) + 1;
- },
-
- afterBuild: function() {
- this.setColumnWidth();
- this.setCover();
- }
-});
+// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+\r
+/**\r
+ * TimePicker\r
+ */\r
+var TimePicker = Class.create();\r
+TimePicker.className = {\r
+ container: 'timepicker_container',\r
+// container: 'timepicker',\r
+ header: 'timepicker_header',\r
+ preYears: 'timepicker_preYears',\r
+ nextYears: 'timepicker_nextYears',\r
+ years: 'timepicker_years',\r
+ mark: 'timepicker_mark',\r
+ ym: 'timepicker_ym',\r
+ table: 'timepicker_table',\r
+ thRight: 'right',\r
+ tdRight: 'right',\r
+ tdBottom: 'bottom',\r
+ date: 'timepicker_date',\r
+ holiday: 'timepicker_holiday',\r
+ regularHoliday: 'timepicker_regularHoliday',\r
+ schedule: 'timepicker_schedule',\r
+ highlightDay: 'timepicker_highlightDay',\r
+ scheduleListContainer: 'timepicker_scheduleListContainer',\r
+ scheduleItem: 'timepicker_scheduleItem',\r
+ scheduleTimeArea: 'timepicker_scheduleItemTimeArea',\r
+ scheduleHandler: 'timepicker_scheduleHandler',\r
+ holidayName: 'timepicker_holidayName',\r
+ dateContainer: 'timepicker_dateContainer',\r
+ tableHeader: 'timepicker_tableHeader',\r
+ rowContent: 'timepicker_rowContent',\r
+ selected: 'timepicker_selected',\r
+ displayToggle: 'timepicker_displayToggle',\r
+\r
+ nextYearMark: 'timepicker_nextYearMark',\r
+ nextMonthMark: 'timepicker_nextMonthMark',\r
+ nextWeekMark: 'timepicker_nextWeekMark',\r
+ preYearMark: 'timepicker_preYearMark',\r
+ preMonthMark: 'timepicker_preMonthMark',\r
+ preWeekMark: 'timepicker_preWeekMark',\r
+ \r
+ weekTable: 'timepicker_weekContainerTable',\r
+ weekMainTable: 'timepicker_weekMainTable',\r
+ timeLine: 'timepicker_timeline',\r
+ timeLineTimeTop: 'timepicker_timelineTimeTop',\r
+ timeLineTime: 'timepicker_timelineTime',\r
+ timeLineTimeIe: 'timepicker_timelineTime_ie',\r
+ timeLineTimeIeTop: 'timepicker_timelineTime_ieTop',\r
+ headerColumn: 'timepicker_headerColumn',\r
+ columnTopDate: 'timepicker_columnTopDate',\r
+ columnDate: 'timepicker_columnDate',\r
+ columnDateOdd: 'timepicker_columnOddDate',\r
+ scheduleItemSamll: 'timepicker_scheduleItemSmall',\r
+ scheduleItemLarge: 'timepicker_scheduleItemLarge',\r
+ scheduleItemSelect: 'timepicker_scheduleItemSelect',\r
+ deleteImg: 'timepicker_deleteImage',\r
+ privateImg: 'timepicker_privateImage',\r
+ scheduleContainer: 'timepicker_weekScheduleContainer',\r
+ selector: 'timepicker_selector',\r
+ cover: 'timepicker_cover'\r
+}\r
+Object.extend(TimePicker.prototype, Calendar.prototype);\r
+Object.extend(TimePicker.prototype, {\r
+ initialize: function(element) {\r
+ this.options = Object.extend({\r
+ initDate: new Date(),\r
+ cssPrefix: 'custom_',\r
+ holidays: [],\r
+ schedules: [],\r
+ size: Calendar.size.large,\r
+ regularHoliday: [0, 6],\r
+ displayIndexes: [0, 1, 2, 3, 4, 5, 6],\r
+ displayTime: [{hour: 0, min: 0}, {hour: 24, min: 0}],\r
+ weekIndex: 0,\r
+ dblclickListener: null,\r
+ afterSelect: Prototype.emptyFunction,\r
+ beforeRefresh: Prototype.emptyFunction,\r
+ changeSchedule: Prototype.emptyFunction,\r
+ changeCalendar: Prototype.emptyFunction,\r
+ displayType: 'month',\r
+ highlightDay: true,\r
+ beforeRemoveSchedule: function() {return true;},\r
+ dblclickSchedule: null,\r
+ updateTirm: Prototype.emptyFunction,\r
+ displayTimeLine: true,\r
+ clickDateText: null,\r
+ getMonthHeaderText: Prototype.emptyFunction,\r
+ getMonthSubHeaderText: Prototype.emptyFunction,\r
+ getWeekHeaderText: Prototype.emptyFunction,\r
+ getWeekSubHeaderText: Prototype.emptyFunction,\r
+ getDayHeaderText: Prototype.emptyFunction,\r
+\r
+ setPosition: true,\r
+ headerTitle: '',\r
+ standardTime: false,\r
+ oneDayLabel: '24H',\r
+ standardTimeLabel: 'standard'\r
+ }, arguments[1] || {});\r
+\r
+ if (this.options.standardTime) {\r
+ this.options.displayTime = this.options.standardTime;\r
+ this.options.oneDay = [{hour: 0, min: 0}, {hour: 24, min: 0}];\r
+ }\r
+\r
+ this.element = $(element);\r
+ this.date = new Date();\r
+ var customCss = CssUtil.appendPrefix(this.options.cssPrefix, TimePicker.className);\r
+ this.classNames = new CssUtil([TimePicker.className, customCss]);\r
+\r
+ this.builder = new TimePickerBuilder(this);\r
+ this.builder.beforeBuild();\r
+ this.calendar = this.builder.build();\r
+ this.builder.afterBuild();\r
+ this.element.appendChild(this.calendar);\r
+ Element.hide(element);\r
+ Element.setStyle(this.element, {position: 'absolute'});\r
+ \r
+// Event.observe(document, 'click', this.hide.bind(this));\r
+ Event.observe(document, "mouseup", this.onMouseUp.bindAsEventListener(this));\r
+ },\r
+\r
+ refresh: function() {\r
+ this.options.beforeRefresh(this);\r
+ this.destroy();\r
+ this.selectedBase = null;\r
+ Element.remove(this.calendar);\r
+ this.builder = new TimePickerBuilder(this);\r
+ this.builder.beforeBuild();\r
+ this.calendar = this.builder.build();\r
+ this.element.appendChild(this.calendar);\r
+ this.builder.afterBuild();\r
+// Event.observe(window, 'resize', this.windowResize);\r
+ },\r
+\r
+ show: function(event, triggerId) {\r
+ Event.stop(event);\r
+ var pointer = [Event.pointerX(event), Event.pointerY(event)];\r
+ if (this.options.setPosition.constructor == Function) {\r
+ this.options.setPosition(this.element, pointer);\r
+ } else if (this.options.setPosition) {\r
+ var parentOffset = Position.cumulativeOffset(this.element.parentNode);\r
+ Element.setStyle(this.element, {\r
+ left: pointer[0] - parentOffset[0] + 'px',\r
+ top: pointer[1] - parentOffset[1] + 'px'\r
+ });\r
+ }\r
+ Element.setStyle(this.element, {zIndex: ZindexManager.getIndex()});\r
+ Element.show(this.element);\r
+ this.builder.setColumnWidth();\r
+ this.builder.setCover();\r
+ },\r
+\r
+ hide: function() {\r
+ Element.hide(this.element);\r
+ this.clearSelected();\r
+ },\r
+\r
+ setTrigger: function(trigger, targets) {\r
+ trigger = $(trigger);\r
+ Event.observe(trigger, 'click', this.show.bindAsEventListener(this));\r
+ },\r
+\r
+ setTargets: function(targets) {\r
+ this.targets = targets;\r
+ },\r
+\r
+ onMouseUp: function(event) {\r
+ var calendar = this;\r
+ var dimention = Element.getDimensions(this.element);\r
+ var position = Position.cumulativeOffset(this.element);\r
+ var x = Event.pointerX(event);\r
+ var y = Event.pointerY(event);\r
+\r
+ if ((x < position[0]) || ((position[0] + dimention.width) < x) ||\r
+ (y < position[1]) || ((position[1] + dimention.height) < y)) {\r
+ this.hide();\r
+ }\r
+\r
+ if (calendar.mouseDown) {\r
+ setTimeout(function() {\r
+ if (calendar.mouseDown) {\r
+ calendar.mouseDown = false;\r
+ calendar.hide();\r
+ }\r
+ }, 10);\r
+ }\r
+\r
+ var term = this.builder.getSelectedTerm();\r
+ if (term) {\r
+ var start = term.first();\r
+ var finish = term.last();\r
+ this.setTime(this.targets.start.hour, start.getHours());\r
+ this.setTime(this.targets.start.min, start.getMinutes());\r
+ this.setTime(this.targets.finish.hour, finish.getHours());\r
+ this.setTime(this.targets.finish.min, finish.getMinutes());\r
+ this.hide();\r
+ }\r
+ },\r
+\r
+ setTime: function(target, value) {\r
+ $A($(target).options).each(function(option) {\r
+ if (option.value == value) {\r
+ option.selected = true;\r
+ } else {\r
+ option.selected = false;\r
+ }\r
+ });\r
+ }\r
+});\r
+\r
+\r
+/**\r
+ * TimePickerBuilder\r
+ */\r
+var TimePickerBuilder = Class.create();\r
+Object.extend(TimePickerBuilder.prototype, CalendarDay.prototype);\r
+Object.extend(TimePickerBuilder.prototype, {\r
+ initialize: function(calendar) {\r
+ var day = calendar.date.getDay();\r
+ this.calendar = calendar;\r
+ this.setDisplayTime();\r
+ this.calendar.options.displayIndexesOld = this.calendar.options.displayIndexes;\r
+ this.calendar.options.displayIndexes = [day];\r
+ this.calendar.options.weekIndexOld = this.calendar.options.weekIndex;\r
+ this.calendar.options.weekIndex = day;\r
+ this.week = this.getWeek();\r
+ },\r
+\r
+ buildHeader: function() {\r
+ var headerNodes = Builder.node('TR');\r
+ headerNodes.appendChild(this.buildHeaderCenter());\r
+ \r
+ className = this.calendar.classNames.joinClassNames('header');\r
+ var tbody = Builder.node('TBODY', [headerNodes]);\r
+ return Builder.node('TABLE', {className: className}, [tbody]);\r
+ },\r
+\r
+ buildHeaderCenter: function() {\r
+ var contents = [];\r
+ var node = Builder.node('SPAN', [this.calendar.options.headerTitle]);\r
+ contents.push(node);\r
+ var container = Builder.node('TD', contents);\r
+ return container;\r
+ },\r
+\r
+ buildTimeLine: function() {\r
+ var time = new Date();\r
+ var hour = 0, hoursOfDay = 24;\r
+ time.setHours(hour);\r
+ time.setMinutes(0);\r
+ var nodes = [];\r
+ var timelineClass = 'timeLineTime';\r
+ var timelineTopClass = 'timeLineTime'\r
+ if (UserAgent.isIE()) {\r
+ timelineClass = 'timeLineTimeIe';\r
+ timelineTopClass = 'timeLineTimeIeTop';\r
+ }\r
+\r
+ var node = Builder.node('DIV');\r
+ this.calendar.classNames.addClassNames(node, 'timeLineTimeTop');\r
+ nodes.push(node);\r
+ while (hour < hoursOfDay) {\r
+ if (this.includeDisplayTime(hour)) {\r
+ node = Builder.node('DIV', [this.formatTime(time)]);\r
+ if (nodes.length == 0) {\r
+ this.calendar.classNames.addClassNames(node, timelineTopClass);\r
+ } else {\r
+ this.calendar.classNames.addClassNames(node, timelineClass);\r
+ }\r
+ nodes.push(node);\r
+ }\r
+ hour++;\r
+ time.setHours(hour);\r
+ }\r
+\r
+ var td = Builder.node('TD', nodes);\r
+ this.calendar.classNames.addClassNames(td, 'timeLine');\r
+ return td;\r
+ },\r
+ \r
+ buildCalendarHeader: function() {\r
+ var node = null;\r
+ if (this.calendar.options.displayTime == this.calendar.options.standardTime) {\r
+ node = Builder.node('DIV', [this.calendar.options.oneDayLabel]);\r
+ } else {\r
+ node = Builder.node('DIV', [this.calendar.options.standardTimeLabel]);\r
+ }\r
+ Event.observe(node, 'click', this.toggleDisplayTime.bindAsEventListener(this, node));\r
+ this.calendar.classNames.addClassNames(node, 'headerColumn');\r
+ return Builder.node('TR', [Builder.node('TD', {align: 'center'}, [node])]);\r
+ },\r
+\r
+ abstractSelect: function(event, method) {\r
+ var element = this.findClickedElement(event);\r
+ if (element) {\r
+ if (Element.hasClassName(element, TimePicker.className.columnDate) ||\r
+ Element.hasClassName(element, TimePicker.className.columnDateOdd) ||\r
+ Element.hasClassName(element, TimePicker.className.columnTopDate)) {\r
+ \r
+ var date = this.getDate(element);\r
+ method(date, element);\r
+ }\r
+ }\r
+ },\r
+\r
+ toggleDisplayTime: function(event, element) {\r
+ Event.stop(event);\r
+// var text = Element.getTextNodes(element).first().nodeValue;\r
+ if (this.calendar.options.displayTime == this.calendar.options.oneDay) {\r
+ this.calendar.options.displayTime = this.calendar.options.standardTime;\r
+ } else {\r
+ this.calendar.options.displayTime = this.calendar.options.oneDay;\r
+ }\r
+ this.calendar.refresh();\r
+ },\r
+\r
+ findClickedElement: function(event) {\r
+ var container = $(this.getScheduleContainerId());\r
+ var position = Position.cumulativeOffset(container);\r
+ var x = Event.pointerX(event) - position[0];\r
+ var y = Event.pointerY(event) - position[1];\r
+ var descendans = this.calendarTable.rows[0].cells[0].getElementsByTagName('div');\r
+ var height = parseInt(Element.getHeight(container), 10) / descendans.length;\r
+ var cellIndex = Math.floor(y / height);\r
+ return descendans[cellIndex];\r
+ },\r
+\r
+ beforeBuild: function() {\r
+ this.column = {};\r
+ var rule = CssUtil.getCssRuleBySelectorText('.' + TimePicker.className.columnDate);\r
+ this.column.height = parseInt(rule.style['height'], 10) + 1;\r
+ },\r
+\r
+ afterBuild: function() {\r
+ this.setColumnWidth();\r
+ this.setCover();\r
+ }\r
+});\r
-// Copyright (c) 2006 spinelz.org (http://script.spinelz.org/)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-var ToolBar = Class.create();
-ToolBar.className = {
- container : 'toolbar_container',
- containerLeft : 'toolbar_containerLeft',
- containerMiddle : 'toolbar_containerMiddle',
- containerRight : 'toolbar_containerRight',
- toolbarItem : 'toolbar_item',
- toolbarItemHover : 'toolbar_itemHov',
- toolbarItemPres : 'toolbar_itemPres',
- toolbarContent : 'toolbar_content',
- toolbarContentPres: 'toolbar_contentPres'
-}
-
-ToolBar.prototype = {
-
- initialize: function(element) {
- var options = Object.extend({
- cssPrefix : 'custom_'
- }, arguments[1] || {});
-
- this.element = $(element);
- Element.setStyle(this.element, {visibility: 'hidden'});
- Element.hide(this.element);
- this.options = options;
-
- var customCss = CssUtil.appendPrefix(this.options.cssPrefix, ToolBar.className);
- this.classNames = new CssUtil([ToolBar.className, customCss]);
-
- this.build();
- Element.setStyle(this.element, {visibility: 'visible'});
- Element.show(this.element);
- },
-
- build: function() {
-// Element.cleanWhitespace(this.element);
- this.classNames.addClassNames(this.element, 'container');
- var iconList = this.element.childNodes;
-
- var containerLeft = Builder.node('div');
- this.classNames.addClassNames(containerLeft, 'containerLeft');
-
- this.containerMiddle = Builder.node('div');
- this.classNames.addClassNames(this.containerMiddle, 'containerMiddle');
-
- var containerRight = Builder.node('div');
- this.classNames.addClassNames(containerRight, 'containerRight');
-
- var removeList = [];
- var toolbar = this;
- $A(iconList).each(function(i) {
- if (i.nodeType != 1) {
- throw $continue;
- }
- toolbar.buildIcon(i);
- });
-
- this.element.appendChild(containerLeft);
- this.element.appendChild(this.containerMiddle);
- this.element.appendChild(containerRight);
- },
-
- buildIcon: function(icon) {
- var toolbarItem = Builder.node('div');
- this.classNames.addClassNames(toolbarItem, 'toolbarItem');
-
- var toolbarContent = Builder.node('div');
- this.classNames.addClassNames(toolbarContent, 'toolbarContent');
-
- toolbarContent.appendChild(icon);
- toolbarItem.appendChild(toolbarContent);
- this.containerMiddle.appendChild(toolbarItem);
- this.setHovEvent(toolbarItem);
- this.setPresEvent(toolbarItem);
- },
-
- addIcon: function(options) {
- var iconOptions = Object.extend({
- id : 'newIcon',
- src : 'url',
- alt : 'icon',
- width: 15,
- height: 15
- }, arguments[0] || {});
- if (!$(iconOptions.id)) {
- var icon = Builder.node('img', {id: iconOptions.id, src: iconOptions.src, alt: iconOptions.alt, style: 'width: ' + iconOptions.width + 'px; height: ' + iconOptions.height + 'px;'});
- this.buildIcon(icon);
- }
- },
-
- removeIcon: function(icon) {
- var target = $(icon);
- if (target) {
- var itemNode = target.parentNode.parentNode;
- Element.remove(itemNode);
- }
- },
-
- addEvent: function(icon, eventName, func) {
- var target = $(icon);
- if (target) {
- var itemNode = target.parentNode.parentNode;
- Event.observe(itemNode, eventName, func);
- }
- },
-
- removeEvent: function(icon, eventName, func) {
- var target = $(icon);
- if (target) {
- var itemNode = target.parentNode.parentNode;
- Event.stopObserving(itemNode, eventName, func);
- }
- },
- setHovEvent: function(element) {
- Event.observe(element, "mouseout", this.toggleItemClass(element, 'toolbarItem').bindAsEventListener(this));
- Event.observe(element, "mouseover", this.toggleItemClass(element, 'toolbarItemHover').bindAsEventListener(this));
- Event.observe(element, "mouseout", this.toggleItemClass(element.childNodes[0], 'toolbarContent').bindAsEventListener(this));
- },
-
- setPresEvent: function(element) {
- Event.observe(element, "mousedown", this.toggleItemClass(element, 'toolbarItemPres').bindAsEventListener(this));
- Event.observe(element, "mouseup", this.toggleItemClass(element, 'toolbarItem').bindAsEventListener(this));
- Event.observe(element, "mousedown", this.toggleItemClass(element.childNodes[0], 'toolbarContentPres').bindAsEventListener(this));
- Event.observe(element, "mouseup", this.toggleItemClass(element.childNodes[0], 'toolbarContent').bindAsEventListener(this));
- },
-
- toggleItemClass: function(target, className) {
- return function() {
- this.classNames.refreshClassNames(target, className);
- }
- }
-}
+// Copyright (c) 2006 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+var ToolBar = Class.create();\r
+ToolBar.className = {\r
+ container : 'toolbar_container',\r
+ containerLeft : 'toolbar_containerLeft',\r
+ containerMiddle : 'toolbar_containerMiddle',\r
+ containerRight : 'toolbar_containerRight', \r
+ toolbarItem : 'toolbar_item',\r
+ toolbarItemHover : 'toolbar_itemHov',\r
+ toolbarItemPres : 'toolbar_itemPres',\r
+ toolbarContent : 'toolbar_content',\r
+ toolbarContentPres: 'toolbar_contentPres'\r
+}\r
+\r
+ToolBar.prototype = {\r
+\r
+ initialize: function(element) {\r
+ var options = Object.extend({\r
+ cssPrefix : 'custom_'\r
+ }, arguments[1] || {});\r
+ \r
+ this.element = $(element);\r
+ Element.setStyle(this.element, {visibility: 'hidden'});\r
+ Element.hide(this.element);\r
+ this.options = options;\r
+ \r
+ var customCss = CssUtil.appendPrefix(this.options.cssPrefix, ToolBar.className);\r
+ this.classNames = new CssUtil([ToolBar.className, customCss]);\r
+ \r
+ this.build();\r
+ Element.setStyle(this.element, {visibility: 'visible'});\r
+ Element.show(this.element);\r
+ },\r
+ \r
+ build: function() {\r
+// Element.cleanWhitespace(this.element);\r
+ this.classNames.addClassNames(this.element, 'container');\r
+ var iconList = this.element.childNodes; \r
+ \r
+ var containerLeft = Builder.node('div');\r
+ this.classNames.addClassNames(containerLeft, 'containerLeft');\r
+ \r
+ this.containerMiddle = Builder.node('div');\r
+ this.classNames.addClassNames(this.containerMiddle, 'containerMiddle');\r
+ \r
+ var containerRight = Builder.node('div');\r
+ this.classNames.addClassNames(containerRight, 'containerRight');\r
+ \r
+ var removeList = [];\r
+ var toolbar = this; \r
+ $A(iconList).each(function(i) {\r
+ if (i.nodeType != 1) {\r
+ throw $continue;\r
+ }\r
+ toolbar.buildIcon(i);\r
+ });\r
+ \r
+ this.element.appendChild(containerLeft);\r
+ this.element.appendChild(this.containerMiddle);\r
+ this.element.appendChild(containerRight);\r
+ },\r
+ \r
+ buildIcon: function(icon) {\r
+ var toolbarItem = Builder.node('div');\r
+ this.classNames.addClassNames(toolbarItem, 'toolbarItem');\r
+ \r
+ var toolbarContent = Builder.node('div');\r
+ this.classNames.addClassNames(toolbarContent, 'toolbarContent');\r
+ \r
+ toolbarContent.appendChild(icon);\r
+ toolbarItem.appendChild(toolbarContent);\r
+ this.containerMiddle.appendChild(toolbarItem);\r
+ this.setHovEvent(toolbarItem);\r
+ this.setPresEvent(toolbarItem);\r
+ },\r
+ \r
+ addIcon: function(options) {\r
+ var iconOptions = Object.extend({\r
+ id : 'newIcon',\r
+ src : 'url',\r
+ alt : 'icon',\r
+ width: 15,\r
+ height: 15\r
+ }, arguments[0] || {});\r
+ if (!$(iconOptions.id)) {\r
+ var icon = Builder.node('img', {id: iconOptions.id, src: iconOptions.src, alt: iconOptions.alt, style: 'width: ' + iconOptions.width + 'px; height: ' + iconOptions.height + 'px;'});\r
+ this.buildIcon(icon);\r
+ }\r
+ },\r
+ \r
+ removeIcon: function(icon) {\r
+ var target = $(icon);\r
+ if (target) {\r
+ var itemNode = target.parentNode.parentNode;\r
+ Element.remove(itemNode);\r
+ } \r
+ }, \r
+\r
+ addEvent: function(icon, eventName, func) {\r
+ var target = $(icon);\r
+ if (target) {\r
+ var itemNode = target.parentNode.parentNode;\r
+ Event.observe(itemNode, eventName, func);\r
+ }\r
+ },\r
+ \r
+ removeEvent: function(icon, eventName, func) {\r
+ var target = $(icon);\r
+ if (target) {\r
+ var itemNode = target.parentNode.parentNode;\r
+ Event.stopObserving(itemNode, eventName, func);\r
+ }\r
+ },\r
+ setHovEvent: function(element) {\r
+ Event.observe(element, "mouseout", this.toggleItemClass(element, 'toolbarItem').bindAsEventListener(this));\r
+ Event.observe(element, "mouseover", this.toggleItemClass(element, 'toolbarItemHover').bindAsEventListener(this));\r
+ Event.observe(element, "mouseout", this.toggleItemClass(element.childNodes[0], 'toolbarContent').bindAsEventListener(this));\r
+ },\r
+ \r
+ setPresEvent: function(element) {\r
+ Event.observe(element, "mousedown", this.toggleItemClass(element, 'toolbarItemPres').bindAsEventListener(this));\r
+ Event.observe(element, "mouseup", this.toggleItemClass(element, 'toolbarItem').bindAsEventListener(this));\r
+ Event.observe(element, "mousedown", this.toggleItemClass(element.childNodes[0], 'toolbarContentPres').bindAsEventListener(this));\r
+ Event.observe(element, "mouseup", this.toggleItemClass(element.childNodes[0], 'toolbarContent').bindAsEventListener(this));\r
+ },\r
+ \r
+ toggleItemClass: function(target, className) {\r
+ return function() {\r
+ this.classNames.refreshClassNames(target, className);\r
+ }\r
+ }\r
+}\r
-// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-var TreeView = Class.create();
-TreeView.className = {
- top: 'treeview',
- dir: 'treeview_dir',
- dirBody: 'treeview_dirBody',
- dirBodyText: 'treeview_dirBodyText',
- dirBodyTextActive: 'treeview_dirBodyTextActive',
- dirContainer: 'treeview_dirContainer',
- dirContainerHover: 'treeview_dirContainerHover',
- file: 'treeview_file',
- fileBody: 'treeview_fileBody',
- fileBodyText: 'treeview_fileBodyText',
- fileBodyTextActive: 'treeview_fileBodyTextActive',
- state_open: 'treeview_stateOpen',
- state_close: 'treeview_stateClose',
- state_empty: 'treeview_stateEmpty',
- dirIcon: 'treeview_dirIcon',
- fileIcon: 'treeview_fileIcon',
- handle: 'treeview_handle'
-}
-
-TreeView.iconId = 'treeview_icon';
-
-TreeView.prototype = {
- initialize: function(element) {
- this.element = $(element);
- Element.setStyle(this.element, {visibility: 'hidden'});
- Element.hide(this.element);
-
- this.options = Object.extend({
- dirSymbol: 'dir',
- fileSymbol: 'file',
- cssPrefix: 'custom_',
- open: true,
- callBackFunctions: false,
- dirSelect: true,
- fileSelect: true,
- noSelectedInsert: true,
- iconIdPrefix: TreeView.iconId,
- move: false,
- unselected: Prototype.emptyFunction,
- enableUnselected: true,
- sortOptions: {},
- openDir: Prototype.emptyFunction,
- closeDir: Prototype.emptyFunction,
- emptyImg: false,
- initialSelected: null
- }, arguments[1] || {});
-
- this.customCss = CssUtil.appendPrefix(this.options.cssPrefix, TreeView.className);
- this.classNames = new CssUtil([TreeView.className, this.customCss]);
-
- this.changeClassNameDirAndFile(this.element);
- var nodes = this.element.childNodes;
- for (var i = 0; i < nodes.length; i++) {
- this.build(nodes[i]);
- }
-
- this.classNames.addClassNames(this.element, 'top');
- Element.setStyle(this.element, {visibility: 'visible'});
- Element.show(this.element);
-
- if (this.options.initialSelected) {
- this.selectEffect(this.options.initialSelected);
- }
-
- if (this.options.move) {
- this.setSortable();
- }
- },
-
- addChildById: function(element, parent, number) {
- element = $(element);
- parent = $(parent);
-
- var container = null;
- if (!element || !parent)
- return;
- else if (Element.hasClassName(parent, TreeView.className.dir))
- container = this.getChildDirContainer(parent);
- else if (Element.hasClassName(parent, TreeView.className.top))
- container = parent;
- else
- return;
-
- this.build(element);
-
- if (isNaN(number)) {
- container.appendChild(element);
- } else {
- var children = this.getDirectoryContents(container);
- if (children[number]) container.insertBefore(element, children[number]);
- else container.appendChild(element);
- }
-
- this.refreshStateImg(parent);
- if (this.options.dragAdrop) this.setSortable();
- },
-
- addChildByPath: function(element, path) {
- element = $(element);
- if (element) this.build(element);
- else return;
-
- var paths = path.split('/').findAll(function(elm) {
- return (elm != '');
- });
-
- var last = paths.pop();
- var container = this.search(paths.join('/'));
-
- var children = this.getDirectoryContents(container);
-
- if(children[last])
- container.insertBefore(element, children[last]);
- else
- container.appendChild(element);
-
- this.refreshStateImg(container.parentNode);
- if (this.options.dragAdrop) this.setSortable();
- },
-
- addChildBySelected: function(element, number) {
- if (!this.selected && !this.options.noSelectedInsert) return;
-
- if (this.selected)
- this.addChildById(element, this.selected, number);
- else
- this.addChildById(element, this.element, number);
- },
-
- addSelectItemCallback: function(functionObj) {
- if (!this.options.callBackFunctions) {
- this.options.callBackFunctions = new Array();
- }
- this.options.callBackFunctions.push(functionObj);
- },
-
- build: function(element) {
- if (element.nodeType != 1) return;
-
- Element.cleanWhitespace(element);
- this.changeClassNameDirAndFile(element);
-
- if (Element.hasClassName(element, TreeView.className.dir)) {
- var container = this.createDirectoryContainer(element);
- var body;
- if (this.hasContents(container))
- body = this.createDirectoryBody(element, false);
- else
- body = this.createDirectoryBody(element, true);
-
- element.appendChild(body);
- element.appendChild(container);
-
- var nodes = container.childNodes;
- for (var i = 0; i < nodes.length; i++) {
- this.build(nodes[i]);
- }
- } else if (Element.hasClassName(element, TreeView.className.file)) {
- var created = this.createFileBody(element);
- element.appendChild(created);
- }
- },
-
- changeClassName: function(element, to, from) {
- var nodes = document.getElementsByClassName(from, element);
-
- var newClassName = this.classNames.joinClassNames(to);
- nodes.each(function(n) {
- n.className = n.className.replace(new RegExp(from), newClassName);
- });
-
- if (Element.hasClassName(element, from)) {
- element.className = element.className.replace(new RegExp(from), newClassName);
- }
- },
-
- changeClassNameDirAndFile: function(element) {
- this.changeClassName(element, 'dir', this.options.dirSymbol);
- this.changeClassName(element, 'file', this.options.fileSymbol);
- },
-
- convertJSON: function() {
- return JSON.stringify(this.parse());
- },
-
- createDirectoryBody: function(element, isEmpty) {
- var customClass = null;
- var dirBodyClass = this.classNames.joinClassNames('dir');
- if (element.className != dirBodyClass) {
- customClass = element.className.replace(new RegExp(dirBodyClass + ' '), '');
- element.className = dirBodyClass;
- }
-
- var bodyNodes = new Array();
- var state;
- if (isEmpty && !this.options.emptyImg)
- state = 'state_empty';
- else if (this.options.open)
- state = 'state_open';
- else
- state = 'state_close';
-
- var id = this.options.iconIdPrefix.appendSuffix(element.id);
- var stateImg = Builder.node('DIV', {id: id.appendSuffix('stateImg')});
- this.classNames.addClassNames(stateImg, state);
- Event.observe(stateImg, "click", this.toggle.bindAsEventListener(this));
-
- var itemImg = Builder.node('DIV', {id: id});
- this.classNames.addClassNames(itemImg, 'dirIcon');
- if (customClass) {
- Element.addClassName(itemImg, customClass);
- }
- this.classNames.addClassNames(itemImg, 'handle');
-
- var bodyText = Builder.node('SPAN', this.getDirectoryText(element));
- this.classNames.addClassNames(bodyText, 'dirBodyText');
-
- bodyNodes.push(stateImg);
- bodyNodes.push(itemImg);
- bodyNodes.push(bodyText);
-
- var body = Builder.node('DIV', bodyNodes);
- this.classNames.addClassNames(body, 'dirBody');
- if (this.options.dirSelect) {
- Event.observe(itemImg, "click", this.selectDirItem.bindAsEventListener(this));
- Event.observe(bodyText, "click", this.selectDirItem.bindAsEventListener(this));
- }
-
- return body;
- },
-
- createDirectoryContainer: function(element) {
- var container = element.getElementsByTagName('ul')[0];
- if (!container) {
- container = Builder.node('UL');
- }
- this.classNames.addClassNames(container, 'dirContainer');
- if (!this.options.open) Element.hide(container);
- return container;
- },
-
- createFileBody: function(element) {
- var customClass = null;
- var fileBodyClass = this.classNames.joinClassNames('file');
- if (element.className != fileBodyClass) {
- customClass = element.className.replace(new RegExp(fileBodyClass + ' '), '');
- element.className = fileBodyClass;
- }
-
- var id = this.options.iconIdPrefix.appendSuffix(element.id);
- var itemImg = Builder.node('DIV', {id: id});
- this.classNames.addClassNames(itemImg, 'fileIcon');
- if (customClass) {
- Element.addClassName(itemImg, customClass);
- }
- this.classNames.addClassNames(itemImg, 'handle');
-
- var bodyText = Builder.node('SPAN', $A(element.childNodes));
- this.classNames.addClassNames(bodyText, 'fileBodyText');
-
- var children = new Array();
- children.push(itemImg);
- children.push(bodyText);
-
- var body = Builder.node('DIV', children);
- this.classNames.addClassNames(body, 'fileBody');
- if (this.options.fileSelect) {
- Event.observe(itemImg, "click", this.selectFileItem.bindAsEventListener(this));
- Event.observe(bodyText, "click", this.selectFileItem.bindAsEventListener(this));
- }
-
- return body;
- },
-
- getChildBody: function(element) {
- var names = [TreeView.className.fileBody, TreeView.className.dirBody];
- return Element.getFirstElementByClassNames(element, names);
- },
-
- getChildBodyText: function(element) {
- var names = [
- TreeView.className.fileBodyText,
- TreeView.className.fileBodyTextActive,
- TreeView.className.dirBodyText,
- TreeView.className.dirBodyTextActive
- ];
- return Element.getFirstElementByClassNames(element, names);
- },
-
- getChildBodyTextNode: function(element) {
- var body = this.getChildBody(element);
- var bodyText = this.getChildBodyText(body);
- return this.searchTextNode(bodyText);
- },
-
- getChildDir: function(element) {
- return document.getElementsByClassName(TreeView.className.dir, element);
- },
-
- getChildDirBody: function(element) {
- return document.getElementsByClassName(TreeView.className.dirBody, element)[0];
- },
-
- getChildDirContainer: function(element) {
- return document.getElementsByClassName(TreeView.className.dirContainer, element)[0];
- },
-
- getChildStateImg: function(element) {
- var body = this.getChildDirBody(element);
- var names = [
- TreeView.className.state_close,
- TreeView.className.state_open,
- TreeView.className.state_empty
- ];
-
- return Element.getFirstElementByClassNames(body, names);
- },
-
- getChildren: function(element, ignoreDir, ignoreFile) {
- var parent;
- var children = new Array();
- if(element) {
- parent = $(element).getElementsByTagName('ul')[0];
- } else {
- parent = this.element;
- }
- $A(Element.getTagNodes(parent)).each(
- function(node) {
- if(!ignoreDir && Element.hasClassName(node, TreeView.className.dir)) {
- children.push(node);
- }
- if(!ignoreFile && Element.hasClassName(node, TreeView.className.file)) {
- children.push(node);
- }
- }
- );
- return children;
- },
-
- getDirectoryContents: function(element) {
- return $A(element.childNodes).findAll(function(child) {
- if ((child.nodeType != 1)) {
- return false;
- }
- if (child.tagName.toLowerCase() == 'li') {
- return true;
- }
- return false;
- });
- },
-
- getDirectoryText: function(element) {
- return $A(element.childNodes).findAll(function(child) {
- if ((child.nodeType != 1)) {
- return true;
- } else if (child.tagName.toLowerCase() != 'ul') {
- return true;
- }
- return false;
- });
- },
-
- getHierarchyNumber: function() {
- if (!this.selected) return;
- var element = this.selected;
- var i = 0;
- while (true) {
- if (this.element == element) {
- return i;
- } else {
- element = this.getParentDir(element, true);
- if (!element) return;
- i++;
- }
- }
- },
-
- getParentDir: function(element, top) {
- var result = Element.getParentByClassName(TreeView.className.dir, element);
- if (!result && top)
- result = Element.getParentByClassName(TreeView.className.top, element);
- return result;
- },
-
- hasContents: function(element) {
- if (element) {
- if (!Element.hasClassName(element, TreeView.className.dirContainer) &&
- !Element.hasClassName(element, TreeView.className.top)) {
- return false;
- }
-
- var nodes = element.childNodes;
- for (var i = 0; i < nodes.length; i++) {
- if (nodes[i].nodeType == 1) {
- if (Element.hasClassName(nodes[i], TreeView.className.dir) ||
- Element.hasClassName(nodes[i], TreeView.className.file)) {
- return true;
- }
- }
- }
- }
- return false;
- },
-
- parse: function(container) {
- if (!container) container = this.element;
-
- var itemList = [];
- var contents = this.getDirectoryContents(container);
-
- for (var i = 0; i < contents.length; i++) {
- var node = contents[i];
- var body = this.getChildBody(node);
- var text = this.getChildBodyText(body);
-
- var item = {};
- item.id = node.id;
-
- item.name = Element.collectTextNodes(text).replace(/\n/, '');
- if (Element.hasClassName(node, TreeView.className.dir)) {
- item.type = this.options.dirSymbol;
- item.contents = this.parse(this.getChildDirContainer(node));
-
- } else {
- item.type = this.options.fileSymbol;
- }
-
- itemList.push(item);
- }
-
- return itemList;
- },
-
- refreshStateImg: function(element) {
- if (!Element.hasClassName(element, TreeView.className.dir)) return;
-
- var container = this.getChildDirContainer(element);
- var img = this.getChildStateImg(element);
-
- if (!this.hasContents(container) && !this.options.emptyImg)
- this.classNames.refreshClassNames(img, 'state_empty');
- else if (Element.visible(container))
- this.classNames.refreshClassNames(img, 'state_open');
- else
- this.classNames.refreshClassNames(img, 'state_close');
- },
-
- removeById: function(element) {
- element = $(element);
- if (element) {
- var parent = element.parentNode.parentNode;
- Element.remove(element);
- this.refreshStateImg(parent);
- }
- },
-
- removeByPath: function(path) {
- var paths = path.split('/').findAll(function(elm) {
- return (elm != '');
- });
-
- var last = paths.pop();
- var container = this.search(paths.join('/'));
-
- var target = this.getDirectoryContents(container)[last];
- if (target)
- this.removeById(target);
- },
-
- removeBySelected: function() {
- if (!this.selected) return;
- this.removeById(this.selected);
- this.selected = false;
- },
-
- renameById: function(name, element) {
- element = $(element);
- if (!Element.hasClassName(element, TreeView.className.dir) &&
- !Element.hasClassName(element, TreeView.className.file)) {
- return;
- }
- var node = this.getChildBodyTextNode(element);
- node.nodeValue = name;
- },
-
- renameByPath: function(name, path) {
- var paths = path.split('/').findAll(function(elm) {
- return (elm != '');
- });
-
- var last = paths.pop();
- var container = this.search(paths.join('/'));
-
- var target = this.getDirectoryContents(container)[last];
- if (target)
- this.renameById(name, target);
- },
-
- renameBySelected: function(name) {
- if (!this.selected) return;
- this.renameById(name, this.selected);
- },
-
- search: function(path) {
- var paths = path.split('/').findAll(function(elm) {
- return (elm != '');
- });
-
- var container = this.element;
- for (var i = 0; i < paths.length; i++) {
- var num = paths[i];
- var contents = this.getDirectoryContents(container);
- if (contents[num] && Element.hasClassName(contents[num], TreeView.className.dir)) {
- container = this.getChildDirContainer(contents[num]);
- } else {
- return false;
- }
- }
- return container;
- },
-
- searchTextNode: function(element) {
- var text = null;
- var nodes = element.childNodes;
-
- for (var i = 0; i < nodes.length; i++) {
- if (nodes[i].nodeType == 3) {
- text = nodes[i];
- break;
- } else if (nodes[i].nodeType == 1) {
- var tmp = this.searchTextNode(nodes[i]);
- if (tmp) {
- text = tmp;
- break;
- }
- }
- }
- return text;
- },
-
- selectDirItem: function(event) {
- var itemBody = Element.getParentByClassName(TreeView.className.dirBody, Event.element(event));
- this.selectItem(itemBody);
- },
-
- selectEffect: function(element) {
- element = $(element);
- if(element) {
- var itemBody = element.firstChild;
- if (this.selectItemUnselect(itemBody, false)) {
- return;
- }
- this.selectItemSelect(itemBody, false);
- }
- },
-
- selectFileItem: function(event) {
- var itemBody = Element.getParentByClassName(TreeView.className.fileBody, Event.element(event));
- this.selectItem(itemBody);
- },
-
- selectItem: function(itemBody) {
- if (this.selectItemUnselect(itemBody, true)) {
- return;
- }
- this.selectItemSelect(itemBody, true);
- },
-
- selectItemSelect: function(itemBody, callback) {
- this.selected = itemBody.parentNode;
- var text = this.getChildBodyText(itemBody);
- if (Element.hasClassName(text, TreeView.className.dirBodyText)) {
- this.classNames.refreshClassNames(text, 'dirBodyTextActive');
- this.defaultCss = 'dirBodyText';
- } else if (Element.hasClassName(text, TreeView.className.fileBodyText)) {
- this.classNames.refreshClassNames(text, 'fileBodyTextActive');
- this.defaultCss = 'fileBodyText';
- }
- if (callback) {
- if (this.options.callBackFunctions) {
- for (var i = 0; i < this.options.callBackFunctions.length; i++) {
- this.options.callBackFunctions[i](itemBody.parentNode);
- }
- }
- }
- },
-
- selectItemUnselect: function(itemBody, callback) {
- if (this.selected) {
- var selectedBody = this.getChildBody(this.selected);
- var selectedText = this.getChildBodyText(selectedBody);
- this.classNames.refreshClassNames(selectedText, this.defaultCss);
- if (this.selected == itemBody.parentNode && this.options.enableUnselected) {
- this.selected = false;
- this.defaultCss = false;
- if (callback) {
- this.options.unselected();
- }
- return true;
- }
- }
- return false;
- },
-
- setSortable: function() {
- var options = Object.extend({
- dropOnEmpty: true,
- tree: true,
- hoverclass: 'treeview_dirContainerHover',
- scroll: window,
- ghosting: true
- }, this.options.sortOptions);
- Sortable.create(this.element, options);
- },
-
- toggle: function(event) {
- Event.stop(event);
- var src = Event.element(event);
- var parent = this.getParentDir(src);
- var container = this.getChildDirContainer(parent);
-
- if (!this.hasContents(container) && !this.options.emptyImg) return;
-
- Element.toggle(container);
- this.refreshStateImg(parent);
-
- if (!this.hasContents(container) && !this.options.emptyImg)
- this.options.openDir(parent, container);
- else if (Element.visible(container))
- this.options.openDir(parent, container);
- else
- this.options.closeDir(parent, container);
- }
-}
+// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+var TreeView = Class.create();\r
+TreeView.className = {\r
+ top: 'treeview',\r
+ dir: 'treeview_dir',\r
+ dirBody: 'treeview_dirBody',\r
+ dirBodyText: 'treeview_dirBodyText',\r
+ dirBodyTextActive: 'treeview_dirBodyTextActive',\r
+ dirContainer: 'treeview_dirContainer',\r
+ dirContainerHover: 'treeview_dirContainerHover',\r
+ file: 'treeview_file',\r
+ fileBody: 'treeview_fileBody',\r
+ fileBodyText: 'treeview_fileBodyText',\r
+ fileBodyTextActive: 'treeview_fileBodyTextActive',\r
+ state_open: 'treeview_stateOpen',\r
+ state_close: 'treeview_stateClose',\r
+ state_empty: 'treeview_stateEmpty',\r
+ dirIcon: 'treeview_dirIcon',\r
+ fileIcon: 'treeview_fileIcon',\r
+ handle: 'treeview_handle'\r
+}\r
+\r
+TreeView.iconId = 'treeview_icon';\r
+\r
+TreeView.prototype = {\r
+ initialize: function(element) {\r
+ this.element = $(element);\r
+ Element.setStyle(this.element, {visibility: 'hidden'});\r
+ Element.hide(this.element);\r
+\r
+ this.options = Object.extend({\r
+ dirSymbol: 'dir',\r
+ fileSymbol: 'file',\r
+ cssPrefix: 'custom_',\r
+ open: true,\r
+ callBackFunctions: false,\r
+ dirSelect: true,\r
+ fileSelect: true,\r
+ noSelectedInsert: true,\r
+ iconIdPrefix: TreeView.iconId,\r
+ move: false,\r
+ unselected: Prototype.emptyFunction,\r
+ enableUnselected: true,\r
+ sortOptions: {},\r
+ openDir: Prototype.emptyFunction,\r
+ closeDir: Prototype.emptyFunction,\r
+ emptyImg: false,\r
+ initialSelected: null\r
+ }, arguments[1] || {});\r
+\r
+ this.customCss = CssUtil.appendPrefix(this.options.cssPrefix, TreeView.className);\r
+ this.classNames = new CssUtil([TreeView.className, this.customCss]);\r
+\r
+ this.changeClassNameDirAndFile(this.element);\r
+ var nodes = this.element.childNodes;\r
+ for (var i = 0; i < nodes.length; i++) {\r
+ this.build(nodes[i]);\r
+ }\r
+\r
+ this.classNames.addClassNames(this.element, 'top');\r
+ Element.setStyle(this.element, {visibility: 'visible'});\r
+ Element.show(this.element);\r
+\r
+ if (this.options.initialSelected) {\r
+ this.selectEffect(this.options.initialSelected);\r
+ }\r
+\r
+ if (this.options.move) {\r
+ this.setSortable();\r
+ }\r
+ },\r
+\r
+ addChildById: function(element, parent, number) {\r
+ element = $(element);\r
+ parent = $(parent);\r
+\r
+ var container = null;\r
+ if (!element || !parent)\r
+ return;\r
+ else if (Element.hasClassName(parent, TreeView.className.dir))\r
+ container = this.getChildDirContainer(parent);\r
+ else if (Element.hasClassName(parent, TreeView.className.top))\r
+ container = parent;\r
+ else\r
+ return;\r
+\r
+ this.build(element);\r
+\r
+ if (isNaN(number)) {\r
+ container.appendChild(element);\r
+ } else {\r
+ var children = this.getDirectoryContents(container);\r
+ if (children[number]) container.insertBefore(element, children[number]);\r
+ else container.appendChild(element);\r
+ }\r
+\r
+ this.refreshStateImg(parent);\r
+ if (this.options.dragAdrop) this.setSortable();\r
+ },\r
+\r
+ addChildByPath: function(element, path) {\r
+ element = $(element);\r
+ if (element) this.build(element);\r
+ else return;\r
+\r
+ var paths = path.split('/').findAll(function(elm) {\r
+ return (elm != '');\r
+ });\r
+\r
+ var last = paths.pop();\r
+ var container = this.search(paths.join('/'));\r
+\r
+ var children = this.getDirectoryContents(container);\r
+\r
+ if(children[last])\r
+ container.insertBefore(element, children[last]);\r
+ else\r
+ container.appendChild(element);\r
+\r
+ this.refreshStateImg(container.parentNode);\r
+ if (this.options.dragAdrop) this.setSortable();\r
+ },\r
+\r
+ addChildBySelected: function(element, number) {\r
+ if (!this.selected && !this.options.noSelectedInsert) return;\r
+\r
+ if (this.selected)\r
+ this.addChildById(element, this.selected, number);\r
+ else\r
+ this.addChildById(element, this.element, number);\r
+ },\r
+\r
+ addSelectItemCallback: function(functionObj) {\r
+ if (!this.options.callBackFunctions) {\r
+ this.options.callBackFunctions = new Array();\r
+ }\r
+ this.options.callBackFunctions.push(functionObj);\r
+ },\r
+\r
+ build: function(element) {\r
+ if (element.nodeType != 1) return;\r
+\r
+ Element.cleanWhitespace(element);\r
+ this.changeClassNameDirAndFile(element);\r
+\r
+ if (Element.hasClassName(element, TreeView.className.dir)) {\r
+ var container = this.createDirectoryContainer(element);\r
+ var body;\r
+ if (this.hasContents(container))\r
+ body = this.createDirectoryBody(element, false);\r
+ else\r
+ body = this.createDirectoryBody(element, true);\r
+\r
+ element.appendChild(body);\r
+ element.appendChild(container);\r
+\r
+ var nodes = container.childNodes;\r
+ for (var i = 0; i < nodes.length; i++) {\r
+ this.build(nodes[i]);\r
+ }\r
+ } else if (Element.hasClassName(element, TreeView.className.file)) {\r
+ var created = this.createFileBody(element);\r
+ element.appendChild(created);\r
+ }\r
+ },\r
+\r
+ changeClassName: function(element, to, from) {\r
+ var nodes = document.getElementsByClassName(from, element);\r
+\r
+ var newClassName = this.classNames.joinClassNames(to);\r
+ nodes.each(function(n) {\r
+ n.className = n.className.replace(new RegExp(from), newClassName);\r
+ });\r
+\r
+ if (Element.hasClassName(element, from)) {\r
+ element.className = element.className.replace(new RegExp(from), newClassName);\r
+ }\r
+ },\r
+\r
+ changeClassNameDirAndFile: function(element) {\r
+ this.changeClassName(element, 'dir', this.options.dirSymbol);\r
+ this.changeClassName(element, 'file', this.options.fileSymbol);\r
+ },\r
+\r
+ convertJSON: function() {\r
+ return JSON.stringify(this.parse());\r
+ },\r
+\r
+ createDirectoryBody: function(element, isEmpty) {\r
+ var customClass = null;\r
+ var dirBodyClass = this.classNames.joinClassNames('dir');\r
+ if (element.className != dirBodyClass) {\r
+ customClass = element.className.replace(new RegExp(dirBodyClass + ' '), '');\r
+ element.className = dirBodyClass;\r
+ }\r
+\r
+ var bodyNodes = new Array();\r
+ var state;\r
+ if (isEmpty && !this.options.emptyImg)\r
+ state = 'state_empty';\r
+ else if (this.options.open)\r
+ state = 'state_open';\r
+ else\r
+ state = 'state_close';\r
+\r
+ var id = this.options.iconIdPrefix.appendSuffix(element.id);\r
+ var stateImg = Builder.node('DIV', {id: id.appendSuffix('stateImg')});\r
+ this.classNames.addClassNames(stateImg, state);\r
+ Event.observe(stateImg, "click", this.toggle.bindAsEventListener(this));\r
+\r
+ var itemImg = Builder.node('DIV', {id: id});\r
+ this.classNames.addClassNames(itemImg, 'dirIcon');\r
+ if (customClass) {\r
+ Element.addClassName(itemImg, customClass);\r
+ }\r
+ this.classNames.addClassNames(itemImg, 'handle');\r
+\r
+ var bodyText = Builder.node('SPAN', this.getDirectoryText(element));\r
+ this.classNames.addClassNames(bodyText, 'dirBodyText');\r
+\r
+ bodyNodes.push(stateImg);\r
+ bodyNodes.push(itemImg);\r
+ bodyNodes.push(bodyText);\r
+\r
+ var body = Builder.node('DIV', bodyNodes);\r
+ this.classNames.addClassNames(body, 'dirBody');\r
+ if (this.options.dirSelect) {\r
+ Event.observe(itemImg, "click", this.selectDirItem.bindAsEventListener(this));\r
+ Event.observe(bodyText, "click", this.selectDirItem.bindAsEventListener(this));\r
+ }\r
+\r
+ return body;\r
+ },\r
+\r
+ createDirectoryContainer: function(element) {\r
+ var container = element.getElementsByTagName('ul')[0];\r
+ if (!container) {\r
+ container = Builder.node('UL');\r
+ }\r
+ this.classNames.addClassNames(container, 'dirContainer');\r
+ if (!this.options.open) Element.hide(container);\r
+ return container;\r
+ },\r
+\r
+ createFileBody: function(element) {\r
+ var customClass = null;\r
+ var fileBodyClass = this.classNames.joinClassNames('file');\r
+ if (element.className != fileBodyClass) {\r
+ customClass = element.className.replace(new RegExp(fileBodyClass + ' '), '');\r
+ element.className = fileBodyClass;\r
+ }\r
+\r
+ var id = this.options.iconIdPrefix.appendSuffix(element.id);\r
+ var itemImg = Builder.node('DIV', {id: id});\r
+ this.classNames.addClassNames(itemImg, 'fileIcon');\r
+ if (customClass) {\r
+ Element.addClassName(itemImg, customClass);\r
+ }\r
+ this.classNames.addClassNames(itemImg, 'handle');\r
+\r
+ var bodyText = Builder.node('SPAN', $A(element.childNodes));\r
+ this.classNames.addClassNames(bodyText, 'fileBodyText');\r
+\r
+ var children = new Array();\r
+ children.push(itemImg);\r
+ children.push(bodyText);\r
+\r
+ var body = Builder.node('DIV', children);\r
+ this.classNames.addClassNames(body, 'fileBody');\r
+ if (this.options.fileSelect) {\r
+ Event.observe(itemImg, "click", this.selectFileItem.bindAsEventListener(this));\r
+ Event.observe(bodyText, "click", this.selectFileItem.bindAsEventListener(this));\r
+ }\r
+\r
+ return body;\r
+ },\r
+\r
+ getChildBody: function(element) {\r
+ var names = [TreeView.className.fileBody, TreeView.className.dirBody];\r
+ return Element.getFirstElementByClassNames(element, names);\r
+ },\r
+\r
+ getChildBodyText: function(element) {\r
+ var names = [\r
+ TreeView.className.fileBodyText,\r
+ TreeView.className.fileBodyTextActive,\r
+ TreeView.className.dirBodyText,\r
+ TreeView.className.dirBodyTextActive\r
+ ];\r
+ return Element.getFirstElementByClassNames(element, names);\r
+ },\r
+\r
+ getChildBodyTextNode: function(element) {\r
+ var body = this.getChildBody(element);\r
+ var bodyText = this.getChildBodyText(body);\r
+ return this.searchTextNode(bodyText);\r
+ },\r
+\r
+ getChildDir: function(element) {\r
+ return document.getElementsByClassName(TreeView.className.dir, element);\r
+ },\r
+\r
+ getChildDirBody: function(element) {\r
+ return document.getElementsByClassName(TreeView.className.dirBody, element)[0];\r
+ },\r
+\r
+ getChildDirContainer: function(element) {\r
+ return document.getElementsByClassName(TreeView.className.dirContainer, element)[0];\r
+ },\r
+\r
+ getChildStateImg: function(element) {\r
+ var body = this.getChildDirBody(element);\r
+ var names = [\r
+ TreeView.className.state_close,\r
+ TreeView.className.state_open,\r
+ TreeView.className.state_empty\r
+ ];\r
+\r
+ return Element.getFirstElementByClassNames(body, names);\r
+ },\r
+\r
+ getChildren: function(element, ignoreDir, ignoreFile) {\r
+ var parent;\r
+ var children = new Array();\r
+ if(element) {\r
+ parent = $(element).getElementsByTagName('ul')[0];\r
+ } else {\r
+ parent = this.element;\r
+ }\r
+ $A(Element.getTagNodes(parent)).each(\r
+ function(node) {\r
+ if(!ignoreDir && Element.hasClassName(node, TreeView.className.dir)) {\r
+ children.push(node);\r
+ }\r
+ if(!ignoreFile && Element.hasClassName(node, TreeView.className.file)) {\r
+ children.push(node);\r
+ }\r
+ }\r
+ );\r
+ return children;\r
+ },\r
+\r
+ getDirectoryContents: function(element) {\r
+ return $A(element.childNodes).findAll(function(child) {\r
+ if ((child.nodeType != 1)) {\r
+ return false;\r
+ }\r
+ if (child.tagName.toLowerCase() == 'li') {\r
+ return true;\r
+ }\r
+ return false;\r
+ });\r
+ },\r
+\r
+ getDirectoryText: function(element) {\r
+ return $A(element.childNodes).findAll(function(child) {\r
+ if ((child.nodeType != 1)) {\r
+ return true;\r
+ } else if (child.tagName.toLowerCase() != 'ul') {\r
+ return true;\r
+ }\r
+ return false;\r
+ });\r
+ },\r
+\r
+ getHierarchyNumber: function() {\r
+ if (!this.selected) return;\r
+ var element = this.selected;\r
+ var i = 0;\r
+ while (true) {\r
+ if (this.element == element) {\r
+ return i;\r
+ } else {\r
+ element = this.getParentDir(element, true);\r
+ if (!element) return;\r
+ i++;\r
+ }\r
+ }\r
+ },\r
+\r
+ getParentDir: function(element, top) {\r
+ var result = Element.getParentByClassName(TreeView.className.dir, element);\r
+ if (!result && top)\r
+ result = Element.getParentByClassName(TreeView.className.top, element);\r
+ return result;\r
+ },\r
+\r
+ hasContents: function(element) {\r
+ if (element) {\r
+ if (!Element.hasClassName(element, TreeView.className.dirContainer) &&\r
+ !Element.hasClassName(element, TreeView.className.top)) {\r
+ return false;\r
+ }\r
+\r
+ var nodes = element.childNodes;\r
+ for (var i = 0; i < nodes.length; i++) {\r
+ if (nodes[i].nodeType == 1) {\r
+ if (Element.hasClassName(nodes[i], TreeView.className.dir) ||\r
+ Element.hasClassName(nodes[i], TreeView.className.file)) {\r
+ return true;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ return false;\r
+ },\r
+\r
+ parse: function(container) {\r
+ if (!container) container = this.element;\r
+\r
+ var itemList = [];\r
+ var contents = this.getDirectoryContents(container);\r
+\r
+ for (var i = 0; i < contents.length; i++) {\r
+ var node = contents[i];\r
+ var body = this.getChildBody(node);\r
+ var text = this.getChildBodyText(body);\r
+\r
+ var item = {};\r
+ item.id = node.id;\r
+\r
+ item.name = Element.collectTextNodes(text).replace(/\n/, '');\r
+ if (Element.hasClassName(node, TreeView.className.dir)) {\r
+ item.type = this.options.dirSymbol;\r
+ item.contents = this.parse(this.getChildDirContainer(node));\r
+\r
+ } else {\r
+ item.type = this.options.fileSymbol;\r
+ }\r
+\r
+ itemList.push(item);\r
+ }\r
+\r
+ return itemList;\r
+ },\r
+\r
+ refreshStateImg: function(element) {\r
+ if (!Element.hasClassName(element, TreeView.className.dir)) return;\r
+\r
+ var container = this.getChildDirContainer(element);\r
+ var img = this.getChildStateImg(element);\r
+\r
+ if (!this.hasContents(container) && !this.options.emptyImg)\r
+ this.classNames.refreshClassNames(img, 'state_empty');\r
+ else if (Element.visible(container))\r
+ this.classNames.refreshClassNames(img, 'state_open');\r
+ else\r
+ this.classNames.refreshClassNames(img, 'state_close');\r
+ },\r
+\r
+ removeById: function(element) {\r
+ element = $(element);\r
+ if (element) {\r
+ var parent = element.parentNode.parentNode;\r
+ Element.remove(element);\r
+ this.refreshStateImg(parent);\r
+ }\r
+ },\r
+\r
+ removeByPath: function(path) {\r
+ var paths = path.split('/').findAll(function(elm) {\r
+ return (elm != '');\r
+ });\r
+\r
+ var last = paths.pop();\r
+ var container = this.search(paths.join('/'));\r
+\r
+ var target = this.getDirectoryContents(container)[last];\r
+ if (target)\r
+ this.removeById(target);\r
+ },\r
+\r
+ removeBySelected: function() {\r
+ if (!this.selected) return;\r
+ this.removeById(this.selected);\r
+ this.selected = false;\r
+ },\r
+\r
+ renameById: function(name, element) {\r
+ element = $(element);\r
+ if (!Element.hasClassName(element, TreeView.className.dir) &&\r
+ !Element.hasClassName(element, TreeView.className.file)) {\r
+ return;\r
+ }\r
+ var node = this.getChildBodyTextNode(element);\r
+ node.nodeValue = name;\r
+ },\r
+\r
+ renameByPath: function(name, path) {\r
+ var paths = path.split('/').findAll(function(elm) {\r
+ return (elm != '');\r
+ });\r
+\r
+ var last = paths.pop();\r
+ var container = this.search(paths.join('/'));\r
+\r
+ var target = this.getDirectoryContents(container)[last];\r
+ if (target)\r
+ this.renameById(name, target);\r
+ },\r
+\r
+ renameBySelected: function(name) {\r
+ if (!this.selected) return;\r
+ this.renameById(name, this.selected);\r
+ },\r
+\r
+ search: function(path) {\r
+ var paths = path.split('/').findAll(function(elm) {\r
+ return (elm != '');\r
+ });\r
+\r
+ var container = this.element;\r
+ for (var i = 0; i < paths.length; i++) {\r
+ var num = paths[i];\r
+ var contents = this.getDirectoryContents(container);\r
+ if (contents[num] && Element.hasClassName(contents[num], TreeView.className.dir)) {\r
+ container = this.getChildDirContainer(contents[num]);\r
+ } else {\r
+ return false;\r
+ }\r
+ }\r
+ return container;\r
+ },\r
+\r
+ searchTextNode: function(element) {\r
+ var text = null;\r
+ var nodes = element.childNodes;\r
+\r
+ for (var i = 0; i < nodes.length; i++) {\r
+ if (nodes[i].nodeType == 3) {\r
+ text = nodes[i];\r
+ break;\r
+ } else if (nodes[i].nodeType == 1) {\r
+ var tmp = this.searchTextNode(nodes[i]);\r
+ if (tmp) {\r
+ text = tmp;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ return text;\r
+ },\r
+\r
+ selectDirItem: function(event) {\r
+ var itemBody = Element.getParentByClassName(TreeView.className.dirBody, Event.element(event));\r
+ this.selectItem(itemBody);\r
+ },\r
+\r
+ selectEffect: function(element) {\r
+ element = $(element);\r
+ if(element) {\r
+ var itemBody = element.firstChild;\r
+ if (this.selectItemUnselect(itemBody, false)) {\r
+ return;\r
+ }\r
+ this.selectItemSelect(itemBody, false);\r
+ }\r
+ },\r
+\r
+ selectFileItem: function(event) {\r
+ var itemBody = Element.getParentByClassName(TreeView.className.fileBody, Event.element(event));\r
+ this.selectItem(itemBody);\r
+ },\r
+\r
+ selectItem: function(itemBody) {\r
+ if (this.selectItemUnselect(itemBody, true)) {\r
+ return;\r
+ }\r
+ this.selectItemSelect(itemBody, true);\r
+ },\r
+\r
+ selectItemSelect: function(itemBody, callback) {\r
+ this.selected = itemBody.parentNode;\r
+ var text = this.getChildBodyText(itemBody);\r
+ if (Element.hasClassName(text, TreeView.className.dirBodyText)) {\r
+ this.classNames.refreshClassNames(text, 'dirBodyTextActive');\r
+ this.defaultCss = 'dirBodyText';\r
+ } else if (Element.hasClassName(text, TreeView.className.fileBodyText)) {\r
+ this.classNames.refreshClassNames(text, 'fileBodyTextActive');\r
+ this.defaultCss = 'fileBodyText';\r
+ }\r
+ if (callback) {\r
+ if (this.options.callBackFunctions) {\r
+ for (var i = 0; i < this.options.callBackFunctions.length; i++) {\r
+ this.options.callBackFunctions[i](itemBody.parentNode);\r
+ }\r
+ }\r
+ }\r
+ },\r
+\r
+ selectItemUnselect: function(itemBody, callback) {\r
+ if (this.selected) {\r
+ var selectedBody = this.getChildBody(this.selected);\r
+ var selectedText = this.getChildBodyText(selectedBody);\r
+ this.classNames.refreshClassNames(selectedText, this.defaultCss);\r
+ if (this.selected == itemBody.parentNode && this.options.enableUnselected) {\r
+ this.selected = false;\r
+ this.defaultCss = false;\r
+ if (callback) {\r
+ this.options.unselected();\r
+ }\r
+ return true;\r
+ }\r
+ }\r
+ return false;\r
+ },\r
+\r
+ setSortable: function() {\r
+ var options = Object.extend({\r
+ dropOnEmpty: true,\r
+ tree: true,\r
+ hoverclass: 'treeview_dirContainerHover',\r
+ scroll: window,\r
+ ghosting: true\r
+ }, this.options.sortOptions);\r
+ Sortable.create(this.element, options);\r
+ },\r
+\r
+ toggle: function(event) {\r
+ Event.stop(event);\r
+ var src = Event.element(event);\r
+ var parent = this.getParentDir(src);\r
+ var container = this.getChildDirContainer(parent);\r
+\r
+ if (!this.hasContents(container) && !this.options.emptyImg) return;\r
+\r
+ Element.toggle(container);\r
+ this.refreshStateImg(parent);\r
+\r
+ if (!this.hasContents(container) && !this.options.emptyImg)\r
+ this.options.openDir(parent, container);\r
+ else if (Element.visible(container))\r
+ this.options.openDir(parent, container);\r
+ else\r
+ this.options.closeDir(parent, container);\r
+ }\r
+}\r
-// Copyright (c) 2006 spinelz.org (http://script.spinelz.org/)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-var Window = Class.create();
-Window.className = {
- window: 'window',
- header: 'window_header',
- headerLeft: 'window_headerLeft',
- headerMiddle: 'window_headerMiddle',
- headerRight: 'window_headerRight',
- buttonHolder: 'window_buttonHolder',
- closeButton: 'window_closeButton',
- maxButton: 'window_maxButton',
- minButton: 'window_minButton',
- body: 'window_body',
- bodyLeft: 'window_bodyLeft',
- bodyMiddle: 'window_bodyMiddle',
- bodyRight: 'window_bodyRight',
- bottom: 'window_bottom',
- bottomLeft: 'window_bottomLeft',
- bottomMiddle: 'window_bottomMiddle',
- bottomRight: 'window_bottomRight'
-}
-
-Window.prototype = {
-
- initialize: function(element) {
- var options = Object.extend({
- className: Window.className.window,
- width: 300,
- height: 300,
- minWidth: 200,
- minHeight: 40,
- drag: true,
- resize: true,
- resizeX: true,
- resizeY: true,
- modal: false,
- closeButton: true,
- maxButton: true,
- minButton: true,
- cssPrefix: 'custom_',
- restriction: false,
- endDrag: Prototype.emptyFunction,
- endResize: Prototype.emptyFunction,
- addButton: Prototype.emptyFunction,
- preMaximize: function() {return true},
- preMinimize: function() {return true},
- preRevertMaximize: function() {return true},
- preRevertMinimize: function() {return true},
- preClose: function() {return true},
- endMaximize: Prototype.emptyFunction,
- endMinimize: Prototype.emptyFunction,
- endRevertMaximize: Prototype.emptyFunction,
- endRevertMinimize: Prototype.emptyFunction,
- endClose: Prototype.emptyFunction,
- dragOptions: {},
- appendToBody: false
- }, arguments[1] || {});
-
- var customCss = CssUtil.appendPrefix(options.cssPrefix, Window.className);
- this.classNames = new CssUtil([Window.className, customCss]);
-
- this.element = $(element);
- Element.setStyle(this.element, {visibility: 'hidden'});
-
- this.options = options;
- this.element.className = this.options.className;
- this.header = null;
- this.windowBody = null;
- this.bottom = null;
-
- this.elementId = this.element.id;
- this.dragHandleId = this.elementId + '_dragHandle';
-
- this.maxZindex = -1;
- this.minFlag = false;
- this.maxFlag = false;
- this.currentPos = [0,0];
- this.currentSize = [0,0];
-
- this.buildWindow();
- this.cover = new IECover(this.element, {padding: 10});
-
- Element.makePositioned(element);
- Element.hide(this.element);
- Element.setStyle(this.element, {visibility: 'visible'});
-
- if (this.options.appendToBody) this.appendToBody.callAfterLoading(this);
- },
-
- buildWindow: function() {
- Element.cleanWhitespace(this.element);
-
- with(this.element.style) {
- width = this.options.width + 'px';
- height= this.options.height + 'px';
- }
-
- var title = this.element.childNodes[0];
- var content = this.element.childNodes[1];
- this.buildHeader(title);
- this.buildBody(content);
- this.buildBottom();
- var newStyle = {height: this.options.height};
- this.setBodyHeight(newStyle);
-
- if (this.options.drag) this.createDraggble();
-
- if (this.options.resize) {
- this.enableResizing();
- }
- },
-
- buildHeader: function(title) {
- var headerLeft = Builder.node('div');
- this.classNames.addClassNames(headerLeft, 'headerLeft');
-
- var headerMiddle = Builder.node('div', {id: this.dragHandleId});
- this.classNames.addClassNames(headerMiddle, 'headerMiddle');
-
- var headerRight = Builder.node('div');
- this.classNames.addClassNames(headerRight, 'headerRight');
-
- var buttonHolder = Builder.node('div');
- this.classNames.addClassNames(buttonHolder, 'buttonHolder');
-
- headerMiddle.appendChild(title);
- var headerList = [headerLeft, headerMiddle, buttonHolder, headerRight];
- this.header = Builder.node('div', headerList);
- this.classNames.addClassNames(this.header, 'header');
- this.element.appendChild(this.header);
-
-
- if (this.options.closeButton) {
- var closeButton = Builder.node('div', {id: this.element.id.appendSuffix('closeButton')});
- this.classNames.addClassNames(closeButton, 'closeButton');
- buttonHolder.appendChild(closeButton);
- Event.observe(closeButton, 'click', this.close.bindAsEventListener(this));
- }
- if (this.options.maxButton) {
- var maxButton = Builder.node('div', {id: this.element.id.appendSuffix('maxButton')});
- this.classNames.addClassNames(maxButton, 'maxButton');
- buttonHolder.appendChild(maxButton);
- Event.observe(maxButton, 'click', this.maximize.bindAsEventListener(this));
- }
- if (this.options.minButton) {
- var minButton = Builder.node('div', {id: this.element.id.appendSuffix('minButton')});
- this.classNames.addClassNames(minButton, 'minButton');
- buttonHolder.appendChild(minButton);
- Event.observe(minButton, 'click', this.minimize.bindAsEventListener(this));
- }
-
- if (this.options.addButton) {
- var addButton = this.options.addButton;
- if (addButton.constructor == Function) {
- addButton(buttonHolder);
- } else if (addButton.constructor == Array) {
- var self = this;
- var firstChild = buttonHolder.firstChild;
- addButton.each(function(b) {
- var button = Builder.node('div', {id: b.id, className: b.className});
- Event.observe(button, 'click', b.onclick.bindAsEventListener(self));
- if (b.first && firstChild) {
- buttonHolder.insertBefore(button, firstChild);
- } else {
- buttonHolder.appendChild(button);
- }
- });
- }
- }
- },
-
- buildBody: function(contents) {
- var bodyLeft = Builder.node('div', {className: Window.className.bodyLeft});
- this.classNames.addClassNames(bodyLeft, 'bodyLeft');
-
- var bodyMiddle = Builder.node('div');
- this.classNames.addClassNames(bodyMiddle, 'bodyMiddle');
- bodyMiddle.appendChild(contents);
-
- var bodyRight = Builder.node('div');
- this.classNames.addClassNames(bodyRight, 'bodyRight');
-
- var bodyList = [bodyRight,bodyLeft, bodyMiddle];
- this.windowBody = Builder.node('div', bodyList);
- this.classNames.addClassNames(this.windowBody, 'body');
- this.element.appendChild(this.windowBody);
- },
-
- buildBottom: function() {
- var bottomLeft = Builder.node('div');
- this.classNames.addClassNames(bottomLeft, 'bottomLeft');
-
- var bottomMiddle = Builder.node('div');
- this.classNames.addClassNames(bottomMiddle, 'bottomMiddle');
-
- var bottomRight = Builder.node('div');
- this.classNames.addClassNames(bottomRight, 'bottomRight');
-
- var bottomList = [bottomLeft, bottomMiddle, bottomRight];
- this.bottom = Builder.node('div', bottomList);
- this.classNames.addClassNames(this.bottom, 'bottom');
- this.element.appendChild(this.bottom);
- },
-
- createDraggble: function() {
- var self = this;
- var options = Object.extend({
- handle: this.dragHandleId,
- starteffect: Prototype.emptyFunction,
- endeffect: Prototype.emptyFunction,
- endDrag: this.options.endDrag,
- scroll: window
- }, this.options.dragOptions);
-
- if (this.options.restriction) {
- options.snap = function(x, y) {
- function constrain(n, lower, upper) {
- if (n > upper) return upper;
- else if (n < lower) return lower;
- else return n;
- }
-
- var eDimensions = Element.getDimensions(self.element);
- var pDimensions = Element.getDimensions(self.element.parentNode);
-
- if (Element.getStyle(self.element.parentNode, 'position') == 'static') {
- var offset = Position.positionedOffset(self.element.parentNode);
- var parentLeft = offset[0];
- var parentTop = offset[1];
- return[
- constrain(x, parentLeft, parentLeft + pDimensions.width - eDimensions.width),
- constrain(y, parentTop, parentTop + pDimensions.height - eDimensions.height)
- ];
- } else {
- return[
- constrain(x, 0, pDimensions.width - eDimensions.width),
- constrain(y, 0, pDimensions.height - eDimensions.height)
- ];
- }
- }
- } else {
- var p = Position.cumulativeOffset(Position.offsetParent(this.element));
- options.snap = function(x, y) {
- return [
- ((x + p[0]) >= 0) ? x : 0 - p[0],
- ((y + p[1]) >= 0) ? y : 0 - p[1]
- ];
- }
- }
- new DraggableWindowEx(this.element, options);
- },
-
- setWindowZindex : function(zIndex) {
- zIndex = this.getZindex(zIndex);
- this.element.style.zIndex = zIndex;
- },
-
- getZindex: function(zIndex) {
- return ZindexManager.getIndex(zIndex);
- },
-
- open: function(zIndex) {
- this.opening = true;
- if (this.options.modal) {
- Modal.mask(this.element, {zIndex: zIndex});
- } else {
- this.setWindowZindex(zIndex);
- }
- Element.show(this.element);
- this.cover.resetSize();
- this.opening = false;
- if (this.shouldClose) {
- this.close();
- this.shouldClose = false;
- }
- },
-
- close: function() {
- if (this.opening) this.shouldClose = true;
- if (!this.options.preClose(this)) return;
- this.element.style.zIndex = -1;
- this.maxZindex = -1;
- try {
- Element.hide(this.element);
- } catch(e) {}
- if (this.options.modal) {
- Modal.unmask();
- }
- this.options.endClose(this);
- if (this.opening) this.shouldClose = true;
- },
-
- minimize: function(event) {
- if (this.minFlag) {
- if (!this.options.preRevertMinimize(this)) return;
- Element.toggle(this.windowBody);
- if (this.maxFlag) {
- this.minFlag = false;
- this.setMax();
- } else {
- var newStyle = {height:this.currentSize[1]}
- this.setBodyHeight(newStyle);
- this.element.style.width = this.currentSize[0];
- this.element.style.height = this.currentSize[1];
- this.element.style.left = this.currentPos[0];
- this.element.style.top = this.currentPos[1];
- this.maxFlag = false;
- this.minFlag = false;
- this.options.endRevertMinimize(this);
- }
- } else {
- if (!this.options.preMinimize(this)) return;
- Element.toggle(this.windowBody);
- if (!this.maxFlag) {
- this.currentPos = [Element.getStyle(this.element, 'left'), Element.getStyle(this.element, 'top')];
- this.currentSize = [Element.getStyle(this.element, 'width'), Element.getStyle(this.element, 'height')];
- }
- this.setMin();
- this.minFlag = true;
- this.options.endMinimize(this);
- }
- this.cover.resetSize();
- },
-
- maximize: function(event) {
- if (this.maxFlag) {
- if (this.minFlag) {
- Element.toggle(this.windowBody);
- this.minFlag = false;
- this.setMax();
- } else {
- if (!this.options.preRevertMaximize(this)) return;
- var newStyle = {height:parseInt(this.currentSize[1])}
- this.setBodyHeight(newStyle);
- this.element.style.width = this.currentSize[0];
- this.element.style.height = this.currentSize[1];
- this.element.style.left = this.currentPos[0];
- this.element.style.top = this.currentPos[1];
- this.maxFlag = false;
- this.minFlag = false;
- document.body.style.overflow = '';
- this.element.style.position = this.position;
- if (this.parent) {
- if (this.nextElement) {
- this.parent.insertBefore(this.element, this.nextElement);
- } else {
- this.parent.appendChild(this.element);
- }
- }
- this.options.endRevertMaximize(this);
- }
-
- } else {
- if (!this.options.preMaximize(this)) return;
- if (!this.minFlag) {
- this.currentPos = [Element.getStyle(this.element, 'left'), Element.getStyle(this.element, 'top')];
- this.currentSize = [Element.getStyle(this.element, 'width'), Element.getStyle(this.element, 'height')];
- } else {
- Element.toggle(this.windowBody);
- this.minFlag = false;
- }
- this.parent = this.element.parentNode;
- this.nextElement = Element.next(this.element, 0);
- this.position = Element.getStyle(this.element, 'position');
- document.body.style.overflow = 'hidden';
- document.body.appendChild(this.element);
- this.element.style.position = 'absolute';
- this.setMax();
- this.maxFlag = true;
- this.options.endMaximize(this);
- }
- this.cover.resetSize();
- },
-
- setMin : function() {
- var minHeight = this.header.offsetHeight + this.bottom.offsetHeight;
- var minWidth = this.options.minWidth;
- this.element.style.height = minHeight + 'px';
- this.element.style.width = minWidth + 'px';
- },
-
- setMax : function(zIndex) {
- var maxW = Element.getWindowWidth();
- var maxH = Element.getWindowHeight();
- var newStatus = {height:maxH}
- with(this.element.style) {
- width = maxW + 'px';
- height = maxH + 'px';
- left = '0px';
- top = '0px';
- }
- this.setBodyHeight(newStatus);
- this.setWindowZindex(zIndex);
- },
-
- _getParentWidth: function(parent) {
- if (parent && parent.style) {
- var width = parent.style.width;
- var index = 0;
- if (width) {
- if ((index = width.indexOf('px', 0)) > 0) {
- return parseInt(width);
- } else if ((index = width.indexOf('%', 0)) > 0) {
- var pw = this._getParentWidth(parent.parentNode);
-
- var par = parseInt(width);
- return pw * par / 100;
- } else if (!width.isNaN) {
- return parseInt(width);
- }
- } else if (parent == document.body){
- return Element.getWindowWidth();
- }
- }
- },
-
- setHeight: function(height) {
- height = {height: height};
- Element.setStyle(this.element, height);
- this.setBodyHeight(height);
- },
-
- setBodyHeight: function(newStyle) {
- var height = parseInt(newStyle.height);
- if (height > this.options.minHeight) {
- var newHeight = (height - this.header.offsetHeight - this.bottom.offsetHeight) + 'px';
- this.windowBody.childNodes[0].style.height = newHeight;
- this.windowBody.childNodes[1].style.height = newHeight;
- this.windowBody.childNodes[2].style.height = newHeight;
- this.windowBody.style.height = newHeight;
- }
- if (this.cover) this.cover.resetSize();
- },
-
- center: function() {
- var w = parseInt(Element.getStyle(this.element, 'width'));
- var h = parseInt(Element.getStyle(this.element, 'height'));
-
- var pOffset = Position.cumulativeOffset(Position.offsetParent(this.element));
-
- var left = (Element.getWindowWidth() - w) / 2;
- var top = (Element.getWindowHeight() - h) / 2;
- var scrollTop = (document.documentElement.scrollTop || document.body.scrollTop);
- var scrollLeft = (document.documentElement.scrollLeft || document.body.scrollLeft);
-
- top += scrollTop - pOffset[1];
- left += scrollLeft - pOffset[0];
- top = ((top + pOffset[1]) >= 0) ? top : 0 - pOffset[1];
- left = ((left + pOffset[0]) >= 0) ? left : 0 - pOffset[0];
- Element.setStyle(this.element, {left: left + 'px', top: top + 'px'});
- },
-
- enableResizing: function() {
- var resTop = this.options.resizeY ? 6 : 0;
- var resBottom = this.options.resizeY ? 6 : 0;
- var resLeft = this.options.resizeX ? 6 : 0;
- var resRight = this.options.resizeX ? 6 : 0;
- this.resizeable = new ResizeableWindowEx(this.element, {
- top: resTop,
- bottom: resBottom,
- left: resLeft,
- right: resRight,
- minWidth: this.options.minWidth,
- minHeight: this.options.minHeight,
- draw: this.setBodyHeight.bind(this),
- resize: this.options.endResize,
- restriction: this.options.restriction,
- zindex: 2000
- });
- },
-
- disableResizing: function() {
- this.resizeable.destroy();
- },
-
- appendToBody: function() {
- this.removeFromBody(this.element.id)
- document.body.appendChild(this.element);
- },
-
- removeFromBody: function(dom_id) {
- $A(document.body.childNodes).each(function(node){
- if (node.id == dom_id) node.remove();
- });
- }
-}
-
-
-// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)
-//
-// This code is substantially based on code from script.aculo.us which has the
-// following copyright and permission notice
-//
-// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-var DraggableWindowEx = Class.create();
-Object.extend(DraggableWindowEx.prototype, Draggable.prototype);
-Object.extend(DraggableWindowEx.prototype, {
- initDrag: function(event) {
- if(Event.isLeftClick(event)) {
- // abort on form elements, fixes a Firefox issue
- var src = Event.element(event);
- if(src.tagName && (
- src.tagName=='INPUT' ||
- src.tagName=='SELECT' ||
- src.tagName=='OPTION' ||
- src.tagName=='BUTTON' ||
- src.tagName=='TEXTAREA')) return;
-
- if(this.element._revert) {
- this.element._revert.cancel();
- this.element._revert = null;
- }
-
- var pointer = [Event.pointerX(event), Event.pointerY(event)];
- var pos = Position.cumulativeOffset(this.element);
- this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) });
-
- var zIndex = ZindexManager.getIndex();
- this.originalZ = zIndex;
- this.options.zindex = zIndex;
- Element.setStyle(this.element, {zIndex: zIndex});
-
- Draggables.activate(this);
- Event.stop(event);
- }
- },
-
- endDrag: function(event) {
- if(!this.dragging) return;
- this.stopScrolling();
- this.finishDrag(event, true);
-
- this.options.endDrag();
- Event.stop(event);
- }
-});
-
+// Copyright (c) 2006 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+var Window = Class.create();\r
+Window.className = {\r
+ window: 'window',\r
+ header: 'window_header',\r
+ headerLeft: 'window_headerLeft',\r
+ headerMiddle: 'window_headerMiddle',\r
+ headerRight: 'window_headerRight',\r
+ buttonHolder: 'window_buttonHolder',\r
+ closeButton: 'window_closeButton',\r
+ maxButton: 'window_maxButton',\r
+ minButton: 'window_minButton',\r
+ body: 'window_body',\r
+ bodyLeft: 'window_bodyLeft',\r
+ bodyMiddle: 'window_bodyMiddle',\r
+ bodyRight: 'window_bodyRight',\r
+ bottom: 'window_bottom',\r
+ bottomLeft: 'window_bottomLeft',\r
+ bottomMiddle: 'window_bottomMiddle',\r
+ bottomRight: 'window_bottomRight'\r
+}\r
+\r
+Window.prototype = {\r
+ \r
+ initialize: function(element) {\r
+ var options = Object.extend({\r
+ className: Window.className.window,\r
+ width: 300,\r
+ height: 300,\r
+ minWidth: 200,\r
+ minHeight: 40,\r
+ drag: true,\r
+ resize: true,\r
+ resizeX: true,\r
+ resizeY: true,\r
+ modal: false,\r
+ closeButton: true,\r
+ maxButton: true,\r
+ minButton: true,\r
+ cssPrefix: 'custom_',\r
+ restriction: false,\r
+ endDrag: Prototype.emptyFunction,\r
+ endResize: Prototype.emptyFunction,\r
+ addButton: Prototype.emptyFunction,\r
+ preMaximize: function() {return true},\r
+ preMinimize: function() {return true},\r
+ preRevertMaximize: function() {return true},\r
+ preRevertMinimize: function() {return true},\r
+ preClose: function() {return true},\r
+ endMaximize: Prototype.emptyFunction,\r
+ endMinimize: Prototype.emptyFunction,\r
+ endRevertMaximize: Prototype.emptyFunction,\r
+ endRevertMinimize: Prototype.emptyFunction,\r
+ endClose: Prototype.emptyFunction,\r
+ dragOptions: {},\r
+ appendToBody: false\r
+ }, arguments[1] || {});\r
+ \r
+ var customCss = CssUtil.appendPrefix(options.cssPrefix, Window.className);\r
+ this.classNames = new CssUtil([Window.className, customCss]);\r
+ \r
+ this.element = $(element);\r
+ Element.setStyle(this.element, {visibility: 'hidden'});\r
+\r
+ this.options = options;\r
+ this.element.className = this.options.className;\r
+ this.header = null;\r
+ this.windowBody = null;\r
+ this.bottom = null;\r
+ \r
+ this.elementId = this.element.id;\r
+ this.dragHandleId = this.elementId + '_dragHandle';\r
+ \r
+ this.maxZindex = -1;\r
+ this.minFlag = false;\r
+ this.maxFlag = false;\r
+ this.currentPos = [0,0];\r
+ this.currentSize = [0,0];\r
+\r
+ this.buildWindow();\r
+ this.cover = new IECover(this.element, {padding: 10});\r
+ \r
+ Element.makePositioned(element);\r
+ Element.hide(this.element);\r
+ Element.setStyle(this.element, {visibility: 'visible'});\r
+\r
+ if (this.options.appendToBody) this.appendToBody.callAfterLoading(this);\r
+ },\r
+\r
+ buildWindow: function() {\r
+ Element.cleanWhitespace(this.element);\r
+ \r
+ with(this.element.style) {\r
+ width = this.options.width + 'px';\r
+ height= this.options.height + 'px';\r
+ }\r
+\r
+ var title = this.element.childNodes[0];\r
+ var content = this.element.childNodes[1];\r
+ this.buildHeader(title);\r
+ this.buildBody(content);\r
+ this.buildBottom();\r
+ var newStyle = {height: this.options.height};\r
+ this.setBodyHeight(newStyle);\r
+\r
+ if (this.options.drag) this.createDraggble();\r
+\r
+ if (this.options.resize) {\r
+ this.enableResizing();\r
+ }\r
+ },\r
+\r
+ buildHeader: function(title) {\r
+ var headerLeft = Builder.node('div');\r
+ this.classNames.addClassNames(headerLeft, 'headerLeft');\r
+\r
+ var headerMiddle = Builder.node('div', {id: this.dragHandleId});\r
+ this.classNames.addClassNames(headerMiddle, 'headerMiddle');\r
+ \r
+ var headerRight = Builder.node('div');\r
+ this.classNames.addClassNames(headerRight, 'headerRight');\r
+\r
+ var buttonHolder = Builder.node('div');\r
+ this.classNames.addClassNames(buttonHolder, 'buttonHolder');\r
+ \r
+ headerMiddle.appendChild(title);\r
+ var headerList = [headerLeft, headerMiddle, buttonHolder, headerRight];\r
+ this.header = Builder.node('div', headerList);\r
+ this.classNames.addClassNames(this.header, 'header');\r
+ this.element.appendChild(this.header);\r
+ \r
+ \r
+ if (this.options.closeButton) {\r
+ var closeButton = Builder.node('div', {id: this.element.id.appendSuffix('closeButton')});\r
+ this.classNames.addClassNames(closeButton, 'closeButton');\r
+ buttonHolder.appendChild(closeButton);\r
+ Event.observe(closeButton, 'click', this.close.bindAsEventListener(this));\r
+ }\r
+ if (this.options.maxButton) {\r
+ var maxButton = Builder.node('div', {id: this.element.id.appendSuffix('maxButton')});\r
+ this.classNames.addClassNames(maxButton, 'maxButton');\r
+ buttonHolder.appendChild(maxButton);\r
+ Event.observe(maxButton, 'click', this.maximize.bindAsEventListener(this));\r
+ }\r
+ if (this.options.minButton) {\r
+ var minButton = Builder.node('div', {id: this.element.id.appendSuffix('minButton')});\r
+ this.classNames.addClassNames(minButton, 'minButton');\r
+ buttonHolder.appendChild(minButton);\r
+ Event.observe(minButton, 'click', this.minimize.bindAsEventListener(this));\r
+ }\r
+\r
+ if (this.options.addButton) {\r
+ var addButton = this.options.addButton;\r
+ if (addButton.constructor == Function) {\r
+ addButton(buttonHolder);\r
+ } else if (addButton.constructor == Array) {\r
+ var self = this;\r
+ var firstChild = buttonHolder.firstChild;\r
+ addButton.each(function(b) {\r
+ var button = Builder.node('div', {id: b.id, className: b.className});\r
+ Event.observe(button, 'click', b.onclick.bindAsEventListener(self));\r
+ if (b.first && firstChild) {\r
+ buttonHolder.insertBefore(button, firstChild);\r
+ } else {\r
+ buttonHolder.appendChild(button);\r
+ }\r
+ });\r
+ }\r
+ }\r
+ },\r
+ \r
+ buildBody: function(contents) {\r
+ var bodyLeft = Builder.node('div', {className: Window.className.bodyLeft});\r
+ this.classNames.addClassNames(bodyLeft, 'bodyLeft');\r
+ \r
+ var bodyMiddle = Builder.node('div');\r
+ this.classNames.addClassNames(bodyMiddle, 'bodyMiddle');\r
+ bodyMiddle.appendChild(contents);\r
+ \r
+ var bodyRight = Builder.node('div');\r
+ this.classNames.addClassNames(bodyRight, 'bodyRight');\r
+\r
+ var bodyList = [bodyRight,bodyLeft, bodyMiddle];\r
+ this.windowBody = Builder.node('div', bodyList); \r
+ this.classNames.addClassNames(this.windowBody, 'body');\r
+ this.element.appendChild(this.windowBody);\r
+ },\r
+ \r
+ buildBottom: function() {\r
+ var bottomLeft = Builder.node('div');\r
+ this.classNames.addClassNames(bottomLeft, 'bottomLeft');\r
+ \r
+ var bottomMiddle = Builder.node('div');\r
+ this.classNames.addClassNames(bottomMiddle, 'bottomMiddle');\r
+ \r
+ var bottomRight = Builder.node('div');\r
+ this.classNames.addClassNames(bottomRight, 'bottomRight');\r
+ \r
+ var bottomList = [bottomLeft, bottomMiddle, bottomRight];\r
+ this.bottom = Builder.node('div', bottomList);\r
+ this.classNames.addClassNames(this.bottom, 'bottom');\r
+ this.element.appendChild(this.bottom);\r
+ },\r
+\r
+ createDraggble: function() {\r
+ var self = this;\r
+ var options = Object.extend({\r
+ handle: this.dragHandleId,\r
+ starteffect: Prototype.emptyFunction,\r
+ endeffect: Prototype.emptyFunction,\r
+ endDrag: this.options.endDrag,\r
+ scroll: window\r
+ }, this.options.dragOptions);\r
+\r
+ if (this.options.restriction) {\r
+ options.snap = function(x, y) {\r
+ function constrain(n, lower, upper) {\r
+ if (n > upper) return upper; \r
+ else if (n < lower) return lower;\r
+ else return n;\r
+ }\r
+\r
+ var eDimensions = Element.getDimensions(self.element);\r
+ var pDimensions = Element.getDimensions(self.element.parentNode);\r
+\r
+ if (Element.getStyle(self.element.parentNode, 'position') == 'static') {\r
+ var offset = Position.positionedOffset(self.element.parentNode);\r
+ var parentLeft = offset[0];\r
+ var parentTop = offset[1];\r
+ return[\r
+ constrain(x, parentLeft, parentLeft + pDimensions.width - eDimensions.width),\r
+ constrain(y, parentTop, parentTop + pDimensions.height - eDimensions.height)\r
+ ];\r
+ } else {\r
+ return[\r
+ constrain(x, 0, pDimensions.width - eDimensions.width),\r
+ constrain(y, 0, pDimensions.height - eDimensions.height)\r
+ ];\r
+ }\r
+ }\r
+ } else {\r
+ var p = Position.cumulativeOffset(Position.offsetParent(this.element));\r
+ options.snap = function(x, y) {\r
+ return [\r
+ ((x + p[0]) >= 0) ? x : 0 - p[0], \r
+ ((y + p[1]) >= 0) ? y : 0 - p[1]\r
+ ];\r
+ }\r
+ }\r
+ new DraggableWindowEx(this.element, options);\r
+ },\r
+\r
+ setWindowZindex : function(zIndex) {\r
+ zIndex = this.getZindex(zIndex);\r
+ this.element.style.zIndex = zIndex;\r
+ },\r
+ \r
+ getZindex: function(zIndex) {\r
+ return ZindexManager.getIndex(zIndex);\r
+ },\r
+ \r
+ open: function(zIndex) {\r
+ this.opening = true;\r
+ if (this.options.modal) {\r
+ Modal.mask(this.element, {zIndex: zIndex});\r
+ } else {\r
+ this.setWindowZindex(zIndex);\r
+ }\r
+ Element.show(this.element);\r
+ this.cover.resetSize();\r
+ this.opening = false;\r
+ if (this.shouldClose) {\r
+ this.close();\r
+ this.shouldClose = false;\r
+ }\r
+ },\r
+ \r
+ close: function() {\r
+ if (this.opening) this.shouldClose = true;\r
+ if (!this.options.preClose(this)) return;\r
+ this.element.style.zIndex = -1;\r
+ this.maxZindex = -1;\r
+ try {\r
+ Element.hide(this.element);\r
+ } catch(e) {}\r
+ if (this.options.modal) {\r
+ Modal.unmask();\r
+ }\r
+ this.options.endClose(this);\r
+ if (this.opening) this.shouldClose = true;\r
+ },\r
+\r
+ minimize: function(event) {\r
+ if (this.minFlag) {\r
+ if (!this.options.preRevertMinimize(this)) return;\r
+ Element.toggle(this.windowBody);\r
+ if (this.maxFlag) {\r
+ this.minFlag = false;\r
+ this.setMax();\r
+ } else { \r
+ var newStyle = {height:this.currentSize[1]}\r
+ this.setBodyHeight(newStyle);\r
+ this.element.style.width = this.currentSize[0];\r
+ this.element.style.height = this.currentSize[1]; \r
+ this.element.style.left = this.currentPos[0];\r
+ this.element.style.top = this.currentPos[1];\r
+ this.maxFlag = false;\r
+ this.minFlag = false;\r
+ this.options.endRevertMinimize(this);\r
+ }\r
+ } else {\r
+ if (!this.options.preMinimize(this)) return;\r
+ Element.toggle(this.windowBody);\r
+ if (!this.maxFlag) {\r
+ this.currentPos = [Element.getStyle(this.element, 'left'), Element.getStyle(this.element, 'top')];\r
+ this.currentSize = [Element.getStyle(this.element, 'width'), Element.getStyle(this.element, 'height')];\r
+ }\r
+ this.setMin();\r
+ this.minFlag = true;\r
+ this.options.endMinimize(this);\r
+ }\r
+ this.cover.resetSize();\r
+ },\r
+ \r
+ maximize: function(event) {\r
+ if (this.maxFlag) {\r
+ if (this.minFlag) {\r
+ Element.toggle(this.windowBody);\r
+ this.minFlag = false;\r
+ this.setMax();\r
+ } else {\r
+ if (!this.options.preRevertMaximize(this)) return;\r
+ var newStyle = {height:parseInt(this.currentSize[1])}\r
+ this.setBodyHeight(newStyle);\r
+ this.element.style.width = this.currentSize[0];\r
+ this.element.style.height = this.currentSize[1]; \r
+ this.element.style.left = this.currentPos[0];\r
+ this.element.style.top = this.currentPos[1];\r
+ this.maxFlag = false;\r
+ this.minFlag = false; \r
+ document.body.style.overflow = '';\r
+ this.element.style.position = this.position;\r
+ if (this.parent) {\r
+ if (this.nextElement) {\r
+ this.parent.insertBefore(this.element, this.nextElement);\r
+ } else {\r
+ this.parent.appendChild(this.element);\r
+ }\r
+ }\r
+ this.options.endRevertMaximize(this);\r
+ }\r
+ \r
+ } else {\r
+ if (!this.options.preMaximize(this)) return;\r
+ if (!this.minFlag) {\r
+ this.currentPos = [Element.getStyle(this.element, 'left'), Element.getStyle(this.element, 'top')];\r
+ this.currentSize = [Element.getStyle(this.element, 'width'), Element.getStyle(this.element, 'height')]; \r
+ } else {\r
+ Element.toggle(this.windowBody);\r
+ this.minFlag = false;\r
+ }\r
+ this.parent = this.element.parentNode;\r
+ this.nextElement = Element.next(this.element, 0);\r
+ this.position = Element.getStyle(this.element, 'position');\r
+ document.body.style.overflow = 'hidden';\r
+ document.body.appendChild(this.element);\r
+ this.element.style.position = 'absolute';\r
+ this.setMax();\r
+ this.maxFlag = true;\r
+ this.options.endMaximize(this);\r
+ }\r
+ this.cover.resetSize();\r
+ },\r
+ \r
+ setMin : function() {\r
+ var minHeight = this.header.offsetHeight + this.bottom.offsetHeight;\r
+ var minWidth = this.options.minWidth;\r
+ this.element.style.height = minHeight + 'px';\r
+ this.element.style.width = minWidth + 'px';\r
+ },\r
+ \r
+ setMax : function(zIndex) {\r
+ var maxW = Element.getWindowWidth();\r
+ var maxH = Element.getWindowHeight();\r
+ var newStatus = {height:maxH}\r
+ with(this.element.style) {\r
+ width = maxW + 'px';\r
+ height = maxH + 'px';\r
+ left = '0px';\r
+ top = '0px';\r
+ }\r
+ this.setBodyHeight(newStatus);\r
+ this.setWindowZindex(zIndex); \r
+ },\r
+ \r
+ _getParentWidth: function(parent) {\r
+ if (parent && parent.style) {\r
+ var width = parent.style.width;\r
+ var index = 0;\r
+ if (width) {\r
+ if ((index = width.indexOf('px', 0)) > 0) {\r
+ return parseInt(width);\r
+ } else if ((index = width.indexOf('%', 0)) > 0) {\r
+ var pw = this._getParentWidth(parent.parentNode);\r
+ \r
+ var par = parseInt(width);\r
+ return pw * par / 100;\r
+ } else if (!width.isNaN) {\r
+ return parseInt(width);\r
+ } \r
+ } else if (parent == document.body){\r
+ return Element.getWindowWidth();\r
+ }\r
+ }\r
+ },\r
+\r
+ setHeight: function(height) {\r
+ height = {height: height};\r
+ Element.setStyle(this.element, height);\r
+ this.setBodyHeight(height);\r
+ },\r
+ \r
+ setBodyHeight: function(newStyle) {\r
+ var height = parseInt(newStyle.height);\r
+ if (height > this.options.minHeight) {\r
+ var newHeight = (height - this.header.offsetHeight - this.bottom.offsetHeight) + 'px';\r
+ this.windowBody.childNodes[0].style.height = newHeight;\r
+ this.windowBody.childNodes[1].style.height = newHeight;\r
+ this.windowBody.childNodes[2].style.height = newHeight;\r
+ this.windowBody.style.height = newHeight;\r
+ }\r
+ if (this.cover) this.cover.resetSize();\r
+ },\r
+\r
+ center: function() {\r
+ var w = parseInt(Element.getStyle(this.element, 'width'));\r
+ var h = parseInt(Element.getStyle(this.element, 'height'));\r
+\r
+ var pOffset = Position.cumulativeOffset(Position.offsetParent(this.element));\r
+\r
+ var left = (Element.getWindowWidth() - w) / 2;\r
+ var top = (Element.getWindowHeight() - h) / 2;\r
+ var scrollTop = (document.documentElement.scrollTop || document.body.scrollTop);\r
+ var scrollLeft = (document.documentElement.scrollLeft || document.body.scrollLeft);\r
+\r
+ top += scrollTop - pOffset[1];\r
+ left += scrollLeft - pOffset[0];\r
+ top = ((top + pOffset[1]) >= 0) ? top : 0 - pOffset[1];\r
+ left = ((left + pOffset[0]) >= 0) ? left : 0 - pOffset[0];\r
+ Element.setStyle(this.element, {left: left + 'px', top: top + 'px'});\r
+ },\r
+\r
+ enableResizing: function() {\r
+ var resTop = this.options.resizeY ? 6 : 0;\r
+ var resBottom = this.options.resizeY ? 6 : 0;\r
+ var resLeft = this.options.resizeX ? 6 : 0;\r
+ var resRight = this.options.resizeX ? 6 : 0;\r
+ this.resizeable = new ResizeableWindowEx(this.element, { \r
+ top: resTop,\r
+ bottom: resBottom,\r
+ left: resLeft,\r
+ right: resRight,\r
+ minWidth: this.options.minWidth,\r
+ minHeight: this.options.minHeight,\r
+ draw: this.setBodyHeight.bind(this),\r
+ resize: this.options.endResize,\r
+ restriction: this.options.restriction,\r
+ zindex: 2000\r
+ });\r
+ },\r
+\r
+ disableResizing: function() {\r
+ this.resizeable.destroy();\r
+ },\r
+\r
+ appendToBody: function() {\r
+ this.removeFromBody(this.element.id)\r
+ document.body.appendChild(this.element);\r
+ },\r
+ \r
+ removeFromBody: function(dom_id) {\r
+ $A(document.body.childNodes).each(function(node){\r
+ if (node.id == dom_id) node.remove();\r
+ });\r
+ }\r
+}\r
+\r
+\r
+// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// This code is substantially based on code from script.aculo.us which has the \r
+// following copyright and permission notice\r
+//\r
+// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+var DraggableWindowEx = Class.create();\r
+Object.extend(DraggableWindowEx.prototype, Draggable.prototype);\r
+Object.extend(DraggableWindowEx.prototype, {\r
+ initDrag: function(event) {\r
+ if(Event.isLeftClick(event)) { \r
+ // abort on form elements, fixes a Firefox issue\r
+ var src = Event.element(event);\r
+ if(src.tagName && (\r
+ src.tagName=='INPUT' ||\r
+ src.tagName=='SELECT' ||\r
+ src.tagName=='OPTION' ||\r
+ src.tagName=='BUTTON' ||\r
+ src.tagName=='TEXTAREA')) return;\r
+ \r
+ if(this.element._revert) {\r
+ this.element._revert.cancel();\r
+ this.element._revert = null;\r
+ }\r
+ \r
+ var pointer = [Event.pointerX(event), Event.pointerY(event)];\r
+ var pos = Position.cumulativeOffset(this.element);\r
+ this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) });\r
+\r
+ var zIndex = ZindexManager.getIndex();\r
+ this.originalZ = zIndex;\r
+ this.options.zindex = zIndex;\r
+ Element.setStyle(this.element, {zIndex: zIndex});\r
+ \r
+ Draggables.activate(this);\r
+ Event.stop(event);\r
+ }\r
+ },\r
+\r
+ endDrag: function(event) {\r
+ if(!this.dragging) return;\r
+ this.stopScrolling();\r
+ this.finishDrag(event, true);\r
+\r
+ this.options.endDrag();\r
+ Event.stop(event);\r
+ }\r
+});\r
+\r
-// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)
-//
-// This code is substantially based on code from Thomas Fakes(http://craz8.com)
-// which has the following copyright and permission notice
-//
-// Copyright (c) 2005 Thomas Fakes (http://craz8.com)
-//
-// This code is substantially based on code from script.aculo.us which has the
-// following copyright and permission notice
-//
-// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-ResizeableWindowEx = Class.create();
-Object.extend(Object.extend(ResizeableWindowEx.prototype, Resizeable.prototype), {
- startResize: function(event) {
- if (Event.isLeftClick(event)) {
-
- // abort on form elements, fixes a Firefox issue
- var src = Event.element(event);
- if(src.tagName && (
- src.tagName=='INPUT' ||
- src.tagName=='SELECT' ||
- src.tagName=='BUTTON' ||
- src.tagName=='TEXTAREA')) return;
-
- var dir = this.directions(event);
- if (dir.length > 0) {
- this.active = true;
- var offsets = Position.cumulativeOffset(this.element);
- this.startTop = offsets[1];
- this.startLeft = offsets[0];
- this.startWidth = parseInt(Element.getStyle(this.element, 'width'));
- this.startHeight = parseInt(Element.getStyle(this.element, 'height'));
- this.startX = event.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
- this.startY = event.clientY + document.body.scrollTop + document.documentElement.scrollTop;
-
- this.currentDirection = dir;
- Event.stop(event);
- }
-
- if (this.options.restriction) {
- var parent = this.element.parentNode;
- var dimensions = Element.getDimensions(parent);
- this.parentOffset = Position.cumulativeOffset(parent);
- this.parentWidth = this.parentOffset[0] + dimensions.width;
- this.parentHeight = this.parentOffset[1] + dimensions.height;
- }
- }
- },
-
- draw: function(event) {
- var pointer = [Event.pointerX(event), Event.pointerY(event)];
- if (this.options.restriction &&
- (
- (this.parentWidth <= pointer[0])
- || (this.parentHeight <= pointer[1])
- || (this.parentOffset[0] >= pointer[0])
- || (this.parentOffset[1] >= pointer[1])
- )) return;
-
- var style = this.element.style;
- var newHeight = style.height;
- var newWidth = style.width;
- var newTop = style.top;
- var newLeft = style.left;
-
- if (this.currentDirection.indexOf('n') != -1) {
- var pointerMoved = this.startY - pointer[1];
- var margin = Element.getStyle(this.element, 'margin-top') || "0";
- newHeight = this.startHeight + pointerMoved;
- newTop = (this.startTop - pointerMoved - parseInt(margin)) + "px";
- }
-
- if (this.currentDirection.indexOf('w') != -1) {
- var pointerMoved = this.startX - pointer[0];
- var margin = Element.getStyle(this.element, 'margin-left') || "0";
- newWidth = this.startWidth + pointerMoved;
- newLeft = this.startLeft - pointerMoved - parseInt(margin);
- if (this.options.restriction) newLeft -= this.parentOffset[0];
- newLeft += 'px';
- }
-
- if (this.currentDirection.indexOf('s') != -1) {
- newHeight = this.startHeight + pointer[1] - this.startY;
- }
-
- if (this.currentDirection.indexOf('e') != -1) {
- newWidth = this.startWidth + pointer[0] - this.startX;
- }
-
- var newStyle = {
- height: newHeight,
- width: newWidth,
- top: newTop,
- left: newLeft
- }
- if (this.options.draw) {
- this.options.draw(newStyle, this.element);
- }
-
- if (newHeight && newHeight > this.options.minHeight) {
- style.top = newStyle.top;
- style.height = newStyle.height + "px";
- }
- if (newWidth && newWidth > this.options.minWidth) {
- style.left = newStyle.left;
- style.width = newStyle.width + "px";
- }
- if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering
- }
-});
+// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// This code is substantially based on code from Thomas Fakes(http://craz8.com) \r
+// which has the following copyright and permission notice\r
+// \r
+// Copyright (c) 2005 Thomas Fakes (http://craz8.com)\r
+// \r
+// This code is substantially based on code from script.aculo.us which has the \r
+// following copyright and permission notice\r
+//\r
+// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+ResizeableWindowEx = Class.create();\r
+Object.extend(Object.extend(ResizeableWindowEx.prototype, Resizeable.prototype), {\r
+ startResize: function(event) {\r
+ if (Event.isLeftClick(event)) {\r
+ \r
+ // abort on form elements, fixes a Firefox issue\r
+ var src = Event.element(event);\r
+ if(src.tagName && (\r
+ src.tagName=='INPUT' ||\r
+ src.tagName=='SELECT' ||\r
+ src.tagName=='BUTTON' ||\r
+ src.tagName=='TEXTAREA')) return;\r
+\r
+ var dir = this.directions(event);\r
+ if (dir.length > 0) { \r
+ this.active = true;\r
+ var offsets = Position.cumulativeOffset(this.element);\r
+ this.startTop = offsets[1];\r
+ this.startLeft = offsets[0];\r
+ this.startWidth = parseInt(Element.getStyle(this.element, 'width'));\r
+ this.startHeight = parseInt(Element.getStyle(this.element, 'height'));\r
+ this.startX = event.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;\r
+ this.startY = event.clientY + document.body.scrollTop + document.documentElement.scrollTop;\r
+ \r
+ this.currentDirection = dir;\r
+ Event.stop(event);\r
+ }\r
+\r
+ if (this.options.restriction) {\r
+ var parent = this.element.parentNode;\r
+ var dimensions = Element.getDimensions(parent);\r
+ this.parentOffset = Position.cumulativeOffset(parent);\r
+ this.parentWidth = this.parentOffset[0] + dimensions.width;\r
+ this.parentHeight = this.parentOffset[1] + dimensions.height;\r
+ }\r
+ }\r
+ },\r
+\r
+ draw: function(event) {\r
+ var pointer = [Event.pointerX(event), Event.pointerY(event)];\r
+ if (this.options.restriction &&\r
+ (\r
+ (this.parentWidth <= pointer[0])\r
+ || (this.parentHeight <= pointer[1])\r
+ || (this.parentOffset[0] >= pointer[0])\r
+ || (this.parentOffset[1] >= pointer[1])\r
+ )) return;\r
+\r
+ var style = this.element.style;\r
+ var newHeight = style.height;\r
+ var newWidth = style.width;\r
+ var newTop = style.top;\r
+ var newLeft = style.left;\r
+\r
+ if (this.currentDirection.indexOf('n') != -1) {\r
+ var pointerMoved = this.startY - pointer[1];\r
+ var margin = Element.getStyle(this.element, 'margin-top') || "0";\r
+ newHeight = this.startHeight + pointerMoved;\r
+ newTop = (this.startTop - pointerMoved - parseInt(margin)) + "px";\r
+ }\r
+ \r
+ if (this.currentDirection.indexOf('w') != -1) {\r
+ var pointerMoved = this.startX - pointer[0];\r
+ var margin = Element.getStyle(this.element, 'margin-left') || "0";\r
+ newWidth = this.startWidth + pointerMoved;\r
+ newLeft = this.startLeft - pointerMoved - parseInt(margin);\r
+ if (this.options.restriction) newLeft -= this.parentOffset[0];\r
+ newLeft += 'px';\r
+ }\r
+ \r
+ if (this.currentDirection.indexOf('s') != -1) {\r
+ newHeight = this.startHeight + pointer[1] - this.startY;\r
+ }\r
+ \r
+ if (this.currentDirection.indexOf('e') != -1) {\r
+ newWidth = this.startWidth + pointer[0] - this.startX;\r
+ }\r
+ \r
+ var newStyle = {\r
+ height: newHeight,\r
+ width: newWidth,\r
+ top: newTop,\r
+ left: newLeft\r
+ }\r
+ if (this.options.draw) {\r
+ this.options.draw(newStyle, this.element);\r
+ }\r
+ \r
+ if (newHeight && newHeight > this.options.minHeight) {\r
+ style.top = newStyle.top;\r
+ style.height = newStyle.height + "px";\r
+ }\r
+ if (newWidth && newWidth > this.options.minWidth) {\r
+ style.left = newStyle.left;\r
+ style.width = newStyle.width + "px";\r
+ }\r
+ if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering\r
+ }\r
+});\r
-// script.aculo.us builder.js v1.6.4, Wed Sep 06 11:30:58 CEST 2006
-
-// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-//
-// See scriptaculous.js for full license.
-
-var Builder = {
- NODEMAP: {
- AREA: 'map',
- CAPTION: 'table',
- COL: 'table',
- COLGROUP: 'table',
- LEGEND: 'fieldset',
- OPTGROUP: 'select',
- OPTION: 'select',
- PARAM: 'object',
- TBODY: 'table',
- TD: 'table',
- TFOOT: 'table',
- TH: 'table',
- THEAD: 'table',
- TR: 'table'
- },
- // note: For Firefox < 1.5, OPTION and OPTGROUP tags are currently broken,
- // due to a Firefox bug
- node: function(elementName) {
- elementName = elementName.toUpperCase();
-
- // try innerHTML approach
- var parentTag = this.NODEMAP[elementName] || 'div';
- var parentElement = document.createElement(parentTag);
- try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
- parentElement.innerHTML = "<" + elementName + "></" + elementName + ">";
- } catch(e) {}
- var element = parentElement.firstChild || null;
-
- // see if browser added wrapping tags
- if(element && (element.tagName != elementName))
- element = element.getElementsByTagName(elementName)[0];
-
- // fallback to createElement approach
- if(!element) element = document.createElement(elementName);
-
- // abort if nothing could be created
- if(!element) return;
-
- // attributes (or text)
- if(arguments[1])
- if(this._isStringOrNumber(arguments[1]) ||
- (arguments[1] instanceof Array)) {
- this._children(element, arguments[1]);
- } else {
- var attrs = this._attributes(arguments[1]);
- if(attrs.length) {
- try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
- parentElement.innerHTML = "<" +elementName + " " +
- attrs + "></" + elementName + ">";
- } catch(e) {}
- element = parentElement.firstChild || null;
- // workaround firefox 1.0.X bug
- if(!element) {
- element = document.createElement(elementName);
- for(attr in arguments[1])
- element[attr == 'class' ? 'className' : attr] = arguments[1][attr];
- }
- if(element.tagName != elementName)
- element = parentElement.getElementsByTagName(elementName)[0];
- }
- }
-
- // text, or array of children
- if(arguments[2])
- this._children(element, arguments[2]);
-
- return element;
- },
- _text: function(text) {
- return document.createTextNode(text);
- },
- _attributes: function(attributes) {
- var attrs = [];
- for(attribute in attributes)
- attrs.push((attribute=='className' ? 'class' : attribute) +
- '="' + attributes[attribute].toString().escapeHTML() + '"');
- return attrs.join(" ");
- },
- _children: function(element, children) {
- if(typeof children=='object') { // array can hold nodes and text
- children.flatten().each( function(e) {
- if(typeof e=='object')
- element.appendChild(e)
- else
- if(Builder._isStringOrNumber(e))
- element.appendChild(Builder._text(e));
- });
- } else
- if(Builder._isStringOrNumber(children))
- element.appendChild(Builder._text(children));
- },
- _isStringOrNumber: function(param) {
- return(typeof param=='string' || typeof param=='number');
- },
- dump: function(scope) {
- if(typeof scope != 'object' && typeof scope != 'function') scope = window; //global scope
-
- var tags = ("A ABBR ACRONYM ADDRESS APPLET AREA B BASE BASEFONT BDO BIG BLOCKQUOTE BODY " +
- "BR BUTTON CAPTION CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM FIELDSET " +
- "FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I IFRAME IMG INPUT INS ISINDEX "+
- "KBD LABEL LEGEND LI LINK MAP MENU META NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION P "+
- "PARAM PRE Q S SAMP SCRIPT SELECT SMALL SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD "+
- "TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR").split(/\s+/);
-
- tags.each( function(tag){
- scope[tag] = function() {
- return Builder.node.apply(Builder, [tag].concat($A(arguments)));
- }
- });
- }
+// script.aculo.us builder.js v1.6.4, Wed Sep 06 11:30:58 CEST 2006\r
+\r
+// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)\r
+//\r
+// See scriptaculous.js for full license.\r
+\r
+var Builder = {\r
+ NODEMAP: {\r
+ AREA: 'map',\r
+ CAPTION: 'table',\r
+ COL: 'table',\r
+ COLGROUP: 'table',\r
+ LEGEND: 'fieldset',\r
+ OPTGROUP: 'select',\r
+ OPTION: 'select',\r
+ PARAM: 'object',\r
+ TBODY: 'table',\r
+ TD: 'table',\r
+ TFOOT: 'table',\r
+ TH: 'table',\r
+ THEAD: 'table',\r
+ TR: 'table'\r
+ },\r
+ // note: For Firefox < 1.5, OPTION and OPTGROUP tags are currently broken,\r
+ // due to a Firefox bug\r
+ node: function(elementName) {\r
+ elementName = elementName.toUpperCase();\r
+ \r
+ // try innerHTML approach\r
+ var parentTag = this.NODEMAP[elementName] || 'div';\r
+ var parentElement = document.createElement(parentTag);\r
+ try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707\r
+ parentElement.innerHTML = "<" + elementName + "></" + elementName + ">";\r
+ } catch(e) {}\r
+ var element = parentElement.firstChild || null;\r
+ \r
+ // see if browser added wrapping tags\r
+ if(element && (element.tagName != elementName))\r
+ element = element.getElementsByTagName(elementName)[0];\r
+ \r
+ // fallback to createElement approach\r
+ if(!element) element = document.createElement(elementName);\r
+ \r
+ // abort if nothing could be created\r
+ if(!element) return;\r
+\r
+ // attributes (or text)\r
+ if(arguments[1])\r
+ if(this._isStringOrNumber(arguments[1]) ||\r
+ (arguments[1] instanceof Array)) {\r
+ this._children(element, arguments[1]);\r
+ } else {\r
+ var attrs = this._attributes(arguments[1]);\r
+ if(attrs.length) {\r
+ try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707\r
+ parentElement.innerHTML = "<" +elementName + " " +\r
+ attrs + "></" + elementName + ">";\r
+ } catch(e) {}\r
+ element = parentElement.firstChild || null;\r
+ // workaround firefox 1.0.X bug\r
+ if(!element) {\r
+ element = document.createElement(elementName);\r
+ for(attr in arguments[1]) \r
+ element[attr == 'class' ? 'className' : attr] = arguments[1][attr];\r
+ }\r
+ if(element.tagName != elementName)\r
+ element = parentElement.getElementsByTagName(elementName)[0];\r
+ }\r
+ } \r
+\r
+ // text, or array of children\r
+ if(arguments[2])\r
+ this._children(element, arguments[2]);\r
+\r
+ return element;\r
+ },\r
+ _text: function(text) {\r
+ return document.createTextNode(text);\r
+ },\r
+ _attributes: function(attributes) {\r
+ var attrs = [];\r
+ for(attribute in attributes)\r
+ attrs.push((attribute=='className' ? 'class' : attribute) +\r
+ '="' + attributes[attribute].toString().escapeHTML() + '"');\r
+ return attrs.join(" ");\r
+ },\r
+ _children: function(element, children) {\r
+ if(typeof children=='object') { // array can hold nodes and text\r
+ children.flatten().each( function(e) {\r
+ if(typeof e=='object')\r
+ element.appendChild(e)\r
+ else\r
+ if(Builder._isStringOrNumber(e))\r
+ element.appendChild(Builder._text(e));\r
+ });\r
+ } else\r
+ if(Builder._isStringOrNumber(children)) \r
+ element.appendChild(Builder._text(children));\r
+ },\r
+ _isStringOrNumber: function(param) {\r
+ return(typeof param=='string' || typeof param=='number');\r
+ },\r
+ dump: function(scope) { \r
+ if(typeof scope != 'object' && typeof scope != 'function') scope = window; //global scope \r
+ \r
+ var tags = ("A ABBR ACRONYM ADDRESS APPLET AREA B BASE BASEFONT BDO BIG BLOCKQUOTE BODY " +\r
+ "BR BUTTON CAPTION CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM FIELDSET " +\r
+ "FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I IFRAME IMG INPUT INS ISINDEX "+\r
+ "KBD LABEL LEGEND LI LINK MAP MENU META NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION P "+\r
+ "PARAM PRE Q S SAMP SCRIPT SELECT SMALL SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD "+\r
+ "TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR").split(/\s+/);\r
+ \r
+ tags.each( function(tag){ \r
+ scope[tag] = function() { \r
+ return Builder.node.apply(Builder, [tag].concat($A(arguments))); \r
+ } \r
+ });\r
+ }\r
}
\ No newline at end of file
-// script.aculo.us controls.js v1.6.4, Wed Sep 06 11:30:58 CEST 2006
-
-// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-// (c) 2005 Ivan Krstic (http://blogs.law.harvard.edu/ivan)
-// (c) 2005 Jon Tirsen (http://www.tirsen.com)
-// Contributors:
-// Richard Livsey
-// Rahul Bhargava
-// Rob Wills
-//
-// See scriptaculous.js for full license.
-
-// Autocompleter.Base handles all the autocompletion functionality
-// that's independent of the data source for autocompletion. This
-// includes drawing the autocompletion menu, observing keyboard
-// and mouse events, and similar.
-//
-// Specific autocompleters need to provide, at the very least,
-// a getUpdatedChoices function that will be invoked every time
-// the text inside the monitored textbox changes. This method
-// should get the text for which to provide autocompletion by
-// invoking this.getToken(), NOT by directly accessing
-// this.element.value. This is to allow incremental tokenized
-// autocompletion. Specific auto-completion logic (AJAX, etc)
-// belongs in getUpdatedChoices.
-//
-// Tokenized incremental autocompletion is enabled automatically
-// when an autocompleter is instantiated with the 'tokens' option
-// in the options parameter, e.g.:
-// new Ajax.Autocompleter('id','upd', '/url/', { tokens: ',' });
-// will incrementally autocomplete with a comma as the token.
-// Additionally, ',' in the above example can be replaced with
-// a token array, e.g. { tokens: [',', '\n'] } which
-// enables autocompletion on multiple tokens. This is most
-// useful when one of the tokens is \n (a newline), as it
-// allows smart autocompletion after linebreaks.
-
-if(typeof Effect == 'undefined')
- throw("controls.js requires including script.aculo.us' effects.js library");
-
-var Autocompleter = {}
-Autocompleter.Base = function() {};
-Autocompleter.Base.prototype = {
- baseInitialize: function(element, update, options) {
- this.element = $(element);
- this.update = $(update);
- this.hasFocus = false;
- this.changed = false;
- this.active = false;
- this.index = 0;
- this.entryCount = 0;
-
- if(this.setOptions)
- this.setOptions(options);
- else
- this.options = options || {};
-
- this.options.paramName = this.options.paramName || this.element.name;
- this.options.tokens = this.options.tokens || [];
- this.options.frequency = this.options.frequency || 0.4;
- this.options.minChars = this.options.minChars || 1;
- this.options.onShow = this.options.onShow ||
- function(element, update){
- if(!update.style.position || update.style.position=='absolute') {
- update.style.position = 'absolute';
- Position.clone(element, update, {
- setHeight: false,
- offsetTop: element.offsetHeight
- });
- }
- Effect.Appear(update,{duration:0.15});
- };
- this.options.onHide = this.options.onHide ||
- function(element, update){ new Effect.Fade(update,{duration:0.15}) };
-
- if(typeof(this.options.tokens) == 'string')
- this.options.tokens = new Array(this.options.tokens);
-
- this.observer = null;
-
- this.element.setAttribute('autocomplete','off');
-
- Element.hide(this.update);
-
- Event.observe(this.element, "blur", this.onBlur.bindAsEventListener(this));
- Event.observe(this.element, "keypress", this.onKeyPress.bindAsEventListener(this));
- },
-
- show: function() {
- if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update);
- if(!this.iefix &&
- (navigator.appVersion.indexOf('MSIE')>0) &&
- (navigator.userAgent.indexOf('Opera')<0) &&
- (Element.getStyle(this.update, 'position')=='absolute')) {
- new Insertion.After(this.update,
- '<iframe id="' + this.update.id + '_iefix" '+
- 'style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" ' +
- 'src="javascript:false;" frameborder="0" scrolling="no"></iframe>');
- this.iefix = $(this.update.id+'_iefix');
- }
- if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this), 50);
- },
-
- fixIEOverlapping: function() {
- Position.clone(this.update, this.iefix, {setTop:(!this.update.style.height)});
- this.iefix.style.zIndex = 1;
- this.update.style.zIndex = 2;
- Element.show(this.iefix);
- },
-
- hide: function() {
- this.stopIndicator();
- if(Element.getStyle(this.update, 'display')!='none') this.options.onHide(this.element, this.update);
- if(this.iefix) Element.hide(this.iefix);
- },
-
- startIndicator: function() {
- if(this.options.indicator) Element.show(this.options.indicator);
- },
-
- stopIndicator: function() {
- if(this.options.indicator) Element.hide(this.options.indicator);
- },
-
- onKeyPress: function(event) {
- if(this.active)
- switch(event.keyCode) {
- case Event.KEY_TAB:
- case Event.KEY_RETURN:
- this.selectEntry();
- Event.stop(event);
- case Event.KEY_ESC:
- this.hide();
- this.active = false;
- Event.stop(event);
- return;
- case Event.KEY_LEFT:
- case Event.KEY_RIGHT:
- return;
- case Event.KEY_UP:
- this.markPrevious();
- this.render();
- if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event);
- return;
- case Event.KEY_DOWN:
- this.markNext();
- this.render();
- if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event);
- return;
- }
- else
- if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN ||
- (navigator.appVersion.indexOf('AppleWebKit') > 0 && event.keyCode == 0)) return;
-
- this.changed = true;
- this.hasFocus = true;
-
- if(this.observer) clearTimeout(this.observer);
- this.observer =
- setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000);
- },
-
- activate: function() {
- this.changed = false;
- this.hasFocus = true;
- this.getUpdatedChoices();
- },
-
- onHover: function(event) {
- var element = Event.findElement(event, 'LI');
- if(this.index != element.autocompleteIndex)
- {
- this.index = element.autocompleteIndex;
- this.render();
- }
- Event.stop(event);
- },
-
- onClick: function(event) {
- var element = Event.findElement(event, 'LI');
- this.index = element.autocompleteIndex;
- this.selectEntry();
- this.hide();
- },
-
- onBlur: function(event) {
- // needed to make click events working
- setTimeout(this.hide.bind(this), 250);
- this.hasFocus = false;
- this.active = false;
- },
-
- render: function() {
- if(this.entryCount > 0) {
- for (var i = 0; i < this.entryCount; i++)
- this.index==i ?
- Element.addClassName(this.getEntry(i),"selected") :
- Element.removeClassName(this.getEntry(i),"selected");
-
- if(this.hasFocus) {
- this.show();
- this.active = true;
- }
- } else {
- this.active = false;
- this.hide();
- }
- },
-
- markPrevious: function() {
- if(this.index > 0) this.index--
- else this.index = this.entryCount-1;
- this.getEntry(this.index).scrollIntoView(true);
- },
-
- markNext: function() {
- if(this.index < this.entryCount-1) this.index++
- else this.index = 0;
- this.getEntry(this.index).scrollIntoView(false);
- },
-
- getEntry: function(index) {
- return this.update.firstChild.childNodes[index];
- },
-
- getCurrentEntry: function() {
- return this.getEntry(this.index);
- },
-
- selectEntry: function() {
- this.active = false;
- this.updateElement(this.getCurrentEntry());
- },
-
- updateElement: function(selectedElement) {
- if (this.options.updateElement) {
- this.options.updateElement(selectedElement);
- return;
- }
- var value = '';
- if (this.options.select) {
- var nodes = document.getElementsByClassName(this.options.select, selectedElement) || [];
- if(nodes.length>0) value = Element.collectTextNodes(nodes[0], this.options.select);
- } else
- value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal');
-
- var lastTokenPos = this.findLastToken();
- if (lastTokenPos != -1) {
- var newValue = this.element.value.substr(0, lastTokenPos + 1);
- var whitespace = this.element.value.substr(lastTokenPos + 1).match(/^\s+/);
- if (whitespace)
- newValue += whitespace[0];
- this.element.value = newValue + value;
- } else {
- this.element.value = value;
- }
- this.element.focus();
-
- if (this.options.afterUpdateElement)
- this.options.afterUpdateElement(this.element, selectedElement);
- },
-
- updateChoices: function(choices) {
- if(!this.changed && this.hasFocus) {
- this.update.innerHTML = choices;
- Element.cleanWhitespace(this.update);
- Element.cleanWhitespace(this.update.firstChild);
-
- if(this.update.firstChild && this.update.firstChild.childNodes) {
- this.entryCount =
- this.update.firstChild.childNodes.length;
- for (var i = 0; i < this.entryCount; i++) {
- var entry = this.getEntry(i);
- entry.autocompleteIndex = i;
- this.addObservers(entry);
- }
- } else {
- this.entryCount = 0;
- }
-
- this.stopIndicator();
- this.index = 0;
-
- if(this.entryCount==1 && this.options.autoSelect) {
- this.selectEntry();
- this.hide();
- } else {
- this.render();
- }
- }
- },
-
- addObservers: function(element) {
- Event.observe(element, "mouseover", this.onHover.bindAsEventListener(this));
- Event.observe(element, "click", this.onClick.bindAsEventListener(this));
- },
-
- onObserverEvent: function() {
- this.changed = false;
- if(this.getToken().length>=this.options.minChars) {
- this.startIndicator();
- this.getUpdatedChoices();
- } else {
- this.active = false;
- this.hide();
- }
- },
-
- getToken: function() {
- var tokenPos = this.findLastToken();
- if (tokenPos != -1)
- var ret = this.element.value.substr(tokenPos + 1).replace(/^\s+/,'').replace(/\s+$/,'');
- else
- var ret = this.element.value;
-
- return /\n/.test(ret) ? '' : ret;
- },
-
- findLastToken: function() {
- var lastTokenPos = -1;
-
- for (var i=0; i<this.options.tokens.length; i++) {
- var thisTokenPos = this.element.value.lastIndexOf(this.options.tokens[i]);
- if (thisTokenPos > lastTokenPos)
- lastTokenPos = thisTokenPos;
- }
- return lastTokenPos;
- }
-}
-
-Ajax.Autocompleter = Class.create();
-Object.extend(Object.extend(Ajax.Autocompleter.prototype, Autocompleter.Base.prototype), {
- initialize: function(element, update, url, options) {
- this.baseInitialize(element, update, options);
- this.options.asynchronous = true;
- this.options.onComplete = this.onComplete.bind(this);
- this.options.defaultParams = this.options.parameters || null;
- this.url = url;
- },
-
- getUpdatedChoices: function() {
- entry = encodeURIComponent(this.options.paramName) + '=' +
- encodeURIComponent(this.getToken());
-
- this.options.parameters = this.options.callback ?
- this.options.callback(this.element, entry) : entry;
-
- if(this.options.defaultParams)
- this.options.parameters += '&' + this.options.defaultParams;
-
- new Ajax.Request(this.url, this.options);
- },
-
- onComplete: function(request) {
- this.updateChoices(request.responseText);
- }
-
-});
-
-// The local array autocompleter. Used when you'd prefer to
-// inject an array of autocompletion options into the page, rather
-// than sending out Ajax queries, which can be quite slow sometimes.
-//
-// The constructor takes four parameters. The first two are, as usual,
-// the id of the monitored textbox, and id of the autocompletion menu.
-// The third is the array you want to autocomplete from, and the fourth
-// is the options block.
-//
-// Extra local autocompletion options:
-// - choices - How many autocompletion choices to offer
-//
-// - partialSearch - If false, the autocompleter will match entered
-// text only at the beginning of strings in the
-// autocomplete array. Defaults to true, which will
-// match text at the beginning of any *word* in the
-// strings in the autocomplete array. If you want to
-// search anywhere in the string, additionally set
-// the option fullSearch to true (default: off).
-//
-// - fullSsearch - Search anywhere in autocomplete array strings.
-//
-// - partialChars - How many characters to enter before triggering
-// a partial match (unlike minChars, which defines
-// how many characters are required to do any match
-// at all). Defaults to 2.
-//
-// - ignoreCase - Whether to ignore case when autocompleting.
-// Defaults to true.
-//
-// It's possible to pass in a custom function as the 'selector'
-// option, if you prefer to write your own autocompletion logic.
-// In that case, the other options above will not apply unless
-// you support them.
-
-Autocompleter.Local = Class.create();
-Autocompleter.Local.prototype = Object.extend(new Autocompleter.Base(), {
- initialize: function(element, update, array, options) {
- this.baseInitialize(element, update, options);
- this.options.array = array;
- },
-
- getUpdatedChoices: function() {
- this.updateChoices(this.options.selector(this));
- },
-
- setOptions: function(options) {
- this.options = Object.extend({
- choices: 10,
- partialSearch: true,
- partialChars: 2,
- ignoreCase: true,
- fullSearch: false,
- selector: function(instance) {
- var ret = []; // Beginning matches
- var partial = []; // Inside matches
- var entry = instance.getToken();
- var count = 0;
-
- for (var i = 0; i < instance.options.array.length &&
- ret.length < instance.options.choices ; i++) {
-
- var elem = instance.options.array[i];
- var foundPos = instance.options.ignoreCase ?
- elem.toLowerCase().indexOf(entry.toLowerCase()) :
- elem.indexOf(entry);
-
- while (foundPos != -1) {
- if (foundPos == 0 && elem.length != entry.length) {
- ret.push("<li><strong>" + elem.substr(0, entry.length) + "</strong>" +
- elem.substr(entry.length) + "</li>");
- break;
- } else if (entry.length >= instance.options.partialChars &&
- instance.options.partialSearch && foundPos != -1) {
- if (instance.options.fullSearch || /\s/.test(elem.substr(foundPos-1,1))) {
- partial.push("<li>" + elem.substr(0, foundPos) + "<strong>" +
- elem.substr(foundPos, entry.length) + "</strong>" + elem.substr(
- foundPos + entry.length) + "</li>");
- break;
- }
- }
-
- foundPos = instance.options.ignoreCase ?
- elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) :
- elem.indexOf(entry, foundPos + 1);
-
- }
- }
- if (partial.length)
- ret = ret.concat(partial.slice(0, instance.options.choices - ret.length))
- return "<ul>" + ret.join('') + "</ul>";
- }
- }, options || {});
- }
-});
-
-// AJAX in-place editor
-//
-// see documentation on http://wiki.script.aculo.us/scriptaculous/show/Ajax.InPlaceEditor
-
-// Use this if you notice weird scrolling problems on some browsers,
-// the DOM might be a bit confused when this gets called so do this
-// waits 1 ms (with setTimeout) until it does the activation
-Field.scrollFreeActivate = function(field) {
- setTimeout(function() {
- Field.activate(field);
- }, 1);
-}
-
-Ajax.InPlaceEditor = Class.create();
-Ajax.InPlaceEditor.defaultHighlightColor = "#FFFF99";
-Ajax.InPlaceEditor.prototype = {
- initialize: function(element, url, options) {
- this.url = url;
- this.element = $(element);
-
- this.options = Object.extend({
- okButton: true,
- okText: "ok",
- cancelLink: true,
- cancelText: "cancel",
- savingText: "Saving...",
- clickToEditText: "Click to edit",
- okText: "ok",
- rows: 1,
- onComplete: function(transport, element) {
- new Effect.Highlight(element, {startcolor: this.options.highlightcolor});
- },
- onFailure: function(transport) {
- alert("Error communicating with the server: " + transport.responseText.stripTags());
- },
- callback: function(form) {
- return Form.serialize(form);
- },
- handleLineBreaks: true,
- loadingText: 'Loading...',
- savingClassName: 'inplaceeditor-saving',
- loadingClassName: 'inplaceeditor-loading',
- formClassName: 'inplaceeditor-form',
- highlightcolor: Ajax.InPlaceEditor.defaultHighlightColor,
- highlightendcolor: "#FFFFFF",
- externalControl: null,
- submitOnBlur: false,
- ajaxOptions: {},
- evalScripts: false
- }, options || {});
-
- if(!this.options.formId && this.element.id) {
- this.options.formId = this.element.id + "-inplaceeditor";
- if ($(this.options.formId)) {
- // there's already a form with that name, don't specify an id
- this.options.formId = null;
- }
- }
-
- if (this.options.externalControl) {
- this.options.externalControl = $(this.options.externalControl);
- }
-
- this.originalBackground = Element.getStyle(this.element, 'background-color');
- if (!this.originalBackground) {
- this.originalBackground = "transparent";
- }
-
- this.element.title = this.options.clickToEditText;
-
- this.onclickListener = this.enterEditMode.bindAsEventListener(this);
- this.mouseoverListener = this.enterHover.bindAsEventListener(this);
- this.mouseoutListener = this.leaveHover.bindAsEventListener(this);
- Event.observe(this.element, 'click', this.onclickListener);
- Event.observe(this.element, 'mouseover', this.mouseoverListener);
- Event.observe(this.element, 'mouseout', this.mouseoutListener);
- if (this.options.externalControl) {
- Event.observe(this.options.externalControl, 'click', this.onclickListener);
- Event.observe(this.options.externalControl, 'mouseover', this.mouseoverListener);
- Event.observe(this.options.externalControl, 'mouseout', this.mouseoutListener);
- }
- },
- enterEditMode: function(evt) {
- if (this.saving) return;
- if (this.editing) return;
- this.editing = true;
- this.onEnterEditMode();
- if (this.options.externalControl) {
- Element.hide(this.options.externalControl);
- }
- Element.hide(this.element);
- this.createForm();
- this.element.parentNode.insertBefore(this.form, this.element);
- if (!this.options.loadTextURL) Field.scrollFreeActivate(this.editField);
- // stop the event to avoid a page refresh in Safari
- if (evt) {
- Event.stop(evt);
- }
- return false;
- },
- createForm: function() {
- this.form = document.createElement("form");
- this.form.id = this.options.formId;
- Element.addClassName(this.form, this.options.formClassName)
- this.form.onsubmit = this.onSubmit.bind(this);
-
- this.createEditField();
-
- if (this.options.textarea) {
- var br = document.createElement("br");
- this.form.appendChild(br);
- }
-
- if (this.options.okButton) {
- okButton = document.createElement("input");
- okButton.type = "submit";
- okButton.value = this.options.okText;
- okButton.className = 'editor_ok_button';
- this.form.appendChild(okButton);
- }
-
- if (this.options.cancelLink) {
- cancelLink = document.createElement("a");
- cancelLink.href = "#";
- cancelLink.appendChild(document.createTextNode(this.options.cancelText));
- cancelLink.onclick = this.onclickCancel.bind(this);
- cancelLink.className = 'editor_cancel';
- this.form.appendChild(cancelLink);
- }
- },
- hasHTMLLineBreaks: function(string) {
- if (!this.options.handleLineBreaks) return false;
- return string.match(/<br/i) || string.match(/<p>/i);
- },
- convertHTMLLineBreaks: function(string) {
- return string.replace(/<br>/gi, "\n").replace(/<br\/>/gi, "\n").replace(/<\/p>/gi, "\n").replace(/<p>/gi, "");
- },
- createEditField: function() {
- var text;
- if(this.options.loadTextURL) {
- text = this.options.loadingText;
- } else {
- text = this.getText();
- }
-
- var obj = this;
-
- if (this.options.rows == 1 && !this.hasHTMLLineBreaks(text)) {
- this.options.textarea = false;
- var textField = document.createElement("input");
- textField.obj = this;
- textField.type = "text";
- textField.name = "value";
- textField.value = text;
- textField.style.backgroundColor = this.options.highlightcolor;
- textField.className = 'editor_field';
- var size = this.options.size || this.options.cols || 0;
- if (size != 0) textField.size = size;
- if (this.options.submitOnBlur)
- textField.onblur = this.onSubmit.bind(this);
- this.editField = textField;
- } else {
- this.options.textarea = true;
- var textArea = document.createElement("textarea");
- textArea.obj = this;
- textArea.name = "value";
- textArea.value = this.convertHTMLLineBreaks(text);
- textArea.rows = this.options.rows;
- textArea.cols = this.options.cols || 40;
- textArea.className = 'editor_field';
- if (this.options.submitOnBlur)
- textArea.onblur = this.onSubmit.bind(this);
- this.editField = textArea;
- }
-
- if(this.options.loadTextURL) {
- this.loadExternalText();
- }
- this.form.appendChild(this.editField);
- },
- getText: function() {
- return this.element.innerHTML;
- },
- loadExternalText: function() {
- Element.addClassName(this.form, this.options.loadingClassName);
- this.editField.disabled = true;
- new Ajax.Request(
- this.options.loadTextURL,
- Object.extend({
- asynchronous: true,
- onComplete: this.onLoadedExternalText.bind(this)
- }, this.options.ajaxOptions)
- );
- },
- onLoadedExternalText: function(transport) {
- Element.removeClassName(this.form, this.options.loadingClassName);
- this.editField.disabled = false;
- this.editField.value = transport.responseText.stripTags();
- Field.scrollFreeActivate(this.editField);
- },
- onclickCancel: function() {
- this.onComplete();
- this.leaveEditMode();
- return false;
- },
- onFailure: function(transport) {
- this.options.onFailure(transport);
- if (this.oldInnerHTML) {
- this.element.innerHTML = this.oldInnerHTML;
- this.oldInnerHTML = null;
- }
- return false;
- },
- onSubmit: function() {
- // onLoading resets these so we need to save them away for the Ajax call
- var form = this.form;
- var value = this.editField.value;
-
- // do this first, sometimes the ajax call returns before we get a chance to switch on Saving...
- // which means this will actually switch on Saving... *after* we've left edit mode causing Saving...
- // to be displayed indefinitely
- this.onLoading();
-
- if (this.options.evalScripts) {
- new Ajax.Request(
- this.url, Object.extend({
- parameters: this.options.callback(form, value),
- onComplete: this.onComplete.bind(this),
- onFailure: this.onFailure.bind(this),
- asynchronous:true,
- evalScripts:true
- }, this.options.ajaxOptions));
- } else {
- new Ajax.Updater(
- { success: this.element,
- // don't update on failure (this could be an option)
- failure: null },
- this.url, Object.extend({
- parameters: this.options.callback(form, value),
- onComplete: this.onComplete.bind(this),
- onFailure: this.onFailure.bind(this)
- }, this.options.ajaxOptions));
- }
- // stop the event to avoid a page refresh in Safari
- if (arguments.length > 1) {
- Event.stop(arguments[0]);
- }
- return false;
- },
- onLoading: function() {
- this.saving = true;
- this.removeForm();
- this.leaveHover();
- this.showSaving();
- },
- showSaving: function() {
- this.oldInnerHTML = this.element.innerHTML;
- this.element.innerHTML = this.options.savingText;
- Element.addClassName(this.element, this.options.savingClassName);
- this.element.style.backgroundColor = this.originalBackground;
- Element.show(this.element);
- },
- removeForm: function() {
- if(this.form) {
- if (this.form.parentNode) Element.remove(this.form);
- this.form = null;
- }
- },
- enterHover: function() {
- if (this.saving) return;
- this.element.style.backgroundColor = this.options.highlightcolor;
- if (this.effect) {
- this.effect.cancel();
- }
- Element.addClassName(this.element, this.options.hoverClassName)
- },
- leaveHover: function() {
- if (this.options.backgroundColor) {
- this.element.style.backgroundColor = this.oldBackground;
- }
- Element.removeClassName(this.element, this.options.hoverClassName)
- if (this.saving) return;
- this.effect = new Effect.Highlight(this.element, {
- startcolor: this.options.highlightcolor,
- endcolor: this.options.highlightendcolor,
- restorecolor: this.originalBackground
- });
- },
- leaveEditMode: function() {
- Element.removeClassName(this.element, this.options.savingClassName);
- this.removeForm();
- this.leaveHover();
- this.element.style.backgroundColor = this.originalBackground;
- Element.show(this.element);
- if (this.options.externalControl) {
- Element.show(this.options.externalControl);
- }
- this.editing = false;
- this.saving = false;
- this.oldInnerHTML = null;
- this.onLeaveEditMode();
- },
- onComplete: function(transport) {
- this.leaveEditMode();
- this.options.onComplete.bind(this)(transport, this.element);
- },
- onEnterEditMode: function() {},
- onLeaveEditMode: function() {},
- dispose: function() {
- if (this.oldInnerHTML) {
- this.element.innerHTML = this.oldInnerHTML;
- }
- this.leaveEditMode();
- Event.stopObserving(this.element, 'click', this.onclickListener);
- Event.stopObserving(this.element, 'mouseover', this.mouseoverListener);
- Event.stopObserving(this.element, 'mouseout', this.mouseoutListener);
- if (this.options.externalControl) {
- Event.stopObserving(this.options.externalControl, 'click', this.onclickListener);
- Event.stopObserving(this.options.externalControl, 'mouseover', this.mouseoverListener);
- Event.stopObserving(this.options.externalControl, 'mouseout', this.mouseoutListener);
- }
- }
-};
-
-Ajax.InPlaceCollectionEditor = Class.create();
-Object.extend(Ajax.InPlaceCollectionEditor.prototype, Ajax.InPlaceEditor.prototype);
-Object.extend(Ajax.InPlaceCollectionEditor.prototype, {
- createEditField: function() {
- if (!this.cached_selectTag) {
- var selectTag = document.createElement("select");
- var collection = this.options.collection || [];
- var optionTag;
- collection.each(function(e,i) {
- optionTag = document.createElement("option");
- optionTag.value = (e instanceof Array) ? e[0] : e;
- if((typeof this.options.value == 'undefined') &&
- ((e instanceof Array) ? this.element.innerHTML == e[1] : e == optionTag.value)) optionTag.selected = true;
- if(this.options.value==optionTag.value) optionTag.selected = true;
- optionTag.appendChild(document.createTextNode((e instanceof Array) ? e[1] : e));
- selectTag.appendChild(optionTag);
- }.bind(this));
- this.cached_selectTag = selectTag;
- }
-
- this.editField = this.cached_selectTag;
- if(this.options.loadTextURL) this.loadExternalText();
- this.form.appendChild(this.editField);
- this.options.callback = function(form, value) {
- return "value=" + encodeURIComponent(value);
- }
- }
-});
-
-// Delayed observer, like Form.Element.Observer,
-// but waits for delay after last key input
-// Ideal for live-search fields
-
-Form.Element.DelayedObserver = Class.create();
-Form.Element.DelayedObserver.prototype = {
- initialize: function(element, delay, callback) {
- this.delay = delay || 0.5;
- this.element = $(element);
- this.callback = callback;
- this.timer = null;
- this.lastValue = $F(this.element);
- Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this));
- },
- delayedListener: function(event) {
- if(this.lastValue == $F(this.element)) return;
- if(this.timer) clearTimeout(this.timer);
- this.timer = setTimeout(this.onTimerEvent.bind(this), this.delay * 1000);
- this.lastValue = $F(this.element);
- },
- onTimerEvent: function() {
- this.timer = null;
- this.callback(this.element, $F(this.element));
- }
-};
+// script.aculo.us controls.js v1.6.4, Wed Sep 06 11:30:58 CEST 2006\r
+\r
+// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)\r
+// (c) 2005 Ivan Krstic (http://blogs.law.harvard.edu/ivan)\r
+// (c) 2005 Jon Tirsen (http://www.tirsen.com)\r
+// Contributors:\r
+// Richard Livsey\r
+// Rahul Bhargava\r
+// Rob Wills\r
+// \r
+// See scriptaculous.js for full license.\r
+\r
+// Autocompleter.Base handles all the autocompletion functionality \r
+// that's independent of the data source for autocompletion. This\r
+// includes drawing the autocompletion menu, observing keyboard\r
+// and mouse events, and similar.\r
+//\r
+// Specific autocompleters need to provide, at the very least, \r
+// a getUpdatedChoices function that will be invoked every time\r
+// the text inside the monitored textbox changes. This method \r
+// should get the text for which to provide autocompletion by\r
+// invoking this.getToken(), NOT by directly accessing\r
+// this.element.value. This is to allow incremental tokenized\r
+// autocompletion. Specific auto-completion logic (AJAX, etc)\r
+// belongs in getUpdatedChoices.\r
+//\r
+// Tokenized incremental autocompletion is enabled automatically\r
+// when an autocompleter is instantiated with the 'tokens' option\r
+// in the options parameter, e.g.:\r
+// new Ajax.Autocompleter('id','upd', '/url/', { tokens: ',' });\r
+// will incrementally autocomplete with a comma as the token.\r
+// Additionally, ',' in the above example can be replaced with\r
+// a token array, e.g. { tokens: [',', '\n'] } which\r
+// enables autocompletion on multiple tokens. This is most \r
+// useful when one of the tokens is \n (a newline), as it \r
+// allows smart autocompletion after linebreaks.\r
+\r
+if(typeof Effect == 'undefined')\r
+ throw("controls.js requires including script.aculo.us' effects.js library");\r
+\r
+var Autocompleter = {}\r
+Autocompleter.Base = function() {};\r
+Autocompleter.Base.prototype = {\r
+ baseInitialize: function(element, update, options) {\r
+ this.element = $(element); \r
+ this.update = $(update); \r
+ this.hasFocus = false; \r
+ this.changed = false; \r
+ this.active = false; \r
+ this.index = 0; \r
+ this.entryCount = 0;\r
+\r
+ if(this.setOptions)\r
+ this.setOptions(options);\r
+ else\r
+ this.options = options || {};\r
+\r
+ this.options.paramName = this.options.paramName || this.element.name;\r
+ this.options.tokens = this.options.tokens || [];\r
+ this.options.frequency = this.options.frequency || 0.4;\r
+ this.options.minChars = this.options.minChars || 1;\r
+ this.options.onShow = this.options.onShow || \r
+ function(element, update){ \r
+ if(!update.style.position || update.style.position=='absolute') {\r
+ update.style.position = 'absolute';\r
+ Position.clone(element, update, {\r
+ setHeight: false, \r
+ offsetTop: element.offsetHeight\r
+ });\r
+ }\r
+ Effect.Appear(update,{duration:0.15});\r
+ };\r
+ this.options.onHide = this.options.onHide || \r
+ function(element, update){ new Effect.Fade(update,{duration:0.15}) };\r
+\r
+ if(typeof(this.options.tokens) == 'string') \r
+ this.options.tokens = new Array(this.options.tokens);\r
+\r
+ this.observer = null;\r
+ \r
+ this.element.setAttribute('autocomplete','off');\r
+\r
+ Element.hide(this.update);\r
+\r
+ Event.observe(this.element, "blur", this.onBlur.bindAsEventListener(this));\r
+ Event.observe(this.element, "keypress", this.onKeyPress.bindAsEventListener(this));\r
+ },\r
+\r
+ show: function() {\r
+ if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update);\r
+ if(!this.iefix && \r
+ (navigator.appVersion.indexOf('MSIE')>0) &&\r
+ (navigator.userAgent.indexOf('Opera')<0) &&\r
+ (Element.getStyle(this.update, 'position')=='absolute')) {\r
+ new Insertion.After(this.update, \r
+ '<iframe id="' + this.update.id + '_iefix" '+\r
+ 'style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" ' +\r
+ 'src="javascript:false;" frameborder="0" scrolling="no"></iframe>');\r
+ this.iefix = $(this.update.id+'_iefix');\r
+ }\r
+ if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this), 50);\r
+ },\r
+ \r
+ fixIEOverlapping: function() {\r
+ Position.clone(this.update, this.iefix, {setTop:(!this.update.style.height)});\r
+ this.iefix.style.zIndex = 1;\r
+ this.update.style.zIndex = 2;\r
+ Element.show(this.iefix);\r
+ },\r
+\r
+ hide: function() {\r
+ this.stopIndicator();\r
+ if(Element.getStyle(this.update, 'display')!='none') this.options.onHide(this.element, this.update);\r
+ if(this.iefix) Element.hide(this.iefix);\r
+ },\r
+\r
+ startIndicator: function() {\r
+ if(this.options.indicator) Element.show(this.options.indicator);\r
+ },\r
+\r
+ stopIndicator: function() {\r
+ if(this.options.indicator) Element.hide(this.options.indicator);\r
+ },\r
+\r
+ onKeyPress: function(event) {\r
+ if(this.active)\r
+ switch(event.keyCode) {\r
+ case Event.KEY_TAB:\r
+ case Event.KEY_RETURN:\r
+ this.selectEntry();\r
+ Event.stop(event);\r
+ case Event.KEY_ESC:\r
+ this.hide();\r
+ this.active = false;\r
+ Event.stop(event);\r
+ return;\r
+ case Event.KEY_LEFT:\r
+ case Event.KEY_RIGHT:\r
+ return;\r
+ case Event.KEY_UP:\r
+ this.markPrevious();\r
+ this.render();\r
+ if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event);\r
+ return;\r
+ case Event.KEY_DOWN:\r
+ this.markNext();\r
+ this.render();\r
+ if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event);\r
+ return;\r
+ }\r
+ else \r
+ if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN || \r
+ (navigator.appVersion.indexOf('AppleWebKit') > 0 && event.keyCode == 0)) return;\r
+\r
+ this.changed = true;\r
+ this.hasFocus = true;\r
+\r
+ if(this.observer) clearTimeout(this.observer);\r
+ this.observer = \r
+ setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000);\r
+ },\r
+\r
+ activate: function() {\r
+ this.changed = false;\r
+ this.hasFocus = true;\r
+ this.getUpdatedChoices();\r
+ },\r
+\r
+ onHover: function(event) {\r
+ var element = Event.findElement(event, 'LI');\r
+ if(this.index != element.autocompleteIndex) \r
+ {\r
+ this.index = element.autocompleteIndex;\r
+ this.render();\r
+ }\r
+ Event.stop(event);\r
+ },\r
+ \r
+ onClick: function(event) {\r
+ var element = Event.findElement(event, 'LI');\r
+ this.index = element.autocompleteIndex;\r
+ this.selectEntry();\r
+ this.hide();\r
+ },\r
+ \r
+ onBlur: function(event) {\r
+ // needed to make click events working\r
+ setTimeout(this.hide.bind(this), 250);\r
+ this.hasFocus = false;\r
+ this.active = false; \r
+ }, \r
+ \r
+ render: function() {\r
+ if(this.entryCount > 0) {\r
+ for (var i = 0; i < this.entryCount; i++)\r
+ this.index==i ? \r
+ Element.addClassName(this.getEntry(i),"selected") : \r
+ Element.removeClassName(this.getEntry(i),"selected");\r
+ \r
+ if(this.hasFocus) { \r
+ this.show();\r
+ this.active = true;\r
+ }\r
+ } else {\r
+ this.active = false;\r
+ this.hide();\r
+ }\r
+ },\r
+ \r
+ markPrevious: function() {\r
+ if(this.index > 0) this.index--\r
+ else this.index = this.entryCount-1;\r
+ this.getEntry(this.index).scrollIntoView(true);\r
+ },\r
+ \r
+ markNext: function() {\r
+ if(this.index < this.entryCount-1) this.index++\r
+ else this.index = 0;\r
+ this.getEntry(this.index).scrollIntoView(false);\r
+ },\r
+ \r
+ getEntry: function(index) {\r
+ return this.update.firstChild.childNodes[index];\r
+ },\r
+ \r
+ getCurrentEntry: function() {\r
+ return this.getEntry(this.index);\r
+ },\r
+ \r
+ selectEntry: function() {\r
+ this.active = false;\r
+ this.updateElement(this.getCurrentEntry());\r
+ },\r
+\r
+ updateElement: function(selectedElement) {\r
+ if (this.options.updateElement) {\r
+ this.options.updateElement(selectedElement);\r
+ return;\r
+ }\r
+ var value = '';\r
+ if (this.options.select) {\r
+ var nodes = document.getElementsByClassName(this.options.select, selectedElement) || [];\r
+ if(nodes.length>0) value = Element.collectTextNodes(nodes[0], this.options.select);\r
+ } else\r
+ value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal');\r
+ \r
+ var lastTokenPos = this.findLastToken();\r
+ if (lastTokenPos != -1) {\r
+ var newValue = this.element.value.substr(0, lastTokenPos + 1);\r
+ var whitespace = this.element.value.substr(lastTokenPos + 1).match(/^\s+/);\r
+ if (whitespace)\r
+ newValue += whitespace[0];\r
+ this.element.value = newValue + value;\r
+ } else {\r
+ this.element.value = value;\r
+ }\r
+ this.element.focus();\r
+ \r
+ if (this.options.afterUpdateElement)\r
+ this.options.afterUpdateElement(this.element, selectedElement);\r
+ },\r
+\r
+ updateChoices: function(choices) {\r
+ if(!this.changed && this.hasFocus) {\r
+ this.update.innerHTML = choices;\r
+ Element.cleanWhitespace(this.update);\r
+ Element.cleanWhitespace(this.update.firstChild);\r
+\r
+ if(this.update.firstChild && this.update.firstChild.childNodes) {\r
+ this.entryCount = \r
+ this.update.firstChild.childNodes.length;\r
+ for (var i = 0; i < this.entryCount; i++) {\r
+ var entry = this.getEntry(i);\r
+ entry.autocompleteIndex = i;\r
+ this.addObservers(entry);\r
+ }\r
+ } else { \r
+ this.entryCount = 0;\r
+ }\r
+\r
+ this.stopIndicator();\r
+ this.index = 0;\r
+ \r
+ if(this.entryCount==1 && this.options.autoSelect) {\r
+ this.selectEntry();\r
+ this.hide();\r
+ } else {\r
+ this.render();\r
+ }\r
+ }\r
+ },\r
+\r
+ addObservers: function(element) {\r
+ Event.observe(element, "mouseover", this.onHover.bindAsEventListener(this));\r
+ Event.observe(element, "click", this.onClick.bindAsEventListener(this));\r
+ },\r
+\r
+ onObserverEvent: function() {\r
+ this.changed = false; \r
+ if(this.getToken().length>=this.options.minChars) {\r
+ this.startIndicator();\r
+ this.getUpdatedChoices();\r
+ } else {\r
+ this.active = false;\r
+ this.hide();\r
+ }\r
+ },\r
+\r
+ getToken: function() {\r
+ var tokenPos = this.findLastToken();\r
+ if (tokenPos != -1)\r
+ var ret = this.element.value.substr(tokenPos + 1).replace(/^\s+/,'').replace(/\s+$/,'');\r
+ else\r
+ var ret = this.element.value;\r
+\r
+ return /\n/.test(ret) ? '' : ret;\r
+ },\r
+\r
+ findLastToken: function() {\r
+ var lastTokenPos = -1;\r
+\r
+ for (var i=0; i<this.options.tokens.length; i++) {\r
+ var thisTokenPos = this.element.value.lastIndexOf(this.options.tokens[i]);\r
+ if (thisTokenPos > lastTokenPos)\r
+ lastTokenPos = thisTokenPos;\r
+ }\r
+ return lastTokenPos;\r
+ }\r
+}\r
+\r
+Ajax.Autocompleter = Class.create();\r
+Object.extend(Object.extend(Ajax.Autocompleter.prototype, Autocompleter.Base.prototype), {\r
+ initialize: function(element, update, url, options) {\r
+ this.baseInitialize(element, update, options);\r
+ this.options.asynchronous = true;\r
+ this.options.onComplete = this.onComplete.bind(this);\r
+ this.options.defaultParams = this.options.parameters || null;\r
+ this.url = url;\r
+ },\r
+\r
+ getUpdatedChoices: function() {\r
+ entry = encodeURIComponent(this.options.paramName) + '=' + \r
+ encodeURIComponent(this.getToken());\r
+\r
+ this.options.parameters = this.options.callback ?\r
+ this.options.callback(this.element, entry) : entry;\r
+\r
+ if(this.options.defaultParams) \r
+ this.options.parameters += '&' + this.options.defaultParams;\r
+\r
+ new Ajax.Request(this.url, this.options);\r
+ },\r
+\r
+ onComplete: function(request) {\r
+ this.updateChoices(request.responseText);\r
+ }\r
+\r
+});\r
+\r
+// The local array autocompleter. Used when you'd prefer to\r
+// inject an array of autocompletion options into the page, rather\r
+// than sending out Ajax queries, which can be quite slow sometimes.\r
+//\r
+// The constructor takes four parameters. The first two are, as usual,\r
+// the id of the monitored textbox, and id of the autocompletion menu.\r
+// The third is the array you want to autocomplete from, and the fourth\r
+// is the options block.\r
+//\r
+// Extra local autocompletion options:\r
+// - choices - How many autocompletion choices to offer\r
+//\r
+// - partialSearch - If false, the autocompleter will match entered\r
+// text only at the beginning of strings in the \r
+// autocomplete array. Defaults to true, which will\r
+// match text at the beginning of any *word* in the\r
+// strings in the autocomplete array. If you want to\r
+// search anywhere in the string, additionally set\r
+// the option fullSearch to true (default: off).\r
+//\r
+// - fullSsearch - Search anywhere in autocomplete array strings.\r
+//\r
+// - partialChars - How many characters to enter before triggering\r
+// a partial match (unlike minChars, which defines\r
+// how many characters are required to do any match\r
+// at all). Defaults to 2.\r
+//\r
+// - ignoreCase - Whether to ignore case when autocompleting.\r
+// Defaults to true.\r
+//\r
+// It's possible to pass in a custom function as the 'selector' \r
+// option, if you prefer to write your own autocompletion logic.\r
+// In that case, the other options above will not apply unless\r
+// you support them.\r
+\r
+Autocompleter.Local = Class.create();\r
+Autocompleter.Local.prototype = Object.extend(new Autocompleter.Base(), {\r
+ initialize: function(element, update, array, options) {\r
+ this.baseInitialize(element, update, options);\r
+ this.options.array = array;\r
+ },\r
+\r
+ getUpdatedChoices: function() {\r
+ this.updateChoices(this.options.selector(this));\r
+ },\r
+\r
+ setOptions: function(options) {\r
+ this.options = Object.extend({\r
+ choices: 10,\r
+ partialSearch: true,\r
+ partialChars: 2,\r
+ ignoreCase: true,\r
+ fullSearch: false,\r
+ selector: function(instance) {\r
+ var ret = []; // Beginning matches\r
+ var partial = []; // Inside matches\r
+ var entry = instance.getToken();\r
+ var count = 0;\r
+\r
+ for (var i = 0; i < instance.options.array.length && \r
+ ret.length < instance.options.choices ; i++) { \r
+\r
+ var elem = instance.options.array[i];\r
+ var foundPos = instance.options.ignoreCase ? \r
+ elem.toLowerCase().indexOf(entry.toLowerCase()) : \r
+ elem.indexOf(entry);\r
+\r
+ while (foundPos != -1) {\r
+ if (foundPos == 0 && elem.length != entry.length) { \r
+ ret.push("<li><strong>" + elem.substr(0, entry.length) + "</strong>" + \r
+ elem.substr(entry.length) + "</li>");\r
+ break;\r
+ } else if (entry.length >= instance.options.partialChars && \r
+ instance.options.partialSearch && foundPos != -1) {\r
+ if (instance.options.fullSearch || /\s/.test(elem.substr(foundPos-1,1))) {\r
+ partial.push("<li>" + elem.substr(0, foundPos) + "<strong>" +\r
+ elem.substr(foundPos, entry.length) + "</strong>" + elem.substr(\r
+ foundPos + entry.length) + "</li>");\r
+ break;\r
+ }\r
+ }\r
+\r
+ foundPos = instance.options.ignoreCase ? \r
+ elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) : \r
+ elem.indexOf(entry, foundPos + 1);\r
+\r
+ }\r
+ }\r
+ if (partial.length)\r
+ ret = ret.concat(partial.slice(0, instance.options.choices - ret.length))\r
+ return "<ul>" + ret.join('') + "</ul>";\r
+ }\r
+ }, options || {});\r
+ }\r
+});\r
+\r
+// AJAX in-place editor\r
+//\r
+// see documentation on http://wiki.script.aculo.us/scriptaculous/show/Ajax.InPlaceEditor\r
+\r
+// Use this if you notice weird scrolling problems on some browsers,\r
+// the DOM might be a bit confused when this gets called so do this\r
+// waits 1 ms (with setTimeout) until it does the activation\r
+Field.scrollFreeActivate = function(field) {\r
+ setTimeout(function() {\r
+ Field.activate(field);\r
+ }, 1);\r
+}\r
+\r
+Ajax.InPlaceEditor = Class.create();\r
+Ajax.InPlaceEditor.defaultHighlightColor = "#FFFF99";\r
+Ajax.InPlaceEditor.prototype = {\r
+ initialize: function(element, url, options) {\r
+ this.url = url;\r
+ this.element = $(element);\r
+\r
+ this.options = Object.extend({\r
+ okButton: true,\r
+ okText: "ok",\r
+ cancelLink: true,\r
+ cancelText: "cancel",\r
+ savingText: "Saving...",\r
+ clickToEditText: "Click to edit",\r
+ okText: "ok",\r
+ rows: 1,\r
+ onComplete: function(transport, element) {\r
+ new Effect.Highlight(element, {startcolor: this.options.highlightcolor});\r
+ },\r
+ onFailure: function(transport) {\r
+ alert("Error communicating with the server: " + transport.responseText.stripTags());\r
+ },\r
+ callback: function(form) {\r
+ return Form.serialize(form);\r
+ },\r
+ handleLineBreaks: true,\r
+ loadingText: 'Loading...',\r
+ savingClassName: 'inplaceeditor-saving',\r
+ loadingClassName: 'inplaceeditor-loading',\r
+ formClassName: 'inplaceeditor-form',\r
+ highlightcolor: Ajax.InPlaceEditor.defaultHighlightColor,\r
+ highlightendcolor: "#FFFFFF",\r
+ externalControl: null,\r
+ submitOnBlur: false,\r
+ ajaxOptions: {},\r
+ evalScripts: false\r
+ }, options || {});\r
+\r
+ if(!this.options.formId && this.element.id) {\r
+ this.options.formId = this.element.id + "-inplaceeditor";\r
+ if ($(this.options.formId)) {\r
+ // there's already a form with that name, don't specify an id\r
+ this.options.formId = null;\r
+ }\r
+ }\r
+ \r
+ if (this.options.externalControl) {\r
+ this.options.externalControl = $(this.options.externalControl);\r
+ }\r
+ \r
+ this.originalBackground = Element.getStyle(this.element, 'background-color');\r
+ if (!this.originalBackground) {\r
+ this.originalBackground = "transparent";\r
+ }\r
+ \r
+ this.element.title = this.options.clickToEditText;\r
+ \r
+ this.onclickListener = this.enterEditMode.bindAsEventListener(this);\r
+ this.mouseoverListener = this.enterHover.bindAsEventListener(this);\r
+ this.mouseoutListener = this.leaveHover.bindAsEventListener(this);\r
+ Event.observe(this.element, 'click', this.onclickListener);\r
+ Event.observe(this.element, 'mouseover', this.mouseoverListener);\r
+ Event.observe(this.element, 'mouseout', this.mouseoutListener);\r
+ if (this.options.externalControl) {\r
+ Event.observe(this.options.externalControl, 'click', this.onclickListener);\r
+ Event.observe(this.options.externalControl, 'mouseover', this.mouseoverListener);\r
+ Event.observe(this.options.externalControl, 'mouseout', this.mouseoutListener);\r
+ }\r
+ },\r
+ enterEditMode: function(evt) {\r
+ if (this.saving) return;\r
+ if (this.editing) return;\r
+ this.editing = true;\r
+ this.onEnterEditMode();\r
+ if (this.options.externalControl) {\r
+ Element.hide(this.options.externalControl);\r
+ }\r
+ Element.hide(this.element);\r
+ this.createForm();\r
+ this.element.parentNode.insertBefore(this.form, this.element);\r
+ if (!this.options.loadTextURL) Field.scrollFreeActivate(this.editField);\r
+ // stop the event to avoid a page refresh in Safari\r
+ if (evt) {\r
+ Event.stop(evt);\r
+ }\r
+ return false;\r
+ },\r
+ createForm: function() {\r
+ this.form = document.createElement("form");\r
+ this.form.id = this.options.formId;\r
+ Element.addClassName(this.form, this.options.formClassName)\r
+ this.form.onsubmit = this.onSubmit.bind(this);\r
+\r
+ this.createEditField();\r
+\r
+ if (this.options.textarea) {\r
+ var br = document.createElement("br");\r
+ this.form.appendChild(br);\r
+ }\r
+\r
+ if (this.options.okButton) {\r
+ okButton = document.createElement("input");\r
+ okButton.type = "submit";\r
+ okButton.value = this.options.okText;\r
+ okButton.className = 'editor_ok_button';\r
+ this.form.appendChild(okButton);\r
+ }\r
+\r
+ if (this.options.cancelLink) {\r
+ cancelLink = document.createElement("a");\r
+ cancelLink.href = "#";\r
+ cancelLink.appendChild(document.createTextNode(this.options.cancelText));\r
+ cancelLink.onclick = this.onclickCancel.bind(this);\r
+ cancelLink.className = 'editor_cancel'; \r
+ this.form.appendChild(cancelLink);\r
+ }\r
+ },\r
+ hasHTMLLineBreaks: function(string) {\r
+ if (!this.options.handleLineBreaks) return false;\r
+ return string.match(/<br/i) || string.match(/<p>/i);\r
+ },\r
+ convertHTMLLineBreaks: function(string) {\r
+ return string.replace(/<br>/gi, "\n").replace(/<br\/>/gi, "\n").replace(/<\/p>/gi, "\n").replace(/<p>/gi, "");\r
+ },\r
+ createEditField: function() {\r
+ var text;\r
+ if(this.options.loadTextURL) {\r
+ text = this.options.loadingText;\r
+ } else {\r
+ text = this.getText();\r
+ }\r
+\r
+ var obj = this;\r
+ \r
+ if (this.options.rows == 1 && !this.hasHTMLLineBreaks(text)) {\r
+ this.options.textarea = false;\r
+ var textField = document.createElement("input");\r
+ textField.obj = this;\r
+ textField.type = "text";\r
+ textField.name = "value";\r
+ textField.value = text;\r
+ textField.style.backgroundColor = this.options.highlightcolor;\r
+ textField.className = 'editor_field';\r
+ var size = this.options.size || this.options.cols || 0;\r
+ if (size != 0) textField.size = size;\r
+ if (this.options.submitOnBlur)\r
+ textField.onblur = this.onSubmit.bind(this);\r
+ this.editField = textField;\r
+ } else {\r
+ this.options.textarea = true;\r
+ var textArea = document.createElement("textarea");\r
+ textArea.obj = this;\r
+ textArea.name = "value";\r
+ textArea.value = this.convertHTMLLineBreaks(text);\r
+ textArea.rows = this.options.rows;\r
+ textArea.cols = this.options.cols || 40;\r
+ textArea.className = 'editor_field'; \r
+ if (this.options.submitOnBlur)\r
+ textArea.onblur = this.onSubmit.bind(this);\r
+ this.editField = textArea;\r
+ }\r
+ \r
+ if(this.options.loadTextURL) {\r
+ this.loadExternalText();\r
+ }\r
+ this.form.appendChild(this.editField);\r
+ },\r
+ getText: function() {\r
+ return this.element.innerHTML;\r
+ },\r
+ loadExternalText: function() {\r
+ Element.addClassName(this.form, this.options.loadingClassName);\r
+ this.editField.disabled = true;\r
+ new Ajax.Request(\r
+ this.options.loadTextURL,\r
+ Object.extend({\r
+ asynchronous: true,\r
+ onComplete: this.onLoadedExternalText.bind(this)\r
+ }, this.options.ajaxOptions)\r
+ );\r
+ },\r
+ onLoadedExternalText: function(transport) {\r
+ Element.removeClassName(this.form, this.options.loadingClassName);\r
+ this.editField.disabled = false;\r
+ this.editField.value = transport.responseText.stripTags();\r
+ Field.scrollFreeActivate(this.editField);\r
+ },\r
+ onclickCancel: function() {\r
+ this.onComplete();\r
+ this.leaveEditMode();\r
+ return false;\r
+ },\r
+ onFailure: function(transport) {\r
+ this.options.onFailure(transport);\r
+ if (this.oldInnerHTML) {\r
+ this.element.innerHTML = this.oldInnerHTML;\r
+ this.oldInnerHTML = null;\r
+ }\r
+ return false;\r
+ },\r
+ onSubmit: function() {\r
+ // onLoading resets these so we need to save them away for the Ajax call\r
+ var form = this.form;\r
+ var value = this.editField.value;\r
+ \r
+ // do this first, sometimes the ajax call returns before we get a chance to switch on Saving...\r
+ // which means this will actually switch on Saving... *after* we've left edit mode causing Saving...\r
+ // to be displayed indefinitely\r
+ this.onLoading();\r
+ \r
+ if (this.options.evalScripts) {\r
+ new Ajax.Request(\r
+ this.url, Object.extend({\r
+ parameters: this.options.callback(form, value),\r
+ onComplete: this.onComplete.bind(this),\r
+ onFailure: this.onFailure.bind(this),\r
+ asynchronous:true, \r
+ evalScripts:true\r
+ }, this.options.ajaxOptions));\r
+ } else {\r
+ new Ajax.Updater(\r
+ { success: this.element,\r
+ // don't update on failure (this could be an option)\r
+ failure: null }, \r
+ this.url, Object.extend({\r
+ parameters: this.options.callback(form, value),\r
+ onComplete: this.onComplete.bind(this),\r
+ onFailure: this.onFailure.bind(this)\r
+ }, this.options.ajaxOptions));\r
+ }\r
+ // stop the event to avoid a page refresh in Safari\r
+ if (arguments.length > 1) {\r
+ Event.stop(arguments[0]);\r
+ }\r
+ return false;\r
+ },\r
+ onLoading: function() {\r
+ this.saving = true;\r
+ this.removeForm();\r
+ this.leaveHover();\r
+ this.showSaving();\r
+ },\r
+ showSaving: function() {\r
+ this.oldInnerHTML = this.element.innerHTML;\r
+ this.element.innerHTML = this.options.savingText;\r
+ Element.addClassName(this.element, this.options.savingClassName);\r
+ this.element.style.backgroundColor = this.originalBackground;\r
+ Element.show(this.element);\r
+ },\r
+ removeForm: function() {\r
+ if(this.form) {\r
+ if (this.form.parentNode) Element.remove(this.form);\r
+ this.form = null;\r
+ }\r
+ },\r
+ enterHover: function() {\r
+ if (this.saving) return;\r
+ this.element.style.backgroundColor = this.options.highlightcolor;\r
+ if (this.effect) {\r
+ this.effect.cancel();\r
+ }\r
+ Element.addClassName(this.element, this.options.hoverClassName)\r
+ },\r
+ leaveHover: function() {\r
+ if (this.options.backgroundColor) {\r
+ this.element.style.backgroundColor = this.oldBackground;\r
+ }\r
+ Element.removeClassName(this.element, this.options.hoverClassName)\r
+ if (this.saving) return;\r
+ this.effect = new Effect.Highlight(this.element, {\r
+ startcolor: this.options.highlightcolor,\r
+ endcolor: this.options.highlightendcolor,\r
+ restorecolor: this.originalBackground\r
+ });\r
+ },\r
+ leaveEditMode: function() {\r
+ Element.removeClassName(this.element, this.options.savingClassName);\r
+ this.removeForm();\r
+ this.leaveHover();\r
+ this.element.style.backgroundColor = this.originalBackground;\r
+ Element.show(this.element);\r
+ if (this.options.externalControl) {\r
+ Element.show(this.options.externalControl);\r
+ }\r
+ this.editing = false;\r
+ this.saving = false;\r
+ this.oldInnerHTML = null;\r
+ this.onLeaveEditMode();\r
+ },\r
+ onComplete: function(transport) {\r
+ this.leaveEditMode();\r
+ this.options.onComplete.bind(this)(transport, this.element);\r
+ },\r
+ onEnterEditMode: function() {},\r
+ onLeaveEditMode: function() {},\r
+ dispose: function() {\r
+ if (this.oldInnerHTML) {\r
+ this.element.innerHTML = this.oldInnerHTML;\r
+ }\r
+ this.leaveEditMode();\r
+ Event.stopObserving(this.element, 'click', this.onclickListener);\r
+ Event.stopObserving(this.element, 'mouseover', this.mouseoverListener);\r
+ Event.stopObserving(this.element, 'mouseout', this.mouseoutListener);\r
+ if (this.options.externalControl) {\r
+ Event.stopObserving(this.options.externalControl, 'click', this.onclickListener);\r
+ Event.stopObserving(this.options.externalControl, 'mouseover', this.mouseoverListener);\r
+ Event.stopObserving(this.options.externalControl, 'mouseout', this.mouseoutListener);\r
+ }\r
+ }\r
+};\r
+\r
+Ajax.InPlaceCollectionEditor = Class.create();\r
+Object.extend(Ajax.InPlaceCollectionEditor.prototype, Ajax.InPlaceEditor.prototype);\r
+Object.extend(Ajax.InPlaceCollectionEditor.prototype, {\r
+ createEditField: function() {\r
+ if (!this.cached_selectTag) {\r
+ var selectTag = document.createElement("select");\r
+ var collection = this.options.collection || [];\r
+ var optionTag;\r
+ collection.each(function(e,i) {\r
+ optionTag = document.createElement("option");\r
+ optionTag.value = (e instanceof Array) ? e[0] : e;\r
+ if((typeof this.options.value == 'undefined') && \r
+ ((e instanceof Array) ? this.element.innerHTML == e[1] : e == optionTag.value)) optionTag.selected = true;\r
+ if(this.options.value==optionTag.value) optionTag.selected = true;\r
+ optionTag.appendChild(document.createTextNode((e instanceof Array) ? e[1] : e));\r
+ selectTag.appendChild(optionTag);\r
+ }.bind(this));\r
+ this.cached_selectTag = selectTag;\r
+ }\r
+\r
+ this.editField = this.cached_selectTag;\r
+ if(this.options.loadTextURL) this.loadExternalText();\r
+ this.form.appendChild(this.editField);\r
+ this.options.callback = function(form, value) {\r
+ return "value=" + encodeURIComponent(value);\r
+ }\r
+ }\r
+});\r
+\r
+// Delayed observer, like Form.Element.Observer, \r
+// but waits for delay after last key input\r
+// Ideal for live-search fields\r
+\r
+Form.Element.DelayedObserver = Class.create();\r
+Form.Element.DelayedObserver.prototype = {\r
+ initialize: function(element, delay, callback) {\r
+ this.delay = delay || 0.5;\r
+ this.element = $(element);\r
+ this.callback = callback;\r
+ this.timer = null;\r
+ this.lastValue = $F(this.element); \r
+ Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this));\r
+ },\r
+ delayedListener: function(event) {\r
+ if(this.lastValue == $F(this.element)) return;\r
+ if(this.timer) clearTimeout(this.timer);\r
+ this.timer = setTimeout(this.onTimerEvent.bind(this), this.delay * 1000);\r
+ this.lastValue = $F(this.element);\r
+ },\r
+ onTimerEvent: function() {\r
+ this.timer = null;\r
+ this.callback(this.element, $F(this.element));\r
+ }\r
+};\r
-// script.aculo.us dragdrop.js v1.6.4, Wed Sep 06 11:30:58 CEST 2006
-
-// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-// (c) 2005 Sammi Williams (http://www.oriontransfer.co.nz, sammi@oriontransfer.co.nz)
-//
-// See scriptaculous.js for full license.
-
-/*--------------------------------------------------------------------------*/
-
-if(typeof Effect == 'undefined')
- throw("dragdrop.js requires including script.aculo.us' effects.js library");
-
-var Droppables = {
- drops: [],
-
- remove: function(element) {
- this.drops = this.drops.reject(function(d) { return d.element==$(element) });
- },
-
- add: function(element) {
- element = $(element);
- var options = Object.extend({
- greedy: true,
- hoverclass: null,
- tree: false
- }, arguments[1] || {});
-
- // cache containers
- if(options.containment) {
- options._containers = [];
- var containment = options.containment;
- if((typeof containment == 'object') &&
- (containment.constructor == Array)) {
- containment.each( function(c) { options._containers.push($(c)) });
- } else {
- options._containers.push($(containment));
- }
- }
-
- if(options.accept) options.accept = [options.accept].flatten();
-
- Element.makePositioned(element); // fix IE
- options.element = element;
-
- this.drops.push(options);
- },
-
- findDeepestChild: function(drops) {
- deepest = drops[0];
-
- for (i = 1; i < drops.length; ++i)
- if (Element.isParent(drops[i].element, deepest.element))
- deepest = drops[i];
-
- return deepest;
- },
-
- isContained: function(element, drop) {
- var containmentNode;
- if(drop.tree) {
- containmentNode = element.treeNode;
- } else {
- containmentNode = element.parentNode;
- }
- return drop._containers.detect(function(c) { return containmentNode == c });
- },
-
- isAffected: function(point, element, drop) {
- return (
- (drop.element!=element) &&
- ((!drop._containers) ||
- this.isContained(element, drop)) &&
- ((!drop.accept) ||
- (Element.classNames(element).detect(
- function(v) { return drop.accept.include(v) } ) )) &&
- Position.within(drop.element, point[0], point[1]) );
- },
-
- deactivate: function(drop) {
- if(drop.hoverclass)
- Element.removeClassName(drop.element, drop.hoverclass);
- this.last_active = null;
- },
-
- activate: function(drop) {
- if(drop.hoverclass)
- Element.addClassName(drop.element, drop.hoverclass);
- this.last_active = drop;
- },
-
- show: function(point, element) {
- if(!this.drops.length) return;
- var affected = [];
-
- if(this.last_active) this.deactivate(this.last_active);
- this.drops.each( function(drop) {
- if(Droppables.isAffected(point, element, drop))
- affected.push(drop);
- });
-
- if(affected.length>0) {
- drop = Droppables.findDeepestChild(affected);
- Position.within(drop.element, point[0], point[1]);
- if(drop.onHover)
- drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element));
-
- Droppables.activate(drop);
- }
- },
-
- fire: function(event, element) {
- if(!this.last_active) return;
- Position.prepare();
-
- if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active))
- if (this.last_active.onDrop)
- this.last_active.onDrop(element, this.last_active.element, event);
- },
-
- reset: function() {
- if(this.last_active)
- this.deactivate(this.last_active);
- }
-}
-
-var Draggables = {
- drags: [],
- observers: [],
-
- register: function(draggable) {
- if(this.drags.length == 0) {
- this.eventMouseUp = this.endDrag.bindAsEventListener(this);
- this.eventMouseMove = this.updateDrag.bindAsEventListener(this);
- this.eventKeypress = this.keyPress.bindAsEventListener(this);
-
- Event.observe(document, "mouseup", this.eventMouseUp);
- Event.observe(document, "mousemove", this.eventMouseMove);
- Event.observe(document, "keypress", this.eventKeypress);
- }
- this.drags.push(draggable);
- },
-
- unregister: function(draggable) {
- this.drags = this.drags.reject(function(d) { return d==draggable });
- if(this.drags.length == 0) {
- Event.stopObserving(document, "mouseup", this.eventMouseUp);
- Event.stopObserving(document, "mousemove", this.eventMouseMove);
- Event.stopObserving(document, "keypress", this.eventKeypress);
- }
- },
-
- activate: function(draggable) {
- if(draggable.options.delay) {
- this._timeout = setTimeout(function() {
- Draggables._timeout = null;
- window.focus();
- Draggables.activeDraggable = draggable;
- }.bind(this), draggable.options.delay);
- } else {
- window.focus(); // allows keypress events if window isn't currently focused, fails for Safari
- this.activeDraggable = draggable;
- }
- },
-
- deactivate: function() {
- this.activeDraggable = null;
- },
-
- updateDrag: function(event) {
- if(!this.activeDraggable) return;
- var pointer = [Event.pointerX(event), Event.pointerY(event)];
- // Mozilla-based browsers fire successive mousemove events with
- // the same coordinates, prevent needless redrawing (moz bug?)
- if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return;
- this._lastPointer = pointer;
-
- this.activeDraggable.updateDrag(event, pointer);
- },
-
- endDrag: function(event) {
- if(this._timeout) {
- clearTimeout(this._timeout);
- this._timeout = null;
- }
- if(!this.activeDraggable) return;
- this._lastPointer = null;
- this.activeDraggable.endDrag(event);
- this.activeDraggable = null;
- },
-
- keyPress: function(event) {
- if(this.activeDraggable)
- this.activeDraggable.keyPress(event);
- },
-
- addObserver: function(observer) {
- this.observers.push(observer);
- this._cacheObserverCallbacks();
- },
-
- removeObserver: function(element) { // element instead of observer fixes mem leaks
- this.observers = this.observers.reject( function(o) { return o.element==element });
- this._cacheObserverCallbacks();
- },
-
- notify: function(eventName, draggable, event) { // 'onStart', 'onEnd', 'onDrag'
- if(this[eventName+'Count'] > 0)
- this.observers.each( function(o) {
- if(o[eventName]) o[eventName](eventName, draggable, event);
- });
- if(draggable.options[eventName]) draggable.options[eventName](draggable, event);
- },
-
- _cacheObserverCallbacks: function() {
- ['onStart','onEnd','onDrag'].each( function(eventName) {
- Draggables[eventName+'Count'] = Draggables.observers.select(
- function(o) { return o[eventName]; }
- ).length;
- });
- }
-}
-
-/*--------------------------------------------------------------------------*/
-
-var Draggable = Class.create();
-Draggable._dragging = {};
-
-Draggable.prototype = {
- initialize: function(element) {
- var defaults = {
- handle: false,
- reverteffect: function(element, top_offset, left_offset) {
- var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02;
- new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur,
- queue: {scope:'_draggable', position:'end'}
- });
- },
- endeffect: function(element) {
- var toOpacity = typeof element._opacity == 'number' ? element._opacity : 1.0;
- new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity,
- queue: {scope:'_draggable', position:'end'},
- afterFinish: function(){
- Draggable._dragging[element] = false
- }
- });
- },
- zindex: 1000,
- revert: false,
- scroll: false,
- scrollSensitivity: 20,
- scrollSpeed: 15,
- snap: false, // false, or xy or [x,y] or function(x,y){ return [x,y] }
- delay: 0
- };
-
- if(arguments[1] && typeof arguments[1].endeffect == 'undefined')
- Object.extend(defaults, {
- starteffect: function(element) {
- element._opacity = Element.getOpacity(element);
- Draggable._dragging[element] = true;
- new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7});
- }
- });
-
- var options = Object.extend(defaults, arguments[1] || {});
-
- this.element = $(element);
-
- if(options.handle && (typeof options.handle == 'string')) {
- var h = Element.childrenWithClassName(this.element, options.handle, true);
- if(h.length>0) this.handle = h[0];
- }
- if(!this.handle) this.handle = $(options.handle);
- if(!this.handle) this.handle = this.element;
-
- if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) {
- options.scroll = $(options.scroll);
- this._isScrollChild = Element.childOf(this.element, options.scroll);
- }
-
- Element.makePositioned(this.element); // fix IE
-
- this.delta = this.currentDelta();
- this.options = options;
- this.dragging = false;
-
- this.eventMouseDown = this.initDrag.bindAsEventListener(this);
- Event.observe(this.handle, "mousedown", this.eventMouseDown);
-
- Draggables.register(this);
- },
-
- destroy: function() {
- Event.stopObserving(this.handle, "mousedown", this.eventMouseDown);
- Draggables.unregister(this);
- },
-
- currentDelta: function() {
- return([
- parseInt(Element.getStyle(this.element,'left') || '0'),
- parseInt(Element.getStyle(this.element,'top') || '0')]);
- },
-
- initDrag: function(event) {
- if(typeof Draggable._dragging[this.element] != 'undefined' &&
- Draggable._dragging[this.element]) return;
- if(Event.isLeftClick(event)) {
- // abort on form elements, fixes a Firefox issue
- var src = Event.element(event);
- if(src.tagName && (
- src.tagName=='INPUT' ||
- src.tagName=='SELECT' ||
- src.tagName=='OPTION' ||
- src.tagName=='BUTTON' ||
- src.tagName=='TEXTAREA')) return;
-
- var pointer = [Event.pointerX(event), Event.pointerY(event)];
- var pos = Position.cumulativeOffset(this.element);
- this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) });
-
- Draggables.activate(this);
- Event.stop(event);
- }
- },
-
- startDrag: function(event) {
- this.dragging = true;
-
- if(this.options.zindex) {
- this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0);
- this.element.style.zIndex = this.options.zindex;
- }
-
- if(this.options.ghosting) {
- this._clone = this.element.cloneNode(true);
- Position.absolutize(this.element);
- this.element.parentNode.insertBefore(this._clone, this.element);
- }
-
- if(this.options.scroll) {
- if (this.options.scroll == window) {
- var where = this._getWindowScroll(this.options.scroll);
- this.originalScrollLeft = where.left;
- this.originalScrollTop = where.top;
- } else {
- this.originalScrollLeft = this.options.scroll.scrollLeft;
- this.originalScrollTop = this.options.scroll.scrollTop;
- }
- }
-
- Draggables.notify('onStart', this, event);
-
- if(this.options.starteffect) this.options.starteffect(this.element);
- },
-
- updateDrag: function(event, pointer) {
- if(!this.dragging) this.startDrag(event);
- Position.prepare();
- Droppables.show(pointer, this.element);
- Draggables.notify('onDrag', this, event);
-
- this.draw(pointer);
- if(this.options.change) this.options.change(this);
-
- if(this.options.scroll) {
- this.stopScrolling();
-
- var p;
- if (this.options.scroll == window) {
- with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; }
- } else {
- p = Position.page(this.options.scroll);
- p[0] += this.options.scroll.scrollLeft;
- p[1] += this.options.scroll.scrollTop;
-
- p[0] += (window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0);
- p[1] += (window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0);
-
- p.push(p[0]+this.options.scroll.offsetWidth);
- p.push(p[1]+this.options.scroll.offsetHeight);
- }
- var speed = [0,0];
- if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity);
- if(pointer[1] < (p[1]+this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[1]+this.options.scrollSensitivity);
- if(pointer[0] > (p[2]-this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[2]-this.options.scrollSensitivity);
- if(pointer[1] > (p[3]-this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[3]-this.options.scrollSensitivity);
- this.startScrolling(speed);
- }
-
- // fix AppleWebKit rendering
- if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
-
- Event.stop(event);
- },
-
- finishDrag: function(event, success) {
- this.dragging = false;
-
- if(this.options.ghosting) {
- Position.relativize(this.element);
- Element.remove(this._clone);
- this._clone = null;
- }
-
- if(success) Droppables.fire(event, this.element);
- Draggables.notify('onEnd', this, event);
-
- var revert = this.options.revert;
- if(revert && typeof revert == 'function') revert = revert(this.element);
-
- var d = this.currentDelta();
- if(revert && this.options.reverteffect) {
- this.options.reverteffect(this.element,
- d[1]-this.delta[1], d[0]-this.delta[0]);
- } else {
- this.delta = d;
- }
-
- if(this.options.zindex)
- this.element.style.zIndex = this.originalZ;
-
- if(this.options.endeffect)
- this.options.endeffect(this.element);
-
- Draggables.deactivate(this);
- Droppables.reset();
- },
-
- keyPress: function(event) {
- if(event.keyCode!=Event.KEY_ESC) return;
- this.finishDrag(event, false);
- Event.stop(event);
- },
-
- endDrag: function(event) {
- if(!this.dragging) return;
- this.stopScrolling();
- this.finishDrag(event, true);
- Event.stop(event);
- },
-
- draw: function(point) {
- var pos = Position.cumulativeOffset(this.element);
- if(this.options.ghosting) {
- var r = Position.realOffset(this.element);
- window.status = r.inspect();
- pos[0] += r[0] - Position.deltaX; pos[1] += r[1] - Position.deltaY;
- }
-
- var d = this.currentDelta();
- pos[0] -= d[0]; pos[1] -= d[1];
-
- if(this.options.scroll && (this.options.scroll != window && this._isScrollChild)) {
- pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft;
- pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop;
- }
-
- var p = [0,1].map(function(i){
- return (point[i]-pos[i]-this.offset[i])
- }.bind(this));
-
- if(this.options.snap) {
- if(typeof this.options.snap == 'function') {
- p = this.options.snap(p[0],p[1],this);
- } else {
- if(this.options.snap instanceof Array) {
- p = p.map( function(v, i) {
- return Math.round(v/this.options.snap[i])*this.options.snap[i] }.bind(this))
- } else {
- p = p.map( function(v) {
- return Math.round(v/this.options.snap)*this.options.snap }.bind(this))
- }
- }}
-
- var style = this.element.style;
- if((!this.options.constraint) || (this.options.constraint=='horizontal'))
- style.left = p[0] + "px";
- if((!this.options.constraint) || (this.options.constraint=='vertical'))
- style.top = p[1] + "px";
-
- if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering
- },
-
- stopScrolling: function() {
- if(this.scrollInterval) {
- clearInterval(this.scrollInterval);
- this.scrollInterval = null;
- Draggables._lastScrollPointer = null;
- }
- },
-
- startScrolling: function(speed) {
- if(!(speed[0] || speed[1])) return;
- this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed];
- this.lastScrolled = new Date();
- this.scrollInterval = setInterval(this.scroll.bind(this), 10);
- },
-
- scroll: function() {
- var current = new Date();
- var delta = current - this.lastScrolled;
- this.lastScrolled = current;
- if(this.options.scroll == window) {
- with (this._getWindowScroll(this.options.scroll)) {
- if (this.scrollSpeed[0] || this.scrollSpeed[1]) {
- var d = delta / 1000;
- this.options.scroll.scrollTo( left + d*this.scrollSpeed[0], top + d*this.scrollSpeed[1] );
- }
- }
- } else {
- this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000;
- this.options.scroll.scrollTop += this.scrollSpeed[1] * delta / 1000;
- }
-
- Position.prepare();
- Droppables.show(Draggables._lastPointer, this.element);
- Draggables.notify('onDrag', this);
- if (this._isScrollChild) {
- Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer);
- Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000;
- Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000;
- if (Draggables._lastScrollPointer[0] < 0)
- Draggables._lastScrollPointer[0] = 0;
- if (Draggables._lastScrollPointer[1] < 0)
- Draggables._lastScrollPointer[1] = 0;
- this.draw(Draggables._lastScrollPointer);
- }
-
- if(this.options.change) this.options.change(this);
- },
-
- _getWindowScroll: function(w) {
- var T, L, W, H;
- with (w.document) {
- if (w.document.documentElement && documentElement.scrollTop) {
- T = documentElement.scrollTop;
- L = documentElement.scrollLeft;
- } else if (w.document.body) {
- T = body.scrollTop;
- L = body.scrollLeft;
- }
- if (w.innerWidth) {
- W = w.innerWidth;
- H = w.innerHeight;
- } else if (w.document.documentElement && documentElement.clientWidth) {
- W = documentElement.clientWidth;
- H = documentElement.clientHeight;
- } else {
- W = body.offsetWidth;
- H = body.offsetHeight
- }
- }
- return { top: T, left: L, width: W, height: H };
- }
-}
-
-/*--------------------------------------------------------------------------*/
-
-var SortableObserver = Class.create();
-SortableObserver.prototype = {
- initialize: function(element, observer) {
- this.element = $(element);
- this.observer = observer;
- this.lastValue = Sortable.serialize(this.element);
- },
-
- onStart: function() {
- this.lastValue = Sortable.serialize(this.element);
- },
-
- onEnd: function() {
- Sortable.unmark();
- if(this.lastValue != Sortable.serialize(this.element))
- this.observer(this.element)
- }
-}
-
-var Sortable = {
- SERIALIZE_RULE: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/,
-
- sortables: {},
-
- _findRootElement: function(element) {
- while (element.tagName != "BODY") {
- if(element.id && Sortable.sortables[element.id]) return element;
- element = element.parentNode;
- }
- },
-
- options: function(element) {
- element = Sortable._findRootElement($(element));
- if(!element) return;
- return Sortable.sortables[element.id];
- },
-
- destroy: function(element){
- var s = Sortable.options(element);
-
- if(s) {
- Draggables.removeObserver(s.element);
- s.droppables.each(function(d){ Droppables.remove(d) });
- s.draggables.invoke('destroy');
-
- delete Sortable.sortables[s.element.id];
- }
- },
-
- create: function(element) {
- element = $(element);
- var options = Object.extend({
- element: element,
- tag: 'li', // assumes li children, override with tag: 'tagname'
- dropOnEmpty: false,
- tree: false,
- treeTag: 'ul',
- overlap: 'vertical', // one of 'vertical', 'horizontal'
- constraint: 'vertical', // one of 'vertical', 'horizontal', false
- containment: element, // also takes array of elements (or id's); or false
- handle: false, // or a CSS class
- only: false,
- delay: 0,
- hoverclass: null,
- ghosting: false,
- scroll: false,
- scrollSensitivity: 20,
- scrollSpeed: 15,
- format: this.SERIALIZE_RULE,
- onChange: Prototype.emptyFunction,
- onUpdate: Prototype.emptyFunction
- }, arguments[1] || {});
-
- // clear any old sortable with same element
- this.destroy(element);
-
- // build options for the draggables
- var options_for_draggable = {
- revert: true,
- scroll: options.scroll,
- scrollSpeed: options.scrollSpeed,
- scrollSensitivity: options.scrollSensitivity,
- delay: options.delay,
- ghosting: options.ghosting,
- constraint: options.constraint,
- handle: options.handle };
-
- if(options.starteffect)
- options_for_draggable.starteffect = options.starteffect;
-
- if(options.reverteffect)
- options_for_draggable.reverteffect = options.reverteffect;
- else
- if(options.ghosting) options_for_draggable.reverteffect = function(element) {
- element.style.top = 0;
- element.style.left = 0;
- };
-
- if(options.endeffect)
- options_for_draggable.endeffect = options.endeffect;
-
- if(options.zindex)
- options_for_draggable.zindex = options.zindex;
-
- // build options for the droppables
- var options_for_droppable = {
- overlap: options.overlap,
- containment: options.containment,
- tree: options.tree,
- hoverclass: options.hoverclass,
- onHover: Sortable.onHover
- //greedy: !options.dropOnEmpty
- }
-
- var options_for_tree = {
- onHover: Sortable.onEmptyHover,
- overlap: options.overlap,
- containment: options.containment,
- hoverclass: options.hoverclass
- }
-
- // fix for gecko engine
- Element.cleanWhitespace(element);
-
- options.draggables = [];
- options.droppables = [];
-
- // drop on empty handling
- if(options.dropOnEmpty || options.tree) {
- Droppables.add(element, options_for_tree);
- options.droppables.push(element);
- }
-
- (this.findElements(element, options) || []).each( function(e) {
- // handles are per-draggable
- var handle = options.handle ?
- Element.childrenWithClassName(e, options.handle)[0] : e;
- options.draggables.push(
- new Draggable(e, Object.extend(options_for_draggable, { handle: handle })));
- Droppables.add(e, options_for_droppable);
- if(options.tree) e.treeNode = element;
- options.droppables.push(e);
- });
-
- if(options.tree) {
- (Sortable.findTreeElements(element, options) || []).each( function(e) {
- Droppables.add(e, options_for_tree);
- e.treeNode = element;
- options.droppables.push(e);
- });
- }
-
- // keep reference
- this.sortables[element.id] = options;
-
- // for onupdate
- Draggables.addObserver(new SortableObserver(element, options.onUpdate));
-
- },
-
- // return all suitable-for-sortable elements in a guaranteed order
- findElements: function(element, options) {
- return Element.findChildren(
- element, options.only, options.tree ? true : false, options.tag);
- },
-
- findTreeElements: function(element, options) {
- return Element.findChildren(
- element, options.only, options.tree ? true : false, options.treeTag);
- },
-
- onHover: function(element, dropon, overlap) {
- if(Element.isParent(dropon, element)) return;
-
- if(overlap > .33 && overlap < .66 && Sortable.options(dropon).tree) {
- return;
- } else if(overlap>0.5) {
- Sortable.mark(dropon, 'before');
- if(dropon.previousSibling != element) {
- var oldParentNode = element.parentNode;
- element.style.visibility = "hidden"; // fix gecko rendering
- dropon.parentNode.insertBefore(element, dropon);
- if(dropon.parentNode!=oldParentNode)
- Sortable.options(oldParentNode).onChange(element);
- Sortable.options(dropon.parentNode).onChange(element);
- }
- } else {
- Sortable.mark(dropon, 'after');
- var nextElement = dropon.nextSibling || null;
- if(nextElement != element) {
- var oldParentNode = element.parentNode;
- element.style.visibility = "hidden"; // fix gecko rendering
- dropon.parentNode.insertBefore(element, nextElement);
- if(dropon.parentNode!=oldParentNode)
- Sortable.options(oldParentNode).onChange(element);
- Sortable.options(dropon.parentNode).onChange(element);
- }
- }
- },
-
- onEmptyHover: function(element, dropon, overlap) {
- var oldParentNode = element.parentNode;
- var droponOptions = Sortable.options(dropon);
-
- if(!Element.isParent(dropon, element)) {
- var index;
-
- var children = Sortable.findElements(dropon, {tag: droponOptions.tag, only: droponOptions.only});
- var child = null;
-
- if(children) {
- var offset = Element.offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap);
-
- for (index = 0; index < children.length; index += 1) {
- if (offset - Element.offsetSize (children[index], droponOptions.overlap) >= 0) {
- offset -= Element.offsetSize (children[index], droponOptions.overlap);
- } else if (offset - (Element.offsetSize (children[index], droponOptions.overlap) / 2) >= 0) {
- child = index + 1 < children.length ? children[index + 1] : null;
- break;
- } else {
- child = children[index];
- break;
- }
- }
- }
-
- dropon.insertBefore(element, child);
-
- Sortable.options(oldParentNode).onChange(element);
- droponOptions.onChange(element);
- }
- },
-
- unmark: function() {
- if(Sortable._marker) Element.hide(Sortable._marker);
- },
-
- mark: function(dropon, position) {
- // mark on ghosting only
- var sortable = Sortable.options(dropon.parentNode);
- if(sortable && !sortable.ghosting) return;
-
- if(!Sortable._marker) {
- Sortable._marker = $('dropmarker') || document.createElement('DIV');
- Element.hide(Sortable._marker);
- Element.addClassName(Sortable._marker, 'dropmarker');
- Sortable._marker.style.position = 'absolute';
- document.getElementsByTagName("body").item(0).appendChild(Sortable._marker);
- }
- var offsets = Position.cumulativeOffset(dropon);
- Sortable._marker.style.left = offsets[0] + 'px';
- Sortable._marker.style.top = offsets[1] + 'px';
-
- if(position=='after')
- if(sortable.overlap == 'horizontal')
- Sortable._marker.style.left = (offsets[0]+dropon.clientWidth) + 'px';
- else
- Sortable._marker.style.top = (offsets[1]+dropon.clientHeight) + 'px';
-
- Element.show(Sortable._marker);
- },
-
- _tree: function(element, options, parent) {
- var children = Sortable.findElements(element, options) || [];
-
- for (var i = 0; i < children.length; ++i) {
- var match = children[i].id.match(options.format);
-
- if (!match) continue;
-
- var child = {
- id: encodeURIComponent(match ? match[1] : null),
- element: element,
- parent: parent,
- children: new Array,
- position: parent.children.length,
- container: Sortable._findChildrenElement(children[i], options.treeTag.toUpperCase())
- }
-
- /* Get the element containing the children and recurse over it */
- if (child.container)
- this._tree(child.container, options, child)
-
- parent.children.push (child);
- }
-
- return parent;
- },
-
- /* Finds the first element of the given tag type within a parent element.
- Used for finding the first LI[ST] within a L[IST]I[TEM].*/
- _findChildrenElement: function (element, containerTag) {
- if (element && element.hasChildNodes)
- for (var i = 0; i < element.childNodes.length; ++i)
- if (element.childNodes[i].tagName == containerTag)
- return element.childNodes[i];
-
- return null;
- },
-
- tree: function(element) {
- element = $(element);
- var sortableOptions = this.options(element);
- var options = Object.extend({
- tag: sortableOptions.tag,
- treeTag: sortableOptions.treeTag,
- only: sortableOptions.only,
- name: element.id,
- format: sortableOptions.format
- }, arguments[1] || {});
-
- var root = {
- id: null,
- parent: null,
- children: new Array,
- container: element,
- position: 0
- }
-
- return Sortable._tree (element, options, root);
- },
-
- /* Construct a [i] index for a particular node */
- _constructIndex: function(node) {
- var index = '';
- do {
- if (node.id) index = '[' + node.position + ']' + index;
- } while ((node = node.parent) != null);
- return index;
- },
-
- sequence: function(element) {
- element = $(element);
- var options = Object.extend(this.options(element), arguments[1] || {});
-
- return $(this.findElements(element, options) || []).map( function(item) {
- return item.id.match(options.format) ? item.id.match(options.format)[1] : '';
- });
- },
-
- setSequence: function(element, new_sequence) {
- element = $(element);
- var options = Object.extend(this.options(element), arguments[2] || {});
-
- var nodeMap = {};
- this.findElements(element, options).each( function(n) {
- if (n.id.match(options.format))
- nodeMap[n.id.match(options.format)[1]] = [n, n.parentNode];
- n.parentNode.removeChild(n);
- });
-
- new_sequence.each(function(ident) {
- var n = nodeMap[ident];
- if (n) {
- n[1].appendChild(n[0]);
- delete nodeMap[ident];
- }
- });
- },
-
- serialize: function(element) {
- element = $(element);
- var options = Object.extend(Sortable.options(element), arguments[1] || {});
- var name = encodeURIComponent(
- (arguments[1] && arguments[1].name) ? arguments[1].name : element.id);
-
- if (options.tree) {
- return Sortable.tree(element, arguments[1]).children.map( function (item) {
- return [name + Sortable._constructIndex(item) + "[id]=" +
- encodeURIComponent(item.id)].concat(item.children.map(arguments.callee));
- }).flatten().join('&');
- } else {
- return Sortable.sequence(element, arguments[1]).map( function(item) {
- return name + "[]=" + encodeURIComponent(item);
- }).join('&');
- }
- }
-}
-
-/* Returns true if child is contained within element */
-Element.isParent = function(child, element) {
- if (!child.parentNode || child == element) return false;
-
- if (child.parentNode == element) return true;
-
- return Element.isParent(child.parentNode, element);
-}
-
-Element.findChildren = function(element, only, recursive, tagName) {
- if(!element.hasChildNodes()) return null;
- tagName = tagName.toUpperCase();
- if(only) only = [only].flatten();
- var elements = [];
- $A(element.childNodes).each( function(e) {
- if(e.tagName && e.tagName.toUpperCase()==tagName &&
- (!only || (Element.classNames(e).detect(function(v) { return only.include(v) }))))
- elements.push(e);
- if(recursive) {
- var grandchildren = Element.findChildren(e, only, recursive, tagName);
- if(grandchildren) elements.push(grandchildren);
- }
- });
-
- return (elements.length>0 ? elements.flatten() : []);
-}
-
-Element.offsetSize = function (element, type) {
- if (type == 'vertical' || type == 'height')
- return element.offsetHeight;
- else
- return element.offsetWidth;
+// script.aculo.us dragdrop.js v1.6.4, Wed Sep 06 11:30:58 CEST 2006\r
+\r
+// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)\r
+// (c) 2005 Sammi Williams (http://www.oriontransfer.co.nz, sammi@oriontransfer.co.nz)\r
+// \r
+// See scriptaculous.js for full license.\r
+\r
+/*--------------------------------------------------------------------------*/\r
+\r
+if(typeof Effect == 'undefined')\r
+ throw("dragdrop.js requires including script.aculo.us' effects.js library");\r
+\r
+var Droppables = {\r
+ drops: [],\r
+\r
+ remove: function(element) {\r
+ this.drops = this.drops.reject(function(d) { return d.element==$(element) });\r
+ },\r
+\r
+ add: function(element) {\r
+ element = $(element);\r
+ var options = Object.extend({\r
+ greedy: true,\r
+ hoverclass: null,\r
+ tree: false\r
+ }, arguments[1] || {});\r
+\r
+ // cache containers\r
+ if(options.containment) {\r
+ options._containers = [];\r
+ var containment = options.containment;\r
+ if((typeof containment == 'object') && \r
+ (containment.constructor == Array)) {\r
+ containment.each( function(c) { options._containers.push($(c)) });\r
+ } else {\r
+ options._containers.push($(containment));\r
+ }\r
+ }\r
+ \r
+ if(options.accept) options.accept = [options.accept].flatten();\r
+\r
+ Element.makePositioned(element); // fix IE\r
+ options.element = element;\r
+\r
+ this.drops.push(options);\r
+ },\r
+ \r
+ findDeepestChild: function(drops) {\r
+ deepest = drops[0];\r
+ \r
+ for (i = 1; i < drops.length; ++i)\r
+ if (Element.isParent(drops[i].element, deepest.element))\r
+ deepest = drops[i];\r
+ \r
+ return deepest;\r
+ },\r
+\r
+ isContained: function(element, drop) {\r
+ var containmentNode;\r
+ if(drop.tree) {\r
+ containmentNode = element.treeNode; \r
+ } else {\r
+ containmentNode = element.parentNode;\r
+ }\r
+ return drop._containers.detect(function(c) { return containmentNode == c });\r
+ },\r
+ \r
+ isAffected: function(point, element, drop) {\r
+ return (\r
+ (drop.element!=element) &&\r
+ ((!drop._containers) ||\r
+ this.isContained(element, drop)) &&\r
+ ((!drop.accept) ||\r
+ (Element.classNames(element).detect( \r
+ function(v) { return drop.accept.include(v) } ) )) &&\r
+ Position.within(drop.element, point[0], point[1]) );\r
+ },\r
+\r
+ deactivate: function(drop) {\r
+ if(drop.hoverclass)\r
+ Element.removeClassName(drop.element, drop.hoverclass);\r
+ this.last_active = null;\r
+ },\r
+\r
+ activate: function(drop) {\r
+ if(drop.hoverclass)\r
+ Element.addClassName(drop.element, drop.hoverclass);\r
+ this.last_active = drop;\r
+ },\r
+\r
+ show: function(point, element) {\r
+ if(!this.drops.length) return;\r
+ var affected = [];\r
+ \r
+ if(this.last_active) this.deactivate(this.last_active);\r
+ this.drops.each( function(drop) {\r
+ if(Droppables.isAffected(point, element, drop))\r
+ affected.push(drop);\r
+ });\r
+ \r
+ if(affected.length>0) {\r
+ drop = Droppables.findDeepestChild(affected);\r
+ Position.within(drop.element, point[0], point[1]);\r
+ if(drop.onHover)\r
+ drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element));\r
+ \r
+ Droppables.activate(drop);\r
+ }\r
+ },\r
+\r
+ fire: function(event, element) {\r
+ if(!this.last_active) return;\r
+ Position.prepare();\r
+\r
+ if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active))\r
+ if (this.last_active.onDrop) \r
+ this.last_active.onDrop(element, this.last_active.element, event);\r
+ },\r
+\r
+ reset: function() {\r
+ if(this.last_active)\r
+ this.deactivate(this.last_active);\r
+ }\r
+}\r
+\r
+var Draggables = {\r
+ drags: [],\r
+ observers: [],\r
+ \r
+ register: function(draggable) {\r
+ if(this.drags.length == 0) {\r
+ this.eventMouseUp = this.endDrag.bindAsEventListener(this);\r
+ this.eventMouseMove = this.updateDrag.bindAsEventListener(this);\r
+ this.eventKeypress = this.keyPress.bindAsEventListener(this);\r
+ \r
+ Event.observe(document, "mouseup", this.eventMouseUp);\r
+ Event.observe(document, "mousemove", this.eventMouseMove);\r
+ Event.observe(document, "keypress", this.eventKeypress);\r
+ }\r
+ this.drags.push(draggable);\r
+ },\r
+ \r
+ unregister: function(draggable) {\r
+ this.drags = this.drags.reject(function(d) { return d==draggable });\r
+ if(this.drags.length == 0) {\r
+ Event.stopObserving(document, "mouseup", this.eventMouseUp);\r
+ Event.stopObserving(document, "mousemove", this.eventMouseMove);\r
+ Event.stopObserving(document, "keypress", this.eventKeypress);\r
+ }\r
+ },\r
+ \r
+ activate: function(draggable) {\r
+ if(draggable.options.delay) { \r
+ this._timeout = setTimeout(function() { \r
+ Draggables._timeout = null; \r
+ window.focus(); \r
+ Draggables.activeDraggable = draggable; \r
+ }.bind(this), draggable.options.delay); \r
+ } else {\r
+ window.focus(); // allows keypress events if window isn't currently focused, fails for Safari\r
+ this.activeDraggable = draggable;\r
+ }\r
+ },\r
+ \r
+ deactivate: function() {\r
+ this.activeDraggable = null;\r
+ },\r
+ \r
+ updateDrag: function(event) {\r
+ if(!this.activeDraggable) return;\r
+ var pointer = [Event.pointerX(event), Event.pointerY(event)];\r
+ // Mozilla-based browsers fire successive mousemove events with\r
+ // the same coordinates, prevent needless redrawing (moz bug?)\r
+ if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return;\r
+ this._lastPointer = pointer;\r
+ \r
+ this.activeDraggable.updateDrag(event, pointer);\r
+ },\r
+ \r
+ endDrag: function(event) {\r
+ if(this._timeout) { \r
+ clearTimeout(this._timeout); \r
+ this._timeout = null; \r
+ }\r
+ if(!this.activeDraggable) return;\r
+ this._lastPointer = null;\r
+ this.activeDraggable.endDrag(event);\r
+ this.activeDraggable = null;\r
+ },\r
+ \r
+ keyPress: function(event) {\r
+ if(this.activeDraggable)\r
+ this.activeDraggable.keyPress(event);\r
+ },\r
+ \r
+ addObserver: function(observer) {\r
+ this.observers.push(observer);\r
+ this._cacheObserverCallbacks();\r
+ },\r
+ \r
+ removeObserver: function(element) { // element instead of observer fixes mem leaks\r
+ this.observers = this.observers.reject( function(o) { return o.element==element });\r
+ this._cacheObserverCallbacks();\r
+ },\r
+ \r
+ notify: function(eventName, draggable, event) { // 'onStart', 'onEnd', 'onDrag'\r
+ if(this[eventName+'Count'] > 0)\r
+ this.observers.each( function(o) {\r
+ if(o[eventName]) o[eventName](eventName, draggable, event);\r
+ });\r
+ if(draggable.options[eventName]) draggable.options[eventName](draggable, event);\r
+ },\r
+ \r
+ _cacheObserverCallbacks: function() {\r
+ ['onStart','onEnd','onDrag'].each( function(eventName) {\r
+ Draggables[eventName+'Count'] = Draggables.observers.select(\r
+ function(o) { return o[eventName]; }\r
+ ).length;\r
+ });\r
+ }\r
+}\r
+\r
+/*--------------------------------------------------------------------------*/\r
+\r
+var Draggable = Class.create();\r
+Draggable._dragging = {};\r
+\r
+Draggable.prototype = {\r
+ initialize: function(element) {\r
+ var defaults = {\r
+ handle: false,\r
+ reverteffect: function(element, top_offset, left_offset) {\r
+ var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02;\r
+ new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur,\r
+ queue: {scope:'_draggable', position:'end'}\r
+ });\r
+ },\r
+ endeffect: function(element) {\r
+ var toOpacity = typeof element._opacity == 'number' ? element._opacity : 1.0;\r
+ new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity, \r
+ queue: {scope:'_draggable', position:'end'},\r
+ afterFinish: function(){ \r
+ Draggable._dragging[element] = false \r
+ }\r
+ }); \r
+ },\r
+ zindex: 1000,\r
+ revert: false,\r
+ scroll: false,\r
+ scrollSensitivity: 20,\r
+ scrollSpeed: 15,\r
+ snap: false, // false, or xy or [x,y] or function(x,y){ return [x,y] }\r
+ delay: 0\r
+ };\r
+ \r
+ if(arguments[1] && typeof arguments[1].endeffect == 'undefined')\r
+ Object.extend(defaults, {\r
+ starteffect: function(element) {\r
+ element._opacity = Element.getOpacity(element);\r
+ Draggable._dragging[element] = true;\r
+ new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7}); \r
+ }\r
+ });\r
+ \r
+ var options = Object.extend(defaults, arguments[1] || {});\r
+\r
+ this.element = $(element);\r
+ \r
+ if(options.handle && (typeof options.handle == 'string')) {\r
+ var h = Element.childrenWithClassName(this.element, options.handle, true);\r
+ if(h.length>0) this.handle = h[0];\r
+ }\r
+ if(!this.handle) this.handle = $(options.handle);\r
+ if(!this.handle) this.handle = this.element;\r
+ \r
+ if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) {\r
+ options.scroll = $(options.scroll);\r
+ this._isScrollChild = Element.childOf(this.element, options.scroll);\r
+ }\r
+\r
+ Element.makePositioned(this.element); // fix IE \r
+\r
+ this.delta = this.currentDelta();\r
+ this.options = options;\r
+ this.dragging = false; \r
+\r
+ this.eventMouseDown = this.initDrag.bindAsEventListener(this);\r
+ Event.observe(this.handle, "mousedown", this.eventMouseDown);\r
+ \r
+ Draggables.register(this);\r
+ },\r
+ \r
+ destroy: function() {\r
+ Event.stopObserving(this.handle, "mousedown", this.eventMouseDown);\r
+ Draggables.unregister(this);\r
+ },\r
+ \r
+ currentDelta: function() {\r
+ return([\r
+ parseInt(Element.getStyle(this.element,'left') || '0'),\r
+ parseInt(Element.getStyle(this.element,'top') || '0')]);\r
+ },\r
+ \r
+ initDrag: function(event) {\r
+ if(typeof Draggable._dragging[this.element] != 'undefined' &&\r
+ Draggable._dragging[this.element]) return;\r
+ if(Event.isLeftClick(event)) { \r
+ // abort on form elements, fixes a Firefox issue\r
+ var src = Event.element(event);\r
+ if(src.tagName && (\r
+ src.tagName=='INPUT' ||\r
+ src.tagName=='SELECT' ||\r
+ src.tagName=='OPTION' ||\r
+ src.tagName=='BUTTON' ||\r
+ src.tagName=='TEXTAREA')) return;\r
+ \r
+ var pointer = [Event.pointerX(event), Event.pointerY(event)];\r
+ var pos = Position.cumulativeOffset(this.element);\r
+ this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) });\r
+ \r
+ Draggables.activate(this);\r
+ Event.stop(event);\r
+ }\r
+ },\r
+ \r
+ startDrag: function(event) {\r
+ this.dragging = true;\r
+ \r
+ if(this.options.zindex) {\r
+ this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0);\r
+ this.element.style.zIndex = this.options.zindex;\r
+ }\r
+ \r
+ if(this.options.ghosting) {\r
+ this._clone = this.element.cloneNode(true);\r
+ Position.absolutize(this.element);\r
+ this.element.parentNode.insertBefore(this._clone, this.element);\r
+ }\r
+ \r
+ if(this.options.scroll) {\r
+ if (this.options.scroll == window) {\r
+ var where = this._getWindowScroll(this.options.scroll);\r
+ this.originalScrollLeft = where.left;\r
+ this.originalScrollTop = where.top;\r
+ } else {\r
+ this.originalScrollLeft = this.options.scroll.scrollLeft;\r
+ this.originalScrollTop = this.options.scroll.scrollTop;\r
+ }\r
+ }\r
+ \r
+ Draggables.notify('onStart', this, event);\r
+ \r
+ if(this.options.starteffect) this.options.starteffect(this.element);\r
+ },\r
+ \r
+ updateDrag: function(event, pointer) {\r
+ if(!this.dragging) this.startDrag(event);\r
+ Position.prepare();\r
+ Droppables.show(pointer, this.element);\r
+ Draggables.notify('onDrag', this, event);\r
+ \r
+ this.draw(pointer);\r
+ if(this.options.change) this.options.change(this);\r
+ \r
+ if(this.options.scroll) {\r
+ this.stopScrolling();\r
+ \r
+ var p;\r
+ if (this.options.scroll == window) {\r
+ with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; }\r
+ } else {\r
+ p = Position.page(this.options.scroll);\r
+ p[0] += this.options.scroll.scrollLeft;\r
+ p[1] += this.options.scroll.scrollTop;\r
+ \r
+ p[0] += (window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0);\r
+ p[1] += (window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0);\r
+ \r
+ p.push(p[0]+this.options.scroll.offsetWidth);\r
+ p.push(p[1]+this.options.scroll.offsetHeight);\r
+ }\r
+ var speed = [0,0];\r
+ if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity);\r
+ if(pointer[1] < (p[1]+this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[1]+this.options.scrollSensitivity);\r
+ if(pointer[0] > (p[2]-this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[2]-this.options.scrollSensitivity);\r
+ if(pointer[1] > (p[3]-this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[3]-this.options.scrollSensitivity);\r
+ this.startScrolling(speed);\r
+ }\r
+ \r
+ // fix AppleWebKit rendering\r
+ if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);\r
+ \r
+ Event.stop(event);\r
+ },\r
+ \r
+ finishDrag: function(event, success) {\r
+ this.dragging = false;\r
+\r
+ if(this.options.ghosting) {\r
+ Position.relativize(this.element);\r
+ Element.remove(this._clone);\r
+ this._clone = null;\r
+ }\r
+\r
+ if(success) Droppables.fire(event, this.element);\r
+ Draggables.notify('onEnd', this, event);\r
+\r
+ var revert = this.options.revert;\r
+ if(revert && typeof revert == 'function') revert = revert(this.element);\r
+ \r
+ var d = this.currentDelta();\r
+ if(revert && this.options.reverteffect) {\r
+ this.options.reverteffect(this.element, \r
+ d[1]-this.delta[1], d[0]-this.delta[0]);\r
+ } else {\r
+ this.delta = d;\r
+ }\r
+\r
+ if(this.options.zindex)\r
+ this.element.style.zIndex = this.originalZ;\r
+\r
+ if(this.options.endeffect) \r
+ this.options.endeffect(this.element);\r
+ \r
+ Draggables.deactivate(this);\r
+ Droppables.reset();\r
+ },\r
+ \r
+ keyPress: function(event) {\r
+ if(event.keyCode!=Event.KEY_ESC) return;\r
+ this.finishDrag(event, false);\r
+ Event.stop(event);\r
+ },\r
+ \r
+ endDrag: function(event) {\r
+ if(!this.dragging) return;\r
+ this.stopScrolling();\r
+ this.finishDrag(event, true);\r
+ Event.stop(event);\r
+ },\r
+ \r
+ draw: function(point) {\r
+ var pos = Position.cumulativeOffset(this.element);\r
+ if(this.options.ghosting) {\r
+ var r = Position.realOffset(this.element);\r
+ window.status = r.inspect();\r
+ pos[0] += r[0] - Position.deltaX; pos[1] += r[1] - Position.deltaY;\r
+ }\r
+ \r
+ var d = this.currentDelta();\r
+ pos[0] -= d[0]; pos[1] -= d[1];\r
+ \r
+ if(this.options.scroll && (this.options.scroll != window && this._isScrollChild)) {\r
+ pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft;\r
+ pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop;\r
+ }\r
+ \r
+ var p = [0,1].map(function(i){ \r
+ return (point[i]-pos[i]-this.offset[i]) \r
+ }.bind(this));\r
+ \r
+ if(this.options.snap) {\r
+ if(typeof this.options.snap == 'function') {\r
+ p = this.options.snap(p[0],p[1],this);\r
+ } else {\r
+ if(this.options.snap instanceof Array) {\r
+ p = p.map( function(v, i) {\r
+ return Math.round(v/this.options.snap[i])*this.options.snap[i] }.bind(this))\r
+ } else {\r
+ p = p.map( function(v) {\r
+ return Math.round(v/this.options.snap)*this.options.snap }.bind(this))\r
+ }\r
+ }}\r
+ \r
+ var style = this.element.style;\r
+ if((!this.options.constraint) || (this.options.constraint=='horizontal'))\r
+ style.left = p[0] + "px";\r
+ if((!this.options.constraint) || (this.options.constraint=='vertical'))\r
+ style.top = p[1] + "px";\r
+ \r
+ if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering\r
+ },\r
+ \r
+ stopScrolling: function() {\r
+ if(this.scrollInterval) {\r
+ clearInterval(this.scrollInterval);\r
+ this.scrollInterval = null;\r
+ Draggables._lastScrollPointer = null;\r
+ }\r
+ },\r
+ \r
+ startScrolling: function(speed) {\r
+ if(!(speed[0] || speed[1])) return;\r
+ this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed];\r
+ this.lastScrolled = new Date();\r
+ this.scrollInterval = setInterval(this.scroll.bind(this), 10);\r
+ },\r
+ \r
+ scroll: function() {\r
+ var current = new Date();\r
+ var delta = current - this.lastScrolled;\r
+ this.lastScrolled = current;\r
+ if(this.options.scroll == window) {\r
+ with (this._getWindowScroll(this.options.scroll)) {\r
+ if (this.scrollSpeed[0] || this.scrollSpeed[1]) {\r
+ var d = delta / 1000;\r
+ this.options.scroll.scrollTo( left + d*this.scrollSpeed[0], top + d*this.scrollSpeed[1] );\r
+ }\r
+ }\r
+ } else {\r
+ this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000;\r
+ this.options.scroll.scrollTop += this.scrollSpeed[1] * delta / 1000;\r
+ }\r
+ \r
+ Position.prepare();\r
+ Droppables.show(Draggables._lastPointer, this.element);\r
+ Draggables.notify('onDrag', this);\r
+ if (this._isScrollChild) {\r
+ Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer);\r
+ Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000;\r
+ Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000;\r
+ if (Draggables._lastScrollPointer[0] < 0)\r
+ Draggables._lastScrollPointer[0] = 0;\r
+ if (Draggables._lastScrollPointer[1] < 0)\r
+ Draggables._lastScrollPointer[1] = 0;\r
+ this.draw(Draggables._lastScrollPointer);\r
+ }\r
+ \r
+ if(this.options.change) this.options.change(this);\r
+ },\r
+ \r
+ _getWindowScroll: function(w) {\r
+ var T, L, W, H;\r
+ with (w.document) {\r
+ if (w.document.documentElement && documentElement.scrollTop) {\r
+ T = documentElement.scrollTop;\r
+ L = documentElement.scrollLeft;\r
+ } else if (w.document.body) {\r
+ T = body.scrollTop;\r
+ L = body.scrollLeft;\r
+ }\r
+ if (w.innerWidth) {\r
+ W = w.innerWidth;\r
+ H = w.innerHeight;\r
+ } else if (w.document.documentElement && documentElement.clientWidth) {\r
+ W = documentElement.clientWidth;\r
+ H = documentElement.clientHeight;\r
+ } else {\r
+ W = body.offsetWidth;\r
+ H = body.offsetHeight\r
+ }\r
+ }\r
+ return { top: T, left: L, width: W, height: H };\r
+ }\r
+}\r
+\r
+/*--------------------------------------------------------------------------*/\r
+\r
+var SortableObserver = Class.create();\r
+SortableObserver.prototype = {\r
+ initialize: function(element, observer) {\r
+ this.element = $(element);\r
+ this.observer = observer;\r
+ this.lastValue = Sortable.serialize(this.element);\r
+ },\r
+ \r
+ onStart: function() {\r
+ this.lastValue = Sortable.serialize(this.element);\r
+ },\r
+ \r
+ onEnd: function() {\r
+ Sortable.unmark();\r
+ if(this.lastValue != Sortable.serialize(this.element))\r
+ this.observer(this.element)\r
+ }\r
+}\r
+\r
+var Sortable = {\r
+ SERIALIZE_RULE: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/,\r
+ \r
+ sortables: {},\r
+ \r
+ _findRootElement: function(element) {\r
+ while (element.tagName != "BODY") { \r
+ if(element.id && Sortable.sortables[element.id]) return element;\r
+ element = element.parentNode;\r
+ }\r
+ },\r
+\r
+ options: function(element) {\r
+ element = Sortable._findRootElement($(element));\r
+ if(!element) return;\r
+ return Sortable.sortables[element.id];\r
+ },\r
+ \r
+ destroy: function(element){\r
+ var s = Sortable.options(element);\r
+ \r
+ if(s) {\r
+ Draggables.removeObserver(s.element);\r
+ s.droppables.each(function(d){ Droppables.remove(d) });\r
+ s.draggables.invoke('destroy');\r
+ \r
+ delete Sortable.sortables[s.element.id];\r
+ }\r
+ },\r
+\r
+ create: function(element) {\r
+ element = $(element);\r
+ var options = Object.extend({ \r
+ element: element,\r
+ tag: 'li', // assumes li children, override with tag: 'tagname'\r
+ dropOnEmpty: false,\r
+ tree: false,\r
+ treeTag: 'ul',\r
+ overlap: 'vertical', // one of 'vertical', 'horizontal'\r
+ constraint: 'vertical', // one of 'vertical', 'horizontal', false\r
+ containment: element, // also takes array of elements (or id's); or false\r
+ handle: false, // or a CSS class\r
+ only: false,\r
+ delay: 0,\r
+ hoverclass: null,\r
+ ghosting: false,\r
+ scroll: false,\r
+ scrollSensitivity: 20,\r
+ scrollSpeed: 15,\r
+ format: this.SERIALIZE_RULE,\r
+ onChange: Prototype.emptyFunction,\r
+ onUpdate: Prototype.emptyFunction\r
+ }, arguments[1] || {});\r
+\r
+ // clear any old sortable with same element\r
+ this.destroy(element);\r
+\r
+ // build options for the draggables\r
+ var options_for_draggable = {\r
+ revert: true,\r
+ scroll: options.scroll,\r
+ scrollSpeed: options.scrollSpeed,\r
+ scrollSensitivity: options.scrollSensitivity,\r
+ delay: options.delay,\r
+ ghosting: options.ghosting,\r
+ constraint: options.constraint,\r
+ handle: options.handle };\r
+\r
+ if(options.starteffect)\r
+ options_for_draggable.starteffect = options.starteffect;\r
+\r
+ if(options.reverteffect)\r
+ options_for_draggable.reverteffect = options.reverteffect;\r
+ else\r
+ if(options.ghosting) options_for_draggable.reverteffect = function(element) {\r
+ element.style.top = 0;\r
+ element.style.left = 0;\r
+ };\r
+\r
+ if(options.endeffect)\r
+ options_for_draggable.endeffect = options.endeffect;\r
+\r
+ if(options.zindex)\r
+ options_for_draggable.zindex = options.zindex;\r
+\r
+ // build options for the droppables \r
+ var options_for_droppable = {\r
+ overlap: options.overlap,\r
+ containment: options.containment,\r
+ tree: options.tree,\r
+ hoverclass: options.hoverclass,\r
+ onHover: Sortable.onHover\r
+ //greedy: !options.dropOnEmpty\r
+ }\r
+ \r
+ var options_for_tree = {\r
+ onHover: Sortable.onEmptyHover,\r
+ overlap: options.overlap,\r
+ containment: options.containment,\r
+ hoverclass: options.hoverclass\r
+ }\r
+\r
+ // fix for gecko engine\r
+ Element.cleanWhitespace(element); \r
+\r
+ options.draggables = [];\r
+ options.droppables = [];\r
+\r
+ // drop on empty handling\r
+ if(options.dropOnEmpty || options.tree) {\r
+ Droppables.add(element, options_for_tree);\r
+ options.droppables.push(element);\r
+ }\r
+\r
+ (this.findElements(element, options) || []).each( function(e) {\r
+ // handles are per-draggable\r
+ var handle = options.handle ? \r
+ Element.childrenWithClassName(e, options.handle)[0] : e; \r
+ options.draggables.push(\r
+ new Draggable(e, Object.extend(options_for_draggable, { handle: handle })));\r
+ Droppables.add(e, options_for_droppable);\r
+ if(options.tree) e.treeNode = element;\r
+ options.droppables.push(e); \r
+ });\r
+ \r
+ if(options.tree) {\r
+ (Sortable.findTreeElements(element, options) || []).each( function(e) {\r
+ Droppables.add(e, options_for_tree);\r
+ e.treeNode = element;\r
+ options.droppables.push(e);\r
+ });\r
+ }\r
+\r
+ // keep reference\r
+ this.sortables[element.id] = options;\r
+\r
+ // for onupdate\r
+ Draggables.addObserver(new SortableObserver(element, options.onUpdate));\r
+\r
+ },\r
+\r
+ // return all suitable-for-sortable elements in a guaranteed order\r
+ findElements: function(element, options) {\r
+ return Element.findChildren(\r
+ element, options.only, options.tree ? true : false, options.tag);\r
+ },\r
+ \r
+ findTreeElements: function(element, options) {\r
+ return Element.findChildren(\r
+ element, options.only, options.tree ? true : false, options.treeTag);\r
+ },\r
+\r
+ onHover: function(element, dropon, overlap) {\r
+ if(Element.isParent(dropon, element)) return;\r
+\r
+ if(overlap > .33 && overlap < .66 && Sortable.options(dropon).tree) {\r
+ return;\r
+ } else if(overlap>0.5) {\r
+ Sortable.mark(dropon, 'before');\r
+ if(dropon.previousSibling != element) {\r
+ var oldParentNode = element.parentNode;\r
+ element.style.visibility = "hidden"; // fix gecko rendering\r
+ dropon.parentNode.insertBefore(element, dropon);\r
+ if(dropon.parentNode!=oldParentNode) \r
+ Sortable.options(oldParentNode).onChange(element);\r
+ Sortable.options(dropon.parentNode).onChange(element);\r
+ }\r
+ } else {\r
+ Sortable.mark(dropon, 'after');\r
+ var nextElement = dropon.nextSibling || null;\r
+ if(nextElement != element) {\r
+ var oldParentNode = element.parentNode;\r
+ element.style.visibility = "hidden"; // fix gecko rendering\r
+ dropon.parentNode.insertBefore(element, nextElement);\r
+ if(dropon.parentNode!=oldParentNode) \r
+ Sortable.options(oldParentNode).onChange(element);\r
+ Sortable.options(dropon.parentNode).onChange(element);\r
+ }\r
+ }\r
+ },\r
+ \r
+ onEmptyHover: function(element, dropon, overlap) {\r
+ var oldParentNode = element.parentNode;\r
+ var droponOptions = Sortable.options(dropon);\r
+ \r
+ if(!Element.isParent(dropon, element)) {\r
+ var index;\r
+ \r
+ var children = Sortable.findElements(dropon, {tag: droponOptions.tag, only: droponOptions.only});\r
+ var child = null;\r
+ \r
+ if(children) {\r
+ var offset = Element.offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap);\r
+ \r
+ for (index = 0; index < children.length; index += 1) {\r
+ if (offset - Element.offsetSize (children[index], droponOptions.overlap) >= 0) {\r
+ offset -= Element.offsetSize (children[index], droponOptions.overlap);\r
+ } else if (offset - (Element.offsetSize (children[index], droponOptions.overlap) / 2) >= 0) {\r
+ child = index + 1 < children.length ? children[index + 1] : null;\r
+ break;\r
+ } else {\r
+ child = children[index];\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ \r
+ dropon.insertBefore(element, child);\r
+ \r
+ Sortable.options(oldParentNode).onChange(element);\r
+ droponOptions.onChange(element);\r
+ }\r
+ },\r
+\r
+ unmark: function() {\r
+ if(Sortable._marker) Element.hide(Sortable._marker);\r
+ },\r
+\r
+ mark: function(dropon, position) {\r
+ // mark on ghosting only\r
+ var sortable = Sortable.options(dropon.parentNode);\r
+ if(sortable && !sortable.ghosting) return; \r
+\r
+ if(!Sortable._marker) {\r
+ Sortable._marker = $('dropmarker') || document.createElement('DIV');\r
+ Element.hide(Sortable._marker);\r
+ Element.addClassName(Sortable._marker, 'dropmarker');\r
+ Sortable._marker.style.position = 'absolute';\r
+ document.getElementsByTagName("body").item(0).appendChild(Sortable._marker);\r
+ } \r
+ var offsets = Position.cumulativeOffset(dropon);\r
+ Sortable._marker.style.left = offsets[0] + 'px';\r
+ Sortable._marker.style.top = offsets[1] + 'px';\r
+ \r
+ if(position=='after')\r
+ if(sortable.overlap == 'horizontal') \r
+ Sortable._marker.style.left = (offsets[0]+dropon.clientWidth) + 'px';\r
+ else\r
+ Sortable._marker.style.top = (offsets[1]+dropon.clientHeight) + 'px';\r
+ \r
+ Element.show(Sortable._marker);\r
+ },\r
+ \r
+ _tree: function(element, options, parent) {\r
+ var children = Sortable.findElements(element, options) || [];\r
+ \r
+ for (var i = 0; i < children.length; ++i) {\r
+ var match = children[i].id.match(options.format);\r
+\r
+ if (!match) continue;\r
+ \r
+ var child = {\r
+ id: encodeURIComponent(match ? match[1] : null),\r
+ element: element,\r
+ parent: parent,\r
+ children: new Array,\r
+ position: parent.children.length,\r
+ container: Sortable._findChildrenElement(children[i], options.treeTag.toUpperCase())\r
+ }\r
+ \r
+ /* Get the element containing the children and recurse over it */\r
+ if (child.container)\r
+ this._tree(child.container, options, child)\r
+ \r
+ parent.children.push (child);\r
+ }\r
+\r
+ return parent; \r
+ },\r
+\r
+ /* Finds the first element of the given tag type within a parent element.\r
+ Used for finding the first LI[ST] within a L[IST]I[TEM].*/\r
+ _findChildrenElement: function (element, containerTag) {\r
+ if (element && element.hasChildNodes)\r
+ for (var i = 0; i < element.childNodes.length; ++i)\r
+ if (element.childNodes[i].tagName == containerTag)\r
+ return element.childNodes[i];\r
+ \r
+ return null;\r
+ },\r
+\r
+ tree: function(element) {\r
+ element = $(element);\r
+ var sortableOptions = this.options(element);\r
+ var options = Object.extend({\r
+ tag: sortableOptions.tag,\r
+ treeTag: sortableOptions.treeTag,\r
+ only: sortableOptions.only,\r
+ name: element.id,\r
+ format: sortableOptions.format\r
+ }, arguments[1] || {});\r
+ \r
+ var root = {\r
+ id: null,\r
+ parent: null,\r
+ children: new Array,\r
+ container: element,\r
+ position: 0\r
+ }\r
+ \r
+ return Sortable._tree (element, options, root);\r
+ },\r
+\r
+ /* Construct a [i] index for a particular node */\r
+ _constructIndex: function(node) {\r
+ var index = '';\r
+ do {\r
+ if (node.id) index = '[' + node.position + ']' + index;\r
+ } while ((node = node.parent) != null);\r
+ return index;\r
+ },\r
+\r
+ sequence: function(element) {\r
+ element = $(element);\r
+ var options = Object.extend(this.options(element), arguments[1] || {});\r
+ \r
+ return $(this.findElements(element, options) || []).map( function(item) {\r
+ return item.id.match(options.format) ? item.id.match(options.format)[1] : '';\r
+ });\r
+ },\r
+\r
+ setSequence: function(element, new_sequence) {\r
+ element = $(element);\r
+ var options = Object.extend(this.options(element), arguments[2] || {});\r
+ \r
+ var nodeMap = {};\r
+ this.findElements(element, options).each( function(n) {\r
+ if (n.id.match(options.format))\r
+ nodeMap[n.id.match(options.format)[1]] = [n, n.parentNode];\r
+ n.parentNode.removeChild(n);\r
+ });\r
+ \r
+ new_sequence.each(function(ident) {\r
+ var n = nodeMap[ident];\r
+ if (n) {\r
+ n[1].appendChild(n[0]);\r
+ delete nodeMap[ident];\r
+ }\r
+ });\r
+ },\r
+ \r
+ serialize: function(element) {\r
+ element = $(element);\r
+ var options = Object.extend(Sortable.options(element), arguments[1] || {});\r
+ var name = encodeURIComponent(\r
+ (arguments[1] && arguments[1].name) ? arguments[1].name : element.id);\r
+ \r
+ if (options.tree) {\r
+ return Sortable.tree(element, arguments[1]).children.map( function (item) {\r
+ return [name + Sortable._constructIndex(item) + "[id]=" + \r
+ encodeURIComponent(item.id)].concat(item.children.map(arguments.callee));\r
+ }).flatten().join('&');\r
+ } else {\r
+ return Sortable.sequence(element, arguments[1]).map( function(item) {\r
+ return name + "[]=" + encodeURIComponent(item);\r
+ }).join('&');\r
+ }\r
+ }\r
+}\r
+\r
+/* Returns true if child is contained within element */\r
+Element.isParent = function(child, element) {\r
+ if (!child.parentNode || child == element) return false;\r
+\r
+ if (child.parentNode == element) return true;\r
+\r
+ return Element.isParent(child.parentNode, element);\r
+}\r
+\r
+Element.findChildren = function(element, only, recursive, tagName) { \r
+ if(!element.hasChildNodes()) return null;\r
+ tagName = tagName.toUpperCase();\r
+ if(only) only = [only].flatten();\r
+ var elements = [];\r
+ $A(element.childNodes).each( function(e) {\r
+ if(e.tagName && e.tagName.toUpperCase()==tagName &&\r
+ (!only || (Element.classNames(e).detect(function(v) { return only.include(v) }))))\r
+ elements.push(e);\r
+ if(recursive) {\r
+ var grandchildren = Element.findChildren(e, only, recursive, tagName);\r
+ if(grandchildren) elements.push(grandchildren);\r
+ }\r
+ });\r
+\r
+ return (elements.length>0 ? elements.flatten() : []);\r
+}\r
+\r
+Element.offsetSize = function (element, type) {\r
+ if (type == 'vertical' || type == 'height')\r
+ return element.offsetHeight;\r
+ else\r
+ return element.offsetWidth;\r
}
\ No newline at end of file
-// script.aculo.us effects.js v1.6.4, Wed Sep 06 11:30:58 CEST 2006
-
-// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-// Contributors:
-// Justin Palmer (http://encytemedia.com/)
-// Mark Pilgrim (http://diveintomark.org/)
-// Martin Bialasinki
-//
-// See scriptaculous.js for full license.
-
-// converts rgb() and #xxx to #xxxxxx format,
-// returns self (or first argument) if not convertable
-String.prototype.parseColor = function() {
- var color = '#';
- if(this.slice(0,4) == 'rgb(') {
- var cols = this.slice(4,this.length-1).split(',');
- var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3);
- } else {
- if(this.slice(0,1) == '#') {
- if(this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();
- if(this.length==7) color = this.toLowerCase();
- }
- }
- return(color.length==7 ? color : (arguments[0] || this));
-}
-
-/*--------------------------------------------------------------------------*/
-
-Element.collectTextNodes = function(element) {
- return $A($(element).childNodes).collect( function(node) {
- return (node.nodeType==3 ? node.nodeValue :
- (node.hasChildNodes() ? Element.collectTextNodes(node) : ''));
- }).flatten().join('');
-}
-
-Element.collectTextNodesIgnoreClass = function(element, className) {
- return $A($(element).childNodes).collect( function(node) {
- return (node.nodeType==3 ? node.nodeValue :
- ((node.hasChildNodes() && !Element.hasClassName(node,className)) ?
- Element.collectTextNodesIgnoreClass(node, className) : ''));
- }).flatten().join('');
-}
-
-Element.setContentZoom = function(element, percent) {
- element = $(element);
- Element.setStyle(element, {fontSize: (percent/100) + 'em'});
- if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
-}
-
-Element.getOpacity = function(element){
- var opacity;
- if (opacity = Element.getStyle(element, 'opacity'))
- return parseFloat(opacity);
- if (opacity = (Element.getStyle(element, 'filter') || '').match(/alpha\(opacity=(.*)\)/))
- if(opacity[1]) return parseFloat(opacity[1]) / 100;
- return 1.0;
-}
-
-Element.setOpacity = function(element, value){
- element= $(element);
- if (value == 1){
- Element.setStyle(element, { opacity:
- (/Gecko/.test(navigator.userAgent) && !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ?
- 0.999999 : 1.0 });
- if(/MSIE/.test(navigator.userAgent) && !window.opera)
- Element.setStyle(element, {filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'')});
- } else {
- if(value < 0.00001) value = 0;
- Element.setStyle(element, {opacity: value});
- if(/MSIE/.test(navigator.userAgent) && !window.opera)
- Element.setStyle(element,
- { filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'') +
- 'alpha(opacity='+value*100+')' });
- }
-}
-
-Element.getInlineOpacity = function(element){
- return $(element).style.opacity || '';
-}
-
-Element.childrenWithClassName = function(element, className, findFirst) {
- var classNameRegExp = new RegExp("(^|\\s)" + className + "(\\s|$)");
- var results = $A($(element).getElementsByTagName('*'))[findFirst ? 'detect' : 'select']( function(c) {
- return (c.className && c.className.match(classNameRegExp));
- });
- if(!results) results = [];
- return results;
-}
-
-Element.forceRerendering = function(element) {
- try {
- element = $(element);
- var n = document.createTextNode(' ');
- element.appendChild(n);
- element.removeChild(n);
- } catch(e) { }
-};
-
-/*--------------------------------------------------------------------------*/
-
-Array.prototype.call = function() {
- var args = arguments;
- this.each(function(f){ f.apply(this, args) });
-}
-
-/*--------------------------------------------------------------------------*/
-
-var Effect = {
- _elementDoesNotExistError: {
- name: 'ElementDoesNotExistError',
- message: 'The specified DOM element does not exist, but is required for this effect to operate'
- },
- tagifyText: function(element) {
- if(typeof Builder == 'undefined')
- throw("Effect.tagifyText requires including script.aculo.us' builder.js library");
-
- var tagifyStyle = 'position:relative';
- if(/MSIE/.test(navigator.userAgent) && !window.opera) tagifyStyle += ';zoom:1';
- element = $(element);
- $A(element.childNodes).each( function(child) {
- if(child.nodeType==3) {
- child.nodeValue.toArray().each( function(character) {
- element.insertBefore(
- Builder.node('span',{style: tagifyStyle},
- character == ' ' ? String.fromCharCode(160) : character),
- child);
- });
- Element.remove(child);
- }
- });
- },
- multiple: function(element, effect) {
- var elements;
- if(((typeof element == 'object') ||
- (typeof element == 'function')) &&
- (element.length))
- elements = element;
- else
- elements = $(element).childNodes;
-
- var options = Object.extend({
- speed: 0.1,
- delay: 0.0
- }, arguments[2] || {});
- var masterDelay = options.delay;
-
- $A(elements).each( function(element, index) {
- new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay }));
- });
- },
- PAIRS: {
- 'slide': ['SlideDown','SlideUp'],
- 'blind': ['BlindDown','BlindUp'],
- 'appear': ['Appear','Fade']
- },
- toggle: function(element, effect) {
- element = $(element);
- effect = (effect || 'appear').toLowerCase();
- var options = Object.extend({
- queue: { position:'end', scope:(element.id || 'global'), limit: 1 }
- }, arguments[2] || {});
- Effect[element.visible() ?
- Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);
- }
-};
-
-var Effect2 = Effect; // deprecated
-
-/* ------------- transitions ------------- */
-
-Effect.Transitions = {}
-
-Effect.Transitions.linear = Prototype.K;
-
-Effect.Transitions.sinoidal = function(pos) {
- return (-Math.cos(pos*Math.PI)/2) + 0.5;
-}
-Effect.Transitions.reverse = function(pos) {
- return 1-pos;
-}
-Effect.Transitions.flicker = function(pos) {
- return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;
-}
-Effect.Transitions.wobble = function(pos) {
- return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;
-}
-Effect.Transitions.pulse = function(pos) {
- return (Math.floor(pos*10) % 2 == 0 ?
- (pos*10-Math.floor(pos*10)) : 1-(pos*10-Math.floor(pos*10)));
-}
-Effect.Transitions.none = function(pos) {
- return 0;
-}
-Effect.Transitions.full = function(pos) {
- return 1;
-}
-
-/* ------------- core effects ------------- */
-
-Effect.ScopedQueue = Class.create();
-Object.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), {
- initialize: function() {
- this.effects = [];
- this.interval = null;
- },
- _each: function(iterator) {
- this.effects._each(iterator);
- },
- add: function(effect) {
- var timestamp = new Date().getTime();
-
- var position = (typeof effect.options.queue == 'string') ?
- effect.options.queue : effect.options.queue.position;
-
- switch(position) {
- case 'front':
- // move unstarted effects after this effect
- this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) {
- e.startOn += effect.finishOn;
- e.finishOn += effect.finishOn;
- });
- break;
- case 'end':
- // start effect after last queued effect has finished
- timestamp = this.effects.pluck('finishOn').max() || timestamp;
- break;
- }
-
- effect.startOn += timestamp;
- effect.finishOn += timestamp;
-
- if(!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))
- this.effects.push(effect);
-
- if(!this.interval)
- this.interval = setInterval(this.loop.bind(this), 40);
- },
- remove: function(effect) {
- this.effects = this.effects.reject(function(e) { return e==effect });
- if(this.effects.length == 0) {
- clearInterval(this.interval);
- this.interval = null;
- }
- },
- loop: function() {
- var timePos = new Date().getTime();
- this.effects.invoke('loop', timePos);
- }
-});
-
-Effect.Queues = {
- instances: $H(),
- get: function(queueName) {
- if(typeof queueName != 'string') return queueName;
-
- if(!this.instances[queueName])
- this.instances[queueName] = new Effect.ScopedQueue();
-
- return this.instances[queueName];
- }
-}
-Effect.Queue = Effect.Queues.get('global');
-
-Effect.DefaultOptions = {
- transition: Effect.Transitions.sinoidal,
- duration: 1.0, // seconds
- fps: 25.0, // max. 25fps due to Effect.Queue implementation
- sync: false, // true for combining
- from: 0.0,
- to: 1.0,
- delay: 0.0,
- queue: 'parallel'
-}
-
-Effect.Base = function() {};
-Effect.Base.prototype = {
- position: null,
- start: function(options) {
- this.options = Object.extend(Object.extend({},Effect.DefaultOptions), options || {});
- this.currentFrame = 0;
- this.state = 'idle';
- this.startOn = this.options.delay*1000;
- this.finishOn = this.startOn + (this.options.duration*1000);
- this.event('beforeStart');
- if(!this.options.sync)
- Effect.Queues.get(typeof this.options.queue == 'string' ?
- 'global' : this.options.queue.scope).add(this);
- },
- loop: function(timePos) {
- if(timePos >= this.startOn) {
- if(timePos >= this.finishOn) {
- this.render(1.0);
- this.cancel();
- this.event('beforeFinish');
- if(this.finish) this.finish();
- this.event('afterFinish');
- return;
- }
- var pos = (timePos - this.startOn) / (this.finishOn - this.startOn);
- var frame = Math.round(pos * this.options.fps * this.options.duration);
- if(frame > this.currentFrame) {
- this.render(pos);
- this.currentFrame = frame;
- }
- }
- },
- render: function(pos) {
- if(this.state == 'idle') {
- this.state = 'running';
- this.event('beforeSetup');
- if(this.setup) this.setup();
- this.event('afterSetup');
- }
- if(this.state == 'running') {
- if(this.options.transition) pos = this.options.transition(pos);
- pos *= (this.options.to-this.options.from);
- pos += this.options.from;
- this.position = pos;
- this.event('beforeUpdate');
- if(this.update) this.update(pos);
- this.event('afterUpdate');
- }
- },
- cancel: function() {
- if(!this.options.sync)
- Effect.Queues.get(typeof this.options.queue == 'string' ?
- 'global' : this.options.queue.scope).remove(this);
- this.state = 'finished';
- },
- event: function(eventName) {
- if(this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);
- if(this.options[eventName]) this.options[eventName](this);
- },
- inspect: function() {
- return '#<Effect:' + $H(this).inspect() + ',options:' + $H(this.options).inspect() + '>';
- }
-}
-
-Effect.Parallel = Class.create();
-Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), {
- initialize: function(effects) {
- this.effects = effects || [];
- this.start(arguments[1]);
- },
- update: function(position) {
- this.effects.invoke('render', position);
- },
- finish: function(position) {
- this.effects.each( function(effect) {
- effect.render(1.0);
- effect.cancel();
- effect.event('beforeFinish');
- if(effect.finish) effect.finish(position);
- effect.event('afterFinish');
- });
- }
-});
-
-Effect.Opacity = Class.create();
-Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), {
- initialize: function(element) {
- this.element = $(element);
- if(!this.element) throw(Effect._elementDoesNotExistError);
- // make this work on IE on elements without 'layout'
- if(/MSIE/.test(navigator.userAgent) && !window.opera && (!this.element.currentStyle.hasLayout))
- this.element.setStyle({zoom: 1});
- var options = Object.extend({
- from: this.element.getOpacity() || 0.0,
- to: 1.0
- }, arguments[1] || {});
- this.start(options);
- },
- update: function(position) {
- this.element.setOpacity(position);
- }
-});
-
-Effect.Move = Class.create();
-Object.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), {
- initialize: function(element) {
- this.element = $(element);
- if(!this.element) throw(Effect._elementDoesNotExistError);
- var options = Object.extend({
- x: 0,
- y: 0,
- mode: 'relative'
- }, arguments[1] || {});
- this.start(options);
- },
- setup: function() {
- // Bug in Opera: Opera returns the "real" position of a static element or
- // relative element that does not have top/left explicitly set.
- // ==> Always set top and left for position relative elements in your stylesheets
- // (to 0 if you do not need them)
- this.element.makePositioned();
- this.originalLeft = parseFloat(this.element.getStyle('left') || '0');
- this.originalTop = parseFloat(this.element.getStyle('top') || '0');
- if(this.options.mode == 'absolute') {
- // absolute movement, so we need to calc deltaX and deltaY
- this.options.x = this.options.x - this.originalLeft;
- this.options.y = this.options.y - this.originalTop;
- }
- },
- update: function(position) {
- this.element.setStyle({
- left: Math.round(this.options.x * position + this.originalLeft) + 'px',
- top: Math.round(this.options.y * position + this.originalTop) + 'px'
- });
- }
-});
-
-// for backwards compatibility
-Effect.MoveBy = function(element, toTop, toLeft) {
- return new Effect.Move(element,
- Object.extend({ x: toLeft, y: toTop }, arguments[3] || {}));
-};
-
-Effect.Scale = Class.create();
-Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), {
- initialize: function(element, percent) {
- this.element = $(element);
- if(!this.element) throw(Effect._elementDoesNotExistError);
- var options = Object.extend({
- scaleX: true,
- scaleY: true,
- scaleContent: true,
- scaleFromCenter: false,
- scaleMode: 'box', // 'box' or 'contents' or {} with provided values
- scaleFrom: 100.0,
- scaleTo: percent
- }, arguments[2] || {});
- this.start(options);
- },
- setup: function() {
- this.restoreAfterFinish = this.options.restoreAfterFinish || false;
- this.elementPositioning = this.element.getStyle('position');
-
- this.originalStyle = {};
- ['top','left','width','height','fontSize'].each( function(k) {
- this.originalStyle[k] = this.element.style[k];
- }.bind(this));
-
- this.originalTop = this.element.offsetTop;
- this.originalLeft = this.element.offsetLeft;
-
- var fontSize = this.element.getStyle('font-size') || '100%';
- ['em','px','%','pt'].each( function(fontSizeType) {
- if(fontSize.indexOf(fontSizeType)>0) {
- this.fontSize = parseFloat(fontSize);
- this.fontSizeType = fontSizeType;
- }
- }.bind(this));
-
- this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;
-
- this.dims = null;
- if(this.options.scaleMode=='box')
- this.dims = [this.element.offsetHeight, this.element.offsetWidth];
- if(/^content/.test(this.options.scaleMode))
- this.dims = [this.element.scrollHeight, this.element.scrollWidth];
- if(!this.dims)
- this.dims = [this.options.scaleMode.originalHeight,
- this.options.scaleMode.originalWidth];
- },
- update: function(position) {
- var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);
- if(this.options.scaleContent && this.fontSize)
- this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType });
- this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);
- },
- finish: function(position) {
- if (this.restoreAfterFinish) this.element.setStyle(this.originalStyle);
- },
- setDimensions: function(height, width) {
- var d = {};
- if(this.options.scaleX) d.width = Math.round(width) + 'px';
- if(this.options.scaleY) d.height = Math.round(height) + 'px';
- if(this.options.scaleFromCenter) {
- var topd = (height - this.dims[0])/2;
- var leftd = (width - this.dims[1])/2;
- if(this.elementPositioning == 'absolute') {
- if(this.options.scaleY) d.top = this.originalTop-topd + 'px';
- if(this.options.scaleX) d.left = this.originalLeft-leftd + 'px';
- } else {
- if(this.options.scaleY) d.top = -topd + 'px';
- if(this.options.scaleX) d.left = -leftd + 'px';
- }
- }
- this.element.setStyle(d);
- }
-});
-
-Effect.Highlight = Class.create();
-Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), {
- initialize: function(element) {
- this.element = $(element);
- if(!this.element) throw(Effect._elementDoesNotExistError);
- var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || {});
- this.start(options);
- },
- setup: function() {
- // Prevent executing on elements not in the layout flow
- if(this.element.getStyle('display')=='none') { this.cancel(); return; }
- // Disable background image during the effect
- this.oldStyle = {
- backgroundImage: this.element.getStyle('background-image') };
- this.element.setStyle({backgroundImage: 'none'});
- if(!this.options.endcolor)
- this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff');
- if(!this.options.restorecolor)
- this.options.restorecolor = this.element.getStyle('background-color');
- // init color calculations
- this._base = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this));
- this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this));
- },
- update: function(position) {
- this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){
- return m+(Math.round(this._base[i]+(this._delta[i]*position)).toColorPart()); }.bind(this)) });
- },
- finish: function() {
- this.element.setStyle(Object.extend(this.oldStyle, {
- backgroundColor: this.options.restorecolor
- }));
- }
-});
-
-Effect.ScrollTo = Class.create();
-Object.extend(Object.extend(Effect.ScrollTo.prototype, Effect.Base.prototype), {
- initialize: function(element) {
- this.element = $(element);
- this.start(arguments[1] || {});
- },
- setup: function() {
- Position.prepare();
- var offsets = Position.cumulativeOffset(this.element);
- if(this.options.offset) offsets[1] += this.options.offset;
- var max = window.innerHeight ?
- window.height - window.innerHeight :
- document.body.scrollHeight -
- (document.documentElement.clientHeight ?
- document.documentElement.clientHeight : document.body.clientHeight);
- this.scrollStart = Position.deltaY;
- this.delta = (offsets[1] > max ? max : offsets[1]) - this.scrollStart;
- },
- update: function(position) {
- Position.prepare();
- window.scrollTo(Position.deltaX,
- this.scrollStart + (position*this.delta));
- }
-});
-
-/* ------------- combination effects ------------- */
-
-Effect.Fade = function(element) {
- element = $(element);
- var oldOpacity = element.getInlineOpacity();
- var options = Object.extend({
- from: element.getOpacity() || 1.0,
- to: 0.0,
- afterFinishInternal: function(effect) {
- if(effect.options.to!=0) return;
- effect.element.hide();
- effect.element.setStyle({opacity: oldOpacity});
- }}, arguments[1] || {});
- return new Effect.Opacity(element,options);
-}
-
-Effect.Appear = function(element) {
- element = $(element);
- var options = Object.extend({
- from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0),
- to: 1.0,
- // force Safari to render floated elements properly
- afterFinishInternal: function(effect) {
- effect.element.forceRerendering();
- },
- beforeSetup: function(effect) {
- effect.element.setOpacity(effect.options.from);
- effect.element.show();
- }}, arguments[1] || {});
- return new Effect.Opacity(element,options);
-}
-
-Effect.Puff = function(element) {
- element = $(element);
- var oldStyle = {
- opacity: element.getInlineOpacity(),
- position: element.getStyle('position'),
- top: element.style.top,
- left: element.style.left,
- width: element.style.width,
- height: element.style.height
- };
- return new Effect.Parallel(
- [ new Effect.Scale(element, 200,
- { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }),
- new Effect.Opacity(element, { sync: true, to: 0.0 } ) ],
- Object.extend({ duration: 1.0,
- beforeSetupInternal: function(effect) {
- Position.absolutize(effect.effects[0].element)
- },
- afterFinishInternal: function(effect) {
- effect.effects[0].element.hide();
- effect.effects[0].element.setStyle(oldStyle); }
- }, arguments[1] || {})
- );
-}
-
-Effect.BlindUp = function(element) {
- element = $(element);
- element.makeClipping();
- return new Effect.Scale(element, 0,
- Object.extend({ scaleContent: false,
- scaleX: false,
- restoreAfterFinish: true,
- afterFinishInternal: function(effect) {
- effect.element.hide();
- effect.element.undoClipping();
- }
- }, arguments[1] || {})
- );
-}
-
-Effect.BlindDown = function(element) {
- element = $(element);
- var elementDimensions = element.getDimensions();
- return new Effect.Scale(element, 100, Object.extend({
- scaleContent: false,
- scaleX: false,
- scaleFrom: 0,
- scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
- restoreAfterFinish: true,
- afterSetup: function(effect) {
- effect.element.makeClipping();
- effect.element.setStyle({height: '0px'});
- effect.element.show();
- },
- afterFinishInternal: function(effect) {
- effect.element.undoClipping();
- }
- }, arguments[1] || {}));
-}
-
-Effect.SwitchOff = function(element) {
- element = $(element);
- var oldOpacity = element.getInlineOpacity();
- return new Effect.Appear(element, Object.extend({
- duration: 0.4,
- from: 0,
- transition: Effect.Transitions.flicker,
- afterFinishInternal: function(effect) {
- new Effect.Scale(effect.element, 1, {
- duration: 0.3, scaleFromCenter: true,
- scaleX: false, scaleContent: false, restoreAfterFinish: true,
- beforeSetup: function(effect) {
- effect.element.makePositioned();
- effect.element.makeClipping();
- },
- afterFinishInternal: function(effect) {
- effect.element.hide();
- effect.element.undoClipping();
- effect.element.undoPositioned();
- effect.element.setStyle({opacity: oldOpacity});
- }
- })
- }
- }, arguments[1] || {}));
-}
-
-Effect.DropOut = function(element) {
- element = $(element);
- var oldStyle = {
- top: element.getStyle('top'),
- left: element.getStyle('left'),
- opacity: element.getInlineOpacity() };
- return new Effect.Parallel(
- [ new Effect.Move(element, {x: 0, y: 100, sync: true }),
- new Effect.Opacity(element, { sync: true, to: 0.0 }) ],
- Object.extend(
- { duration: 0.5,
- beforeSetup: function(effect) {
- effect.effects[0].element.makePositioned();
- },
- afterFinishInternal: function(effect) {
- effect.effects[0].element.hide();
- effect.effects[0].element.undoPositioned();
- effect.effects[0].element.setStyle(oldStyle);
- }
- }, arguments[1] || {}));
-}
-
-Effect.Shake = function(element) {
- element = $(element);
- var oldStyle = {
- top: element.getStyle('top'),
- left: element.getStyle('left') };
- return new Effect.Move(element,
- { x: 20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
- new Effect.Move(effect.element,
- { x: -40, y: 0, duration: 0.1, afterFinishInternal: function(effect) {
- new Effect.Move(effect.element,
- { x: 40, y: 0, duration: 0.1, afterFinishInternal: function(effect) {
- new Effect.Move(effect.element,
- { x: -40, y: 0, duration: 0.1, afterFinishInternal: function(effect) {
- new Effect.Move(effect.element,
- { x: 40, y: 0, duration: 0.1, afterFinishInternal: function(effect) {
- new Effect.Move(effect.element,
- { x: -20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
- effect.element.undoPositioned();
- effect.element.setStyle(oldStyle);
- }}) }}) }}) }}) }}) }});
-}
-
-Effect.SlideDown = function(element) {
- element = $(element);
- element.cleanWhitespace();
- // SlideDown need to have the content of the element wrapped in a container element with fixed height!
- var oldInnerBottom = $(element.firstChild).getStyle('bottom');
- var elementDimensions = element.getDimensions();
- return new Effect.Scale(element, 100, Object.extend({
- scaleContent: false,
- scaleX: false,
- scaleFrom: window.opera ? 0 : 1,
- scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
- restoreAfterFinish: true,
- afterSetup: function(effect) {
- effect.element.makePositioned();
- effect.element.firstChild.makePositioned();
- if(window.opera) effect.element.setStyle({top: ''});
- effect.element.makeClipping();
- effect.element.setStyle({height: '0px'});
- effect.element.show(); },
- afterUpdateInternal: function(effect) {
- effect.element.firstChild.setStyle({bottom:
- (effect.dims[0] - effect.element.clientHeight) + 'px' });
- },
- afterFinishInternal: function(effect) {
- effect.element.undoClipping();
- // IE will crash if child is undoPositioned first
- if(/MSIE/.test(navigator.userAgent) && !window.opera){
- effect.element.undoPositioned();
- effect.element.firstChild.undoPositioned();
- }else{
- effect.element.firstChild.undoPositioned();
- effect.element.undoPositioned();
- }
- effect.element.firstChild.setStyle({bottom: oldInnerBottom}); }
- }, arguments[1] || {})
- );
-}
-
-Effect.SlideUp = function(element) {
- element = $(element);
- element.cleanWhitespace();
- var oldInnerBottom = $(element.firstChild).getStyle('bottom');
- return new Effect.Scale(element, window.opera ? 0 : 1,
- Object.extend({ scaleContent: false,
- scaleX: false,
- scaleMode: 'box',
- scaleFrom: 100,
- restoreAfterFinish: true,
- beforeStartInternal: function(effect) {
- effect.element.makePositioned();
- effect.element.firstChild.makePositioned();
- if(window.opera) effect.element.setStyle({top: ''});
- effect.element.makeClipping();
- effect.element.show(); },
- afterUpdateInternal: function(effect) {
- effect.element.firstChild.setStyle({bottom:
- (effect.dims[0] - effect.element.clientHeight) + 'px' }); },
- afterFinishInternal: function(effect) {
- effect.element.hide();
- effect.element.undoClipping();
- effect.element.firstChild.undoPositioned();
- effect.element.undoPositioned();
- effect.element.setStyle({bottom: oldInnerBottom}); }
- }, arguments[1] || {})
- );
-}
-
-// Bug in opera makes the TD containing this element expand for a instance after finish
-Effect.Squish = function(element) {
- return new Effect.Scale(element, window.opera ? 1 : 0,
- { restoreAfterFinish: true,
- beforeSetup: function(effect) {
- effect.element.makeClipping(effect.element); },
- afterFinishInternal: function(effect) {
- effect.element.hide(effect.element);
- effect.element.undoClipping(effect.element); }
- });
-}
-
-Effect.Grow = function(element) {
- element = $(element);
- var options = Object.extend({
- direction: 'center',
- moveTransition: Effect.Transitions.sinoidal,
- scaleTransition: Effect.Transitions.sinoidal,
- opacityTransition: Effect.Transitions.full
- }, arguments[1] || {});
- var oldStyle = {
- top: element.style.top,
- left: element.style.left,
- height: element.style.height,
- width: element.style.width,
- opacity: element.getInlineOpacity() };
-
- var dims = element.getDimensions();
- var initialMoveX, initialMoveY;
- var moveX, moveY;
-
- switch (options.direction) {
- case 'top-left':
- initialMoveX = initialMoveY = moveX = moveY = 0;
- break;
- case 'top-right':
- initialMoveX = dims.width;
- initialMoveY = moveY = 0;
- moveX = -dims.width;
- break;
- case 'bottom-left':
- initialMoveX = moveX = 0;
- initialMoveY = dims.height;
- moveY = -dims.height;
- break;
- case 'bottom-right':
- initialMoveX = dims.width;
- initialMoveY = dims.height;
- moveX = -dims.width;
- moveY = -dims.height;
- break;
- case 'center':
- initialMoveX = dims.width / 2;
- initialMoveY = dims.height / 2;
- moveX = -dims.width / 2;
- moveY = -dims.height / 2;
- break;
- }
-
- return new Effect.Move(element, {
- x: initialMoveX,
- y: initialMoveY,
- duration: 0.01,
- beforeSetup: function(effect) {
- effect.element.hide();
- effect.element.makeClipping();
- effect.element.makePositioned();
- },
- afterFinishInternal: function(effect) {
- new Effect.Parallel(
- [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }),
- new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }),
- new Effect.Scale(effect.element, 100, {
- scaleMode: { originalHeight: dims.height, originalWidth: dims.width },
- sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})
- ], Object.extend({
- beforeSetup: function(effect) {
- effect.effects[0].element.setStyle({height: '0px'});
- effect.effects[0].element.show();
- },
- afterFinishInternal: function(effect) {
- effect.effects[0].element.undoClipping();
- effect.effects[0].element.undoPositioned();
- effect.effects[0].element.setStyle(oldStyle);
- }
- }, options)
- )
- }
- });
-}
-
-Effect.Shrink = function(element) {
- element = $(element);
- var options = Object.extend({
- direction: 'center',
- moveTransition: Effect.Transitions.sinoidal,
- scaleTransition: Effect.Transitions.sinoidal,
- opacityTransition: Effect.Transitions.none
- }, arguments[1] || {});
- var oldStyle = {
- top: element.style.top,
- left: element.style.left,
- height: element.style.height,
- width: element.style.width,
- opacity: element.getInlineOpacity() };
-
- var dims = element.getDimensions();
- var moveX, moveY;
-
- switch (options.direction) {
- case 'top-left':
- moveX = moveY = 0;
- break;
- case 'top-right':
- moveX = dims.width;
- moveY = 0;
- break;
- case 'bottom-left':
- moveX = 0;
- moveY = dims.height;
- break;
- case 'bottom-right':
- moveX = dims.width;
- moveY = dims.height;
- break;
- case 'center':
- moveX = dims.width / 2;
- moveY = dims.height / 2;
- break;
- }
-
- return new Effect.Parallel(
- [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }),
- new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}),
- new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition })
- ], Object.extend({
- beforeStartInternal: function(effect) {
- effect.effects[0].element.makePositioned();
- effect.effects[0].element.makeClipping(); },
- afterFinishInternal: function(effect) {
- effect.effects[0].element.hide();
- effect.effects[0].element.undoClipping();
- effect.effects[0].element.undoPositioned();
- effect.effects[0].element.setStyle(oldStyle); }
- }, options)
- );
-}
-
-Effect.Pulsate = function(element) {
- element = $(element);
- var options = arguments[1] || {};
- var oldOpacity = element.getInlineOpacity();
- var transition = options.transition || Effect.Transitions.sinoidal;
- var reverser = function(pos){ return transition(1-Effect.Transitions.pulse(pos)) };
- reverser.bind(transition);
- return new Effect.Opacity(element,
- Object.extend(Object.extend({ duration: 3.0, from: 0,
- afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); }
- }, options), {transition: reverser}));
-}
-
-Effect.Fold = function(element) {
- element = $(element);
- var oldStyle = {
- top: element.style.top,
- left: element.style.left,
- width: element.style.width,
- height: element.style.height };
- Element.makeClipping(element);
- return new Effect.Scale(element, 5, Object.extend({
- scaleContent: false,
- scaleX: false,
- afterFinishInternal: function(effect) {
- new Effect.Scale(element, 1, {
- scaleContent: false,
- scaleY: false,
- afterFinishInternal: function(effect) {
- effect.element.hide();
- effect.element.undoClipping();
- effect.element.setStyle(oldStyle);
- } });
- }}, arguments[1] || {}));
-};
-
-['setOpacity','getOpacity','getInlineOpacity','forceRerendering','setContentZoom',
- 'collectTextNodes','collectTextNodesIgnoreClass','childrenWithClassName'].each(
- function(f) { Element.Methods[f] = Element[f]; }
-);
-
-Element.Methods.visualEffect = function(element, effect, options) {
- s = effect.gsub(/_/, '-').camelize();
- effect_class = s.charAt(0).toUpperCase() + s.substring(1);
- new Effect[effect_class](element, options);
- return $(element);
-};
-
+// script.aculo.us effects.js v1.6.4, Wed Sep 06 11:30:58 CEST 2006\r
+\r
+// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)\r
+// Contributors:\r
+// Justin Palmer (http://encytemedia.com/)\r
+// Mark Pilgrim (http://diveintomark.org/)\r
+// Martin Bialasinki\r
+// \r
+// See scriptaculous.js for full license. \r
+\r
+// converts rgb() and #xxx to #xxxxxx format, \r
+// returns self (or first argument) if not convertable \r
+String.prototype.parseColor = function() { \r
+ var color = '#'; \r
+ if(this.slice(0,4) == 'rgb(') { \r
+ var cols = this.slice(4,this.length-1).split(','); \r
+ var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3); \r
+ } else { \r
+ if(this.slice(0,1) == '#') { \r
+ if(this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase(); \r
+ if(this.length==7) color = this.toLowerCase(); \r
+ } \r
+ } \r
+ return(color.length==7 ? color : (arguments[0] || this)); \r
+}\r
+\r
+/*--------------------------------------------------------------------------*/\r
+\r
+Element.collectTextNodes = function(element) { \r
+ return $A($(element).childNodes).collect( function(node) {\r
+ return (node.nodeType==3 ? node.nodeValue : \r
+ (node.hasChildNodes() ? Element.collectTextNodes(node) : ''));\r
+ }).flatten().join('');\r
+}\r
+\r
+Element.collectTextNodesIgnoreClass = function(element, className) { \r
+ return $A($(element).childNodes).collect( function(node) {\r
+ return (node.nodeType==3 ? node.nodeValue : \r
+ ((node.hasChildNodes() && !Element.hasClassName(node,className)) ? \r
+ Element.collectTextNodesIgnoreClass(node, className) : ''));\r
+ }).flatten().join('');\r
+}\r
+\r
+Element.setContentZoom = function(element, percent) {\r
+ element = $(element); \r
+ Element.setStyle(element, {fontSize: (percent/100) + 'em'}); \r
+ if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);\r
+}\r
+\r
+Element.getOpacity = function(element){ \r
+ var opacity;\r
+ if (opacity = Element.getStyle(element, 'opacity')) \r
+ return parseFloat(opacity); \r
+ if (opacity = (Element.getStyle(element, 'filter') || '').match(/alpha\(opacity=(.*)\)/)) \r
+ if(opacity[1]) return parseFloat(opacity[1]) / 100; \r
+ return 1.0; \r
+}\r
+\r
+Element.setOpacity = function(element, value){ \r
+ element= $(element); \r
+ if (value == 1){\r
+ Element.setStyle(element, { opacity: \r
+ (/Gecko/.test(navigator.userAgent) && !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? \r
+ 0.999999 : 1.0 });\r
+ if(/MSIE/.test(navigator.userAgent) && !window.opera) \r
+ Element.setStyle(element, {filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'')}); \r
+ } else { \r
+ if(value < 0.00001) value = 0; \r
+ Element.setStyle(element, {opacity: value});\r
+ if(/MSIE/.test(navigator.userAgent) && !window.opera) \r
+ Element.setStyle(element, \r
+ { filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'') +\r
+ 'alpha(opacity='+value*100+')' }); \r
+ }\r
+} \r
+ \r
+Element.getInlineOpacity = function(element){ \r
+ return $(element).style.opacity || '';\r
+} \r
+\r
+Element.childrenWithClassName = function(element, className, findFirst) {\r
+ var classNameRegExp = new RegExp("(^|\\s)" + className + "(\\s|$)");\r
+ var results = $A($(element).getElementsByTagName('*'))[findFirst ? 'detect' : 'select']( function(c) { \r
+ return (c.className && c.className.match(classNameRegExp));\r
+ });\r
+ if(!results) results = [];\r
+ return results;\r
+}\r
+\r
+Element.forceRerendering = function(element) {\r
+ try {\r
+ element = $(element);\r
+ var n = document.createTextNode(' ');\r
+ element.appendChild(n);\r
+ element.removeChild(n);\r
+ } catch(e) { }\r
+};\r
+\r
+/*--------------------------------------------------------------------------*/\r
+\r
+Array.prototype.call = function() {\r
+ var args = arguments;\r
+ this.each(function(f){ f.apply(this, args) });\r
+}\r
+\r
+/*--------------------------------------------------------------------------*/\r
+\r
+var Effect = {\r
+ _elementDoesNotExistError: {\r
+ name: 'ElementDoesNotExistError',\r
+ message: 'The specified DOM element does not exist, but is required for this effect to operate'\r
+ },\r
+ tagifyText: function(element) {\r
+ if(typeof Builder == 'undefined')\r
+ throw("Effect.tagifyText requires including script.aculo.us' builder.js library");\r
+ \r
+ var tagifyStyle = 'position:relative';\r
+ if(/MSIE/.test(navigator.userAgent) && !window.opera) tagifyStyle += ';zoom:1';\r
+ element = $(element);\r
+ $A(element.childNodes).each( function(child) {\r
+ if(child.nodeType==3) {\r
+ child.nodeValue.toArray().each( function(character) {\r
+ element.insertBefore(\r
+ Builder.node('span',{style: tagifyStyle},\r
+ character == ' ' ? String.fromCharCode(160) : character), \r
+ child);\r
+ });\r
+ Element.remove(child);\r
+ }\r
+ });\r
+ },\r
+ multiple: function(element, effect) {\r
+ var elements;\r
+ if(((typeof element == 'object') || \r
+ (typeof element == 'function')) && \r
+ (element.length))\r
+ elements = element;\r
+ else\r
+ elements = $(element).childNodes;\r
+ \r
+ var options = Object.extend({\r
+ speed: 0.1,\r
+ delay: 0.0\r
+ }, arguments[2] || {});\r
+ var masterDelay = options.delay;\r
+\r
+ $A(elements).each( function(element, index) {\r
+ new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay }));\r
+ });\r
+ },\r
+ PAIRS: {\r
+ 'slide': ['SlideDown','SlideUp'],\r
+ 'blind': ['BlindDown','BlindUp'],\r
+ 'appear': ['Appear','Fade']\r
+ },\r
+ toggle: function(element, effect) {\r
+ element = $(element);\r
+ effect = (effect || 'appear').toLowerCase();\r
+ var options = Object.extend({\r
+ queue: { position:'end', scope:(element.id || 'global'), limit: 1 }\r
+ }, arguments[2] || {});\r
+ Effect[element.visible() ? \r
+ Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);\r
+ }\r
+};\r
+\r
+var Effect2 = Effect; // deprecated\r
+\r
+/* ------------- transitions ------------- */\r
+\r
+Effect.Transitions = {}\r
+\r
+Effect.Transitions.linear = Prototype.K;\r
+\r
+Effect.Transitions.sinoidal = function(pos) {\r
+ return (-Math.cos(pos*Math.PI)/2) + 0.5;\r
+}\r
+Effect.Transitions.reverse = function(pos) {\r
+ return 1-pos;\r
+}\r
+Effect.Transitions.flicker = function(pos) {\r
+ return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;\r
+}\r
+Effect.Transitions.wobble = function(pos) {\r
+ return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;\r
+}\r
+Effect.Transitions.pulse = function(pos) {\r
+ return (Math.floor(pos*10) % 2 == 0 ? \r
+ (pos*10-Math.floor(pos*10)) : 1-(pos*10-Math.floor(pos*10)));\r
+}\r
+Effect.Transitions.none = function(pos) {\r
+ return 0;\r
+}\r
+Effect.Transitions.full = function(pos) {\r
+ return 1;\r
+}\r
+\r
+/* ------------- core effects ------------- */\r
+\r
+Effect.ScopedQueue = Class.create();\r
+Object.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), {\r
+ initialize: function() {\r
+ this.effects = [];\r
+ this.interval = null;\r
+ },\r
+ _each: function(iterator) {\r
+ this.effects._each(iterator);\r
+ },\r
+ add: function(effect) {\r
+ var timestamp = new Date().getTime();\r
+ \r
+ var position = (typeof effect.options.queue == 'string') ? \r
+ effect.options.queue : effect.options.queue.position;\r
+ \r
+ switch(position) {\r
+ case 'front':\r
+ // move unstarted effects after this effect \r
+ this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) {\r
+ e.startOn += effect.finishOn;\r
+ e.finishOn += effect.finishOn;\r
+ });\r
+ break;\r
+ case 'end':\r
+ // start effect after last queued effect has finished\r
+ timestamp = this.effects.pluck('finishOn').max() || timestamp;\r
+ break;\r
+ }\r
+ \r
+ effect.startOn += timestamp;\r
+ effect.finishOn += timestamp;\r
+\r
+ if(!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))\r
+ this.effects.push(effect);\r
+ \r
+ if(!this.interval) \r
+ this.interval = setInterval(this.loop.bind(this), 40);\r
+ },\r
+ remove: function(effect) {\r
+ this.effects = this.effects.reject(function(e) { return e==effect });\r
+ if(this.effects.length == 0) {\r
+ clearInterval(this.interval);\r
+ this.interval = null;\r
+ }\r
+ },\r
+ loop: function() {\r
+ var timePos = new Date().getTime();\r
+ this.effects.invoke('loop', timePos);\r
+ }\r
+});\r
+\r
+Effect.Queues = {\r
+ instances: $H(),\r
+ get: function(queueName) {\r
+ if(typeof queueName != 'string') return queueName;\r
+ \r
+ if(!this.instances[queueName])\r
+ this.instances[queueName] = new Effect.ScopedQueue();\r
+ \r
+ return this.instances[queueName];\r
+ }\r
+}\r
+Effect.Queue = Effect.Queues.get('global');\r
+\r
+Effect.DefaultOptions = {\r
+ transition: Effect.Transitions.sinoidal,\r
+ duration: 1.0, // seconds\r
+ fps: 25.0, // max. 25fps due to Effect.Queue implementation\r
+ sync: false, // true for combining\r
+ from: 0.0,\r
+ to: 1.0,\r
+ delay: 0.0,\r
+ queue: 'parallel'\r
+}\r
+\r
+Effect.Base = function() {};\r
+Effect.Base.prototype = {\r
+ position: null,\r
+ start: function(options) {\r
+ this.options = Object.extend(Object.extend({},Effect.DefaultOptions), options || {});\r
+ this.currentFrame = 0;\r
+ this.state = 'idle';\r
+ this.startOn = this.options.delay*1000;\r
+ this.finishOn = this.startOn + (this.options.duration*1000);\r
+ this.event('beforeStart');\r
+ if(!this.options.sync)\r
+ Effect.Queues.get(typeof this.options.queue == 'string' ? \r
+ 'global' : this.options.queue.scope).add(this);\r
+ },\r
+ loop: function(timePos) {\r
+ if(timePos >= this.startOn) {\r
+ if(timePos >= this.finishOn) {\r
+ this.render(1.0);\r
+ this.cancel();\r
+ this.event('beforeFinish');\r
+ if(this.finish) this.finish(); \r
+ this.event('afterFinish');\r
+ return; \r
+ }\r
+ var pos = (timePos - this.startOn) / (this.finishOn - this.startOn);\r
+ var frame = Math.round(pos * this.options.fps * this.options.duration);\r
+ if(frame > this.currentFrame) {\r
+ this.render(pos);\r
+ this.currentFrame = frame;\r
+ }\r
+ }\r
+ },\r
+ render: function(pos) {\r
+ if(this.state == 'idle') {\r
+ this.state = 'running';\r
+ this.event('beforeSetup');\r
+ if(this.setup) this.setup();\r
+ this.event('afterSetup');\r
+ }\r
+ if(this.state == 'running') {\r
+ if(this.options.transition) pos = this.options.transition(pos);\r
+ pos *= (this.options.to-this.options.from);\r
+ pos += this.options.from;\r
+ this.position = pos;\r
+ this.event('beforeUpdate');\r
+ if(this.update) this.update(pos);\r
+ this.event('afterUpdate');\r
+ }\r
+ },\r
+ cancel: function() {\r
+ if(!this.options.sync)\r
+ Effect.Queues.get(typeof this.options.queue == 'string' ? \r
+ 'global' : this.options.queue.scope).remove(this);\r
+ this.state = 'finished';\r
+ },\r
+ event: function(eventName) {\r
+ if(this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);\r
+ if(this.options[eventName]) this.options[eventName](this);\r
+ },\r
+ inspect: function() {\r
+ return '#<Effect:' + $H(this).inspect() + ',options:' + $H(this.options).inspect() + '>';\r
+ }\r
+}\r
+\r
+Effect.Parallel = Class.create();\r
+Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), {\r
+ initialize: function(effects) {\r
+ this.effects = effects || [];\r
+ this.start(arguments[1]);\r
+ },\r
+ update: function(position) {\r
+ this.effects.invoke('render', position);\r
+ },\r
+ finish: function(position) {\r
+ this.effects.each( function(effect) {\r
+ effect.render(1.0);\r
+ effect.cancel();\r
+ effect.event('beforeFinish');\r
+ if(effect.finish) effect.finish(position);\r
+ effect.event('afterFinish');\r
+ });\r
+ }\r
+});\r
+\r
+Effect.Opacity = Class.create();\r
+Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), {\r
+ initialize: function(element) {\r
+ this.element = $(element);\r
+ if(!this.element) throw(Effect._elementDoesNotExistError);\r
+ // make this work on IE on elements without 'layout'\r
+ if(/MSIE/.test(navigator.userAgent) && !window.opera && (!this.element.currentStyle.hasLayout))\r
+ this.element.setStyle({zoom: 1});\r
+ var options = Object.extend({\r
+ from: this.element.getOpacity() || 0.0,\r
+ to: 1.0\r
+ }, arguments[1] || {});\r
+ this.start(options);\r
+ },\r
+ update: function(position) {\r
+ this.element.setOpacity(position);\r
+ }\r
+});\r
+\r
+Effect.Move = Class.create();\r
+Object.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), {\r
+ initialize: function(element) {\r
+ this.element = $(element);\r
+ if(!this.element) throw(Effect._elementDoesNotExistError);\r
+ var options = Object.extend({\r
+ x: 0,\r
+ y: 0,\r
+ mode: 'relative'\r
+ }, arguments[1] || {});\r
+ this.start(options);\r
+ },\r
+ setup: function() {\r
+ // Bug in Opera: Opera returns the "real" position of a static element or\r
+ // relative element that does not have top/left explicitly set.\r
+ // ==> Always set top and left for position relative elements in your stylesheets \r
+ // (to 0 if you do not need them) \r
+ this.element.makePositioned();\r
+ this.originalLeft = parseFloat(this.element.getStyle('left') || '0');\r
+ this.originalTop = parseFloat(this.element.getStyle('top') || '0');\r
+ if(this.options.mode == 'absolute') {\r
+ // absolute movement, so we need to calc deltaX and deltaY\r
+ this.options.x = this.options.x - this.originalLeft;\r
+ this.options.y = this.options.y - this.originalTop;\r
+ }\r
+ },\r
+ update: function(position) {\r
+ this.element.setStyle({\r
+ left: Math.round(this.options.x * position + this.originalLeft) + 'px',\r
+ top: Math.round(this.options.y * position + this.originalTop) + 'px'\r
+ });\r
+ }\r
+});\r
+\r
+// for backwards compatibility\r
+Effect.MoveBy = function(element, toTop, toLeft) {\r
+ return new Effect.Move(element, \r
+ Object.extend({ x: toLeft, y: toTop }, arguments[3] || {}));\r
+};\r
+\r
+Effect.Scale = Class.create();\r
+Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), {\r
+ initialize: function(element, percent) {\r
+ this.element = $(element);\r
+ if(!this.element) throw(Effect._elementDoesNotExistError);\r
+ var options = Object.extend({\r
+ scaleX: true,\r
+ scaleY: true,\r
+ scaleContent: true,\r
+ scaleFromCenter: false,\r
+ scaleMode: 'box', // 'box' or 'contents' or {} with provided values\r
+ scaleFrom: 100.0,\r
+ scaleTo: percent\r
+ }, arguments[2] || {});\r
+ this.start(options);\r
+ },\r
+ setup: function() {\r
+ this.restoreAfterFinish = this.options.restoreAfterFinish || false;\r
+ this.elementPositioning = this.element.getStyle('position');\r
+ \r
+ this.originalStyle = {};\r
+ ['top','left','width','height','fontSize'].each( function(k) {\r
+ this.originalStyle[k] = this.element.style[k];\r
+ }.bind(this));\r
+ \r
+ this.originalTop = this.element.offsetTop;\r
+ this.originalLeft = this.element.offsetLeft;\r
+ \r
+ var fontSize = this.element.getStyle('font-size') || '100%';\r
+ ['em','px','%','pt'].each( function(fontSizeType) {\r
+ if(fontSize.indexOf(fontSizeType)>0) {\r
+ this.fontSize = parseFloat(fontSize);\r
+ this.fontSizeType = fontSizeType;\r
+ }\r
+ }.bind(this));\r
+ \r
+ this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;\r
+ \r
+ this.dims = null;\r
+ if(this.options.scaleMode=='box')\r
+ this.dims = [this.element.offsetHeight, this.element.offsetWidth];\r
+ if(/^content/.test(this.options.scaleMode))\r
+ this.dims = [this.element.scrollHeight, this.element.scrollWidth];\r
+ if(!this.dims)\r
+ this.dims = [this.options.scaleMode.originalHeight,\r
+ this.options.scaleMode.originalWidth];\r
+ },\r
+ update: function(position) {\r
+ var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);\r
+ if(this.options.scaleContent && this.fontSize)\r
+ this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType });\r
+ this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);\r
+ },\r
+ finish: function(position) {\r
+ if (this.restoreAfterFinish) this.element.setStyle(this.originalStyle);\r
+ },\r
+ setDimensions: function(height, width) {\r
+ var d = {};\r
+ if(this.options.scaleX) d.width = Math.round(width) + 'px';\r
+ if(this.options.scaleY) d.height = Math.round(height) + 'px';\r
+ if(this.options.scaleFromCenter) {\r
+ var topd = (height - this.dims[0])/2;\r
+ var leftd = (width - this.dims[1])/2;\r
+ if(this.elementPositioning == 'absolute') {\r
+ if(this.options.scaleY) d.top = this.originalTop-topd + 'px';\r
+ if(this.options.scaleX) d.left = this.originalLeft-leftd + 'px';\r
+ } else {\r
+ if(this.options.scaleY) d.top = -topd + 'px';\r
+ if(this.options.scaleX) d.left = -leftd + 'px';\r
+ }\r
+ }\r
+ this.element.setStyle(d);\r
+ }\r
+});\r
+\r
+Effect.Highlight = Class.create();\r
+Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), {\r
+ initialize: function(element) {\r
+ this.element = $(element);\r
+ if(!this.element) throw(Effect._elementDoesNotExistError);\r
+ var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || {});\r
+ this.start(options);\r
+ },\r
+ setup: function() {\r
+ // Prevent executing on elements not in the layout flow\r
+ if(this.element.getStyle('display')=='none') { this.cancel(); return; }\r
+ // Disable background image during the effect\r
+ this.oldStyle = {\r
+ backgroundImage: this.element.getStyle('background-image') };\r
+ this.element.setStyle({backgroundImage: 'none'});\r
+ if(!this.options.endcolor)\r
+ this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff');\r
+ if(!this.options.restorecolor)\r
+ this.options.restorecolor = this.element.getStyle('background-color');\r
+ // init color calculations\r
+ this._base = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this));\r
+ this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this));\r
+ },\r
+ update: function(position) {\r
+ this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){\r
+ return m+(Math.round(this._base[i]+(this._delta[i]*position)).toColorPart()); }.bind(this)) });\r
+ },\r
+ finish: function() {\r
+ this.element.setStyle(Object.extend(this.oldStyle, {\r
+ backgroundColor: this.options.restorecolor\r
+ }));\r
+ }\r
+});\r
+\r
+Effect.ScrollTo = Class.create();\r
+Object.extend(Object.extend(Effect.ScrollTo.prototype, Effect.Base.prototype), {\r
+ initialize: function(element) {\r
+ this.element = $(element);\r
+ this.start(arguments[1] || {});\r
+ },\r
+ setup: function() {\r
+ Position.prepare();\r
+ var offsets = Position.cumulativeOffset(this.element);\r
+ if(this.options.offset) offsets[1] += this.options.offset;\r
+ var max = window.innerHeight ? \r
+ window.height - window.innerHeight :\r
+ document.body.scrollHeight - \r
+ (document.documentElement.clientHeight ? \r
+ document.documentElement.clientHeight : document.body.clientHeight);\r
+ this.scrollStart = Position.deltaY;\r
+ this.delta = (offsets[1] > max ? max : offsets[1]) - this.scrollStart;\r
+ },\r
+ update: function(position) {\r
+ Position.prepare();\r
+ window.scrollTo(Position.deltaX, \r
+ this.scrollStart + (position*this.delta));\r
+ }\r
+});\r
+\r
+/* ------------- combination effects ------------- */\r
+\r
+Effect.Fade = function(element) {\r
+ element = $(element);\r
+ var oldOpacity = element.getInlineOpacity();\r
+ var options = Object.extend({\r
+ from: element.getOpacity() || 1.0,\r
+ to: 0.0,\r
+ afterFinishInternal: function(effect) { \r
+ if(effect.options.to!=0) return;\r
+ effect.element.hide();\r
+ effect.element.setStyle({opacity: oldOpacity}); \r
+ }}, arguments[1] || {});\r
+ return new Effect.Opacity(element,options);\r
+}\r
+\r
+Effect.Appear = function(element) {\r
+ element = $(element);\r
+ var options = Object.extend({\r
+ from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0),\r
+ to: 1.0,\r
+ // force Safari to render floated elements properly\r
+ afterFinishInternal: function(effect) {\r
+ effect.element.forceRerendering();\r
+ },\r
+ beforeSetup: function(effect) {\r
+ effect.element.setOpacity(effect.options.from);\r
+ effect.element.show(); \r
+ }}, arguments[1] || {});\r
+ return new Effect.Opacity(element,options);\r
+}\r
+\r
+Effect.Puff = function(element) {\r
+ element = $(element);\r
+ var oldStyle = { \r
+ opacity: element.getInlineOpacity(), \r
+ position: element.getStyle('position'),\r
+ top: element.style.top,\r
+ left: element.style.left,\r
+ width: element.style.width,\r
+ height: element.style.height\r
+ };\r
+ return new Effect.Parallel(\r
+ [ new Effect.Scale(element, 200, \r
+ { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }), \r
+ new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], \r
+ Object.extend({ duration: 1.0, \r
+ beforeSetupInternal: function(effect) {\r
+ Position.absolutize(effect.effects[0].element)\r
+ },\r
+ afterFinishInternal: function(effect) {\r
+ effect.effects[0].element.hide();\r
+ effect.effects[0].element.setStyle(oldStyle); }\r
+ }, arguments[1] || {})\r
+ );\r
+}\r
+\r
+Effect.BlindUp = function(element) {\r
+ element = $(element);\r
+ element.makeClipping();\r
+ return new Effect.Scale(element, 0,\r
+ Object.extend({ scaleContent: false, \r
+ scaleX: false, \r
+ restoreAfterFinish: true,\r
+ afterFinishInternal: function(effect) {\r
+ effect.element.hide();\r
+ effect.element.undoClipping();\r
+ } \r
+ }, arguments[1] || {})\r
+ );\r
+}\r
+\r
+Effect.BlindDown = function(element) {\r
+ element = $(element);\r
+ var elementDimensions = element.getDimensions();\r
+ return new Effect.Scale(element, 100, Object.extend({ \r
+ scaleContent: false, \r
+ scaleX: false,\r
+ scaleFrom: 0,\r
+ scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},\r
+ restoreAfterFinish: true,\r
+ afterSetup: function(effect) {\r
+ effect.element.makeClipping();\r
+ effect.element.setStyle({height: '0px'});\r
+ effect.element.show(); \r
+ }, \r
+ afterFinishInternal: function(effect) {\r
+ effect.element.undoClipping();\r
+ }\r
+ }, arguments[1] || {}));\r
+}\r
+\r
+Effect.SwitchOff = function(element) {\r
+ element = $(element);\r
+ var oldOpacity = element.getInlineOpacity();\r
+ return new Effect.Appear(element, Object.extend({\r
+ duration: 0.4,\r
+ from: 0,\r
+ transition: Effect.Transitions.flicker,\r
+ afterFinishInternal: function(effect) {\r
+ new Effect.Scale(effect.element, 1, { \r
+ duration: 0.3, scaleFromCenter: true,\r
+ scaleX: false, scaleContent: false, restoreAfterFinish: true,\r
+ beforeSetup: function(effect) { \r
+ effect.element.makePositioned();\r
+ effect.element.makeClipping();\r
+ },\r
+ afterFinishInternal: function(effect) {\r
+ effect.element.hide();\r
+ effect.element.undoClipping();\r
+ effect.element.undoPositioned();\r
+ effect.element.setStyle({opacity: oldOpacity});\r
+ }\r
+ })\r
+ }\r
+ }, arguments[1] || {}));\r
+}\r
+\r
+Effect.DropOut = function(element) {\r
+ element = $(element);\r
+ var oldStyle = {\r
+ top: element.getStyle('top'),\r
+ left: element.getStyle('left'),\r
+ opacity: element.getInlineOpacity() };\r
+ return new Effect.Parallel(\r
+ [ new Effect.Move(element, {x: 0, y: 100, sync: true }), \r
+ new Effect.Opacity(element, { sync: true, to: 0.0 }) ],\r
+ Object.extend(\r
+ { duration: 0.5,\r
+ beforeSetup: function(effect) {\r
+ effect.effects[0].element.makePositioned(); \r
+ },\r
+ afterFinishInternal: function(effect) {\r
+ effect.effects[0].element.hide();\r
+ effect.effects[0].element.undoPositioned();\r
+ effect.effects[0].element.setStyle(oldStyle);\r
+ } \r
+ }, arguments[1] || {}));\r
+}\r
+\r
+Effect.Shake = function(element) {\r
+ element = $(element);\r
+ var oldStyle = {\r
+ top: element.getStyle('top'),\r
+ left: element.getStyle('left') };\r
+ return new Effect.Move(element, \r
+ { x: 20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {\r
+ new Effect.Move(effect.element,\r
+ { x: -40, y: 0, duration: 0.1, afterFinishInternal: function(effect) {\r
+ new Effect.Move(effect.element,\r
+ { x: 40, y: 0, duration: 0.1, afterFinishInternal: function(effect) {\r
+ new Effect.Move(effect.element,\r
+ { x: -40, y: 0, duration: 0.1, afterFinishInternal: function(effect) {\r
+ new Effect.Move(effect.element,\r
+ { x: 40, y: 0, duration: 0.1, afterFinishInternal: function(effect) {\r
+ new Effect.Move(effect.element,\r
+ { x: -20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {\r
+ effect.element.undoPositioned();\r
+ effect.element.setStyle(oldStyle);\r
+ }}) }}) }}) }}) }}) }});\r
+}\r
+\r
+Effect.SlideDown = function(element) {\r
+ element = $(element);\r
+ element.cleanWhitespace();\r
+ // SlideDown need to have the content of the element wrapped in a container element with fixed height!\r
+ var oldInnerBottom = $(element.firstChild).getStyle('bottom');\r
+ var elementDimensions = element.getDimensions();\r
+ return new Effect.Scale(element, 100, Object.extend({ \r
+ scaleContent: false, \r
+ scaleX: false, \r
+ scaleFrom: window.opera ? 0 : 1,\r
+ scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},\r
+ restoreAfterFinish: true,\r
+ afterSetup: function(effect) {\r
+ effect.element.makePositioned();\r
+ effect.element.firstChild.makePositioned();\r
+ if(window.opera) effect.element.setStyle({top: ''});\r
+ effect.element.makeClipping();\r
+ effect.element.setStyle({height: '0px'});\r
+ effect.element.show(); },\r
+ afterUpdateInternal: function(effect) {\r
+ effect.element.firstChild.setStyle({bottom:\r
+ (effect.dims[0] - effect.element.clientHeight) + 'px' }); \r
+ },\r
+ afterFinishInternal: function(effect) {\r
+ effect.element.undoClipping(); \r
+ // IE will crash if child is undoPositioned first\r
+ if(/MSIE/.test(navigator.userAgent) && !window.opera){\r
+ effect.element.undoPositioned();\r
+ effect.element.firstChild.undoPositioned();\r
+ }else{\r
+ effect.element.firstChild.undoPositioned();\r
+ effect.element.undoPositioned();\r
+ }\r
+ effect.element.firstChild.setStyle({bottom: oldInnerBottom}); }\r
+ }, arguments[1] || {})\r
+ );\r
+}\r
+\r
+Effect.SlideUp = function(element) {\r
+ element = $(element);\r
+ element.cleanWhitespace();\r
+ var oldInnerBottom = $(element.firstChild).getStyle('bottom');\r
+ return new Effect.Scale(element, window.opera ? 0 : 1,\r
+ Object.extend({ scaleContent: false, \r
+ scaleX: false, \r
+ scaleMode: 'box',\r
+ scaleFrom: 100,\r
+ restoreAfterFinish: true,\r
+ beforeStartInternal: function(effect) {\r
+ effect.element.makePositioned();\r
+ effect.element.firstChild.makePositioned();\r
+ if(window.opera) effect.element.setStyle({top: ''});\r
+ effect.element.makeClipping();\r
+ effect.element.show(); }, \r
+ afterUpdateInternal: function(effect) {\r
+ effect.element.firstChild.setStyle({bottom:\r
+ (effect.dims[0] - effect.element.clientHeight) + 'px' }); },\r
+ afterFinishInternal: function(effect) {\r
+ effect.element.hide();\r
+ effect.element.undoClipping();\r
+ effect.element.firstChild.undoPositioned();\r
+ effect.element.undoPositioned();\r
+ effect.element.setStyle({bottom: oldInnerBottom}); }\r
+ }, arguments[1] || {})\r
+ );\r
+}\r
+\r
+// Bug in opera makes the TD containing this element expand for a instance after finish \r
+Effect.Squish = function(element) {\r
+ return new Effect.Scale(element, window.opera ? 1 : 0, \r
+ { restoreAfterFinish: true,\r
+ beforeSetup: function(effect) {\r
+ effect.element.makeClipping(effect.element); }, \r
+ afterFinishInternal: function(effect) {\r
+ effect.element.hide(effect.element); \r
+ effect.element.undoClipping(effect.element); }\r
+ });\r
+}\r
+\r
+Effect.Grow = function(element) {\r
+ element = $(element);\r
+ var options = Object.extend({\r
+ direction: 'center',\r
+ moveTransition: Effect.Transitions.sinoidal,\r
+ scaleTransition: Effect.Transitions.sinoidal,\r
+ opacityTransition: Effect.Transitions.full\r
+ }, arguments[1] || {});\r
+ var oldStyle = {\r
+ top: element.style.top,\r
+ left: element.style.left,\r
+ height: element.style.height,\r
+ width: element.style.width,\r
+ opacity: element.getInlineOpacity() };\r
+\r
+ var dims = element.getDimensions(); \r
+ var initialMoveX, initialMoveY;\r
+ var moveX, moveY;\r
+ \r
+ switch (options.direction) {\r
+ case 'top-left':\r
+ initialMoveX = initialMoveY = moveX = moveY = 0; \r
+ break;\r
+ case 'top-right':\r
+ initialMoveX = dims.width;\r
+ initialMoveY = moveY = 0;\r
+ moveX = -dims.width;\r
+ break;\r
+ case 'bottom-left':\r
+ initialMoveX = moveX = 0;\r
+ initialMoveY = dims.height;\r
+ moveY = -dims.height;\r
+ break;\r
+ case 'bottom-right':\r
+ initialMoveX = dims.width;\r
+ initialMoveY = dims.height;\r
+ moveX = -dims.width;\r
+ moveY = -dims.height;\r
+ break;\r
+ case 'center':\r
+ initialMoveX = dims.width / 2;\r
+ initialMoveY = dims.height / 2;\r
+ moveX = -dims.width / 2;\r
+ moveY = -dims.height / 2;\r
+ break;\r
+ }\r
+ \r
+ return new Effect.Move(element, {\r
+ x: initialMoveX,\r
+ y: initialMoveY,\r
+ duration: 0.01, \r
+ beforeSetup: function(effect) {\r
+ effect.element.hide();\r
+ effect.element.makeClipping();\r
+ effect.element.makePositioned();\r
+ },\r
+ afterFinishInternal: function(effect) {\r
+ new Effect.Parallel(\r
+ [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }),\r
+ new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }),\r
+ new Effect.Scale(effect.element, 100, {\r
+ scaleMode: { originalHeight: dims.height, originalWidth: dims.width }, \r
+ sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})\r
+ ], Object.extend({\r
+ beforeSetup: function(effect) {\r
+ effect.effects[0].element.setStyle({height: '0px'});\r
+ effect.effects[0].element.show(); \r
+ },\r
+ afterFinishInternal: function(effect) {\r
+ effect.effects[0].element.undoClipping();\r
+ effect.effects[0].element.undoPositioned();\r
+ effect.effects[0].element.setStyle(oldStyle); \r
+ }\r
+ }, options)\r
+ )\r
+ }\r
+ });\r
+}\r
+\r
+Effect.Shrink = function(element) {\r
+ element = $(element);\r
+ var options = Object.extend({\r
+ direction: 'center',\r
+ moveTransition: Effect.Transitions.sinoidal,\r
+ scaleTransition: Effect.Transitions.sinoidal,\r
+ opacityTransition: Effect.Transitions.none\r
+ }, arguments[1] || {});\r
+ var oldStyle = {\r
+ top: element.style.top,\r
+ left: element.style.left,\r
+ height: element.style.height,\r
+ width: element.style.width,\r
+ opacity: element.getInlineOpacity() };\r
+\r
+ var dims = element.getDimensions();\r
+ var moveX, moveY;\r
+ \r
+ switch (options.direction) {\r
+ case 'top-left':\r
+ moveX = moveY = 0;\r
+ break;\r
+ case 'top-right':\r
+ moveX = dims.width;\r
+ moveY = 0;\r
+ break;\r
+ case 'bottom-left':\r
+ moveX = 0;\r
+ moveY = dims.height;\r
+ break;\r
+ case 'bottom-right':\r
+ moveX = dims.width;\r
+ moveY = dims.height;\r
+ break;\r
+ case 'center': \r
+ moveX = dims.width / 2;\r
+ moveY = dims.height / 2;\r
+ break;\r
+ }\r
+ \r
+ return new Effect.Parallel(\r
+ [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }),\r
+ new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}),\r
+ new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition })\r
+ ], Object.extend({ \r
+ beforeStartInternal: function(effect) {\r
+ effect.effects[0].element.makePositioned();\r
+ effect.effects[0].element.makeClipping(); },\r
+ afterFinishInternal: function(effect) {\r
+ effect.effects[0].element.hide();\r
+ effect.effects[0].element.undoClipping();\r
+ effect.effects[0].element.undoPositioned();\r
+ effect.effects[0].element.setStyle(oldStyle); }\r
+ }, options)\r
+ );\r
+}\r
+\r
+Effect.Pulsate = function(element) {\r
+ element = $(element);\r
+ var options = arguments[1] || {};\r
+ var oldOpacity = element.getInlineOpacity();\r
+ var transition = options.transition || Effect.Transitions.sinoidal;\r
+ var reverser = function(pos){ return transition(1-Effect.Transitions.pulse(pos)) };\r
+ reverser.bind(transition);\r
+ return new Effect.Opacity(element, \r
+ Object.extend(Object.extend({ duration: 3.0, from: 0,\r
+ afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); }\r
+ }, options), {transition: reverser}));\r
+}\r
+\r
+Effect.Fold = function(element) {\r
+ element = $(element);\r
+ var oldStyle = {\r
+ top: element.style.top,\r
+ left: element.style.left,\r
+ width: element.style.width,\r
+ height: element.style.height };\r
+ Element.makeClipping(element);\r
+ return new Effect.Scale(element, 5, Object.extend({ \r
+ scaleContent: false,\r
+ scaleX: false,\r
+ afterFinishInternal: function(effect) {\r
+ new Effect.Scale(element, 1, { \r
+ scaleContent: false, \r
+ scaleY: false,\r
+ afterFinishInternal: function(effect) {\r
+ effect.element.hide();\r
+ effect.element.undoClipping(); \r
+ effect.element.setStyle(oldStyle);\r
+ } });\r
+ }}, arguments[1] || {}));\r
+};\r
+\r
+['setOpacity','getOpacity','getInlineOpacity','forceRerendering','setContentZoom',\r
+ 'collectTextNodes','collectTextNodesIgnoreClass','childrenWithClassName'].each( \r
+ function(f) { Element.Methods[f] = Element[f]; }\r
+);\r
+\r
+Element.Methods.visualEffect = function(element, effect, options) {\r
+ s = effect.gsub(/_/, '-').camelize();\r
+ effect_class = s.charAt(0).toUpperCase() + s.substring(1);\r
+ new Effect[effect_class](element, options);\r
+ return $(element);\r
+};\r
+\r
Element.addMethods();
\ No newline at end of file
-/*
-Copyright (c) 2005 JSON.org
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The Software shall be used for Good, not Evil.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-*/
-
-/*
- The global object JSON contains two methods.
-
- JSON.stringify(value) takes a JavaScript value and produces a JSON text.
- The value must not be cyclical.
-
- JSON.parse(text) takes a JSON text and produces a JavaScript value. It will
- return false if there is an error.
-*/
-var JSON = function () {
- var m = {
- '\b': '\\b',
- '\t': '\\t',
- '\n': '\\n',
- '\f': '\\f',
- '\r': '\\r',
- '"' : '\\"',
- '\\': '\\\\'
- },
- s = {
- 'boolean': function (x) {
- return String(x);
- },
- number: function (x) {
- return isFinite(x) ? String(x) : 'null';
- },
- string: function (x) {
- if (/["\\\x00-\x1f]/.test(x)) {
- x = x.replace(/([\x00-\x1f\\"])/g, function(a, b) {
- var c = m[b];
- if (c) {
- return c;
- }
- c = b.charCodeAt();
- return '\\u00' +
- Math.floor(c / 16).toString(16) +
- (c % 16).toString(16);
- });
- }
- return '"' + x + '"';
- },
- object: function (x) {
- if (x) {
- var a = [], b, f, i, l, v;
- if (x instanceof Array) {
- a[0] = '[';
- l = x.length;
- for (i = 0; i < l; i += 1) {
- v = x[i];
- f = s[typeof v];
- if (f) {
- v = f(v);
- if (typeof v == 'string') {
- if (b) {
- a[a.length] = ',';
- }
- a[a.length] = v;
- b = true;
- }
- }
- }
- a[a.length] = ']';
- } else if (x instanceof Object) {
- a[0] = '{';
- for (i in x) {
- v = x[i];
- f = s[typeof v];
- if (f) {
- v = f(v);
- if (typeof v == 'string') {
- if (b) {
- a[a.length] = ',';
- }
- a.push(s.string(i), ':', v);
- b = true;
- }
- }
- }
- a[a.length] = '}';
- } else {
- return;
- }
- return a.join('');
- }
- return 'null';
- }
- };
- return {
- copyright: '(c)2005 JSON.org',
- license: 'http://www.crockford.com/JSON/license.html',
-/*
- Stringify a JavaScript value, producing a JSON text.
-*/
- stringify: function (v) {
- var f = s[typeof v];
- if (f) {
- v = f(v);
- if (typeof v == 'string') {
- return v;
- }
- }
- return null;
- },
-/*
- Parse a JSON text, producing a JavaScript value.
- It returns false if there is a syntax error.
-*/
- parse: function (text) {
- try {
- return !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(
- text.replace(/"(\\.|[^"\\])*"/g, ''))) &&
- eval('(' + text + ')');
- } catch (e) {
- return false;
- }
- }
- };
+/*\r
+Copyright (c) 2005 JSON.org\r
+\r
+Permission is hereby granted, free of charge, to any person obtaining a copy\r
+of this software and associated documentation files (the "Software"), to deal\r
+in the Software without restriction, including without limitation the rights\r
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r
+copies of the Software, and to permit persons to whom the Software is\r
+furnished to do so, subject to the following conditions:\r
+\r
+The Software shall be used for Good, not Evil.\r
+\r
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
+SOFTWARE.\r
+*/\r
+\r
+/*\r
+ The global object JSON contains two methods.\r
+\r
+ JSON.stringify(value) takes a JavaScript value and produces a JSON text.\r
+ The value must not be cyclical.\r
+\r
+ JSON.parse(text) takes a JSON text and produces a JavaScript value. It will\r
+ return false if there is an error.\r
+*/\r
+var JSON = function () {\r
+ var m = {\r
+ '\b': '\\b',\r
+ '\t': '\\t',\r
+ '\n': '\\n',\r
+ '\f': '\\f',\r
+ '\r': '\\r',\r
+ '"' : '\\"',\r
+ '\\': '\\\\'\r
+ },\r
+ s = {\r
+ 'boolean': function (x) {\r
+ return String(x);\r
+ },\r
+ number: function (x) {\r
+ return isFinite(x) ? String(x) : 'null';\r
+ },\r
+ string: function (x) {\r
+ if (/["\\\x00-\x1f]/.test(x)) {\r
+ x = x.replace(/([\x00-\x1f\\"])/g, function(a, b) {\r
+ var c = m[b];\r
+ if (c) {\r
+ return c;\r
+ }\r
+ c = b.charCodeAt();\r
+ return '\\u00' +\r
+ Math.floor(c / 16).toString(16) +\r
+ (c % 16).toString(16);\r
+ });\r
+ }\r
+ return '"' + x + '"';\r
+ },\r
+ object: function (x) {\r
+ if (x) {\r
+ var a = [], b, f, i, l, v;\r
+ if (x instanceof Array) {\r
+ a[0] = '[';\r
+ l = x.length;\r
+ for (i = 0; i < l; i += 1) {\r
+ v = x[i];\r
+ f = s[typeof v];\r
+ if (f) {\r
+ v = f(v);\r
+ if (typeof v == 'string') {\r
+ if (b) {\r
+ a[a.length] = ',';\r
+ }\r
+ a[a.length] = v;\r
+ b = true;\r
+ }\r
+ }\r
+ }\r
+ a[a.length] = ']';\r
+ } else if (x instanceof Object) {\r
+ a[0] = '{';\r
+ for (i in x) {\r
+ v = x[i];\r
+ f = s[typeof v];\r
+ if (f) {\r
+ v = f(v);\r
+ if (typeof v == 'string') {\r
+ if (b) {\r
+ a[a.length] = ',';\r
+ }\r
+ a.push(s.string(i), ':', v);\r
+ b = true;\r
+ }\r
+ }\r
+ }\r
+ a[a.length] = '}';\r
+ } else {\r
+ return;\r
+ }\r
+ return a.join('');\r
+ }\r
+ return 'null';\r
+ }\r
+ };\r
+ return {\r
+ copyright: '(c)2005 JSON.org',\r
+ license: 'http://www.crockford.com/JSON/license.html',\r
+/*\r
+ Stringify a JavaScript value, producing a JSON text.\r
+*/\r
+ stringify: function (v) {\r
+ var f = s[typeof v];\r
+ if (f) {\r
+ v = f(v);\r
+ if (typeof v == 'string') {\r
+ return v;\r
+ }\r
+ }\r
+ return null;\r
+ },\r
+/*\r
+ Parse a JSON text, producing a JavaScript value.\r
+ It returns false if there is a syntax error.\r
+*/\r
+ parse: function (text) {\r
+ try {\r
+ return !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(\r
+ text.replace(/"(\\.|[^"\\])*"/g, ''))) &&\r
+ eval('(' + text + ')');\r
+ } catch (e) {\r
+ return false;\r
+ }\r
+ }\r
+ };\r
}();
\ No newline at end of file
-/* Prototype JavaScript framework, version 1.5.0_rc1
- * (c) 2005 Sam Stephenson <sam@conio.net>
- *
- * Prototype is freely distributable under the terms of an MIT-style license.
- * For details, see the Prototype web site: http://prototype.conio.net/
- *
-/*--------------------------------------------------------------------------*/
-
-var Prototype = {
- Version: '1.5.0_rc1',
- ScriptFragment: '(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)',
-
- emptyFunction: function() {},
- K: function(x) {return x}
-}
-
-var Class = {
- create: function() {
- return function() {
- this.initialize.apply(this, arguments);
- }
- }
-}
-
-var Abstract = new Object();
-
-Object.extend = function(destination, source) {
- for (var property in source) {
- destination[property] = source[property];
- }
- return destination;
-}
-
-Object.extend(Object, {
- inspect: function(object) {
- try {
- if (object == undefined) return 'undefined';
- if (object == null) return 'null';
- return object.inspect ? object.inspect() : object.toString();
- } catch (e) {
- if (e instanceof RangeError) return '...';
- throw e;
- }
- },
-
- keys: function(object) {
- var keys = [];
- for (var property in object)
- keys.push(property);
- return keys;
- },
-
- values: function(object) {
- var values = [];
- for (var property in object)
- values.push(object[property]);
- return values;
- },
-
- clone: function(object) {
- return Object.extend({}, object);
- }
-});
-
-Function.prototype.bind = function() {
- var __method = this, args = $A(arguments), object = args.shift();
- return function() {
- return __method.apply(object, args.concat($A(arguments)));
- }
-}
-
-Function.prototype.bindAsEventListener = function(object) {
- var __method = this, args = $A(arguments), object = args.shift();
- return function(event) {
- return __method.apply(object, [( event || window.event)].concat(args).concat($A(arguments)));
- }
-}
-
-Object.extend(Number.prototype, {
- toColorPart: function() {
- var digits = this.toString(16);
- if (this < 16) return '0' + digits;
- return digits;
- },
-
- succ: function() {
- return this + 1;
- },
-
- times: function(iterator) {
- $R(0, this, true).each(iterator);
- return this;
- }
-});
-
-var Try = {
- these: function() {
- var returnValue;
-
- for (var i = 0; i < arguments.length; i++) {
- var lambda = arguments[i];
- try {
- returnValue = lambda();
- break;
- } catch (e) {}
- }
-
- return returnValue;
- }
-}
-
-/*--------------------------------------------------------------------------*/
-
-var PeriodicalExecuter = Class.create();
-PeriodicalExecuter.prototype = {
- initialize: function(callback, frequency) {
- this.callback = callback;
- this.frequency = frequency;
- this.currentlyExecuting = false;
-
- this.registerCallback();
- },
-
- registerCallback: function() {
- this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
- },
-
- stop: function() {
- if (!this.timer) return;
- clearInterval(this.timer);
- this.timer = null;
- },
-
- onTimerEvent: function() {
- if (!this.currentlyExecuting) {
- try {
- this.currentlyExecuting = true;
- this.callback(this);
- } finally {
- this.currentlyExecuting = false;
- }
- }
- }
-}
-Object.extend(String.prototype, {
- gsub: function(pattern, replacement) {
- var result = '', source = this, match;
- replacement = arguments.callee.prepareReplacement(replacement);
-
- while (source.length > 0) {
- if (match = source.match(pattern)) {
- result += source.slice(0, match.index);
- result += (replacement(match) || '').toString();
- source = source.slice(match.index + match[0].length);
- } else {
- result += source, source = '';
- }
- }
- return result;
- },
-
- sub: function(pattern, replacement, count) {
- replacement = this.gsub.prepareReplacement(replacement);
- count = count === undefined ? 1 : count;
-
- return this.gsub(pattern, function(match) {
- if (--count < 0) return match[0];
- return replacement(match);
- });
- },
-
- scan: function(pattern, iterator) {
- this.gsub(pattern, iterator);
- return this;
- },
-
- truncate: function(length, truncation) {
- length = length || 30;
- truncation = truncation === undefined ? '...' : truncation;
- return this.length > length ?
- this.slice(0, length - truncation.length) + truncation : this;
- },
-
- strip: function() {
- return this.replace(/^\s+/, '').replace(/\s+$/, '');
- },
-
- stripTags: function() {
- return this.replace(/<\/?[^>]+>/gi, '');
- },
-
- stripScripts: function() {
- return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');
- },
-
- extractScripts: function() {
- var matchAll = new RegExp(Prototype.ScriptFragment, 'img');
- var matchOne = new RegExp(Prototype.ScriptFragment, 'im');
- return (this.match(matchAll) || []).map(function(scriptTag) {
- return (scriptTag.match(matchOne) || ['', ''])[1];
- });
- },
-
- evalScripts: function() {
- return this.extractScripts().map(function(script) { return eval(script) });
- },
-
- escapeHTML: function() {
- var div = document.createElement('div');
- var text = document.createTextNode(this);
- div.appendChild(text);
- return div.innerHTML;
- },
-
- unescapeHTML: function() {
- var div = document.createElement('div');
- div.innerHTML = this.stripTags();
- return div.childNodes[0] ? div.childNodes[0].nodeValue : '';
- },
-
- toQueryParams: function() {
- var pairs = this.match(/^\??(.*)$/)[1].split('&');
- return pairs.inject({}, function(params, pairString) {
- var pair = pairString.split('=');
- var value = pair[1] ? decodeURIComponent(pair[1]) : undefined;
- params[decodeURIComponent(pair[0])] = value;
- return params;
- });
- },
-
- toArray: function() {
- return this.split('');
- },
-
- camelize: function() {
- var oStringList = this.split('-');
- if (oStringList.length == 1) return oStringList[0];
-
- var camelizedString = this.indexOf('-') == 0
- ? oStringList[0].charAt(0).toUpperCase() + oStringList[0].substring(1)
- : oStringList[0];
-
- for (var i = 1, len = oStringList.length; i < len; i++) {
- var s = oStringList[i];
- camelizedString += s.charAt(0).toUpperCase() + s.substring(1);
- }
-
- return camelizedString;
- },
-
- inspect: function(useDoubleQuotes) {
- var escapedString = this.replace(/\\/g, '\\\\');
- if (useDoubleQuotes)
- return '"' + escapedString.replace(/"/g, '\\"') + '"';
- else
- return "'" + escapedString.replace(/'/g, '\\\'') + "'";
- }
-});
-
-String.prototype.gsub.prepareReplacement = function(replacement) {
- if (typeof replacement == 'function') return replacement;
- var template = new Template(replacement);
- return function(match) { return template.evaluate(match) };
-}
-
-String.prototype.parseQuery = String.prototype.toQueryParams;
-
-var Template = Class.create();
-Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
-Template.prototype = {
- initialize: function(template, pattern) {
- this.template = template.toString();
- this.pattern = pattern || Template.Pattern;
- },
-
- evaluate: function(object) {
- return this.template.gsub(this.pattern, function(match) {
- var before = match[1];
- if (before == '\\') return match[2];
- return before + (object[match[3]] || '').toString();
- });
- }
-}
-
-var $break = new Object();
-var $continue = new Object();
-
-var Enumerable = {
- each: function(iterator) {
- var index = 0;
- try {
- this._each(function(value) {
- try {
- iterator(value, index++);
- } catch (e) {
- if (e != $continue) throw e;
- }
- });
- } catch (e) {
- if (e != $break) throw e;
- }
- },
-
- all: function(iterator) {
- var result = true;
- this.each(function(value, index) {
- result = result && !!(iterator || Prototype.K)(value, index);
- if (!result) throw $break;
- });
- return result;
- },
-
- any: function(iterator) {
- var result = false;
- this.each(function(value, index) {
- if (result = !!(iterator || Prototype.K)(value, index))
- throw $break;
- });
- return result;
- },
-
- collect: function(iterator) {
- var results = [];
- this.each(function(value, index) {
- results.push(iterator(value, index));
- });
- return results;
- },
-
- detect: function (iterator) {
- var result;
- this.each(function(value, index) {
- if (iterator(value, index)) {
- result = value;
- throw $break;
- }
- });
- return result;
- },
-
- findAll: function(iterator) {
- var results = [];
- this.each(function(value, index) {
- if (iterator(value, index))
- results.push(value);
- });
- return results;
- },
-
- grep: function(pattern, iterator) {
- var results = [];
- this.each(function(value, index) {
- var stringValue = value.toString();
- if (stringValue.match(pattern))
- results.push((iterator || Prototype.K)(value, index));
- })
- return results;
- },
-
- include: function(object) {
- var found = false;
- this.each(function(value) {
- if (value == object) {
- found = true;
- throw $break;
- }
- });
- return found;
- },
-
- inject: function(memo, iterator) {
- this.each(function(value, index) {
- memo = iterator(memo, value, index);
- });
- return memo;
- },
-
- invoke: function(method) {
- var args = $A(arguments).slice(1);
- return this.collect(function(value) {
- return value[method].apply(value, args);
- });
- },
-
- max: function(iterator) {
- var result;
- this.each(function(value, index) {
- value = (iterator || Prototype.K)(value, index);
- if (result == undefined || value >= result)
- result = value;
- });
- return result;
- },
-
- min: function(iterator) {
- var result;
- this.each(function(value, index) {
- value = (iterator || Prototype.K)(value, index);
- if (result == undefined || value < result)
- result = value;
- });
- return result;
- },
-
- partition: function(iterator) {
- var trues = [], falses = [];
- this.each(function(value, index) {
- ((iterator || Prototype.K)(value, index) ?
- trues : falses).push(value);
- });
- return [trues, falses];
- },
-
- pluck: function(property) {
- var results = [];
- this.each(function(value, index) {
- results.push(value[property]);
- });
- return results;
- },
-
- reject: function(iterator) {
- var results = [];
- this.each(function(value, index) {
- if (!iterator(value, index))
- results.push(value);
- });
- return results;
- },
-
- sortBy: function(iterator) {
- return this.collect(function(value, index) {
- return {value: value, criteria: iterator(value, index)};
- }).sort(function(left, right) {
- var a = left.criteria, b = right.criteria;
- return a < b ? -1 : a > b ? 1 : 0;
- }).pluck('value');
- },
-
- toArray: function() {
- return this.collect(Prototype.K);
- },
-
- zip: function() {
- var iterator = Prototype.K, args = $A(arguments);
- if (typeof args.last() == 'function')
- iterator = args.pop();
-
- var collections = [this].concat(args).map($A);
- return this.map(function(value, index) {
- return iterator(collections.pluck(index));
- });
- },
-
- inspect: function() {
- return '#<Enumerable:' + this.toArray().inspect() + '>';
- }
-}
-
-Object.extend(Enumerable, {
- map: Enumerable.collect,
- find: Enumerable.detect,
- select: Enumerable.findAll,
- member: Enumerable.include,
- entries: Enumerable.toArray
-});
-var $A = Array.from = function(iterable) {
- if (!iterable) return [];
- if (iterable.toArray) {
- return iterable.toArray();
- } else {
- var results = [];
- for (var i = 0; i < iterable.length; i++)
- results.push(iterable[i]);
- return results;
- }
-}
-
-Object.extend(Array.prototype, Enumerable);
-
-if (!Array.prototype._reverse)
- Array.prototype._reverse = Array.prototype.reverse;
-
-Object.extend(Array.prototype, {
- _each: function(iterator) {
- for (var i = 0; i < this.length; i++)
- iterator(this[i]);
- },
-
- clear: function() {
- this.length = 0;
- return this;
- },
-
- first: function() {
- return this[0];
- },
-
- last: function() {
- return this[this.length - 1];
- },
-
- compact: function() {
- return this.select(function(value) {
- return value != undefined || value != null;
- });
- },
-
- flatten: function() {
- return this.inject([], function(array, value) {
- return array.concat(value && value.constructor == Array ?
- value.flatten() : [value]);
- });
- },
-
- without: function() {
- var values = $A(arguments);
- return this.select(function(value) {
- return !values.include(value);
- });
- },
-
- indexOf: function(object) {
- for (var i = 0; i < this.length; i++)
- if (this[i] == object) return i;
- return -1;
- },
-
- reverse: function(inline) {
- return (inline !== false ? this : this.toArray())._reverse();
- },
-
- reduce: function() {
- return this.length > 1 ? this : this[0];
- },
-
- uniq: function() {
- return this.inject([], function(array, value) {
- return array.include(value) ? array : array.concat([value]);
- });
- },
-
- inspect: function() {
- return '[' + this.map(Object.inspect).join(', ') + ']';
- }
-});
-var Hash = {
- _each: function(iterator) {
- for (var key in this) {
- var value = this[key];
- if (typeof value == 'function') continue;
-
- var pair = [key, value];
- pair.key = key;
- pair.value = value;
- iterator(pair);
- }
- },
-
- keys: function() {
- return this.pluck('key');
- },
-
- values: function() {
- return this.pluck('value');
- },
-
- merge: function(hash) {
- return $H(hash).inject($H(this), function(mergedHash, pair) {
- mergedHash[pair.key] = pair.value;
- return mergedHash;
- });
- },
-
- toQueryString: function() {
- return this.map(function(pair) {
- return pair.map(encodeURIComponent).join('=');
- }).join('&');
- },
-
- inspect: function() {
- return '#<Hash:{' + this.map(function(pair) {
- return pair.map(Object.inspect).join(': ');
- }).join(', ') + '}>';
- }
-}
-
-function $H(object) {
- var hash = Object.extend({}, object || {});
- Object.extend(hash, Enumerable);
- Object.extend(hash, Hash);
- return hash;
-}
-ObjectRange = Class.create();
-Object.extend(ObjectRange.prototype, Enumerable);
-Object.extend(ObjectRange.prototype, {
- initialize: function(start, end, exclusive) {
- this.start = start;
- this.end = end;
- this.exclusive = exclusive;
- },
-
- _each: function(iterator) {
- var value = this.start;
- while (this.include(value)) {
- iterator(value);
- value = value.succ();
- }
- },
-
- include: function(value) {
- if (value < this.start)
- return false;
- if (this.exclusive)
- return value < this.end;
- return value <= this.end;
- }
-});
-
-var $R = function(start, end, exclusive) {
- return new ObjectRange(start, end, exclusive);
-}
-
-var Ajax = {
- getTransport: function() {
- return Try.these(
- function() {return new XMLHttpRequest()},
- function() {return new ActiveXObject('Msxml2.XMLHTTP')},
- function() {return new ActiveXObject('Microsoft.XMLHTTP')}
- ) || false;
- },
-
- activeRequestCount: 0
-}
-
-Ajax.Responders = {
- responders: [],
-
- _each: function(iterator) {
- this.responders._each(iterator);
- },
-
- register: function(responderToAdd) {
- if (!this.include(responderToAdd))
- this.responders.push(responderToAdd);
- },
-
- unregister: function(responderToRemove) {
- this.responders = this.responders.without(responderToRemove);
- },
-
- dispatch: function(callback, request, transport, json) {
- this.each(function(responder) {
- if (responder[callback] && typeof responder[callback] == 'function') {
- try {
- responder[callback].apply(responder, [request, transport, json]);
- } catch (e) {}
- }
- });
- }
-};
-
-Object.extend(Ajax.Responders, Enumerable);
-
-Ajax.Responders.register({
- onCreate: function() {
- Ajax.activeRequestCount++;
- },
-
- onComplete: function() {
- Ajax.activeRequestCount--;
- }
-});
-
-Ajax.Base = function() {};
-Ajax.Base.prototype = {
- setOptions: function(options) {
- this.options = {
- method: 'post',
- asynchronous: true,
- contentType: 'application/x-www-form-urlencoded',
- parameters: ''
- }
- Object.extend(this.options, options || {});
- },
-
- responseIsSuccess: function() {
- return this.transport.status == undefined
- || this.transport.status == 0
- || (this.transport.status >= 200 && this.transport.status < 300);
- },
-
- responseIsFailure: function() {
- return !this.responseIsSuccess();
- }
-}
-
-Ajax.Request = Class.create();
-Ajax.Request.Events =
- ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
-
-Ajax.Request.prototype = Object.extend(new Ajax.Base(), {
- initialize: function(url, options) {
- this.transport = Ajax.getTransport();
- this.setOptions(options);
- this.request(url);
- },
-
- request: function(url) {
- var parameters = this.options.parameters || '';
- if (parameters.length > 0) parameters += '&_=';
-
- /* Simulate other verbs over post */
- if (this.options.method != 'get' && this.options.method != 'post') {
- parameters += (parameters.length > 0 ? '&' : '') + '_method=' + this.options.method;
- this.options.method = 'post';
- }
-
- try {
- this.url = url;
- if (this.options.method == 'get' && parameters.length > 0)
- this.url += (this.url.match(/\?/) ? '&' : '?') + parameters;
-
- Ajax.Responders.dispatch('onCreate', this, this.transport);
-
- this.transport.open(this.options.method, this.url,
- this.options.asynchronous);
-
- if (this.options.asynchronous)
- setTimeout(function() { this.respondToReadyState(1) }.bind(this), 10);
-
- this.transport.onreadystatechange = this.onStateChange.bind(this);
- this.setRequestHeaders();
-
- var body = this.options.postBody ? this.options.postBody : parameters;
- this.transport.send(this.options.method == 'post' ? body : null);
-
- /* Force Firefox to handle ready state 4 for synchronous requests */
- if (!this.options.asynchronous && this.transport.overrideMimeType)
- this.onStateChange();
-
- } catch (e) {
- this.dispatchException(e);
- }
- },
-
- setRequestHeaders: function() {
- var requestHeaders =
- ['X-Requested-With', 'XMLHttpRequest',
- 'X-Prototype-Version', Prototype.Version,
- 'Accept', 'text/javascript, text/html, application/xml, text/xml, */*'];
-
- if (this.options.method == 'post') {
- requestHeaders.push('Content-type', this.options.contentType);
-
- /* Force "Connection: close" for Mozilla browsers to work around
- * a bug where XMLHttpReqeuest sends an incorrect Content-length
- * header. See Mozilla Bugzilla #246651.
- */
- if (this.transport.overrideMimeType)
- requestHeaders.push('Connection', 'close');
- }
-
- if (this.options.requestHeaders)
- requestHeaders.push.apply(requestHeaders, this.options.requestHeaders);
-
- for (var i = 0; i < requestHeaders.length; i += 2)
- this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]);
- },
-
- onStateChange: function() {
- var readyState = this.transport.readyState;
- if (readyState != 1)
- this.respondToReadyState(this.transport.readyState);
- },
-
- header: function(name) {
- try {
- return this.transport.getResponseHeader(name);
- } catch (e) {}
- },
-
- evalJSON: function() {
- try {
- return eval('(' + this.header('X-JSON') + ')');
- } catch (e) {}
- },
-
- evalResponse: function() {
- try {
- return eval(this.transport.responseText);
- } catch (e) {
- this.dispatchException(e);
- }
- },
-
- respondToReadyState: function(readyState) {
- var event = Ajax.Request.Events[readyState];
- var transport = this.transport, json = this.evalJSON();
-
- if (event == 'Complete') {
- try {
- (this.options['on' + this.transport.status]
- || this.options['on' + (this.responseIsSuccess() ? 'Success' : 'Failure')]
- || Prototype.emptyFunction)(transport, json);
- } catch (e) {
- this.dispatchException(e);
- }
-
- if ((this.header('Content-type') || '').match(/^text\/javascript/i))
- this.evalResponse();
- }
-
- try {
- (this.options['on' + event] || Prototype.emptyFunction)(transport, json);
- Ajax.Responders.dispatch('on' + event, this, transport, json);
- } catch (e) {
- this.dispatchException(e);
- }
-
- /* Avoid memory leak in MSIE: clean up the oncomplete event handler */
- if (event == 'Complete')
- this.transport.onreadystatechange = Prototype.emptyFunction;
- },
-
- dispatchException: function(exception) {
- (this.options.onException || Prototype.emptyFunction)(this, exception);
- Ajax.Responders.dispatch('onException', this, exception);
- }
-});
-
-Ajax.Updater = Class.create();
-
-Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), {
- initialize: function(container, url, options) {
- this.containers = {
- success: container.success ? $(container.success) : $(container),
- failure: container.failure ? $(container.failure) :
- (container.success ? null : $(container))
- }
-
- this.transport = Ajax.getTransport();
- this.setOptions(options);
-
- var onComplete = this.options.onComplete || Prototype.emptyFunction;
- this.options.onComplete = (function(transport, object) {
- this.updateContent();
- onComplete(transport, object);
- }).bind(this);
-
- this.request(url);
- },
-
- updateContent: function() {
- var receiver = this.responseIsSuccess() ?
- this.containers.success : this.containers.failure;
- var response = this.transport.responseText;
-
- if (!this.options.evalScripts)
- response = response.stripScripts();
-
- if (receiver) {
- if (this.options.insertion) {
- new this.options.insertion(receiver, response);
- } else {
- Element.update(receiver, response);
- }
- }
-
- if (this.responseIsSuccess()) {
- if (this.onComplete)
- setTimeout(this.onComplete.bind(this), 10);
- }
- }
-});
-
-Ajax.PeriodicalUpdater = Class.create();
-Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), {
- initialize: function(container, url, options) {
- this.setOptions(options);
- this.onComplete = this.options.onComplete;
-
- this.frequency = (this.options.frequency || 2);
- this.decay = (this.options.decay || 1);
-
- this.updater = {};
- this.container = container;
- this.url = url;
-
- this.start();
- },
-
- start: function() {
- this.options.onComplete = this.updateComplete.bind(this);
- this.onTimerEvent();
- },
-
- stop: function() {
- this.updater.options.onComplete = undefined;
- clearTimeout(this.timer);
- (this.onComplete || Prototype.emptyFunction).apply(this, arguments);
- },
-
- updateComplete: function(request) {
- if (this.options.decay) {
- this.decay = (request.responseText == this.lastText ?
- this.decay * this.options.decay : 1);
-
- this.lastText = request.responseText;
- }
- this.timer = setTimeout(this.onTimerEvent.bind(this),
- this.decay * this.frequency * 1000);
- },
-
- onTimerEvent: function() {
- this.updater = new Ajax.Updater(this.container, this.url, this.options);
- }
-});
-function $() {
- var results = [], element;
- for (var i = 0; i < arguments.length; i++) {
- element = arguments[i];
- if (typeof element == 'string')
- element = document.getElementById(element);
- results.push(Element.extend(element));
- }
- return results.reduce();
-}
-
-document.getElementsByClassName = function(className, parentElement) {
- var children = ($(parentElement) || document.body).getElementsByTagName('*');
- return $A(children).inject([], function(elements, child) {
- if (child.className.match(new RegExp("(^|\\s)" + className + "(\\s|$)")))
- elements.push(Element.extend(child));
- return elements;
- });
-}
-
-/*--------------------------------------------------------------------------*/
-
-if (!window.Element)
- var Element = new Object();
-
-Element.extend = function(element) {
- if (!element) return;
- if (_nativeExtensions || element.nodeType == 3) return element;
-
- if (!element._extended && element.tagName && element != window) {
- var methods = Object.clone(Element.Methods), cache = Element.extend.cache;
-
- if (element.tagName == 'FORM')
- Object.extend(methods, Form.Methods);
- if (['INPUT', 'TEXTAREA', 'SELECT'].include(element.tagName))
- Object.extend(methods, Form.Element.Methods);
-
- for (var property in methods) {
- var value = methods[property];
- if (typeof value == 'function')
- element[property] = cache.findOrStore(value);
- }
- }
-
- element._extended = true;
- return element;
-}
-
-Element.extend.cache = {
- findOrStore: function(value) {
- return this[value] = this[value] || function() {
- return value.apply(null, [this].concat($A(arguments)));
- }
- }
-}
-
-Element.Methods = {
- visible: function(element) {
- return $(element).style.display != 'none';
- },
-
- toggle: function(element) {
- element = $(element);
- Element[Element.visible(element) ? 'hide' : 'show'](element);
- return element;
- },
-
- hide: function(element) {
- $(element).style.display = 'none';
- return element;
- },
-
- show: function(element) {
- $(element).style.display = '';
- return element;
- },
-
- remove: function(element) {
- element = $(element);
- element.parentNode.removeChild(element);
- return element;
- },
-
- update: function(element, html) {
- $(element).innerHTML = html.stripScripts();
- setTimeout(function() {html.evalScripts()}, 10);
- return element;
- },
-
- replace: function(element, html) {
- element = $(element);
- if (element.outerHTML) {
- element.outerHTML = html.stripScripts();
- } else {
- var range = element.ownerDocument.createRange();
- range.selectNodeContents(element);
- element.parentNode.replaceChild(
- range.createContextualFragment(html.stripScripts()), element);
- }
- setTimeout(function() {html.evalScripts()}, 10);
- return element;
- },
-
- inspect: function(element) {
- element = $(element);
- var result = '<' + element.tagName.toLowerCase();
- $H({'id': 'id', 'className': 'class'}).each(function(pair) {
- var property = pair.first(), attribute = pair.last();
- var value = (element[property] || '').toString();
- if (value) result += ' ' + attribute + '=' + value.inspect(true);
- });
- return result + '>';
- },
-
- recursivelyCollect: function(element, property) {
- element = $(element);
- var elements = [];
- while (element = element[property])
- if (element.nodeType == 1)
- elements.push(Element.extend(element));
- return elements;
- },
-
- ancestors: function(element) {
- return $(element).recursivelyCollect('parentNode');
- },
-
- descendants: function(element) {
- element = $(element);
- return $A(element.getElementsByTagName('*'));
- },
-
- previousSiblings: function(element) {
- return $(element).recursivelyCollect('previousSibling');
- },
-
- nextSiblings: function(element) {
- return $(element).recursivelyCollect('nextSibling');
- },
-
- siblings: function(element) {
- element = $(element);
- return element.previousSiblings().reverse().concat(element.nextSiblings());
- },
-
- match: function(element, selector) {
- element = $(element);
- if (typeof selector == 'string')
- selector = new Selector(selector);
- return selector.match(element);
- },
-
- up: function(element, expression, index) {
- return Selector.findElement($(element).ancestors(), expression, index);
- },
-
- down: function(element, expression, index) {
- return Selector.findElement($(element).descendants(), expression, index);
- },
-
- previous: function(element, expression, index) {
- return Selector.findElement($(element).previousSiblings(), expression, index);
- },
-
- next: function(element, expression, index) {
- return Selector.findElement($(element).nextSiblings(), expression, index);
- },
-
- getElementsBySelector: function() {
- var args = $A(arguments), element = $(args.shift());
- return Selector.findChildElements(element, args);
- },
-
- getElementsByClassName: function(element, className) {
- element = $(element);
- return document.getElementsByClassName(className, element);
- },
-
- getHeight: function(element) {
- element = $(element);
- return element.offsetHeight;
- },
-
- classNames: function(element) {
- return new Element.ClassNames(element);
- },
-
- hasClassName: function(element, className) {
- if (!(element = $(element))) return;
- return Element.classNames(element).include(className);
- },
-
- addClassName: function(element, className) {
- if (!(element = $(element))) return;
- Element.classNames(element).add(className);
- return element;
- },
-
- removeClassName: function(element, className) {
- if (!(element = $(element))) return;
- Element.classNames(element).remove(className);
- return element;
- },
-
- observe: function() {
- Event.observe.apply(Event, arguments);
- return $A(arguments).first();
- },
-
- stopObserving: function() {
- Event.stopObserving.apply(Event, arguments);
- return $A(arguments).first();
- },
-
- // removes whitespace-only text node children
- cleanWhitespace: function(element) {
- element = $(element);
- var node = element.firstChild;
- while (node) {
- var nextNode = node.nextSibling;
- if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
- element.removeChild(node);
- node = nextNode;
- }
- return element;
- },
-
- empty: function(element) {
- return $(element).innerHTML.match(/^\s*$/);
- },
-
- childOf: function(element, ancestor) {
- element = $(element), ancestor = $(ancestor);
- while (element = element.parentNode)
- if (element == ancestor) return true;
- return false;
- },
-
- scrollTo: function(element) {
- element = $(element);
- var x = element.x ? element.x : element.offsetLeft,
- y = element.y ? element.y : element.offsetTop;
- window.scrollTo(x, y);
- return element;
- },
-
- getStyle: function(element, style) {
- element = $(element);
- var value = element.style[style.camelize()];
- if (!value) {
- if (document.defaultView && document.defaultView.getComputedStyle) {
- var css = document.defaultView.getComputedStyle(element, null);
- value = css ? css.getPropertyValue(style) : null;
- } else if (element.currentStyle) {
- value = element.currentStyle[style.camelize()];
- }
- }
-
- if (window.opera && ['left', 'top', 'right', 'bottom'].include(style))
- if (Element.getStyle(element, 'position') == 'static') value = 'auto';
-
- return value == 'auto' ? null : value;
- },
-
- setStyle: function(element, style) {
- element = $(element);
- for (var name in style)
- element.style[name.camelize()] = style[name];
- return element;
- },
-
- getDimensions: function(element) {
- element = $(element);
- if (Element.getStyle(element, 'display') != 'none')
- return {width: element.offsetWidth, height: element.offsetHeight};
-
- // All *Width and *Height properties give 0 on elements with display none,
- // so enable the element temporarily
- var els = element.style;
- var originalVisibility = els.visibility;
- var originalPosition = els.position;
- els.visibility = 'hidden';
- els.position = 'absolute';
- els.display = '';
- var originalWidth = element.clientWidth;
- var originalHeight = element.clientHeight;
- els.display = 'none';
- els.position = originalPosition;
- els.visibility = originalVisibility;
- return {width: originalWidth, height: originalHeight};
- },
-
- makePositioned: function(element) {
- element = $(element);
- var pos = Element.getStyle(element, 'position');
- if (pos == 'static' || !pos) {
- element._madePositioned = true;
- element.style.position = 'relative';
- // Opera returns the offset relative to the positioning context, when an
- // element is position relative but top and left have not been defined
- if (window.opera) {
- element.style.top = 0;
- element.style.left = 0;
- }
- }
- return element;
- },
-
- undoPositioned: function(element) {
- element = $(element);
- if (element._madePositioned) {
- element._madePositioned = undefined;
- element.style.position =
- element.style.top =
- element.style.left =
- element.style.bottom =
- element.style.right = '';
- }
- return element;
- },
-
- makeClipping: function(element) {
- element = $(element);
- if (element._overflow) return;
- element._overflow = element.style.overflow || 'auto';
- if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden')
- element.style.overflow = 'hidden';
- return element;
- },
-
- undoClipping: function(element) {
- element = $(element);
- if (!element._overflow) return;
- element.style.overflow = element._overflow == 'auto' ? '' : element._overflow;
- element._overflow = null;
- return element;
- }
-}
-
-// IE is missing .innerHTML support for TABLE-related elements
-if(document.all){
- Element.Methods.update = function(element, html) {
- element = $(element);
- var tagName = element.tagName.toUpperCase();
- if (['THEAD','TBODY','TR','TD'].indexOf(tagName) > -1) {
- var div = document.createElement('div');
- switch (tagName) {
- case 'THEAD':
- case 'TBODY':
- div.innerHTML = '<table><tbody>' + html.stripScripts() + '</tbody></table>';
- depth = 2;
- break;
- case 'TR':
- div.innerHTML = '<table><tbody><tr>' + html.stripScripts() + '</tr></tbody></table>';
- depth = 3;
- break;
- case 'TD':
- div.innerHTML = '<table><tbody><tr><td>' + html.stripScripts() + '</td></tr></tbody></table>';
- depth = 4;
- }
- $A(element.childNodes).each(function(node){
- element.removeChild(node)
- });
- depth.times(function(){ div = div.firstChild });
-
- $A(div.childNodes).each(
- function(node){ element.appendChild(node) });
- } else {
- element.innerHTML = html.stripScripts();
- }
- setTimeout(function() {html.evalScripts()}, 10);
- return element;
- }
-}
-
-Object.extend(Element, Element.Methods);
-
-var _nativeExtensions = false;
-
-if (!window.HTMLElement && /Konqueror|Safari|KHTML/.test(navigator.userAgent)) {
- /* Emulate HTMLElement, HTMLFormElement, HTMLInputElement, HTMLTextAreaElement,
- and HTMLSelectElement in Safari */
- ['', 'Form', 'Input', 'TextArea', 'Select'].each(function(tag) {
- var klass = window['HTML' + tag + 'Element'] = {};
- klass.prototype = document.createElement(tag ? tag.toLowerCase() : 'div').__proto__;
- });
-}
-
-Element.addMethods = function(methods) {
- Object.extend(Element.Methods, methods || {});
-
- function copy(methods, destination) {
- var cache = Element.extend.cache;
- for (var property in methods) {
- var value = methods[property];
- destination[property] = cache.findOrStore(value);
- }
- }
-
- if (typeof HTMLElement != 'undefined') {
- copy(Element.Methods, HTMLElement.prototype);
- copy(Form.Methods, HTMLFormElement.prototype);
- [HTMLInputElement, HTMLTextAreaElement, HTMLSelectElement].each(function(klass) {
- copy(Form.Element.Methods, klass.prototype);
- });
- _nativeExtensions = true;
- }
-}
-
-var Toggle = new Object();
-Toggle.display = Element.toggle;
-
-/*--------------------------------------------------------------------------*/
-
-Abstract.Insertion = function(adjacency) {
- this.adjacency = adjacency;
-}
-
-Abstract.Insertion.prototype = {
- initialize: function(element, content) {
- this.element = $(element);
- this.content = content.stripScripts();
-
- if (this.adjacency && this.element.insertAdjacentHTML) {
- try {
- this.element.insertAdjacentHTML(this.adjacency, this.content);
- } catch (e) {
- var tagName = this.element.tagName.toLowerCase();
- if (tagName == 'tbody' || tagName == 'tr') {
- this.insertContent(this.contentFromAnonymousTable());
- } else {
- throw e;
- }
- }
- } else {
- this.range = this.element.ownerDocument.createRange();
- if (this.initializeRange) this.initializeRange();
- this.insertContent([this.range.createContextualFragment(this.content)]);
- }
-
- setTimeout(function() {content.evalScripts()}, 10);
- },
-
- contentFromAnonymousTable: function() {
- var div = document.createElement('div');
- div.innerHTML = '<table><tbody>' + this.content + '</tbody></table>';
- return $A(div.childNodes[0].childNodes[0].childNodes);
- }
-}
-
-var Insertion = new Object();
-
-Insertion.Before = Class.create();
-Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), {
- initializeRange: function() {
- this.range.setStartBefore(this.element);
- },
-
- insertContent: function(fragments) {
- fragments.each((function(fragment) {
- this.element.parentNode.insertBefore(fragment, this.element);
- }).bind(this));
- }
-});
-
-Insertion.Top = Class.create();
-Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), {
- initializeRange: function() {
- this.range.selectNodeContents(this.element);
- this.range.collapse(true);
- },
-
- insertContent: function(fragments) {
- fragments.reverse(false).each((function(fragment) {
- this.element.insertBefore(fragment, this.element.firstChild);
- }).bind(this));
- }
-});
-
-Insertion.Bottom = Class.create();
-Insertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), {
- initializeRange: function() {
- this.range.selectNodeContents(this.element);
- this.range.collapse(this.element);
- },
-
- insertContent: function(fragments) {
- fragments.each((function(fragment) {
- this.element.appendChild(fragment);
- }).bind(this));
- }
-});
-
-Insertion.After = Class.create();
-Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), {
- initializeRange: function() {
- this.range.setStartAfter(this.element);
- },
-
- insertContent: function(fragments) {
- fragments.each((function(fragment) {
- this.element.parentNode.insertBefore(fragment,
- this.element.nextSibling);
- }).bind(this));
- }
-});
-
-/*--------------------------------------------------------------------------*/
-
-Element.ClassNames = Class.create();
-Element.ClassNames.prototype = {
- initialize: function(element) {
- this.element = $(element);
- },
-
- _each: function(iterator) {
- this.element.className.split(/\s+/).select(function(name) {
- return name.length > 0;
- })._each(iterator);
- },
-
- set: function(className) {
- this.element.className = className;
- },
-
- add: function(classNameToAdd) {
- if (this.include(classNameToAdd)) return;
- this.set(this.toArray().concat(classNameToAdd).join(' '));
- },
-
- remove: function(classNameToRemove) {
- if (!this.include(classNameToRemove)) return;
- this.set(this.select(function(className) {
- return className != classNameToRemove;
- }).join(' '));
- },
-
- toString: function() {
- return this.toArray().join(' ');
- }
-}
-
-Object.extend(Element.ClassNames.prototype, Enumerable);
-var Selector = Class.create();
-Selector.prototype = {
- initialize: function(expression) {
- this.params = {classNames: []};
- this.expression = expression.toString().strip();
- this.parseExpression();
- this.compileMatcher();
- },
-
- parseExpression: function() {
- function abort(message) { throw 'Parse error in selector: ' + message; }
-
- if (this.expression == '') abort('empty expression');
-
- var params = this.params, expr = this.expression, match, modifier, clause, rest;
- while (match = expr.match(/^(.*)\[([a-z0-9_:-]+?)(?:([~\|!]?=)(?:"([^"]*)"|([^\]\s]*)))?\]$/i)) {
- params.attributes = params.attributes || [];
- params.attributes.push({name: match[2], operator: match[3], value: match[4] || match[5] || ''});
- expr = match[1];
- }
-
- if (expr == '*') return this.params.wildcard = true;
-
- while (match = expr.match(/^([^a-z0-9_-])?([a-z0-9_-]+)(.*)/i)) {
- modifier = match[1], clause = match[2], rest = match[3];
- switch (modifier) {
- case '#': params.id = clause; break;
- case '.': params.classNames.push(clause); break;
- case '':
- case undefined: params.tagName = clause.toUpperCase(); break;
- default: abort(expr.inspect());
- }
- expr = rest;
- }
-
- if (expr.length > 0) abort(expr.inspect());
- },
-
- buildMatchExpression: function() {
- var params = this.params, conditions = [], clause;
-
- if (params.wildcard)
- conditions.push('true');
- if (clause = params.id)
- conditions.push('element.id == ' + clause.inspect());
- if (clause = params.tagName)
- conditions.push('element.tagName.toUpperCase() == ' + clause.inspect());
- if ((clause = params.classNames).length > 0)
- for (var i = 0; i < clause.length; i++)
- conditions.push('Element.hasClassName(element, ' + clause[i].inspect() + ')');
- if (clause = params.attributes) {
- clause.each(function(attribute) {
- var value = 'element.getAttribute(' + attribute.name.inspect() + ')';
- var splitValueBy = function(delimiter) {
- return value + ' && ' + value + '.split(' + delimiter.inspect() + ')';
- }
-
- switch (attribute.operator) {
- case '=': conditions.push(value + ' == ' + attribute.value.inspect()); break;
- case '~=': conditions.push(splitValueBy(' ') + '.include(' + attribute.value.inspect() + ')'); break;
- case '|=': conditions.push(
- splitValueBy('-') + '.first().toUpperCase() == ' + attribute.value.toUpperCase().inspect()
- ); break;
- case '!=': conditions.push(value + ' != ' + attribute.value.inspect()); break;
- case '':
- case undefined: conditions.push(value + ' != null'); break;
- default: throw 'Unknown operator ' + attribute.operator + ' in selector';
- }
- });
- }
-
- return conditions.join(' && ');
- },
-
- compileMatcher: function() {
- this.match = new Function('element', 'if (!element.tagName) return false; \
- return ' + this.buildMatchExpression());
- },
-
- findElements: function(scope) {
- var element;
-
- if (element = $(this.params.id))
- if (this.match(element))
- if (!scope || Element.childOf(element, scope))
- return [element];
-
- scope = (scope || document).getElementsByTagName(this.params.tagName || '*');
-
- var results = [];
- for (var i = 0; i < scope.length; i++)
- if (this.match(element = scope[i]))
- results.push(Element.extend(element));
-
- return results;
- },
-
- toString: function() {
- return this.expression;
- }
-}
-
-Object.extend(Selector, {
- matchElements: function(elements, expression) {
- var selector = new Selector(expression);
- return elements.select(selector.match.bind(selector));
- },
-
- findElement: function(elements, expression, index) {
- if (typeof expression == 'number') index = expression, expression = false;
- return Selector.matchElements(elements, expression || '*')[index || 0];
- },
-
- findChildElements: function(element, expressions) {
- return expressions.map(function(expression) {
- return expression.strip().split(/\s+/).inject([null], function(results, expr) {
- var selector = new Selector(expr);
- return results.inject([], function(elements, result) {
- return elements.concat(selector.findElements(result || element));
- });
- });
- }).flatten();
- }
-});
-
-function $$() {
- return Selector.findChildElements(document, $A(arguments));
-}
-var Form = {
- reset: function(form) {
- $(form).reset();
- return form;
- }
-};
-
-Form.Methods = {
- serialize: function(form) {
- var elements = Form.getElements($(form));
- var queryComponents = new Array();
-
- for (var i = 0; i < elements.length; i++) {
- var queryComponent = Form.Element.serialize(elements[i]);
- if (queryComponent)
- queryComponents.push(queryComponent);
- }
-
- return queryComponents.join('&');
- },
-
- getElements: function(form) {
- form = $(form);
- var elements = new Array();
-
- for (var tagName in Form.Element.Serializers) {
- var tagElements = form.getElementsByTagName(tagName);
- for (var j = 0; j < tagElements.length; j++)
- elements.push(tagElements[j]);
- }
- return elements;
- },
-
- getInputs: function(form, typeName, name) {
- form = $(form);
- var inputs = form.getElementsByTagName('input');
-
- if (!typeName && !name)
- return inputs;
-
- var matchingInputs = new Array();
- for (var i = 0; i < inputs.length; i++) {
- var input = inputs[i];
- if ((typeName && input.type != typeName) ||
- (name && input.name != name))
- continue;
- matchingInputs.push(input);
- }
-
- return matchingInputs;
- },
-
- disable: function(form) {
- form = $(form);
- var elements = Form.getElements(form);
- for (var i = 0; i < elements.length; i++) {
- var element = elements[i];
- element.blur();
- element.disabled = 'true';
- }
- return form;
- },
-
- enable: function(form) {
- form = $(form);
- var elements = Form.getElements(form);
- for (var i = 0; i < elements.length; i++) {
- var element = elements[i];
- element.disabled = '';
- }
- return form;
- },
-
- findFirstElement: function(form) {
- return Form.getElements(form).find(function(element) {
- return element.type != 'hidden' && !element.disabled &&
- ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());
- });
- },
-
- focusFirstElement: function(form) {
- form = $(form);
- Field.activate(Form.findFirstElement(form));
- return form;
- }
-}
-
-Object.extend(Form, Form.Methods);
-
-/*--------------------------------------------------------------------------*/
-
-Form.Element = {
- focus: function(element) {
- $(element).focus();
- return element;
- },
-
- select: function(element) {
- $(element).select();
- return element;
- }
-}
-
-Form.Element.Methods = {
- serialize: function(element) {
- element = $(element);
- var method = element.tagName.toLowerCase();
- var parameter = Form.Element.Serializers[method](element);
-
- if (parameter) {
- var key = encodeURIComponent(parameter[0]);
- if (key.length == 0) return;
-
- if (parameter[1].constructor != Array)
- parameter[1] = [parameter[1]];
-
- return parameter[1].map(function(value) {
- return key + '=' + encodeURIComponent(value);
- }).join('&');
- }
- },
-
- getValue: function(element) {
- element = $(element);
- var method = element.tagName.toLowerCase();
- var parameter = Form.Element.Serializers[method](element);
-
- if (parameter)
- return parameter[1];
- },
-
- clear: function(element) {
- $(element).value = '';
- return element;
- },
-
- present: function(element) {
- return $(element).value != '';
- },
-
- activate: function(element) {
- element = $(element);
- element.focus();
- if (element.select)
- element.select();
- return element;
- },
-
- disable: function(element) {
- element = $(element);
- element.disabled = '';
- return element;
- },
-
- enable: function(element) {
- element = $(element);
- element.blur();
- element.disabled = 'true';
- return element;
- }
-}
-
-Object.extend(Form.Element, Form.Element.Methods);
-var Field = Form.Element;
-
-/*--------------------------------------------------------------------------*/
-
-Form.Element.Serializers = {
- input: function(element) {
- switch (element.type.toLowerCase()) {
- case 'checkbox':
- case 'radio':
- return Form.Element.Serializers.inputSelector(element);
- default:
- return Form.Element.Serializers.textarea(element);
- }
- return false;
- },
-
- inputSelector: function(element) {
- if (element.checked)
- return [element.name, element.value];
- },
-
- textarea: function(element) {
- return [element.name, element.value];
- },
-
- select: function(element) {
- return Form.Element.Serializers[element.type == 'select-one' ?
- 'selectOne' : 'selectMany'](element);
- },
-
- selectOne: function(element) {
- var value = '', opt, index = element.selectedIndex;
- if (index >= 0) {
- opt = element.options[index];
- value = opt.value || opt.text;
- }
- return [element.name, value];
- },
-
- selectMany: function(element) {
- var value = [];
- for (var i = 0; i < element.length; i++) {
- var opt = element.options[i];
- if (opt.selected)
- value.push(opt.value || opt.text);
- }
- return [element.name, value];
- }
-}
-
-/*--------------------------------------------------------------------------*/
-
-var $F = Form.Element.getValue;
-
-/*--------------------------------------------------------------------------*/
-
-Abstract.TimedObserver = function() {}
-Abstract.TimedObserver.prototype = {
- initialize: function(element, frequency, callback) {
- this.frequency = frequency;
- this.element = $(element);
- this.callback = callback;
-
- this.lastValue = this.getValue();
- this.registerCallback();
- },
-
- registerCallback: function() {
- setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
- },
-
- onTimerEvent: function() {
- var value = this.getValue();
- if (this.lastValue != value) {
- this.callback(this.element, value);
- this.lastValue = value;
- }
- }
-}
-
-Form.Element.Observer = Class.create();
-Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
- getValue: function() {
- return Form.Element.getValue(this.element);
- }
-});
-
-Form.Observer = Class.create();
-Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
- getValue: function() {
- return Form.serialize(this.element);
- }
-});
-
-/*--------------------------------------------------------------------------*/
-
-Abstract.EventObserver = function() {}
-Abstract.EventObserver.prototype = {
- initialize: function(element, callback) {
- this.element = $(element);
- this.callback = callback;
-
- this.lastValue = this.getValue();
- if (this.element.tagName.toLowerCase() == 'form')
- this.registerFormCallbacks();
- else
- this.registerCallback(this.element);
- },
-
- onElementEvent: function() {
- var value = this.getValue();
- if (this.lastValue != value) {
- this.callback(this.element, value);
- this.lastValue = value;
- }
- },
-
- registerFormCallbacks: function() {
- var elements = Form.getElements(this.element);
- for (var i = 0; i < elements.length; i++)
- this.registerCallback(elements[i]);
- },
-
- registerCallback: function(element) {
- if (element.type) {
- switch (element.type.toLowerCase()) {
- case 'checkbox':
- case 'radio':
- Event.observe(element, 'click', this.onElementEvent.bind(this));
- break;
- default:
- Event.observe(element, 'change', this.onElementEvent.bind(this));
- break;
- }
- }
- }
-}
-
-Form.Element.EventObserver = Class.create();
-Form.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
- getValue: function() {
- return Form.Element.getValue(this.element);
- }
-});
-
-Form.EventObserver = Class.create();
-Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
- getValue: function() {
- return Form.serialize(this.element);
- }
-});
-if (!window.Event) {
- var Event = new Object();
-}
-
-Object.extend(Event, {
- KEY_BACKSPACE: 8,
- KEY_TAB: 9,
- KEY_RETURN: 13,
- KEY_ESC: 27,
- KEY_LEFT: 37,
- KEY_UP: 38,
- KEY_RIGHT: 39,
- KEY_DOWN: 40,
- KEY_DELETE: 46,
- KEY_HOME: 36,
- KEY_END: 35,
- KEY_PAGEUP: 33,
- KEY_PAGEDOWN: 34,
-
- element: function(event) {
- return event.target || event.srcElement;
- },
-
- isLeftClick: function(event) {
- return (((event.which) && (event.which == 1)) ||
- ((event.button) && (event.button == 1)));
- },
-
- pointerX: function(event) {
- return event.pageX || (event.clientX +
- (document.documentElement.scrollLeft || document.body.scrollLeft));
- },
-
- pointerY: function(event) {
- return event.pageY || (event.clientY +
- (document.documentElement.scrollTop || document.body.scrollTop));
- },
-
- stop: function(event) {
- if (event.preventDefault) {
- event.preventDefault();
- event.stopPropagation();
- } else {
- event.returnValue = false;
- event.cancelBubble = true;
- }
- },
-
- // find the first node with the given tagName, starting from the
- // node the event was triggered on; traverses the DOM upwards
- findElement: function(event, tagName) {
- var element = Event.element(event);
- while (element.parentNode && (!element.tagName ||
- (element.tagName.toUpperCase() != tagName.toUpperCase())))
- element = element.parentNode;
- return element;
- },
-
- observers: false,
-
- _observeAndCache: function(element, name, observer, useCapture) {
- if (!this.observers) this.observers = [];
- if (element.addEventListener) {
- this.observers.push([element, name, observer, useCapture]);
- element.addEventListener(name, observer, useCapture);
- } else if (element.attachEvent) {
- this.observers.push([element, name, observer, useCapture]);
- element.attachEvent('on' + name, observer);
- }
- },
-
- unloadCache: function() {
- if (!Event.observers) return;
- for (var i = 0; i < Event.observers.length; i++) {
- Event.stopObserving.apply(this, Event.observers[i]);
- Event.observers[i][0] = null;
- }
- Event.observers = false;
- },
-
- observe: function(element, name, observer, useCapture) {
- element = $(element);
- useCapture = useCapture || false;
-
- if (name == 'keypress' &&
- (navigator.appVersion.match(/Konqueror|Safari|KHTML/)
- || element.attachEvent))
- name = 'keydown';
-
- Event._observeAndCache(element, name, observer, useCapture);
- },
-
- stopObserving: function(element, name, observer, useCapture) {
- element = $(element);
- useCapture = useCapture || false;
-
- if (name == 'keypress' &&
- (navigator.appVersion.match(/Konqueror|Safari|KHTML/)
- || element.detachEvent))
- name = 'keydown';
-
- if (element.removeEventListener) {
- element.removeEventListener(name, observer, useCapture);
- } else if (element.detachEvent) {
- try {
- element.detachEvent('on' + name, observer);
- } catch (e) {}
- }
- }
-});
-
-/* prevent memory leaks in IE */
-if (navigator.appVersion.match(/\bMSIE\b/))
- Event.observe(window, 'unload', Event.unloadCache, false);
-var Position = {
- // set to true if needed, warning: firefox performance problems
- // NOT neeeded for page scrolling, only if draggable contained in
- // scrollable elements
- includeScrollOffsets: false,
-
- // must be called before calling withinIncludingScrolloffset, every time the
- // page is scrolled
- prepare: function() {
- this.deltaX = window.pageXOffset
- || document.documentElement.scrollLeft
- || document.body.scrollLeft
- || 0;
- this.deltaY = window.pageYOffset
- || document.documentElement.scrollTop
- || document.body.scrollTop
- || 0;
- },
-
- realOffset: function(element) {
- var valueT = 0, valueL = 0;
- do {
- valueT += element.scrollTop || 0;
- valueL += element.scrollLeft || 0;
- element = element.parentNode;
- } while (element);
- return [valueL, valueT];
- },
-
- cumulativeOffset: function(element) {
- var valueT = 0, valueL = 0;
- do {
- valueT += element.offsetTop || 0;
- valueL += element.offsetLeft || 0;
- element = element.offsetParent;
- } while (element);
- return [valueL, valueT];
- },
-
- positionedOffset: function(element) {
- var valueT = 0, valueL = 0;
- do {
- valueT += element.offsetTop || 0;
- valueL += element.offsetLeft || 0;
- element = element.offsetParent;
- if (element) {
- p = Element.getStyle(element, 'position');
- if (p == 'relative' || p == 'absolute') break;
- }
- } while (element);
- return [valueL, valueT];
- },
-
- offsetParent: function(element) {
- if (element.offsetParent) return element.offsetParent;
- if (element == document.body) return element;
-
- while ((element = element.parentNode) && element != document.body)
- if (Element.getStyle(element, 'position') != 'static')
- return element;
-
- return document.body;
- },
-
- // caches x/y coordinate pair to use with overlap
- within: function(element, x, y) {
- if (this.includeScrollOffsets)
- return this.withinIncludingScrolloffsets(element, x, y);
- this.xcomp = x;
- this.ycomp = y;
- this.offset = this.cumulativeOffset(element);
-
- return (y >= this.offset[1] &&
- y < this.offset[1] + element.offsetHeight &&
- x >= this.offset[0] &&
- x < this.offset[0] + element.offsetWidth);
- },
-
- withinIncludingScrolloffsets: function(element, x, y) {
- var offsetcache = this.realOffset(element);
-
- this.xcomp = x + offsetcache[0] - this.deltaX;
- this.ycomp = y + offsetcache[1] - this.deltaY;
- this.offset = this.cumulativeOffset(element);
-
- return (this.ycomp >= this.offset[1] &&
- this.ycomp < this.offset[1] + element.offsetHeight &&
- this.xcomp >= this.offset[0] &&
- this.xcomp < this.offset[0] + element.offsetWidth);
- },
-
- // within must be called directly before
- overlap: function(mode, element) {
- if (!mode) return 0;
- if (mode == 'vertical')
- return ((this.offset[1] + element.offsetHeight) - this.ycomp) /
- element.offsetHeight;
- if (mode == 'horizontal')
- return ((this.offset[0] + element.offsetWidth) - this.xcomp) /
- element.offsetWidth;
- },
-
- page: function(forElement) {
- var valueT = 0, valueL = 0;
-
- var element = forElement;
- do {
- valueT += element.offsetTop || 0;
- valueL += element.offsetLeft || 0;
-
- // Safari fix
- if (element.offsetParent==document.body)
- if (Element.getStyle(element,'position')=='absolute') break;
-
- } while (element = element.offsetParent);
-
- element = forElement;
- do {
- if (!window.opera || element.tagName=='BODY') {
- valueT -= element.scrollTop || 0;
- valueL -= element.scrollLeft || 0;
- }
- } while (element = element.parentNode);
-
- return [valueL, valueT];
- },
-
- clone: function(source, target) {
- var options = Object.extend({
- setLeft: true,
- setTop: true,
- setWidth: true,
- setHeight: true,
- offsetTop: 0,
- offsetLeft: 0
- }, arguments[2] || {})
-
- // find page position of source
- source = $(source);
- var p = Position.page(source);
-
- // find coordinate system to use
- target = $(target);
- var delta = [0, 0];
- var parent = null;
- // delta [0,0] will do fine with position: fixed elements,
- // position:absolute needs offsetParent deltas
- if (Element.getStyle(target,'position') == 'absolute') {
- parent = Position.offsetParent(target);
- delta = Position.page(parent);
- }
-
- // correct by body offsets (fixes Safari)
- if (parent == document.body) {
- delta[0] -= document.body.offsetLeft;
- delta[1] -= document.body.offsetTop;
- }
-
- // set position
- if(options.setLeft) target.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px';
- if(options.setTop) target.style.top = (p[1] - delta[1] + options.offsetTop) + 'px';
- if(options.setWidth) target.style.width = source.offsetWidth + 'px';
- if(options.setHeight) target.style.height = source.offsetHeight + 'px';
- },
-
- absolutize: function(element) {
- element = $(element);
- if (element.style.position == 'absolute') return;
- Position.prepare();
-
- var offsets = Position.positionedOffset(element);
- var top = offsets[1];
- var left = offsets[0];
- var width = element.clientWidth;
- var height = element.clientHeight;
-
- element._originalLeft = left - parseFloat(element.style.left || 0);
- element._originalTop = top - parseFloat(element.style.top || 0);
- element._originalWidth = element.style.width;
- element._originalHeight = element.style.height;
-
- element.style.position = 'absolute';
- element.style.top = top + 'px';;
- element.style.left = left + 'px';;
- element.style.width = width + 'px';;
- element.style.height = height + 'px';;
- },
-
- relativize: function(element) {
- element = $(element);
- if (element.style.position == 'relative') return;
- Position.prepare();
-
- element.style.position = 'relative';
- var top = parseFloat(element.style.top || 0) - (element._originalTop || 0);
- var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);
-
- element.style.top = top + 'px';
- element.style.left = left + 'px';
- element.style.height = element._originalHeight;
- element.style.width = element._originalWidth;
- }
-}
-
-// Safari returns margins on body which is incorrect if the child is absolutely
-// positioned. For performance reasons, redefine Position.cumulativeOffset for
-// KHTML/WebKit only.
-if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) {
- Position.cumulativeOffset = function(element) {
- var valueT = 0, valueL = 0;
- do {
- valueT += element.offsetTop || 0;
- valueL += element.offsetLeft || 0;
- if (element.offsetParent == document.body)
- if (Element.getStyle(element, 'position') == 'absolute') break;
-
- element = element.offsetParent;
- } while (element);
-
- return [valueL, valueT];
- }
-}
-
+/* Prototype JavaScript framework, version 1.5.0_rc1\r
+ * (c) 2005 Sam Stephenson <sam@conio.net>\r
+ *\r
+ * Prototype is freely distributable under the terms of an MIT-style license.\r
+ * For details, see the Prototype web site: http://prototype.conio.net/\r
+ *\r
+/*--------------------------------------------------------------------------*/\r
+\r
+var Prototype = {\r
+ Version: '1.5.0_rc1',\r
+ ScriptFragment: '(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)',\r
+\r
+ emptyFunction: function() {},\r
+ K: function(x) {return x}\r
+}\r
+\r
+var Class = {\r
+ create: function() {\r
+ return function() {\r
+ this.initialize.apply(this, arguments);\r
+ }\r
+ }\r
+}\r
+\r
+var Abstract = new Object();\r
+\r
+Object.extend = function(destination, source) {\r
+ for (var property in source) {\r
+ destination[property] = source[property];\r
+ }\r
+ return destination;\r
+}\r
+\r
+Object.extend(Object, {\r
+ inspect: function(object) {\r
+ try {\r
+ if (object == undefined) return 'undefined';\r
+ if (object == null) return 'null';\r
+ return object.inspect ? object.inspect() : object.toString();\r
+ } catch (e) {\r
+ if (e instanceof RangeError) return '...';\r
+ throw e;\r
+ }\r
+ },\r
+\r
+ keys: function(object) {\r
+ var keys = [];\r
+ for (var property in object)\r
+ keys.push(property);\r
+ return keys;\r
+ },\r
+\r
+ values: function(object) {\r
+ var values = [];\r
+ for (var property in object)\r
+ values.push(object[property]);\r
+ return values;\r
+ },\r
+\r
+ clone: function(object) {\r
+ return Object.extend({}, object);\r
+ }\r
+});\r
+\r
+Function.prototype.bind = function() {\r
+ var __method = this, args = $A(arguments), object = args.shift();\r
+ return function() {\r
+ return __method.apply(object, args.concat($A(arguments)));\r
+ }\r
+}\r
+\r
+Function.prototype.bindAsEventListener = function(object) {\r
+ var __method = this, args = $A(arguments), object = args.shift();\r
+ return function(event) {\r
+ return __method.apply(object, [( event || window.event)].concat(args).concat($A(arguments)));\r
+ }\r
+}\r
+\r
+Object.extend(Number.prototype, {\r
+ toColorPart: function() {\r
+ var digits = this.toString(16);\r
+ if (this < 16) return '0' + digits;\r
+ return digits;\r
+ },\r
+\r
+ succ: function() {\r
+ return this + 1;\r
+ },\r
+\r
+ times: function(iterator) {\r
+ $R(0, this, true).each(iterator);\r
+ return this;\r
+ }\r
+});\r
+\r
+var Try = {\r
+ these: function() {\r
+ var returnValue;\r
+\r
+ for (var i = 0; i < arguments.length; i++) {\r
+ var lambda = arguments[i];\r
+ try {\r
+ returnValue = lambda();\r
+ break;\r
+ } catch (e) {}\r
+ }\r
+\r
+ return returnValue;\r
+ }\r
+}\r
+\r
+/*--------------------------------------------------------------------------*/\r
+\r
+var PeriodicalExecuter = Class.create();\r
+PeriodicalExecuter.prototype = {\r
+ initialize: function(callback, frequency) {\r
+ this.callback = callback;\r
+ this.frequency = frequency;\r
+ this.currentlyExecuting = false;\r
+\r
+ this.registerCallback();\r
+ },\r
+\r
+ registerCallback: function() {\r
+ this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);\r
+ },\r
+\r
+ stop: function() {\r
+ if (!this.timer) return;\r
+ clearInterval(this.timer);\r
+ this.timer = null;\r
+ },\r
+\r
+ onTimerEvent: function() {\r
+ if (!this.currentlyExecuting) {\r
+ try {\r
+ this.currentlyExecuting = true;\r
+ this.callback(this);\r
+ } finally {\r
+ this.currentlyExecuting = false;\r
+ }\r
+ }\r
+ }\r
+}\r
+Object.extend(String.prototype, {\r
+ gsub: function(pattern, replacement) {\r
+ var result = '', source = this, match;\r
+ replacement = arguments.callee.prepareReplacement(replacement);\r
+\r
+ while (source.length > 0) {\r
+ if (match = source.match(pattern)) {\r
+ result += source.slice(0, match.index);\r
+ result += (replacement(match) || '').toString();\r
+ source = source.slice(match.index + match[0].length);\r
+ } else {\r
+ result += source, source = '';\r
+ }\r
+ }\r
+ return result;\r
+ },\r
+\r
+ sub: function(pattern, replacement, count) {\r
+ replacement = this.gsub.prepareReplacement(replacement);\r
+ count = count === undefined ? 1 : count;\r
+\r
+ return this.gsub(pattern, function(match) {\r
+ if (--count < 0) return match[0];\r
+ return replacement(match);\r
+ });\r
+ },\r
+\r
+ scan: function(pattern, iterator) {\r
+ this.gsub(pattern, iterator);\r
+ return this;\r
+ },\r
+\r
+ truncate: function(length, truncation) {\r
+ length = length || 30;\r
+ truncation = truncation === undefined ? '...' : truncation;\r
+ return this.length > length ?\r
+ this.slice(0, length - truncation.length) + truncation : this;\r
+ },\r
+\r
+ strip: function() {\r
+ return this.replace(/^\s+/, '').replace(/\s+$/, '');\r
+ },\r
+\r
+ stripTags: function() {\r
+ return this.replace(/<\/?[^>]+>/gi, '');\r
+ },\r
+\r
+ stripScripts: function() {\r
+ return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');\r
+ },\r
+\r
+ extractScripts: function() {\r
+ var matchAll = new RegExp(Prototype.ScriptFragment, 'img');\r
+ var matchOne = new RegExp(Prototype.ScriptFragment, 'im');\r
+ return (this.match(matchAll) || []).map(function(scriptTag) {\r
+ return (scriptTag.match(matchOne) || ['', ''])[1];\r
+ });\r
+ },\r
+\r
+ evalScripts: function() {\r
+ return this.extractScripts().map(function(script) { return eval(script) });\r
+ },\r
+\r
+ escapeHTML: function() {\r
+ var div = document.createElement('div');\r
+ var text = document.createTextNode(this);\r
+ div.appendChild(text);\r
+ return div.innerHTML;\r
+ },\r
+\r
+ unescapeHTML: function() {\r
+ var div = document.createElement('div');\r
+ div.innerHTML = this.stripTags();\r
+ return div.childNodes[0] ? div.childNodes[0].nodeValue : '';\r
+ },\r
+\r
+ toQueryParams: function() {\r
+ var pairs = this.match(/^\??(.*)$/)[1].split('&');\r
+ return pairs.inject({}, function(params, pairString) {\r
+ var pair = pairString.split('=');\r
+ var value = pair[1] ? decodeURIComponent(pair[1]) : undefined;\r
+ params[decodeURIComponent(pair[0])] = value;\r
+ return params;\r
+ });\r
+ },\r
+\r
+ toArray: function() {\r
+ return this.split('');\r
+ },\r
+\r
+ camelize: function() {\r
+ var oStringList = this.split('-');\r
+ if (oStringList.length == 1) return oStringList[0];\r
+\r
+ var camelizedString = this.indexOf('-') == 0\r
+ ? oStringList[0].charAt(0).toUpperCase() + oStringList[0].substring(1)\r
+ : oStringList[0];\r
+\r
+ for (var i = 1, len = oStringList.length; i < len; i++) {\r
+ var s = oStringList[i];\r
+ camelizedString += s.charAt(0).toUpperCase() + s.substring(1);\r
+ }\r
+\r
+ return camelizedString;\r
+ },\r
+\r
+ inspect: function(useDoubleQuotes) {\r
+ var escapedString = this.replace(/\\/g, '\\\\');\r
+ if (useDoubleQuotes)\r
+ return '"' + escapedString.replace(/"/g, '\\"') + '"';\r
+ else\r
+ return "'" + escapedString.replace(/'/g, '\\\'') + "'";\r
+ }\r
+});\r
+\r
+String.prototype.gsub.prepareReplacement = function(replacement) {\r
+ if (typeof replacement == 'function') return replacement;\r
+ var template = new Template(replacement);\r
+ return function(match) { return template.evaluate(match) };\r
+}\r
+\r
+String.prototype.parseQuery = String.prototype.toQueryParams;\r
+\r
+var Template = Class.create();\r
+Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;\r
+Template.prototype = {\r
+ initialize: function(template, pattern) {\r
+ this.template = template.toString();\r
+ this.pattern = pattern || Template.Pattern;\r
+ },\r
+\r
+ evaluate: function(object) {\r
+ return this.template.gsub(this.pattern, function(match) {\r
+ var before = match[1];\r
+ if (before == '\\') return match[2];\r
+ return before + (object[match[3]] || '').toString();\r
+ });\r
+ }\r
+}\r
+\r
+var $break = new Object();\r
+var $continue = new Object();\r
+\r
+var Enumerable = {\r
+ each: function(iterator) {\r
+ var index = 0;\r
+ try {\r
+ this._each(function(value) {\r
+ try {\r
+ iterator(value, index++);\r
+ } catch (e) {\r
+ if (e != $continue) throw e;\r
+ }\r
+ });\r
+ } catch (e) {\r
+ if (e != $break) throw e;\r
+ }\r
+ },\r
+\r
+ all: function(iterator) {\r
+ var result = true;\r
+ this.each(function(value, index) {\r
+ result = result && !!(iterator || Prototype.K)(value, index);\r
+ if (!result) throw $break;\r
+ });\r
+ return result;\r
+ },\r
+\r
+ any: function(iterator) {\r
+ var result = false;\r
+ this.each(function(value, index) {\r
+ if (result = !!(iterator || Prototype.K)(value, index))\r
+ throw $break;\r
+ });\r
+ return result;\r
+ },\r
+\r
+ collect: function(iterator) {\r
+ var results = [];\r
+ this.each(function(value, index) {\r
+ results.push(iterator(value, index));\r
+ });\r
+ return results;\r
+ },\r
+\r
+ detect: function (iterator) {\r
+ var result;\r
+ this.each(function(value, index) {\r
+ if (iterator(value, index)) {\r
+ result = value;\r
+ throw $break;\r
+ }\r
+ });\r
+ return result;\r
+ },\r
+\r
+ findAll: function(iterator) {\r
+ var results = [];\r
+ this.each(function(value, index) {\r
+ if (iterator(value, index))\r
+ results.push(value);\r
+ });\r
+ return results;\r
+ },\r
+\r
+ grep: function(pattern, iterator) {\r
+ var results = [];\r
+ this.each(function(value, index) {\r
+ var stringValue = value.toString();\r
+ if (stringValue.match(pattern))\r
+ results.push((iterator || Prototype.K)(value, index));\r
+ })\r
+ return results;\r
+ },\r
+\r
+ include: function(object) {\r
+ var found = false;\r
+ this.each(function(value) {\r
+ if (value == object) {\r
+ found = true;\r
+ throw $break;\r
+ }\r
+ });\r
+ return found;\r
+ },\r
+\r
+ inject: function(memo, iterator) {\r
+ this.each(function(value, index) {\r
+ memo = iterator(memo, value, index);\r
+ });\r
+ return memo;\r
+ },\r
+\r
+ invoke: function(method) {\r
+ var args = $A(arguments).slice(1);\r
+ return this.collect(function(value) {\r
+ return value[method].apply(value, args);\r
+ });\r
+ },\r
+\r
+ max: function(iterator) {\r
+ var result;\r
+ this.each(function(value, index) {\r
+ value = (iterator || Prototype.K)(value, index);\r
+ if (result == undefined || value >= result)\r
+ result = value;\r
+ });\r
+ return result;\r
+ },\r
+\r
+ min: function(iterator) {\r
+ var result;\r
+ this.each(function(value, index) {\r
+ value = (iterator || Prototype.K)(value, index);\r
+ if (result == undefined || value < result)\r
+ result = value;\r
+ });\r
+ return result;\r
+ },\r
+\r
+ partition: function(iterator) {\r
+ var trues = [], falses = [];\r
+ this.each(function(value, index) {\r
+ ((iterator || Prototype.K)(value, index) ?\r
+ trues : falses).push(value);\r
+ });\r
+ return [trues, falses];\r
+ },\r
+\r
+ pluck: function(property) {\r
+ var results = [];\r
+ this.each(function(value, index) {\r
+ results.push(value[property]);\r
+ });\r
+ return results;\r
+ },\r
+\r
+ reject: function(iterator) {\r
+ var results = [];\r
+ this.each(function(value, index) {\r
+ if (!iterator(value, index))\r
+ results.push(value);\r
+ });\r
+ return results;\r
+ },\r
+\r
+ sortBy: function(iterator) {\r
+ return this.collect(function(value, index) {\r
+ return {value: value, criteria: iterator(value, index)};\r
+ }).sort(function(left, right) {\r
+ var a = left.criteria, b = right.criteria;\r
+ return a < b ? -1 : a > b ? 1 : 0;\r
+ }).pluck('value');\r
+ },\r
+\r
+ toArray: function() {\r
+ return this.collect(Prototype.K);\r
+ },\r
+\r
+ zip: function() {\r
+ var iterator = Prototype.K, args = $A(arguments);\r
+ if (typeof args.last() == 'function')\r
+ iterator = args.pop();\r
+\r
+ var collections = [this].concat(args).map($A);\r
+ return this.map(function(value, index) {\r
+ return iterator(collections.pluck(index));\r
+ });\r
+ },\r
+\r
+ inspect: function() {\r
+ return '#<Enumerable:' + this.toArray().inspect() + '>';\r
+ }\r
+}\r
+\r
+Object.extend(Enumerable, {\r
+ map: Enumerable.collect,\r
+ find: Enumerable.detect,\r
+ select: Enumerable.findAll,\r
+ member: Enumerable.include,\r
+ entries: Enumerable.toArray\r
+});\r
+var $A = Array.from = function(iterable) {\r
+ if (!iterable) return [];\r
+ if (iterable.toArray) {\r
+ return iterable.toArray();\r
+ } else {\r
+ var results = [];\r
+ for (var i = 0; i < iterable.length; i++)\r
+ results.push(iterable[i]);\r
+ return results;\r
+ }\r
+}\r
+\r
+Object.extend(Array.prototype, Enumerable);\r
+\r
+if (!Array.prototype._reverse)\r
+ Array.prototype._reverse = Array.prototype.reverse;\r
+\r
+Object.extend(Array.prototype, {\r
+ _each: function(iterator) {\r
+ for (var i = 0; i < this.length; i++)\r
+ iterator(this[i]);\r
+ },\r
+\r
+ clear: function() {\r
+ this.length = 0;\r
+ return this;\r
+ },\r
+\r
+ first: function() {\r
+ return this[0];\r
+ },\r
+\r
+ last: function() {\r
+ return this[this.length - 1];\r
+ },\r
+\r
+ compact: function() {\r
+ return this.select(function(value) {\r
+ return value != undefined || value != null;\r
+ });\r
+ },\r
+\r
+ flatten: function() {\r
+ return this.inject([], function(array, value) {\r
+ return array.concat(value && value.constructor == Array ?\r
+ value.flatten() : [value]);\r
+ });\r
+ },\r
+\r
+ without: function() {\r
+ var values = $A(arguments);\r
+ return this.select(function(value) {\r
+ return !values.include(value);\r
+ });\r
+ },\r
+\r
+ indexOf: function(object) {\r
+ for (var i = 0; i < this.length; i++)\r
+ if (this[i] == object) return i;\r
+ return -1;\r
+ },\r
+\r
+ reverse: function(inline) {\r
+ return (inline !== false ? this : this.toArray())._reverse();\r
+ },\r
+\r
+ reduce: function() {\r
+ return this.length > 1 ? this : this[0];\r
+ },\r
+\r
+ uniq: function() {\r
+ return this.inject([], function(array, value) {\r
+ return array.include(value) ? array : array.concat([value]);\r
+ });\r
+ },\r
+\r
+ inspect: function() {\r
+ return '[' + this.map(Object.inspect).join(', ') + ']';\r
+ }\r
+});\r
+var Hash = {\r
+ _each: function(iterator) {\r
+ for (var key in this) {\r
+ var value = this[key];\r
+ if (typeof value == 'function') continue;\r
+\r
+ var pair = [key, value];\r
+ pair.key = key;\r
+ pair.value = value;\r
+ iterator(pair);\r
+ }\r
+ },\r
+\r
+ keys: function() {\r
+ return this.pluck('key');\r
+ },\r
+\r
+ values: function() {\r
+ return this.pluck('value');\r
+ },\r
+\r
+ merge: function(hash) {\r
+ return $H(hash).inject($H(this), function(mergedHash, pair) {\r
+ mergedHash[pair.key] = pair.value;\r
+ return mergedHash;\r
+ });\r
+ },\r
+\r
+ toQueryString: function() {\r
+ return this.map(function(pair) {\r
+ return pair.map(encodeURIComponent).join('=');\r
+ }).join('&');\r
+ },\r
+\r
+ inspect: function() {\r
+ return '#<Hash:{' + this.map(function(pair) {\r
+ return pair.map(Object.inspect).join(': ');\r
+ }).join(', ') + '}>';\r
+ }\r
+}\r
+\r
+function $H(object) {\r
+ var hash = Object.extend({}, object || {});\r
+ Object.extend(hash, Enumerable);\r
+ Object.extend(hash, Hash);\r
+ return hash;\r
+}\r
+ObjectRange = Class.create();\r
+Object.extend(ObjectRange.prototype, Enumerable);\r
+Object.extend(ObjectRange.prototype, {\r
+ initialize: function(start, end, exclusive) {\r
+ this.start = start;\r
+ this.end = end;\r
+ this.exclusive = exclusive;\r
+ },\r
+\r
+ _each: function(iterator) {\r
+ var value = this.start;\r
+ while (this.include(value)) {\r
+ iterator(value);\r
+ value = value.succ();\r
+ }\r
+ },\r
+\r
+ include: function(value) {\r
+ if (value < this.start)\r
+ return false;\r
+ if (this.exclusive)\r
+ return value < this.end;\r
+ return value <= this.end;\r
+ }\r
+});\r
+\r
+var $R = function(start, end, exclusive) {\r
+ return new ObjectRange(start, end, exclusive);\r
+}\r
+\r
+var Ajax = {\r
+ getTransport: function() {\r
+ return Try.these(\r
+ function() {return new XMLHttpRequest()},\r
+ function() {return new ActiveXObject('Msxml2.XMLHTTP')},\r
+ function() {return new ActiveXObject('Microsoft.XMLHTTP')}\r
+ ) || false;\r
+ },\r
+\r
+ activeRequestCount: 0\r
+}\r
+\r
+Ajax.Responders = {\r
+ responders: [],\r
+\r
+ _each: function(iterator) {\r
+ this.responders._each(iterator);\r
+ },\r
+\r
+ register: function(responderToAdd) {\r
+ if (!this.include(responderToAdd))\r
+ this.responders.push(responderToAdd);\r
+ },\r
+\r
+ unregister: function(responderToRemove) {\r
+ this.responders = this.responders.without(responderToRemove);\r
+ },\r
+\r
+ dispatch: function(callback, request, transport, json) {\r
+ this.each(function(responder) {\r
+ if (responder[callback] && typeof responder[callback] == 'function') {\r
+ try {\r
+ responder[callback].apply(responder, [request, transport, json]);\r
+ } catch (e) {}\r
+ }\r
+ });\r
+ }\r
+};\r
+\r
+Object.extend(Ajax.Responders, Enumerable);\r
+\r
+Ajax.Responders.register({\r
+ onCreate: function() {\r
+ Ajax.activeRequestCount++;\r
+ },\r
+\r
+ onComplete: function() {\r
+ Ajax.activeRequestCount--;\r
+ }\r
+});\r
+\r
+Ajax.Base = function() {};\r
+Ajax.Base.prototype = {\r
+ setOptions: function(options) {\r
+ this.options = {\r
+ method: 'post',\r
+ asynchronous: true,\r
+ contentType: 'application/x-www-form-urlencoded',\r
+ parameters: ''\r
+ }\r
+ Object.extend(this.options, options || {});\r
+ },\r
+\r
+ responseIsSuccess: function() {\r
+ return this.transport.status == undefined\r
+ || this.transport.status == 0\r
+ || (this.transport.status >= 200 && this.transport.status < 300);\r
+ },\r
+\r
+ responseIsFailure: function() {\r
+ return !this.responseIsSuccess();\r
+ }\r
+}\r
+\r
+Ajax.Request = Class.create();\r
+Ajax.Request.Events =\r
+ ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];\r
+\r
+Ajax.Request.prototype = Object.extend(new Ajax.Base(), {\r
+ initialize: function(url, options) {\r
+ this.transport = Ajax.getTransport();\r
+ this.setOptions(options);\r
+ this.request(url);\r
+ },\r
+\r
+ request: function(url) {\r
+ var parameters = this.options.parameters || '';\r
+ if (parameters.length > 0) parameters += '&_=';\r
+\r
+ /* Simulate other verbs over post */\r
+ if (this.options.method != 'get' && this.options.method != 'post') {\r
+ parameters += (parameters.length > 0 ? '&' : '') + '_method=' + this.options.method;\r
+ this.options.method = 'post';\r
+ }\r
+\r
+ try {\r
+ this.url = url;\r
+ if (this.options.method == 'get' && parameters.length > 0)\r
+ this.url += (this.url.match(/\?/) ? '&' : '?') + parameters;\r
+\r
+ Ajax.Responders.dispatch('onCreate', this, this.transport);\r
+\r
+ this.transport.open(this.options.method, this.url,\r
+ this.options.asynchronous);\r
+\r
+ if (this.options.asynchronous)\r
+ setTimeout(function() { this.respondToReadyState(1) }.bind(this), 10);\r
+\r
+ this.transport.onreadystatechange = this.onStateChange.bind(this);\r
+ this.setRequestHeaders();\r
+\r
+ var body = this.options.postBody ? this.options.postBody : parameters;\r
+ this.transport.send(this.options.method == 'post' ? body : null);\r
+\r
+ /* Force Firefox to handle ready state 4 for synchronous requests */\r
+ if (!this.options.asynchronous && this.transport.overrideMimeType)\r
+ this.onStateChange();\r
+\r
+ } catch (e) {\r
+ this.dispatchException(e);\r
+ }\r
+ },\r
+\r
+ setRequestHeaders: function() {\r
+ var requestHeaders =\r
+ ['X-Requested-With', 'XMLHttpRequest',\r
+ 'X-Prototype-Version', Prototype.Version,\r
+ 'Accept', 'text/javascript, text/html, application/xml, text/xml, */*'];\r
+\r
+ if (this.options.method == 'post') {\r
+ requestHeaders.push('Content-type', this.options.contentType);\r
+\r
+ /* Force "Connection: close" for Mozilla browsers to work around\r
+ * a bug where XMLHttpReqeuest sends an incorrect Content-length\r
+ * header. See Mozilla Bugzilla #246651.\r
+ */\r
+ if (this.transport.overrideMimeType)\r
+ requestHeaders.push('Connection', 'close');\r
+ }\r
+\r
+ if (this.options.requestHeaders)\r
+ requestHeaders.push.apply(requestHeaders, this.options.requestHeaders);\r
+\r
+ for (var i = 0; i < requestHeaders.length; i += 2)\r
+ this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]);\r
+ },\r
+\r
+ onStateChange: function() {\r
+ var readyState = this.transport.readyState;\r
+ if (readyState != 1)\r
+ this.respondToReadyState(this.transport.readyState);\r
+ },\r
+\r
+ header: function(name) {\r
+ try {\r
+ return this.transport.getResponseHeader(name);\r
+ } catch (e) {}\r
+ },\r
+\r
+ evalJSON: function() {\r
+ try {\r
+ return eval('(' + this.header('X-JSON') + ')');\r
+ } catch (e) {}\r
+ },\r
+\r
+ evalResponse: function() {\r
+ try {\r
+ return eval(this.transport.responseText);\r
+ } catch (e) {\r
+ this.dispatchException(e);\r
+ }\r
+ },\r
+\r
+ respondToReadyState: function(readyState) {\r
+ var event = Ajax.Request.Events[readyState];\r
+ var transport = this.transport, json = this.evalJSON();\r
+\r
+ if (event == 'Complete') {\r
+ try {\r
+ (this.options['on' + this.transport.status]\r
+ || this.options['on' + (this.responseIsSuccess() ? 'Success' : 'Failure')]\r
+ || Prototype.emptyFunction)(transport, json);\r
+ } catch (e) {\r
+ this.dispatchException(e);\r
+ }\r
+\r
+ if ((this.header('Content-type') || '').match(/^text\/javascript/i))\r
+ this.evalResponse();\r
+ }\r
+\r
+ try {\r
+ (this.options['on' + event] || Prototype.emptyFunction)(transport, json);\r
+ Ajax.Responders.dispatch('on' + event, this, transport, json);\r
+ } catch (e) {\r
+ this.dispatchException(e);\r
+ }\r
+\r
+ /* Avoid memory leak in MSIE: clean up the oncomplete event handler */\r
+ if (event == 'Complete')\r
+ this.transport.onreadystatechange = Prototype.emptyFunction;\r
+ },\r
+\r
+ dispatchException: function(exception) {\r
+ (this.options.onException || Prototype.emptyFunction)(this, exception);\r
+ Ajax.Responders.dispatch('onException', this, exception);\r
+ }\r
+});\r
+\r
+Ajax.Updater = Class.create();\r
+\r
+Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), {\r
+ initialize: function(container, url, options) {\r
+ this.containers = {\r
+ success: container.success ? $(container.success) : $(container),\r
+ failure: container.failure ? $(container.failure) :\r
+ (container.success ? null : $(container))\r
+ }\r
+\r
+ this.transport = Ajax.getTransport();\r
+ this.setOptions(options);\r
+\r
+ var onComplete = this.options.onComplete || Prototype.emptyFunction;\r
+ this.options.onComplete = (function(transport, object) {\r
+ this.updateContent();\r
+ onComplete(transport, object);\r
+ }).bind(this);\r
+\r
+ this.request(url);\r
+ },\r
+\r
+ updateContent: function() {\r
+ var receiver = this.responseIsSuccess() ?\r
+ this.containers.success : this.containers.failure;\r
+ var response = this.transport.responseText;\r
+\r
+ if (!this.options.evalScripts)\r
+ response = response.stripScripts();\r
+\r
+ if (receiver) {\r
+ if (this.options.insertion) {\r
+ new this.options.insertion(receiver, response);\r
+ } else {\r
+ Element.update(receiver, response);\r
+ }\r
+ }\r
+\r
+ if (this.responseIsSuccess()) {\r
+ if (this.onComplete)\r
+ setTimeout(this.onComplete.bind(this), 10);\r
+ }\r
+ }\r
+});\r
+\r
+Ajax.PeriodicalUpdater = Class.create();\r
+Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), {\r
+ initialize: function(container, url, options) {\r
+ this.setOptions(options);\r
+ this.onComplete = this.options.onComplete;\r
+\r
+ this.frequency = (this.options.frequency || 2);\r
+ this.decay = (this.options.decay || 1);\r
+\r
+ this.updater = {};\r
+ this.container = container;\r
+ this.url = url;\r
+\r
+ this.start();\r
+ },\r
+\r
+ start: function() {\r
+ this.options.onComplete = this.updateComplete.bind(this);\r
+ this.onTimerEvent();\r
+ },\r
+\r
+ stop: function() {\r
+ this.updater.options.onComplete = undefined;\r
+ clearTimeout(this.timer);\r
+ (this.onComplete || Prototype.emptyFunction).apply(this, arguments);\r
+ },\r
+\r
+ updateComplete: function(request) {\r
+ if (this.options.decay) {\r
+ this.decay = (request.responseText == this.lastText ?\r
+ this.decay * this.options.decay : 1);\r
+\r
+ this.lastText = request.responseText;\r
+ }\r
+ this.timer = setTimeout(this.onTimerEvent.bind(this),\r
+ this.decay * this.frequency * 1000);\r
+ },\r
+\r
+ onTimerEvent: function() {\r
+ this.updater = new Ajax.Updater(this.container, this.url, this.options);\r
+ }\r
+});\r
+function $() {\r
+ var results = [], element;\r
+ for (var i = 0; i < arguments.length; i++) {\r
+ element = arguments[i];\r
+ if (typeof element == 'string')\r
+ element = document.getElementById(element);\r
+ results.push(Element.extend(element));\r
+ }\r
+ return results.reduce();\r
+}\r
+\r
+document.getElementsByClassName = function(className, parentElement) {\r
+ var children = ($(parentElement) || document.body).getElementsByTagName('*');\r
+ return $A(children).inject([], function(elements, child) {\r
+ if (child.className.match(new RegExp("(^|\\s)" + className + "(\\s|$)")))\r
+ elements.push(Element.extend(child));\r
+ return elements;\r
+ });\r
+}\r
+\r
+/*--------------------------------------------------------------------------*/\r
+\r
+if (!window.Element)\r
+ var Element = new Object();\r
+\r
+Element.extend = function(element) {\r
+ if (!element) return;\r
+ if (_nativeExtensions || element.nodeType == 3) return element;\r
+\r
+ if (!element._extended && element.tagName && element != window) {\r
+ var methods = Object.clone(Element.Methods), cache = Element.extend.cache;\r
+\r
+ if (element.tagName == 'FORM')\r
+ Object.extend(methods, Form.Methods);\r
+ if (['INPUT', 'TEXTAREA', 'SELECT'].include(element.tagName))\r
+ Object.extend(methods, Form.Element.Methods);\r
+\r
+ for (var property in methods) {\r
+ var value = methods[property];\r
+ if (typeof value == 'function')\r
+ element[property] = cache.findOrStore(value);\r
+ }\r
+ }\r
+\r
+ element._extended = true;\r
+ return element;\r
+}\r
+\r
+Element.extend.cache = {\r
+ findOrStore: function(value) {\r
+ return this[value] = this[value] || function() {\r
+ return value.apply(null, [this].concat($A(arguments)));\r
+ }\r
+ }\r
+}\r
+\r
+Element.Methods = {\r
+ visible: function(element) {\r
+ return $(element).style.display != 'none';\r
+ },\r
+\r
+ toggle: function(element) {\r
+ element = $(element);\r
+ Element[Element.visible(element) ? 'hide' : 'show'](element);\r
+ return element;\r
+ },\r
+\r
+ hide: function(element) {\r
+ $(element).style.display = 'none';\r
+ return element;\r
+ },\r
+\r
+ show: function(element) {\r
+ $(element).style.display = '';\r
+ return element;\r
+ },\r
+\r
+ remove: function(element) {\r
+ element = $(element);\r
+ element.parentNode.removeChild(element);\r
+ return element;\r
+ },\r
+\r
+ update: function(element, html) {\r
+ $(element).innerHTML = html.stripScripts();\r
+ setTimeout(function() {html.evalScripts()}, 10);\r
+ return element;\r
+ },\r
+\r
+ replace: function(element, html) {\r
+ element = $(element);\r
+ if (element.outerHTML) {\r
+ element.outerHTML = html.stripScripts();\r
+ } else {\r
+ var range = element.ownerDocument.createRange();\r
+ range.selectNodeContents(element);\r
+ element.parentNode.replaceChild(\r
+ range.createContextualFragment(html.stripScripts()), element);\r
+ }\r
+ setTimeout(function() {html.evalScripts()}, 10);\r
+ return element;\r
+ },\r
+\r
+ inspect: function(element) {\r
+ element = $(element);\r
+ var result = '<' + element.tagName.toLowerCase();\r
+ $H({'id': 'id', 'className': 'class'}).each(function(pair) {\r
+ var property = pair.first(), attribute = pair.last();\r
+ var value = (element[property] || '').toString();\r
+ if (value) result += ' ' + attribute + '=' + value.inspect(true);\r
+ });\r
+ return result + '>';\r
+ },\r
+\r
+ recursivelyCollect: function(element, property) {\r
+ element = $(element);\r
+ var elements = [];\r
+ while (element = element[property])\r
+ if (element.nodeType == 1)\r
+ elements.push(Element.extend(element));\r
+ return elements;\r
+ },\r
+\r
+ ancestors: function(element) {\r
+ return $(element).recursivelyCollect('parentNode');\r
+ },\r
+\r
+ descendants: function(element) {\r
+ element = $(element);\r
+ return $A(element.getElementsByTagName('*'));\r
+ },\r
+\r
+ previousSiblings: function(element) {\r
+ return $(element).recursivelyCollect('previousSibling');\r
+ },\r
+\r
+ nextSiblings: function(element) {\r
+ return $(element).recursivelyCollect('nextSibling');\r
+ },\r
+\r
+ siblings: function(element) {\r
+ element = $(element);\r
+ return element.previousSiblings().reverse().concat(element.nextSiblings());\r
+ },\r
+\r
+ match: function(element, selector) {\r
+ element = $(element);\r
+ if (typeof selector == 'string')\r
+ selector = new Selector(selector);\r
+ return selector.match(element);\r
+ },\r
+\r
+ up: function(element, expression, index) {\r
+ return Selector.findElement($(element).ancestors(), expression, index);\r
+ },\r
+\r
+ down: function(element, expression, index) {\r
+ return Selector.findElement($(element).descendants(), expression, index);\r
+ },\r
+\r
+ previous: function(element, expression, index) {\r
+ return Selector.findElement($(element).previousSiblings(), expression, index);\r
+ },\r
+\r
+ next: function(element, expression, index) {\r
+ return Selector.findElement($(element).nextSiblings(), expression, index);\r
+ },\r
+\r
+ getElementsBySelector: function() {\r
+ var args = $A(arguments), element = $(args.shift());\r
+ return Selector.findChildElements(element, args);\r
+ },\r
+\r
+ getElementsByClassName: function(element, className) {\r
+ element = $(element);\r
+ return document.getElementsByClassName(className, element);\r
+ },\r
+\r
+ getHeight: function(element) {\r
+ element = $(element);\r
+ return element.offsetHeight;\r
+ },\r
+\r
+ classNames: function(element) {\r
+ return new Element.ClassNames(element);\r
+ },\r
+\r
+ hasClassName: function(element, className) {\r
+ if (!(element = $(element))) return;\r
+ return Element.classNames(element).include(className);\r
+ },\r
+\r
+ addClassName: function(element, className) {\r
+ if (!(element = $(element))) return;\r
+ Element.classNames(element).add(className);\r
+ return element;\r
+ },\r
+\r
+ removeClassName: function(element, className) {\r
+ if (!(element = $(element))) return;\r
+ Element.classNames(element).remove(className);\r
+ return element;\r
+ },\r
+\r
+ observe: function() {\r
+ Event.observe.apply(Event, arguments);\r
+ return $A(arguments).first();\r
+ },\r
+\r
+ stopObserving: function() {\r
+ Event.stopObserving.apply(Event, arguments);\r
+ return $A(arguments).first();\r
+ },\r
+\r
+ // removes whitespace-only text node children\r
+ cleanWhitespace: function(element) {\r
+ element = $(element);\r
+ var node = element.firstChild;\r
+ while (node) {\r
+ var nextNode = node.nextSibling;\r
+ if (node.nodeType == 3 && !/\S/.test(node.nodeValue))\r
+ element.removeChild(node);\r
+ node = nextNode;\r
+ }\r
+ return element;\r
+ },\r
+\r
+ empty: function(element) {\r
+ return $(element).innerHTML.match(/^\s*$/);\r
+ },\r
+\r
+ childOf: function(element, ancestor) {\r
+ element = $(element), ancestor = $(ancestor);\r
+ while (element = element.parentNode)\r
+ if (element == ancestor) return true;\r
+ return false;\r
+ },\r
+\r
+ scrollTo: function(element) {\r
+ element = $(element);\r
+ var x = element.x ? element.x : element.offsetLeft,\r
+ y = element.y ? element.y : element.offsetTop;\r
+ window.scrollTo(x, y);\r
+ return element;\r
+ },\r
+\r
+ getStyle: function(element, style) {\r
+ element = $(element);\r
+ var value = element.style[style.camelize()];\r
+ if (!value) {\r
+ if (document.defaultView && document.defaultView.getComputedStyle) {\r
+ var css = document.defaultView.getComputedStyle(element, null);\r
+ value = css ? css.getPropertyValue(style) : null;\r
+ } else if (element.currentStyle) {\r
+ value = element.currentStyle[style.camelize()];\r
+ }\r
+ }\r
+\r
+ if (window.opera && ['left', 'top', 'right', 'bottom'].include(style))\r
+ if (Element.getStyle(element, 'position') == 'static') value = 'auto';\r
+\r
+ return value == 'auto' ? null : value;\r
+ },\r
+\r
+ setStyle: function(element, style) {\r
+ element = $(element);\r
+ for (var name in style)\r
+ element.style[name.camelize()] = style[name];\r
+ return element;\r
+ },\r
+\r
+ getDimensions: function(element) {\r
+ element = $(element);\r
+ if (Element.getStyle(element, 'display') != 'none')\r
+ return {width: element.offsetWidth, height: element.offsetHeight};\r
+\r
+ // All *Width and *Height properties give 0 on elements with display none,\r
+ // so enable the element temporarily\r
+ var els = element.style;\r
+ var originalVisibility = els.visibility;\r
+ var originalPosition = els.position;\r
+ els.visibility = 'hidden';\r
+ els.position = 'absolute';\r
+ els.display = '';\r
+ var originalWidth = element.clientWidth;\r
+ var originalHeight = element.clientHeight;\r
+ els.display = 'none';\r
+ els.position = originalPosition;\r
+ els.visibility = originalVisibility;\r
+ return {width: originalWidth, height: originalHeight};\r
+ },\r
+\r
+ makePositioned: function(element) {\r
+ element = $(element);\r
+ var pos = Element.getStyle(element, 'position');\r
+ if (pos == 'static' || !pos) {\r
+ element._madePositioned = true;\r
+ element.style.position = 'relative';\r
+ // Opera returns the offset relative to the positioning context, when an\r
+ // element is position relative but top and left have not been defined\r
+ if (window.opera) {\r
+ element.style.top = 0;\r
+ element.style.left = 0;\r
+ }\r
+ }\r
+ return element;\r
+ },\r
+\r
+ undoPositioned: function(element) {\r
+ element = $(element);\r
+ if (element._madePositioned) {\r
+ element._madePositioned = undefined;\r
+ element.style.position =\r
+ element.style.top =\r
+ element.style.left =\r
+ element.style.bottom =\r
+ element.style.right = '';\r
+ }\r
+ return element;\r
+ },\r
+\r
+ makeClipping: function(element) {\r
+ element = $(element);\r
+ if (element._overflow) return;\r
+ element._overflow = element.style.overflow || 'auto';\r
+ if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden')\r
+ element.style.overflow = 'hidden';\r
+ return element;\r
+ },\r
+\r
+ undoClipping: function(element) {\r
+ element = $(element);\r
+ if (!element._overflow) return;\r
+ element.style.overflow = element._overflow == 'auto' ? '' : element._overflow;\r
+ element._overflow = null;\r
+ return element;\r
+ }\r
+}\r
+\r
+// IE is missing .innerHTML support for TABLE-related elements\r
+if(document.all){\r
+ Element.Methods.update = function(element, html) {\r
+ element = $(element);\r
+ var tagName = element.tagName.toUpperCase();\r
+ if (['THEAD','TBODY','TR','TD'].indexOf(tagName) > -1) {\r
+ var div = document.createElement('div');\r
+ switch (tagName) {\r
+ case 'THEAD':\r
+ case 'TBODY':\r
+ div.innerHTML = '<table><tbody>' + html.stripScripts() + '</tbody></table>';\r
+ depth = 2;\r
+ break;\r
+ case 'TR':\r
+ div.innerHTML = '<table><tbody><tr>' + html.stripScripts() + '</tr></tbody></table>';\r
+ depth = 3;\r
+ break;\r
+ case 'TD':\r
+ div.innerHTML = '<table><tbody><tr><td>' + html.stripScripts() + '</td></tr></tbody></table>';\r
+ depth = 4;\r
+ }\r
+ $A(element.childNodes).each(function(node){\r
+ element.removeChild(node)\r
+ });\r
+ depth.times(function(){ div = div.firstChild });\r
+\r
+ $A(div.childNodes).each(\r
+ function(node){ element.appendChild(node) });\r
+ } else {\r
+ element.innerHTML = html.stripScripts();\r
+ }\r
+ setTimeout(function() {html.evalScripts()}, 10);\r
+ return element;\r
+ }\r
+}\r
+\r
+Object.extend(Element, Element.Methods);\r
+\r
+var _nativeExtensions = false;\r
+\r
+if (!window.HTMLElement && /Konqueror|Safari|KHTML/.test(navigator.userAgent)) {\r
+ /* Emulate HTMLElement, HTMLFormElement, HTMLInputElement, HTMLTextAreaElement,\r
+ and HTMLSelectElement in Safari */\r
+ ['', 'Form', 'Input', 'TextArea', 'Select'].each(function(tag) {\r
+ var klass = window['HTML' + tag + 'Element'] = {};\r
+ klass.prototype = document.createElement(tag ? tag.toLowerCase() : 'div').__proto__;\r
+ });\r
+}\r
+\r
+Element.addMethods = function(methods) {\r
+ Object.extend(Element.Methods, methods || {});\r
+\r
+ function copy(methods, destination) {\r
+ var cache = Element.extend.cache;\r
+ for (var property in methods) {\r
+ var value = methods[property];\r
+ destination[property] = cache.findOrStore(value);\r
+ }\r
+ }\r
+\r
+ if (typeof HTMLElement != 'undefined') {\r
+ copy(Element.Methods, HTMLElement.prototype);\r
+ copy(Form.Methods, HTMLFormElement.prototype);\r
+ [HTMLInputElement, HTMLTextAreaElement, HTMLSelectElement].each(function(klass) {\r
+ copy(Form.Element.Methods, klass.prototype);\r
+ });\r
+ _nativeExtensions = true;\r
+ }\r
+}\r
+\r
+var Toggle = new Object();\r
+Toggle.display = Element.toggle;\r
+\r
+/*--------------------------------------------------------------------------*/\r
+\r
+Abstract.Insertion = function(adjacency) {\r
+ this.adjacency = adjacency;\r
+}\r
+\r
+Abstract.Insertion.prototype = {\r
+ initialize: function(element, content) {\r
+ this.element = $(element);\r
+ this.content = content.stripScripts();\r
+\r
+ if (this.adjacency && this.element.insertAdjacentHTML) {\r
+ try {\r
+ this.element.insertAdjacentHTML(this.adjacency, this.content);\r
+ } catch (e) {\r
+ var tagName = this.element.tagName.toLowerCase();\r
+ if (tagName == 'tbody' || tagName == 'tr') {\r
+ this.insertContent(this.contentFromAnonymousTable());\r
+ } else {\r
+ throw e;\r
+ }\r
+ }\r
+ } else {\r
+ this.range = this.element.ownerDocument.createRange();\r
+ if (this.initializeRange) this.initializeRange();\r
+ this.insertContent([this.range.createContextualFragment(this.content)]);\r
+ }\r
+\r
+ setTimeout(function() {content.evalScripts()}, 10);\r
+ },\r
+\r
+ contentFromAnonymousTable: function() {\r
+ var div = document.createElement('div');\r
+ div.innerHTML = '<table><tbody>' + this.content + '</tbody></table>';\r
+ return $A(div.childNodes[0].childNodes[0].childNodes);\r
+ }\r
+}\r
+\r
+var Insertion = new Object();\r
+\r
+Insertion.Before = Class.create();\r
+Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), {\r
+ initializeRange: function() {\r
+ this.range.setStartBefore(this.element);\r
+ },\r
+\r
+ insertContent: function(fragments) {\r
+ fragments.each((function(fragment) {\r
+ this.element.parentNode.insertBefore(fragment, this.element);\r
+ }).bind(this));\r
+ }\r
+});\r
+\r
+Insertion.Top = Class.create();\r
+Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), {\r
+ initializeRange: function() {\r
+ this.range.selectNodeContents(this.element);\r
+ this.range.collapse(true);\r
+ },\r
+\r
+ insertContent: function(fragments) {\r
+ fragments.reverse(false).each((function(fragment) {\r
+ this.element.insertBefore(fragment, this.element.firstChild);\r
+ }).bind(this));\r
+ }\r
+});\r
+\r
+Insertion.Bottom = Class.create();\r
+Insertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), {\r
+ initializeRange: function() {\r
+ this.range.selectNodeContents(this.element);\r
+ this.range.collapse(this.element);\r
+ },\r
+\r
+ insertContent: function(fragments) {\r
+ fragments.each((function(fragment) {\r
+ this.element.appendChild(fragment);\r
+ }).bind(this));\r
+ }\r
+});\r
+\r
+Insertion.After = Class.create();\r
+Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), {\r
+ initializeRange: function() {\r
+ this.range.setStartAfter(this.element);\r
+ },\r
+\r
+ insertContent: function(fragments) {\r
+ fragments.each((function(fragment) {\r
+ this.element.parentNode.insertBefore(fragment,\r
+ this.element.nextSibling);\r
+ }).bind(this));\r
+ }\r
+});\r
+\r
+/*--------------------------------------------------------------------------*/\r
+\r
+Element.ClassNames = Class.create();\r
+Element.ClassNames.prototype = {\r
+ initialize: function(element) {\r
+ this.element = $(element);\r
+ },\r
+\r
+ _each: function(iterator) {\r
+ this.element.className.split(/\s+/).select(function(name) {\r
+ return name.length > 0;\r
+ })._each(iterator);\r
+ },\r
+\r
+ set: function(className) {\r
+ this.element.className = className;\r
+ },\r
+\r
+ add: function(classNameToAdd) {\r
+ if (this.include(classNameToAdd)) return;\r
+ this.set(this.toArray().concat(classNameToAdd).join(' '));\r
+ },\r
+\r
+ remove: function(classNameToRemove) {\r
+ if (!this.include(classNameToRemove)) return;\r
+ this.set(this.select(function(className) {\r
+ return className != classNameToRemove;\r
+ }).join(' '));\r
+ },\r
+\r
+ toString: function() {\r
+ return this.toArray().join(' ');\r
+ }\r
+}\r
+\r
+Object.extend(Element.ClassNames.prototype, Enumerable);\r
+var Selector = Class.create();\r
+Selector.prototype = {\r
+ initialize: function(expression) {\r
+ this.params = {classNames: []};\r
+ this.expression = expression.toString().strip();\r
+ this.parseExpression();\r
+ this.compileMatcher();\r
+ },\r
+\r
+ parseExpression: function() {\r
+ function abort(message) { throw 'Parse error in selector: ' + message; }\r
+\r
+ if (this.expression == '') abort('empty expression');\r
+\r
+ var params = this.params, expr = this.expression, match, modifier, clause, rest;\r
+ while (match = expr.match(/^(.*)\[([a-z0-9_:-]+?)(?:([~\|!]?=)(?:"([^"]*)"|([^\]\s]*)))?\]$/i)) {\r
+ params.attributes = params.attributes || [];\r
+ params.attributes.push({name: match[2], operator: match[3], value: match[4] || match[5] || ''});\r
+ expr = match[1];\r
+ }\r
+\r
+ if (expr == '*') return this.params.wildcard = true;\r
+\r
+ while (match = expr.match(/^([^a-z0-9_-])?([a-z0-9_-]+)(.*)/i)) {\r
+ modifier = match[1], clause = match[2], rest = match[3];\r
+ switch (modifier) {\r
+ case '#': params.id = clause; break;\r
+ case '.': params.classNames.push(clause); break;\r
+ case '':\r
+ case undefined: params.tagName = clause.toUpperCase(); break;\r
+ default: abort(expr.inspect());\r
+ }\r
+ expr = rest;\r
+ }\r
+\r
+ if (expr.length > 0) abort(expr.inspect());\r
+ },\r
+\r
+ buildMatchExpression: function() {\r
+ var params = this.params, conditions = [], clause;\r
+\r
+ if (params.wildcard)\r
+ conditions.push('true');\r
+ if (clause = params.id)\r
+ conditions.push('element.id == ' + clause.inspect());\r
+ if (clause = params.tagName)\r
+ conditions.push('element.tagName.toUpperCase() == ' + clause.inspect());\r
+ if ((clause = params.classNames).length > 0)\r
+ for (var i = 0; i < clause.length; i++)\r
+ conditions.push('Element.hasClassName(element, ' + clause[i].inspect() + ')');\r
+ if (clause = params.attributes) {\r
+ clause.each(function(attribute) {\r
+ var value = 'element.getAttribute(' + attribute.name.inspect() + ')';\r
+ var splitValueBy = function(delimiter) {\r
+ return value + ' && ' + value + '.split(' + delimiter.inspect() + ')';\r
+ }\r
+\r
+ switch (attribute.operator) {\r
+ case '=': conditions.push(value + ' == ' + attribute.value.inspect()); break;\r
+ case '~=': conditions.push(splitValueBy(' ') + '.include(' + attribute.value.inspect() + ')'); break;\r
+ case '|=': conditions.push(\r
+ splitValueBy('-') + '.first().toUpperCase() == ' + attribute.value.toUpperCase().inspect()\r
+ ); break;\r
+ case '!=': conditions.push(value + ' != ' + attribute.value.inspect()); break;\r
+ case '':\r
+ case undefined: conditions.push(value + ' != null'); break;\r
+ default: throw 'Unknown operator ' + attribute.operator + ' in selector';\r
+ }\r
+ });\r
+ }\r
+\r
+ return conditions.join(' && ');\r
+ },\r
+\r
+ compileMatcher: function() {\r
+ this.match = new Function('element', 'if (!element.tagName) return false; \\r
+ return ' + this.buildMatchExpression());\r
+ },\r
+\r
+ findElements: function(scope) {\r
+ var element;\r
+\r
+ if (element = $(this.params.id))\r
+ if (this.match(element))\r
+ if (!scope || Element.childOf(element, scope))\r
+ return [element];\r
+\r
+ scope = (scope || document).getElementsByTagName(this.params.tagName || '*');\r
+\r
+ var results = [];\r
+ for (var i = 0; i < scope.length; i++)\r
+ if (this.match(element = scope[i]))\r
+ results.push(Element.extend(element));\r
+\r
+ return results;\r
+ },\r
+\r
+ toString: function() {\r
+ return this.expression;\r
+ }\r
+}\r
+\r
+Object.extend(Selector, {\r
+ matchElements: function(elements, expression) {\r
+ var selector = new Selector(expression);\r
+ return elements.select(selector.match.bind(selector));\r
+ },\r
+\r
+ findElement: function(elements, expression, index) {\r
+ if (typeof expression == 'number') index = expression, expression = false;\r
+ return Selector.matchElements(elements, expression || '*')[index || 0];\r
+ },\r
+\r
+ findChildElements: function(element, expressions) {\r
+ return expressions.map(function(expression) {\r
+ return expression.strip().split(/\s+/).inject([null], function(results, expr) {\r
+ var selector = new Selector(expr);\r
+ return results.inject([], function(elements, result) {\r
+ return elements.concat(selector.findElements(result || element));\r
+ });\r
+ });\r
+ }).flatten();\r
+ }\r
+});\r
+\r
+function $$() {\r
+ return Selector.findChildElements(document, $A(arguments));\r
+}\r
+var Form = {\r
+ reset: function(form) {\r
+ $(form).reset();\r
+ return form;\r
+ }\r
+};\r
+\r
+Form.Methods = {\r
+ serialize: function(form) {\r
+ var elements = Form.getElements($(form));\r
+ var queryComponents = new Array();\r
+\r
+ for (var i = 0; i < elements.length; i++) {\r
+ var queryComponent = Form.Element.serialize(elements[i]);\r
+ if (queryComponent)\r
+ queryComponents.push(queryComponent);\r
+ }\r
+\r
+ return queryComponents.join('&');\r
+ },\r
+\r
+ getElements: function(form) {\r
+ form = $(form);\r
+ var elements = new Array();\r
+\r
+ for (var tagName in Form.Element.Serializers) {\r
+ var tagElements = form.getElementsByTagName(tagName);\r
+ for (var j = 0; j < tagElements.length; j++)\r
+ elements.push(tagElements[j]);\r
+ }\r
+ return elements;\r
+ },\r
+\r
+ getInputs: function(form, typeName, name) {\r
+ form = $(form);\r
+ var inputs = form.getElementsByTagName('input');\r
+\r
+ if (!typeName && !name)\r
+ return inputs;\r
+\r
+ var matchingInputs = new Array();\r
+ for (var i = 0; i < inputs.length; i++) {\r
+ var input = inputs[i];\r
+ if ((typeName && input.type != typeName) ||\r
+ (name && input.name != name))\r
+ continue;\r
+ matchingInputs.push(input);\r
+ }\r
+\r
+ return matchingInputs;\r
+ },\r
+\r
+ disable: function(form) {\r
+ form = $(form);\r
+ var elements = Form.getElements(form);\r
+ for (var i = 0; i < elements.length; i++) {\r
+ var element = elements[i];\r
+ element.blur();\r
+ element.disabled = 'true';\r
+ }\r
+ return form;\r
+ },\r
+\r
+ enable: function(form) {\r
+ form = $(form);\r
+ var elements = Form.getElements(form);\r
+ for (var i = 0; i < elements.length; i++) {\r
+ var element = elements[i];\r
+ element.disabled = '';\r
+ }\r
+ return form;\r
+ },\r
+\r
+ findFirstElement: function(form) {\r
+ return Form.getElements(form).find(function(element) {\r
+ return element.type != 'hidden' && !element.disabled &&\r
+ ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());\r
+ });\r
+ },\r
+\r
+ focusFirstElement: function(form) {\r
+ form = $(form);\r
+ Field.activate(Form.findFirstElement(form));\r
+ return form;\r
+ }\r
+}\r
+\r
+Object.extend(Form, Form.Methods);\r
+\r
+/*--------------------------------------------------------------------------*/\r
+\r
+Form.Element = {\r
+ focus: function(element) {\r
+ $(element).focus();\r
+ return element;\r
+ },\r
+\r
+ select: function(element) {\r
+ $(element).select();\r
+ return element;\r
+ }\r
+}\r
+\r
+Form.Element.Methods = {\r
+ serialize: function(element) {\r
+ element = $(element);\r
+ var method = element.tagName.toLowerCase();\r
+ var parameter = Form.Element.Serializers[method](element);\r
+\r
+ if (parameter) {\r
+ var key = encodeURIComponent(parameter[0]);\r
+ if (key.length == 0) return;\r
+\r
+ if (parameter[1].constructor != Array)\r
+ parameter[1] = [parameter[1]];\r
+\r
+ return parameter[1].map(function(value) {\r
+ return key + '=' + encodeURIComponent(value);\r
+ }).join('&');\r
+ }\r
+ },\r
+\r
+ getValue: function(element) {\r
+ element = $(element);\r
+ var method = element.tagName.toLowerCase();\r
+ var parameter = Form.Element.Serializers[method](element);\r
+\r
+ if (parameter)\r
+ return parameter[1];\r
+ },\r
+\r
+ clear: function(element) {\r
+ $(element).value = '';\r
+ return element;\r
+ },\r
+\r
+ present: function(element) {\r
+ return $(element).value != '';\r
+ },\r
+\r
+ activate: function(element) {\r
+ element = $(element);\r
+ element.focus();\r
+ if (element.select)\r
+ element.select();\r
+ return element;\r
+ },\r
+\r
+ disable: function(element) {\r
+ element = $(element);\r
+ element.disabled = '';\r
+ return element;\r
+ },\r
+\r
+ enable: function(element) {\r
+ element = $(element);\r
+ element.blur();\r
+ element.disabled = 'true';\r
+ return element;\r
+ }\r
+}\r
+\r
+Object.extend(Form.Element, Form.Element.Methods);\r
+var Field = Form.Element;\r
+\r
+/*--------------------------------------------------------------------------*/\r
+\r
+Form.Element.Serializers = {\r
+ input: function(element) {\r
+ switch (element.type.toLowerCase()) {\r
+ case 'checkbox':\r
+ case 'radio':\r
+ return Form.Element.Serializers.inputSelector(element);\r
+ default:\r
+ return Form.Element.Serializers.textarea(element);\r
+ }\r
+ return false;\r
+ },\r
+\r
+ inputSelector: function(element) {\r
+ if (element.checked)\r
+ return [element.name, element.value];\r
+ },\r
+\r
+ textarea: function(element) {\r
+ return [element.name, element.value];\r
+ },\r
+\r
+ select: function(element) {\r
+ return Form.Element.Serializers[element.type == 'select-one' ?\r
+ 'selectOne' : 'selectMany'](element);\r
+ },\r
+\r
+ selectOne: function(element) {\r
+ var value = '', opt, index = element.selectedIndex;\r
+ if (index >= 0) {\r
+ opt = element.options[index];\r
+ value = opt.value || opt.text;\r
+ }\r
+ return [element.name, value];\r
+ },\r
+\r
+ selectMany: function(element) {\r
+ var value = [];\r
+ for (var i = 0; i < element.length; i++) {\r
+ var opt = element.options[i];\r
+ if (opt.selected)\r
+ value.push(opt.value || opt.text);\r
+ }\r
+ return [element.name, value];\r
+ }\r
+}\r
+\r
+/*--------------------------------------------------------------------------*/\r
+\r
+var $F = Form.Element.getValue;\r
+\r
+/*--------------------------------------------------------------------------*/\r
+\r
+Abstract.TimedObserver = function() {}\r
+Abstract.TimedObserver.prototype = {\r
+ initialize: function(element, frequency, callback) {\r
+ this.frequency = frequency;\r
+ this.element = $(element);\r
+ this.callback = callback;\r
+\r
+ this.lastValue = this.getValue();\r
+ this.registerCallback();\r
+ },\r
+\r
+ registerCallback: function() {\r
+ setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);\r
+ },\r
+\r
+ onTimerEvent: function() {\r
+ var value = this.getValue();\r
+ if (this.lastValue != value) {\r
+ this.callback(this.element, value);\r
+ this.lastValue = value;\r
+ }\r
+ }\r
+}\r
+\r
+Form.Element.Observer = Class.create();\r
+Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {\r
+ getValue: function() {\r
+ return Form.Element.getValue(this.element);\r
+ }\r
+});\r
+\r
+Form.Observer = Class.create();\r
+Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {\r
+ getValue: function() {\r
+ return Form.serialize(this.element);\r
+ }\r
+});\r
+\r
+/*--------------------------------------------------------------------------*/\r
+\r
+Abstract.EventObserver = function() {}\r
+Abstract.EventObserver.prototype = {\r
+ initialize: function(element, callback) {\r
+ this.element = $(element);\r
+ this.callback = callback;\r
+\r
+ this.lastValue = this.getValue();\r
+ if (this.element.tagName.toLowerCase() == 'form')\r
+ this.registerFormCallbacks();\r
+ else\r
+ this.registerCallback(this.element);\r
+ },\r
+\r
+ onElementEvent: function() {\r
+ var value = this.getValue();\r
+ if (this.lastValue != value) {\r
+ this.callback(this.element, value);\r
+ this.lastValue = value;\r
+ }\r
+ },\r
+\r
+ registerFormCallbacks: function() {\r
+ var elements = Form.getElements(this.element);\r
+ for (var i = 0; i < elements.length; i++)\r
+ this.registerCallback(elements[i]);\r
+ },\r
+\r
+ registerCallback: function(element) {\r
+ if (element.type) {\r
+ switch (element.type.toLowerCase()) {\r
+ case 'checkbox':\r
+ case 'radio':\r
+ Event.observe(element, 'click', this.onElementEvent.bind(this));\r
+ break;\r
+ default:\r
+ Event.observe(element, 'change', this.onElementEvent.bind(this));\r
+ break;\r
+ }\r
+ }\r
+ }\r
+}\r
+\r
+Form.Element.EventObserver = Class.create();\r
+Form.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {\r
+ getValue: function() {\r
+ return Form.Element.getValue(this.element);\r
+ }\r
+});\r
+\r
+Form.EventObserver = Class.create();\r
+Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {\r
+ getValue: function() {\r
+ return Form.serialize(this.element);\r
+ }\r
+});\r
+if (!window.Event) {\r
+ var Event = new Object();\r
+}\r
+\r
+Object.extend(Event, {\r
+ KEY_BACKSPACE: 8,\r
+ KEY_TAB: 9,\r
+ KEY_RETURN: 13,\r
+ KEY_ESC: 27,\r
+ KEY_LEFT: 37,\r
+ KEY_UP: 38,\r
+ KEY_RIGHT: 39,\r
+ KEY_DOWN: 40,\r
+ KEY_DELETE: 46,\r
+ KEY_HOME: 36,\r
+ KEY_END: 35,\r
+ KEY_PAGEUP: 33,\r
+ KEY_PAGEDOWN: 34,\r
+\r
+ element: function(event) {\r
+ return event.target || event.srcElement;\r
+ },\r
+\r
+ isLeftClick: function(event) {\r
+ return (((event.which) && (event.which == 1)) ||\r
+ ((event.button) && (event.button == 1)));\r
+ },\r
+\r
+ pointerX: function(event) {\r
+ return event.pageX || (event.clientX +\r
+ (document.documentElement.scrollLeft || document.body.scrollLeft));\r
+ },\r
+\r
+ pointerY: function(event) {\r
+ return event.pageY || (event.clientY +\r
+ (document.documentElement.scrollTop || document.body.scrollTop));\r
+ },\r
+\r
+ stop: function(event) {\r
+ if (event.preventDefault) {\r
+ event.preventDefault();\r
+ event.stopPropagation();\r
+ } else {\r
+ event.returnValue = false;\r
+ event.cancelBubble = true;\r
+ }\r
+ },\r
+\r
+ // find the first node with the given tagName, starting from the\r
+ // node the event was triggered on; traverses the DOM upwards\r
+ findElement: function(event, tagName) {\r
+ var element = Event.element(event);\r
+ while (element.parentNode && (!element.tagName ||\r
+ (element.tagName.toUpperCase() != tagName.toUpperCase())))\r
+ element = element.parentNode;\r
+ return element;\r
+ },\r
+\r
+ observers: false,\r
+\r
+ _observeAndCache: function(element, name, observer, useCapture) {\r
+ if (!this.observers) this.observers = [];\r
+ if (element.addEventListener) {\r
+ this.observers.push([element, name, observer, useCapture]);\r
+ element.addEventListener(name, observer, useCapture);\r
+ } else if (element.attachEvent) {\r
+ this.observers.push([element, name, observer, useCapture]);\r
+ element.attachEvent('on' + name, observer);\r
+ }\r
+ },\r
+\r
+ unloadCache: function() {\r
+ if (!Event.observers) return;\r
+ for (var i = 0; i < Event.observers.length; i++) {\r
+ Event.stopObserving.apply(this, Event.observers[i]);\r
+ Event.observers[i][0] = null;\r
+ }\r
+ Event.observers = false;\r
+ },\r
+\r
+ observe: function(element, name, observer, useCapture) {\r
+ element = $(element);\r
+ useCapture = useCapture || false;\r
+\r
+ if (name == 'keypress' &&\r
+ (navigator.appVersion.match(/Konqueror|Safari|KHTML/)\r
+ || element.attachEvent))\r
+ name = 'keydown';\r
+\r
+ Event._observeAndCache(element, name, observer, useCapture);\r
+ },\r
+\r
+ stopObserving: function(element, name, observer, useCapture) {\r
+ element = $(element);\r
+ useCapture = useCapture || false;\r
+\r
+ if (name == 'keypress' &&\r
+ (navigator.appVersion.match(/Konqueror|Safari|KHTML/)\r
+ || element.detachEvent))\r
+ name = 'keydown';\r
+\r
+ if (element.removeEventListener) {\r
+ element.removeEventListener(name, observer, useCapture);\r
+ } else if (element.detachEvent) {\r
+ try {\r
+ element.detachEvent('on' + name, observer);\r
+ } catch (e) {}\r
+ }\r
+ }\r
+});\r
+\r
+/* prevent memory leaks in IE */\r
+if (navigator.appVersion.match(/\bMSIE\b/))\r
+ Event.observe(window, 'unload', Event.unloadCache, false);\r
+var Position = {\r
+ // set to true if needed, warning: firefox performance problems\r
+ // NOT neeeded for page scrolling, only if draggable contained in\r
+ // scrollable elements\r
+ includeScrollOffsets: false,\r
+\r
+ // must be called before calling withinIncludingScrolloffset, every time the\r
+ // page is scrolled\r
+ prepare: function() {\r
+ this.deltaX = window.pageXOffset\r
+ || document.documentElement.scrollLeft\r
+ || document.body.scrollLeft\r
+ || 0;\r
+ this.deltaY = window.pageYOffset\r
+ || document.documentElement.scrollTop\r
+ || document.body.scrollTop\r
+ || 0;\r
+ },\r
+\r
+ realOffset: function(element) {\r
+ var valueT = 0, valueL = 0;\r
+ do {\r
+ valueT += element.scrollTop || 0;\r
+ valueL += element.scrollLeft || 0;\r
+ element = element.parentNode;\r
+ } while (element);\r
+ return [valueL, valueT];\r
+ },\r
+\r
+ cumulativeOffset: function(element) {\r
+ var valueT = 0, valueL = 0;\r
+ do {\r
+ valueT += element.offsetTop || 0;\r
+ valueL += element.offsetLeft || 0;\r
+ element = element.offsetParent;\r
+ } while (element);\r
+ return [valueL, valueT];\r
+ },\r
+\r
+ positionedOffset: function(element) {\r
+ var valueT = 0, valueL = 0;\r
+ do {\r
+ valueT += element.offsetTop || 0;\r
+ valueL += element.offsetLeft || 0;\r
+ element = element.offsetParent;\r
+ if (element) {\r
+ p = Element.getStyle(element, 'position');\r
+ if (p == 'relative' || p == 'absolute') break;\r
+ }\r
+ } while (element);\r
+ return [valueL, valueT];\r
+ },\r
+\r
+ offsetParent: function(element) {\r
+ if (element.offsetParent) return element.offsetParent;\r
+ if (element == document.body) return element;\r
+\r
+ while ((element = element.parentNode) && element != document.body)\r
+ if (Element.getStyle(element, 'position') != 'static')\r
+ return element;\r
+\r
+ return document.body;\r
+ },\r
+\r
+ // caches x/y coordinate pair to use with overlap\r
+ within: function(element, x, y) {\r
+ if (this.includeScrollOffsets)\r
+ return this.withinIncludingScrolloffsets(element, x, y);\r
+ this.xcomp = x;\r
+ this.ycomp = y;\r
+ this.offset = this.cumulativeOffset(element);\r
+\r
+ return (y >= this.offset[1] &&\r
+ y < this.offset[1] + element.offsetHeight &&\r
+ x >= this.offset[0] &&\r
+ x < this.offset[0] + element.offsetWidth);\r
+ },\r
+\r
+ withinIncludingScrolloffsets: function(element, x, y) {\r
+ var offsetcache = this.realOffset(element);\r
+\r
+ this.xcomp = x + offsetcache[0] - this.deltaX;\r
+ this.ycomp = y + offsetcache[1] - this.deltaY;\r
+ this.offset = this.cumulativeOffset(element);\r
+\r
+ return (this.ycomp >= this.offset[1] &&\r
+ this.ycomp < this.offset[1] + element.offsetHeight &&\r
+ this.xcomp >= this.offset[0] &&\r
+ this.xcomp < this.offset[0] + element.offsetWidth);\r
+ },\r
+\r
+ // within must be called directly before\r
+ overlap: function(mode, element) {\r
+ if (!mode) return 0;\r
+ if (mode == 'vertical')\r
+ return ((this.offset[1] + element.offsetHeight) - this.ycomp) /\r
+ element.offsetHeight;\r
+ if (mode == 'horizontal')\r
+ return ((this.offset[0] + element.offsetWidth) - this.xcomp) /\r
+ element.offsetWidth;\r
+ },\r
+\r
+ page: function(forElement) {\r
+ var valueT = 0, valueL = 0;\r
+\r
+ var element = forElement;\r
+ do {\r
+ valueT += element.offsetTop || 0;\r
+ valueL += element.offsetLeft || 0;\r
+\r
+ // Safari fix\r
+ if (element.offsetParent==document.body)\r
+ if (Element.getStyle(element,'position')=='absolute') break;\r
+\r
+ } while (element = element.offsetParent);\r
+\r
+ element = forElement;\r
+ do {\r
+ if (!window.opera || element.tagName=='BODY') {\r
+ valueT -= element.scrollTop || 0;\r
+ valueL -= element.scrollLeft || 0;\r
+ }\r
+ } while (element = element.parentNode);\r
+\r
+ return [valueL, valueT];\r
+ },\r
+\r
+ clone: function(source, target) {\r
+ var options = Object.extend({\r
+ setLeft: true,\r
+ setTop: true,\r
+ setWidth: true,\r
+ setHeight: true,\r
+ offsetTop: 0,\r
+ offsetLeft: 0\r
+ }, arguments[2] || {})\r
+\r
+ // find page position of source\r
+ source = $(source);\r
+ var p = Position.page(source);\r
+\r
+ // find coordinate system to use\r
+ target = $(target);\r
+ var delta = [0, 0];\r
+ var parent = null;\r
+ // delta [0,0] will do fine with position: fixed elements,\r
+ // position:absolute needs offsetParent deltas\r
+ if (Element.getStyle(target,'position') == 'absolute') {\r
+ parent = Position.offsetParent(target);\r
+ delta = Position.page(parent);\r
+ }\r
+\r
+ // correct by body offsets (fixes Safari)\r
+ if (parent == document.body) {\r
+ delta[0] -= document.body.offsetLeft;\r
+ delta[1] -= document.body.offsetTop;\r
+ }\r
+\r
+ // set position\r
+ if(options.setLeft) target.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px';\r
+ if(options.setTop) target.style.top = (p[1] - delta[1] + options.offsetTop) + 'px';\r
+ if(options.setWidth) target.style.width = source.offsetWidth + 'px';\r
+ if(options.setHeight) target.style.height = source.offsetHeight + 'px';\r
+ },\r
+\r
+ absolutize: function(element) {\r
+ element = $(element);\r
+ if (element.style.position == 'absolute') return;\r
+ Position.prepare();\r
+\r
+ var offsets = Position.positionedOffset(element);\r
+ var top = offsets[1];\r
+ var left = offsets[0];\r
+ var width = element.clientWidth;\r
+ var height = element.clientHeight;\r
+\r
+ element._originalLeft = left - parseFloat(element.style.left || 0);\r
+ element._originalTop = top - parseFloat(element.style.top || 0);\r
+ element._originalWidth = element.style.width;\r
+ element._originalHeight = element.style.height;\r
+\r
+ element.style.position = 'absolute';\r
+ element.style.top = top + 'px';;\r
+ element.style.left = left + 'px';;\r
+ element.style.width = width + 'px';;\r
+ element.style.height = height + 'px';;\r
+ },\r
+\r
+ relativize: function(element) {\r
+ element = $(element);\r
+ if (element.style.position == 'relative') return;\r
+ Position.prepare();\r
+\r
+ element.style.position = 'relative';\r
+ var top = parseFloat(element.style.top || 0) - (element._originalTop || 0);\r
+ var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);\r
+\r
+ element.style.top = top + 'px';\r
+ element.style.left = left + 'px';\r
+ element.style.height = element._originalHeight;\r
+ element.style.width = element._originalWidth;\r
+ }\r
+}\r
+\r
+// Safari returns margins on body which is incorrect if the child is absolutely\r
+// positioned. For performance reasons, redefine Position.cumulativeOffset for\r
+// KHTML/WebKit only.\r
+if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) {\r
+ Position.cumulativeOffset = function(element) {\r
+ var valueT = 0, valueL = 0;\r
+ do {\r
+ valueT += element.offsetTop || 0;\r
+ valueL += element.offsetLeft || 0;\r
+ if (element.offsetParent == document.body)\r
+ if (Element.getStyle(element, 'position') == 'absolute') break;\r
+\r
+ element = element.offsetParent;\r
+ } while (element);\r
+\r
+ return [valueL, valueT];\r
+ }\r
+}\r
+\r
Element.addMethods();
\ No newline at end of file
-// Copyright (c) 2005 Thomas Fakes (http://craz8.com)
-//
-// This code is substantially based on code from script.aculo.us which has the
-// following copyright and permission notice
-//
-// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-var Resizeable = Class.create();
-Resizeable.prototype = {
- initialize: function(element) {
- var options = Object.extend({
- top: 6,
- bottom: 6,
- left: 6,
- right: 6,
- minHeight: 0,
- minWidth: 0,
- zindex: 1000,
- resize: null
- }, arguments[1] || {});
-
- this.element = $(element);
- this.handle = this.element;
-
- Element.makePositioned(this.element); // fix IE
-
- this.options = options;
-
- this.active = false;
- this.resizing = false;
- this.currentDirection = '';
-
- this.eventMouseDown = this.startResize.bindAsEventListener(this);
- this.eventMouseUp = this.endResize.bindAsEventListener(this);
- this.eventMouseMove = this.update.bindAsEventListener(this);
- this.eventCursorCheck = this.cursor.bindAsEventListener(this);
- this.eventKeypress = this.keyPress.bindAsEventListener(this);
-
- this.registerEvents();
- },
- destroy: function() {
- Event.stopObserving(this.handle, "mousedown", this.eventMouseDown);
- this.unregisterEvents();
- },
- registerEvents: function() {
- Event.observe(document, "mouseup", this.eventMouseUp);
- Event.observe(document, "mousemove", this.eventMouseMove);
- Event.observe(document, "keypress", this.eventKeypress);
- Event.observe(this.handle, "mousedown", this.eventMouseDown);
- Event.observe(this.element, "mousemove", this.eventCursorCheck);
- },
- unregisterEvents: function() {
- //if(!this.active) return;
- //Event.stopObserving(document, "mouseup", this.eventMouseUp);
- //Event.stopObserving(document, "mousemove", this.eventMouseMove);
- //Event.stopObserving(document, "mousemove", this.eventCursorCheck);
- //Event.stopObserving(document, "keypress", this.eventKeypress);
- },
- startResize: function(event) {
- if(Event.isLeftClick(event)) {
-
- // abort on form elements, fixes a Firefox issue
- var src = Event.element(event);
- if(src.tagName && (
- src.tagName=='INPUT' ||
- src.tagName=='SELECT' ||
- src.tagName=='BUTTON' ||
- src.tagName=='TEXTAREA')) return;
-
- var dir = this.directions(event);
- if (dir.length > 0) {
- this.active = true;
- var offsets = Position.cumulativeOffset(this.element);
- this.startTop = offsets[1];
- this.startLeft = offsets[0];
- this.startWidth = parseInt(Element.getStyle(this.element, 'width'));
- this.startHeight = parseInt(Element.getStyle(this.element, 'height'));
- this.startX = event.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
- this.startY = event.clientY + document.body.scrollTop + document.documentElement.scrollTop;
-
- this.currentDirection = dir;
- Event.stop(event);
- }
- }
- },
- finishResize: function(event, success) {
- // this.unregisterEvents();
-
- this.active = false;
- this.resizing = false;
-
- if(this.options.zindex)
- this.element.style.zIndex = this.originalZ;
-
- if (this.options.resize) {
- this.options.resize(this.element);
- }
- },
- keyPress: function(event) {
- if(this.active) {
- if(event.keyCode==Event.KEY_ESC) {
- this.finishResize(event, false);
- Event.stop(event);
- }
- }
- },
- endResize: function(event) {
- if(this.active && this.resizing) {
- this.finishResize(event, true);
- Event.stop(event);
- }
- this.active = false;
- this.resizing = false;
- },
- draw: function(event) {
- var pointer = [Event.pointerX(event), Event.pointerY(event)];
- var style = this.element.style;
- if (this.currentDirection.indexOf('n') != -1) {
- var pointerMoved = this.startY - pointer[1];
- var margin = Element.getStyle(this.element, 'margin-top') || "0";
- var newHeight = this.startHeight + pointerMoved;
- if (newHeight > this.options.minHeight) {
- style.height = newHeight + "px";
- style.top = (this.startTop - pointerMoved - parseInt(margin)) + "px";
- }
- }
- if (this.currentDirection.indexOf('w') != -1) {
- var pointerMoved = this.startX - pointer[0];
- var margin = Element.getStyle(this.element, 'margin-left') || "0";
- var newWidth = this.startWidth + pointerMoved;
- if (newWidth > this.options.minWidth) {
- style.left = (this.startLeft - pointerMoved - parseInt(margin)) + "px";
- style.width = newWidth + "px";
- }
- }
- if (this.currentDirection.indexOf('s') != -1) {
- var newHeight = this.startHeight + pointer[1] - this.startY;
- if (newHeight > this.options.minHeight) {
- style.height = newHeight + "px";
- }
- }
- if (this.currentDirection.indexOf('e') != -1) {
- var newWidth = this.startWidth + pointer[0] - this.startX;
- if (newWidth > this.options.minWidth) {
- style.width = newWidth + "px";
- }
- }
- if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering
- },
- between: function(val, low, high) {
- return (val >= low && val < high);
- },
- directions: function(event) {
- var pointer = [Event.pointerX(event), Event.pointerY(event)];
- var offsets = Position.cumulativeOffset(this.element);
-
- var cursor = '';
- if (this.between(pointer[1] - offsets[1], 0, this.options.top)) cursor += 'n';
- if (this.between((offsets[1] + this.element.offsetHeight) - pointer[1], 0, this.options.bottom)) cursor += 's';
- if (this.between(pointer[0] - offsets[0], 0, this.options.left)) cursor += 'w';
- if (this.between((offsets[0] + this.element.offsetWidth) - pointer[0], 0, this.options.right)) cursor += 'e';
-
- return cursor;
- },
- cursor: function(event) {
- var cursor = this.directions(event);
- if (cursor.length > 0) {
- cursor += '-resize';
- } else {
- cursor = '';
- }
- this.element.style.cursor = cursor;
- },
- update: function(event) {
- if(this.active) {
- if(!this.resizing) {
- var style = this.element.style;
- this.resizing = true;
-
- if(Element.getStyle(this.element,'position')=='')
- style.position = "relative";
-
- if(this.options.zindex) {
- this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0);
- style.zIndex = this.options.zindex;
- }
- }
- this.draw(event);
-
- // fix AppleWebKit rendering
- if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
- Event.stop(event);
- return false;
- }
- }
-}
+// Copyright (c) 2005 Thomas Fakes (http://craz8.com)\r
+// \r
+// This code is substantially based on code from script.aculo.us which has the \r
+// following copyright and permission notice\r
+//\r
+// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+var Resizeable = Class.create();\r
+Resizeable.prototype = {\r
+ initialize: function(element) {\r
+ var options = Object.extend({\r
+ top: 6,\r
+ bottom: 6,\r
+ left: 6,\r
+ right: 6,\r
+ minHeight: 0,\r
+ minWidth: 0,\r
+ zindex: 1000,\r
+ resize: null\r
+ }, arguments[1] || {});\r
+\r
+ this.element = $(element);\r
+ this.handle = this.element;\r
+\r
+ Element.makePositioned(this.element); // fix IE \r
+\r
+ this.options = options;\r
+\r
+ this.active = false;\r
+ this.resizing = false; \r
+ this.currentDirection = '';\r
+\r
+ this.eventMouseDown = this.startResize.bindAsEventListener(this);\r
+ this.eventMouseUp = this.endResize.bindAsEventListener(this);\r
+ this.eventMouseMove = this.update.bindAsEventListener(this);\r
+ this.eventCursorCheck = this.cursor.bindAsEventListener(this);\r
+ this.eventKeypress = this.keyPress.bindAsEventListener(this);\r
+ \r
+ this.registerEvents();\r
+ },\r
+ destroy: function() {\r
+ Event.stopObserving(this.handle, "mousedown", this.eventMouseDown);\r
+ this.unregisterEvents();\r
+ },\r
+ registerEvents: function() {\r
+ Event.observe(document, "mouseup", this.eventMouseUp);\r
+ Event.observe(document, "mousemove", this.eventMouseMove);\r
+ Event.observe(document, "keypress", this.eventKeypress);\r
+ Event.observe(this.handle, "mousedown", this.eventMouseDown);\r
+ Event.observe(this.element, "mousemove", this.eventCursorCheck);\r
+ },\r
+ unregisterEvents: function() {\r
+ //if(!this.active) return;\r
+ //Event.stopObserving(document, "mouseup", this.eventMouseUp);\r
+ //Event.stopObserving(document, "mousemove", this.eventMouseMove);\r
+ //Event.stopObserving(document, "mousemove", this.eventCursorCheck);\r
+ //Event.stopObserving(document, "keypress", this.eventKeypress);\r
+ },\r
+ startResize: function(event) {\r
+ if(Event.isLeftClick(event)) {\r
+ \r
+ // abort on form elements, fixes a Firefox issue\r
+ var src = Event.element(event);\r
+ if(src.tagName && (\r
+ src.tagName=='INPUT' ||\r
+ src.tagName=='SELECT' ||\r
+ src.tagName=='BUTTON' ||\r
+ src.tagName=='TEXTAREA')) return;\r
+\r
+ var dir = this.directions(event);\r
+ if (dir.length > 0) { \r
+ this.active = true;\r
+ var offsets = Position.cumulativeOffset(this.element);\r
+ this.startTop = offsets[1];\r
+ this.startLeft = offsets[0];\r
+ this.startWidth = parseInt(Element.getStyle(this.element, 'width'));\r
+ this.startHeight = parseInt(Element.getStyle(this.element, 'height'));\r
+ this.startX = event.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;\r
+ this.startY = event.clientY + document.body.scrollTop + document.documentElement.scrollTop;\r
+ \r
+ this.currentDirection = dir;\r
+ Event.stop(event);\r
+ }\r
+ }\r
+ },\r
+ finishResize: function(event, success) {\r
+ // this.unregisterEvents();\r
+\r
+ this.active = false;\r
+ this.resizing = false;\r
+\r
+ if(this.options.zindex)\r
+ this.element.style.zIndex = this.originalZ;\r
+ \r
+ if (this.options.resize) {\r
+ this.options.resize(this.element);\r
+ }\r
+ },\r
+ keyPress: function(event) {\r
+ if(this.active) {\r
+ if(event.keyCode==Event.KEY_ESC) {\r
+ this.finishResize(event, false);\r
+ Event.stop(event);\r
+ }\r
+ }\r
+ },\r
+ endResize: function(event) {\r
+ if(this.active && this.resizing) {\r
+ this.finishResize(event, true);\r
+ Event.stop(event);\r
+ }\r
+ this.active = false;\r
+ this.resizing = false;\r
+ },\r
+ draw: function(event) {\r
+ var pointer = [Event.pointerX(event), Event.pointerY(event)];\r
+ var style = this.element.style;\r
+ if (this.currentDirection.indexOf('n') != -1) {\r
+ var pointerMoved = this.startY - pointer[1];\r
+ var margin = Element.getStyle(this.element, 'margin-top') || "0";\r
+ var newHeight = this.startHeight + pointerMoved;\r
+ if (newHeight > this.options.minHeight) {\r
+ style.height = newHeight + "px";\r
+ style.top = (this.startTop - pointerMoved - parseInt(margin)) + "px";\r
+ }\r
+ }\r
+ if (this.currentDirection.indexOf('w') != -1) {\r
+ var pointerMoved = this.startX - pointer[0];\r
+ var margin = Element.getStyle(this.element, 'margin-left') || "0";\r
+ var newWidth = this.startWidth + pointerMoved;\r
+ if (newWidth > this.options.minWidth) {\r
+ style.left = (this.startLeft - pointerMoved - parseInt(margin)) + "px";\r
+ style.width = newWidth + "px";\r
+ }\r
+ }\r
+ if (this.currentDirection.indexOf('s') != -1) {\r
+ var newHeight = this.startHeight + pointer[1] - this.startY;\r
+ if (newHeight > this.options.minHeight) {\r
+ style.height = newHeight + "px";\r
+ }\r
+ }\r
+ if (this.currentDirection.indexOf('e') != -1) {\r
+ var newWidth = this.startWidth + pointer[0] - this.startX;\r
+ if (newWidth > this.options.minWidth) {\r
+ style.width = newWidth + "px";\r
+ }\r
+ }\r
+ if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering\r
+ },\r
+ between: function(val, low, high) {\r
+ return (val >= low && val < high);\r
+ },\r
+ directions: function(event) {\r
+ var pointer = [Event.pointerX(event), Event.pointerY(event)];\r
+ var offsets = Position.cumulativeOffset(this.element);\r
+ \r
+ var cursor = '';\r
+ if (this.between(pointer[1] - offsets[1], 0, this.options.top)) cursor += 'n';\r
+ if (this.between((offsets[1] + this.element.offsetHeight) - pointer[1], 0, this.options.bottom)) cursor += 's';\r
+ if (this.between(pointer[0] - offsets[0], 0, this.options.left)) cursor += 'w';\r
+ if (this.between((offsets[0] + this.element.offsetWidth) - pointer[0], 0, this.options.right)) cursor += 'e';\r
+\r
+ return cursor;\r
+ },\r
+ cursor: function(event) {\r
+ var cursor = this.directions(event);\r
+ if (cursor.length > 0) {\r
+ cursor += '-resize';\r
+ } else {\r
+ cursor = '';\r
+ }\r
+ this.element.style.cursor = cursor; \r
+ },\r
+ update: function(event) {\r
+ if(this.active) {\r
+ if(!this.resizing) {\r
+ var style = this.element.style;\r
+ this.resizing = true;\r
+ \r
+ if(Element.getStyle(this.element,'position')=='') \r
+ style.position = "relative";\r
+ \r
+ if(this.options.zindex) {\r
+ this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0);\r
+ style.zIndex = this.options.zindex;\r
+ }\r
+ }\r
+ this.draw(event);\r
+\r
+ // fix AppleWebKit rendering\r
+ if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0); \r
+ Event.stop(event);\r
+ return false;\r
+ }\r
+ }\r
+}\r
-// script.aculo.us scriptaculous.js v1.6.4, Wed Sep 06 11:30:58 CEST 2006
-
-// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-var Scriptaculous = {
- Version: '1.6.4',
- require: function(libraryName) {
- // inserting via DOM fails in Safari 2.0, so brute force approach
- document.write('<script type="text/javascript" src="'+libraryName+'"></script>');
- },
- load: function() {
- if((typeof Prototype=='undefined') ||
- (typeof Element == 'undefined') ||
- (typeof Element.Methods=='undefined') ||
- parseFloat(Prototype.Version.split(".")[0] + "." +
- Prototype.Version.split(".")[1]) < 1.5)
- throw("script.aculo.us requires the Prototype JavaScript framework >= 1.5.0");
-
- $A(document.getElementsByTagName("script")).findAll( function(s) {
- return (s.src && s.src.match(/scriptaculous\.js(\?.*)?$/))
- }).each( function(s) {
- var path = s.src.replace(/scriptaculous\.js(\?.*)?$/,'');
- var includes = s.src.match(/\?.*load=([a-z,]*)/);
- (includes ? includes[1] : 'builder,effects,dragdrop,controls,slider').split(',').each(
- function(include) { Scriptaculous.require(path+include+'.js') });
- });
- }
-}
-
+// script.aculo.us scriptaculous.js v1.6.4, Wed Sep 06 11:30:58 CEST 2006\r
+\r
+// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+var Scriptaculous = {\r
+ Version: '1.6.4',\r
+ require: function(libraryName) {\r
+ // inserting via DOM fails in Safari 2.0, so brute force approach\r
+ document.write('<script type="text/javascript" src="'+libraryName+'"></script>');\r
+ },\r
+ load: function() {\r
+ if((typeof Prototype=='undefined') || \r
+ (typeof Element == 'undefined') || \r
+ (typeof Element.Methods=='undefined') ||\r
+ parseFloat(Prototype.Version.split(".")[0] + "." +\r
+ Prototype.Version.split(".")[1]) < 1.5)\r
+ throw("script.aculo.us requires the Prototype JavaScript framework >= 1.5.0");\r
+ \r
+ $A(document.getElementsByTagName("script")).findAll( function(s) {\r
+ return (s.src && s.src.match(/scriptaculous\.js(\?.*)?$/))\r
+ }).each( function(s) {\r
+ var path = s.src.replace(/scriptaculous\.js(\?.*)?$/,'');\r
+ var includes = s.src.match(/\?.*load=([a-z,]*)/);\r
+ (includes ? includes[1] : 'builder,effects,dragdrop,controls,slider').split(',').each(\r
+ function(include) { Scriptaculous.require(path+include+'.js') });\r
+ });\r
+ }\r
+}\r
+\r
Scriptaculous.load();
\ No newline at end of file
-// script.aculo.us slider.js v1.6.4, Wed Sep 06 11:30:58 CEST 2006
-
-// Copyright (c) 2005 Marty Haught, Thomas Fuchs
-//
-// See http://script.aculo.us for more info
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-if(!Control) var Control = {};
-Control.Slider = Class.create();
-
-// options:
-// axis: 'vertical', or 'horizontal' (default)
-//
-// callbacks:
-// onChange(value)
-// onSlide(value)
-Control.Slider.prototype = {
- initialize: function(handle, track, options) {
- var slider = this;
-
- if(handle instanceof Array) {
- this.handles = handle.collect( function(e) { return $(e) });
- } else {
- this.handles = [$(handle)];
- }
-
- this.track = $(track);
- this.options = options || {};
-
- this.axis = this.options.axis || 'horizontal';
- this.increment = this.options.increment || 1;
- this.step = parseInt(this.options.step || '1');
- this.range = this.options.range || $R(0,1);
-
- this.value = 0; // assure backwards compat
- this.values = this.handles.map( function() { return 0 });
- this.spans = this.options.spans ? this.options.spans.map(function(s){ return $(s) }) : false;
- this.options.startSpan = $(this.options.startSpan || null);
- this.options.endSpan = $(this.options.endSpan || null);
-
- this.restricted = this.options.restricted || false;
-
- this.maximum = this.options.maximum || this.range.end;
- this.minimum = this.options.minimum || this.range.start;
-
- // Will be used to align the handle onto the track, if necessary
- this.alignX = parseInt(this.options.alignX || '0');
- this.alignY = parseInt(this.options.alignY || '0');
-
- this.trackLength = this.maximumOffset() - this.minimumOffset();
-
- this.handleLength = this.isVertical() ?
- (this.handles[0].offsetHeight != 0 ?
- this.handles[0].offsetHeight : this.handles[0].style.height.replace(/px$/,"")) :
- (this.handles[0].offsetWidth != 0 ? this.handles[0].offsetWidth :
- this.handles[0].style.width.replace(/px$/,""));
-
- this.active = false;
- this.dragging = false;
- this.disabled = false;
-
- if(this.options.disabled) this.setDisabled();
-
- // Allowed values array
- this.allowedValues = this.options.values ? this.options.values.sortBy(Prototype.K) : false;
- if(this.allowedValues) {
- this.minimum = this.allowedValues.min();
- this.maximum = this.allowedValues.max();
- }
-
- this.eventMouseDown = this.startDrag.bindAsEventListener(this);
- this.eventMouseUp = this.endDrag.bindAsEventListener(this);
- this.eventMouseMove = this.update.bindAsEventListener(this);
-
- // Initialize handles in reverse (make sure first handle is active)
- this.handles.each( function(h,i) {
- i = slider.handles.length-1-i;
- slider.setValue(parseFloat(
- (slider.options.sliderValue instanceof Array ?
- slider.options.sliderValue[i] : slider.options.sliderValue) ||
- slider.range.start), i);
- Element.makePositioned(h); // fix IE
- Event.observe(h, "mousedown", slider.eventMouseDown);
- });
-
- Event.observe(this.track, "mousedown", this.eventMouseDown);
- Event.observe(document, "mouseup", this.eventMouseUp);
- Event.observe(document, "mousemove", this.eventMouseMove);
-
- this.initialized = true;
- },
- dispose: function() {
- var slider = this;
- Event.stopObserving(this.track, "mousedown", this.eventMouseDown);
- Event.stopObserving(document, "mouseup", this.eventMouseUp);
- Event.stopObserving(document, "mousemove", this.eventMouseMove);
- this.handles.each( function(h) {
- Event.stopObserving(h, "mousedown", slider.eventMouseDown);
- });
- },
- setDisabled: function(){
- this.disabled = true;
- },
- setEnabled: function(){
- this.disabled = false;
- },
- getNearestValue: function(value){
- if(this.allowedValues){
- if(value >= this.allowedValues.max()) return(this.allowedValues.max());
- if(value <= this.allowedValues.min()) return(this.allowedValues.min());
-
- var offset = Math.abs(this.allowedValues[0] - value);
- var newValue = this.allowedValues[0];
- this.allowedValues.each( function(v) {
- var currentOffset = Math.abs(v - value);
- if(currentOffset <= offset){
- newValue = v;
- offset = currentOffset;
- }
- });
- return newValue;
- }
- if(value > this.range.end) return this.range.end;
- if(value < this.range.start) return this.range.start;
- return value;
- },
- setValue: function(sliderValue, handleIdx){
- if(!this.active) {
- this.activeHandleIdx = handleIdx || 0;
- this.activeHandle = this.handles[this.activeHandleIdx];
- this.updateStyles();
- }
- handleIdx = handleIdx || this.activeHandleIdx || 0;
- if(this.initialized && this.restricted) {
- if((handleIdx>0) && (sliderValue<this.values[handleIdx-1]))
- sliderValue = this.values[handleIdx-1];
- if((handleIdx < (this.handles.length-1)) && (sliderValue>this.values[handleIdx+1]))
- sliderValue = this.values[handleIdx+1];
- }
- sliderValue = this.getNearestValue(sliderValue);
- this.values[handleIdx] = sliderValue;
- this.value = this.values[0]; // assure backwards compat
-
- this.handles[handleIdx].style[this.isVertical() ? 'top' : 'left'] =
- this.translateToPx(sliderValue);
-
- this.drawSpans();
- if(!this.dragging || !this.event) this.updateFinished();
- },
- setValueBy: function(delta, handleIdx) {
- this.setValue(this.values[handleIdx || this.activeHandleIdx || 0] + delta,
- handleIdx || this.activeHandleIdx || 0);
- },
- translateToPx: function(value) {
- return Math.round(
- ((this.trackLength-this.handleLength)/(this.range.end-this.range.start)) *
- (value - this.range.start)) + "px";
- },
- translateToValue: function(offset) {
- return ((offset/(this.trackLength-this.handleLength) *
- (this.range.end-this.range.start)) + this.range.start);
- },
- getRange: function(range) {
- var v = this.values.sortBy(Prototype.K);
- range = range || 0;
- return $R(v[range],v[range+1]);
- },
- minimumOffset: function(){
- return(this.isVertical() ? this.alignY : this.alignX);
- },
- maximumOffset: function(){
- return(this.isVertical() ?
- (this.track.offsetHeight != 0 ? this.track.offsetHeight :
- this.track.style.height.replace(/px$/,"")) - this.alignY :
- (this.track.offsetWidth != 0 ? this.track.offsetWidth :
- this.track.style.width.replace(/px$/,"")) - this.alignY);
- },
- isVertical: function(){
- return (this.axis == 'vertical');
- },
- drawSpans: function() {
- var slider = this;
- if(this.spans)
- $R(0, this.spans.length-1).each(function(r) { slider.setSpan(slider.spans[r], slider.getRange(r)) });
- if(this.options.startSpan)
- this.setSpan(this.options.startSpan,
- $R(0, this.values.length>1 ? this.getRange(0).min() : this.value ));
- if(this.options.endSpan)
- this.setSpan(this.options.endSpan,
- $R(this.values.length>1 ? this.getRange(this.spans.length-1).max() : this.value, this.maximum));
- },
- setSpan: function(span, range) {
- if(this.isVertical()) {
- span.style.top = this.translateToPx(range.start);
- span.style.height = this.translateToPx(range.end - range.start + this.range.start);
- } else {
- span.style.left = this.translateToPx(range.start);
- span.style.width = this.translateToPx(range.end - range.start + this.range.start);
- }
- },
- updateStyles: function() {
- this.handles.each( function(h){ Element.removeClassName(h, 'selected') });
- Element.addClassName(this.activeHandle, 'selected');
- },
- startDrag: function(event) {
- if(Event.isLeftClick(event)) {
- if(!this.disabled){
- this.active = true;
-
- var handle = Event.element(event);
- var pointer = [Event.pointerX(event), Event.pointerY(event)];
- var track = handle;
- if(track==this.track) {
- var offsets = Position.cumulativeOffset(this.track);
- this.event = event;
- this.setValue(this.translateToValue(
- (this.isVertical() ? pointer[1]-offsets[1] : pointer[0]-offsets[0])-(this.handleLength/2)
- ));
- var offsets = Position.cumulativeOffset(this.activeHandle);
- this.offsetX = (pointer[0] - offsets[0]);
- this.offsetY = (pointer[1] - offsets[1]);
- } else {
- // find the handle (prevents issues with Safari)
- while((this.handles.indexOf(handle) == -1) && handle.parentNode)
- handle = handle.parentNode;
-
- this.activeHandle = handle;
- this.activeHandleIdx = this.handles.indexOf(this.activeHandle);
- this.updateStyles();
-
- var offsets = Position.cumulativeOffset(this.activeHandle);
- this.offsetX = (pointer[0] - offsets[0]);
- this.offsetY = (pointer[1] - offsets[1]);
- }
- }
- Event.stop(event);
- }
- },
- update: function(event) {
- if(this.active) {
- if(!this.dragging) this.dragging = true;
- this.draw(event);
- // fix AppleWebKit rendering
- if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
- Event.stop(event);
- }
- },
- draw: function(event) {
- var pointer = [Event.pointerX(event), Event.pointerY(event)];
- var offsets = Position.cumulativeOffset(this.track);
- pointer[0] -= this.offsetX + offsets[0];
- pointer[1] -= this.offsetY + offsets[1];
- this.event = event;
- this.setValue(this.translateToValue( this.isVertical() ? pointer[1] : pointer[0] ));
- if(this.initialized && this.options.onSlide)
- this.options.onSlide(this.values.length>1 ? this.values : this.value, this);
- },
- endDrag: function(event) {
- if(this.active && this.dragging) {
- this.finishDrag(event, true);
- Event.stop(event);
- }
- this.active = false;
- this.dragging = false;
- },
- finishDrag: function(event, success) {
- this.active = false;
- this.dragging = false;
- this.updateFinished();
- },
- updateFinished: function() {
- if(this.initialized && this.options.onChange)
- this.options.onChange(this.values.length>1 ? this.values : this.value, this);
- this.event = null;
- }
+// script.aculo.us slider.js v1.6.4, Wed Sep 06 11:30:58 CEST 2006\r
+\r
+// Copyright (c) 2005 Marty Haught, Thomas Fuchs \r
+//\r
+// See http://script.aculo.us for more info\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+if(!Control) var Control = {};\r
+Control.Slider = Class.create();\r
+\r
+// options:\r
+// axis: 'vertical', or 'horizontal' (default)\r
+//\r
+// callbacks:\r
+// onChange(value)\r
+// onSlide(value)\r
+Control.Slider.prototype = {\r
+ initialize: function(handle, track, options) {\r
+ var slider = this;\r
+ \r
+ if(handle instanceof Array) {\r
+ this.handles = handle.collect( function(e) { return $(e) });\r
+ } else {\r
+ this.handles = [$(handle)];\r
+ }\r
+ \r
+ this.track = $(track);\r
+ this.options = options || {};\r
+\r
+ this.axis = this.options.axis || 'horizontal';\r
+ this.increment = this.options.increment || 1;\r
+ this.step = parseInt(this.options.step || '1');\r
+ this.range = this.options.range || $R(0,1);\r
+ \r
+ this.value = 0; // assure backwards compat\r
+ this.values = this.handles.map( function() { return 0 });\r
+ this.spans = this.options.spans ? this.options.spans.map(function(s){ return $(s) }) : false;\r
+ this.options.startSpan = $(this.options.startSpan || null);\r
+ this.options.endSpan = $(this.options.endSpan || null);\r
+\r
+ this.restricted = this.options.restricted || false;\r
+\r
+ this.maximum = this.options.maximum || this.range.end;\r
+ this.minimum = this.options.minimum || this.range.start;\r
+\r
+ // Will be used to align the handle onto the track, if necessary\r
+ this.alignX = parseInt(this.options.alignX || '0');\r
+ this.alignY = parseInt(this.options.alignY || '0');\r
+ \r
+ this.trackLength = this.maximumOffset() - this.minimumOffset();\r
+\r
+ this.handleLength = this.isVertical() ? \r
+ (this.handles[0].offsetHeight != 0 ? \r
+ this.handles[0].offsetHeight : this.handles[0].style.height.replace(/px$/,"")) : \r
+ (this.handles[0].offsetWidth != 0 ? this.handles[0].offsetWidth : \r
+ this.handles[0].style.width.replace(/px$/,""));\r
+\r
+ this.active = false;\r
+ this.dragging = false;\r
+ this.disabled = false;\r
+\r
+ if(this.options.disabled) this.setDisabled();\r
+\r
+ // Allowed values array\r
+ this.allowedValues = this.options.values ? this.options.values.sortBy(Prototype.K) : false;\r
+ if(this.allowedValues) {\r
+ this.minimum = this.allowedValues.min();\r
+ this.maximum = this.allowedValues.max();\r
+ }\r
+\r
+ this.eventMouseDown = this.startDrag.bindAsEventListener(this);\r
+ this.eventMouseUp = this.endDrag.bindAsEventListener(this);\r
+ this.eventMouseMove = this.update.bindAsEventListener(this);\r
+\r
+ // Initialize handles in reverse (make sure first handle is active)\r
+ this.handles.each( function(h,i) {\r
+ i = slider.handles.length-1-i;\r
+ slider.setValue(parseFloat(\r
+ (slider.options.sliderValue instanceof Array ? \r
+ slider.options.sliderValue[i] : slider.options.sliderValue) || \r
+ slider.range.start), i);\r
+ Element.makePositioned(h); // fix IE\r
+ Event.observe(h, "mousedown", slider.eventMouseDown);\r
+ });\r
+ \r
+ Event.observe(this.track, "mousedown", this.eventMouseDown);\r
+ Event.observe(document, "mouseup", this.eventMouseUp);\r
+ Event.observe(document, "mousemove", this.eventMouseMove);\r
+ \r
+ this.initialized = true;\r
+ },\r
+ dispose: function() {\r
+ var slider = this; \r
+ Event.stopObserving(this.track, "mousedown", this.eventMouseDown);\r
+ Event.stopObserving(document, "mouseup", this.eventMouseUp);\r
+ Event.stopObserving(document, "mousemove", this.eventMouseMove);\r
+ this.handles.each( function(h) {\r
+ Event.stopObserving(h, "mousedown", slider.eventMouseDown);\r
+ });\r
+ },\r
+ setDisabled: function(){\r
+ this.disabled = true;\r
+ },\r
+ setEnabled: function(){\r
+ this.disabled = false;\r
+ }, \r
+ getNearestValue: function(value){\r
+ if(this.allowedValues){\r
+ if(value >= this.allowedValues.max()) return(this.allowedValues.max());\r
+ if(value <= this.allowedValues.min()) return(this.allowedValues.min());\r
+ \r
+ var offset = Math.abs(this.allowedValues[0] - value);\r
+ var newValue = this.allowedValues[0];\r
+ this.allowedValues.each( function(v) {\r
+ var currentOffset = Math.abs(v - value);\r
+ if(currentOffset <= offset){\r
+ newValue = v;\r
+ offset = currentOffset;\r
+ } \r
+ });\r
+ return newValue;\r
+ }\r
+ if(value > this.range.end) return this.range.end;\r
+ if(value < this.range.start) return this.range.start;\r
+ return value;\r
+ },\r
+ setValue: function(sliderValue, handleIdx){\r
+ if(!this.active) {\r
+ this.activeHandleIdx = handleIdx || 0;\r
+ this.activeHandle = this.handles[this.activeHandleIdx];\r
+ this.updateStyles();\r
+ }\r
+ handleIdx = handleIdx || this.activeHandleIdx || 0;\r
+ if(this.initialized && this.restricted) {\r
+ if((handleIdx>0) && (sliderValue<this.values[handleIdx-1]))\r
+ sliderValue = this.values[handleIdx-1];\r
+ if((handleIdx < (this.handles.length-1)) && (sliderValue>this.values[handleIdx+1]))\r
+ sliderValue = this.values[handleIdx+1];\r
+ }\r
+ sliderValue = this.getNearestValue(sliderValue);\r
+ this.values[handleIdx] = sliderValue;\r
+ this.value = this.values[0]; // assure backwards compat\r
+ \r
+ this.handles[handleIdx].style[this.isVertical() ? 'top' : 'left'] = \r
+ this.translateToPx(sliderValue);\r
+ \r
+ this.drawSpans();\r
+ if(!this.dragging || !this.event) this.updateFinished();\r
+ },\r
+ setValueBy: function(delta, handleIdx) {\r
+ this.setValue(this.values[handleIdx || this.activeHandleIdx || 0] + delta, \r
+ handleIdx || this.activeHandleIdx || 0);\r
+ },\r
+ translateToPx: function(value) {\r
+ return Math.round(\r
+ ((this.trackLength-this.handleLength)/(this.range.end-this.range.start)) * \r
+ (value - this.range.start)) + "px";\r
+ },\r
+ translateToValue: function(offset) {\r
+ return ((offset/(this.trackLength-this.handleLength) * \r
+ (this.range.end-this.range.start)) + this.range.start);\r
+ },\r
+ getRange: function(range) {\r
+ var v = this.values.sortBy(Prototype.K); \r
+ range = range || 0;\r
+ return $R(v[range],v[range+1]);\r
+ },\r
+ minimumOffset: function(){\r
+ return(this.isVertical() ? this.alignY : this.alignX);\r
+ },\r
+ maximumOffset: function(){\r
+ return(this.isVertical() ? \r
+ (this.track.offsetHeight != 0 ? this.track.offsetHeight :\r
+ this.track.style.height.replace(/px$/,"")) - this.alignY : \r
+ (this.track.offsetWidth != 0 ? this.track.offsetWidth : \r
+ this.track.style.width.replace(/px$/,"")) - this.alignY);\r
+ }, \r
+ isVertical: function(){\r
+ return (this.axis == 'vertical');\r
+ },\r
+ drawSpans: function() {\r
+ var slider = this;\r
+ if(this.spans)\r
+ $R(0, this.spans.length-1).each(function(r) { slider.setSpan(slider.spans[r], slider.getRange(r)) });\r
+ if(this.options.startSpan)\r
+ this.setSpan(this.options.startSpan,\r
+ $R(0, this.values.length>1 ? this.getRange(0).min() : this.value ));\r
+ if(this.options.endSpan)\r
+ this.setSpan(this.options.endSpan, \r
+ $R(this.values.length>1 ? this.getRange(this.spans.length-1).max() : this.value, this.maximum));\r
+ },\r
+ setSpan: function(span, range) {\r
+ if(this.isVertical()) {\r
+ span.style.top = this.translateToPx(range.start);\r
+ span.style.height = this.translateToPx(range.end - range.start + this.range.start);\r
+ } else {\r
+ span.style.left = this.translateToPx(range.start);\r
+ span.style.width = this.translateToPx(range.end - range.start + this.range.start);\r
+ }\r
+ },\r
+ updateStyles: function() {\r
+ this.handles.each( function(h){ Element.removeClassName(h, 'selected') });\r
+ Element.addClassName(this.activeHandle, 'selected');\r
+ },\r
+ startDrag: function(event) {\r
+ if(Event.isLeftClick(event)) {\r
+ if(!this.disabled){\r
+ this.active = true;\r
+ \r
+ var handle = Event.element(event);\r
+ var pointer = [Event.pointerX(event), Event.pointerY(event)];\r
+ var track = handle;\r
+ if(track==this.track) {\r
+ var offsets = Position.cumulativeOffset(this.track); \r
+ this.event = event;\r
+ this.setValue(this.translateToValue( \r
+ (this.isVertical() ? pointer[1]-offsets[1] : pointer[0]-offsets[0])-(this.handleLength/2)\r
+ ));\r
+ var offsets = Position.cumulativeOffset(this.activeHandle);\r
+ this.offsetX = (pointer[0] - offsets[0]);\r
+ this.offsetY = (pointer[1] - offsets[1]);\r
+ } else {\r
+ // find the handle (prevents issues with Safari)\r
+ while((this.handles.indexOf(handle) == -1) && handle.parentNode) \r
+ handle = handle.parentNode;\r
+ \r
+ this.activeHandle = handle;\r
+ this.activeHandleIdx = this.handles.indexOf(this.activeHandle);\r
+ this.updateStyles();\r
+ \r
+ var offsets = Position.cumulativeOffset(this.activeHandle);\r
+ this.offsetX = (pointer[0] - offsets[0]);\r
+ this.offsetY = (pointer[1] - offsets[1]);\r
+ }\r
+ }\r
+ Event.stop(event);\r
+ }\r
+ },\r
+ update: function(event) {\r
+ if(this.active) {\r
+ if(!this.dragging) this.dragging = true;\r
+ this.draw(event);\r
+ // fix AppleWebKit rendering\r
+ if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);\r
+ Event.stop(event);\r
+ }\r
+ },\r
+ draw: function(event) {\r
+ var pointer = [Event.pointerX(event), Event.pointerY(event)];\r
+ var offsets = Position.cumulativeOffset(this.track);\r
+ pointer[0] -= this.offsetX + offsets[0];\r
+ pointer[1] -= this.offsetY + offsets[1];\r
+ this.event = event;\r
+ this.setValue(this.translateToValue( this.isVertical() ? pointer[1] : pointer[0] ));\r
+ if(this.initialized && this.options.onSlide)\r
+ this.options.onSlide(this.values.length>1 ? this.values : this.value, this);\r
+ },\r
+ endDrag: function(event) {\r
+ if(this.active && this.dragging) {\r
+ this.finishDrag(event, true);\r
+ Event.stop(event);\r
+ }\r
+ this.active = false;\r
+ this.dragging = false;\r
+ }, \r
+ finishDrag: function(event, success) {\r
+ this.active = false;\r
+ this.dragging = false;\r
+ this.updateFinished();\r
+ },\r
+ updateFinished: function() {\r
+ if(this.initialized && this.options.onChange) \r
+ this.options.onChange(this.values.length>1 ? this.values : this.value, this);\r
+ this.event = null;\r
+ }\r
}
\ No newline at end of file
-// Copyright (c) 2006 spinelz.org (http://script.spinelz.org/)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-/**
- * Element class
- */
-Object.extend(Element, {
-
- getTagNodes: function(element, tree) {
- return this.getElementsByNodeType(element, 1, tree);
- },
-
- getTextNodes: function(element, tree) {
- return this.getElementsByNodeType(element, 3, tree);
- },
-
- getElementsByNodeType: function(element, nodeType, tree) {
-
- element = ($(element) || document.body);
- var nodes = element.childNodes;
- var result = [];
-
- for (var i = 0; i < nodes.length; i++) {
- if (nodes[i].nodeType == nodeType)
- result.push(nodes[i]);
- if (tree && (nodes[i].nodeType == 1))
- result = result.concat(this.getElementsByNodeType(nodes[i], nodeType, tree));
- }
-
- return result;
- },
-
- getParentByClassName: function(className, element) {
- var parent = element.parentNode;
- if (!parent || (parent.tagName == 'BODY'))
- return null;
- else if (!parent.className)
- return Element.getParentByClassName(className, parent);
- else if (Element.hasClassName(parent, className))
- return parent;
- else
- return Element.getParentByClassName(className, parent);
- },
-
- getParentByTagName: function(tagNames, element) {
-
- var parent = element.parentNode;
- if (parent.tagName == 'BODY')
- return null;
-
- var index = tagNames.join('/').toUpperCase().indexOf(parent.tagName.toUpperCase(), 0);
- if (index >= 0)
- return parent;
- else
- return Element.getParentByTagName(tagNames, parent);
- },
-
- getFirstElementByClassNames: function(element, classNames, tree) {
-
- if (!element ||
- !((typeof(classNames) == 'object') && (classNames.constructor == Array))) {
- return;
- }
-
- element = (element || document.body);
- var nodes = element.childNodes;
-
- for (var i = 0; i < nodes.length; i++) {
- for (var j = 0; j < classNames.length; j++) {
- if (nodes[i].nodeType != 1) {
- continue;
-
- } else if (Element.hasClassName(nodes[i], classNames[j])) {
- return nodes[i];
-
- } else if (tree) {
- var result = this.getFirstElementByClassNames(nodes[i], classNames, tree);
- if (result) return result;
- }
- }
- }
-
- return;
- },
-
- getElementsByClassNames: function(element, classNames) {
-
- if (!element ||
- !((typeof(classNames) == 'object') && (classNames.constructor == Array))) {
- return;
- }
-
- var nodes = [];
- classNames.each(function(c) {
- nodes = nodes.concat(document.getElementsByClassName(c, element));
- });
-
- return nodes;
- },
-
- getWindowHeight: function() {
-
- if (window.innerHeight) {
- return window.innerHeight; // Mozilla, Opera, NN4
- } else if (document.documentElement && document.documentElement.offsetHeight){ // ?? IE
- return document.documentElement.offsetHeight;
- } else if (document.body && document.body.offsetHeight) {
- return document.body.offsetHeight - 20;
- }
- return 0;
- },
-
- getWindowWidth:function() {
-
- if(window.innerWidth) {
- return window.innerWidth; // Mozilla, Opera, NN4
- } else if (document.documentElement && document.documentElement.offsetWidth){ // ?? IE
- return document.documentElement.offsetWidth - 20;
- } else if (document.body && document.body.offsetWidth){
- return document.body.offsetWidth - 20;
- }
- return 0;
- },
-
- getMaxZindex: function(element) {
- element = $(element);
- if (!element) {
- element = document.body;
- }
- if (element.nodeType != 1) return 0;
-
- var maxZindex = 0;
- if (element.style) maxZindex = parseInt(Element.getStyle(element, "z-index"));
- if (isNaN(maxZindex)) maxZindex = 0;
-
- var tmpZindex = 0;
- var elements = element.childNodes;
- for (var i = 0; i < elements.length; i++) {
- if (elements[i] && elements[i].tagName) {
- tmpZindex = Element.getMaxZindex(elements[i]);
- if (maxZindex < tmpZindex) maxZindex = tmpZindex;
- }
- }
-
- return maxZindex;
- },
-
- select: function(element, value) {
- $A($(element).options).each(function(opt) {
- if (opt.value == value) {
- opt.selected = true;
- } else {
- opt.selected = false;
- }
- });
- }
-});
-
-
-/**
- * Array
- */
-Object.extend(Array.prototype, {
- insert : function(index, element) {
- this.splice(index, 0 , element);
- },
-
- remove : function(index) {
- this.splice(index, 1);
- }
-});
-
-
-/**
- * String
- */
-Object.extend(String.prototype, {
-
- getPrefix: function(delimiter) {
-
- if (!delimiter) delimiter = '_';
- return this.split(delimiter)[0];
- },
-
- getSuffix: function(delimiter) {
-
- if (!delimiter) delimiter = '_';
- return this.split(delimiter).pop();
- },
-
- appendPrefix: function(prefix, delimiter) {
-
- if (!delimiter) delimiter = '_';
- return this + delimiter + prefix;
- },
-
- appendSuffix: function(suffix, delimiter) {
-
- if (!delimiter) delimiter = '_';
- return this + delimiter + suffix;
- },
-
- // for firefox
- println: function() {
- dump(this + '\n');
- }
-});
-
-
-/**
- * CssUtil
- */
-var CssUtil = Class.create();
-
-CssUtil.appendPrefix = function(prefix, suffixes) {
- var newHash = {};
- $H(suffixes).each(function(pair) {
- newHash[pair[0]] = prefix + suffixes[pair[0]];
- });
- return newHash;
-}
-
-CssUtil.getCssRules = function(sheet) {
- return sheet.rules || sheet.cssRules;
-}
-
-CssUtil.getCssRuleBySelectorText = function(selector) {
- var rule = null;
- $A(document.styleSheets).each(function(s) {
- var rules = CssUtil.getCssRules(s);
- rule = $A(rules).detect(function(r) {
- if (!r.selectorText) return false;
- return r.selectorText.toLowerCase() == selector.toLowerCase();
- });
- if (rule) throw $break;
- });
- return rule;
-}
-
-/*
-CssUtil.require = function(file, attributes, parent) {
- var links = document.getElementsByTagName('link');
- var regex = /^.*\.css/;
- var match = file.match(regex)
- alert(file)
- regex.compile(match);
-
- $A(links).each(function(ln) {
- if (ln.href.match(regex)) {
- }
- });
-
-// attributes = Object.extend({
-// href: file,
-// media: 'screen',
-// rel: 'stylesheet',
-// type: 'text/css'}, attributes);
-// var node = Builder.node('link', attributes);
-// if (!parent) parent = document.body;
-// parent.appendChild(node);
-// alert(file);
-}
-*/
-
-CssUtil.prototype = {
-
- initialize: function(styles) {
- if (!((typeof(styles) == 'object') && (styles.constructor == Array))) {
- throw 'CssUtil#initialize: argument must be a Array object!';
- }
-
- this.styles = styles;
- },
-
- getClasses: function(key) {
- return this.styles.collect(function(s) {
- return s[key];
- });
- },
-
- joinClassNames: function(key) {
- return this.getClasses(key).join(' ');
- },
-
- addClassNames: function(element, key) {
- this.styles.each(function(s) {
- Element.addClassName(element, s[key]);
- });
- },
-
- removeClassNames: function(element, key) {
- this.styles.each(function(s) {
- Element.removeClassName(element, s[key]);
- });
- },
-
- refreshClassNames: function(element, key) {
- element.className = '';
- this.addClassNames(element, key);
- },
-
- hasClassName: function(element, key) {
- return this.styles.any(function(s) {
- return Element.hasClassName(element, s[key]);
- });
- }
-}
-
-
-/**
- * Hover
- */
-var Hover = Class.create();
-Hover.prototype = {
-
- initialize: function(element) {
- this.options = Object.extend({
- defaultClass: '',
- hoverClass: '',
- cssUtil: '',
- list: false
- }, arguments[1] || {});
-
- var element = $(element);
- if (this.options.list) {
- var nodes = element.childNodes;
- for (var i = 0; i < nodes.length; i++) {
- if (nodes[i].nodeType == 1) {
- this.build(nodes[i]);
- }
- }
- } else {
- this.build(element);
- }
- },
-
- build: function(element) {
- this.normal = this.getNormalClass(element);
- this.hover = this.getHoverClass(this.normal);
-
- if (this.options.cssUtil) {
- this.normal = this.options.cssUtil.joinClassNames(normal);
- this.hover = this.options.cssUtil.joinClassNames(hover);
- }
- this.setHoverEvent(element);
- },
-
- setHoverEvent: function(element) {
- Event.observe(element, "mouseout", this.toggle.bindAsEventListener(this, element, this.normal));
- Event.observe(element, "mouseover", this.toggle.bindAsEventListener(this, element, this.hover));
- },
-
- toggle: function(event, element, className) {
- Event.stop(event);
- element.className = className;
- },
-
- getNormalClass: function(element) {
- var className = (this.options.defaultClass || element.className);
- return (className || '');
- },
-
- getHoverClass: function(defaultClass) {
- var className = this.options.hoverClass;
- if (!className) {
- className = defaultClass.split(' ').collect(function(c) {
- return c + 'Hover';
- }).join(' ');
- }
- return className;
- }
-}
-
-
-/**
- * Date
- */
-Object.extend(Date.prototype, {
- msPerDay: function() {
- return 24 * 60 * 60 * 1000;
- },
-
- advance: function(options) {
- return new Date(this.getTime() + this.msPerDay() * options.days);
- },
-
- days: function() {
- var date = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0);
- return Math.round(date.getTime() / this.msPerDay());
- },
-
- toHash: function() {
- return {
- year: this.getFullYear(),
- month: this.getMonth(),
- day: this.getDate(),
- hour: this.getHours(),
- min: this.getMinutes(),
- sec: this.getSeconds()
- }
- },
-
- sameYear: function(date) {
- return this.getFullYear() == date.getFullYear();
- },
-
- sameMonth: function(date) {
- return this.sameYear(date) && this.getMonth() == date.getMonth();
- },
-
- sameDate: function(date) {
- return this.sameYear(date) && this.sameMonth(date) && this.getDate() == date.getDate();
- },
-
- betweenDate: function(start, finish) {
- var myDays = this.days();
- return (start.days() <= myDays && myDays <= finish.days());
- },
-
- betweenTime: function(start, finish) {
- var myTime = this.getTime();
- return (start.getTime() <= myTime && myTime <= finish.getTime());
- }
-});
-
-
-/**
- * DateUtil
- */
-var DateUtil = {
-
- dayOfWeek: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
-
- months: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
-
- daysOfMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
-
- numberOfDays: function(start, finish) {
- return finish.days() - start.days();
- },
-
- isLeapYear: function(year) {
- if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
- return true;
- return false;
- },
-
- nextDate: function(date) {
- return new Date(date.getFullYear(), date.getMonth(), date.getDate() + 1);
- },
-
- previousDate: function(date) {
- return new Date(date.getFullYear(), date.getMonth(), date.getDate() - 1);
- },
-
- afterDays: function(date, after) {
- return new Date(date.getFullYear(), date.getMonth(), date.getDate() + after);
- },
-
- getLastDate: function(year, month) {
- var last = this.daysOfMonth[month];
- if ((month == 1) && this.isLeapYear(year)) {
- return new Date(year, month, last + 1);
- }
- return new Date(year, month, last);
- },
-
- getFirstDate: function(year, month) {
- if (year.constructor == Date) {
- return new Date(year.getFullYear(), year.getMonth(), 1);
- }
- return new Date(year, month, 1);
- },
-
- getWeekTurn: function(date, firstDWeek) {
- var limit = 6 - firstDWeek + 1;
- var turn = 0;
- while (limit < date) {
- date -= 7;
- turn++;
- }
- return turn;
- },
-
- toDateString: function(date) {
- return date.toDateString();
- },
-
- toLocaleDateString: function(date) {
- return date.toLocaleDateString();
- },
-
- simpleFormat: function(formatStr) {
- return function(date) {
- var formated = formatStr.replace(/M+/g, DateUtil.zerofill((date.getMonth() + 1).toString(), 2));
- formated = formated.replace(/d+/g, DateUtil.zerofill(date.getDate().toString(), 2));
- formated = formated.replace(/y{4}/g, date.getFullYear());
- formated = formated.replace(/y{1,3}/g, new String(date.getFullYear()).substr(2));
- formated = formated.replace(/E+/g, DateUtil.dayOfWeek[date.getDay()]);
-
- return formated;
- }
- },
-
- zerofill: function(date,digit){
- var result = date;
- if(date.length < digit){
- var tmp = digit - date.length;
- for(i=0; i < tmp; i++){
- result = "0" + result;
- }
- }
- return result;
- },
-
- toDate: function(hash) {
- return new Date(hash.year, hash.month, hash.day, hash.hour, hash.min, hash.sec || 0);
- }
-}
-
-
-/**
- * ZindexManager
- */
-var ZindexManager = {
- zIndex: 1000,
-
- getIndex: function(zIndex) {
- if (zIndex) {
- if (isNaN(zIndex)) {
- zIndex = Element.getMaxZindex() + 1;
- } else if (ZindexManager.zIndex > zIndex) {
- zIndex = ZindexManager.zIndex;
- }
- } else {
- zIndex = ZindexManager.zIndex;
- }
- ZindexManager.zIndex = zIndex + 1;
- return zIndex;
- }
-}
-
-
-/**
- * Modal
- */
-var Modal = {
- maskId: 'modalMask',
- maskClass: 'modal_mask',
- maskClassIE: 'modal_mask_ie',
- element: null,
- snaps: null,
- listener: null,
- resizeListener: null,
- cover: null,
- excepteds: null,
-
- mask: function(excepted) {
- var options = Object.extend({
- cssPrefix: 'custom_',
- zIndex: null
- }, arguments[1] || {});
-
- if (Modal.element) {
- Modal._snap(excepted);
- Modal._rebuildMask();
- } else {
- Modal.snaps = [];
- Modal.excepteds = [];
- Modal._buildMask(options.cssPrefix);
- Modal.cover = new IECover(Modal.element, {transparent: true});
- }
- Modal._setZindex(excepted, options.zIndex);
- Modal._setFullSize();
- if (!Modal.hasExcepted(excepted)) Modal.excepteds.push(excepted);
- },
-
- unmask: function() {
- if (Modal.element) {
- if (Modal.snaps.length == 0) {
- Element.hide(Modal.element);
- Modal._removeEvent();
- Modal.excepteds = [];
- Element.remove(Modal.element);
- Modal.element = null;
- } else {
- Element.setStyle(Modal.element, {zIndex: Modal.snaps.pop()});
- Modal.excepteds.pop();
- }
- }
- },
-
- _addEvent: function() {
- if (!Modal.listener) {
- Modal.listener = Modal._handleEvent.bindAsEventListener();
- Modal.resizeListener = Modal._onResize.bindAsEventListener();
- }
- Event.observe(document, "keypress", Modal.listener);
- Event.observe(document, "keydown", Modal.listener);
- Event.observe(document, "keyup", Modal.listener);
- Event.observe(document, "focus", Modal.listener);
- Event.observe(window, "resize", Modal.resizeListener);
- },
-
- _removeEvent: function() {
- Event.stopObserving(document, "keypress", Modal.listener);
- Event.stopObserving(document, "keydown", Modal.listener);
- Event.stopObserving(document, "keyup", Modal.listener);
- Event.stopObserving(document, "focus", Modal.listener);
- Event.stopObserving(window, "resize", Modal.resizeListener);
- },
-
- _isMasked: function() {
- return Modal.element && Element.visible(Modal.element);
- },
-
- _snap: function(excepted) {
- var index = Element.getStyle(Modal.element, 'zIndex');
- if (index && Modal._isMasked() && !Modal.hasExcepted(excepted)) Modal.snaps.push(index);
- },
-
- _setZindex: function(excepted, zIndex) {
- zIndex = ZindexManager.getIndex(zIndex);
- Element.setStyle(Modal.element, {zIndex: zIndex});
- excepted = Element.makePositioned($(excepted));
- Element.setStyle(excepted, {zIndex: ++zIndex});
- },
-
- _setFullSize: function() {
- Modal.element.setStyle({
- width: Element.getWindowWidth() + 'px',
- height: Element.getWindowHeight() + 'px'
- });
- if (Modal.cover) Modal.cover.resetSize();
- },
-
- _buildMask: function(cssPrefix) {
- var mask = Builder.node('div', {id: Modal.maskId});
- Modal._setClassNames(mask, cssPrefix);
- document.body.appendChild(mask);
- Modal.element = mask;
- Modal._addEvent();
- },
-
- _setClassNames: function(element, cssPrefix) {
- var className = (UserAgent.isIE()) ? Modal.maskClassIE : Modal.maskClass;
- Element.addClassName(element, className);
- Element.addClassName(element, cssPrefix + className);
- },
-
- _rebuildMask: function() {
- document.body.appendChild(Modal.element);
- Element.show(Modal.element);
- },
-
- _isOutOfModal: function(src) {
- var limit = Element.getStyle(Modal.element, 'zIndex');
- var zIndex = null;
- while ((src = src.parentNode) && src != document.body) {
- if (src.style && (zIndex = Element.getStyle(src, 'zIndex'))) {
- if (zIndex > limit) {
- return true;
- } else {
- return false;
- }
- }
- }
- return false;
- },
-
- _handleEvent: function (event) {
- var src = Event.element(event);
- if (!Modal._isOutOfModal(src)) {
- Event.stop(event);
- }
- },
-
- _onResize: function(event) {
- Modal._setFullSize();
- },
-
- hasExcepted: function(excepted) {
- return Modal.excepteds && Modal.excepteds.include(excepted);
- }
-}
-
-
-/**
- * IECover
- */
-var IECover = Class.create();
-IECover.src = '/blank.html';
-IECover.prototype = {
- idSuffix: 'iecover',
-
- initialize: function(parent) {
- this.options = Object.extend({
- transparent : false,
- padding : 0
- }, arguments[1] || {});
-
- if (document.all) {
- parent = $(parent);
- this.id = parent.id.appendSuffix(this.idSuffix);
- this._build(parent);
- this.resetSize();
- }
- },
-
- resetSize: function() {
- if (this.element) {
- var parent = this.element.parentNode;
- var padding = this.options.padding;
- this.element.width = parent.offsetWidth - padding + 'px';
- this.element.height = Element.getHeight(parent) - padding + 'px';
- }
- },
-
- _build: function(parent) {
- var padding = this.options.padding / 2;
- var styles = {
- position : 'absolute',
- top : padding + 'px',
- left : padding + 'px'
- };
- if (this.options.transparent) styles.filter = 'alpha(opacity=0)';
- this.element = Builder.node('iframe', {src: IECover.src, id: this.id, frameborder: 0});
- Element.setStyle(this.element, styles);
- var firstNode = Element.down(parent, 0);
- if (firstNode) Element.makePositioned(firstNode);
- parent.insertBefore(this.element, parent.firstChild);
- }
-}
-
-/**
- * UserAgent
- */
-var UserAgent = {
- getUserAgent: function() {
- return navigator.userAgent;
- },
- isIE: function() {
- if(document.all && this.getUserAgent().toLowerCase().indexOf('msie') != -1) {
- return true;
- }
- },
- isIE7: function() {
- if(document.all && this.getUserAgent().toLowerCase().indexOf('msie 7') != -1) {
- return true;
- }
- }
-}
-
-/**
- * ShortcutManager
- */
-var ShortcutManager = {
- initialize: function() {
- var defaultOptions = {
- initialStarted: true,
- preventDefault: true
- }
- this.options = Object.extend(defaultOptions, arguments[0] || {});
- if(this.documentListener) {
- Event.stopObserving(document, 'keydown', this.documentListener);
- }
- this.documentListener = this.eventKeydown.bindAsEventListener(this);
- this.functions = new Object();
- this.functions['a'] = new Object();
- this.functions['ac'] = new Object();
- this.functions['as'] = new Object();
- this.functions['acs'] = new Object();
- this.functions['c'] = new Object();
- this.functions['cs'] = new Object();
- this.functions['n'] = new Object();
- this.functions['s'] = new Object();
- this.keyCode = {
- 'backspace': 8,
- 'tab': 9,
- 'return': 13,
- 'enter': 13,
- 'pause': 19,
- 'break': 19,
- 'caps': 20,
- 'capslock': 20,
- 'esc': 27,
- 'escape': 27,
- 'space': 32,
- 'pageup': 33,
- 'pgup': 33,
- 'pagedown': 34,
- 'pgdn': 34,
- 'end': 35,
- 'home': 36,
- 'left': 37,
- 'up': 38,
- 'right': 39,
- 'down': 40,
- 'insert': 45,
- 'delete': 46,
- '0': 48,
- '1': 49,
- '2': 50,
- '3': 51,
- '4': 52,
- '5': 53,
- '6': 54,
- '7': 55,
- '8': 56,
- '9': 57,
- 'a': 65,
- 'b': 66,
- 'c': 67,
- 'd': 68,
- 'e': 69,
- 'f': 70,
- 'g': 71,
- 'h': 72,
- 'i': 73,
- 'j': 74,
- 'k': 75,
- 'l': 76,
- 'm': 77,
- 'n': 78,
- 'o': 79,
- 'p': 80,
- 'q': 81,
- 'r': 82,
- 's': 83,
- 't': 84,
- 'u': 85,
- 'v': 86,
- 'w': 87,
- 'x': 88,
- 'y': 89,
- 'z': 90,
- 'f1': 112,
- 'f2': 113,
- 'f3': 114,
- 'f4': 115,
- 'f5': 116,
- 'f6': 117,
- 'f7': 118,
- 'f8': 119,
- 'f9': 120,
- 'f10': 121,
- 'f11': 122,
- 'f12': 123,
- 'numlock': 144,
- 'nmlk': 144,
- 'scrolllock': 145,
- 'scflk': 145
- };
- this.numKeys = {
- 96: 48,
- 97: 49,
- 98: 50,
- 99: 51,
- 100: 52,
- 101: 53,
- 102: 54,
- 103: 55,
- 104: 56,
- 105: 57
- };
- if(this.options.initialStarted) {
- this.start();
- } else {
- this.stop();
- }
- Event.observe(document, 'keydown', this.documentListener);
- },
- add: function(shortcut, callback) {
- this._add_or_remove_function(shortcut, callback);
- },
- destroy: function() {
- Event.stopObserving(document, 'keydown', this.documentListener);
- },
- eventKeydown: function(event) {
- if(this.executable) {
- var code;
- var key = '';
- event = event || window.event;
- if(event.keyCode) {
- if(event.altKey) {
- key += 'a';
- }
- if(event.ctrlKey) {
- key += 'c';
- }
- if(event.shiftKey) {
- key += 's';
- }
- if(key == '') {
- key = 'n';
- }
- code = this._mergeNumKey(event.keyCode);
- if(this.functions[key][code]) {
- this.functions[key][code]();
- if(this.options.preventDefault) {
- Event.stop(event);
- }
- }
- }
- }
- },
- remove: function(shortcut) {
- this._add_or_remove_function(shortcut);
- },
- start: function() {
- this.executable = true;
- },
- stop: function() {
- this.executable = false;
- },
- _add_or_remove_function: function(shortcut, callback) {
- var pressed_key_code;
- var additional_keys = new Array();
- var self = this;
- $A(shortcut.toLowerCase().split("+")).each(
- function(key) {
- if(key == 'alt') {
- additional_keys.push('a');
- } else if(key == 'ctrl') {
- additional_keys.push('c');
- } else if(key == 'shift') {
- additional_keys.push('s');
- } else {
- pressed_key_code = self.keyCode[key];
- }
- }
- );
- var key = additional_keys.sortBy(function(value, index) {return value;}).join('');
- if(key == '') {
- key = 'n';
- }
- if(callback) {
- this.functions[key][pressed_key_code] = callback;
- } else {
- this.functions[key][pressed_key_code] = null;
- }
- },
- _mergeNumKey: function(code) {
- return (this.numKeys[code]) ? this.numKeys[code] : code;
- }
-}
-
-
-/**
- * Function
- */
-Function.prototype.callAfterLoading = function(object) {
- object = object || this;
- if (UserAgent.isIE() && document.readyState != 'complete') {
- Event.observe(window, 'load', this.bind(object));
- } else {
- this.call(object);
- }
-}
+// Copyright (c) 2006 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+/**\r
+ * Element class\r
+ */\r
+Object.extend(Element, {\r
+\r
+ getTagNodes: function(element, tree) {\r
+ return this.getElementsByNodeType(element, 1, tree);\r
+ },\r
+ \r
+ getTextNodes: function(element, tree) {\r
+ return this.getElementsByNodeType(element, 3, tree);\r
+ },\r
+ \r
+ getElementsByNodeType: function(element, nodeType, tree) {\r
+ \r
+ element = ($(element) || document.body);\r
+ var nodes = element.childNodes;\r
+ var result = [];\r
+ \r
+ for (var i = 0; i < nodes.length; i++) {\r
+ if (nodes[i].nodeType == nodeType)\r
+ result.push(nodes[i]);\r
+ if (tree && (nodes[i].nodeType == 1)) \r
+ result = result.concat(this.getElementsByNodeType(nodes[i], nodeType, tree));\r
+ }\r
+ \r
+ return result;\r
+ },\r
+ \r
+ getParentByClassName: function(className, element) {\r
+ var parent = element.parentNode;\r
+ if (!parent || (parent.tagName == 'BODY'))\r
+ return null;\r
+ else if (!parent.className) \r
+ return Element.getParentByClassName(className, parent);\r
+ else if (Element.hasClassName(parent, className))\r
+ return parent;\r
+ else\r
+ return Element.getParentByClassName(className, parent);\r
+ },\r
+ \r
+ getParentByTagName: function(tagNames, element) {\r
+ \r
+ var parent = element.parentNode;\r
+ if (parent.tagName == 'BODY')\r
+ return null;\r
+ \r
+ var index = tagNames.join('/').toUpperCase().indexOf(parent.tagName.toUpperCase(), 0);\r
+ if (index >= 0)\r
+ return parent;\r
+ else\r
+ return Element.getParentByTagName(tagNames, parent);\r
+ },\r
+ \r
+ getFirstElementByClassNames: function(element, classNames, tree) {\r
+ \r
+ if (!element || \r
+ !((typeof(classNames) == 'object') && (classNames.constructor == Array))) {\r
+ return; \r
+ }\r
+ \r
+ element = (element || document.body);\r
+ var nodes = element.childNodes;\r
+ \r
+ for (var i = 0; i < nodes.length; i++) {\r
+ for (var j = 0; j < classNames.length; j++) {\r
+ if (nodes[i].nodeType != 1) {\r
+ continue;\r
+ \r
+ } else if (Element.hasClassName(nodes[i], classNames[j])) {\r
+ return nodes[i];\r
+ \r
+ } else if (tree) {\r
+ var result = this.getFirstElementByClassNames(nodes[i], classNames, tree);\r
+ if (result) return result;\r
+ }\r
+ }\r
+ }\r
+ \r
+ return;\r
+ },\r
+ \r
+ getElementsByClassNames: function(element, classNames) {\r
+ \r
+ if (!element || \r
+ !((typeof(classNames) == 'object') && (classNames.constructor == Array))) {\r
+ return; \r
+ }\r
+ \r
+ var nodes = [];\r
+ classNames.each(function(c) {\r
+ nodes = nodes.concat(document.getElementsByClassName(c, element));\r
+ });\r
+ \r
+ return nodes;\r
+ },\r
+ \r
+ getWindowHeight: function() {\r
+ \r
+ if (window.innerHeight) {\r
+ return window.innerHeight; // Mozilla, Opera, NN4\r
+ } else if (document.documentElement && document.documentElement.offsetHeight){ // ?? IE\r
+ return document.documentElement.offsetHeight;\r
+ } else if (document.body && document.body.offsetHeight) {\r
+ return document.body.offsetHeight - 20;\r
+ }\r
+ return 0;\r
+ },\r
+ \r
+ getWindowWidth:function() {\r
+ \r
+ if(window.innerWidth) {\r
+ return window.innerWidth; // Mozilla, Opera, NN4\r
+ } else if (document.documentElement && document.documentElement.offsetWidth){ // ?? IE\r
+ return document.documentElement.offsetWidth - 20;\r
+ } else if (document.body && document.body.offsetWidth){\r
+ return document.body.offsetWidth - 20;\r
+ }\r
+ return 0;\r
+ },\r
+ \r
+ getMaxZindex: function(element) {\r
+ element = $(element);\r
+ if (!element) {\r
+ element = document.body;\r
+ } \r
+ if (element.nodeType != 1) return 0;\r
+\r
+ var maxZindex = 0;\r
+ if (element.style) maxZindex = parseInt(Element.getStyle(element, "z-index")); \r
+ if (isNaN(maxZindex)) maxZindex = 0;\r
+\r
+ var tmpZindex = 0;\r
+ var elements = element.childNodes;\r
+ for (var i = 0; i < elements.length; i++) {\r
+ if (elements[i] && elements[i].tagName) {\r
+ tmpZindex = Element.getMaxZindex(elements[i]);\r
+ if (maxZindex < tmpZindex) maxZindex = tmpZindex;\r
+ }\r
+ }\r
+\r
+ return maxZindex;\r
+ },\r
+\r
+ select: function(element, value) {\r
+ $A($(element).options).each(function(opt) {\r
+ if (opt.value == value) {\r
+ opt.selected = true;\r
+ } else {\r
+ opt.selected = false;\r
+ }\r
+ });\r
+ }\r
+});\r
+\r
+\r
+/**\r
+ * Array\r
+ */\r
+Object.extend(Array.prototype, {\r
+ insert : function(index, element) {\r
+ this.splice(index, 0 , element);\r
+ },\r
+ \r
+ remove : function(index) {\r
+ this.splice(index, 1);\r
+ }\r
+});\r
+\r
+\r
+/**\r
+ * String\r
+ */\r
+Object.extend(String.prototype, {\r
+ \r
+ getPrefix: function(delimiter) {\r
+ \r
+ if (!delimiter) delimiter = '_';\r
+ return this.split(delimiter)[0];\r
+ },\r
+ \r
+ getSuffix: function(delimiter) {\r
+ \r
+ if (!delimiter) delimiter = '_';\r
+ return this.split(delimiter).pop();\r
+ },\r
+\r
+ appendPrefix: function(prefix, delimiter) {\r
+ \r
+ if (!delimiter) delimiter = '_';\r
+ return this + delimiter + prefix;\r
+ },\r
+ \r
+ appendSuffix: function(suffix, delimiter) {\r
+ \r
+ if (!delimiter) delimiter = '_';\r
+ return this + delimiter + suffix;\r
+ },\r
+ \r
+ // for firefox\r
+ println: function() {\r
+ dump(this + '\n');\r
+ }\r
+});\r
+\r
+\r
+/**\r
+ * CssUtil\r
+ */\r
+var CssUtil = Class.create();\r
+\r
+CssUtil.appendPrefix = function(prefix, suffixes) {\r
+ var newHash = {};\r
+ $H(suffixes).each(function(pair) {\r
+ newHash[pair[0]] = prefix + suffixes[pair[0]];\r
+ });\r
+ return newHash;\r
+}\r
+\r
+CssUtil.getCssRules = function(sheet) {\r
+ return sheet.rules || sheet.cssRules;\r
+}\r
+\r
+CssUtil.getCssRuleBySelectorText = function(selector) {\r
+ var rule = null;\r
+ $A(document.styleSheets).each(function(s) {\r
+ var rules = CssUtil.getCssRules(s);\r
+ rule = $A(rules).detect(function(r) {\r
+ if (!r.selectorText) return false;\r
+ return r.selectorText.toLowerCase() == selector.toLowerCase();\r
+ });\r
+ if (rule) throw $break;\r
+ });\r
+ return rule;\r
+}\r
+\r
+/*\r
+CssUtil.require = function(file, attributes, parent) {\r
+ var links = document.getElementsByTagName('link');\r
+ var regex = /^.*\.css/; \r
+ var match = file.match(regex)\r
+ alert(file)\r
+ regex.compile(match);\r
+\r
+ $A(links).each(function(ln) {\r
+ if (ln.href.match(regex)) {\r
+ }\r
+ });\r
+ \r
+// attributes = Object.extend({\r
+// href: file, \r
+// media: 'screen', \r
+// rel: 'stylesheet', \r
+// type: 'text/css'}, attributes);\r
+// var node = Builder.node('link', attributes);\r
+// if (!parent) parent = document.body;\r
+// parent.appendChild(node);\r
+// alert(file);\r
+}\r
+*/\r
+\r
+CssUtil.prototype = {\r
+ \r
+ initialize: function(styles) {\r
+ if (!((typeof(styles) == 'object') && (styles.constructor == Array))) {\r
+ throw 'CssUtil#initialize: argument must be a Array object!'; \r
+ }\r
+ \r
+ this.styles = styles;\r
+ },\r
+\r
+ getClasses: function(key) {\r
+ return this.styles.collect(function(s) {\r
+ return s[key];\r
+ });\r
+ },\r
+ \r
+ joinClassNames: function(key) {\r
+ return this.getClasses(key).join(' ');\r
+ },\r
+ \r
+ addClassNames: function(element, key) {\r
+ this.styles.each(function(s) {\r
+ Element.addClassName(element, s[key]);\r
+ });\r
+ },\r
+ \r
+ removeClassNames: function(element, key) {\r
+ this.styles.each(function(s) {\r
+ Element.removeClassName(element, s[key]);\r
+ });\r
+ },\r
+ \r
+ refreshClassNames: function(element, key) {\r
+ element.className = '';\r
+ this.addClassNames(element, key);\r
+ },\r
+ \r
+ hasClassName: function(element, key) {\r
+ return this.styles.any(function(s) {\r
+ return Element.hasClassName(element, s[key]);\r
+ });\r
+ }\r
+}\r
+\r
+\r
+/** \r
+ * Hover \r
+ */\r
+var Hover = Class.create();\r
+Hover.prototype = {\r
+\r
+ initialize: function(element) {\r
+ this.options = Object.extend({\r
+ defaultClass: '',\r
+ hoverClass: '',\r
+ cssUtil: '',\r
+ list: false\r
+ }, arguments[1] || {});\r
+ \r
+ var element = $(element);\r
+ if (this.options.list) {\r
+ var nodes = element.childNodes;\r
+ for (var i = 0; i < nodes.length; i++) {\r
+ if (nodes[i].nodeType == 1) {\r
+ this.build(nodes[i]);\r
+ }\r
+ }\r
+ } else {\r
+ this.build(element);\r
+ }\r
+ },\r
+ \r
+ build: function(element) {\r
+ this.normal = this.getNormalClass(element);\r
+ this.hover = this.getHoverClass(this.normal);\r
+ \r
+ if (this.options.cssUtil) {\r
+ this.normal = this.options.cssUtil.joinClassNames(normal);\r
+ this.hover = this.options.cssUtil.joinClassNames(hover); \r
+ }\r
+ this.setHoverEvent(element);\r
+ },\r
+\r
+ setHoverEvent: function(element) {\r
+ Event.observe(element, "mouseout", this.toggle.bindAsEventListener(this, element, this.normal));\r
+ Event.observe(element, "mouseover", this.toggle.bindAsEventListener(this, element, this.hover));\r
+ },\r
+\r
+ toggle: function(event, element, className) {\r
+ Event.stop(event);\r
+ element.className = className;\r
+ },\r
+\r
+ getNormalClass: function(element) {\r
+ var className = (this.options.defaultClass || element.className);\r
+ return (className || '');\r
+ },\r
+ \r
+ getHoverClass: function(defaultClass) {\r
+ var className = this.options.hoverClass;\r
+ if (!className) {\r
+ className = defaultClass.split(' ').collect(function(c) {\r
+ return c + 'Hover';\r
+ }).join(' ');\r
+ } \r
+ return className;\r
+ }\r
+}\r
+\r
+\r
+/**\r
+ * Date\r
+ */\r
+Object.extend(Date.prototype, {\r
+ msPerDay: function() {\r
+ return 24 * 60 * 60 * 1000;\r
+ },\r
+\r
+ advance: function(options) {\r
+ return new Date(this.getTime() + this.msPerDay() * options.days);\r
+ },\r
+\r
+ days: function() {\r
+ var date = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0);\r
+ return Math.round(date.getTime() / this.msPerDay());\r
+ },\r
+\r
+ toHash: function() {\r
+ return {\r
+ year: this.getFullYear(),\r
+ month: this.getMonth(),\r
+ day: this.getDate(),\r
+ hour: this.getHours(),\r
+ min: this.getMinutes(),\r
+ sec: this.getSeconds()\r
+ }\r
+ },\r
+\r
+ sameYear: function(date) {\r
+ return this.getFullYear() == date.getFullYear();\r
+ },\r
+\r
+ sameMonth: function(date) {\r
+ return this.sameYear(date) && this.getMonth() == date.getMonth();\r
+ },\r
+\r
+ sameDate: function(date) {\r
+ return this.sameYear(date) && this.sameMonth(date) && this.getDate() == date.getDate();\r
+ },\r
+\r
+ betweenDate: function(start, finish) {\r
+ var myDays = this.days();\r
+ return (start.days() <= myDays && myDays <= finish.days());\r
+ },\r
+\r
+ betweenTime: function(start, finish) {\r
+ var myTime = this.getTime();\r
+ return (start.getTime() <= myTime && myTime <= finish.getTime());\r
+ }\r
+});\r
+\r
+\r
+/**\r
+ * DateUtil\r
+ */\r
+var DateUtil = {\r
+\r
+ dayOfWeek: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\r
+\r
+ months: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\r
+\r
+ daysOfMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],\r
+\r
+ numberOfDays: function(start, finish) {\r
+ return finish.days() - start.days();\r
+ },\r
+\r
+ isLeapYear: function(year) {\r
+ if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))\r
+ return true;\r
+ return false;\r
+ }, \r
+\r
+ nextDate: function(date) {\r
+ return new Date(date.getFullYear(), date.getMonth(), date.getDate() + 1);\r
+ },\r
+\r
+ previousDate: function(date) {\r
+ return new Date(date.getFullYear(), date.getMonth(), date.getDate() - 1);\r
+ },\r
+ \r
+ afterDays: function(date, after) {\r
+ return new Date(date.getFullYear(), date.getMonth(), date.getDate() + after);\r
+ },\r
+ \r
+ getLastDate: function(year, month) {\r
+ var last = this.daysOfMonth[month];\r
+ if ((month == 1) && this.isLeapYear(year)) {\r
+ return new Date(year, month, last + 1);\r
+ }\r
+ return new Date(year, month, last);\r
+ },\r
+ \r
+ getFirstDate: function(year, month) {\r
+ if (year.constructor == Date) {\r
+ return new Date(year.getFullYear(), year.getMonth(), 1);\r
+ }\r
+ return new Date(year, month, 1);\r
+ },\r
+\r
+ getWeekTurn: function(date, firstDWeek) {\r
+ var limit = 6 - firstDWeek + 1;\r
+ var turn = 0;\r
+ while (limit < date) {\r
+ date -= 7;\r
+ turn++;\r
+ }\r
+ return turn;\r
+ },\r
+\r
+ toDateString: function(date) {\r
+ return date.toDateString();\r
+ },\r
+ \r
+ toLocaleDateString: function(date) {\r
+ return date.toLocaleDateString();\r
+ },\r
+ \r
+ simpleFormat: function(formatStr) {\r
+ return function(date) {\r
+ var formated = formatStr.replace(/M+/g, DateUtil.zerofill((date.getMonth() + 1).toString(), 2));\r
+ formated = formated.replace(/d+/g, DateUtil.zerofill(date.getDate().toString(), 2));\r
+ formated = formated.replace(/y{4}/g, date.getFullYear());\r
+ formated = formated.replace(/y{1,3}/g, new String(date.getFullYear()).substr(2));\r
+ formated = formated.replace(/E+/g, DateUtil.dayOfWeek[date.getDay()]);\r
+ \r
+ return formated;\r
+ }\r
+ },\r
+\r
+ zerofill: function(date,digit){\r
+ var result = date;\r
+ if(date.length < digit){\r
+ var tmp = digit - date.length;\r
+ for(i=0; i < tmp; i++){\r
+ result = "0" + result;\r
+ }\r
+ }\r
+ return result;\r
+ },\r
+\r
+ toDate: function(hash) {\r
+ return new Date(hash.year, hash.month, hash.day, hash.hour, hash.min, hash.sec || 0);\r
+ }\r
+}\r
+\r
+\r
+/**\r
+ * ZindexManager\r
+ */\r
+var ZindexManager = {\r
+ zIndex: 1000,\r
+\r
+ getIndex: function(zIndex) {\r
+ if (zIndex) {\r
+ if (isNaN(zIndex)) {\r
+ zIndex = Element.getMaxZindex() + 1;\r
+ } else if (ZindexManager.zIndex > zIndex) {\r
+ zIndex = ZindexManager.zIndex;\r
+ }\r
+ } else {\r
+ zIndex = ZindexManager.zIndex;\r
+ }\r
+ ZindexManager.zIndex = zIndex + 1;\r
+ return zIndex;\r
+ }\r
+}\r
+\r
+\r
+/**\r
+ * Modal\r
+ */\r
+var Modal = {\r
+ maskId: 'modalMask',\r
+ maskClass: 'modal_mask',\r
+ maskClassIE: 'modal_mask_ie',\r
+ element: null,\r
+ snaps: null,\r
+ listener: null,\r
+ resizeListener: null,\r
+ cover: null,\r
+ excepteds: null,\r
+\r
+ mask: function(excepted) {\r
+ var options = Object.extend({\r
+ cssPrefix: 'custom_',\r
+ zIndex: null\r
+ }, arguments[1] || {});\r
+\r
+ if (Modal.element) {\r
+ Modal._snap(excepted);\r
+ Modal._rebuildMask();\r
+ } else {\r
+ Modal.snaps = [];\r
+ Modal.excepteds = [];\r
+ Modal._buildMask(options.cssPrefix);\r
+ Modal.cover = new IECover(Modal.element, {transparent: true});\r
+ }\r
+ Modal._setZindex(excepted, options.zIndex);\r
+ Modal._setFullSize();\r
+ if (!Modal.hasExcepted(excepted)) Modal.excepteds.push(excepted);\r
+ },\r
+\r
+ unmask: function() {\r
+ if (Modal.element) {\r
+ if (Modal.snaps.length == 0) {\r
+ Element.hide(Modal.element);\r
+ Modal._removeEvent();\r
+ Modal.excepteds = [];\r
+ Element.remove(Modal.element);\r
+ Modal.element = null;\r
+ } else {\r
+ Element.setStyle(Modal.element, {zIndex: Modal.snaps.pop()});\r
+ Modal.excepteds.pop();\r
+ }\r
+ }\r
+ },\r
+\r
+ _addEvent: function() {\r
+ if (!Modal.listener) {\r
+ Modal.listener = Modal._handleEvent.bindAsEventListener();\r
+ Modal.resizeListener = Modal._onResize.bindAsEventListener();\r
+ }\r
+ Event.observe(document, "keypress", Modal.listener);\r
+ Event.observe(document, "keydown", Modal.listener);\r
+ Event.observe(document, "keyup", Modal.listener);\r
+ Event.observe(document, "focus", Modal.listener);\r
+ Event.observe(window, "resize", Modal.resizeListener);\r
+ },\r
+\r
+ _removeEvent: function() {\r
+ Event.stopObserving(document, "keypress", Modal.listener);\r
+ Event.stopObserving(document, "keydown", Modal.listener);\r
+ Event.stopObserving(document, "keyup", Modal.listener);\r
+ Event.stopObserving(document, "focus", Modal.listener);\r
+ Event.stopObserving(window, "resize", Modal.resizeListener);\r
+ },\r
+\r
+ _isMasked: function() {\r
+ return Modal.element && Element.visible(Modal.element);\r
+ },\r
+\r
+ _snap: function(excepted) {\r
+ var index = Element.getStyle(Modal.element, 'zIndex');\r
+ if (index && Modal._isMasked() && !Modal.hasExcepted(excepted)) Modal.snaps.push(index);\r
+ },\r
+\r
+ _setZindex: function(excepted, zIndex) {\r
+ zIndex = ZindexManager.getIndex(zIndex);\r
+ Element.setStyle(Modal.element, {zIndex: zIndex});\r
+ excepted = Element.makePositioned($(excepted));\r
+ Element.setStyle(excepted, {zIndex: ++zIndex});\r
+ },\r
+\r
+ _setFullSize: function() {\r
+ Modal.element.setStyle({\r
+ width: Element.getWindowWidth() + 'px',\r
+ height: Element.getWindowHeight() + 'px'\r
+ });\r
+ if (Modal.cover) Modal.cover.resetSize();\r
+ },\r
+\r
+ _buildMask: function(cssPrefix) {\r
+ var mask = Builder.node('div', {id: Modal.maskId});\r
+ Modal._setClassNames(mask, cssPrefix);\r
+ document.body.appendChild(mask);\r
+ Modal.element = mask;\r
+ Modal._addEvent();\r
+ },\r
+\r
+ _setClassNames: function(element, cssPrefix) {\r
+ var className = (UserAgent.isIE()) ? Modal.maskClassIE : Modal.maskClass;\r
+ Element.addClassName(element, className);\r
+ Element.addClassName(element, cssPrefix + className);\r
+ },\r
+\r
+ _rebuildMask: function() {\r
+ document.body.appendChild(Modal.element);\r
+ Element.show(Modal.element);\r
+ },\r
+\r
+ _isOutOfModal: function(src) {\r
+ var limit = Element.getStyle(Modal.element, 'zIndex');\r
+ var zIndex = null;\r
+ while ((src = src.parentNode) && src != document.body) {\r
+ if (src.style && (zIndex = Element.getStyle(src, 'zIndex'))) {\r
+ if (zIndex > limit) {\r
+ return true;\r
+ } else {\r
+ return false;\r
+ }\r
+ }\r
+ }\r
+ return false;\r
+ },\r
+\r
+ _handleEvent: function (event) {\r
+ var src = Event.element(event);\r
+ if (!Modal._isOutOfModal(src)) {\r
+ Event.stop(event);\r
+ }\r
+ },\r
+\r
+ _onResize: function(event) {\r
+ Modal._setFullSize();\r
+ },\r
+\r
+ hasExcepted: function(excepted) {\r
+ return Modal.excepteds && Modal.excepteds.include(excepted);\r
+ }\r
+}\r
+\r
+\r
+/**\r
+ * IECover\r
+ */\r
+var IECover = Class.create();\r
+IECover.src = '/blank.html';\r
+IECover.prototype = {\r
+ idSuffix: 'iecover',\r
+\r
+ initialize: function(parent) {\r
+ this.options = Object.extend({\r
+ transparent : false,\r
+ padding : 0\r
+ }, arguments[1] || {});\r
+\r
+ if (document.all) {\r
+ parent = $(parent);\r
+ this.id = parent.id.appendSuffix(this.idSuffix);\r
+ this._build(parent);\r
+ this.resetSize();\r
+ }\r
+ },\r
+\r
+ resetSize: function() {\r
+ if (this.element) {\r
+ var parent = this.element.parentNode;\r
+ var padding = this.options.padding;\r
+ this.element.width = parent.offsetWidth - padding + 'px';\r
+ this.element.height = Element.getHeight(parent) - padding + 'px';\r
+ }\r
+ },\r
+\r
+ _build: function(parent) {\r
+ var padding = this.options.padding / 2;\r
+ var styles = {\r
+ position : 'absolute',\r
+ top : padding + 'px',\r
+ left : padding + 'px'\r
+ };\r
+ if (this.options.transparent) styles.filter = 'alpha(opacity=0)';\r
+ this.element = Builder.node('iframe', {src: IECover.src, id: this.id, frameborder: 0});\r
+ Element.setStyle(this.element, styles);\r
+ var firstNode = Element.down(parent, 0);\r
+ if (firstNode) Element.makePositioned(firstNode);\r
+ parent.insertBefore(this.element, parent.firstChild);\r
+ }\r
+}\r
+\r
+/**\r
+ * UserAgent\r
+ */\r
+var UserAgent = {\r
+ getUserAgent: function() {\r
+ return navigator.userAgent;\r
+ },\r
+ isIE: function() {\r
+ if(document.all && this.getUserAgent().toLowerCase().indexOf('msie') != -1) {\r
+ return true;\r
+ }\r
+ },\r
+ isIE7: function() {\r
+ if(document.all && this.getUserAgent().toLowerCase().indexOf('msie 7') != -1) {\r
+ return true;\r
+ }\r
+ }\r
+}\r
+\r
+/**\r
+ * ShortcutManager\r
+ */\r
+var ShortcutManager = {\r
+ initialize: function() {\r
+ var defaultOptions = {\r
+ initialStarted: true,\r
+ preventDefault: true\r
+ }\r
+ this.options = Object.extend(defaultOptions, arguments[0] || {});\r
+ if(this.documentListener) {\r
+ Event.stopObserving(document, 'keydown', this.documentListener);\r
+ }\r
+ this.documentListener = this.eventKeydown.bindAsEventListener(this);\r
+ this.functions = new Object();\r
+ this.functions['a'] = new Object();\r
+ this.functions['ac'] = new Object();\r
+ this.functions['as'] = new Object();\r
+ this.functions['acs'] = new Object();\r
+ this.functions['c'] = new Object();\r
+ this.functions['cs'] = new Object();\r
+ this.functions['n'] = new Object();\r
+ this.functions['s'] = new Object();\r
+ this.keyCode = {\r
+ 'backspace': 8,\r
+ 'tab': 9,\r
+ 'return': 13,\r
+ 'enter': 13,\r
+ 'pause': 19,\r
+ 'break': 19,\r
+ 'caps': 20,\r
+ 'capslock': 20,\r
+ 'esc': 27,\r
+ 'escape': 27,\r
+ 'space': 32,\r
+ 'pageup': 33,\r
+ 'pgup': 33,\r
+ 'pagedown': 34,\r
+ 'pgdn': 34,\r
+ 'end': 35,\r
+ 'home': 36,\r
+ 'left': 37,\r
+ 'up': 38,\r
+ 'right': 39,\r
+ 'down': 40,\r
+ 'insert': 45,\r
+ 'delete': 46,\r
+ '0': 48,\r
+ '1': 49,\r
+ '2': 50,\r
+ '3': 51,\r
+ '4': 52,\r
+ '5': 53,\r
+ '6': 54,\r
+ '7': 55,\r
+ '8': 56,\r
+ '9': 57,\r
+ 'a': 65,\r
+ 'b': 66,\r
+ 'c': 67,\r
+ 'd': 68,\r
+ 'e': 69,\r
+ 'f': 70,\r
+ 'g': 71,\r
+ 'h': 72,\r
+ 'i': 73,\r
+ 'j': 74,\r
+ 'k': 75,\r
+ 'l': 76,\r
+ 'm': 77,\r
+ 'n': 78,\r
+ 'o': 79,\r
+ 'p': 80,\r
+ 'q': 81,\r
+ 'r': 82,\r
+ 's': 83,\r
+ 't': 84,\r
+ 'u': 85,\r
+ 'v': 86,\r
+ 'w': 87,\r
+ 'x': 88,\r
+ 'y': 89,\r
+ 'z': 90,\r
+ 'f1': 112,\r
+ 'f2': 113,\r
+ 'f3': 114,\r
+ 'f4': 115,\r
+ 'f5': 116,\r
+ 'f6': 117,\r
+ 'f7': 118,\r
+ 'f8': 119,\r
+ 'f9': 120,\r
+ 'f10': 121,\r
+ 'f11': 122,\r
+ 'f12': 123,\r
+ 'numlock': 144,\r
+ 'nmlk': 144,\r
+ 'scrolllock': 145,\r
+ 'scflk': 145\r
+ };\r
+ this.numKeys = {\r
+ 96: 48,\r
+ 97: 49,\r
+ 98: 50,\r
+ 99: 51,\r
+ 100: 52,\r
+ 101: 53,\r
+ 102: 54,\r
+ 103: 55,\r
+ 104: 56,\r
+ 105: 57\r
+ };\r
+ if(this.options.initialStarted) {\r
+ this.start();\r
+ } else {\r
+ this.stop();\r
+ }\r
+ Event.observe(document, 'keydown', this.documentListener);\r
+ },\r
+ add: function(shortcut, callback) {\r
+ this._add_or_remove_function(shortcut, callback);\r
+ },\r
+ destroy: function() {\r
+ Event.stopObserving(document, 'keydown', this.documentListener);\r
+ },\r
+ eventKeydown: function(event) {\r
+ if(this.executable) {\r
+ var code;\r
+ var key = '';\r
+ event = event || window.event;\r
+ if(event.keyCode) {\r
+ if(event.altKey) {\r
+ key += 'a';\r
+ }\r
+ if(event.ctrlKey) {\r
+ key += 'c';\r
+ }\r
+ if(event.shiftKey) {\r
+ key += 's';\r
+ }\r
+ if(key == '') {\r
+ key = 'n';\r
+ }\r
+ code = this._mergeNumKey(event.keyCode);\r
+ if(this.functions[key][code]) {\r
+ this.functions[key][code]();\r
+ if(this.options.preventDefault) {\r
+ Event.stop(event);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ },\r
+ remove: function(shortcut) {\r
+ this._add_or_remove_function(shortcut);\r
+ },\r
+ start: function() {\r
+ this.executable = true;\r
+ },\r
+ stop: function() {\r
+ this.executable = false;\r
+ },\r
+ _add_or_remove_function: function(shortcut, callback) {\r
+ var pressed_key_code;\r
+ var additional_keys = new Array();\r
+ var self = this;\r
+ $A(shortcut.toLowerCase().split("+")).each(\r
+ function(key) {\r
+ if(key == 'alt') {\r
+ additional_keys.push('a');\r
+ } else if(key == 'ctrl') {\r
+ additional_keys.push('c');\r
+ } else if(key == 'shift') {\r
+ additional_keys.push('s');\r
+ } else {\r
+ pressed_key_code = self.keyCode[key];\r
+ }\r
+ }\r
+ );\r
+ var key = additional_keys.sortBy(function(value, index) {return value;}).join('');\r
+ if(key == '') {\r
+ key = 'n';\r
+ }\r
+ if(callback) {\r
+ this.functions[key][pressed_key_code] = callback;\r
+ } else {\r
+ this.functions[key][pressed_key_code] = null;\r
+ }\r
+ },\r
+ _mergeNumKey: function(code) {\r
+ return (this.numKeys[code]) ? this.numKeys[code] : code;\r
+ }\r
+}\r
+\r
+\r
+/**\r
+ * Function\r
+ */\r
+Function.prototype.callAfterLoading = function(object) {\r
+ object = object || this;\r
+ if (UserAgent.isIE() && document.readyState != 'complete') {\r
+ Event.observe(window, 'load', this.bind(object));\r
+ } else {\r
+ this.call(object);\r
+ }\r
+}\r
-// script.aculo.us unittest.js v1.6.4, Wed Sep 06 11:30:58 CEST 2006
-
-// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-// (c) 2005 Jon Tirsen (http://www.tirsen.com)
-// (c) 2005 Michael Schuerig (http://www.schuerig.de/michael/)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-
-// experimental, Firefox-only
-Event.simulateMouse = function(element, eventName) {
- var options = Object.extend({
- pointerX: 0,
- pointerY: 0,
- buttons: 0
- }, arguments[2] || {});
- var oEvent = document.createEvent("MouseEvents");
- oEvent.initMouseEvent(eventName, true, true, document.defaultView,
- options.buttons, options.pointerX, options.pointerY, options.pointerX, options.pointerY,
- false, false, false, false, 0, $(element));
-
- if(this.mark) Element.remove(this.mark);
- this.mark = document.createElement('div');
- this.mark.appendChild(document.createTextNode(" "));
- document.body.appendChild(this.mark);
- this.mark.style.position = 'absolute';
- this.mark.style.top = options.pointerY + "px";
- this.mark.style.left = options.pointerX + "px";
- this.mark.style.width = "5px";
- this.mark.style.height = "5px;";
- this.mark.style.borderTop = "1px solid red;"
- this.mark.style.borderLeft = "1px solid red;"
-
- if(this.step)
- alert('['+new Date().getTime().toString()+'] '+eventName+'/'+Test.Unit.inspect(options));
-
- $(element).dispatchEvent(oEvent);
-};
-
-// Note: Due to a fix in Firefox 1.0.5/6 that probably fixed "too much", this doesn't work in 1.0.6 or DP2.
-// You need to downgrade to 1.0.4 for now to get this working
-// See https://bugzilla.mozilla.org/show_bug.cgi?id=289940 for the fix that fixed too much
-Event.simulateKey = function(element, eventName) {
- var options = Object.extend({
- ctrlKey: false,
- altKey: false,
- shiftKey: false,
- metaKey: false,
- keyCode: 0,
- charCode: 0
- }, arguments[2] || {});
-
- var oEvent = document.createEvent("KeyEvents");
- oEvent.initKeyEvent(eventName, true, true, window,
- options.ctrlKey, options.altKey, options.shiftKey, options.metaKey,
- options.keyCode, options.charCode );
- $(element).dispatchEvent(oEvent);
-};
-
-Event.simulateKeys = function(element, command) {
- for(var i=0; i<command.length; i++) {
- Event.simulateKey(element,'keypress',{charCode:command.charCodeAt(i)});
- }
-};
-
-var Test = {}
-Test.Unit = {};
-
-// security exception workaround
-Test.Unit.inspect = Object.inspect;
-
-Test.Unit.Logger = Class.create();
-Test.Unit.Logger.prototype = {
- initialize: function(log) {
- this.log = $(log);
- if (this.log) {
- this._createLogTable();
- }
- },
- start: function(testName) {
- if (!this.log) return;
- this.testName = testName;
- this.lastLogLine = document.createElement('tr');
- this.statusCell = document.createElement('td');
- this.nameCell = document.createElement('td');
- this.nameCell.appendChild(document.createTextNode(testName));
- this.messageCell = document.createElement('td');
- this.lastLogLine.appendChild(this.statusCell);
- this.lastLogLine.appendChild(this.nameCell);
- this.lastLogLine.appendChild(this.messageCell);
- this.loglines.appendChild(this.lastLogLine);
- },
- finish: function(status, summary) {
- if (!this.log) return;
- this.lastLogLine.className = status;
- this.statusCell.innerHTML = status;
- this.messageCell.innerHTML = this._toHTML(summary);
- },
- message: function(message) {
- if (!this.log) return;
- this.messageCell.innerHTML = this._toHTML(message);
- },
- summary: function(summary) {
- if (!this.log) return;
- this.logsummary.innerHTML = this._toHTML(summary);
- },
- _createLogTable: function() {
- this.log.innerHTML =
- '<div id="logsummary"></div>' +
- '<table id="logtable">' +
- '<thead><tr><th>Status</th><th>Test</th><th>Message</th></tr></thead>' +
- '<tbody id="loglines"></tbody>' +
- '</table>';
- this.logsummary = $('logsummary')
- this.loglines = $('loglines');
- },
- _toHTML: function(txt) {
- return txt.escapeHTML().replace(/\n/g,"<br/>");
- }
-}
-
-Test.Unit.Runner = Class.create();
-Test.Unit.Runner.prototype = {
- initialize: function(testcases) {
- this.options = Object.extend({
- testLog: 'testlog'
- }, arguments[1] || {});
- this.options.resultsURL = this.parseResultsURLQueryParameter();
- if (this.options.testLog) {
- this.options.testLog = $(this.options.testLog) || null;
- }
- if(this.options.tests) {
- this.tests = [];
- for(var i = 0; i < this.options.tests.length; i++) {
- if(/^test/.test(this.options.tests[i])) {
- this.tests.push(new Test.Unit.Testcase(this.options.tests[i], testcases[this.options.tests[i]], testcases["setup"], testcases["teardown"]));
- }
- }
- } else {
- if (this.options.test) {
- this.tests = [new Test.Unit.Testcase(this.options.test, testcases[this.options.test], testcases["setup"], testcases["teardown"])];
- } else {
- this.tests = [];
- for(var testcase in testcases) {
- if(/^test/.test(testcase)) {
- this.tests.push(
- new Test.Unit.Testcase(
- this.options.context ? ' -> ' + this.options.titles[testcase] : testcase,
- testcases[testcase], testcases["setup"], testcases["teardown"]
- ));
- }
- }
- }
- }
- this.currentTest = 0;
- this.logger = new Test.Unit.Logger(this.options.testLog);
- setTimeout(this.runTests.bind(this), 1000);
- },
- parseResultsURLQueryParameter: function() {
- return window.location.search.parseQuery()["resultsURL"];
- },
- // Returns:
- // "ERROR" if there was an error,
- // "FAILURE" if there was a failure, or
- // "SUCCESS" if there was neither
- getResult: function() {
- var hasFailure = false;
- for(var i=0;i<this.tests.length;i++) {
- if (this.tests[i].errors > 0) {
- return "ERROR";
- }
- if (this.tests[i].failures > 0) {
- hasFailure = true;
- }
- }
- if (hasFailure) {
- return "FAILURE";
- } else {
- return "SUCCESS";
- }
- },
- postResults: function() {
- if (this.options.resultsURL) {
- new Ajax.Request(this.options.resultsURL,
- { method: 'get', parameters: 'result=' + this.getResult(), asynchronous: false });
- }
- },
- runTests: function() {
- var test = this.tests[this.currentTest];
- if (!test) {
- // finished!
- this.postResults();
- this.logger.summary(this.summary());
- return;
- }
- if(!test.isWaiting) {
- this.logger.start(test.name);
- }
- test.run();
- if(test.isWaiting) {
- this.logger.message("Waiting for " + test.timeToWait + "ms");
- setTimeout(this.runTests.bind(this), test.timeToWait || 1000);
- } else {
- this.logger.finish(test.status(), test.summary());
- this.currentTest++;
- // tail recursive, hopefully the browser will skip the stackframe
- this.runTests();
- }
- },
- summary: function() {
- var assertions = 0;
- var failures = 0;
- var errors = 0;
- var messages = [];
- for(var i=0;i<this.tests.length;i++) {
- assertions += this.tests[i].assertions;
- failures += this.tests[i].failures;
- errors += this.tests[i].errors;
- }
- return (
- (this.options.context ? this.options.context + ': ': '') +
- this.tests.length + " tests, " +
- assertions + " assertions, " +
- failures + " failures, " +
- errors + " errors");
- }
-}
-
-Test.Unit.Assertions = Class.create();
-Test.Unit.Assertions.prototype = {
- initialize: function() {
- this.assertions = 0;
- this.failures = 0;
- this.errors = 0;
- this.messages = [];
- },
- summary: function() {
- return (
- this.assertions + " assertions, " +
- this.failures + " failures, " +
- this.errors + " errors" + "\n" +
- this.messages.join("\n"));
- },
- pass: function() {
- this.assertions++;
- },
- fail: function(message) {
- this.failures++;
- this.messages.push("Failure: " + message);
- },
- info: function(message) {
- this.messages.push("Info: " + message);
- },
- error: function(error) {
- this.errors++;
- this.messages.push(error.name + ": "+ error.message + "(" + Test.Unit.inspect(error) +")");
- },
- status: function() {
- if (this.failures > 0) return 'failed';
- if (this.errors > 0) return 'error';
- return 'passed';
- },
- assert: function(expression) {
- var message = arguments[1] || 'assert: got "' + Test.Unit.inspect(expression) + '"';
- try { expression ? this.pass() :
- this.fail(message); }
- catch(e) { this.error(e); }
- },
- assertEqual: function(expected, actual) {
- var message = arguments[2] || "assertEqual";
- try { (expected == actual) ? this.pass() :
- this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
- '", actual "' + Test.Unit.inspect(actual) + '"'); }
- catch(e) { this.error(e); }
- },
- assertEnumEqual: function(expected, actual) {
- var message = arguments[2] || "assertEnumEqual";
- try { $A(expected).length == $A(actual).length &&
- expected.zip(actual).all(function(pair) { return pair[0] == pair[1] }) ?
- this.pass() : this.fail(message + ': expected ' + Test.Unit.inspect(expected) +
- ', actual ' + Test.Unit.inspect(actual)); }
- catch(e) { this.error(e); }
- },
- assertNotEqual: function(expected, actual) {
- var message = arguments[2] || "assertNotEqual";
- try { (expected != actual) ? this.pass() :
- this.fail(message + ': got "' + Test.Unit.inspect(actual) + '"'); }
- catch(e) { this.error(e); }
- },
- assertIdentical: function(expected, actual) {
- var message = arguments[2] || "assertIdentical";
- try { (expected === actual) ? this.pass() :
- this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
- '", actual "' + Test.Unit.inspect(actual) + '"'); }
- catch(e) { this.error(e); }
- },
- assertNotIdentical: function(expected, actual) {
- var message = arguments[2] || "assertNotIdentical";
- try { !(expected === actual) ? this.pass() :
- this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
- '", actual "' + Test.Unit.inspect(actual) + '"'); }
- catch(e) { this.error(e); }
- },
- assertNull: function(obj) {
- var message = arguments[1] || 'assertNull'
- try { (obj==null) ? this.pass() :
- this.fail(message + ': got "' + Test.Unit.inspect(obj) + '"'); }
- catch(e) { this.error(e); }
- },
- assertMatch: function(expected, actual) {
- var message = arguments[2] || 'assertMatch';
- var regex = new RegExp(expected);
- try { (regex.exec(actual)) ? this.pass() :
- this.fail(message + ' : regex: "' + Test.Unit.inspect(expected) + ' did not match: ' + Test.Unit.inspect(actual) + '"'); }
- catch(e) { this.error(e); }
- },
- assertHidden: function(element) {
- var message = arguments[1] || 'assertHidden';
- this.assertEqual("none", element.style.display, message);
- },
- assertNotNull: function(object) {
- var message = arguments[1] || 'assertNotNull';
- this.assert(object != null, message);
- },
- assertType: function(expected, actual) {
- var message = arguments[2] || 'assertType';
- try {
- (actual.constructor == expected) ? this.pass() :
- this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
- '", actual "' + (actual.constructor) + '"'); }
- catch(e) { this.error(e); }
- },
- assertNotOfType: function(expected, actual) {
- var message = arguments[2] || 'assertNotOfType';
- try {
- (actual.constructor != expected) ? this.pass() :
- this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
- '", actual "' + (actual.constructor) + '"'); }
- catch(e) { this.error(e); }
- },
- assertInstanceOf: function(expected, actual) {
- var message = arguments[2] || 'assertInstanceOf';
- try {
- (actual instanceof expected) ? this.pass() :
- this.fail(message + ": object was not an instance of the expected type"); }
- catch(e) { this.error(e); }
- },
- assertNotInstanceOf: function(expected, actual) {
- var message = arguments[2] || 'assertNotInstanceOf';
- try {
- !(actual instanceof expected) ? this.pass() :
- this.fail(message + ": object was an instance of the not expected type"); }
- catch(e) { this.error(e); }
- },
- assertRespondsTo: function(method, obj) {
- var message = arguments[2] || 'assertRespondsTo';
- try {
- (obj[method] && typeof obj[method] == 'function') ? this.pass() :
- this.fail(message + ": object doesn't respond to [" + method + "]"); }
- catch(e) { this.error(e); }
- },
- assertReturnsTrue: function(method, obj) {
- var message = arguments[2] || 'assertReturnsTrue';
- try {
- var m = obj[method];
- if(!m) m = obj['is'+method.charAt(0).toUpperCase()+method.slice(1)];
- m() ? this.pass() :
- this.fail(message + ": method returned false"); }
- catch(e) { this.error(e); }
- },
- assertReturnsFalse: function(method, obj) {
- var message = arguments[2] || 'assertReturnsFalse';
- try {
- var m = obj[method];
- if(!m) m = obj['is'+method.charAt(0).toUpperCase()+method.slice(1)];
- !m() ? this.pass() :
- this.fail(message + ": method returned true"); }
- catch(e) { this.error(e); }
- },
- assertRaise: function(exceptionName, method) {
- var message = arguments[2] || 'assertRaise';
- try {
- method();
- this.fail(message + ": exception expected but none was raised"); }
- catch(e) {
- (e.name==exceptionName) ? this.pass() : this.error(e);
- }
- },
- assertElementsMatch: function() {
- var expressions = $A(arguments), elements = $A(expressions.shift());
- if (elements.length != expressions.length) {
- this.fail('assertElementsMatch: size mismatch: ' + elements.length + ' elements, ' + expressions.length + ' expressions');
- return false;
- }
- elements.zip(expressions).all(function(pair, index) {
- var element = $(pair.first()), expression = pair.last();
- if (element.match(expression)) return true;
- this.fail('assertElementsMatch: (in index ' + index + ') expected ' + expression.inspect() + ' but got ' + element.inspect());
- }.bind(this)) && this.pass();
- },
- assertElementMatches: function(element, expression) {
- this.assertElementsMatch([element], expression);
- },
- benchmark: function(operation, iterations) {
- var startAt = new Date();
- (iterations || 1).times(operation);
- var timeTaken = ((new Date())-startAt);
- this.info((arguments[2] || 'Operation') + ' finished ' +
- iterations + ' iterations in ' + (timeTaken/1000)+'s' );
- return timeTaken;
- },
- _isVisible: function(element) {
- element = $(element);
- if(!element.parentNode) return true;
- this.assertNotNull(element);
- if(element.style && Element.getStyle(element, 'display') == 'none')
- return false;
-
- return this._isVisible(element.parentNode);
- },
- assertNotVisible: function(element) {
- this.assert(!this._isVisible(element), Test.Unit.inspect(element) + " was not hidden and didn't have a hidden parent either. " + ("" || arguments[1]));
- },
- assertVisible: function(element) {
- this.assert(this._isVisible(element), Test.Unit.inspect(element) + " was not visible. " + ("" || arguments[1]));
- },
- benchmark: function(operation, iterations) {
- var startAt = new Date();
- (iterations || 1).times(operation);
- var timeTaken = ((new Date())-startAt);
- this.info((arguments[2] || 'Operation') + ' finished ' +
- iterations + ' iterations in ' + (timeTaken/1000)+'s' );
- return timeTaken;
- }
-}
-
-Test.Unit.Testcase = Class.create();
-Object.extend(Object.extend(Test.Unit.Testcase.prototype, Test.Unit.Assertions.prototype), {
- initialize: function(name, test, setup, teardown) {
- Test.Unit.Assertions.prototype.initialize.bind(this)();
- this.name = name;
-
- if(typeof test == 'string') {
- test = test.gsub(/(\.should[^\(]+\()/,'#{0}this,');
- test = test.gsub(/(\.should[^\(]+)\(this,\)/,'#{1}(this)');
- this.test = function() {
- eval('with(this){'+test+'}');
- }
- } else {
- this.test = test || function() {};
- }
-
- this.setup = setup || function() {};
- this.teardown = teardown || function() {};
- this.isWaiting = false;
- this.timeToWait = 1000;
- },
- wait: function(time, nextPart) {
- this.isWaiting = true;
- this.test = nextPart;
- this.timeToWait = time;
- },
- run: function() {
- try {
- try {
- if (!this.isWaiting) this.setup.bind(this)();
- this.isWaiting = false;
- this.test.bind(this)();
- } finally {
- if(!this.isWaiting) {
- this.teardown.bind(this)();
- }
- }
- }
- catch(e) { this.error(e); }
- }
-});
-
-// *EXPERIMENTAL* BDD-style testing to please non-technical folk
-// This draws many ideas from RSpec http://rspec.rubyforge.org/
-
-Test.setupBDDExtensionMethods = function(){
- var METHODMAP = {
- shouldEqual: 'assertEqual',
- shouldNotEqual: 'assertNotEqual',
- shouldEqualEnum: 'assertEnumEqual',
- shouldBeA: 'assertType',
- shouldNotBeA: 'assertNotOfType',
- shouldBeAn: 'assertType',
- shouldNotBeAn: 'assertNotOfType',
- shouldBeNull: 'assertNull',
- shouldNotBeNull: 'assertNotNull',
-
- shouldBe: 'assertReturnsTrue',
- shouldNotBe: 'assertReturnsFalse',
- shouldRespondTo: 'assertRespondsTo'
- };
- Test.BDDMethods = {};
- for(m in METHODMAP) {
- Test.BDDMethods[m] = eval(
- 'function(){'+
- 'var args = $A(arguments);'+
- 'var scope = args.shift();'+
- 'scope.'+METHODMAP[m]+'.apply(scope,(args || []).concat([this])); }');
- }
- [Array.prototype, String.prototype, Number.prototype].each(
- function(p){ Object.extend(p, Test.BDDMethods) }
- );
-}
-
-Test.context = function(name, spec, log){
- Test.setupBDDExtensionMethods();
-
- var compiledSpec = {};
- var titles = {};
- for(specName in spec) {
- switch(specName){
- case "setup":
- case "teardown":
- compiledSpec[specName] = spec[specName];
- break;
- default:
- var testName = 'test'+specName.gsub(/\s+/,'-').camelize();
- var body = spec[specName].toString().split('\n').slice(1);
- if(/^\{/.test(body[0])) body = body.slice(1);
- body.pop();
- body = body.map(function(statement){
- return statement.strip()
- });
- compiledSpec[testName] = body.join('\n');
- titles[testName] = specName;
- }
- }
- new Test.Unit.Runner(compiledSpec, { titles: titles, testLog: log || 'testlog', context: name });
+// script.aculo.us unittest.js v1.6.4, Wed Sep 06 11:30:58 CEST 2006\r
+\r
+// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)\r
+// (c) 2005 Jon Tirsen (http://www.tirsen.com)\r
+// (c) 2005 Michael Schuerig (http://www.schuerig.de/michael/)\r
+//\r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+// \r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+\r
+// experimental, Firefox-only\r
+Event.simulateMouse = function(element, eventName) {\r
+ var options = Object.extend({\r
+ pointerX: 0,\r
+ pointerY: 0,\r
+ buttons: 0\r
+ }, arguments[2] || {});\r
+ var oEvent = document.createEvent("MouseEvents");\r
+ oEvent.initMouseEvent(eventName, true, true, document.defaultView, \r
+ options.buttons, options.pointerX, options.pointerY, options.pointerX, options.pointerY, \r
+ false, false, false, false, 0, $(element));\r
+ \r
+ if(this.mark) Element.remove(this.mark);\r
+ this.mark = document.createElement('div');\r
+ this.mark.appendChild(document.createTextNode(" "));\r
+ document.body.appendChild(this.mark);\r
+ this.mark.style.position = 'absolute';\r
+ this.mark.style.top = options.pointerY + "px";\r
+ this.mark.style.left = options.pointerX + "px";\r
+ this.mark.style.width = "5px";\r
+ this.mark.style.height = "5px;";\r
+ this.mark.style.borderTop = "1px solid red;"\r
+ this.mark.style.borderLeft = "1px solid red;"\r
+ \r
+ if(this.step)\r
+ alert('['+new Date().getTime().toString()+'] '+eventName+'/'+Test.Unit.inspect(options));\r
+ \r
+ $(element).dispatchEvent(oEvent);\r
+};\r
+\r
+// Note: Due to a fix in Firefox 1.0.5/6 that probably fixed "too much", this doesn't work in 1.0.6 or DP2.\r
+// You need to downgrade to 1.0.4 for now to get this working\r
+// See https://bugzilla.mozilla.org/show_bug.cgi?id=289940 for the fix that fixed too much\r
+Event.simulateKey = function(element, eventName) {\r
+ var options = Object.extend({\r
+ ctrlKey: false,\r
+ altKey: false,\r
+ shiftKey: false,\r
+ metaKey: false,\r
+ keyCode: 0,\r
+ charCode: 0\r
+ }, arguments[2] || {});\r
+\r
+ var oEvent = document.createEvent("KeyEvents");\r
+ oEvent.initKeyEvent(eventName, true, true, window, \r
+ options.ctrlKey, options.altKey, options.shiftKey, options.metaKey,\r
+ options.keyCode, options.charCode );\r
+ $(element).dispatchEvent(oEvent);\r
+};\r
+\r
+Event.simulateKeys = function(element, command) {\r
+ for(var i=0; i<command.length; i++) {\r
+ Event.simulateKey(element,'keypress',{charCode:command.charCodeAt(i)});\r
+ }\r
+};\r
+\r
+var Test = {}\r
+Test.Unit = {};\r
+\r
+// security exception workaround\r
+Test.Unit.inspect = Object.inspect;\r
+\r
+Test.Unit.Logger = Class.create();\r
+Test.Unit.Logger.prototype = {\r
+ initialize: function(log) {\r
+ this.log = $(log);\r
+ if (this.log) {\r
+ this._createLogTable();\r
+ }\r
+ },\r
+ start: function(testName) {\r
+ if (!this.log) return;\r
+ this.testName = testName;\r
+ this.lastLogLine = document.createElement('tr');\r
+ this.statusCell = document.createElement('td');\r
+ this.nameCell = document.createElement('td');\r
+ this.nameCell.appendChild(document.createTextNode(testName));\r
+ this.messageCell = document.createElement('td');\r
+ this.lastLogLine.appendChild(this.statusCell);\r
+ this.lastLogLine.appendChild(this.nameCell);\r
+ this.lastLogLine.appendChild(this.messageCell);\r
+ this.loglines.appendChild(this.lastLogLine);\r
+ },\r
+ finish: function(status, summary) {\r
+ if (!this.log) return;\r
+ this.lastLogLine.className = status;\r
+ this.statusCell.innerHTML = status;\r
+ this.messageCell.innerHTML = this._toHTML(summary);\r
+ },\r
+ message: function(message) {\r
+ if (!this.log) return;\r
+ this.messageCell.innerHTML = this._toHTML(message);\r
+ },\r
+ summary: function(summary) {\r
+ if (!this.log) return;\r
+ this.logsummary.innerHTML = this._toHTML(summary);\r
+ },\r
+ _createLogTable: function() {\r
+ this.log.innerHTML =\r
+ '<div id="logsummary"></div>' +\r
+ '<table id="logtable">' +\r
+ '<thead><tr><th>Status</th><th>Test</th><th>Message</th></tr></thead>' +\r
+ '<tbody id="loglines"></tbody>' +\r
+ '</table>';\r
+ this.logsummary = $('logsummary')\r
+ this.loglines = $('loglines');\r
+ },\r
+ _toHTML: function(txt) {\r
+ return txt.escapeHTML().replace(/\n/g,"<br/>");\r
+ }\r
+}\r
+\r
+Test.Unit.Runner = Class.create();\r
+Test.Unit.Runner.prototype = {\r
+ initialize: function(testcases) {\r
+ this.options = Object.extend({\r
+ testLog: 'testlog'\r
+ }, arguments[1] || {});\r
+ this.options.resultsURL = this.parseResultsURLQueryParameter();\r
+ if (this.options.testLog) {\r
+ this.options.testLog = $(this.options.testLog) || null;\r
+ }\r
+ if(this.options.tests) {\r
+ this.tests = [];\r
+ for(var i = 0; i < this.options.tests.length; i++) {\r
+ if(/^test/.test(this.options.tests[i])) {\r
+ this.tests.push(new Test.Unit.Testcase(this.options.tests[i], testcases[this.options.tests[i]], testcases["setup"], testcases["teardown"]));\r
+ }\r
+ }\r
+ } else {\r
+ if (this.options.test) {\r
+ this.tests = [new Test.Unit.Testcase(this.options.test, testcases[this.options.test], testcases["setup"], testcases["teardown"])];\r
+ } else {\r
+ this.tests = [];\r
+ for(var testcase in testcases) {\r
+ if(/^test/.test(testcase)) {\r
+ this.tests.push(\r
+ new Test.Unit.Testcase(\r
+ this.options.context ? ' -> ' + this.options.titles[testcase] : testcase, \r
+ testcases[testcase], testcases["setup"], testcases["teardown"]\r
+ ));\r
+ }\r
+ }\r
+ }\r
+ }\r
+ this.currentTest = 0;\r
+ this.logger = new Test.Unit.Logger(this.options.testLog);\r
+ setTimeout(this.runTests.bind(this), 1000);\r
+ },\r
+ parseResultsURLQueryParameter: function() {\r
+ return window.location.search.parseQuery()["resultsURL"];\r
+ },\r
+ // Returns:\r
+ // "ERROR" if there was an error,\r
+ // "FAILURE" if there was a failure, or\r
+ // "SUCCESS" if there was neither\r
+ getResult: function() {\r
+ var hasFailure = false;\r
+ for(var i=0;i<this.tests.length;i++) {\r
+ if (this.tests[i].errors > 0) {\r
+ return "ERROR";\r
+ }\r
+ if (this.tests[i].failures > 0) {\r
+ hasFailure = true;\r
+ }\r
+ }\r
+ if (hasFailure) {\r
+ return "FAILURE";\r
+ } else {\r
+ return "SUCCESS";\r
+ }\r
+ },\r
+ postResults: function() {\r
+ if (this.options.resultsURL) {\r
+ new Ajax.Request(this.options.resultsURL, \r
+ { method: 'get', parameters: 'result=' + this.getResult(), asynchronous: false });\r
+ }\r
+ },\r
+ runTests: function() {\r
+ var test = this.tests[this.currentTest];\r
+ if (!test) {\r
+ // finished!\r
+ this.postResults();\r
+ this.logger.summary(this.summary());\r
+ return;\r
+ }\r
+ if(!test.isWaiting) {\r
+ this.logger.start(test.name);\r
+ }\r
+ test.run();\r
+ if(test.isWaiting) {\r
+ this.logger.message("Waiting for " + test.timeToWait + "ms");\r
+ setTimeout(this.runTests.bind(this), test.timeToWait || 1000);\r
+ } else {\r
+ this.logger.finish(test.status(), test.summary());\r
+ this.currentTest++;\r
+ // tail recursive, hopefully the browser will skip the stackframe\r
+ this.runTests();\r
+ }\r
+ },\r
+ summary: function() {\r
+ var assertions = 0;\r
+ var failures = 0;\r
+ var errors = 0;\r
+ var messages = [];\r
+ for(var i=0;i<this.tests.length;i++) {\r
+ assertions += this.tests[i].assertions;\r
+ failures += this.tests[i].failures;\r
+ errors += this.tests[i].errors;\r
+ }\r
+ return (\r
+ (this.options.context ? this.options.context + ': ': '') + \r
+ this.tests.length + " tests, " + \r
+ assertions + " assertions, " + \r
+ failures + " failures, " +\r
+ errors + " errors");\r
+ }\r
+}\r
+\r
+Test.Unit.Assertions = Class.create();\r
+Test.Unit.Assertions.prototype = {\r
+ initialize: function() {\r
+ this.assertions = 0;\r
+ this.failures = 0;\r
+ this.errors = 0;\r
+ this.messages = [];\r
+ },\r
+ summary: function() {\r
+ return (\r
+ this.assertions + " assertions, " + \r
+ this.failures + " failures, " +\r
+ this.errors + " errors" + "\n" +\r
+ this.messages.join("\n"));\r
+ },\r
+ pass: function() {\r
+ this.assertions++;\r
+ },\r
+ fail: function(message) {\r
+ this.failures++;\r
+ this.messages.push("Failure: " + message);\r
+ },\r
+ info: function(message) {\r
+ this.messages.push("Info: " + message);\r
+ },\r
+ error: function(error) {\r
+ this.errors++;\r
+ this.messages.push(error.name + ": "+ error.message + "(" + Test.Unit.inspect(error) +")");\r
+ },\r
+ status: function() {\r
+ if (this.failures > 0) return 'failed';\r
+ if (this.errors > 0) return 'error';\r
+ return 'passed';\r
+ },\r
+ assert: function(expression) {\r
+ var message = arguments[1] || 'assert: got "' + Test.Unit.inspect(expression) + '"';\r
+ try { expression ? this.pass() : \r
+ this.fail(message); }\r
+ catch(e) { this.error(e); }\r
+ },\r
+ assertEqual: function(expected, actual) {\r
+ var message = arguments[2] || "assertEqual";\r
+ try { (expected == actual) ? this.pass() :\r
+ this.fail(message + ': expected "' + Test.Unit.inspect(expected) + \r
+ '", actual "' + Test.Unit.inspect(actual) + '"'); }\r
+ catch(e) { this.error(e); }\r
+ },\r
+ assertEnumEqual: function(expected, actual) {\r
+ var message = arguments[2] || "assertEnumEqual";\r
+ try { $A(expected).length == $A(actual).length && \r
+ expected.zip(actual).all(function(pair) { return pair[0] == pair[1] }) ?\r
+ this.pass() : this.fail(message + ': expected ' + Test.Unit.inspect(expected) + \r
+ ', actual ' + Test.Unit.inspect(actual)); }\r
+ catch(e) { this.error(e); }\r
+ },\r
+ assertNotEqual: function(expected, actual) {\r
+ var message = arguments[2] || "assertNotEqual";\r
+ try { (expected != actual) ? this.pass() : \r
+ this.fail(message + ': got "' + Test.Unit.inspect(actual) + '"'); }\r
+ catch(e) { this.error(e); }\r
+ },\r
+ assertIdentical: function(expected, actual) { \r
+ var message = arguments[2] || "assertIdentical"; \r
+ try { (expected === actual) ? this.pass() : \r
+ this.fail(message + ': expected "' + Test.Unit.inspect(expected) + \r
+ '", actual "' + Test.Unit.inspect(actual) + '"'); } \r
+ catch(e) { this.error(e); } \r
+ },\r
+ assertNotIdentical: function(expected, actual) { \r
+ var message = arguments[2] || "assertNotIdentical"; \r
+ try { !(expected === actual) ? this.pass() : \r
+ this.fail(message + ': expected "' + Test.Unit.inspect(expected) + \r
+ '", actual "' + Test.Unit.inspect(actual) + '"'); } \r
+ catch(e) { this.error(e); } \r
+ },\r
+ assertNull: function(obj) {\r
+ var message = arguments[1] || 'assertNull'\r
+ try { (obj==null) ? this.pass() : \r
+ this.fail(message + ': got "' + Test.Unit.inspect(obj) + '"'); }\r
+ catch(e) { this.error(e); }\r
+ },\r
+ assertMatch: function(expected, actual) {\r
+ var message = arguments[2] || 'assertMatch';\r
+ var regex = new RegExp(expected);\r
+ try { (regex.exec(actual)) ? this.pass() :\r
+ this.fail(message + ' : regex: "' + Test.Unit.inspect(expected) + ' did not match: ' + Test.Unit.inspect(actual) + '"'); }\r
+ catch(e) { this.error(e); }\r
+ },\r
+ assertHidden: function(element) {\r
+ var message = arguments[1] || 'assertHidden';\r
+ this.assertEqual("none", element.style.display, message);\r
+ },\r
+ assertNotNull: function(object) {\r
+ var message = arguments[1] || 'assertNotNull';\r
+ this.assert(object != null, message);\r
+ },\r
+ assertType: function(expected, actual) {\r
+ var message = arguments[2] || 'assertType';\r
+ try { \r
+ (actual.constructor == expected) ? this.pass() : \r
+ this.fail(message + ': expected "' + Test.Unit.inspect(expected) + \r
+ '", actual "' + (actual.constructor) + '"'); }\r
+ catch(e) { this.error(e); }\r
+ },\r
+ assertNotOfType: function(expected, actual) {\r
+ var message = arguments[2] || 'assertNotOfType';\r
+ try { \r
+ (actual.constructor != expected) ? this.pass() : \r
+ this.fail(message + ': expected "' + Test.Unit.inspect(expected) + \r
+ '", actual "' + (actual.constructor) + '"'); }\r
+ catch(e) { this.error(e); }\r
+ },\r
+ assertInstanceOf: function(expected, actual) {\r
+ var message = arguments[2] || 'assertInstanceOf';\r
+ try { \r
+ (actual instanceof expected) ? this.pass() : \r
+ this.fail(message + ": object was not an instance of the expected type"); }\r
+ catch(e) { this.error(e); } \r
+ },\r
+ assertNotInstanceOf: function(expected, actual) {\r
+ var message = arguments[2] || 'assertNotInstanceOf';\r
+ try { \r
+ !(actual instanceof expected) ? this.pass() : \r
+ this.fail(message + ": object was an instance of the not expected type"); }\r
+ catch(e) { this.error(e); } \r
+ },\r
+ assertRespondsTo: function(method, obj) {\r
+ var message = arguments[2] || 'assertRespondsTo';\r
+ try {\r
+ (obj[method] && typeof obj[method] == 'function') ? this.pass() : \r
+ this.fail(message + ": object doesn't respond to [" + method + "]"); }\r
+ catch(e) { this.error(e); }\r
+ },\r
+ assertReturnsTrue: function(method, obj) {\r
+ var message = arguments[2] || 'assertReturnsTrue';\r
+ try {\r
+ var m = obj[method];\r
+ if(!m) m = obj['is'+method.charAt(0).toUpperCase()+method.slice(1)];\r
+ m() ? this.pass() : \r
+ this.fail(message + ": method returned false"); }\r
+ catch(e) { this.error(e); }\r
+ },\r
+ assertReturnsFalse: function(method, obj) {\r
+ var message = arguments[2] || 'assertReturnsFalse';\r
+ try {\r
+ var m = obj[method];\r
+ if(!m) m = obj['is'+method.charAt(0).toUpperCase()+method.slice(1)];\r
+ !m() ? this.pass() : \r
+ this.fail(message + ": method returned true"); }\r
+ catch(e) { this.error(e); }\r
+ },\r
+ assertRaise: function(exceptionName, method) {\r
+ var message = arguments[2] || 'assertRaise';\r
+ try { \r
+ method();\r
+ this.fail(message + ": exception expected but none was raised"); }\r
+ catch(e) {\r
+ (e.name==exceptionName) ? this.pass() : this.error(e); \r
+ }\r
+ },\r
+ assertElementsMatch: function() {\r
+ var expressions = $A(arguments), elements = $A(expressions.shift());\r
+ if (elements.length != expressions.length) {\r
+ this.fail('assertElementsMatch: size mismatch: ' + elements.length + ' elements, ' + expressions.length + ' expressions');\r
+ return false;\r
+ }\r
+ elements.zip(expressions).all(function(pair, index) {\r
+ var element = $(pair.first()), expression = pair.last();\r
+ if (element.match(expression)) return true;\r
+ this.fail('assertElementsMatch: (in index ' + index + ') expected ' + expression.inspect() + ' but got ' + element.inspect());\r
+ }.bind(this)) && this.pass();\r
+ },\r
+ assertElementMatches: function(element, expression) {\r
+ this.assertElementsMatch([element], expression);\r
+ },\r
+ benchmark: function(operation, iterations) {\r
+ var startAt = new Date();\r
+ (iterations || 1).times(operation);\r
+ var timeTaken = ((new Date())-startAt);\r
+ this.info((arguments[2] || 'Operation') + ' finished ' + \r
+ iterations + ' iterations in ' + (timeTaken/1000)+'s' );\r
+ return timeTaken;\r
+ },\r
+ _isVisible: function(element) {\r
+ element = $(element);\r
+ if(!element.parentNode) return true;\r
+ this.assertNotNull(element);\r
+ if(element.style && Element.getStyle(element, 'display') == 'none')\r
+ return false;\r
+ \r
+ return this._isVisible(element.parentNode);\r
+ },\r
+ assertNotVisible: function(element) {\r
+ this.assert(!this._isVisible(element), Test.Unit.inspect(element) + " was not hidden and didn't have a hidden parent either. " + ("" || arguments[1]));\r
+ },\r
+ assertVisible: function(element) {\r
+ this.assert(this._isVisible(element), Test.Unit.inspect(element) + " was not visible. " + ("" || arguments[1]));\r
+ },\r
+ benchmark: function(operation, iterations) {\r
+ var startAt = new Date();\r
+ (iterations || 1).times(operation);\r
+ var timeTaken = ((new Date())-startAt);\r
+ this.info((arguments[2] || 'Operation') + ' finished ' + \r
+ iterations + ' iterations in ' + (timeTaken/1000)+'s' );\r
+ return timeTaken;\r
+ }\r
+}\r
+\r
+Test.Unit.Testcase = Class.create();\r
+Object.extend(Object.extend(Test.Unit.Testcase.prototype, Test.Unit.Assertions.prototype), {\r
+ initialize: function(name, test, setup, teardown) {\r
+ Test.Unit.Assertions.prototype.initialize.bind(this)();\r
+ this.name = name;\r
+ \r
+ if(typeof test == 'string') {\r
+ test = test.gsub(/(\.should[^\(]+\()/,'#{0}this,');\r
+ test = test.gsub(/(\.should[^\(]+)\(this,\)/,'#{1}(this)');\r
+ this.test = function() {\r
+ eval('with(this){'+test+'}');\r
+ }\r
+ } else {\r
+ this.test = test || function() {};\r
+ }\r
+ \r
+ this.setup = setup || function() {};\r
+ this.teardown = teardown || function() {};\r
+ this.isWaiting = false;\r
+ this.timeToWait = 1000;\r
+ },\r
+ wait: function(time, nextPart) {\r
+ this.isWaiting = true;\r
+ this.test = nextPart;\r
+ this.timeToWait = time;\r
+ },\r
+ run: function() {\r
+ try {\r
+ try {\r
+ if (!this.isWaiting) this.setup.bind(this)();\r
+ this.isWaiting = false;\r
+ this.test.bind(this)();\r
+ } finally {\r
+ if(!this.isWaiting) {\r
+ this.teardown.bind(this)();\r
+ }\r
+ }\r
+ }\r
+ catch(e) { this.error(e); }\r
+ }\r
+});\r
+\r
+// *EXPERIMENTAL* BDD-style testing to please non-technical folk\r
+// This draws many ideas from RSpec http://rspec.rubyforge.org/\r
+\r
+Test.setupBDDExtensionMethods = function(){\r
+ var METHODMAP = {\r
+ shouldEqual: 'assertEqual',\r
+ shouldNotEqual: 'assertNotEqual',\r
+ shouldEqualEnum: 'assertEnumEqual',\r
+ shouldBeA: 'assertType',\r
+ shouldNotBeA: 'assertNotOfType',\r
+ shouldBeAn: 'assertType',\r
+ shouldNotBeAn: 'assertNotOfType',\r
+ shouldBeNull: 'assertNull',\r
+ shouldNotBeNull: 'assertNotNull',\r
+ \r
+ shouldBe: 'assertReturnsTrue',\r
+ shouldNotBe: 'assertReturnsFalse',\r
+ shouldRespondTo: 'assertRespondsTo'\r
+ };\r
+ Test.BDDMethods = {};\r
+ for(m in METHODMAP) {\r
+ Test.BDDMethods[m] = eval(\r
+ 'function(){'+\r
+ 'var args = $A(arguments);'+\r
+ 'var scope = args.shift();'+\r
+ 'scope.'+METHODMAP[m]+'.apply(scope,(args || []).concat([this])); }');\r
+ }\r
+ [Array.prototype, String.prototype, Number.prototype].each(\r
+ function(p){ Object.extend(p, Test.BDDMethods) }\r
+ );\r
+}\r
+\r
+Test.context = function(name, spec, log){\r
+ Test.setupBDDExtensionMethods();\r
+ \r
+ var compiledSpec = {};\r
+ var titles = {};\r
+ for(specName in spec) {\r
+ switch(specName){\r
+ case "setup":\r
+ case "teardown":\r
+ compiledSpec[specName] = spec[specName];\r
+ break;\r
+ default:\r
+ var testName = 'test'+specName.gsub(/\s+/,'-').camelize();\r
+ var body = spec[specName].toString().split('\n').slice(1);\r
+ if(/^\{/.test(body[0])) body = body.slice(1);\r
+ body.pop();\r
+ body = body.map(function(statement){ \r
+ return statement.strip()\r
+ });\r
+ compiledSpec[testName] = body.join('\n');\r
+ titles[testName] = specName;\r
+ }\r
+ }\r
+ new Test.Unit.Runner(compiledSpec, { titles: titles, testLog: log || 'testlog', context: name });\r
};
\ No newline at end of file
-.accordion{
- border-bottom: 1px solid #999999;
-}
-.accordion_panel{
- border-left: 1px solid #999999;
- border-right: 1px solid #999999;
- overflow: auto;
- visibility: visible;
-}
-
-.accordion_tab {
- position: relative;
- height: 26px;
- cursor: pointer;
-}
-
-.accordion_tab div{
- height: 26px;
-}
-
-.accordion_tabLeftInactive {
- background: url('../../images/spinelz/accordion_tab_left_inactive.gif') no-repeat;
- position: absolute;
- left: 0;
- width: 10px;
-}
-
-.accordion_tabLeftActive {
- background: url('../../images/spinelz/accordion_tab_left_active.gif') no-repeat;
- position: absolute;
- left: 0;
- width: 10px;
-}
-
-.accordion_tabMiddleInactive {
- background: url('../../images/spinelz/accordion_tab_middle_inactive.gif') repeat-x;
- margin: 0 10px;
-}
-
-.accordion_tabMiddleActive {
- background: url('../../images/spinelz/accordion_tab_middle_active.gif') repeat-x;
- margin: 0 10px;
-}
-
-.accordion_tabRightInactive {
- background: url('../../images/spinelz/accordion_tab_right_inactive.gif') no-repeat;
- position: absolute;
- top: 0;
- right: 0;
- width: 10px;
-}
-
-.accordion_tabRightActive {
- background: url('../../images/spinelz/accordion_tab_right_active.gif') no-repeat;
- position: absolute;
- top: 0;
- right: 0;
- width: 10px;
-}
+.accordion{\r
+ border-bottom: 1px solid #999999;\r
+}\r
+.accordion_panel{\r
+ border-left: 1px solid #999999;\r
+ border-right: 1px solid #999999;\r
+ overflow: auto;\r
+ visibility: visible;\r
+}\r
+\r
+.accordion_tab {\r
+ position: relative;\r
+ height: 26px;\r
+ cursor: pointer;\r
+} \r
+\r
+.accordion_tab div{\r
+ height: 26px;\r
+}\r
+\r
+.accordion_tabLeftInactive {\r
+ background: url('../../images/spinelz/accordion_tab_left_inactive.gif') no-repeat;\r
+ position: absolute;\r
+ left: 0;\r
+ width: 10px;\r
+}\r
+\r
+.accordion_tabLeftActive {\r
+ background: url('../../images/spinelz/accordion_tab_left_active.gif') no-repeat;\r
+ position: absolute;\r
+ left: 0;\r
+ width: 10px;\r
+}\r
+\r
+.accordion_tabMiddleInactive {\r
+ background: url('../../images/spinelz/accordion_tab_middle_inactive.gif') repeat-x;\r
+ margin: 0 10px;\r
+}\r
+\r
+.accordion_tabMiddleActive {\r
+ background: url('../../images/spinelz/accordion_tab_middle_active.gif') repeat-x;\r
+ margin: 0 10px;\r
+}\r
+\r
+.accordion_tabRightInactive {\r
+ background: url('../../images/spinelz/accordion_tab_right_inactive.gif') no-repeat;\r
+ position: absolute;\r
+ top: 0;\r
+ right: 0;\r
+ width: 10px;\r
+}\r
+\r
+.accordion_tabRightActive {\r
+ background: url('../../images/spinelz/accordion_tab_right_active.gif') no-repeat;\r
+ position: absolute;\r
+ top: 0;\r
+ right: 0;\r
+ width: 10px;\r
+}\r
-div.balloon_tooltip {
- position: absolute;
-}
-
-/* ---- Top ---- */
-div.balloon_top {
- width: 100%;
- height: 30px;
- position: relative;
-}
-
-div.balloon_top_left {
- position: absolute;
- top: 0;
- left: 0;
- width: 70px;
- height: 30px;
- background-image: url(../../images/spinelz/balloon_top_left.gif);
- background-repeat: no-repeat;
-}
-
-div.balloon_top_middle {
- height: 30px;
- background-image: url(../../images/spinelz/balloon_top_middle.gif);
- background-repeat: repeat-x;
- margin: 0 70px;
-}
-
-div.balloon_top_right {
- width: 70px;
- height: 30px;
- background-image: url(../../images/spinelz/balloon_top_right.gif);
- background-repeat: no-repeat;
- position: absolute;
- top: 0;
- right: 0;
-}
-
-/* ---- Middle ---- */
-div.balloon_middle {
- width: 100%;
- position: relative;
-}
-
-div.balloon_middle_left {
- position: absolute;
- top: 0;
- left: 0;
- width: 70px;
-}
-
-div.balloon_middle_left_row {
- width: 70px;
- height: 20px;
- background-image: url(../../images/spinelz/balloon_middle_left.gif);
- background-repeat: repeat-y;
-}
-
-div.balloon_middle_right {
- position: absolute;
- top: 0;
- right: 0;
- width: 70px;
-}
-
-div.balloon_middle_right_row {
- width: 70px;
- height: 20px;
- background-image: url(../../images/spinelz/balloon_middle_right.gif);
- background-repeat: repeat-y;
-}
-
-div.balloon_left_arrow {
- width: 70px;
- height: 60px;
-}
-
-div.balloon_left_up_arrow {
- width: 70px;
- height: 60px;
- background-image: url(../../images/spinelz/balloon_left_up_arrow.gif);
- background-repeat: no-repeat;
-}
-
-div.balloon_left_down_arrow {
- width: 70px;
- height: 60px;
- background-image: url(../../images/spinelz/balloon_left_down_arrow.gif);
- background-repeat: no-repeat;
-}
-
-div.balloon_right_arrow {
- width: 70px;
- height: 60px;
-}
-
-div.balloon_right_up_arrow {
- width: 70px;
- height: 60px;
- background-image: url(../../images/spinelz/balloon_right_up_arrow.gif);
- background-repeat: no-repeat;
-}
-
-div.balloon_right_down_arrow {
- width: 70px;
- height: 60px;
- background-image: url(../../images/spinelz/balloon_right_down_arrow.gif);
- background-repeat: no-repeat;
-}
-
-div.balloon_body {
- margin: 0 70px;
- background-image: url(../../images/spinelz/balloon_back.gif);
- background-repeat: no-repeat;
- background-color: #f8ffee;
- overflow: hidden;
-}
-
-/* ---- Bottom ---- */
-div.balloon_bottom {
- width: 100%;
- height: 30px;
- position: relative;
-}
-
-div.balloon_bottom_left {
- position: absolute;
- top: 0;
- left: 0;
- width: 70px;
- height: 30px;
- background-image: url(../../images/spinelz/balloon_bottom_left.gif);
- background-repeat: no-repeat;
-}
-
-div.balloon_bottom_middle {
- height: 30px;
- background-image: url(../../images/spinelz/balloon_bottom_middle.gif);
- background-repeat: repeat-x;
- margin: 0 70px;
-}
-
-div.balloon_bottom_right {
- width: 70px;
- height: 30px;
- background-image: url(../../images/spinelz/balloon_bottom_right.gif);
- background-repeat: no-repeat;
- position: absolute;
- top: 0;
- right: 0;
-}
+div.balloon_tooltip {\r
+ position: absolute;\r
+}\r
+\r
+/* ---- Top ---- */\r
+div.balloon_top {\r
+ width: 100%;\r
+ height: 30px;\r
+ position: relative;\r
+}\r
+\r
+div.balloon_top_left {\r
+ position: absolute;\r
+ top: 0;\r
+ left: 0;\r
+ width: 70px;\r
+ height: 30px;\r
+ background-image: url(../../images/spinelz/balloon_top_left.gif);\r
+ background-repeat: no-repeat;\r
+}\r
+\r
+div.balloon_top_middle {\r
+ height: 30px;\r
+ background-image: url(../../images/spinelz/balloon_top_middle.gif);\r
+ background-repeat: repeat-x;\r
+ margin: 0 70px;\r
+}\r
+\r
+div.balloon_top_right {\r
+ width: 70px;\r
+ height: 30px;\r
+ background-image: url(../../images/spinelz/balloon_top_right.gif);\r
+ background-repeat: no-repeat;\r
+ position: absolute;\r
+ top: 0;\r
+ right: 0;\r
+}\r
+\r
+/* ---- Middle ---- */\r
+div.balloon_middle {\r
+ width: 100%;\r
+ position: relative;\r
+}\r
+\r
+div.balloon_middle_left {\r
+ position: absolute;\r
+ top: 0;\r
+ left: 0;\r
+ width: 70px;\r
+}\r
+\r
+div.balloon_middle_left_row {\r
+ width: 70px;\r
+ height: 20px;\r
+ background-image: url(../../images/spinelz/balloon_middle_left.gif);\r
+ background-repeat: repeat-y;\r
+}\r
+\r
+div.balloon_middle_right {\r
+ position: absolute;\r
+ top: 0;\r
+ right: 0;\r
+ width: 70px;\r
+}\r
+\r
+div.balloon_middle_right_row {\r
+ width: 70px;\r
+ height: 20px;\r
+ background-image: url(../../images/spinelz/balloon_middle_right.gif);\r
+ background-repeat: repeat-y;\r
+}\r
+\r
+div.balloon_left_arrow {\r
+ width: 70px;\r
+ height: 60px;\r
+}\r
+\r
+div.balloon_left_up_arrow {\r
+ width: 70px;\r
+ height: 60px;\r
+ background-image: url(../../images/spinelz/balloon_left_up_arrow.gif);\r
+ background-repeat: no-repeat;\r
+}\r
+\r
+div.balloon_left_down_arrow {\r
+ width: 70px;\r
+ height: 60px;\r
+ background-image: url(../../images/spinelz/balloon_left_down_arrow.gif);\r
+ background-repeat: no-repeat;\r
+}\r
+\r
+div.balloon_right_arrow {\r
+ width: 70px;\r
+ height: 60px;\r
+}\r
+\r
+div.balloon_right_up_arrow {\r
+ width: 70px;\r
+ height: 60px;\r
+ background-image: url(../../images/spinelz/balloon_right_up_arrow.gif);\r
+ background-repeat: no-repeat;\r
+}\r
+\r
+div.balloon_right_down_arrow {\r
+ width: 70px;\r
+ height: 60px;\r
+ background-image: url(../../images/spinelz/balloon_right_down_arrow.gif);\r
+ background-repeat: no-repeat;\r
+}\r
+\r
+div.balloon_body {\r
+ margin: 0 70px;\r
+ background-image: url(../../images/spinelz/balloon_back.gif);\r
+ background-repeat: no-repeat;\r
+ background-color: #f8ffee;\r
+ overflow: hidden;\r
+}\r
+\r
+/* ---- Bottom ---- */\r
+div.balloon_bottom {\r
+ width: 100%;\r
+ height: 30px;\r
+ position: relative;\r
+}\r
+\r
+div.balloon_bottom_left {\r
+ position: absolute;\r
+ top: 0;\r
+ left: 0;\r
+ width: 70px;\r
+ height: 30px;\r
+ background-image: url(../../images/spinelz/balloon_bottom_left.gif);\r
+ background-repeat: no-repeat;\r
+}\r
+\r
+div.balloon_bottom_middle {\r
+ height: 30px;\r
+ background-image: url(../../images/spinelz/balloon_bottom_middle.gif);\r
+ background-repeat: repeat-x;\r
+ margin: 0 70px;\r
+}\r
+\r
+div.balloon_bottom_right {\r
+ width: 70px;\r
+ height: 30px;\r
+ background-image: url(../../images/spinelz/balloon_bottom_right.gif);\r
+ background-repeat: no-repeat;\r
+ position: absolute;\r
+ top: 0;\r
+ right: 0;\r
+}\r
-.calendar {
- margin: 0;
- padding: 0;
- text-decoration: none;
- text-transform: none;
- text-indent: 0;
- font-weight: normal;
- font-size: 13px;
- font-family: Verdana, monospace;
- width: 100%;
- background: #ffffff;
- color: #4F4534;
- border: 1px solid #999999;
-}
-
-/* header */
-.calendar_scheduleHandler {
- background: url('../../images/spinelz/calendar_default_handler.gif') no-repeat;
- width: 16px;
- height: 16px;
- cursor: move;
- float: left;
-}
-
-.calendar_header {
- background: url(../../images/spinelz/calender_back.gif) repeat-x;
- color: #4F4534;
- width: 100%;
- height: 26px;
- border-bottom: 1px solid #999999;
- border-collapse: collapse;
- font-size: 13px;
- font-weight: bold;
-}
-
-.calendar_preYears {
- text-align: left;
- width: 35px;
-}
-
-.calendar_years {
- text-align: center;
-}
-
-.calendar_years span {
- font-weight: bolder;
- font-size: 105%;
-}
-
-.calendar_nextYears {
- text-align: right;
- width: 35px;
-}
-
-.calendar_nextMonthMark {
- background: url('../../images/spinelz/calendar_next.gif') no-repeat;
- width: 16px;
- height: 16px;
- cursor: pointer;
- float: left;
-}
-
-.calendar_nextYearMark {
- background: url('../../images/spinelz/calendar_next_second.gif') no-repeat;;
- width: 16px;
- height: 16px;
- cursor: pointer;
- margin-left: 16px;
-}
-
-.calendar_nextWeekMark {
- background: url('../../images/spinelz/calendar_next.gif') no-repeat;;
- width: 16px;
- height: 16px;
- cursor: pointer;
- margin: 0 0 0 auto;
-}
-
-.calendar_preMonthMark {
- background: url('../../images/spinelz/calendar_pre.gif') no-repeat;;
- width: 16px;
- height: 16px;
- cursor: pointer;
- margin-left: 16px;
-}
-
-.calendar_preYearMark {
- background: url('../../images/spinelz/calendar_pre_second.gif') no-repeat;;
- width: 16px;
- height: 16px;
- cursor: pointer;
- float: left;
-}
-
-.calendar_preWeekMark {
- background: url('../../images/spinelz/calendar_pre.gif') no-repeat;;
- width: 16px;
- height: 16px;
- cursor: pointer;
-}
-
-.calendar_markHover {
- margin-left: 5px;
- margin-right: 5px;
- cursor: pointer;
- color: #FF8080;
- background-color: #E6E6FA;
-}
-
-.calendar_ym {
- margin-left: 5px;
-}
-
-.calendar_table {
- font-size: 12px;
- border-collapse: collapse;
- margin: 0;
- padding: 0;
- width: 100%;
- table-layout: fixed;
-}
-
-.calendar_table TH {
- border-right: 1px solid #999999;
- border-bottom: 1px solid gray;
- text-align: center;
- background: url(../../images/spinelz/calender_back_second.gif) #FFFFFF;
- color: #4F4534;
- cursor: pointer;
- margin: 0;
- padding: 0;
- height: 24px;
-}
-
-.calendar_table TH.right {
- border-right-style: none;
-}
-
-.calendar_table TD {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- vertical-align: text-top;
- height: 100px;
- margin: 0;
- padding: 0;
-}
-
-.calendar_table TD.right {
- border-right-style: none;
-}
-
-.calendar_table TD.bottom {
- border-bottom-style: none;
-}
-
-.calendar_date {
- cursor: pointer;
- color: #000000;
- background: #FFFFFF;
- font-weight: bold;
-}
-.calendar_holidayContainer span {
- padding: 2px;
-}
-.calendar_regularHoliday {
- cursor: pointer;
- background: #ededed;
- color: #285A94;
- font-weight: bold;
-}
-
-.calendar_holiday {
- cursor: pointer;
- background-color: #dedede;
- color: #285A94;
- font-weight: bold;
- overflow: hidden;
-}
-
-.calendar_schedule {
- cursor: pointer;
- background: url(../../images/spinelz/calendar_schedule.gif) repeat-x;
- color: #285A94;
- font-weight: bold;
-}
-
-.calendar_highlightDay {
- cursor: pointer;
- font-weight: bold;
- text-decoration: underline;
- color: red;
-}
-
-.calendar_selected {
- background: #285A94;
- color: #ffffff;
-}
-
-.calendar_dateContainer {
- width: 100%;
- overflow: hidden;
- height: 15px;
-}
-
-/*
-.calendar_holidayContainer {
- width: 100%;
- overflow: hidden;
-}
-*/
-
-.calendar_holidayName {
- margin-left: 10px;
-}
-
-.calendar_schedule .calendar_scheduleListContainer {
- color: #000000;
- margin-top: 5px;
-}
-
-.calendar_selected .calendar_scheduleListContainer {
- color: #FFFFFF;
- margin-top: 5px;
-}
-
-.calendar_scheduleListContainer UL {
- list-style: square outside;
- font-weight: normal;
- padding: 0;
- margin: 0 0 0 15px;
-}
-
-.calendar_scheduleItem {
- font-size: 10px;
-}
-
-.calendar_scheduleItem DIV {
- overflow: hidden;
- font-size: 10px;
-}
-
-/* small size */
-.calendar_small {
- border: 1px solid #999999;
- font-size: 13px;
- width: 175px;
- background: #FFFFFF;
- color: #4F4534;
-}
-
-.calendar_calendar_small {
- background: #FFFFFF;
- color: #4F4534;
- font-size: 11px;
-}
-
-.calendar_header_small {
- background: url(../../images/spinelz/calender_back.gif) repeat-x;
- color: #4F4534;
- width: 100%;
- margin: 0;
- padding: 0;
- font-size: 11px;
- font-weight: bold;
- border-collapse: collapse;
- border-bottom: 1px solid #999999;
- height: 26px;
-}
-
-.calendar_tableSmall {
- font-size: 11px;
- text-align: left;
- width: 100%;
- border-collapse: collapse;
- margin: 0 0 0 0;
- padding: 0;
- table-layout: fixed;
-}
-
-.calendar_tableSmall TH {
- text-align: center;
- background: url(../../images/spinelz/calender_back_second.gif) #FFFFFF;
- color: #4F4534;
- width: 14%;
- cursor: pointer;
- margin: 0;
- padding: 0;
- height: 24px;
-}
-
-.calendar_tableSmall TD {
- text-align: center;
- vertical-align: text-top;
- margin: 0;
- padding: 0;
- height: 20px;
- vertical-align: middle;
-}
-
-
-/* week */
-.calendar_weekContainerTable {
- width: 100%;
- border-collapse: collapse;
- margin: 0;
- padding: 0;
- font-size: 11px;
-}
-
-.calendar_weekContainerTable TH {
- background: url(../../images/spinelz/calender_back_second.gif) #FFFFFF;
- color: #4F4534;
- margin: 0;
- padding: 0;
- height: 24px;
-}
-
-.calendar_weekContainerTable TD {
- margin: 0;
- padding: 0;
-}
-
-.calendar_timeline {
- margin: 0;
- padding: 0;
- width: 50px;
-}
-
-.calendar_timelineTimeTop {
- height: 23px;
- text-align: center;
-}
-
-.calendar_timelineTime {
- height: 51px;
- border-top: 1px solid #999999;
- text-align: center;
-}
-
-.calendar_headerColumn {
- border-left: 1px solid #999999;
- border-bottom: 1px solid #999999;
- height: 23px;
- overflow: hidden;
- cursor: pointer;
-}
-
-.calendar_headerColumn a {
- position: relative;
- top: 4px;
-}
-
-.calendar_columnTopDate {
- height: 25px;
- border-left: 1px solid #999999;
- cursor: pointer;
-}
-
-.calendar_columnDate {
- height: 25px;
- border-top: 1px solid #999999;
- border-left: 1px solid #999999;
- cursor: pointer;
-}
-
-.calendar_columnOddDate {
- height: 25px;
- border-top: 1px dashed #999999;
- border-left: 1px solid #999999;
- cursor: pointer;
-}
-
-.calendar_scheduleItemSmall {
- font-size: 10px;
- height: 25px;
- width: 100%;
- background-color: #E6E6FA;
- position: absolute;
- left: 0;
- top: 0;
-/* opacity: 0.7; */
- z-index: 1000;
- overflow: hidden;
-}
-
-.calendar_scheduleItemLarge {
- font-size: 10px;
- height: 17px;
- width: 100%;
- background-color: #E6E6FA;
- position: absolute;
- left: 0;
- top: 0;
- z-index: 1000;
- overflow: hidden;
- border: 2px solid #285A94;
- cursor: pointer;
-}
-
-.calendar_scheduleItemNoBorder {
- padding-top: 2px;
- font-size: 10px;
- height: 16px;
- width: 100%;
- position: absolute;
- left: 0;
- top: 0;
- z-index: 1000;
- overflow: hidden;
- cursor: pointer;
-}
-
-.calendar_scheduleItemNoBorder div {
- height: 16px;
-}
-
-.calendar_scheduleItemSelect {
- border: 2px solid red;
-}
-
-/*
-.calendar_detailItem UL {
- list-style: square outside;
- font-weight: normal;
- padding: 0;
- margin: 0 0 0 15px;
-}
-*/
-
-.calendar_weekMainTable {
- width: 100%;
- border-collapse: collapse;
- margin: 0;
- padding: 0;
- font-size: 11px;
-}
-
-.calendar_weekMainTable TH {
- background: url(../../images/spinelz/calender_back_second.gif) #FFFFFF;
- color: #4F4534;
- margin: 0;
- padding: 0;
- text-align: center;
-}
-
-.calendar_weekMainTable TD {
- margin: 0;
- padding: 0;
-}
-
-.calendar_weekScheduleContainer {
-}
-
-.calendar_deleteImage {
- background: url(../../images/spinelz/calendar_delete.gif) no-repeat;
- position: absolute;
- top: 0;
- right: 0;
- width: 16px;
- height: 16px;
- font-size: 5px;
- cursor: pointer;
-}
-
-.calendar_privateImage {
- background: url(../../images/spinelz/calendar_private_icon.gif) no-repeat;
- float: left;
- width: 16px;
- height: 16px;
- font-size: 5px;
-}
-
-.calendar_selector {
- position: absolute;
- top: 0;
- left: 0;
- border: 2px solid #9b0f0f;
- background: #FFC0CB;
-}
-
-.calendar_scheduleItemTimeArea {
- margin-right: 3px;
- font-size: 9px;
-}
-
-.calendar_cover {
- width: 100%;
- height: 100px;
- position: absolute;
- left: 0;
- top: 0;
- z-index: 1000;
-}
+.calendar {\r
+ margin: 0;\r
+ padding: 0;\r
+ text-decoration: none;\r
+ text-transform: none;\r
+ text-indent: 0;\r
+ font-weight: normal;\r
+ font-size: 13px;\r
+ font-family: Verdana, monospace;\r
+ width: 100%;\r
+ background: #ffffff;\r
+ color: #4F4534;\r
+ border: 1px solid #999999;\r
+}\r
+\r
+/* header */\r
+.calendar_scheduleHandler {\r
+ background: url('../../images/spinelz/calendar_default_handler.gif') no-repeat;\r
+ width: 16px;\r
+ height: 16px;\r
+ cursor: move;\r
+ float: left;\r
+}\r
+\r
+.calendar_header {\r
+ background: url(../../images/spinelz/calender_back.gif) repeat-x;\r
+ color: #4F4534; \r
+ width: 100%;\r
+ height: 26px; \r
+ border-bottom: 1px solid #999999;\r
+ border-collapse: collapse;\r
+ font-size: 13px;\r
+ font-weight: bold; \r
+}\r
+\r
+.calendar_preYears {\r
+ text-align: left;\r
+ width: 35px;\r
+}\r
+\r
+.calendar_years {\r
+ text-align: center;\r
+}\r
+\r
+.calendar_years span {\r
+ font-weight: bolder;\r
+ font-size: 105%;\r
+}\r
+\r
+.calendar_nextYears {\r
+ text-align: right;\r
+ width: 35px;\r
+}\r
+\r
+.calendar_nextMonthMark {\r
+ background: url('../../images/spinelz/calendar_next.gif') no-repeat;\r
+ width: 16px;\r
+ height: 16px;\r
+ cursor: pointer;\r
+ float: left;\r
+}\r
+\r
+.calendar_nextYearMark {\r
+ background: url('../../images/spinelz/calendar_next_second.gif') no-repeat;;\r
+ width: 16px;\r
+ height: 16px;\r
+ cursor: pointer;\r
+ margin-left: 16px;\r
+}\r
+\r
+.calendar_nextWeekMark {\r
+ background: url('../../images/spinelz/calendar_next.gif') no-repeat;;\r
+ width: 16px;\r
+ height: 16px;\r
+ cursor: pointer;\r
+ margin: 0 0 0 auto;\r
+}\r
+\r
+.calendar_preMonthMark {\r
+ background: url('../../images/spinelz/calendar_pre.gif') no-repeat;;\r
+ width: 16px;\r
+ height: 16px;\r
+ cursor: pointer;\r
+ margin-left: 16px;\r
+}\r
+\r
+.calendar_preYearMark {\r
+ background: url('../../images/spinelz/calendar_pre_second.gif') no-repeat;;\r
+ width: 16px;\r
+ height: 16px;\r
+ cursor: pointer;\r
+ float: left;\r
+}\r
+\r
+.calendar_preWeekMark {\r
+ background: url('../../images/spinelz/calendar_pre.gif') no-repeat;;\r
+ width: 16px;\r
+ height: 16px;\r
+ cursor: pointer;\r
+}\r
+\r
+.calendar_markHover {\r
+ margin-left: 5px;\r
+ margin-right: 5px;\r
+ cursor: pointer;\r
+ color: #FF8080;\r
+ background-color: #E6E6FA;\r
+}\r
+\r
+.calendar_ym {\r
+ margin-left: 5px;\r
+}\r
+\r
+.calendar_table {\r
+ font-size: 12px;\r
+ border-collapse: collapse;\r
+ margin: 0;\r
+ padding: 0;\r
+ width: 100%;\r
+ table-layout: fixed;\r
+}\r
+\r
+.calendar_table TH {\r
+ border-right: 1px solid #999999;\r
+ border-bottom: 1px solid gray;\r
+ text-align: center;\r
+ background: url(../../images/spinelz/calender_back_second.gif) #FFFFFF;\r
+ color: #4F4534;\r
+ cursor: pointer;\r
+ margin: 0;\r
+ padding: 0;\r
+ height: 24px;\r
+}\r
+\r
+.calendar_table TH.right {\r
+ border-right-style: none;\r
+}\r
+\r
+.calendar_table TD {\r
+ border-right: 1px solid #999999;\r
+ border-bottom: 1px solid #999999;\r
+ vertical-align: text-top;\r
+ height: 100px;\r
+ margin: 0;\r
+ padding: 0;\r
+}\r
+\r
+.calendar_table TD.right {\r
+ border-right-style: none;\r
+}\r
+\r
+.calendar_table TD.bottom {\r
+ border-bottom-style: none;\r
+}\r
+\r
+.calendar_date {\r
+ cursor: pointer;\r
+ color: #000000;\r
+ background: #FFFFFF;\r
+ font-weight: bold;\r
+}\r
+.calendar_holidayContainer span {\r
+ padding: 2px;\r
+}\r
+.calendar_regularHoliday {\r
+ cursor: pointer;\r
+ background: #ededed;\r
+ color: #285A94;\r
+ font-weight: bold;\r
+}\r
+\r
+.calendar_holiday {\r
+ cursor: pointer;\r
+ background-color: #dedede;\r
+ color: #285A94;\r
+ font-weight: bold;\r
+ overflow: hidden;\r
+}\r
+\r
+.calendar_schedule {\r
+ cursor: pointer;\r
+ background: url(../../images/spinelz/calendar_schedule.gif) repeat-x;\r
+ color: #285A94;\r
+ font-weight: bold;\r
+}\r
+\r
+.calendar_highlightDay {\r
+ cursor: pointer;\r
+ font-weight: bold;\r
+ text-decoration: underline;\r
+ color: red;\r
+}\r
+\r
+.calendar_selected {\r
+ background: #285A94;\r
+ color: #ffffff;\r
+}\r
+\r
+.calendar_dateContainer {\r
+ width: 100%;\r
+ overflow: hidden;\r
+ height: 15px;\r
+}\r
+\r
+/*\r
+.calendar_holidayContainer {\r
+ width: 100%;\r
+ overflow: hidden;\r
+}\r
+*/\r
+\r
+.calendar_holidayName {\r
+ margin-left: 10px;\r
+}\r
+\r
+.calendar_schedule .calendar_scheduleListContainer {\r
+ color: #000000;\r
+ margin-top: 5px;\r
+}\r
+\r
+.calendar_selected .calendar_scheduleListContainer {\r
+ color: #FFFFFF;\r
+ margin-top: 5px;\r
+}\r
+\r
+.calendar_scheduleListContainer UL {\r
+ list-style: square outside;\r
+ font-weight: normal;\r
+ padding: 0;\r
+ margin: 0 0 0 15px;\r
+}\r
+\r
+.calendar_scheduleItem {\r
+ font-size: 10px;\r
+}\r
+\r
+.calendar_scheduleItem DIV {\r
+ overflow: hidden;\r
+ font-size: 10px;\r
+}\r
+\r
+/* small size */\r
+.calendar_small {\r
+ border: 1px solid #999999;\r
+ font-size: 13px;\r
+ width: 175px;\r
+ background: #FFFFFF;\r
+ color: #4F4534;\r
+}\r
+\r
+.calendar_calendar_small {\r
+ background: #FFFFFF;\r
+ color: #4F4534;\r
+ font-size: 11px;\r
+}\r
+\r
+.calendar_header_small {\r
+ background: url(../../images/spinelz/calender_back.gif) repeat-x;\r
+ color: #4F4534;\r
+ width: 100%;\r
+ margin: 0;\r
+ padding: 0;\r
+ font-size: 11px;\r
+ font-weight: bold;\r
+ border-collapse: collapse; \r
+ border-bottom: 1px solid #999999;\r
+ height: 26px;\r
+}\r
+\r
+.calendar_tableSmall {\r
+ font-size: 11px;\r
+ text-align: left;\r
+ width: 100%;\r
+ border-collapse: collapse;\r
+ margin: 0 0 0 0;\r
+ padding: 0;\r
+ table-layout: fixed;\r
+}\r
+\r
+.calendar_tableSmall TH {\r
+ text-align: center;\r
+ background: url(../../images/spinelz/calender_back_second.gif) #FFFFFF;\r
+ color: #4F4534;\r
+ width: 14%;\r
+ cursor: pointer;\r
+ margin: 0;\r
+ padding: 0;\r
+ height: 24px;\r
+}\r
+\r
+.calendar_tableSmall TD {\r
+ text-align: center;\r
+ vertical-align: text-top;\r
+ margin: 0;\r
+ padding: 0;\r
+ height: 20px;\r
+ vertical-align: middle;\r
+}\r
+\r
+\r
+/* week */\r
+.calendar_weekContainerTable {\r
+ width: 100%;\r
+ border-collapse: collapse;\r
+ margin: 0;\r
+ padding: 0;\r
+ font-size: 11px;\r
+}\r
+\r
+.calendar_weekContainerTable TH {\r
+ background: url(../../images/spinelz/calender_back_second.gif) #FFFFFF;\r
+ color: #4F4534;\r
+ margin: 0;\r
+ padding: 0;\r
+ height: 24px;\r
+}\r
+\r
+.calendar_weekContainerTable TD {\r
+ margin: 0;\r
+ padding: 0;\r
+}\r
+\r
+.calendar_timeline {\r
+ margin: 0;\r
+ padding: 0;\r
+ width: 50px;\r
+}\r
+\r
+.calendar_timelineTimeTop {\r
+ height: 23px;\r
+ text-align: center;\r
+}\r
+\r
+.calendar_timelineTime {\r
+ height: 51px;\r
+ border-top: 1px solid #999999;\r
+ text-align: center;\r
+}\r
+\r
+.calendar_headerColumn {\r
+ border-left: 1px solid #999999;\r
+ border-bottom: 1px solid #999999;\r
+ height: 23px;\r
+ overflow: hidden;\r
+ cursor: pointer;\r
+}\r
+\r
+.calendar_headerColumn a {\r
+ position: relative;\r
+ top: 4px;\r
+}\r
+\r
+.calendar_columnTopDate {\r
+ height: 25px;\r
+ border-left: 1px solid #999999;\r
+ cursor: pointer;\r
+}\r
+\r
+.calendar_columnDate {\r
+ height: 25px;\r
+ border-top: 1px solid #999999;\r
+ border-left: 1px solid #999999;\r
+ cursor: pointer;\r
+}\r
+\r
+.calendar_columnOddDate {\r
+ height: 25px;\r
+ border-top: 1px dashed #999999;\r
+ border-left: 1px solid #999999;\r
+ cursor: pointer;\r
+}\r
+\r
+.calendar_scheduleItemSmall {\r
+ font-size: 10px;\r
+ height: 25px;\r
+ width: 100%;\r
+ background-color: #E6E6FA; \r
+ position: absolute;\r
+ left: 0;\r
+ top: 0;\r
+/* opacity: 0.7; */\r
+ z-index: 1000;\r
+ overflow: hidden;\r
+}\r
+\r
+.calendar_scheduleItemLarge {\r
+ font-size: 10px;\r
+ height: 17px;\r
+ width: 100%;\r
+ background-color: #E6E6FA; \r
+ position: absolute;\r
+ left: 0;\r
+ top: 0;\r
+ z-index: 1000;\r
+ overflow: hidden;\r
+ border: 2px solid #285A94;\r
+ cursor: pointer;\r
+}\r
+\r
+.calendar_scheduleItemNoBorder {\r
+ padding-top: 2px;\r
+ font-size: 10px;\r
+ height: 16px;\r
+ width: 100%;\r
+ position: absolute;\r
+ left: 0;\r
+ top: 0;\r
+ z-index: 1000;\r
+ overflow: hidden;\r
+ cursor: pointer;\r
+}\r
+\r
+.calendar_scheduleItemNoBorder div {\r
+ height: 16px;\r
+}\r
+\r
+.calendar_scheduleItemSelect {\r
+ border: 2px solid red;\r
+}\r
+\r
+/*\r
+.calendar_detailItem UL {\r
+ list-style: square outside;\r
+ font-weight: normal;\r
+ padding: 0;\r
+ margin: 0 0 0 15px;\r
+}\r
+*/\r
+\r
+.calendar_weekMainTable {\r
+ width: 100%;\r
+ border-collapse: collapse;\r
+ margin: 0;\r
+ padding: 0;\r
+ font-size: 11px;\r
+}\r
+\r
+.calendar_weekMainTable TH {\r
+ background: url(../../images/spinelz/calender_back_second.gif) #FFFFFF;\r
+ color: #4F4534;\r
+ margin: 0;\r
+ padding: 0;\r
+ text-align: center;\r
+}\r
+\r
+.calendar_weekMainTable TD {\r
+ margin: 0;\r
+ padding: 0;\r
+}\r
+\r
+.calendar_weekScheduleContainer {\r
+}\r
+\r
+.calendar_deleteImage {\r
+ background: url(../../images/spinelz/calendar_delete.gif) no-repeat;\r
+ position: absolute;\r
+ top: 0;\r
+ right: 0;\r
+ width: 16px;\r
+ height: 16px;\r
+ font-size: 5px;\r
+ cursor: pointer;\r
+}\r
+\r
+.calendar_privateImage {\r
+ background: url(../../images/spinelz/calendar_private_icon.gif) no-repeat;\r
+ float: left;\r
+ width: 16px;\r
+ height: 16px;\r
+ font-size: 5px;\r
+}\r
+\r
+.calendar_selector {\r
+ position: absolute;\r
+ top: 0;\r
+ left: 0;\r
+ border: 2px solid #9b0f0f;\r
+ background: #FFC0CB;\r
+}\r
+\r
+.calendar_scheduleItemTimeArea {\r
+ margin-right: 3px;\r
+ font-size: 9px;\r
+}\r
+\r
+.calendar_cover {\r
+ width: 100%;\r
+ height: 100px;\r
+ position: absolute;\r
+ left: 0;\r
+ top: 0;\r
+ z-index: 1000;\r
+}\r
-.datepicker {
- border: 1px solid #999999;
- font-size: 13px;
- width: 200px;
- height: 160px;
- background: #FFFFFF;
- color: #000000;
-}
-
-.datepicker table tr td {
- padding: 0px;
- margin: 0px;
- border: none;
-}
-
-/* header */
-.datepicker_header {
- padding-top: 3px;
- width: 100%;
- height: 26px;
- background: url('../../images/spinelz/datepicker_back.gif') repeat-x;
- color: #808080;
- border-bottom: 1px solid #999999;
- font-weight: bold;
-}
-
-.datepicker_nextMonthMark {
- background: url('../../images/spinelz/datepicker_next.gif') no-repeat;
- width: 16px;
- height: 16px;
- cursor: pointer;
- float: left;
-}
-
-.datepicker_nextYearMark {
- background: url('../../images/spinelz/datepicker_next_second.gif') no-repeat;
- width: 16px;
- height: 16px;
- cursor: pointer;
- margin-left: 16px;
-}
-
-.datepicker_preMonthMark {
- background: url('../../images/spinelz/datepicker_pre.gif') no-repeat;
- width: 16px;
- height: 16px;
- cursor: pointer;
- margin-left: 16px;
-}
-
-.datepicker_preYearMark {
- background: url('../../images/spinelz/datepicker_pre_second.gif') no-repeat;
- width: 16px;
- height: 16px;
- cursor: pointer;
- float: left;
-}
-
-.datepicker_nextYears {
- text-align: right;
- width: 35px;
-}
-
-.datepicker_preYears {
- text-align: left;
- width: 35px;
-}
-
-.datepicker_years {
- text-align: center;
-}
-
-.datepicker_nextYears {
- text-align: right;
- width: 35px;
-}
-
-.datepicker_ym {
- margin-left: 10px;
-}
-
-/* calendar */
-.datepicker_calendar {
- padding-top: 5px;
- background: #FFFFFF;
- color: #000000;
-}
-
-.datepicker_table {
- font-size: 11px;
- text-align: center;
- width: 100%;
- background-position: top;
-}
-
-.datepicker_tableTh {
- color: #999999;
-}
-
-.datepicker_date {
- cursor: pointer;
- background: #FFFFFF;
- color: #000000;
- width: 14%;
-}
-
-.datepicker_holiday {
- cursor: pointer;
- background: #FFFFFF;
- font-weight: bold;
- color: #285A94;
- width: 14%;
-}
-
-.datepicker_dateHover {
- cursor: pointer;
- background: #D5DFE8;
- font-weight: bold;
- color: #674534;
- width: 14%;
-}
-
-.datepicker_holidayHover {
- cursor: pointer;
- background-color: #D5DFE8;
- font-weight: bold;
- color: #674534;
- width: 14%;
-}
-
+.datepicker {\r
+ border: 1px solid #999999;\r
+ font-size: 13px;\r
+ width: 200px;\r
+ height: 160px;\r
+ background: #FFFFFF;\r
+ color: #000000;\r
+}\r
+\r
+.datepicker table tr td {\r
+ padding: 0px;\r
+ margin: 0px;\r
+ border: none;\r
+}\r
+\r
+/* header */\r
+.datepicker_header {\r
+ padding-top: 3px;\r
+ width: 100%;\r
+ height: 26px;\r
+ background: url('../../images/spinelz/datepicker_back.gif') repeat-x;\r
+ color: #808080;\r
+ border-bottom: 1px solid #999999;\r
+ font-weight: bold;\r
+}\r
+\r
+.datepicker_nextMonthMark {\r
+ background: url('../../images/spinelz/datepicker_next.gif') no-repeat;\r
+ width: 16px;\r
+ height: 16px;\r
+ cursor: pointer;\r
+ float: left;\r
+}\r
+\r
+.datepicker_nextYearMark {\r
+ background: url('../../images/spinelz/datepicker_next_second.gif') no-repeat;\r
+ width: 16px;\r
+ height: 16px;\r
+ cursor: pointer;\r
+ margin-left: 16px;\r
+}\r
+\r
+.datepicker_preMonthMark {\r
+ background: url('../../images/spinelz/datepicker_pre.gif') no-repeat;\r
+ width: 16px;\r
+ height: 16px;\r
+ cursor: pointer;\r
+ margin-left: 16px;\r
+}\r
+\r
+.datepicker_preYearMark {\r
+ background: url('../../images/spinelz/datepicker_pre_second.gif') no-repeat;\r
+ width: 16px;\r
+ height: 16px;\r
+ cursor: pointer;\r
+ float: left;\r
+}\r
+\r
+.datepicker_nextYears {\r
+ text-align: right;\r
+ width: 35px;\r
+}\r
+\r
+.datepicker_preYears {\r
+ text-align: left;\r
+ width: 35px;\r
+}\r
+\r
+.datepicker_years {\r
+ text-align: center;\r
+}\r
+\r
+.datepicker_nextYears {\r
+ text-align: right;\r
+ width: 35px;\r
+}\r
+\r
+.datepicker_ym {\r
+ margin-left: 10px;\r
+}\r
+\r
+/* calendar */\r
+.datepicker_calendar {\r
+ padding-top: 5px;\r
+ background: #FFFFFF;\r
+ color: #000000;\r
+}\r
+\r
+.datepicker_table {\r
+ font-size: 11px;\r
+ text-align: center;\r
+ width: 100%;\r
+ background-position: top;\r
+}\r
+\r
+.datepicker_tableTh {\r
+ color: #999999;\r
+}\r
+\r
+.datepicker_date {\r
+ cursor: pointer;\r
+ background: #FFFFFF;\r
+ color: #000000;\r
+ width: 14%;\r
+}\r
+\r
+.datepicker_holiday {\r
+ cursor: pointer;\r
+ background: #FFFFFF;\r
+ font-weight: bold;\r
+ color: #285A94;\r
+ width: 14%;\r
+}\r
+\r
+.datepicker_dateHover {\r
+ cursor: pointer;\r
+ background: #D5DFE8;\r
+ font-weight: bold;\r
+ color: #674534;\r
+ width: 14%;\r
+}\r
+\r
+.datepicker_holidayHover {\r
+ cursor: pointer;\r
+ background-color: #D5DFE8;\r
+ font-weight: bold;\r
+ color: #674534;\r
+ width: 14%;\r
+}\r
+\r
-.grid_container {
- position: relative;
- width: 500px;
- height: 200px;
- overflow: scroll;
-}
-.grid_baseTable{
- background-color: #F6F6F6;
- color: #000000;
- empty-cells: show;
- z-index: 2;
-}
-.grid_headerIdCol{
- background: url(../../images/spinelz/table_back.gif) repeat-x #ffffff;
- color: #000000;
-}
-.grid_headerTable{
- background-color: #F6F6F6;
- color: #000000;
- z-index: 1;
-}
-.grid_headerRow{
- background-color: #F6F6F6;
- color: #000000;
-
-}
-.grid_headerCell{
- background-color: #F6F6F6;
- color: #000000;
-}
-
-.grid_headerCellDrag {
- background-color: #F6F6F6;
- color: #000000;
- overflow: hidden;
- cursor: move;
-}
-.grid_headerCellVal {
- background-color: #F6F6F6;
- color: #000000;
- text-align: center;
- font-weight: bold;
- overflow: hidden;
- cursor: pointer;
-}
-
-.grid_idTable {
- background-color: #F6F6F6;
- color: #000000;
- z-index: 1;
-}
-
-.grid_idRow {
- background-color: #F6F6F6;
- color: #000000;
-}
-
-.grid_idCell{
- background-color: #F6F6F6;
- color: #000000;
- overflow: hidden;
-
-}
-.grid_idCellVal{
- background-color: #F6F6F6;
- color: #000000;
- cursor: move;
- overflow: hidden;
- text-align: center;
-}
-
-.grid_cellTable{
- overflow: hidden;
-}
-.grid_cellTbody{
- position: relative;
-}
-
-.grid_cellRow{
- background-color: #F6F6F6;
- color: #000000;
- position: relative;
- overflow: hidden;
- top: 0;
- left: 0;
-}
-
-.grid_cell{
- overflow: hidden;
- background-color: #FFFFFF;
- color: #000000;
- position: relative;
-}
-
-.grid_cellVal{
- overflow: hidden;
- position: relative;
-}
-
-.grid_cellSelected{
- background-color: #becfeb;
- color: #000000;
-}
-.cellHover{
- background-color: #becfeb;
- color: #000000;
- font-weight: bold;
-}
-
-.grid_state {
- background-image: url(../../images/spinelz/grid_state.gif);
- background-repeat: no-repeat;
- background-position: 0px -22px;
- height: 11px;
- width: 11px;
- overflow: hidden;
-}
-.grid_stateEmpty {
- background-position: 0px -22px;
-}
-
-.grid_stateClose {
- cursor: pointer;
- background-position: 0px -11px;
-}
-
-.grid_stateOpen {
- cursor: pointer;
- background-position: 0px 0px;
-}
-
-.grid_inplaceEditor{
- margin: 0;
- padding: 0;
- width : 100%;
- height: 100%;
-}
+.grid_container {\r
+ position: relative;\r
+ width: 500px;\r
+ height: 200px;\r
+ overflow: scroll;\r
+}\r
+.grid_baseTable{\r
+ background-color: #F6F6F6;\r
+ color: #000000;\r
+ empty-cells: show;\r
+ z-index: 2; \r
+}\r
+.grid_headerIdCol{\r
+ background: url(../../images/spinelz/table_back.gif) repeat-x #ffffff;\r
+ color: #000000;\r
+}\r
+.grid_headerTable{\r
+ background-color: #F6F6F6;\r
+ color: #000000;\r
+ z-index: 1;\r
+}\r
+.grid_headerRow{\r
+ background-color: #F6F6F6;\r
+ color: #000000;\r
+ \r
+}\r
+.grid_headerCell{\r
+ background-color: #F6F6F6;\r
+ color: #000000;\r
+}\r
+\r
+.grid_headerCellDrag {\r
+ background-color: #F6F6F6;\r
+ color: #000000;\r
+ overflow: hidden;\r
+ cursor: move; \r
+}\r
+.grid_headerCellVal {\r
+ background-color: #F6F6F6;\r
+ color: #000000;\r
+ text-align: center;\r
+ font-weight: bold;\r
+ overflow: hidden;\r
+ cursor: pointer;\r
+}\r
+\r
+.grid_idTable {\r
+ background-color: #F6F6F6;\r
+ color: #000000;\r
+ z-index: 1; \r
+}\r
+\r
+.grid_idRow {\r
+ background-color: #F6F6F6; \r
+ color: #000000;\r
+}\r
+\r
+.grid_idCell{\r
+ background-color: #F6F6F6;\r
+ color: #000000;\r
+ overflow: hidden;\r
+ \r
+}\r
+.grid_idCellVal{\r
+ background-color: #F6F6F6;\r
+ color: #000000;\r
+ cursor: move;\r
+ overflow: hidden;\r
+ text-align: center;\r
+}\r
+\r
+.grid_cellTable{\r
+ overflow: hidden;\r
+}\r
+.grid_cellTbody{\r
+ position: relative;\r
+}\r
+\r
+.grid_cellRow{\r
+ background-color: #F6F6F6;\r
+ color: #000000;\r
+ position: relative;\r
+ overflow: hidden;\r
+ top: 0;\r
+ left: 0;\r
+}\r
+\r
+.grid_cell{\r
+ overflow: hidden;\r
+ background-color: #FFFFFF;\r
+ color: #000000;\r
+ position: relative; \r
+}\r
+\r
+.grid_cellVal{\r
+ overflow: hidden;\r
+ position: relative;\r
+}\r
+\r
+.grid_cellSelected{\r
+ background-color: #becfeb;\r
+ color: #000000;\r
+}\r
+.cellHover{\r
+ background-color: #becfeb;\r
+ color: #000000;\r
+ font-weight: bold;\r
+}\r
+\r
+.grid_state {\r
+ background-image: url(../../images/spinelz/grid_state.gif);\r
+ background-repeat: no-repeat;\r
+ background-position: 0px -22px;\r
+ height: 11px;\r
+ width: 11px;\r
+ overflow: hidden;\r
+}\r
+.grid_stateEmpty {\r
+ background-position: 0px -22px;\r
+}\r
+\r
+.grid_stateClose {\r
+ cursor: pointer;\r
+ background-position: 0px -11px;\r
+}\r
+\r
+.grid_stateOpen {\r
+ cursor: pointer; \r
+ background-position: 0px 0px;\r
+}\r
+\r
+.grid_inplaceEditor{\r
+ margin: 0;\r
+ padding: 0;\r
+ width : 100%;\r
+ height: 100%;\r
+}\r
-* {
- margin: 0;
- padding: 0;
- text-decoration: none;
- text-transform: none;
- text-indent: 0;
- font-weight: normal;
- list-style-type: none;
-}
-
-.menubar {
- background: url(../../images/spinelz/menubar_back.gif) repeat-x;
- border: 1px solid #999999;
- font-size: 0.8em;
- line-height: 1.3em;
- height: 26px;
-}
-
-.menubar_menu {
-}
-
-.menubar_menuBody {
- float: left;
- cursor: pointer;
- padding: 3px 8px;
- height: 20px;
- line-height: 1.8em;
-}
-
-.menubar_menuBodyHover {
- float: left;
- cursor: pointer;
- background: #defa93;
- padding: 3px 8px;
- height: 20px;
- line-height: 1.8em;
-}
-
-.menubar_subMenu {
-}
-
-.menubar_subMenuBody {
- background: url(../../images/spinelz/menubar_subcontents_back.gif) repeat-x #fff;
- color: #4F4534;
- padding: 0 3px;
- cursor: pointer;
-}
-
-.menubar_subMenuBodyHover {
- background: #C8CEF6;
- color: #4F4534;
- padding: 0 3px;
- cursor: pointer;
-}
-
-.menubar_subMenuBody A {
- background: #FFFFFF;
- color: gray;
- cursor: pointer;
-}
-
-.menubar_subMenuBodyHover A {
- background-color: #C8CEF6;
- color: #FFFFFF;
- cursor: pointer;
-
-}
-
-.menubar_menuContainer {
- border: 1px solid #999999;
- position: absolute;
- width: 100px;
-}
-
-.menubar_dirMark {
- position: relative;
- top: -17px;
- left: 0;
- float: right;
- color: #999999;
- cursor: pointer;
-}
-
+* {\r
+ margin: 0;\r
+ padding: 0;\r
+ text-decoration: none;\r
+ text-transform: none;\r
+ text-indent: 0;\r
+ font-weight: normal;\r
+ list-style-type: none;\r
+}\r
+\r
+.menubar {\r
+ background: url(../../images/spinelz/menubar_back.gif) repeat-x;\r
+ border: 1px solid #999999;\r
+ font-size: 0.8em;\r
+ line-height: 1.3em;\r
+ height: 26px;\r
+}\r
+\r
+.menubar_menu {\r
+}\r
+\r
+.menubar_menuBody {\r
+ float: left;\r
+ cursor: pointer;\r
+ padding: 3px 8px;\r
+ height: 20px;\r
+ line-height: 1.8em;\r
+}\r
+\r
+.menubar_menuBodyHover {\r
+ float: left;\r
+ cursor: pointer;\r
+ background: #defa93;\r
+ padding: 3px 8px;\r
+ height: 20px;\r
+ line-height: 1.8em;\r
+}\r
+\r
+.menubar_subMenu {\r
+}\r
+\r
+.menubar_subMenuBody {\r
+ background: url(../../images/spinelz/menubar_subcontents_back.gif) repeat-x #fff;\r
+ color: #4F4534;\r
+ padding: 0 3px;\r
+ cursor: pointer;\r
+}\r
+\r
+.menubar_subMenuBodyHover {\r
+ background: #C8CEF6;\r
+ color: #4F4534;\r
+ padding: 0 3px;\r
+ cursor: pointer;\r
+}\r
+\r
+.menubar_subMenuBody A {\r
+ background: #FFFFFF;\r
+ color: gray;\r
+ cursor: pointer;\r
+}\r
+\r
+.menubar_subMenuBodyHover A {\r
+ background-color: #C8CEF6;\r
+ color: #FFFFFF;\r
+ cursor: pointer;\r
+\r
+}\r
+\r
+.menubar_menuContainer {\r
+ border: 1px solid #999999;\r
+ position: absolute;\r
+ width: 100px;\r
+}\r
+\r
+.menubar_dirMark {\r
+ position: relative;\r
+ top: -17px;\r
+ left: 0;\r
+ float: right;\r
+ color: #999999;\r
+ cursor: pointer;\r
+}\r
+\r
-.modal_mask {
- position: fixed;
- top: 0px;
- right:0px;
- left: 0px;
- width: 100%;
- height: 100%;
- opacity: .2;
- background-color: #CCCCCC;
- color: #FFFFFF;
-}
-
-.modal_mask_ie {
- position: absolute;
- top: expression(eval(document.documentElement.scrollTop));
- left: expression(eval(document.documentElement.scrollLeft));
- width: 100%;
- height: 100%;
- filter: alpha(opacity=20);
- background-color: #CCCCCC;
- color: #FFFFFF;
-}
+.modal_mask {\r
+ position: fixed;\r
+ top: 0px;\r
+ right:0px;\r
+ left: 0px;\r
+ width: 100%;\r
+ height: 100%;\r
+ opacity: .2;\r
+ background-color: #CCCCCC;\r
+ color: #FFFFFF;\r
+}\r
+\r
+.modal_mask_ie {\r
+ position: absolute;\r
+ top: expression(eval(document.documentElement.scrollTop));\r
+ left: expression(eval(document.documentElement.scrollLeft));\r
+ width: 100%;\r
+ height: 100%;\r
+ filter: alpha(opacity=20); \r
+ background-color: #CCCCCC;\r
+ color: #FFFFFF;\r
+}\r
-.navPanel{
- border-bottom: 1px solid #919b9c;
-}
-
-.navPanel_panel{
- border-left: 1px solid #999999;
- border-right: 1px solid #999999;
- padding: 10px;
- overflow: auto;
-}
-
-.navPanel_tab {
- height: 26px;
- position: relative;
- cursor: pointer;
-}
-.navPanel_tab div{
- height: 26px;
-}
-.navPanel_tabLeftInactive {
- background: url('../../images/spinelz/navPanel_tab_left_inactive.gif') no-repeat;
- position: absolute;
- left: 0;
- width: 10px;
-}
-
-.navPanel_tabLeftActive {
- background: url('../../images/spinelz/navPanel_tab_left_active.gif') no-repeat;
- position: absolute;
- left: 0;
- width: 10px;
-}
-
-.navPanel_tabMiddleInactive {
- background: url('../../images/spinelz/navPanel_tab_middle_inactive.gif') repeat-x;
- margin: 0 10px;
-}
-
-.navPanel_tabMiddleActive {
- background: url('../../images/spinelz/navPanel_tab_middle_active.gif') repeat-x;
- margin: 0 10px;
-}
-
-.navPanel_tabRightInactive {
- background: url('../../images/spinelz/navPanel_tab_right_inactive.gif') no-repeat;
- position: absolute;
- top: 0;
- right: 0;
- width: 10px;
-}
-
-.navPanel_tabRightActive {
- background: url('../../images/spinelz/navPanel_tab_right_active.gif') no-repeat;
- position: absolute;
- top: 0;
- right: 0;
- width: 10px;
-}
+.navPanel{\r
+ border-bottom: 1px solid #919b9c;\r
+}\r
+\r
+.navPanel_panel{\r
+ border-left: 1px solid #999999;\r
+ border-right: 1px solid #999999;\r
+ padding: 10px;\r
+ overflow: auto;\r
+}\r
+\r
+.navPanel_tab {\r
+ height: 26px;\r
+ position: relative;\r
+ cursor: pointer;\r
+} \r
+.navPanel_tab div{\r
+ height: 26px;\r
+} \r
+.navPanel_tabLeftInactive {\r
+ background: url('../../images/spinelz/navPanel_tab_left_inactive.gif') no-repeat;\r
+ position: absolute;\r
+ left: 0;\r
+ width: 10px;\r
+}\r
+\r
+.navPanel_tabLeftActive {\r
+ background: url('../../images/spinelz/navPanel_tab_left_active.gif') no-repeat;\r
+ position: absolute;\r
+ left: 0;\r
+ width: 10px;\r
+}\r
+\r
+.navPanel_tabMiddleInactive {\r
+ background: url('../../images/spinelz/navPanel_tab_middle_inactive.gif') repeat-x;\r
+ margin: 0 10px;\r
+}\r
+\r
+.navPanel_tabMiddleActive {\r
+ background: url('../../images/spinelz/navPanel_tab_middle_active.gif') repeat-x;\r
+ margin: 0 10px;\r
+}\r
+\r
+.navPanel_tabRightInactive {\r
+ background: url('../../images/spinelz/navPanel_tab_right_inactive.gif') no-repeat;\r
+ position: absolute;\r
+ top: 0;\r
+ right: 0;\r
+ width: 10px;\r
+}\r
+\r
+.navPanel_tabRightActive {\r
+ background: url('../../images/spinelz/navPanel_tab_right_active.gif') no-repeat;\r
+ position: absolute;\r
+ top: 0;\r
+ right: 0;\r
+ width: 10px;\r
+}\r
-.selectableTable_table {
- border-collapse: collapse;
- margin: 0px;
- padding: 0px;
- width: 100%;
-}
-
-.selectableTable_tr {
- margin: 0px;
- padding: 0px;
-}
-
-.selectableTable_tr td {
- border-bottom: 1px dotted black;
- border-top: 1px dotted black;
-}
-
-.selectableTable_trSelected {
- background: url(../../images/spinelz/selectabletable_selected.gif) repeat-x;
- margin: 0px;
- padding: 0px;
-}
-
-.selectableTable_trHover {
- background-color: #eeffcc;
- margin: 0px;
- padding: 0px;
-}
+.selectableTable_table {\r
+ border-collapse: collapse;\r
+ margin: 0px;\r
+ padding: 0px;\r
+ width: 100%;\r
+}\r
+\r
+.selectableTable_tr {\r
+ margin: 0px;\r
+ padding: 0px;\r
+}\r
+\r
+.selectableTable_tr td {\r
+ border-bottom: 1px dotted black;\r
+ border-top: 1px dotted black;\r
+}\r
+\r
+.selectableTable_trSelected {\r
+ background: url(../../images/spinelz/selectabletable_selected.gif) repeat-x;\r
+ margin: 0px;\r
+ padding: 0px;\r
+}\r
+\r
+.selectableTable_trHover {\r
+ background-color: #eeffcc;\r
+ margin: 0px;\r
+ padding: 0px;\r
+}\r
-* {
- margin: 0;
- padding: 0;
- text-decoration: none;
- text-transform: none;
- text-indent: 0;
- font-weight: normal;
- list-style-type: none;
-}
-
-.sideBarBox_panelContainer {
- float: left;
- border: 1px solid #999999;
- padding: 5px;
- position: relative;
- z-index: 5;
- width: 200px;
- height: 200px;
-}
-
-.sideBarBox_tabContainer {
- position: relative;
- float: left;
- width: 40px;
-}
-
-.sideBarBox_tabContent {
-}
-
-.sideBarBox_tabTitle {
- position: relative;
- left: 10px;
-}
-
-.sideBarBox_tab div{
- cursor: pointer;
- width: 40px;
- position: relative;
- left: -1px;
-}
-
-.sideBarBox_tabTopInactive {
- background: url('../../images/spinelz/sideBarBox_tabTopInactive.gif') no-repeat;
- background-position: 0 1px;
- height: 10px;
- z-index: 1;
- font-size: 1px;
-}
-
-.sideBarBox_tabTopActive {
- background: url('../../images/spinelz/sideBarBox_tabTopActive.gif') no-repeat;
- background-position: 0 1px;
- height: 10px;
- z-index: 10;
- font-size: 1px;
-}
-
-.sideBarBox_tabMiddleInactive {
- background: url('../../images/spinelz/sideBarBox_tabMiddleInactive.gif') repeat-y;
- background-position: left top;
- top: -2px;
- z-index: 1;
-}
-
-.sideBarBox_tabMiddleActive {
- background: url('../../images/spinelz/sideBarBox_tabMiddleActive.gif') repeat-y;
- background-position: left top;
- top: -2px;
- z-index: 10;
-}
-
-.sideBarBox_tabBottomInactive {
- display: block;
- background: url('../../images/spinelz/sideBarBox_tabBottomInactive.gif') no-repeat;
- background-position: left top;
- height: 10px;
- top: -5px;
-}
-
-.sideBarBox_tabBottomActive {
- display: block;
- background: url('../../images/spinelz/sideBarBox_tabBottomActive.gif') no-repeat;
- background-position: left top;
- height: 10px;
- top: -5px;
- z-index: 10;
-}
+* {\r
+ margin: 0;\r
+ padding: 0;\r
+ text-decoration: none;\r
+ text-transform: none;\r
+ text-indent: 0;\r
+ font-weight: normal;\r
+ list-style-type: none;\r
+}\r
+\r
+.sideBarBox_panelContainer {\r
+ float: left;\r
+ border: 1px solid #999999;\r
+ padding: 5px;\r
+ position: relative;\r
+ z-index: 5;\r
+ width: 200px;\r
+ height: 200px;\r
+}\r
+\r
+.sideBarBox_tabContainer {\r
+ position: relative;\r
+ float: left;\r
+ width: 40px;\r
+}\r
+\r
+.sideBarBox_tabContent {\r
+}\r
+\r
+.sideBarBox_tabTitle {\r
+ position: relative;\r
+ left: 10px; \r
+}\r
+\r
+.sideBarBox_tab div{ \r
+ cursor: pointer;\r
+ width: 40px;\r
+ position: relative;\r
+ left: -1px;\r
+}\r
+\r
+.sideBarBox_tabTopInactive {\r
+ background: url('../../images/spinelz/sideBarBox_tabTopInactive.gif') no-repeat;\r
+ background-position: 0 1px;\r
+ height: 10px;\r
+ z-index: 1;\r
+ font-size: 1px;\r
+}\r
+\r
+.sideBarBox_tabTopActive {\r
+ background: url('../../images/spinelz/sideBarBox_tabTopActive.gif') no-repeat;\r
+ background-position: 0 1px;\r
+ height: 10px;\r
+ z-index: 10;\r
+ font-size: 1px;\r
+}\r
+\r
+.sideBarBox_tabMiddleInactive {\r
+ background: url('../../images/spinelz/sideBarBox_tabMiddleInactive.gif') repeat-y;\r
+ background-position: left top;\r
+ top: -2px;\r
+ z-index: 1;\r
+}\r
+\r
+.sideBarBox_tabMiddleActive {\r
+ background: url('../../images/spinelz/sideBarBox_tabMiddleActive.gif') repeat-y;\r
+ background-position: left top;\r
+ top: -2px;\r
+ z-index: 10;\r
+}\r
+\r
+.sideBarBox_tabBottomInactive {\r
+ display: block;\r
+ background: url('../../images/spinelz/sideBarBox_tabBottomInactive.gif') no-repeat;\r
+ background-position: left top;\r
+ height: 10px;\r
+ top: -5px;\r
+}\r
+\r
+.sideBarBox_tabBottomActive {\r
+ display: block;\r
+ background: url('../../images/spinelz/sideBarBox_tabBottomActive.gif') no-repeat;\r
+ background-position: left top;\r
+ height: 10px;\r
+ top: -5px;\r
+ z-index: 10;\r
+}\r
-
-.sortableTable_header {
- width: 100%;
- border: none;
-}
-
-.sortableTable_thead {
- background: url(../../images/spinelz/table_back.gif) repeat-x #ffffff;
- height: 26px;
- border: 1px solid #999;
-}
-
-.sortableTable_thead th {
- border: 0;
- padding: 0;
-}
-.sortableTable_tbody {
- background: #ffffff;
-}
-
-.sortableTable_tbody th {
- border: 0;
-}
-
-.sortableTable_title {
- float: left;
- width: 100%;
- font-weight: bold;
- height: 26px;
-}
-
-.sortableTable_empty {
- height: 16px;
- width: 16px;
-}
-
-.sortableTable_down {
- background: url(../../images/spinelz/sortableTable_down.gif) no-repeat;
- cursor: pointer;
- height: 16px;
- width: 16px;
- overflow: hidden;
-}
-
-.sortableTable_up {
- background: url(../../images/spinelz/sortableTable_up.gif) no-repeat;
- cursor: pointer;
- height: 16px;
- width: 16px;
- overflow: hidden;
-}
+\r
+.sortableTable_header {\r
+ width: 100%;\r
+ border: none;\r
+}\r
+\r
+.sortableTable_thead {\r
+ background: url(../../images/spinelz/table_back.gif) repeat-x #ffffff;\r
+ height: 26px;\r
+ border: 1px solid #999;\r
+}\r
+\r
+.sortableTable_thead th { \r
+ border: 0;\r
+ padding: 0;\r
+}\r
+.sortableTable_tbody {\r
+ background: #ffffff;\r
+}\r
+\r
+.sortableTable_tbody th { \r
+ border: 0;\r
+}\r
+\r
+.sortableTable_title {\r
+ float: left;\r
+ width: 100%;\r
+ font-weight: bold;\r
+ height: 26px;\r
+}\r
+\r
+.sortableTable_empty {\r
+ height: 16px;\r
+ width: 16px;\r
+}\r
+\r
+.sortableTable_down {\r
+ background: url(../../images/spinelz/sortableTable_down.gif) no-repeat;\r
+ cursor: pointer; \r
+ height: 16px;\r
+ width: 16px;\r
+ overflow: hidden;\r
+}\r
+\r
+.sortableTable_up {\r
+ background: url(../../images/spinelz/sortableTable_up.gif) no-repeat;\r
+ cursor: pointer; \r
+ height: 16px;\r
+ width: 16px;\r
+ overflow: hidden;\r
+}\r
-.switcher_state_close {
- float: left;
- background-image: url('../../images/spinelz/switcher_close.gif');
- background-repeat: no-repeat;
- cursor: pointer;
- height: 16px;
- width: 16px;
- background-position: center center;
- overflow: visible;
-}
-
-.switcher_state_open {
- float: left;
- background-image: url('../../images/spinelz/switcher_open.gif');
- background-repeat: no-repeat;
- cursor: pointer;
- height: 16px;
- width: 16px;
- background-position: center center;
- overflow: visible;
-}
-
+.switcher_state_close {\r
+ float: left;\r
+ background-image: url('../../images/spinelz/switcher_close.gif');\r
+ background-repeat: no-repeat;\r
+ cursor: pointer; \r
+ height: 16px;\r
+ width: 16px;\r
+ background-position: center center;\r
+ overflow: visible;\r
+}\r
+\r
+.switcher_state_open {\r
+ float: left;\r
+ background-image: url('../../images/spinelz/switcher_open.gif');\r
+ background-repeat: no-repeat;\r
+ cursor: pointer; \r
+ height: 16px;\r
+ width: 16px;\r
+ background-position: center center;\r
+ overflow: visible;\r
+}\r
+\r
-.tabBox_tabBox {
- margin: 0;
- padding: 0;
- text-decoration: none;
- text-transform: none;
- text-indent: 0;
- font-weight: normal;
-}
-
-.tabBox_panelContainer {
- clear: left;
- border-left: 1px solid #999999;
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
-}
-
-.tabBox_tabContainer{
- height: 42px;
- background: url(../../images/spinelz/tab_bar.gif) repeat-x;
- background-position: bottom;
- padding-left: 5px;
-}
-
-.tabBox_tab {
- float: left;
-}
-
-.tabBox_tab div{
- float: left;
- height: 24px;
- cursor: pointer;
- overflow: hidden;
-}
-
-.tabBox_tabLeftInactive {
- background: url('../../images/spinelz/tabBox_tabLeftInactive.gif') no-repeat;
- width: 8px;
- margin-left: 4px;
-}
-
-.tabBox_tabLeftActive {
- background: url('../../images/spinelz/tabBox_tabLeftActive.gif') no-repeat;
- width: 8px;
- margin-left: 4px;
-}
-
-.tabBox_tabMiddleInactive {
- background: url('../../images/spinelz/tabBox_tabMiddleInactive.gif') repeat-x;
- line-height: 1.8em;
-}
-
-.tabBox_tabMiddleActive {
- background: url('../../images/spinelz/tabBox_tabMiddleActive.gif') repeat-x;
- line-height: 1.8em;
-}
-
-.tabBox_tabRightInactive {
- background: url('../../images/spinelz/tabBox_tabRightInactive.gif') no-repeat;
- width: 10px;
- padding: 0;
-}
-
-.tabBox_tabRightActive {
- background: url('../../images/spinelz/tabBox_tabRightActive.gif') no-repeat;
- width: 10px;
-}
-
-.tabBox_tabTitle {
- font-weight: bold;
- line-height: 1.5em;
- padding: 0 10px !important;
-}
-
-.tabBox_closeButton {
- border: 0;
- overflow: hidden;
- cursor: pointer;
- font-size: 5px;
- width: 16px;
- height: 16px;
- background: url('../../images/spinelz/tabBox_close.gif') no-repeat;
- position: relative;
- top: 5px;
-}
+.tabBox_tabBox {\r
+ margin: 0;\r
+ padding: 0;\r
+ text-decoration: none;\r
+ text-transform: none;\r
+ text-indent: 0;\r
+ font-weight: normal;\r
+}\r
+\r
+.tabBox_panelContainer {\r
+ clear: left;\r
+ border-left: 1px solid #999999;\r
+ border-right: 1px solid #999999;\r
+ border-bottom: 1px solid #999999;\r
+}\r
+\r
+.tabBox_tabContainer{\r
+ height: 42px;\r
+ background: url(../../images/spinelz/tab_bar.gif) repeat-x;\r
+ background-position: bottom;\r
+ padding-left: 5px;\r
+}\r
+\r
+.tabBox_tab {\r
+ float: left;\r
+}\r
+\r
+.tabBox_tab div{\r
+ float: left;\r
+ height: 24px; \r
+ cursor: pointer;\r
+ overflow: hidden;\r
+}\r
+\r
+.tabBox_tabLeftInactive {\r
+ background: url('../../images/spinelz/tabBox_tabLeftInactive.gif') no-repeat;\r
+ width: 8px;\r
+ margin-left: 4px;\r
+}\r
+\r
+.tabBox_tabLeftActive {\r
+ background: url('../../images/spinelz/tabBox_tabLeftActive.gif') no-repeat;\r
+ width: 8px;\r
+ margin-left: 4px;\r
+}\r
+\r
+.tabBox_tabMiddleInactive {\r
+ background: url('../../images/spinelz/tabBox_tabMiddleInactive.gif') repeat-x;\r
+ line-height: 1.8em;\r
+}\r
+\r
+.tabBox_tabMiddleActive {\r
+ background: url('../../images/spinelz/tabBox_tabMiddleActive.gif') repeat-x;\r
+ line-height: 1.8em;\r
+}\r
+\r
+.tabBox_tabRightInactive {\r
+ background: url('../../images/spinelz/tabBox_tabRightInactive.gif') no-repeat;\r
+ width: 10px;\r
+ padding: 0;\r
+}\r
+\r
+.tabBox_tabRightActive {\r
+ background: url('../../images/spinelz/tabBox_tabRightActive.gif') no-repeat;\r
+ width: 10px;\r
+}\r
+\r
+.tabBox_tabTitle {\r
+ font-weight: bold;\r
+ line-height: 1.5em;\r
+ padding: 0 10px !important;\r
+}\r
+\r
+.tabBox_closeButton {\r
+ border: 0;\r
+ overflow: hidden;\r
+ cursor: pointer;\r
+ font-size: 5px;\r
+ width: 16px;\r
+ height: 16px;\r
+ background: url('../../images/spinelz/tabBox_close.gif') no-repeat;\r
+ position: relative;\r
+ top: 5px;\r
+}\r
-.timepicker_container {
- margin: 0;
- padding: 0;
- text-decoration: none;
- text-transform: none;
- text-indent: 0;
- font-weight: normal;
- font-size: 13px;
- font-family: Verdana, monospace;
- width: 150px;
- background: #ffffff;
- color: #4F4534;
- border: 1px solid #999999;
-}
-
-/* header */
-.timepicker_scheduleHandler {
- background: url('../../images/spinelz/calendar_default_handler.gif') no-repeat;
- width: 16px;
- height: 16px;
- cursor: move;
- float: left;
-}
-
-.timepicker_header {
- background: url(../../images/spinelz/calender_back.gif) repeat-x;
- color: #4F4534;
- width: 100%;
- height: 26px;
- border-bottom: 1px solid #999999;
- border-collapse: collapse;
- font-size: 13px;
- font-weight: bold;
-}
-
-.timepicker_preYears {
- text-align: left;
- width: 35px;
-}
-
-.timepicker_years {
- text-align: center;
-}
-
-.timepicker_years span {
- font-weight: bolder;
- font-size: 105%;
-}
-
-.timepicker_nextYears {
- text-align: right;
- width: 35px;
-}
-
-.timepicker_nextMonthMark {
- background: url('../../images/spinelz/calendar_next.gif') no-repeat;
- width: 16px;
- height: 16px;
- cursor: pointer;
- float: left;
-}
-
-.timepicker_nextYearMark {
- background: url('../../images/spinelz/calendar_next_second.gif') no-repeat;;
- width: 16px;
- height: 16px;
- cursor: pointer;
- margin-left: 16px;
-}
-
-.timepicker_nextWeekMark {
- background: url('../../images/spinelz/calendar_next.gif') no-repeat;;
- width: 16px;
- height: 16px;
- cursor: pointer;
- margin: 0 0 0 auto;
-}
-
-.timepicker_preMonthMark {
- background: url('../../images/spinelz/calendar_pre.gif') no-repeat;;
- width: 16px;
- height: 16px;
- cursor: pointer;
- margin-left: 16px;
-}
-
-.timepicker_preYearMark {
- background: url('../../images/spinelz/calendar_pre_second.gif') no-repeat;;
- width: 16px;
- height: 16px;
- cursor: pointer;
- float: left;
-}
-
-.timepicker_preWeekMark {
- background: url('../../images/spinelz/calendar_pre.gif') no-repeat;;
- width: 16px;
- height: 16px;
- cursor: pointer;
-}
-
-.timepicker_markHover {
- margin-left: 5px;
- margin-right: 5px;
- cursor: pointer;
- color: #FF8080;
- background-color: #E6E6FA;
-}
-
-.timepicker_ym {
- margin-left: 5px;
-}
-
-.timepicker_table {
- font-size: 12px;
- border-collapse: collapse;
- margin: 0;
- padding: 0;
- width: 100%;
- table-layout: fixed;
-}
-
-.timepicker_table TH {
- border-right: 1px solid #999999;
- border-bottom: 1px solid gray;
- text-align: center;
- background: url(../../images/spinelz/calender_back_second.gif) #FFFFFF;
- color: #4F4534;
- cursor: pointer;
- margin: 0;
- padding: 0;
- height: 24px;
-}
-
-.timepicker_table TH.right {
- border-right-style: none;
-}
-
-.timepicker_table TD {
- border-right: 1px solid #999999;
- border-bottom: 1px solid #999999;
- vertical-align: text-top;
- height: 100px;
- margin: 0;
- padding: 0;
-}
-
-.timepicker_table TD.right {
- border-right-style: none;
-}
-
-.timepicker_table TD.bottom {
- border-bottom-style: none;
-}
-
-.timepicker_date {
- cursor: pointer;
- color: #000000;
- background: #FFFFFF;
- font-weight: bold;
-}
-.timepicker_holidayContainer span {
- padding: 2px;
-}
-.timepicker_regularHoliday {
- cursor: pointer;
- background: #ededed;
- color: #285A94;
- font-weight: bold;
-}
-
-.timepicker_holiday {
- cursor: pointer;
- background-color: #dedede;
- color: #285A94;
- font-weight: bold;
- overflow: hidden;
-}
-
-.timepicker_schedule {
- cursor: pointer;
- background: url(../../images/spinelz/timepicker_schedule.gif) repeat-x;
- color: #285A94;
- font-weight: bold;
-}
-
-.timepicker_highlightDay {
- cursor: pointer;
- font-weight: bold;
- text-decoration: underline;
-}
-
-.timepicker_selected {
- background: #285A94;
- color: #ffffff;
-}
-
-.timepicker_dateContainer {
- width: 100%;
- overflow: hidden;
- height: 15px;
-}
-
-/*
-.timepicker_holidayContainer {
- width: 100%;
- overflow: hidden;
-}
-*/
-
-.timepicker_holidayName {
- margin-left: 10px;
-}
-
-.timepicker_schedule .timepicker_scheduleListContainer {
- color: #000000;
- margin-top: 5px;
-}
-
-.timepicker_selected .timepicker_scheduleListContainer {
- color: #FFFFFF;
- margin-top: 5px;
-}
-
-.timepicker_scheduleListContainer UL {
- list-style: square outside;
- font-weight: normal;
- padding: 0;
- margin: 0 0 0 15px;
-}
-
-.timepicker_scheduleItem {
- font-size: 10px;
-}
-
-.timepicker_scheduleItem DIV {
- overflow: hidden;
- font-size: 10px;
-}
-
-/* small size */
-.timepicker_small {
- border: 1px solid #999999;
- font-size: 13px;
- width: 175px;
- background: #FFFFFF;
- color: #4F4534;
-}
-
-.timepicker_timepicker_small {
- background: #FFFFFF;
- color: #4F4534;
- font-size: 11px;
-}
-
-.timepicker_header_small {
- background: url(../../images/spinelz/calender_back.gif) repeat-x;
- color: #4F4534;
- width: 100%;
- margin: 0;
- padding: 0;
- font-size: 11px;
- font-weight: bold;
- border-collapse: collapse;
- border-bottom: 1px solid #999999;
- height: 26px;
-}
-
-.timepicker_tableSmall {
- font-size: 11px;
- text-align: left;
- width: 100%;
- border-collapse: collapse;
- margin: 0 0 0 0;
- padding: 0;
- table-layout: fixed;
-}
-
-.timepicker_tableSmall TH {
- text-align: center;
- background: url(../../images/spinelz/calender_back_second.gif) #FFFFFF;
- color: #4F4534;
- width: 14%;
- cursor: pointer;
- margin: 0;
- padding: 0;
- height: 24px;
-}
-
-.timepicker_tableSmall TD {
- text-align: center;
- vertical-align: text-top;
- margin: 0;
- padding: 0;
- height: 20px;
- vertical-align: middle;
-}
-
-
-/* week */
-.timepicker_weekContainerTable {
- width: 100%;
- border-collapse: collapse;
- margin: 0;
- padding: 0;
- font-size: 11px;
-}
-
-.timepicker_weekContainerTable TH {
- background: url(../../images/spinelz/calender_back_second.gif) #FFFFFF;
- color: #4F4534;
- margin: 0;
- padding: 0;
- height: 24px;
-}
-
-.timepicker_weekContainerTable TD {
- margin: 0;
- padding: 0;
-}
-
-.timepicker_timeline {
- margin: 0;
- padding: 0;
- width: 25px;
-}
-
-.timepicker_timelineTimeTop {
- height: 23px;
- text-align: center;
-}
-
-.timepicker_timelineTime_ie {
- height: 27px;
- border-top: 1px solid #999999;
- text-align: center;
-}
-
-.timepicker_timelineTime_ieTop {
- height: 28px;
- border-top: 1px solid #999999;
- text-align: center;
-}
-
-.timepicker_timelineTime {
- height: 25px;
- border-top: 1px solid #999999;
- text-align: center;
-}
-
-.timepicker_headerColumn {
- border-left: 1px solid #999999;
- border-bottom: 1px solid #999999;
- height: 23px;
- overflow: hidden;
- cursor: pointer;
-}
-
-.timepicker_headerColumn a {
- position: relative;
- top: 4px;
-}
-
-.timepicker_columnTopDate {
- height: 12px;
- border-left: 1px solid #999999;
- cursor: pointer;
-}
-
-.timepicker_columnDate {
- height: 12px;
- border-top: 1px solid #999999;
- border-left: 1px solid #999999;
- cursor: pointer;
-}
-
-.timepicker_columnOddDate {
- height: 12px;
- border-top: 1px dashed #999999;
- border-left: 1px solid #999999;
- cursor: pointer;
-}
-
-.timepicker_scheduleItemSmall {
- font-size: 10px;
- height: 25px;
- width: 100%;
- background-color: #E6E6FA;
- position: absolute;
- left: 0;
- top: 0;
-/* opacity: 0.7; */
- z-index: 1000;
- overflow: hidden;
-}
-
-.timepicker_scheduleItemLarge {
- font-size: 10px;
- height: 17px;
- width: 100%;
- background-color: #E6E6FA;
- position: absolute;
- left: 0;
- top: 0;
- z-index: 1000;
- overflow: hidden;
- border: 2px solid #285A94;
- cursor: pointer;
-}
-
-.timepicker_scheduleItemNoBorder {
- padding-top: 2px;
- font-size: 10px;
- height: 16px;
- width: 100%;
- position: absolute;
- left: 0;
- top: 0;
- z-index: 1000;
- overflow: hidden;
- cursor: pointer;
-}
-
-.timepicker_scheduleItemNoBorder div {
- height: 16px;
-}
-
-.timepicker_scheduleItemSelect {
- border: 2px solid red;
-}
-
-/*
-.timepicker_detailItem UL {
- list-style: square outside;
- font-weight: normal;
- padding: 0;
- margin: 0 0 0 15px;
-}
-*/
-
-.timepicker_weekMainTable {
- width: 100%;
- border-collapse: collapse;
- margin: 0;
- padding: 0;
- font-size: 11px;
-}
-
-.timepicker_weekMainTable TH {
- background: url(../../images/spinelz/calender_back_second.gif) #FFFFFF;
- color: #4F4534;
- margin: 0;
- padding: 0;
- text-align: center;
-}
-
-.timepicker_weekMainTable TD {
- margin: 0;
- padding: 0;
-}
-
-.timepicker_weekScheduleContainer {
-}
-
-.timepicker_deleteImage {
- background: url(../../images/spinelz/timepicker_delete.gif) no-repeat;
- position: absolute;
- top: 0;
- right: 0;
- width: 16px;
- height: 16px;
- font-size: 5px;
- cursor: pointer;
-}
-
-.timepicker_privateImage {
- background: url(../../images/spinelz/timepicker_private_icon.gif) no-repeat;
- float: left;
- width: 16px;
- height: 16px;
- font-size: 5px;
-}
-
-.timepicker_selector {
- position: absolute;
- top: 0;
- left: 0;
- border: 2px solid #9b0f0f;
- background: #FFC0CB;
-}
-
-.timepicker_scheduleItemTimeArea {
- margin-right: 3px;
- font-size: 9px;
-}
-
-.timepicker_cover {
- width: 100%;
- height: 100px;
- position: absolute;
- left: 0;
- top: 0;
- z-index: 1000;
-}
-
-.timepicker_displayToggle {
- font-weight: normal;
-}
+.timepicker_container {\r
+ margin: 0;\r
+ padding: 0;\r
+ text-decoration: none;\r
+ text-transform: none;\r
+ text-indent: 0;\r
+ font-weight: normal;\r
+ font-size: 13px;\r
+ font-family: Verdana, monospace;\r
+ width: 150px;\r
+ background: #ffffff;\r
+ color: #4F4534;\r
+ border: 1px solid #999999;\r
+}\r
+\r
+/* header */\r
+.timepicker_scheduleHandler {\r
+ background: url('../../images/spinelz/calendar_default_handler.gif') no-repeat;\r
+ width: 16px;\r
+ height: 16px;\r
+ cursor: move;\r
+ float: left;\r
+}\r
+\r
+.timepicker_header {\r
+ background: url(../../images/spinelz/calender_back.gif) repeat-x;\r
+ color: #4F4534; \r
+ width: 100%;\r
+ height: 26px; \r
+ border-bottom: 1px solid #999999;\r
+ border-collapse: collapse;\r
+ font-size: 13px;\r
+ font-weight: bold; \r
+}\r
+\r
+.timepicker_preYears {\r
+ text-align: left;\r
+ width: 35px;\r
+}\r
+\r
+.timepicker_years {\r
+ text-align: center;\r
+}\r
+\r
+.timepicker_years span {\r
+ font-weight: bolder;\r
+ font-size: 105%;\r
+}\r
+\r
+.timepicker_nextYears {\r
+ text-align: right;\r
+ width: 35px;\r
+}\r
+\r
+.timepicker_nextMonthMark {\r
+ background: url('../../images/spinelz/calendar_next.gif') no-repeat;\r
+ width: 16px;\r
+ height: 16px;\r
+ cursor: pointer;\r
+ float: left;\r
+}\r
+\r
+.timepicker_nextYearMark {\r
+ background: url('../../images/spinelz/calendar_next_second.gif') no-repeat;;\r
+ width: 16px;\r
+ height: 16px;\r
+ cursor: pointer;\r
+ margin-left: 16px;\r
+}\r
+\r
+.timepicker_nextWeekMark {\r
+ background: url('../../images/spinelz/calendar_next.gif') no-repeat;;\r
+ width: 16px;\r
+ height: 16px;\r
+ cursor: pointer;\r
+ margin: 0 0 0 auto;\r
+}\r
+\r
+.timepicker_preMonthMark {\r
+ background: url('../../images/spinelz/calendar_pre.gif') no-repeat;;\r
+ width: 16px;\r
+ height: 16px;\r
+ cursor: pointer;\r
+ margin-left: 16px;\r
+}\r
+\r
+.timepicker_preYearMark {\r
+ background: url('../../images/spinelz/calendar_pre_second.gif') no-repeat;;\r
+ width: 16px;\r
+ height: 16px;\r
+ cursor: pointer;\r
+ float: left;\r
+}\r
+\r
+.timepicker_preWeekMark {\r
+ background: url('../../images/spinelz/calendar_pre.gif') no-repeat;;\r
+ width: 16px;\r
+ height: 16px;\r
+ cursor: pointer;\r
+}\r
+\r
+.timepicker_markHover {\r
+ margin-left: 5px;\r
+ margin-right: 5px;\r
+ cursor: pointer;\r
+ color: #FF8080;\r
+ background-color: #E6E6FA;\r
+}\r
+\r
+.timepicker_ym {\r
+ margin-left: 5px;\r
+}\r
+\r
+.timepicker_table {\r
+ font-size: 12px;\r
+ border-collapse: collapse;\r
+ margin: 0;\r
+ padding: 0;\r
+ width: 100%;\r
+ table-layout: fixed;\r
+}\r
+\r
+.timepicker_table TH {\r
+ border-right: 1px solid #999999;\r
+ border-bottom: 1px solid gray;\r
+ text-align: center;\r
+ background: url(../../images/spinelz/calender_back_second.gif) #FFFFFF;\r
+ color: #4F4534;\r
+ cursor: pointer;\r
+ margin: 0;\r
+ padding: 0;\r
+ height: 24px;\r
+}\r
+\r
+.timepicker_table TH.right {\r
+ border-right-style: none;\r
+}\r
+\r
+.timepicker_table TD {\r
+ border-right: 1px solid #999999;\r
+ border-bottom: 1px solid #999999;\r
+ vertical-align: text-top;\r
+ height: 100px;\r
+ margin: 0;\r
+ padding: 0;\r
+}\r
+\r
+.timepicker_table TD.right {\r
+ border-right-style: none;\r
+}\r
+\r
+.timepicker_table TD.bottom {\r
+ border-bottom-style: none;\r
+}\r
+\r
+.timepicker_date {\r
+ cursor: pointer;\r
+ color: #000000;\r
+ background: #FFFFFF;\r
+ font-weight: bold;\r
+}\r
+.timepicker_holidayContainer span {\r
+ padding: 2px;\r
+}\r
+.timepicker_regularHoliday {\r
+ cursor: pointer;\r
+ background: #ededed;\r
+ color: #285A94;\r
+ font-weight: bold;\r
+}\r
+\r
+.timepicker_holiday {\r
+ cursor: pointer;\r
+ background-color: #dedede;\r
+ color: #285A94;\r
+ font-weight: bold;\r
+ overflow: hidden;\r
+}\r
+\r
+.timepicker_schedule {\r
+ cursor: pointer;\r
+ background: url(../../images/spinelz/timepicker_schedule.gif) repeat-x;\r
+ color: #285A94;\r
+ font-weight: bold;\r
+}\r
+\r
+.timepicker_highlightDay {\r
+ cursor: pointer;\r
+ font-weight: bold;\r
+ text-decoration: underline;\r
+}\r
+\r
+.timepicker_selected {\r
+ background: #285A94;\r
+ color: #ffffff;\r
+}\r
+\r
+.timepicker_dateContainer {\r
+ width: 100%;\r
+ overflow: hidden;\r
+ height: 15px;\r
+}\r
+\r
+/*\r
+.timepicker_holidayContainer {\r
+ width: 100%;\r
+ overflow: hidden;\r
+}\r
+*/\r
+\r
+.timepicker_holidayName {\r
+ margin-left: 10px;\r
+}\r
+\r
+.timepicker_schedule .timepicker_scheduleListContainer {\r
+ color: #000000;\r
+ margin-top: 5px;\r
+}\r
+\r
+.timepicker_selected .timepicker_scheduleListContainer {\r
+ color: #FFFFFF;\r
+ margin-top: 5px;\r
+}\r
+\r
+.timepicker_scheduleListContainer UL {\r
+ list-style: square outside;\r
+ font-weight: normal;\r
+ padding: 0;\r
+ margin: 0 0 0 15px;\r
+}\r
+\r
+.timepicker_scheduleItem {\r
+ font-size: 10px;\r
+}\r
+\r
+.timepicker_scheduleItem DIV {\r
+ overflow: hidden;\r
+ font-size: 10px;\r
+}\r
+\r
+/* small size */\r
+.timepicker_small {\r
+ border: 1px solid #999999;\r
+ font-size: 13px;\r
+ width: 175px;\r
+ background: #FFFFFF;\r
+ color: #4F4534;\r
+}\r
+\r
+.timepicker_timepicker_small {\r
+ background: #FFFFFF;\r
+ color: #4F4534;\r
+ font-size: 11px;\r
+}\r
+\r
+.timepicker_header_small {\r
+ background: url(../../images/spinelz/calender_back.gif) repeat-x;\r
+ color: #4F4534;\r
+ width: 100%;\r
+ margin: 0;\r
+ padding: 0;\r
+ font-size: 11px;\r
+ font-weight: bold;\r
+ border-collapse: collapse; \r
+ border-bottom: 1px solid #999999;\r
+ height: 26px;\r
+}\r
+\r
+.timepicker_tableSmall {\r
+ font-size: 11px;\r
+ text-align: left;\r
+ width: 100%;\r
+ border-collapse: collapse;\r
+ margin: 0 0 0 0;\r
+ padding: 0;\r
+ table-layout: fixed;\r
+}\r
+\r
+.timepicker_tableSmall TH {\r
+ text-align: center;\r
+ background: url(../../images/spinelz/calender_back_second.gif) #FFFFFF;\r
+ color: #4F4534;\r
+ width: 14%;\r
+ cursor: pointer;\r
+ margin: 0;\r
+ padding: 0;\r
+ height: 24px;\r
+}\r
+\r
+.timepicker_tableSmall TD {\r
+ text-align: center;\r
+ vertical-align: text-top;\r
+ margin: 0;\r
+ padding: 0;\r
+ height: 20px;\r
+ vertical-align: middle;\r
+}\r
+\r
+\r
+/* week */\r
+.timepicker_weekContainerTable {\r
+ width: 100%;\r
+ border-collapse: collapse;\r
+ margin: 0;\r
+ padding: 0;\r
+ font-size: 11px;\r
+}\r
+\r
+.timepicker_weekContainerTable TH {\r
+ background: url(../../images/spinelz/calender_back_second.gif) #FFFFFF;\r
+ color: #4F4534;\r
+ margin: 0;\r
+ padding: 0;\r
+ height: 24px;\r
+}\r
+\r
+.timepicker_weekContainerTable TD {\r
+ margin: 0;\r
+ padding: 0;\r
+}\r
+\r
+.timepicker_timeline {\r
+ margin: 0;\r
+ padding: 0;\r
+ width: 25px;\r
+}\r
+\r
+.timepicker_timelineTimeTop {\r
+ height: 23px;\r
+ text-align: center;\r
+}\r
+\r
+.timepicker_timelineTime_ie {\r
+ height: 27px;\r
+ border-top: 1px solid #999999;\r
+ text-align: center;\r
+}\r
+\r
+.timepicker_timelineTime_ieTop {\r
+ height: 28px;\r
+ border-top: 1px solid #999999;\r
+ text-align: center;\r
+}\r
+\r
+.timepicker_timelineTime {\r
+ height: 25px;\r
+ border-top: 1px solid #999999;\r
+ text-align: center;\r
+}\r
+\r
+.timepicker_headerColumn {\r
+ border-left: 1px solid #999999;\r
+ border-bottom: 1px solid #999999;\r
+ height: 23px;\r
+ overflow: hidden;\r
+ cursor: pointer;\r
+}\r
+\r
+.timepicker_headerColumn a {\r
+ position: relative;\r
+ top: 4px;\r
+}\r
+\r
+.timepicker_columnTopDate {\r
+ height: 12px;\r
+ border-left: 1px solid #999999;\r
+ cursor: pointer;\r
+}\r
+\r
+.timepicker_columnDate {\r
+ height: 12px;\r
+ border-top: 1px solid #999999;\r
+ border-left: 1px solid #999999;\r
+ cursor: pointer;\r
+}\r
+\r
+.timepicker_columnOddDate {\r
+ height: 12px;\r
+ border-top: 1px dashed #999999;\r
+ border-left: 1px solid #999999;\r
+ cursor: pointer;\r
+}\r
+\r
+.timepicker_scheduleItemSmall {\r
+ font-size: 10px;\r
+ height: 25px;\r
+ width: 100%;\r
+ background-color: #E6E6FA; \r
+ position: absolute;\r
+ left: 0;\r
+ top: 0;\r
+/* opacity: 0.7; */\r
+ z-index: 1000;\r
+ overflow: hidden;\r
+}\r
+\r
+.timepicker_scheduleItemLarge {\r
+ font-size: 10px;\r
+ height: 17px;\r
+ width: 100%;\r
+ background-color: #E6E6FA; \r
+ position: absolute;\r
+ left: 0;\r
+ top: 0;\r
+ z-index: 1000;\r
+ overflow: hidden;\r
+ border: 2px solid #285A94;\r
+ cursor: pointer;\r
+}\r
+\r
+.timepicker_scheduleItemNoBorder {\r
+ padding-top: 2px;\r
+ font-size: 10px;\r
+ height: 16px;\r
+ width: 100%;\r
+ position: absolute;\r
+ left: 0;\r
+ top: 0;\r
+ z-index: 1000;\r
+ overflow: hidden;\r
+ cursor: pointer;\r
+}\r
+\r
+.timepicker_scheduleItemNoBorder div {\r
+ height: 16px;\r
+}\r
+\r
+.timepicker_scheduleItemSelect {\r
+ border: 2px solid red;\r
+}\r
+\r
+/*\r
+.timepicker_detailItem UL {\r
+ list-style: square outside;\r
+ font-weight: normal;\r
+ padding: 0;\r
+ margin: 0 0 0 15px;\r
+}\r
+*/\r
+\r
+.timepicker_weekMainTable {\r
+ width: 100%;\r
+ border-collapse: collapse;\r
+ margin: 0;\r
+ padding: 0;\r
+ font-size: 11px;\r
+}\r
+\r
+.timepicker_weekMainTable TH {\r
+ background: url(../../images/spinelz/calender_back_second.gif) #FFFFFF;\r
+ color: #4F4534;\r
+ margin: 0;\r
+ padding: 0;\r
+ text-align: center;\r
+}\r
+\r
+.timepicker_weekMainTable TD {\r
+ margin: 0;\r
+ padding: 0;\r
+}\r
+\r
+.timepicker_weekScheduleContainer {\r
+}\r
+\r
+.timepicker_deleteImage {\r
+ background: url(../../images/spinelz/timepicker_delete.gif) no-repeat;\r
+ position: absolute;\r
+ top: 0;\r
+ right: 0;\r
+ width: 16px;\r
+ height: 16px;\r
+ font-size: 5px;\r
+ cursor: pointer;\r
+}\r
+\r
+.timepicker_privateImage {\r
+ background: url(../../images/spinelz/timepicker_private_icon.gif) no-repeat;\r
+ float: left;\r
+ width: 16px;\r
+ height: 16px;\r
+ font-size: 5px;\r
+}\r
+\r
+.timepicker_selector {\r
+ position: absolute;\r
+ top: 0;\r
+ left: 0;\r
+ border: 2px solid #9b0f0f;\r
+ background: #FFC0CB;\r
+}\r
+\r
+.timepicker_scheduleItemTimeArea {\r
+ margin-right: 3px;\r
+ font-size: 9px;\r
+}\r
+\r
+.timepicker_cover {\r
+ width: 100%;\r
+ height: 100px;\r
+ position: absolute;\r
+ left: 0;\r
+ top: 0;\r
+ z-index: 1000;\r
+}\r
+\r
+.timepicker_displayToggle {\r
+ font-weight: normal;\r
+}\r
-.toolbar_container {
- position: relative;
- height: 25px;
-}
-
-.toolbar_containerLeft {
- background-repeat:no-repeat;
- background-image:url('../../images/spinelz/toolbar_left.gif');
- position:absolute;
- left:0px;
- height: 25px;
- width: 2px;
-}
-
-.toolbar_containerMiddle {
- height: 25px;
- background-repeat:repeat-x;
- background-image:url('../../images/spinelz/toolbar_middle.gif');
- margin-left: 2px;
- margin-right: 3px;
- padding-top: 2px;
-}
-
-.toolbar_containerRight {
- background-repeat: no-repeat;
- background-image: url('../../images/spinelz/toolbar_right.gif');
- position:absolute;
- top: 0px;
- right:0px;
- height: 25px;
- width: 3px;
-}
-
-.toolbar_item {
- position:relative;
- margin-right:3px;
- height:20px;
- padding: 1px;
- float:left;
-}
-
-.toolbar_itemHov {
- position:relative;
- margin-right:3px;
- height:20px;
- padding: 0px;
- float:left;
- border: 1px solid #b9cfd8;
-}
-
-.toolbar_itemPres {
- position:relative;
- margin-right:3px;
- height:20px;
- padding: 0px;
- float:left;
- border-width: 1px;
- border-style: solid;
- border-color: #b9cfd8 #ffffff #ffffff #b9cfd8;
-}
-
-.toolbar_content {
- position:relative;
- height: 18px;
- font-size:11px;
- padding: 2px 5px 0 5px;
- overflow: hidden;
- cursor: pointer;
- float: left;
-}
-
-.toolbar_contentPres {
- position:relative;
- height: 18px;
- font-size:0px;
- padding: 2px 5px 0 5px;
- overflow: hidden;
- cursor: pointer;
- float: left;
- background-color: #ffffff;
- color: #000000;
-}
+.toolbar_container {\r
+ position: relative;\r
+ height: 25px;\r
+}\r
+\r
+.toolbar_containerLeft {\r
+ background-repeat:no-repeat;\r
+ background-image:url('../../images/spinelz/toolbar_left.gif');\r
+ position:absolute;\r
+ left:0px;\r
+ height: 25px; \r
+ width: 2px; \r
+}\r
+\r
+.toolbar_containerMiddle {\r
+ height: 25px; \r
+ background-repeat:repeat-x;\r
+ background-image:url('../../images/spinelz/toolbar_middle.gif');\r
+ margin-left: 2px;\r
+ margin-right: 3px;\r
+ padding-top: 2px;\r
+}\r
+\r
+.toolbar_containerRight {\r
+ background-repeat: no-repeat;\r
+ background-image: url('../../images/spinelz/toolbar_right.gif');\r
+ position:absolute;\r
+ top: 0px;\r
+ right:0px;\r
+ height: 25px; \r
+ width: 3px;\r
+}\r
+\r
+.toolbar_item {\r
+ position:relative;\r
+ margin-right:3px;\r
+ height:20px;\r
+ padding: 1px;\r
+ float:left;\r
+}\r
+\r
+.toolbar_itemHov {\r
+ position:relative;\r
+ margin-right:3px;\r
+ height:20px;\r
+ padding: 0px;\r
+ float:left;\r
+ border: 1px solid #b9cfd8; \r
+}\r
+\r
+.toolbar_itemPres {\r
+ position:relative;\r
+ margin-right:3px;\r
+ height:20px;\r
+ padding: 0px;\r
+ float:left;\r
+ border-width: 1px;\r
+ border-style: solid;\r
+ border-color: #b9cfd8 #ffffff #ffffff #b9cfd8; \r
+}\r
+\r
+.toolbar_content {\r
+ position:relative;\r
+ height: 18px;\r
+ font-size:11px;\r
+ padding: 2px 5px 0 5px;\r
+ overflow: hidden;\r
+ cursor: pointer;\r
+ float: left;\r
+}\r
+\r
+.toolbar_contentPres {\r
+ position:relative;\r
+ height: 18px;\r
+ font-size:0px;\r
+ padding: 2px 5px 0 5px;\r
+ overflow: hidden;\r
+ cursor: pointer;\r
+ float: left;\r
+ background-color: #ffffff;\r
+ color: #000000;\r
+}\r
-.treeview {
- list-style: none outside;
- font-size: 12px;
-}
-
-.treeview_dir {
- margin-top: 2px;
- height: auto;
- width: auto;
-}
-
-.treeview_dirBody {
- cursor: pointer;
- height: 15px;
- width: auto;
-}
-
-.treeview_dirBodyText {
- background-color: #FFFFFF;
- color: black;
-}
-
-.treeview_dirBodyTextActive {
- background-color: #becfeb;
- color: black;
-}
-
-.treeview_dirContainerHover {
- background-color: #becfeb;
-}
-
-.treeview_dirContainer {
- list-style: none outside;
- padding: 1px 0 3px 20px;
- margin: 0px;
- height: auto;
- width: auto;
-}
-
-.treeview_file {
- margin-top: 2px;
- margin-left: 17px;
-/* position: relative; */
-/* top: 0px; */
-/* left: 0px; */
-}
-
-.treeview_fileBody {
- height: 15px;
- cursor: pointer;
-}
-
-.treeview_fileBodyText {
- background-color: #FFFFFF;
- color: black;
-}
-
-.treeview_fileBodyTextActive {
- background-color: #becfeb;
- color: black;
-}
-
-.treeview_stateEmpty {
- float: left;
- background-image: url(../../images/spinelz/treeview_state.gif);
- background-repeat: no-repeat;
- cursor: pointer;
- height: 11px;
- width: 11px;
- margin-right: 5px;
- background-position: 0px -22px;
- overflow: hidden;
-}
-
-.treeview_stateClose {
- float: left;
- background-image: url(../../images/spinelz/treeview_state.gif);
- background-repeat: no-repeat;
- cursor: pointer;
- height: 11px;
- width: 11px;
- margin-right: 5px;
- background-position: 0px -11px;
- overflow: hidden;
-}
-
-.treeview_stateOpen {
- float: left;
- background-image: url(../../images/spinelz/treeview_state.gif);
- background-repeat: no-repeat;
- cursor: pointer;
- height: 11px;
- width: 11px;
- margin-right: 5px;
- background-position: 0px 0px;
- overflow: hidden;
-}
-
-.treeview_dirIcon {
- float: left;
- background-image: url(../../images/spinelz/treeview_dir.gif);
- background-repeat: no-repeat;
- cursor: pointer;
- height: 16px;
- width: 16px;
- margin-right: 5px;
- background-position: 0px 0px;
- overflow: hidden;
-}
-
-.treeview_fileIcon {
- float: left;
- background-image: url(../../images/spinelz/treeview_file.gif);
- background-repeat: no-repeat;
- cursor: pointer;
- height: 16px;
- width: 16px;
- margin-right: 2px;
- background-position: 0px 0px;
- overflow: hidden;
-}
+.treeview {\r
+ list-style: none outside;\r
+ font-size: 12px;\r
+}\r
+\r
+.treeview_dir {\r
+ margin-top: 2px;\r
+ height: auto;\r
+ width: auto;\r
+}\r
+\r
+.treeview_dirBody {\r
+ cursor: pointer;\r
+ height: 15px;\r
+ width: auto;\r
+}\r
+\r
+.treeview_dirBodyText {\r
+ background-color: #FFFFFF;\r
+ color: black;\r
+}\r
+\r
+.treeview_dirBodyTextActive {\r
+ background-color: #becfeb;\r
+ color: black;\r
+}\r
+\r
+.treeview_dirContainerHover {\r
+ background-color: #becfeb; \r
+}\r
+\r
+.treeview_dirContainer {\r
+ list-style: none outside;\r
+ padding: 1px 0 3px 20px;\r
+ margin: 0px;\r
+ height: auto;\r
+ width: auto;\r
+}\r
+\r
+.treeview_file {\r
+ margin-top: 2px;\r
+ margin-left: 17px;\r
+/* position: relative; */\r
+/* top: 0px; */\r
+/* left: 0px; */\r
+}\r
+\r
+.treeview_fileBody {\r
+ height: 15px;\r
+ cursor: pointer;\r
+}\r
+\r
+.treeview_fileBodyText {\r
+ background-color: #FFFFFF;\r
+ color: black;\r
+}\r
+\r
+.treeview_fileBodyTextActive {\r
+ background-color: #becfeb;\r
+ color: black;\r
+}\r
+\r
+.treeview_stateEmpty {\r
+ float: left;\r
+ background-image: url(../../images/spinelz/treeview_state.gif);\r
+ background-repeat: no-repeat;\r
+ cursor: pointer; \r
+ height: 11px;\r
+ width: 11px;\r
+ margin-right: 5px;\r
+ background-position: 0px -22px;\r
+ overflow: hidden;\r
+}\r
+\r
+.treeview_stateClose {\r
+ float: left;\r
+ background-image: url(../../images/spinelz/treeview_state.gif);\r
+ background-repeat: no-repeat;\r
+ cursor: pointer; \r
+ height: 11px;\r
+ width: 11px;\r
+ margin-right: 5px;\r
+ background-position: 0px -11px;\r
+ overflow: hidden;\r
+}\r
+\r
+.treeview_stateOpen {\r
+ float: left;\r
+ background-image: url(../../images/spinelz/treeview_state.gif);\r
+ background-repeat: no-repeat;\r
+ cursor: pointer; \r
+ height: 11px;\r
+ width: 11px;\r
+ margin-right: 5px;\r
+ background-position: 0px 0px;\r
+ overflow: hidden;\r
+}\r
+\r
+.treeview_dirIcon {\r
+ float: left;\r
+ background-image: url(../../images/spinelz/treeview_dir.gif);\r
+ background-repeat: no-repeat;\r
+ cursor: pointer; \r
+ height: 16px;\r
+ width: 16px;\r
+ margin-right: 5px;\r
+ background-position: 0px 0px;\r
+ overflow: hidden;\r
+}\r
+\r
+.treeview_fileIcon {\r
+ float: left;\r
+ background-image: url(../../images/spinelz/treeview_file.gif);\r
+ background-repeat: no-repeat;\r
+ cursor: pointer; \r
+ height: 16px;\r
+ width: 16px;\r
+ margin-right: 2px;\r
+ background-position: 0px 0px;\r
+ overflow: hidden;\r
+}\r
-.window {
- position: absolute;
- margin: 0;
- padding: 0;
- text-decoration: none;
- text-transform: none;
- text-indent: 0;
- font-weight: normal;
-}
-
-.window_header{
- width: 100%;
- height: 45px;
- position: relative;
-}
-
-.window_headerLeft{
- width: 30px;
- height: 45px;
- top: 0;
- position: absolute;
- left: 0;
- background: url('../../images/spinelz/window_top_left.gif') no-repeat;
-}
-
-.window_headerMiddle{
- height: 45px;
- top: 0;
- margin: 0 30px;
- background: url('../../images/spinelz/window_top_middle.gif') repeat-x;
- cursor: move;
- line-height: 3.0em;
- overflow: hidden;
-}
-
-.window_headerRight{
- width: 30px;
- height: 45px;
- top: 0;
- position: absolute;
- right: 0;
- background: url('../../images/spinelz/window_top_right.gif') no-repeat;
-}
-
-.window_buttonHolder{
- width: 60px;
- height: 16px;
- position: absolute;
- top: 0;
- right: 32px;
- margin-top: 10px;
-}
-
-.window_closeButton{
- float: right;
- overflow: hidden;
- font-size: 5px;
- width: 16px;
- height: 16px;
- background: url('../../images/spinelz/window_close.gif') no-repeat;
- cursor:pointer;
-}
-
-.window_maxButton{
- float: right;
- overflow: hidden;
- cursor: pointer;
- width: 16px;
- height: 16px;
- background: url('../../images/spinelz/window_max.gif') no-repeat;
-}
-
-.window_minButton{
- float: right;
- overflow: hidden;
- cursor: pointer;
- width: 16px;
- height: 16px;
- background: url('../../images/spinelz/window_min.gif') no-repeat;
-}
-
-.window_body{
- width: 100%;
- background: transparent;
- color: #000000;
- position: relative;
-}
-
-.window_bodyLeft{
- top: 0;
- width: 30px;
- position: absolute;
- left: 0;
- background: url('../../images/spinelz/window_middle_left.gif') repeat-y;
-}
-
-.window_bodyMiddle{
- top: 0;
- position: relative;
- margin: 0 30px;
- background: #fff;
- color: #000000;
- overflow: auto;
-}
-
-.window_bodyRight{
- top: 0;
- width: 30px;
- position: absolute;
- right: 0;
- background: url('../../images/spinelz/window_middle_right.gif') repeat-y;
-}
-
-.window_bottom{
- width: 100%;
- height: 35px;
- position: relative;
-}
-
-.window_bottomLeft{
- width: 30px;
- height: 35px;
- position: absolute;
- left: 0;
- background: url('../../images/spinelz/window_bottom_left.gif') no-repeat;
-}
-
-.window_bottomMiddle{
- height: 35px;
- margin: 0 30px;
- background: url('../../images/spinelz/window_bottom_middle.gif') repeat-x;
-}
-
-.window_bottomRight{
- width: 30px;
- height: 35px;
- position: absolute;
- top: 0;
- right: 0;
- background: url('../../images/spinelz/window_bottom_right.gif') no-repeat;
-}
+.window {\r
+ position: absolute;\r
+ margin: 0;\r
+ padding: 0;\r
+ text-decoration: none;\r
+ text-transform: none;\r
+ text-indent: 0;\r
+ font-weight: normal;\r
+}\r
+\r
+.window_header{\r
+ width: 100%;\r
+ height: 45px;\r
+ position: relative;\r
+}\r
+\r
+.window_headerLeft{\r
+ width: 30px;\r
+ height: 45px;\r
+ top: 0;\r
+ position: absolute;\r
+ left: 0;\r
+ background: url('../../images/spinelz/window_top_left.gif') no-repeat;\r
+}\r
+\r
+.window_headerMiddle{\r
+ height: 45px;\r
+ top: 0;\r
+ margin: 0 30px;\r
+ background: url('../../images/spinelz/window_top_middle.gif') repeat-x;\r
+ cursor: move;\r
+ line-height: 3.0em;\r
+ overflow: hidden;\r
+}\r
+\r
+.window_headerRight{\r
+ width: 30px;\r
+ height: 45px;\r
+ top: 0;\r
+ position: absolute;\r
+ right: 0;\r
+ background: url('../../images/spinelz/window_top_right.gif') no-repeat;\r
+}\r
+\r
+.window_buttonHolder{\r
+ width: 60px;\r
+ height: 16px;\r
+ position: absolute;\r
+ top: 0;\r
+ right: 32px;\r
+ margin-top: 10px;\r
+}\r
+\r
+.window_closeButton{\r
+ float: right;\r
+ overflow: hidden;\r
+ font-size: 5px;\r
+ width: 16px;\r
+ height: 16px;\r
+ background: url('../../images/spinelz/window_close.gif') no-repeat;\r
+ cursor:pointer;\r
+}\r
+\r
+.window_maxButton{\r
+ float: right;\r
+ overflow: hidden;\r
+ cursor: pointer;\r
+ width: 16px;\r
+ height: 16px;\r
+ background: url('../../images/spinelz/window_max.gif') no-repeat;\r
+}\r
+\r
+.window_minButton{\r
+ float: right;\r
+ overflow: hidden;\r
+ cursor: pointer;\r
+ width: 16px;\r
+ height: 16px;\r
+ background: url('../../images/spinelz/window_min.gif') no-repeat;\r
+}\r
+\r
+.window_body{\r
+ width: 100%;\r
+ background: transparent;\r
+ color: #000000;\r
+ position: relative;\r
+}\r
+\r
+.window_bodyLeft{\r
+ top: 0;\r
+ width: 30px;\r
+ position: absolute;\r
+ left: 0;\r
+ background: url('../../images/spinelz/window_middle_left.gif') repeat-y;\r
+}\r
+\r
+.window_bodyMiddle{\r
+ top: 0;\r
+ position: relative;\r
+ margin: 0 30px;\r
+ background: #fff;\r
+ color: #000000;\r
+ overflow: auto;\r
+}\r
+\r
+.window_bodyRight{\r
+ top: 0;\r
+ width: 30px;\r
+ position: absolute;\r
+ right: 0;\r
+ background: url('../../images/spinelz/window_middle_right.gif') repeat-y;\r
+}\r
+\r
+.window_bottom{\r
+ width: 100%;\r
+ height: 35px;\r
+ position: relative;\r
+}\r
+\r
+.window_bottomLeft{\r
+ width: 30px;\r
+ height: 35px;\r
+ position: absolute;\r
+ left: 0;\r
+ background: url('../../images/spinelz/window_bottom_left.gif') no-repeat;\r
+}\r
+\r
+.window_bottomMiddle{\r
+ height: 35px;\r
+ margin: 0 30px;\r
+ background: url('../../images/spinelz/window_bottom_middle.gif') repeat-x;\r
+}\r
+\r
+.window_bottomRight{\r
+ width: 30px;\r
+ height: 35px;\r
+ position: absolute;\r
+ top: 0;\r
+ right: 0;\r
+ background: url('../../images/spinelz/window_bottom_right.gif') no-repeat;\r
+}\r
-body { background-color: #fff; color: #333; }
-
-body, p, ol, ul, td {
- font-family: verdana, arial, helvetica, sans-serif;
- font-size: 13px;
- line-height: 18px;
-}
-
-pre {
- background-color: #eee;
- padding: 10px;
- font-size: 11px;
-}
-
-a { color: #000; }
-a:visited { color: #666; }
-a:hover { color: #fff; background-color:#000; }
-
-ul.menu {
- list-style-type: none;
-}
-
-ul.menu li {
- float: left;
- background-color: white;
- margin-left: 10px;
- border: 1px solid black;
- padding: 2px;
-}
-
-div.tabpanel div.tab-row li {
- margin: 0;
- padding: 0;
- display: inline;
- list-style-type: none;
-}
-
-div.tabpanel div.tab-row a:link,
- div.tabpanel div.tab-row a:visited {
- float: left;
- background: #f3f3f3;
- font-size: 12px;
- line-height: 14px;
- font-weight: bold;
- padding: 2px 10px 2px 10px;
- margin-right: 4px;
- border: 1px solid #ccc;
- text-decoration: none;
- color: #666;
-}
-
-div.tabpanel div.tab-row li.selected a:link,
- div.tabpanel div.tab-row a:visited.active {
- border-bottom: 1px solid #fff;
- background: #fff;
- color: #000;
-}
-
-div.tabpanel div.tab-row a:hover {
- background: #fff;
+body { background-color: #fff; color: #333; }\r
+\r
+body, p, ol, ul, td {\r
+ font-family: verdana, arial, helvetica, sans-serif;\r
+ font-size: 13px;\r
+ line-height: 18px;\r
+}\r
+\r
+pre {\r
+ background-color: #eee;\r
+ padding: 10px;\r
+ font-size: 11px;\r
+}\r
+\r
+a { color: #000; }\r
+a:visited { color: #666; }\r
+a:hover { color: #fff; background-color:#000; }\r
+\r
+ul.menu {\r
+ list-style-type: none; \r
+}\r
+\r
+ul.menu li {\r
+ float: left;\r
+ background-color: white;\r
+ margin-left: 10px;\r
+ border: 1px solid black;\r
+ padding: 2px;\r
+}\r
+\r
+div.tabpanel div.tab-row li {\r
+ margin: 0;\r
+ padding: 0;\r
+ display: inline;\r
+ list-style-type: none;\r
+}\r
+\r
+div.tabpanel div.tab-row a:link,\r
+ div.tabpanel div.tab-row a:visited {\r
+ float: left;\r
+ background: #f3f3f3;\r
+ font-size: 12px;\r
+ line-height: 14px;\r
+ font-weight: bold;\r
+ padding: 2px 10px 2px 10px;\r
+ margin-right: 4px;\r
+ border: 1px solid #ccc;\r
+ text-decoration: none;\r
+ color: #666;\r
+}\r
+\r
+div.tabpanel div.tab-row li.selected a:link,\r
+ div.tabpanel div.tab-row a:visited.active {\r
+ border-bottom: 1px solid #fff;\r
+ background: #fff;\r
+ color: #000;\r
+}\r
+\r
+div.tabpanel div.tab-row a:hover {\r
+ background: #fff;\r
}
\ No newline at end of file
-# A default log4j configuration for log4j users.
-#
-# To use this configuration, deploy it into your application's WEB-INF/classes
-# directory. You are also encouraged to edit it as you like.
-
-# Configure the console as our one appender
-log4j.appender.A1=org.apache.log4j.ConsoleAppender
-log4j.appender.A1.layout=org.apache.log4j.PatternLayout
-log4j.appender.A1.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p [%c] - %m%n
-
-# tighten logging on the DataNucleus Categories
-log4j.category.DataNucleus.JDO=WARN, A1
-log4j.category.DataNucleus.Persistence=WARN, A1
-log4j.category.DataNucleus.Cache=WARN, A1
-log4j.category.DataNucleus.MetaData=WARN, A1
-log4j.category.DataNucleus.General=WARN, A1
-log4j.category.DataNucleus.Utility=WARN, A1
-log4j.category.DataNucleus.Transaction=WARN, A1
-log4j.category.DataNucleus.Datastore=WARN, A1
-log4j.category.DataNucleus.ClassLoading=WARN, A1
-log4j.category.DataNucleus.Plugin=WARN, A1
-log4j.category.DataNucleus.ValueGeneration=WARN, A1
-log4j.category.DataNucleus.Enhancer=WARN, A1
-log4j.category.DataNucleus.SchemaTool=WARN, A1
+# A default log4j configuration for log4j users.\r
+#\r
+# To use this configuration, deploy it into your application's WEB-INF/classes\r
+# directory. You are also encouraged to edit it as you like.\r
+\r
+# Configure the console as our one appender\r
+log4j.appender.A1=org.apache.log4j.ConsoleAppender\r
+log4j.appender.A1.layout=org.apache.log4j.PatternLayout\r
+log4j.appender.A1.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p [%c] - %m%n\r
+\r
+# tighten logging on the DataNucleus Categories\r
+log4j.category.DataNucleus.JDO=WARN, A1\r
+log4j.category.DataNucleus.Persistence=WARN, A1\r
+log4j.category.DataNucleus.Cache=WARN, A1\r
+log4j.category.DataNucleus.MetaData=WARN, A1\r
+log4j.category.DataNucleus.General=WARN, A1\r
+log4j.category.DataNucleus.Utility=WARN, A1\r
+log4j.category.DataNucleus.Transaction=WARN, A1\r
+log4j.category.DataNucleus.Datastore=WARN, A1\r
+log4j.category.DataNucleus.ClassLoading=WARN, A1\r
+log4j.category.DataNucleus.Plugin=WARN, A1\r
+log4j.category.DataNucleus.ValueGeneration=WARN, A1\r
+log4j.category.DataNucleus.Enhancer=WARN, A1\r
+log4j.category.DataNucleus.SchemaTool=WARN, A1\r
-# A default java.util.logging configuration.
-# (All App Engine logging is through java.util.logging by default).
-#
-# To use this configuration, copy it into your application's WEB-INF
-# folder and add the following to your appengine-web.xml:
-#
-# <system-properties>
-# <property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
-# </system-properties>
-#
-
-# Set the default logging level for all loggers to WARNING
-.level = WARNING
-
-# Set the default logging level for ORM, specifically, to WARNING
-DataNucleus.JDO.level=WARNING
-DataNucleus.Persistence.level=WARNING
-DataNucleus.Cache.level=WARNING
-DataNucleus.MetaData.level=WARNING
-DataNucleus.General.level=WARNING
-DataNucleus.Utility.level=WARNING
-DataNucleus.Transaction.level=WARNING
-DataNucleus.Datastore.level=WARNING
-DataNucleus.ClassLoading.level=WARNING
-DataNucleus.Plugin.level=WARNING
-DataNucleus.ValueGeneration.level=WARNING
-DataNucleus.Enhancer.level=WARNING
-DataNucleus.SchemaTool.level=WARNING
+# A default java.util.logging configuration.\r
+# (All App Engine logging is through java.util.logging by default).\r
+#\r
+# To use this configuration, copy it into your application's WEB-INF\r
+# folder and add the following to your appengine-web.xml:\r
+# \r
+# <system-properties>\r
+# <property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>\r
+# </system-properties>\r
+#\r
+\r
+# Set the default logging level for all loggers to WARNING\r
+.level = WARNING\r
+\r
+# Set the default logging level for ORM, specifically, to WARNING\r
+DataNucleus.JDO.level=WARNING\r
+DataNucleus.Persistence.level=WARNING\r
+DataNucleus.Cache.level=WARNING\r
+DataNucleus.MetaData.level=WARNING\r
+DataNucleus.General.level=WARNING\r
+DataNucleus.Utility.level=WARNING\r
+DataNucleus.Transaction.level=WARNING\r
+DataNucleus.Datastore.level=WARNING\r
+DataNucleus.ClassLoading.level=WARNING\r
+DataNucleus.Plugin.level=WARNING\r
+DataNucleus.ValueGeneration.level=WARNING\r
+DataNucleus.Enhancer.level=WARNING\r
+DataNucleus.SchemaTool.level=WARNING\r
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE web-app PUBLIC
- "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
- "http://java.sun.com/dtd/web-app_2_3.dtd">
-
-<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5">
- <filter>
- <filter-name>wicket.appengine-sample</filter-name>
- <filter-class>jp.sourceforge.manganetwork.ReloadingWicketFilter</filter-class>
- <init-param>
- <param-name>applicationClassName</param-name>
- <param-value>jp.sourceforge.manganetwork.WicketApplication</param-value>
- </init-param>
- <init-param>
- <param-name>wicket.configuration</param-name>
- <param-value>development</param-value>
- </init-param>
- </filter>
-
- <filter-mapping>
- <filter-name>wicket.appengine-sample</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
-
- <servlet>
- <servlet-name>cloudmanganetwork</servlet-name>
- <servlet-class>jp.sourceforge.manganetwork.CloudMangaNetworkServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>cloudmanganetwork</servlet-name>
- <url-pattern>/cloudmanganetwork</url-pattern>
- </servlet-mapping>
- <welcome-file-list>
- <welcome-file>index.html</welcome-file>
- </welcome-file-list>
-</web-app>
+<?xml version="1.0" encoding="utf-8"?>\r
+<!DOCTYPE web-app PUBLIC\r
+ "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"\r
+ "http://java.sun.com/dtd/web-app_2_3.dtd">\r
+\r
+<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5">\r
+ <filter>\r
+ <filter-name>wicket.appengine-sample</filter-name>\r
+ <filter-class>jp.sourceforge.manganetwork.ReloadingWicketFilter</filter-class>\r
+ <init-param>\r
+ <param-name>applicationClassName</param-name>\r
+ <param-value>jp.sourceforge.manganetwork.WicketApplication</param-value>\r
+ </init-param>\r
+ <init-param>\r
+ <param-name>wicket.configuration</param-name>\r
+ <param-value>development</param-value>\r
+ </init-param>\r
+ </filter>\r
+\r
+ <filter-mapping>\r
+ <filter-name>wicket.appengine-sample</filter-name>\r
+ <url-pattern>/*</url-pattern>\r
+ </filter-mapping>\r
+ \r
+ <servlet>\r
+ <servlet-name>cloudmanganetwork</servlet-name>\r
+ <servlet-class>jp.sourceforge.manganetwork.CloudMangaNetworkServlet</servlet-class>\r
+ </servlet>\r
+ <servlet-mapping>\r
+ <servlet-name>cloudmanganetwork</servlet-name>\r
+ <url-pattern>/cloudmanganetwork</url-pattern>\r
+ </servlet-mapping>\r
+ <welcome-file-list>\r
+ <welcome-file>index.html</welcome-file>\r
+ </welcome-file-list>\r
+</web-app>\r
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<!-- The HTML 4.01 Transitional DOCTYPE declaration-->
-<!-- above set at the top of the file will set -->
-<!-- the browser's rendering engine into -->
-<!-- "Quirks Mode". Replacing this declaration -->
-<!-- with a "Standards Mode" doctype is supported, -->
-<!-- but may lead to some differences in layout. -->
-
-<html>
- <head>
- <meta http-equiv="content-type" content="text/html; charset=UTF-8">
-
- <!-- -->
- <!-- Any title is fine -->
- <!-- -->
- <title>Hello App Engine</title>
- </head>
-
- <!-- -->
- <!-- The body can have arbitrary html, or -->
- <!-- you can leave the body empty if you want -->
- <!-- to create a completely dynamic UI. -->
- <!-- -->
- <body>
- <h1>Hello App Engine!</h1>
-
- <table>
- <tr>
- <td colspan="2" style="font-weight:bold;">Available Servlets:</td>
- </tr>
- <tr>
- <td><a href="cloudmanganetwork"/>CloudMangaNetworkServlet</td>
- </tr>
- </table>
- </body>
-</html>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">\r
+<!-- The HTML 4.01 Transitional DOCTYPE declaration-->\r
+<!-- above set at the top of the file will set -->\r
+<!-- the browser's rendering engine into -->\r
+<!-- "Quirks Mode". Replacing this declaration -->\r
+<!-- with a "Standards Mode" doctype is supported, -->\r
+<!-- but may lead to some differences in layout. -->\r
+\r
+<html>\r
+ <head>\r
+ <meta http-equiv="content-type" content="text/html; charset=UTF-8">\r
+ \r
+ <!-- -->\r
+ <!-- Any title is fine -->\r
+ <!-- -->\r
+ <title>Hello App Engine</title>\r
+ </head>\r
+\r
+ <!-- -->\r
+ <!-- The body can have arbitrary html, or -->\r
+ <!-- you can leave the body empty if you want -->\r
+ <!-- to create a completely dynamic UI. -->\r
+ <!-- -->\r
+ <body>\r
+ <h1>Hello App Engine!</h1>\r
+ \r
+ <table>\r
+ <tr>\r
+ <td colspan="2" style="font-weight:bold;">Available Servlets:</td> \r
+ </tr>\r
+ <tr>\r
+ <td><a href="cloudmanganetwork"/>CloudMangaNetworkServlet</td>\r
+ </tr>\r
+ </table>\r
+ </body>\r
+</html>\r