-<?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"?>
+<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/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/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-ioc-1.3.5.jar"/>
+ <classpathentry kind="con" path="com.google.appengine.eclipse.core.GAE_CONTAINER/App Engine (1)"/>
+ <classpathentry kind="lib" path="war/WEB-INF/lib/webbeans-wicket-1.0.0-SNAPSHOT.jar"/>
+ <classpathentry kind="lib" path="war/WEB-INF/lib/webbeans-servlet-1.0.0-SNAPSHOT.jar"/>
+ <classpathentry kind="output" path="war/WEB-INF/classes"/>
+</classpath>
\r
import jp.sourceforge.manganetwork.page.AdminHomePage;\r
import jp.sourceforge.manganetwork.page.LoginPage;\r
+import jp.sourceforge.manganetwork.web.MyWebRequestCycleProcessor;\r
+import jp.sourceforge.manganetwork.web.UserSession;\r
\r
import org.apache.wicket.Request;\r
import org.apache.wicket.RequestCycle;\r
import org.apache.wicket.protocol.http.WebApplication;\r
import org.apache.wicket.request.IRequestCycleProcessor;\r
import org.apache.wicket.session.ISessionStore;\r
+import org.jboss.webbeans.wicket.WebBeansApplication;\r
+\r
+public class WicketApplication extends WebBeansApplication {\r
\r
-public class WicketApplication extends WebApplication {\r
- @Override\r
public Class getHomePage() {\r
return LoginPage.class;\r
}\r
protected IRequestCycleProcessor newRequestCycleProcessor() {\r
return new MyWebRequestCycleProcessor();\r
}\r
+\r
@Override\r
protected void init() {\r
super.init();\r
setEncoding();\r
-\r
+ getResourceSettings().setResourcePollFrequency(null);\r
mountBookmarkablePage("/admin", AdminHomePage.class);\r
}\r
\r
getRequestCycleSettings().setResponseRequestEncoding("UTF-8");\r
getMarkupSettings().setDefaultMarkupEncoding("UTF-8");\r
}\r
- \r
- \r
+\r
}\r
package jp.sourceforge.manganetwork.page;\r
\r
-import jp.sourceforge.manganetwork.UserSession;\r
import jp.sourceforge.manganetwork.model.User;\r
+import jp.sourceforge.manganetwork.web.UserSession;\r
\r
import org.apache.wicket.markup.html.WebPage;\r
import org.apache.wicket.markup.html.panel.FeedbackPanel;\r
package jp.sourceforge.manganetwork.page;\r
\r
+import javax.inject.Current;\r
+\r
import org.apache.wicket.markup.html.basic.Label;\r
\r
/**\r
* @author nobu\r
*/\r
public class HomePage extends MenuApplicationPage {\r
-\r
+ @Current HelloService helloService;\r
+ \r
public HomePage()\r
{\r
- add(new Label("label", "Hello1"));\r
+ add(new Label("label", helloService.say()));\r
}\r
}\r
\r
package jp.sourceforge.manganetwork.page;\r
\r
-import jp.sourceforge.manganetwork.UserSession;\r
+import javax.inject.Current;\r
+\r
import jp.sourceforge.manganetwork.model.User;\r
+import jp.sourceforge.manganetwork.web.UserSession;\r
\r
import org.apache.wicket.markup.html.form.Form;\r
import org.apache.wicket.markup.html.form.PasswordTextField;\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
+log4j.rootLogger=debug, A1\r
\r
# tighten logging on the DataNucleus Categories\r
log4j.category.DataNucleus.JDO=WARN, A1\r
+++ /dev/null
-<?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
+++ /dev/null
-<!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
+++ /dev/null
-<!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
+++ /dev/null
-<!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
+++ /dev/null
-<!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
+++ /dev/null
-// 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
+++ /dev/null
-// 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
+++ /dev/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
-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
+++ /dev/null
-// 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
+++ /dev/null
-// 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
+++ /dev/null
-// 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
+++ /dev/null
-// 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
+++ /dev/null
-// 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
+++ /dev/null
-// 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
+++ /dev/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
+++ /dev/null
-// 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
+++ /dev/null
-// 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
+++ /dev/null
-// 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
+++ /dev/null
-// 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
+++ /dev/null
-// 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
+++ /dev/null
-// 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
+++ /dev/null
-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
+++ /dev/null
-// 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
+++ /dev/null
-// 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
+++ /dev/null
-// 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
+++ /dev/null
-// 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
+++ /dev/null
-// 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
+++ /dev/null
-// 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
+++ /dev/null
-// 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
+++ /dev/null
-// 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
+++ /dev/null
-// 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
+++ /dev/null
-// 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
+++ /dev/null
-/*\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
+++ /dev/null
-/* 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
+++ /dev/null
-// 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
+++ /dev/null
-// 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
+++ /dev/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
+++ /dev/null
-// 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
+++ /dev/null
-// 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
+++ /dev/null
-.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
+++ /dev/null
-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
+++ /dev/null
-.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
+++ /dev/null
-.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
+++ /dev/null
-.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
+++ /dev/null
-* {\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
+++ /dev/null
-.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
+++ /dev/null
-.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
+++ /dev/null
-.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
+++ /dev/null
-* {\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
+++ /dev/null
-\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
+++ /dev/null
-.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
+++ /dev/null
-.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
+++ /dev/null
-.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
+++ /dev/null
-.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
+++ /dev/null
-.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
+++ /dev/null
-.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
+++ /dev/null
-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
+++ /dev/null
-# 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
<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
+ <filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class>\r
<init-param>\r
<param-name>applicationClassName</param-name>\r
<param-value>jp.sourceforge.manganetwork.WicketApplication</param-value>\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
+ <listener>\r
+ <listener-class>org.jboss.webbeans.environment.servlet.Listener</listener-class>\r
+ </listener> \r
</web-app>\r
+++ /dev/null
-<!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