CAMP can capture canals
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
camera.json
|
380
action.py
Normal file
|
@ -0,0 +1,380 @@
|
||||||
|
#!/usr/bin/python3
|
||||||
|
import json
|
||||||
|
import time
|
||||||
|
import xml.etree.ElementTree
|
||||||
|
import requests
|
||||||
|
from requests.auth import HTTPDigestAuth
|
||||||
|
|
||||||
|
|
||||||
|
def PTZData(d, root="PTZData"):
|
||||||
|
op = lambda tag: '<' + tag + '>'
|
||||||
|
cl = lambda tag: '</' + tag + '>\n'
|
||||||
|
ml = lambda v, xml: xml + op(key) + str(v) + cl(key)
|
||||||
|
xml = op(root) + '\n' if root else ""
|
||||||
|
if isinstance(d, list):
|
||||||
|
for v in d:
|
||||||
|
xml = ml(v, xml)
|
||||||
|
else:
|
||||||
|
for key, vl in d.items():
|
||||||
|
if isinstance(vl, list):
|
||||||
|
for v in vl:
|
||||||
|
xml = ml(v, xml)
|
||||||
|
if isinstance(vl, dict):
|
||||||
|
xml = ml('\n' + PTZData(vl, None), xml)
|
||||||
|
if not isinstance(vl, (list, dict)):
|
||||||
|
xml = ml(vl, xml)
|
||||||
|
xml += cl(root) if root else ""
|
||||||
|
return xml
|
||||||
|
|
||||||
|
def etree_to_list(t):
|
||||||
|
d = []
|
||||||
|
k = t.tag.split('}')[-1]
|
||||||
|
v = list(map(etree_to_dict, t.getchildren()))
|
||||||
|
if len(v) == 1:
|
||||||
|
v = v[0]
|
||||||
|
elif v and not isinstance(v[0], dict):
|
||||||
|
v_ = {}
|
||||||
|
for kv in v:
|
||||||
|
for key, value in kv.items():
|
||||||
|
if isinstance(value, str) and (value.isdigit() or value[1:].isdigit()):
|
||||||
|
value = int(value)
|
||||||
|
v_[key] = value
|
||||||
|
v = v_
|
||||||
|
return v
|
||||||
|
|
||||||
|
def etree_to_dict(t):
|
||||||
|
d = {}
|
||||||
|
k = t.tag.split('}')[-1]
|
||||||
|
v = list(map(etree_to_dict, t.getchildren()))
|
||||||
|
if len(v) == 1:
|
||||||
|
v = v[0]
|
||||||
|
#elif v and not isinstance(v[0], dict):
|
||||||
|
else:
|
||||||
|
v_ = {}
|
||||||
|
for kv in v:
|
||||||
|
for key, value in kv.items():
|
||||||
|
if isinstance(value, str) and (value.isdigit() or value[1:].isdigit()):
|
||||||
|
value = int(value)
|
||||||
|
v_[key] = value
|
||||||
|
v = v_
|
||||||
|
d = {k: v}
|
||||||
|
#d.update(('@' + k, v) for k, v in t.attrib.items())
|
||||||
|
if not v:
|
||||||
|
d[k] = t.text
|
||||||
|
elif t.text.strip():
|
||||||
|
d['text'] = t.text
|
||||||
|
return d
|
||||||
|
|
||||||
|
class Camera:
|
||||||
|
STOP = {'pan': 0, 'tilt': 0, 'zoom': 0}
|
||||||
|
LEFT = {'pan': -1, 'tilt': 0, 'zoom': 0}
|
||||||
|
RIGHT = {'pan': 1, 'tilt': 0, 'zoom': 0}
|
||||||
|
UP = {'pan': 0, 'tilt': 1, 'zoom': 0}
|
||||||
|
DOWN = {'pan': 0, 'tilt': -1, 'zoom': 0}
|
||||||
|
LEFT_UP = {'pan': -1, 'tilt': 1, 'zoom': 0}
|
||||||
|
LEFT_DOWN = {'pan': -1, 'tilt': -1, 'zoom': 0}
|
||||||
|
RIGHT_UP = {'pan': 1, 'tilt': 1, 'zoom': 0}
|
||||||
|
RIGHT_DOWN = {'pan': 1, 'tilt': -1, 'zoom': 0}
|
||||||
|
|
||||||
|
IN = {'pan': 1, 'tilt': 0, 'zoom': 1}
|
||||||
|
OUT = {'pan': 1, 'tilt': 0, 'zoom': -1}
|
||||||
|
|
||||||
|
abort = False
|
||||||
|
sequence_time = 0
|
||||||
|
segment_times = {}
|
||||||
|
next_target = None
|
||||||
|
last_position = {}
|
||||||
|
|
||||||
|
def __init__(self, ip='192.168.1.64', username='admin', password='admin', channel=1):
|
||||||
|
self.ip = ip
|
||||||
|
self.username = username
|
||||||
|
self.password = password
|
||||||
|
self.channel = channel
|
||||||
|
self.auth = HTTPDigestAuth(self.username, self.password)
|
||||||
|
|
||||||
|
def url(self, method):
|
||||||
|
return 'http://{}/ISAPI/PTZCtrl/channels/{}/{}'.format(self.ip, self.channel, method)
|
||||||
|
|
||||||
|
def parse_xml(self, data):
|
||||||
|
return etree_to_dict(xml.etree.ElementTree.fromstring(data))
|
||||||
|
|
||||||
|
def status(self):
|
||||||
|
s = self.parse_xml(self.get('status'))
|
||||||
|
if 'PTZStatus' in s:
|
||||||
|
self.last_position = s['PTZStatus']['AbsoluteHigh']
|
||||||
|
return self.last_position
|
||||||
|
return {}
|
||||||
|
|
||||||
|
def get(self, method):
|
||||||
|
return requests.get(self.url(method), auth=self.auth).text
|
||||||
|
|
||||||
|
def put(self, method, data):
|
||||||
|
if isinstance(data, dict):
|
||||||
|
data = PTZData(data)
|
||||||
|
return requests.put(self.url(method), data=data, auth=self.auth).text
|
||||||
|
|
||||||
|
def momentary(self, cmd, duration=None):
|
||||||
|
if duration:
|
||||||
|
cmd['Momentary'] = {
|
||||||
|
'duration': int(duration * 1000)
|
||||||
|
}
|
||||||
|
r = self.put('momentary', cmd)
|
||||||
|
if '<statusCode>1</statusCode>' not in r:
|
||||||
|
print(r)
|
||||||
|
|
||||||
|
def continuous(self, cmd, duration=None):
|
||||||
|
r = self.put('continuous', cmd)
|
||||||
|
if '<statusCode>1</statusCode>' not in r:
|
||||||
|
print(r)
|
||||||
|
elif duration:
|
||||||
|
time.sleep(duration)
|
||||||
|
self.continuous(self.STOP)
|
||||||
|
|
||||||
|
def set_preset(self, id, name):
|
||||||
|
data = PTZData({
|
||||||
|
'id': str(id),
|
||||||
|
'presetName': name
|
||||||
|
}, 'PTZPreset')
|
||||||
|
r = self.put('presets/%s' % id, data)
|
||||||
|
if '<statusCode>1</statusCode>' not in r:
|
||||||
|
print(r)
|
||||||
|
|
||||||
|
def set_presets(self, presets):
|
||||||
|
for preset in presets:
|
||||||
|
self.absolute(**preset['position'])
|
||||||
|
time.sleep(5)
|
||||||
|
self.absolute(**preset['position'])
|
||||||
|
time.sleep(5)
|
||||||
|
self.set_preset(preset['id'], preset['name'])
|
||||||
|
|
||||||
|
def sequence(self, steps=[], speed=12, goto_first=True):
|
||||||
|
self.sequence_start = 0
|
||||||
|
if goto_first:
|
||||||
|
#self.goto_preset(steps[0], pan=100, tilt=100, zoom=100)
|
||||||
|
first = steps[0]
|
||||||
|
if isinstance(first, dict):
|
||||||
|
if 'seqid' in first and first['seqid'] not in self.segment_times:
|
||||||
|
self.segment_times[first['seqid']] = 0
|
||||||
|
first = first['preset']
|
||||||
|
self.fast_preset(first, True)
|
||||||
|
#self.goto_preset(first, pan=speed, tilt=speed)
|
||||||
|
if self.abort:
|
||||||
|
return
|
||||||
|
time.sleep(3)
|
||||||
|
steps = steps[1:]
|
||||||
|
self.sequence_start = t0 = time.time()
|
||||||
|
for step in steps:
|
||||||
|
self.next_target = step
|
||||||
|
segment_t0 = time.time()
|
||||||
|
if self.abort:
|
||||||
|
return
|
||||||
|
if isinstance(step, dict):
|
||||||
|
if 'fast' in step or ('speed' in step and step['speed'] > 100):
|
||||||
|
self.fast_preset(step.get('fast', step.get('preset')), True)
|
||||||
|
else:
|
||||||
|
if 'preset' in step:
|
||||||
|
kwargs = {
|
||||||
|
'pan': step['speed'],
|
||||||
|
'tilt': step['speed'],
|
||||||
|
}
|
||||||
|
if step.get('zoom'):
|
||||||
|
kwargs['zoom'] = step['zoom']
|
||||||
|
if 'zoom_last' in step:
|
||||||
|
kwargs['zoom_last'] = step['zoom_last']
|
||||||
|
self.goto_preset(step['preset'], **kwargs)
|
||||||
|
if 'sleep' in step:
|
||||||
|
if self.abort:
|
||||||
|
return
|
||||||
|
time.sleep(float(step['sleep']))
|
||||||
|
else:
|
||||||
|
self.goto_preset(step, pan=speed, tilt=speed)
|
||||||
|
|
||||||
|
segment_time = time.time() - segment_t0
|
||||||
|
if isinstance(step, dict) and 'seqid' in step:
|
||||||
|
self.segment_times[step['seqid']] = segment_time
|
||||||
|
self.sequence_time = time.time() - t0
|
||||||
|
self.next_target = None
|
||||||
|
|
||||||
|
def fast_preset(self, id, wait=False):
|
||||||
|
self.put('presets/%s/goto' % id, None)
|
||||||
|
if wait:
|
||||||
|
preset = self.get_preset(id)['position']
|
||||||
|
last = self.status()
|
||||||
|
|
||||||
|
def is_close_enough(a, b):
|
||||||
|
return abs(a['elevation'] - b['elevation']) < 2 \
|
||||||
|
and abs(a['absoluteZoom'] - b['absoluteZoom']) < 2 \
|
||||||
|
and abs(a['azimuth'] - b['azimuth']) < 2
|
||||||
|
|
||||||
|
while not is_close_enough(last, preset):
|
||||||
|
time.sleep(0.1)
|
||||||
|
last = self.status()
|
||||||
|
|
||||||
|
def goto_preset(self, id, pan, tilt, zoom=1, zoom_last=False):
|
||||||
|
if self.abort:
|
||||||
|
return
|
||||||
|
presets = self.get_presets(True)
|
||||||
|
if isinstance(id, str):
|
||||||
|
preset = [p for p in presets if p['name'] == id]
|
||||||
|
if not preset:
|
||||||
|
raise Exception('unknown preset %s' % id)
|
||||||
|
id = preset[0]['id']
|
||||||
|
else:
|
||||||
|
preset = [p for p in presets if p['id'] == id]
|
||||||
|
if not preset:
|
||||||
|
raise Exception('unknown preset %s' % id)
|
||||||
|
preset = preset[0]
|
||||||
|
i = preset['position']
|
||||||
|
#info = etree_to_dict(xml.etree.ElementTree.fromstring(self.get('presets/%s' % id)))
|
||||||
|
#i = info['PTZPreset']['AbsoluteHigh']
|
||||||
|
print('goto preset', id, i['elevation'], i['azimuth'], i['absoluteZoom'])
|
||||||
|
return self.goto(i['elevation'], i['azimuth'], i['absoluteZoom'], pan=pan, tilt=tilt, zoom=zoom, zoom_last=zoom_last)
|
||||||
|
|
||||||
|
def goto(self, elevation, azimuth, absoluteZoom, speed=1, pan=None, tilt=None, zoom=None, zoom_last=False):
|
||||||
|
t0 = time.time()
|
||||||
|
start = self.status()
|
||||||
|
target = {'elevation': elevation, 'azimuth': azimuth, 'absoluteZoom': absoluteZoom}
|
||||||
|
print('start:', start, 'target:', target)
|
||||||
|
|
||||||
|
if zoom_last:
|
||||||
|
goto_last = {
|
||||||
|
'speed': speed,
|
||||||
|
'pan': pan,
|
||||||
|
'tilt': tilt,
|
||||||
|
'zoom': zoom,
|
||||||
|
}
|
||||||
|
goto_last.update(target)
|
||||||
|
target['absoluteZoom'] = start['absoluteZoom']
|
||||||
|
|
||||||
|
def get_delta():
|
||||||
|
current = self.status()
|
||||||
|
delta = {}
|
||||||
|
for key in current:
|
||||||
|
delta[key] = target[key] - current[key]
|
||||||
|
return current, delta
|
||||||
|
|
||||||
|
current, delta = get_delta()
|
||||||
|
|
||||||
|
if pan is None:
|
||||||
|
pan = speed
|
||||||
|
if tilt is None:
|
||||||
|
tilt = speed
|
||||||
|
if zoom is None:
|
||||||
|
zoom = 1
|
||||||
|
if delta['elevation'] > 0:
|
||||||
|
tilt = -tilt
|
||||||
|
if delta['azimuth'] < 0:
|
||||||
|
pan = -pan
|
||||||
|
if delta['absoluteZoom'] < 0:
|
||||||
|
zoom = -zoom
|
||||||
|
if pan and not delta['azimuth']:
|
||||||
|
pan = 0
|
||||||
|
if tilt and not delta['elevation']:
|
||||||
|
tilt = 0
|
||||||
|
if zoom and not delta['absoluteZoom']:
|
||||||
|
zoom = 0
|
||||||
|
|
||||||
|
move = {'pan': pan, 'tilt': tilt, 'zoom': zoom}
|
||||||
|
direction = {k: v >= 0 for k, v in delta.items()}
|
||||||
|
print(move, direction)
|
||||||
|
self.continuous(move)
|
||||||
|
n = 0
|
||||||
|
while sum(map(abs, move.values())):
|
||||||
|
n += 1
|
||||||
|
#print(current, delta, move)
|
||||||
|
current, delta = get_delta()
|
||||||
|
changed = False
|
||||||
|
if pan and (not delta['azimuth'] or (delta['azimuth'] >= 0) != direction['azimuth']):
|
||||||
|
pan = 0
|
||||||
|
changed = True
|
||||||
|
'''
|
||||||
|
if pan > 0:
|
||||||
|
pan = min(pan, delta['azimuth'])
|
||||||
|
change = True
|
||||||
|
elif pan < 0 and delta['azimuth'] < 0:
|
||||||
|
pan = max(pan, delta['azimuth'])
|
||||||
|
changed = True
|
||||||
|
'''
|
||||||
|
if tilt and (not delta['elevation'] or (delta['elevation'] >= 0) != direction['elevation']):
|
||||||
|
tilt = 0
|
||||||
|
changed = True
|
||||||
|
'''
|
||||||
|
if tilt > 0:
|
||||||
|
tilt = min(tilt, delta['elevation'])
|
||||||
|
change = True
|
||||||
|
elif tilt < 0 and delta['elevation'] < 0:
|
||||||
|
tilt = max(tilt, delta['elevation'])
|
||||||
|
changed = True
|
||||||
|
'''
|
||||||
|
if zoom and (not delta['absoluteZoom'] or (delta['absoluteZoom'] >= 0) != direction['absoluteZoom']):
|
||||||
|
zoom = 0
|
||||||
|
changed = True
|
||||||
|
|
||||||
|
if changed or not n % 500:
|
||||||
|
print('update move', move, current)
|
||||||
|
move = {'pan': pan, 'tilt': tilt, 'zoom': zoom}
|
||||||
|
self.continuous(self.STOP)
|
||||||
|
self.continuous(move)
|
||||||
|
if sum(map(abs, move.values())) and not self.abort:
|
||||||
|
time.sleep(0.1)
|
||||||
|
if self.abort:
|
||||||
|
self.continuous(self.STOP)
|
||||||
|
return
|
||||||
|
self.continuous(self.STOP)
|
||||||
|
print(time.time() - t0)
|
||||||
|
if zoom_last:
|
||||||
|
return self.goto(**goto_last)
|
||||||
|
else:
|
||||||
|
return get_delta()
|
||||||
|
|
||||||
|
def get_preset(self, id):
|
||||||
|
presets = self.get_presets(True)
|
||||||
|
if isinstance(id, str):
|
||||||
|
preset = [p for p in presets if p['name'] == id]
|
||||||
|
if not preset:
|
||||||
|
raise Exception('unknown preset %s' % id)
|
||||||
|
id = preset[0]['id']
|
||||||
|
else:
|
||||||
|
preset = [p for p in presets if p['id'] == id]
|
||||||
|
if not preset:
|
||||||
|
raise Exception('unknown preset %s' % id)
|
||||||
|
preset = preset[0]
|
||||||
|
return preset
|
||||||
|
|
||||||
|
def absolute(self, elevation, azimuth, absoluteZoom):
|
||||||
|
cmd = {
|
||||||
|
'AbsoluteHigh': {
|
||||||
|
'elevation': elevation,
|
||||||
|
'azimuth': azimuth,
|
||||||
|
'absoluteZoom': absoluteZoom
|
||||||
|
}
|
||||||
|
}
|
||||||
|
print('!!', cmd)
|
||||||
|
r = self.put('absolute', cmd)
|
||||||
|
if '<statusCode>1</statusCode>' not in r:
|
||||||
|
print(r)
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
def get_presets_xml(self):
|
||||||
|
return self.get('presets')
|
||||||
|
|
||||||
|
|
||||||
|
def get_presets(self, details=False):
|
||||||
|
system_presets = list(range(33, 47)) + list(range(90, 106))
|
||||||
|
presets = etree_to_list(xml.etree.ElementTree.fromstring(self.get('presets')))
|
||||||
|
presets = [k['PTZPreset'] for k in presets if k['PTZPreset']['id'] not in system_presets]
|
||||||
|
for preset in presets:
|
||||||
|
del preset['enabled']
|
||||||
|
if not details:
|
||||||
|
del preset['AbsoluteHigh']
|
||||||
|
else:
|
||||||
|
preset['position'] = preset.pop('AbsoluteHigh')
|
||||||
|
preset['name'] = preset.pop('presetName')
|
||||||
|
return presets
|
||||||
|
|
||||||
|
#/PTZCtrl/channels/<ID>/patterns/<ID>/recordstart
|
||||||
|
#/PTZCtrl/channels/<ID>/patterns/<ID>/recordstop
|
||||||
|
|
||||||
|
|
||||||
|
cam = Camera()
|
228
server.py
Normal file
|
@ -0,0 +1,228 @@
|
||||||
|
from functools import wraps
|
||||||
|
from urllib.parse import unquote
|
||||||
|
import json
|
||||||
|
import logging
|
||||||
|
import os
|
||||||
|
import queue
|
||||||
|
import shutil
|
||||||
|
import threading
|
||||||
|
import time
|
||||||
|
|
||||||
|
import requests
|
||||||
|
from tornado.httpserver import HTTPServer
|
||||||
|
from tornado.ioloop import IOLoop
|
||||||
|
from tornado.web import StaticFileHandler, Application, HTTPError
|
||||||
|
import tornado.gen
|
||||||
|
import tornado.web
|
||||||
|
|
||||||
|
|
||||||
|
from action import Camera
|
||||||
|
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
STATIC_PATH = 'static'
|
||||||
|
PORT = 8000
|
||||||
|
ADDRESS = '127.0.0.1'
|
||||||
|
|
||||||
|
with open('camera.json') as fd:
|
||||||
|
CAMERA = json.load(fd)
|
||||||
|
|
||||||
|
state = {
|
||||||
|
'time': {},
|
||||||
|
'status': 'Idle'
|
||||||
|
}
|
||||||
|
|
||||||
|
def run_async(func):
|
||||||
|
@wraps(func)
|
||||||
|
def async_func(*args, **kwargs):
|
||||||
|
func_hl = Thread(target=func, args=args, kwargs=kwargs)
|
||||||
|
func_hl.start()
|
||||||
|
return func_hl
|
||||||
|
|
||||||
|
return async_func
|
||||||
|
|
||||||
|
def _to_json(python_object):
|
||||||
|
if isinstance(python_object, datetime.datetime):
|
||||||
|
if python_object.year < 1900:
|
||||||
|
tt = python_object.timetuple()
|
||||||
|
return '%d-%02d-%02dT%02d:%02d%02dZ' % tuple(list(tt)[:6])
|
||||||
|
return python_object.strftime('%Y-%m-%dT%H:%M:%SZ')
|
||||||
|
raise TypeError('%s %s is not JSON serializable' % (repr(python_object), type(python_object)))
|
||||||
|
|
||||||
|
def json_dumps(obj):
|
||||||
|
return json.dumps(obj, indent=4, default=_to_json, ensure_ascii=False, sort_keys=True).encode()
|
||||||
|
|
||||||
|
class ControlQueue:
|
||||||
|
shutdown = False
|
||||||
|
|
||||||
|
def worker(self):
|
||||||
|
while True:
|
||||||
|
item = self.q.get()
|
||||||
|
if item is None or self.shutdown:
|
||||||
|
break
|
||||||
|
state['status'] = 'Active'
|
||||||
|
self.camera.sequence(**item)
|
||||||
|
if self.camera.abort:
|
||||||
|
self.camera.abort = False
|
||||||
|
state['status'] = 'Idle'
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.q = queue.Queue()
|
||||||
|
self.camera = Camera(**CAMERA)
|
||||||
|
self._worker = threading.Thread(target=self.worker)
|
||||||
|
self._worker.start()
|
||||||
|
|
||||||
|
def put(self, filename):
|
||||||
|
self.q.put(filename)
|
||||||
|
|
||||||
|
def join(self):
|
||||||
|
self.shutdown = True
|
||||||
|
self.camera.abort = True
|
||||||
|
# block until all tasks are done
|
||||||
|
self.q.join()
|
||||||
|
|
||||||
|
self.q.put(None)
|
||||||
|
self._worker.join()
|
||||||
|
|
||||||
|
|
||||||
|
class API(object):
|
||||||
|
|
||||||
|
def __call__(self, method, kwargs):
|
||||||
|
return getattr(self, method)(**kwargs)
|
||||||
|
|
||||||
|
def getPresets(self, **data):
|
||||||
|
result = {}
|
||||||
|
result['presets'] = ctl.camera.get_presets(True)
|
||||||
|
return result
|
||||||
|
|
||||||
|
def camera(self, **data):
|
||||||
|
result = {}
|
||||||
|
for key, value in data.items():
|
||||||
|
getattr(ctl.camera, key)(**value)
|
||||||
|
return result
|
||||||
|
|
||||||
|
def run(self, **data):
|
||||||
|
result = {}
|
||||||
|
ctl.put(data)
|
||||||
|
return result
|
||||||
|
|
||||||
|
def stop(self, **data):
|
||||||
|
result = {}
|
||||||
|
ctl.camera.abort = True
|
||||||
|
ctl.camera.continuous(ctl.camera.STOP)
|
||||||
|
return result
|
||||||
|
|
||||||
|
def status(self, **data):
|
||||||
|
result = {}
|
||||||
|
result['time'] = ctl.camera.segment_times
|
||||||
|
result['status'] = state['status']
|
||||||
|
if result['status'] == 'Active':
|
||||||
|
if ctl.camera.sequence_start:
|
||||||
|
result['duration'] = int(time.time() - ctl.camera.sequence_start)
|
||||||
|
else:
|
||||||
|
result['duration'] = '...'
|
||||||
|
result['next'] = ctl.camera.next_target
|
||||||
|
else:
|
||||||
|
result['duration'] = ctl.camera.sequence_time
|
||||||
|
result['position'] = ctl.camera.last_position
|
||||||
|
return result
|
||||||
|
|
||||||
|
#@run_async
|
||||||
|
def api_task(request, callback):
|
||||||
|
api = API()
|
||||||
|
response = {
|
||||||
|
'result': api(request['method'], request.get('params', {}))
|
||||||
|
}
|
||||||
|
callback(response)
|
||||||
|
|
||||||
|
class RPCHandler(tornado.web.RequestHandler):
|
||||||
|
|
||||||
|
def get(self):
|
||||||
|
self.write(BANNER)
|
||||||
|
|
||||||
|
@tornado.gen.coroutine
|
||||||
|
def post(self):
|
||||||
|
error = None
|
||||||
|
request = None
|
||||||
|
try:
|
||||||
|
request = json.loads(self.request.body.decode())
|
||||||
|
if request['method'][0] == '_' or not hasattr(API, request['method']):
|
||||||
|
raise Exception('unknown method')
|
||||||
|
except:
|
||||||
|
error = {'error': {'code': -32700, 'message': 'Parse error'}}
|
||||||
|
if not error:
|
||||||
|
try:
|
||||||
|
response = yield tornado.gen.Task(api_task, request)
|
||||||
|
except:
|
||||||
|
logger.error("ERROR: %s", request, exc_info=True)
|
||||||
|
error = {'error': {'code': -32000, 'message': 'Server error'}}
|
||||||
|
if error:
|
||||||
|
response = error
|
||||||
|
if request and 'id' in request:
|
||||||
|
response['id'] = request['id']
|
||||||
|
response['jsonrpc'] = '2.0'
|
||||||
|
response = json_dumps(response)
|
||||||
|
self.write(response)
|
||||||
|
|
||||||
|
def prepare(encoding):
|
||||||
|
if not os.path.exists(settings['prefix']):
|
||||||
|
print('please create "%s" and start again' % settings['prefix'])
|
||||||
|
sys.exit(1)
|
||||||
|
index = os.path.join(settings['prefix'], 'index.html')
|
||||||
|
if not os.path.exists(index):
|
||||||
|
try:
|
||||||
|
with open(index, 'w') as fd:
|
||||||
|
fd.write(BANNER_PUBLIC)
|
||||||
|
except:
|
||||||
|
print('can not write to "%s"' % settings['prefix'])
|
||||||
|
sys.exit(1)
|
||||||
|
load_files(encoding)
|
||||||
|
registered = False
|
||||||
|
while not registered:
|
||||||
|
try:
|
||||||
|
register_server()
|
||||||
|
except:
|
||||||
|
logging.error('failed to register')
|
||||||
|
time.sleep(10)
|
||||||
|
registered = True
|
||||||
|
|
||||||
|
class MainHandler(tornado.web.RequestHandler):
|
||||||
|
|
||||||
|
def get(self, path):
|
||||||
|
path = os.path.join(STATIC_PATH, 'index.html')
|
||||||
|
with open(path) as fd:
|
||||||
|
content = fd.read()
|
||||||
|
self.set_header('Content-Type', 'text/html')
|
||||||
|
self.set_header('Content-Length', str(len(content)))
|
||||||
|
self.set_header('Cache-Control', 'no-cache, no-store, must-revalidate')
|
||||||
|
self.set_header('Pragma', 'no-cache')
|
||||||
|
self.set_header('Expires', '0')
|
||||||
|
self.write(content)
|
||||||
|
|
||||||
|
def main():
|
||||||
|
global ctl
|
||||||
|
ctl = ControlQueue()
|
||||||
|
handlers = [
|
||||||
|
(r'/api/', RPCHandler),
|
||||||
|
(r'/static/(.*)', StaticFileHandler, {'path': STATIC_PATH}),
|
||||||
|
(r"(.*)", MainHandler),
|
||||||
|
]
|
||||||
|
|
||||||
|
options = {
|
||||||
|
'debug': False,
|
||||||
|
'gzip': True,
|
||||||
|
}
|
||||||
|
app = Application(handlers, **options)
|
||||||
|
app.listen(PORT, ADDRESS)
|
||||||
|
|
||||||
|
main = IOLoop.instance()
|
||||||
|
try:
|
||||||
|
main.start()
|
||||||
|
except:
|
||||||
|
print('shutting down...')
|
||||||
|
ctl.join()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
210
static/css/campcamcontrol.css
Normal file
|
@ -0,0 +1,210 @@
|
||||||
|
@import url('../sg/slick-default-theme.css');
|
||||||
|
|
||||||
|
* {
|
||||||
|
font-family: arial;
|
||||||
|
font-size: 8pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
padding: 0;
|
||||||
|
margin: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
font-size: 10pt;
|
||||||
|
border-bottom: 1px dotted gray;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul {
|
||||||
|
margin-left: 0;
|
||||||
|
padding: 0;
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
|
||||||
|
li {
|
||||||
|
background: url("../../sg/images/arrow_right_spearmint.png") no-repeat center left;
|
||||||
|
padding: 0 0 0 14px;
|
||||||
|
|
||||||
|
list-style: none;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#myGrid {
|
||||||
|
background: white;
|
||||||
|
outline: 0;
|
||||||
|
border: 1px solid gray;
|
||||||
|
}
|
||||||
|
|
||||||
|
.grid-header {
|
||||||
|
border: 1px solid gray;
|
||||||
|
border-bottom: 0;
|
||||||
|
border-top: 0;
|
||||||
|
background: url('../sg/images/header-bg.gif') repeat-x center top;
|
||||||
|
color: black;
|
||||||
|
height: 24px;
|
||||||
|
line-height: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.grid-header label {
|
||||||
|
display: inline-block;
|
||||||
|
font-weight: bold;
|
||||||
|
margin: auto auto auto 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.grid-header .ui-icon {
|
||||||
|
margin: 4px 4px auto 6px;
|
||||||
|
background-color: transparent;
|
||||||
|
border-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.grid-header .ui-icon.ui-state-hover {
|
||||||
|
background-color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.grid-header #txtSearch {
|
||||||
|
margin: 0 4px 0 4px;
|
||||||
|
padding: 2px 2px;
|
||||||
|
-moz-border-radius: 2px;
|
||||||
|
-webkit-border-radius: 2px;
|
||||||
|
border: 1px solid silver;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Individual cell styles */
|
||||||
|
.slick-cell.task-name {
|
||||||
|
font-weight: bold;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slick-cell.task-percent {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slick-cell.cell-move-handle {
|
||||||
|
font-weight: bold;
|
||||||
|
text-align: right;
|
||||||
|
border-right: solid gray;
|
||||||
|
|
||||||
|
background: #efefef;
|
||||||
|
cursor: move;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cell-move-handle:hover {
|
||||||
|
background: #b6b9bd;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slick-row.selected .cell-move-handle {
|
||||||
|
background: #D5DC8D;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slick-row .cell-actions {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slick-row.complete {
|
||||||
|
background-color: #DFD;
|
||||||
|
color: #555;
|
||||||
|
}
|
||||||
|
|
||||||
|
.percent-complete-bar {
|
||||||
|
display: inline-block;
|
||||||
|
height: 6px;
|
||||||
|
-moz-border-radius: 3px;
|
||||||
|
-webkit-border-radius: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Slick.Editors.Text, Slick.Editors.Date */
|
||||||
|
input.editor-text {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
border: 0;
|
||||||
|
margin: 0;
|
||||||
|
background: transparent;
|
||||||
|
outline: 0;
|
||||||
|
padding: 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui-datepicker-trigger {
|
||||||
|
margin-top: 2px;
|
||||||
|
padding: 0;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Slick.Editors.PercentComplete */
|
||||||
|
input.editor-percentcomplete {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
border: 0;
|
||||||
|
margin: 0;
|
||||||
|
background: transparent;
|
||||||
|
outline: 0;
|
||||||
|
padding: 0;
|
||||||
|
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.editor-percentcomplete-picker {
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
width: 16px;
|
||||||
|
height: 100%;
|
||||||
|
background: url("../sg/images/pencil.gif") no-repeat center center;
|
||||||
|
overflow: visible;
|
||||||
|
z-index: 1000;
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.editor-percentcomplete-helper {
|
||||||
|
border: 0 solid gray;
|
||||||
|
position: absolute;
|
||||||
|
top: -2px;
|
||||||
|
left: -9px;
|
||||||
|
background: url("../sg/images/editor-helper-bg.gif") no-repeat top left;
|
||||||
|
padding-left: 9px;
|
||||||
|
|
||||||
|
width: 120px;
|
||||||
|
height: 140px;
|
||||||
|
display: none;
|
||||||
|
overflow: visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
.editor-percentcomplete-wrapper {
|
||||||
|
background: beige;
|
||||||
|
padding: 20px 8px;
|
||||||
|
|
||||||
|
width: 100%;
|
||||||
|
height: 98px;
|
||||||
|
border: 1px solid gray;
|
||||||
|
border-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.editor-percentcomplete-buttons {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.editor-percentcomplete-buttons button {
|
||||||
|
width: 80px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.editor-percentcomplete-slider {
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.editor-percentcomplete-picker:hover .editor-percentcomplete-helper {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.editor-percentcomplete-helper:hover {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Slick.Editors.Checkbox */
|
||||||
|
input.editor-checkbox {
|
||||||
|
margin: 0;
|
||||||
|
height: 100%;
|
||||||
|
padding: 0;
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
126
static/index.html
Normal file
|
@ -0,0 +1,126 @@
|
||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<title>CAMP can capture canals</title>
|
||||||
|
<link rel="stylesheet" href="static/sg/slick.grid.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="static/sg/css/smoothness/jquery-ui-1.8.16.custom.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="static/css/cccc.css" type="text/css"/>
|
||||||
|
<style>
|
||||||
|
.cell-title {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cell-status {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.cell-reorder {
|
||||||
|
cursor: move;
|
||||||
|
background: url("static/sg/images/drag-handle.png") no-repeat center center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cell-selection {
|
||||||
|
border-right-color: silver;
|
||||||
|
border-right-style: solid;
|
||||||
|
background: #f5f5f5;
|
||||||
|
color: gray;
|
||||||
|
text-align: right;
|
||||||
|
font-size: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slick-row.selected .cell-selection {
|
||||||
|
background-color: transparent; /* show default selected row background */
|
||||||
|
}
|
||||||
|
|
||||||
|
.recycle-bin {
|
||||||
|
width: 120px;
|
||||||
|
border: 1px solid gray;
|
||||||
|
background: beige;
|
||||||
|
padding: 4px;
|
||||||
|
font-size: 12pt;
|
||||||
|
font-weight: bold;
|
||||||
|
color: black;
|
||||||
|
text-align: center;
|
||||||
|
-moz-border-radius: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.red {
|
||||||
|
background: red;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bold {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
#myGrid {
|
||||||
|
width: 100%;
|
||||||
|
height: calc(100vh - 20px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.options-panel {
|
||||||
|
-moz-border-radius: 6px;
|
||||||
|
-webkit-border-radius: 6px;
|
||||||
|
border: 1px solid silver;
|
||||||
|
background: #f0f0f0;
|
||||||
|
padding: 4px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
width: 320px;
|
||||||
|
position: absolute;
|
||||||
|
top: 10px;
|
||||||
|
right: 30px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div>
|
||||||
|
<div style="width: calc(100vw - 30px - 320px - 30px)">
|
||||||
|
<div id="myGrid"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="options-panel">
|
||||||
|
<h2>CAMP cam canal:</h2>
|
||||||
|
<ul>
|
||||||
|
<li><button class="run">run</button></li>
|
||||||
|
<li><button class="goto">go to selected</button></li>
|
||||||
|
<li><button class="run_from">run from selected</button></li>
|
||||||
|
<li><button class="continue_from">continue to selected</button></li>
|
||||||
|
<li><button class="stop">stop</button></li>
|
||||||
|
</ul>
|
||||||
|
<h2>Status:</h2>
|
||||||
|
<li id="status">Idle</li>
|
||||||
|
<li id="duration"></li>
|
||||||
|
<li id="position"></li>
|
||||||
|
<li id="next"></li>
|
||||||
|
<h2>Edit:</h2>
|
||||||
|
<li><button class="delete">delete row</button></li>
|
||||||
|
<li><button class="insert">insert row</button></li>
|
||||||
|
<li><button class="all_presets">load all presets</button></li>
|
||||||
|
<li>Global Speed: <input type="text" style="width:30px" value="20" class="default_speed"><button class="set_speed">set</button></li>
|
||||||
|
<h2>Export:</h2>
|
||||||
|
<li><a><button class="export_sequence">export sequence</button></a></li>
|
||||||
|
<li><a><button class="export_presets">export presets</button></a></li>
|
||||||
|
<h2>Import:</h2>
|
||||||
|
<li><input class="import_sequence" type="file">import sequence</input></li>
|
||||||
|
<li><input class="import_presets" type="file">import presets</input></li>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="static/sg/lib/jquery-1.7.min.js"></script>
|
||||||
|
<script src="static/sg/lib/jquery-ui-1.8.16.custom.min.js"></script>
|
||||||
|
<script src="static/sg/lib/jquery.event.drag-2.2.js"></script>
|
||||||
|
<script src="static/sg/lib/jquery.event.drop-2.2.js"></script>
|
||||||
|
|
||||||
|
<script src="static/sg/slick.core.js"></script>
|
||||||
|
<script src="static/sg/plugins/slick.cellrangedecorator.js"></script>
|
||||||
|
<script src="static/sg/plugins/slick.cellrangeselector.js"></script>
|
||||||
|
<script src="static/sg/plugins/slick.cellselectionmodel.js"></script>
|
||||||
|
<script src="static/sg/plugins/slick.rowmovemanager.js"></script>
|
||||||
|
<script src="static/sg/slick.formatters.js"></script>
|
||||||
|
<script src="static/sg/slick.editors.js"></script>
|
||||||
|
<script src="static/sg/slick.grid.js"></script>
|
||||||
|
|
||||||
|
<script src="static/js/campcamcontrol.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
498
static/js/cccc.js
Normal file
|
@ -0,0 +1,498 @@
|
||||||
|
function uuidv4() {
|
||||||
|
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
|
||||||
|
var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
|
||||||
|
return v.toString(16);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function api(method, params, callback) {
|
||||||
|
var request = new XMLHttpRequest()
|
||||||
|
request.addEventListener('load', function (event) {
|
||||||
|
var response
|
||||||
|
try {
|
||||||
|
response = JSON.parse(event.target.responseText)
|
||||||
|
} catch(e) {
|
||||||
|
response = {
|
||||||
|
error: {code: -32700, message: 'Parse error'}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
callback && callback(response)
|
||||||
|
}, false)
|
||||||
|
request.addEventListener('error', function (evt) {
|
||||||
|
callback && callback({error: {code: -32000, message: 'Server error'}})
|
||||||
|
}, false)
|
||||||
|
request.open('POST', '/api/')
|
||||||
|
request.setRequestHeader('Content-type', 'application/json')
|
||||||
|
request.send(JSON.stringify(
|
||||||
|
{method: method, params: params, jsonrpc: '2.0'}
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function requiredFieldValidator(value) {
|
||||||
|
if (value == null || value == undefined || !value.length) {
|
||||||
|
return {valid: false, msg: "This is a required field"};
|
||||||
|
} else {
|
||||||
|
return {valid: true, msg: null};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function isInt(value) {
|
||||||
|
return !isNaN(value) &&
|
||||||
|
parseInt(Number(value)) == value &&
|
||||||
|
!isNaN(parseInt(value, 10));
|
||||||
|
}
|
||||||
|
|
||||||
|
function integerValidator(value) {
|
||||||
|
if (value == null || value == undefined || !value.length || !isInt(value)) {
|
||||||
|
return {valid: false, msg: "Value must be a number"};
|
||||||
|
} else {
|
||||||
|
return {valid: true, msg: null};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var presets = [];
|
||||||
|
|
||||||
|
function PresetEditor(args) {
|
||||||
|
var $preset;
|
||||||
|
var scope = this;
|
||||||
|
|
||||||
|
this.init = function () {
|
||||||
|
var options = ''
|
||||||
|
presets.forEach(function(preset) {
|
||||||
|
options += '<option value="'+preset.id+'">' + preset.id + ': ' + preset.name + '</option>';
|
||||||
|
})
|
||||||
|
$preset = $('<select name="preset-editor">' + options + '</select>')
|
||||||
|
.appendTo(args.container);
|
||||||
|
scope.focus();
|
||||||
|
};
|
||||||
|
|
||||||
|
this.destroy = function () {
|
||||||
|
$(args.container).empty();
|
||||||
|
};
|
||||||
|
|
||||||
|
this.focus = function () {
|
||||||
|
$preset.focus();
|
||||||
|
};
|
||||||
|
|
||||||
|
this.serializeValue = function () {
|
||||||
|
return parseInt($preset.val(), 10);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.applyValue = function (item, state) {
|
||||||
|
console.log('apply', item, state)
|
||||||
|
item.preset = state;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.loadValue = function (item) {
|
||||||
|
$preset.val(item.preset);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.isValueChanged = function () {
|
||||||
|
return args.item.preset != parseInt($preset.val(), 10);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.validate = function () {
|
||||||
|
if (isNaN(parseInt($preset.val(), 10))) {
|
||||||
|
return {valid: false, msg: "Invalid preset."};
|
||||||
|
}
|
||||||
|
return {valid: true, msg: null};
|
||||||
|
};
|
||||||
|
|
||||||
|
this.init();
|
||||||
|
}
|
||||||
|
|
||||||
|
function PresetFormatter(row, cell, value, columnDef, dataContext) {
|
||||||
|
preset = presets.filter(function(preset) { return preset.id == value })[0];
|
||||||
|
if (preset) {
|
||||||
|
return preset.id + ': ' + preset.name;
|
||||||
|
} else {
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function formatNumber(number, decimals) {
|
||||||
|
var array = [],
|
||||||
|
abs = Math.abs(number),
|
||||||
|
split = abs.toFixed(decimals).split('.');
|
||||||
|
while (split[0]) {
|
||||||
|
array.unshift(split[0].slice(-3));
|
||||||
|
split[0] = split[0].slice(0, -3);
|
||||||
|
}
|
||||||
|
split[0] = array.join(',');
|
||||||
|
return (number < 0 ? '-' : '') + split.join('.');
|
||||||
|
};
|
||||||
|
|
||||||
|
function formatDuration(seconds) {
|
||||||
|
if (seconds == '...' || !seconds) {
|
||||||
|
return seconds
|
||||||
|
}
|
||||||
|
var values = [
|
||||||
|
Math.floor(seconds / 31536000),
|
||||||
|
Math.floor(seconds % 31536000 / 86400),
|
||||||
|
Math.floor(seconds % 86400 / 3600),
|
||||||
|
Math.floor(seconds % 3600 / 60),
|
||||||
|
formatNumber(seconds % 60, 3)
|
||||||
|
];
|
||||||
|
var labels = ['y', 'd', 'h', 'm', 's'];
|
||||||
|
var duration = '';
|
||||||
|
values.forEach(function(v, i) {
|
||||||
|
if (v) {
|
||||||
|
if (labels[i] == 's') {
|
||||||
|
v = v.replace('.', 's ').replace(' 000', '')
|
||||||
|
duration += v;
|
||||||
|
} else {
|
||||||
|
duration += v + labels[i] + ' ';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return duration
|
||||||
|
}
|
||||||
|
|
||||||
|
function formatTime(row, cell, value, columnDef, dataContext) {
|
||||||
|
var time = '';
|
||||||
|
if (row == 0) {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
if (data[row].duration) {
|
||||||
|
time = data.slice(0, row + 1).map(function(row) {
|
||||||
|
return row.duration || 0
|
||||||
|
}).reduce(function(a, b) { return a+b }, 0)
|
||||||
|
if (data[row].sleep) {
|
||||||
|
time -= data[row].sleep
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return formatDuration(time)
|
||||||
|
}
|
||||||
|
|
||||||
|
function CheckmarkFormatter(row, cell, value, columnDef, dataContext) {
|
||||||
|
return value ? "<img src='/static/sg/images/tick.png'>" : "";
|
||||||
|
}
|
||||||
|
|
||||||
|
function StatusFormatter(row, cell, value, columnDef, dataContext) {
|
||||||
|
return value ? "Next" : "";
|
||||||
|
}
|
||||||
|
|
||||||
|
var grid;
|
||||||
|
var data = [];
|
||||||
|
var nextStep;
|
||||||
|
var columns = [
|
||||||
|
{
|
||||||
|
id: "#",
|
||||||
|
name: "",
|
||||||
|
width: 10,
|
||||||
|
behavior: "selectAndMove",
|
||||||
|
selectable: false,
|
||||||
|
resizable: false,
|
||||||
|
cssClass: "cell-reorder dnd"
|
||||||
|
},
|
||||||
|
{id: "preset", name: "Preset", field: "preset", width: 180,
|
||||||
|
cssClass: "cell-title",
|
||||||
|
formatter: PresetFormatter,
|
||||||
|
editor: PresetEditor,
|
||||||
|
validator: requiredFieldValidator
|
||||||
|
},
|
||||||
|
{id: "speed", name: "Speed", field: "speed", editor: Slick.Editors.Integer, validator: integerValidator,
|
||||||
|
width: 60
|
||||||
|
},
|
||||||
|
{id: "sleep", name: "Sleep", field: "sleep", editor: Slick.Editors.Integer, validator: integerValidator,
|
||||||
|
width: 60
|
||||||
|
},
|
||||||
|
{id: "zoom", name: "Zoom Speed", field: "zoom", editor: Slick.Editors.Integer, validator: integerValidator, width: 75},
|
||||||
|
{id: "zoom_last", name: "Zoom Last", field: "zoom_last", cssClass: "cell-status", formatter: CheckmarkFormatter, editor: Slick.Editors.Checkbox, width: 60},
|
||||||
|
//{id: "duration", name: "Time", field: "duration", editor: Slick.Editors.Text, formatter: formatTime},
|
||||||
|
{id: "duration", name: "Time", field: "duration", formatter: formatTime},
|
||||||
|
{id: "status", name: "Status", width: 80, minWidth: 20, maxWidth: 80, cssClass: "cell-status", field: "status", formatter: StatusFormatter}
|
||||||
|
];
|
||||||
|
var options = {
|
||||||
|
editable: true,
|
||||||
|
enableAddRow: true,
|
||||||
|
enableCellNavigation: true,
|
||||||
|
asyncEditorLoading: false,
|
||||||
|
autoEdit: false
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
function loadData(sequence) {
|
||||||
|
data = sequence;
|
||||||
|
grid = new Slick.Grid("#myGrid", data, columns, options);
|
||||||
|
|
||||||
|
grid.setSelectionModel(new Slick.CellSelectionModel());
|
||||||
|
var moveRowsPlugin = new Slick.RowMoveManager({
|
||||||
|
cancelEditOnDrag: true
|
||||||
|
});
|
||||||
|
moveRowsPlugin.onBeforeMoveRows.subscribe(function (e, data) {
|
||||||
|
for (var i = 0; i < data.rows.length; i++) {
|
||||||
|
// no point in moving before or after itself
|
||||||
|
if (data.rows[i] == data.insertBefore || data.rows[i] == data.insertBefore - 1) {
|
||||||
|
e.stopPropagation();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
|
moveRowsPlugin.onMoveRows.subscribe(function (e, args) {
|
||||||
|
var extractedRows = [], left, right;
|
||||||
|
var rows = args.rows;
|
||||||
|
var insertBefore = args.insertBefore;
|
||||||
|
left = data.slice(0, insertBefore);
|
||||||
|
right = data.slice(insertBefore, data.length);
|
||||||
|
|
||||||
|
rows.sort(function(a,b) { return a-b; });
|
||||||
|
|
||||||
|
for (var i = 0; i < rows.length; i++) {
|
||||||
|
extractedRows.push(data[rows[i]]);
|
||||||
|
}
|
||||||
|
|
||||||
|
rows.reverse();
|
||||||
|
|
||||||
|
for (var i = 0; i < rows.length; i++) {
|
||||||
|
var row = rows[i];
|
||||||
|
if (row < insertBefore) {
|
||||||
|
left.splice(row, 1);
|
||||||
|
} else {
|
||||||
|
right.splice(row - insertBefore, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
data = left.concat(extractedRows.concat(right));
|
||||||
|
|
||||||
|
var selectedRows = [];
|
||||||
|
for (var i = 0; i < rows.length; i++)
|
||||||
|
selectedRows.push(left.length + i);
|
||||||
|
|
||||||
|
grid.resetActiveCell();
|
||||||
|
grid.setData(data);
|
||||||
|
grid.setSelectedRows(selectedRows);
|
||||||
|
grid.render();
|
||||||
|
});
|
||||||
|
|
||||||
|
grid.registerPlugin(moveRowsPlugin);
|
||||||
|
|
||||||
|
grid.onAddNewRow.subscribe(function (e, args) {
|
||||||
|
var item = args.item;
|
||||||
|
item.speed = item.speed || data[data.length-1].speed
|
||||||
|
item.sleep = item.sleep || 0
|
||||||
|
grid.invalidateRow(data.length);
|
||||||
|
data.push(item);
|
||||||
|
grid.updateRowCount();
|
||||||
|
grid.render();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function totalDuration() {
|
||||||
|
return data.map(function(row) {
|
||||||
|
return row.duration || 0
|
||||||
|
}).reduce(function(a, b) { return a+b }, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateStatus() {
|
||||||
|
api('status', {}, function(response) {
|
||||||
|
if (response.result) {
|
||||||
|
$('#status').html(response.result.status)
|
||||||
|
if (response.result.duration && response.result.status == 'Active') {
|
||||||
|
$('#duration').html(formatDuration(response.result.duration))
|
||||||
|
} else {
|
||||||
|
$('#duration').html(formatDuration(totalDuration()))
|
||||||
|
}
|
||||||
|
var update = false;
|
||||||
|
if (response.result.time) {
|
||||||
|
data.forEach(function(row) {
|
||||||
|
if (row.seqid in response.result.time && response.result.time[row.seqid] != row.duration) {
|
||||||
|
if (row.seqid == data[0].seqid || response.result.time[row.seqid]) {
|
||||||
|
console.log(row.duration, response.result.time[row.seqid]);
|
||||||
|
row.duration = response.result.time[row.seqid];
|
||||||
|
update = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
if (response.result.position) {
|
||||||
|
$('#position').html(JSON.stringify(response.result.position))
|
||||||
|
}
|
||||||
|
data.forEach(function(row) {
|
||||||
|
var s = (response.result.next && row.seqid == response.result.next.seqid);
|
||||||
|
if (row.status != s) {
|
||||||
|
update = true
|
||||||
|
row.status = s
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if (response.result.next) {
|
||||||
|
nextStep = response.result.next
|
||||||
|
if (response.result.next.seqid) {
|
||||||
|
delete response.result.next.seqid
|
||||||
|
}
|
||||||
|
if (response.result.next.duration) {
|
||||||
|
delete response.result.next.duration
|
||||||
|
}
|
||||||
|
$('#next').html(JSON.stringify(response.result.next))
|
||||||
|
}
|
||||||
|
if (update) {
|
||||||
|
grid.invalidate();
|
||||||
|
grid.render();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
data.forEach(function(seq) {
|
||||||
|
if (!seq.seqid) {
|
||||||
|
seq.seqid = uuidv4()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
localStorage.sequence = JSON.stringify(data)
|
||||||
|
|
||||||
|
var gotSelection = grid.getSelectedRows().length > 0
|
||||||
|
$('button.goto').attr({disabled: !gotSelection})
|
||||||
|
$('button.run_from').attr({disabled: !gotSelection})
|
||||||
|
$('button.continue_from').attr({disabled: !gotSelection})
|
||||||
|
$('button.insert').attr({disabled: !gotSelection})
|
||||||
|
$('button.delete').attr({disabled: !gotSelection})
|
||||||
|
}
|
||||||
|
|
||||||
|
$(function () {
|
||||||
|
api('getPresets', {}, function(response) {
|
||||||
|
presets = response.result.presets
|
||||||
|
loadData(JSON.parse(localStorage.sequence || '[]'))
|
||||||
|
updateStatus()
|
||||||
|
setInterval(updateStatus, 1000)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
function deleteRows() {
|
||||||
|
var result = confirm("Are you sure you want to delete " + grid.getSelectedRows().length + " row(s)?");
|
||||||
|
if (result) {
|
||||||
|
var rowsToDelete = grid.getSelectedRows().sort().reverse();
|
||||||
|
for (var i = 0; i < rowsToDelete.length; i++) {
|
||||||
|
data.splice(rowsToDelete[i], 1);
|
||||||
|
}
|
||||||
|
grid.invalidate();
|
||||||
|
grid.setSelectedRows([]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$('button.goto').on({click: function() {
|
||||||
|
var selected = grid.getSelectedRows()[0];
|
||||||
|
api('camera', {
|
||||||
|
'fast_preset': {id: data[selected].preset}
|
||||||
|
}, function(response) {
|
||||||
|
//console.log(response)
|
||||||
|
})
|
||||||
|
}})
|
||||||
|
$('button.run').on({click: function() {
|
||||||
|
data.forEach(function(seq) {
|
||||||
|
if (!seq.seqid) {
|
||||||
|
seq.seqid = uuidv4()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
api('run', {
|
||||||
|
'steps': data
|
||||||
|
}, function(response) {
|
||||||
|
//console.log(response)
|
||||||
|
})
|
||||||
|
}})
|
||||||
|
$('button.run_from').on({click: function() {
|
||||||
|
var selected = grid.getSelectedRows()[0];
|
||||||
|
api('run', {
|
||||||
|
'steps': data.slice(selected)
|
||||||
|
}, function(response) {
|
||||||
|
//console.log(response)
|
||||||
|
})
|
||||||
|
}})
|
||||||
|
$('button.continue_from').on({click: function() {
|
||||||
|
var selected = grid.getSelectedRows()[0];
|
||||||
|
api('run', {
|
||||||
|
'steps': data.slice(selected),
|
||||||
|
'goto_first': false
|
||||||
|
}, function(response) {
|
||||||
|
console.log(response)
|
||||||
|
})
|
||||||
|
}})
|
||||||
|
$('button.stop').on({click: function() {
|
||||||
|
api('stop', {}, function(response) {
|
||||||
|
if (nextStep && grid.getSelectedRows().length == 0) {
|
||||||
|
var selected = data.map(function(row) { return row.preset }).indexOf(nextStep.preset)
|
||||||
|
grid.setSelectedRows([selected]);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}})
|
||||||
|
$('button.delete').on({click: deleteRows})
|
||||||
|
$('button.insert').on({click: function() {
|
||||||
|
var selected = grid.getSelectedRows()[0];
|
||||||
|
data.splice(selected, 0, {
|
||||||
|
preset: data[selected].preset,
|
||||||
|
speed: data[selected].speed,
|
||||||
|
seqid: uuidv4()
|
||||||
|
});
|
||||||
|
grid.invalidate();
|
||||||
|
grid.setSelectedRows([selected+1]);
|
||||||
|
}})
|
||||||
|
$('button.set_speed').on({click: function() {
|
||||||
|
var speed = parseInt($('input.default_speed').val(), 10)
|
||||||
|
data.forEach(function(row) {
|
||||||
|
row.speed = speed
|
||||||
|
})
|
||||||
|
grid.invalidate()
|
||||||
|
|
||||||
|
}})
|
||||||
|
|
||||||
|
function textBlob(data) {
|
||||||
|
var byteNumbers = new Array(data.length);
|
||||||
|
for (var i = 0; i < data.length; i++) {
|
||||||
|
byteNumbers[i] = data.charCodeAt(i);
|
||||||
|
}
|
||||||
|
var byteArray = new Uint8Array(byteNumbers);
|
||||||
|
var blob = new Blob([byteArray], {type: 'text/plain; charset=utf-8'});
|
||||||
|
return blob;
|
||||||
|
}
|
||||||
|
|
||||||
|
function exportSequence() {
|
||||||
|
return data.map(function(row) {
|
||||||
|
var r = {};
|
||||||
|
Object.keys(row).forEach(function(key) {
|
||||||
|
if (['status'].indexOf(key) == -1) {
|
||||||
|
r[key] = row[key];
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return r
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
$('button.export_sequence').on({click: function() {
|
||||||
|
data.forEach(function(seq) {
|
||||||
|
if (!seq.seqid) {
|
||||||
|
seq.seqid = uuidv4()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
var blob = textBlob(JSON.stringify(exportSequence(), null, ' '))
|
||||||
|
var url = window.URL.createObjectURL(blob);
|
||||||
|
$(this).parent().attr({
|
||||||
|
href: url, download: 'sequence.json'
|
||||||
|
});
|
||||||
|
}})
|
||||||
|
|
||||||
|
$('button.export_presets').on({click: function() {
|
||||||
|
var blob = textBlob(JSON.stringify(presets, null, ' '))
|
||||||
|
var url = window.URL.createObjectURL(blob);
|
||||||
|
$(this).parent().attr({
|
||||||
|
href: url, download: 'presets.json'
|
||||||
|
});
|
||||||
|
}})
|
||||||
|
$('button.all_presets').on({click: function() {
|
||||||
|
loadData(presets.map(function(preset) {
|
||||||
|
return {
|
||||||
|
preset: preset.id,
|
||||||
|
speed: 20
|
||||||
|
}
|
||||||
|
}))
|
||||||
|
}})
|
||||||
|
|
||||||
|
$('input.import_sequence').on({change: function() {
|
||||||
|
var reader = new FileReader()
|
||||||
|
reader.onload = function(event) {
|
||||||
|
localStorage.sequence = reader.result
|
||||||
|
loadData(JSON.parse(reader.result))
|
||||||
|
}
|
||||||
|
reader.readAsText(this.files[0]);
|
||||||
|
}})
|
||||||
|
$('input.import_presets').on({change: function() {
|
||||||
|
console.log('import', this)
|
||||||
|
}})
|
20
static/sg/MIT-LICENSE.txt
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
Copyright (c) 2010 Michael Leibman, http://github.com/mleibman/slickgrid
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
"Software"), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be
|
||||||
|
included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
27
static/sg/README.md
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
# Welcome to SlickGrid
|
||||||
|
|
||||||
|
Find documentation and examples in [the wiki](https://github.com/mleibman/SlickGrid/wiki).
|
||||||
|
|
||||||
|
|
||||||
|
**UPDATE: March 5th, 2014 - I have too many things going on in my life right now to really give SlickGrid support and development the time and attention it deserves. I am not stopping it, but I will most likely be unresponsive for some time. Sorry.**
|
||||||
|
|
||||||
|
**UPDATE: This repo hasn't been updated in a while. https://github.com/6pac/SlickGrid/wiki seems to be the most active fork at the moment.**
|
||||||
|
|
||||||
|
## SlickGrid is an advanced JavaScript grid/spreadsheet component
|
||||||
|
|
||||||
|
Some highlights:
|
||||||
|
|
||||||
|
* Adaptive virtual scrolling (handle hundreds of thousands of rows with extreme responsiveness)
|
||||||
|
* Extremely fast rendering speed
|
||||||
|
* Supports jQuery UI Themes
|
||||||
|
* Background post-rendering for richer cells
|
||||||
|
* Configurable & customizable
|
||||||
|
* Full keyboard navigation
|
||||||
|
* Column resize/reorder/show/hide
|
||||||
|
* Column autosizing & force-fit
|
||||||
|
* Pluggable cell formatters & editors
|
||||||
|
* Support for editing and creating new rows.
|
||||||
|
* Grouping, filtering, custom aggregators, and more!
|
||||||
|
* Advanced detached & multi-field editors with undo/redo support.
|
||||||
|
* “GlobalEditorLock” to manage concurrent edits in cases where multiple Views on a page can edit the same data.
|
||||||
|
* Support for [millions of rows](http://stackoverflow.com/a/2569488/1269037)
|
31
static/sg/controls/slick.columnpicker.css
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
.slick-columnpicker {
|
||||||
|
border: 1px solid #718BB7;
|
||||||
|
background: #f0f0f0;
|
||||||
|
padding: 6px;
|
||||||
|
-moz-box-shadow: 2px 2px 2px silver;
|
||||||
|
-webkit-box-shadow: 2px 2px 2px silver;
|
||||||
|
box-shadow: 2px 2px 2px silver;
|
||||||
|
min-width: 100px;
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slick-columnpicker li {
|
||||||
|
list-style: none;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
background: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slick-columnpicker input {
|
||||||
|
margin: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slick-columnpicker li a {
|
||||||
|
display: block;
|
||||||
|
padding: 4px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slick-columnpicker li a:hover {
|
||||||
|
background: white;
|
||||||
|
}
|
152
static/sg/controls/slick.columnpicker.js
vendored
Normal file
|
@ -0,0 +1,152 @@
|
||||||
|
(function ($) {
|
||||||
|
function SlickColumnPicker(columns, grid, options) {
|
||||||
|
var $menu;
|
||||||
|
var columnCheckboxes;
|
||||||
|
|
||||||
|
var defaults = {
|
||||||
|
fadeSpeed:250
|
||||||
|
};
|
||||||
|
|
||||||
|
function init() {
|
||||||
|
grid.onHeaderContextMenu.subscribe(handleHeaderContextMenu);
|
||||||
|
grid.onColumnsReordered.subscribe(updateColumnOrder);
|
||||||
|
options = $.extend({}, defaults, options);
|
||||||
|
|
||||||
|
$menu = $("<span class='slick-columnpicker' style='display:none;position:absolute;z-index:20;' />").appendTo(document.body);
|
||||||
|
|
||||||
|
$menu.bind("mouseleave", function (e) {
|
||||||
|
$(this).fadeOut(options.fadeSpeed)
|
||||||
|
});
|
||||||
|
$menu.bind("click", updateColumn);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function destroy() {
|
||||||
|
grid.onHeaderContextMenu.unsubscribe(handleHeaderContextMenu);
|
||||||
|
grid.onColumnsReordered.unsubscribe(updateColumnOrder);
|
||||||
|
$menu.remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleHeaderContextMenu(e, args) {
|
||||||
|
e.preventDefault();
|
||||||
|
$menu.empty();
|
||||||
|
updateColumnOrder();
|
||||||
|
columnCheckboxes = [];
|
||||||
|
|
||||||
|
var $li, $input;
|
||||||
|
for (var i = 0; i < columns.length; i++) {
|
||||||
|
$li = $("<li />").appendTo($menu);
|
||||||
|
$input = $("<input type='checkbox' />").data("column-id", columns[i].id);
|
||||||
|
columnCheckboxes.push($input);
|
||||||
|
|
||||||
|
if (grid.getColumnIndex(columns[i].id) != null) {
|
||||||
|
$input.attr("checked", "checked");
|
||||||
|
}
|
||||||
|
|
||||||
|
$("<label />")
|
||||||
|
.text(columns[i].name)
|
||||||
|
.prepend($input)
|
||||||
|
.appendTo($li);
|
||||||
|
}
|
||||||
|
|
||||||
|
$("<hr/>").appendTo($menu);
|
||||||
|
$li = $("<li />").appendTo($menu);
|
||||||
|
$input = $("<input type='checkbox' />").data("option", "autoresize");
|
||||||
|
$("<label />")
|
||||||
|
.text("Force fit columns")
|
||||||
|
.prepend($input)
|
||||||
|
.appendTo($li);
|
||||||
|
if (grid.getOptions().forceFitColumns) {
|
||||||
|
$input.attr("checked", "checked");
|
||||||
|
}
|
||||||
|
|
||||||
|
$li = $("<li />").appendTo($menu);
|
||||||
|
$input = $("<input type='checkbox' />").data("option", "syncresize");
|
||||||
|
$("<label />")
|
||||||
|
.text("Synchronous resize")
|
||||||
|
.prepend($input)
|
||||||
|
.appendTo($li);
|
||||||
|
if (grid.getOptions().syncColumnCellResize) {
|
||||||
|
$input.attr("checked", "checked");
|
||||||
|
}
|
||||||
|
|
||||||
|
$menu
|
||||||
|
.css("top", e.pageY - 10)
|
||||||
|
.css("left", e.pageX - 10)
|
||||||
|
.fadeIn(options.fadeSpeed);
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateColumnOrder() {
|
||||||
|
// Because columns can be reordered, we have to update the `columns`
|
||||||
|
// to reflect the new order, however we can't just take `grid.getColumns()`,
|
||||||
|
// as it does not include columns currently hidden by the picker.
|
||||||
|
// We create a new `columns` structure by leaving currently-hidden
|
||||||
|
// columns in their original ordinal position and interleaving the results
|
||||||
|
// of the current column sort.
|
||||||
|
var current = grid.getColumns().slice(0);
|
||||||
|
var ordered = new Array(columns.length);
|
||||||
|
for (var i = 0; i < ordered.length; i++) {
|
||||||
|
if ( grid.getColumnIndex(columns[i].id) === undefined ) {
|
||||||
|
// If the column doesn't return a value from getColumnIndex,
|
||||||
|
// it is hidden. Leave it in this position.
|
||||||
|
ordered[i] = columns[i];
|
||||||
|
} else {
|
||||||
|
// Otherwise, grab the next visible column.
|
||||||
|
ordered[i] = current.shift();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
columns = ordered;
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateColumn(e) {
|
||||||
|
if ($(e.target).data("option") == "autoresize") {
|
||||||
|
if (e.target.checked) {
|
||||||
|
grid.setOptions({forceFitColumns:true});
|
||||||
|
grid.autosizeColumns();
|
||||||
|
} else {
|
||||||
|
grid.setOptions({forceFitColumns:false});
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($(e.target).data("option") == "syncresize") {
|
||||||
|
if (e.target.checked) {
|
||||||
|
grid.setOptions({syncColumnCellResize:true});
|
||||||
|
} else {
|
||||||
|
grid.setOptions({syncColumnCellResize:false});
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($(e.target).is(":checkbox")) {
|
||||||
|
var visibleColumns = [];
|
||||||
|
$.each(columnCheckboxes, function (i, e) {
|
||||||
|
if ($(this).is(":checked")) {
|
||||||
|
visibleColumns.push(columns[i]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!visibleColumns.length) {
|
||||||
|
$(e.target).attr("checked", "checked");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
grid.setColumns(visibleColumns);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getAllColumns() {
|
||||||
|
return columns;
|
||||||
|
}
|
||||||
|
|
||||||
|
init();
|
||||||
|
|
||||||
|
return {
|
||||||
|
"getAllColumns": getAllColumns,
|
||||||
|
"destroy": destroy
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Slick.Controls.ColumnPicker
|
||||||
|
$.extend(true, window, { Slick:{ Controls:{ ColumnPicker:SlickColumnPicker }}});
|
||||||
|
})(jQuery);
|
41
static/sg/controls/slick.pager.css
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
.slick-pager {
|
||||||
|
width: 100%;
|
||||||
|
height: 26px;
|
||||||
|
border: 1px solid gray;
|
||||||
|
border-top: 0;
|
||||||
|
background: url('../images/header-columns-bg.gif') repeat-x center bottom;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slick-pager .slick-pager-status {
|
||||||
|
display: inline-block;
|
||||||
|
padding: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slick-pager .ui-icon-container {
|
||||||
|
display: inline-block;
|
||||||
|
margin: 2px;
|
||||||
|
border-color: gray;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slick-pager .slick-pager-nav {
|
||||||
|
display: inline-block;
|
||||||
|
float: left;
|
||||||
|
padding: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slick-pager .slick-pager-settings {
|
||||||
|
display: block;
|
||||||
|
float: right;
|
||||||
|
padding: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slick-pager .slick-pager-settings * {
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slick-pager .slick-pager-settings a {
|
||||||
|
padding: 2px;
|
||||||
|
text-decoration: underline;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
154
static/sg/controls/slick.pager.js
vendored
Normal file
|
@ -0,0 +1,154 @@
|
||||||
|
(function ($) {
|
||||||
|
function SlickGridPager(dataView, grid, $container) {
|
||||||
|
var $status;
|
||||||
|
|
||||||
|
function init() {
|
||||||
|
dataView.onPagingInfoChanged.subscribe(function (e, pagingInfo) {
|
||||||
|
updatePager(pagingInfo);
|
||||||
|
});
|
||||||
|
|
||||||
|
constructPagerUI();
|
||||||
|
updatePager(dataView.getPagingInfo());
|
||||||
|
}
|
||||||
|
|
||||||
|
function getNavState() {
|
||||||
|
var cannotLeaveEditMode = !Slick.GlobalEditorLock.commitCurrentEdit();
|
||||||
|
var pagingInfo = dataView.getPagingInfo();
|
||||||
|
var lastPage = pagingInfo.totalPages - 1;
|
||||||
|
|
||||||
|
return {
|
||||||
|
canGotoFirst: !cannotLeaveEditMode && pagingInfo.pageSize != 0 && pagingInfo.pageNum > 0,
|
||||||
|
canGotoLast: !cannotLeaveEditMode && pagingInfo.pageSize != 0 && pagingInfo.pageNum != lastPage,
|
||||||
|
canGotoPrev: !cannotLeaveEditMode && pagingInfo.pageSize != 0 && pagingInfo.pageNum > 0,
|
||||||
|
canGotoNext: !cannotLeaveEditMode && pagingInfo.pageSize != 0 && pagingInfo.pageNum < lastPage,
|
||||||
|
pagingInfo: pagingInfo
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function setPageSize(n) {
|
||||||
|
dataView.setRefreshHints({
|
||||||
|
isFilterUnchanged: true
|
||||||
|
});
|
||||||
|
dataView.setPagingOptions({pageSize: n});
|
||||||
|
}
|
||||||
|
|
||||||
|
function gotoFirst() {
|
||||||
|
if (getNavState().canGotoFirst) {
|
||||||
|
dataView.setPagingOptions({pageNum: 0});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function gotoLast() {
|
||||||
|
var state = getNavState();
|
||||||
|
if (state.canGotoLast) {
|
||||||
|
dataView.setPagingOptions({pageNum: state.pagingInfo.totalPages - 1});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function gotoPrev() {
|
||||||
|
var state = getNavState();
|
||||||
|
if (state.canGotoPrev) {
|
||||||
|
dataView.setPagingOptions({pageNum: state.pagingInfo.pageNum - 1});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function gotoNext() {
|
||||||
|
var state = getNavState();
|
||||||
|
if (state.canGotoNext) {
|
||||||
|
dataView.setPagingOptions({pageNum: state.pagingInfo.pageNum + 1});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function constructPagerUI() {
|
||||||
|
$container.empty();
|
||||||
|
|
||||||
|
var $nav = $("<span class='slick-pager-nav' />").appendTo($container);
|
||||||
|
var $settings = $("<span class='slick-pager-settings' />").appendTo($container);
|
||||||
|
$status = $("<span class='slick-pager-status' />").appendTo($container);
|
||||||
|
|
||||||
|
$settings
|
||||||
|
.append("<span class='slick-pager-settings-expanded' style='display:none'>Show: <a data=0>All</a><a data='-1'>Auto</a><a data=25>25</a><a data=50>50</a><a data=100>100</a></span>");
|
||||||
|
|
||||||
|
$settings.find("a[data]").click(function (e) {
|
||||||
|
var pagesize = $(e.target).attr("data");
|
||||||
|
if (pagesize != undefined) {
|
||||||
|
if (pagesize == -1) {
|
||||||
|
var vp = grid.getViewport();
|
||||||
|
setPageSize(vp.bottom - vp.top);
|
||||||
|
} else {
|
||||||
|
setPageSize(parseInt(pagesize));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var icon_prefix = "<span class='ui-state-default ui-corner-all ui-icon-container'><span class='ui-icon ";
|
||||||
|
var icon_suffix = "' /></span>";
|
||||||
|
|
||||||
|
$(icon_prefix + "ui-icon-lightbulb" + icon_suffix)
|
||||||
|
.click(function () {
|
||||||
|
$(".slick-pager-settings-expanded").toggle()
|
||||||
|
})
|
||||||
|
.appendTo($settings);
|
||||||
|
|
||||||
|
$(icon_prefix + "ui-icon-seek-first" + icon_suffix)
|
||||||
|
.click(gotoFirst)
|
||||||
|
.appendTo($nav);
|
||||||
|
|
||||||
|
$(icon_prefix + "ui-icon-seek-prev" + icon_suffix)
|
||||||
|
.click(gotoPrev)
|
||||||
|
.appendTo($nav);
|
||||||
|
|
||||||
|
$(icon_prefix + "ui-icon-seek-next" + icon_suffix)
|
||||||
|
.click(gotoNext)
|
||||||
|
.appendTo($nav);
|
||||||
|
|
||||||
|
$(icon_prefix + "ui-icon-seek-end" + icon_suffix)
|
||||||
|
.click(gotoLast)
|
||||||
|
.appendTo($nav);
|
||||||
|
|
||||||
|
$container.find(".ui-icon-container")
|
||||||
|
.hover(function () {
|
||||||
|
$(this).toggleClass("ui-state-hover");
|
||||||
|
});
|
||||||
|
|
||||||
|
$container.children().wrapAll("<div class='slick-pager' />");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function updatePager(pagingInfo) {
|
||||||
|
var state = getNavState();
|
||||||
|
|
||||||
|
$container.find(".slick-pager-nav span").removeClass("ui-state-disabled");
|
||||||
|
if (!state.canGotoFirst) {
|
||||||
|
$container.find(".ui-icon-seek-first").addClass("ui-state-disabled");
|
||||||
|
}
|
||||||
|
if (!state.canGotoLast) {
|
||||||
|
$container.find(".ui-icon-seek-end").addClass("ui-state-disabled");
|
||||||
|
}
|
||||||
|
if (!state.canGotoNext) {
|
||||||
|
$container.find(".ui-icon-seek-next").addClass("ui-state-disabled");
|
||||||
|
}
|
||||||
|
if (!state.canGotoPrev) {
|
||||||
|
$container.find(".ui-icon-seek-prev").addClass("ui-state-disabled");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pagingInfo.pageSize == 0) {
|
||||||
|
var totalRowsCount = dataView.getItems().length;
|
||||||
|
var visibleRowsCount = pagingInfo.totalRows;
|
||||||
|
if (visibleRowsCount < totalRowsCount) {
|
||||||
|
$status.text("Showing " + visibleRowsCount + " of " + totalRowsCount + " rows");
|
||||||
|
} else {
|
||||||
|
$status.text("Showing all " + totalRowsCount + " rows");
|
||||||
|
}
|
||||||
|
$status.text("Showing all " + pagingInfo.totalRows + " rows");
|
||||||
|
} else {
|
||||||
|
$status.text("Showing page " + (pagingInfo.pageNum + 1) + " of " + pagingInfo.totalPages);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Slick.Controls.Pager
|
||||||
|
$.extend(true, window, { Slick:{ Controls:{ Pager:SlickGridPager }}});
|
||||||
|
})(jQuery);
|
BIN
static/sg/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png
Normal file
After Width: | Height: | Size: 180 B |
BIN
static/sg/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png
Normal file
After Width: | Height: | Size: 178 B |
BIN
static/sg/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png
Normal file
After Width: | Height: | Size: 120 B |
BIN
static/sg/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png
Normal file
After Width: | Height: | Size: 105 B |
BIN
static/sg/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png
Normal file
After Width: | Height: | Size: 111 B |
BIN
static/sg/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png
Normal file
After Width: | Height: | Size: 110 B |
BIN
static/sg/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png
Normal file
After Width: | Height: | Size: 119 B |
After Width: | Height: | Size: 101 B |
BIN
static/sg/css/smoothness/images/ui-icons_222222_256x240.png
Normal file
After Width: | Height: | Size: 4.3 KiB |
BIN
static/sg/css/smoothness/images/ui-icons_2e83ff_256x240.png
Normal file
After Width: | Height: | Size: 4.3 KiB |
BIN
static/sg/css/smoothness/images/ui-icons_454545_256x240.png
Normal file
After Width: | Height: | Size: 4.3 KiB |
BIN
static/sg/css/smoothness/images/ui-icons_888888_256x240.png
Normal file
After Width: | Height: | Size: 4.3 KiB |
BIN
static/sg/css/smoothness/images/ui-icons_cd0a0a_256x240.png
Normal file
After Width: | Height: | Size: 4.3 KiB |
409
static/sg/css/smoothness/jquery-ui-1.8.16.custom.css
vendored
Normal file
|
@ -0,0 +1,409 @@
|
||||||
|
/*
|
||||||
|
* jQuery UI CSS Framework 1.8.16
|
||||||
|
*
|
||||||
|
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Theming/API
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Layout helpers
|
||||||
|
----------------------------------*/
|
||||||
|
.ui-helper-hidden { display: none; }
|
||||||
|
.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); }
|
||||||
|
.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
|
||||||
|
.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
|
||||||
|
.ui-helper-clearfix { display: inline-block; }
|
||||||
|
/* required comment for clearfix to work in Opera \*/
|
||||||
|
* html .ui-helper-clearfix { height:1%; }
|
||||||
|
.ui-helper-clearfix { display:block; }
|
||||||
|
/* end clearfix */
|
||||||
|
.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
|
||||||
|
|
||||||
|
|
||||||
|
/* Interaction Cues
|
||||||
|
----------------------------------*/
|
||||||
|
.ui-state-disabled { cursor: default !important; }
|
||||||
|
|
||||||
|
|
||||||
|
/* Icons
|
||||||
|
----------------------------------*/
|
||||||
|
|
||||||
|
/* states and images */
|
||||||
|
.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
|
||||||
|
|
||||||
|
|
||||||
|
/* Misc visuals
|
||||||
|
----------------------------------*/
|
||||||
|
|
||||||
|
/* Overlays */
|
||||||
|
.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* jQuery UI CSS Framework 1.8.16
|
||||||
|
*
|
||||||
|
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Theming/API
|
||||||
|
*
|
||||||
|
* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana,Arial,sans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=02_glass.png&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=02_glass.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/* Component containers
|
||||||
|
----------------------------------*/
|
||||||
|
.ui-widget { font-family: Verdana,Arial,sans-serif; font-size: 1.1em; }
|
||||||
|
.ui-widget .ui-widget { font-size: 1em; }
|
||||||
|
.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif; font-size: 1em; }
|
||||||
|
.ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #222222; }
|
||||||
|
.ui-widget-content a { color: #222222; }
|
||||||
|
.ui-widget-header { border: 1px solid #aaaaaa; background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; }
|
||||||
|
.ui-widget-header a { color: #222222; }
|
||||||
|
|
||||||
|
/* Interaction states
|
||||||
|
----------------------------------*/
|
||||||
|
.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3; background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #555555; }
|
||||||
|
.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555; text-decoration: none; }
|
||||||
|
.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999; background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; }
|
||||||
|
.ui-state-hover a, .ui-state-hover a:hover { color: #212121; text-decoration: none; }
|
||||||
|
.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; }
|
||||||
|
.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; text-decoration: none; }
|
||||||
|
.ui-widget :active { outline: none; }
|
||||||
|
|
||||||
|
/* Interaction Cues
|
||||||
|
----------------------------------*/
|
||||||
|
.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fcefa1; background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x; color: #363636; }
|
||||||
|
.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
|
||||||
|
.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; }
|
||||||
|
.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; }
|
||||||
|
.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; }
|
||||||
|
.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
|
||||||
|
.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
|
||||||
|
.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
|
||||||
|
|
||||||
|
/* Icons
|
||||||
|
----------------------------------*/
|
||||||
|
|
||||||
|
/* states and images */
|
||||||
|
.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); }
|
||||||
|
.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
|
||||||
|
.ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
|
||||||
|
.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png); }
|
||||||
|
.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); }
|
||||||
|
.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); }
|
||||||
|
.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); }
|
||||||
|
.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png); }
|
||||||
|
|
||||||
|
/* positioning */
|
||||||
|
.ui-icon-carat-1-n { background-position: 0 0; }
|
||||||
|
.ui-icon-carat-1-ne { background-position: -16px 0; }
|
||||||
|
.ui-icon-carat-1-e { background-position: -32px 0; }
|
||||||
|
.ui-icon-carat-1-se { background-position: -48px 0; }
|
||||||
|
.ui-icon-carat-1-s { background-position: -64px 0; }
|
||||||
|
.ui-icon-carat-1-sw { background-position: -80px 0; }
|
||||||
|
.ui-icon-carat-1-w { background-position: -96px 0; }
|
||||||
|
.ui-icon-carat-1-nw { background-position: -112px 0; }
|
||||||
|
.ui-icon-carat-2-n-s { background-position: -128px 0; }
|
||||||
|
.ui-icon-carat-2-e-w { background-position: -144px 0; }
|
||||||
|
.ui-icon-triangle-1-n { background-position: 0 -16px; }
|
||||||
|
.ui-icon-triangle-1-ne { background-position: -16px -16px; }
|
||||||
|
.ui-icon-triangle-1-e { background-position: -32px -16px; }
|
||||||
|
.ui-icon-triangle-1-se { background-position: -48px -16px; }
|
||||||
|
.ui-icon-triangle-1-s { background-position: -64px -16px; }
|
||||||
|
.ui-icon-triangle-1-sw { background-position: -80px -16px; }
|
||||||
|
.ui-icon-triangle-1-w { background-position: -96px -16px; }
|
||||||
|
.ui-icon-triangle-1-nw { background-position: -112px -16px; }
|
||||||
|
.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
|
||||||
|
.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
|
||||||
|
.ui-icon-arrow-1-n { background-position: 0 -32px; }
|
||||||
|
.ui-icon-arrow-1-ne { background-position: -16px -32px; }
|
||||||
|
.ui-icon-arrow-1-e { background-position: -32px -32px; }
|
||||||
|
.ui-icon-arrow-1-se { background-position: -48px -32px; }
|
||||||
|
.ui-icon-arrow-1-s { background-position: -64px -32px; }
|
||||||
|
.ui-icon-arrow-1-sw { background-position: -80px -32px; }
|
||||||
|
.ui-icon-arrow-1-w { background-position: -96px -32px; }
|
||||||
|
.ui-icon-arrow-1-nw { background-position: -112px -32px; }
|
||||||
|
.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
|
||||||
|
.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
|
||||||
|
.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
|
||||||
|
.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
|
||||||
|
.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
|
||||||
|
.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
|
||||||
|
.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
|
||||||
|
.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
|
||||||
|
.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
|
||||||
|
.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
|
||||||
|
.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
|
||||||
|
.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
|
||||||
|
.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
|
||||||
|
.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
|
||||||
|
.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
|
||||||
|
.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
|
||||||
|
.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
|
||||||
|
.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
|
||||||
|
.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
|
||||||
|
.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
|
||||||
|
.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
|
||||||
|
.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
|
||||||
|
.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
|
||||||
|
.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
|
||||||
|
.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
|
||||||
|
.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
|
||||||
|
.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
|
||||||
|
.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
|
||||||
|
.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
|
||||||
|
.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
|
||||||
|
.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
|
||||||
|
.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
|
||||||
|
.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
|
||||||
|
.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
|
||||||
|
.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
|
||||||
|
.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
|
||||||
|
.ui-icon-arrow-4 { background-position: 0 -80px; }
|
||||||
|
.ui-icon-arrow-4-diag { background-position: -16px -80px; }
|
||||||
|
.ui-icon-extlink { background-position: -32px -80px; }
|
||||||
|
.ui-icon-newwin { background-position: -48px -80px; }
|
||||||
|
.ui-icon-refresh { background-position: -64px -80px; }
|
||||||
|
.ui-icon-shuffle { background-position: -80px -80px; }
|
||||||
|
.ui-icon-transfer-e-w { background-position: -96px -80px; }
|
||||||
|
.ui-icon-transferthick-e-w { background-position: -112px -80px; }
|
||||||
|
.ui-icon-folder-collapsed { background-position: 0 -96px; }
|
||||||
|
.ui-icon-folder-open { background-position: -16px -96px; }
|
||||||
|
.ui-icon-document { background-position: -32px -96px; }
|
||||||
|
.ui-icon-document-b { background-position: -48px -96px; }
|
||||||
|
.ui-icon-note { background-position: -64px -96px; }
|
||||||
|
.ui-icon-mail-closed { background-position: -80px -96px; }
|
||||||
|
.ui-icon-mail-open { background-position: -96px -96px; }
|
||||||
|
.ui-icon-suitcase { background-position: -112px -96px; }
|
||||||
|
.ui-icon-comment { background-position: -128px -96px; }
|
||||||
|
.ui-icon-person { background-position: -144px -96px; }
|
||||||
|
.ui-icon-print { background-position: -160px -96px; }
|
||||||
|
.ui-icon-trash { background-position: -176px -96px; }
|
||||||
|
.ui-icon-locked { background-position: -192px -96px; }
|
||||||
|
.ui-icon-unlocked { background-position: -208px -96px; }
|
||||||
|
.ui-icon-bookmark { background-position: -224px -96px; }
|
||||||
|
.ui-icon-tag { background-position: -240px -96px; }
|
||||||
|
.ui-icon-home { background-position: 0 -112px; }
|
||||||
|
.ui-icon-flag { background-position: -16px -112px; }
|
||||||
|
.ui-icon-calendar { background-position: -32px -112px; }
|
||||||
|
.ui-icon-cart { background-position: -48px -112px; }
|
||||||
|
.ui-icon-pencil { background-position: -64px -112px; }
|
||||||
|
.ui-icon-clock { background-position: -80px -112px; }
|
||||||
|
.ui-icon-disk { background-position: -96px -112px; }
|
||||||
|
.ui-icon-calculator { background-position: -112px -112px; }
|
||||||
|
.ui-icon-zoomin { background-position: -128px -112px; }
|
||||||
|
.ui-icon-zoomout { background-position: -144px -112px; }
|
||||||
|
.ui-icon-search { background-position: -160px -112px; }
|
||||||
|
.ui-icon-wrench { background-position: -176px -112px; }
|
||||||
|
.ui-icon-gear { background-position: -192px -112px; }
|
||||||
|
.ui-icon-heart { background-position: -208px -112px; }
|
||||||
|
.ui-icon-star { background-position: -224px -112px; }
|
||||||
|
.ui-icon-link { background-position: -240px -112px; }
|
||||||
|
.ui-icon-cancel { background-position: 0 -128px; }
|
||||||
|
.ui-icon-plus { background-position: -16px -128px; }
|
||||||
|
.ui-icon-plusthick { background-position: -32px -128px; }
|
||||||
|
.ui-icon-minus { background-position: -48px -128px; }
|
||||||
|
.ui-icon-minusthick { background-position: -64px -128px; }
|
||||||
|
.ui-icon-close { background-position: -80px -128px; }
|
||||||
|
.ui-icon-closethick { background-position: -96px -128px; }
|
||||||
|
.ui-icon-key { background-position: -112px -128px; }
|
||||||
|
.ui-icon-lightbulb { background-position: -128px -128px; }
|
||||||
|
.ui-icon-scissors { background-position: -144px -128px; }
|
||||||
|
.ui-icon-clipboard { background-position: -160px -128px; }
|
||||||
|
.ui-icon-copy { background-position: -176px -128px; }
|
||||||
|
.ui-icon-contact { background-position: -192px -128px; }
|
||||||
|
.ui-icon-image { background-position: -208px -128px; }
|
||||||
|
.ui-icon-video { background-position: -224px -128px; }
|
||||||
|
.ui-icon-script { background-position: -240px -128px; }
|
||||||
|
.ui-icon-alert { background-position: 0 -144px; }
|
||||||
|
.ui-icon-info { background-position: -16px -144px; }
|
||||||
|
.ui-icon-notice { background-position: -32px -144px; }
|
||||||
|
.ui-icon-help { background-position: -48px -144px; }
|
||||||
|
.ui-icon-check { background-position: -64px -144px; }
|
||||||
|
.ui-icon-bullet { background-position: -80px -144px; }
|
||||||
|
.ui-icon-radio-off { background-position: -96px -144px; }
|
||||||
|
.ui-icon-radio-on { background-position: -112px -144px; }
|
||||||
|
.ui-icon-pin-w { background-position: -128px -144px; }
|
||||||
|
.ui-icon-pin-s { background-position: -144px -144px; }
|
||||||
|
.ui-icon-play { background-position: 0 -160px; }
|
||||||
|
.ui-icon-pause { background-position: -16px -160px; }
|
||||||
|
.ui-icon-seek-next { background-position: -32px -160px; }
|
||||||
|
.ui-icon-seek-prev { background-position: -48px -160px; }
|
||||||
|
.ui-icon-seek-end { background-position: -64px -160px; }
|
||||||
|
.ui-icon-seek-start { background-position: -80px -160px; }
|
||||||
|
/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
|
||||||
|
.ui-icon-seek-first { background-position: -80px -160px; }
|
||||||
|
.ui-icon-stop { background-position: -96px -160px; }
|
||||||
|
.ui-icon-eject { background-position: -112px -160px; }
|
||||||
|
.ui-icon-volume-off { background-position: -128px -160px; }
|
||||||
|
.ui-icon-volume-on { background-position: -144px -160px; }
|
||||||
|
.ui-icon-power { background-position: 0 -176px; }
|
||||||
|
.ui-icon-signal-diag { background-position: -16px -176px; }
|
||||||
|
.ui-icon-signal { background-position: -32px -176px; }
|
||||||
|
.ui-icon-battery-0 { background-position: -48px -176px; }
|
||||||
|
.ui-icon-battery-1 { background-position: -64px -176px; }
|
||||||
|
.ui-icon-battery-2 { background-position: -80px -176px; }
|
||||||
|
.ui-icon-battery-3 { background-position: -96px -176px; }
|
||||||
|
.ui-icon-circle-plus { background-position: 0 -192px; }
|
||||||
|
.ui-icon-circle-minus { background-position: -16px -192px; }
|
||||||
|
.ui-icon-circle-close { background-position: -32px -192px; }
|
||||||
|
.ui-icon-circle-triangle-e { background-position: -48px -192px; }
|
||||||
|
.ui-icon-circle-triangle-s { background-position: -64px -192px; }
|
||||||
|
.ui-icon-circle-triangle-w { background-position: -80px -192px; }
|
||||||
|
.ui-icon-circle-triangle-n { background-position: -96px -192px; }
|
||||||
|
.ui-icon-circle-arrow-e { background-position: -112px -192px; }
|
||||||
|
.ui-icon-circle-arrow-s { background-position: -128px -192px; }
|
||||||
|
.ui-icon-circle-arrow-w { background-position: -144px -192px; }
|
||||||
|
.ui-icon-circle-arrow-n { background-position: -160px -192px; }
|
||||||
|
.ui-icon-circle-zoomin { background-position: -176px -192px; }
|
||||||
|
.ui-icon-circle-zoomout { background-position: -192px -192px; }
|
||||||
|
.ui-icon-circle-check { background-position: -208px -192px; }
|
||||||
|
.ui-icon-circlesmall-plus { background-position: 0 -208px; }
|
||||||
|
.ui-icon-circlesmall-minus { background-position: -16px -208px; }
|
||||||
|
.ui-icon-circlesmall-close { background-position: -32px -208px; }
|
||||||
|
.ui-icon-squaresmall-plus { background-position: -48px -208px; }
|
||||||
|
.ui-icon-squaresmall-minus { background-position: -64px -208px; }
|
||||||
|
.ui-icon-squaresmall-close { background-position: -80px -208px; }
|
||||||
|
.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
|
||||||
|
.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
|
||||||
|
.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
|
||||||
|
.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
|
||||||
|
.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
|
||||||
|
.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
|
||||||
|
|
||||||
|
|
||||||
|
/* Misc visuals
|
||||||
|
----------------------------------*/
|
||||||
|
|
||||||
|
/* Corner radius */
|
||||||
|
.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -khtml-border-top-left-radius: 4px; border-top-left-radius: 4px; }
|
||||||
|
.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; -khtml-border-top-right-radius: 4px; border-top-right-radius: 4px; }
|
||||||
|
.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; -khtml-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
|
||||||
|
.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; -khtml-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
|
||||||
|
|
||||||
|
/* Overlays */
|
||||||
|
.ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); }
|
||||||
|
.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -khtml-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }/*
|
||||||
|
* jQuery UI Resizable 1.8.16
|
||||||
|
*
|
||||||
|
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Resizable#theming
|
||||||
|
*/
|
||||||
|
.ui-resizable { position: relative;}
|
||||||
|
.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block; }
|
||||||
|
.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
|
||||||
|
.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
|
||||||
|
.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
|
||||||
|
.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
|
||||||
|
.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
|
||||||
|
.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
|
||||||
|
.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
|
||||||
|
.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
|
||||||
|
.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/*
|
||||||
|
* jQuery UI Selectable 1.8.16
|
||||||
|
*
|
||||||
|
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Selectable#theming
|
||||||
|
*/
|
||||||
|
.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; }
|
||||||
|
/*
|
||||||
|
* jQuery UI Slider 1.8.16
|
||||||
|
*
|
||||||
|
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Slider#theming
|
||||||
|
*/
|
||||||
|
.ui-slider { position: relative; text-align: left; }
|
||||||
|
.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
|
||||||
|
.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
|
||||||
|
|
||||||
|
.ui-slider-horizontal { height: .8em; }
|
||||||
|
.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
|
||||||
|
.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
|
||||||
|
.ui-slider-horizontal .ui-slider-range-min { left: 0; }
|
||||||
|
.ui-slider-horizontal .ui-slider-range-max { right: 0; }
|
||||||
|
|
||||||
|
.ui-slider-vertical { width: .8em; height: 100px; }
|
||||||
|
.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
|
||||||
|
.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
|
||||||
|
.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
|
||||||
|
.ui-slider-vertical .ui-slider-range-max { top: 0; }/*
|
||||||
|
* jQuery UI Datepicker 1.8.16
|
||||||
|
*
|
||||||
|
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Datepicker#theming
|
||||||
|
*/
|
||||||
|
.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; }
|
||||||
|
.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
|
||||||
|
.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
|
||||||
|
.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
|
||||||
|
.ui-datepicker .ui-datepicker-prev { left:2px; }
|
||||||
|
.ui-datepicker .ui-datepicker-next { right:2px; }
|
||||||
|
.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
|
||||||
|
.ui-datepicker .ui-datepicker-next-hover { right:1px; }
|
||||||
|
.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; }
|
||||||
|
.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
|
||||||
|
.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
|
||||||
|
.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
|
||||||
|
.ui-datepicker select.ui-datepicker-month,
|
||||||
|
.ui-datepicker select.ui-datepicker-year { width: 49%;}
|
||||||
|
.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
|
||||||
|
.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; }
|
||||||
|
.ui-datepicker td { border: 0; padding: 1px; }
|
||||||
|
.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
|
||||||
|
.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
|
||||||
|
.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
|
||||||
|
.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
|
||||||
|
|
||||||
|
/* with multiple calendars */
|
||||||
|
.ui-datepicker.ui-datepicker-multi { width:auto; }
|
||||||
|
.ui-datepicker-multi .ui-datepicker-group { float:left; }
|
||||||
|
.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
|
||||||
|
.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
|
||||||
|
.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
|
||||||
|
.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
|
||||||
|
.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
|
||||||
|
.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
|
||||||
|
.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
|
||||||
|
.ui-datepicker-row-break { clear:both; width:100%; font-size:0em; }
|
||||||
|
|
||||||
|
/* RTL support */
|
||||||
|
.ui-datepicker-rtl { direction: rtl; }
|
||||||
|
.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
|
||||||
|
.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
|
||||||
|
.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
|
||||||
|
.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
|
||||||
|
.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
|
||||||
|
.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
|
||||||
|
.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
|
||||||
|
.ui-datepicker-rtl .ui-datepicker-group { float:right; }
|
||||||
|
.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
|
||||||
|
.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
|
||||||
|
|
||||||
|
/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
|
||||||
|
.ui-datepicker-cover {
|
||||||
|
display: none; /*sorry for IE5*/
|
||||||
|
display/**/: block; /*sorry for IE5*/
|
||||||
|
position: absolute; /*must have*/
|
||||||
|
z-index: -1; /*must have*/
|
||||||
|
filter: mask(); /*must have*/
|
||||||
|
top: -4px; /*must have*/
|
||||||
|
left: -4px; /*must have*/
|
||||||
|
width: 200px; /*must have*/
|
||||||
|
height: 200px; /*must have*/
|
||||||
|
}
|
BIN
static/sg/examples/.example2-formatters.html.swp
Normal file
BIN
static/sg/examples/.example3a-compound-editors.html.swp
Normal file
78
static/sg/examples/example-autotooltips.html
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<title>SlickGrid plugin example: AutoTooltips</title>
|
||||||
|
<link rel="stylesheet" href="../slick.grid.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="../css/smoothness/jquery-ui-1.8.16.custom.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="examples.css" type="text/css"/>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<table width="100%">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="50%">
|
||||||
|
<div id="myGrid" style="width:600px;height:300px;"></div>
|
||||||
|
</td>
|
||||||
|
<td valign="top">
|
||||||
|
<h2>Demonstrates:</h2>
|
||||||
|
<ul>
|
||||||
|
<li>AutoTooltips plugin</li>
|
||||||
|
</ul>
|
||||||
|
<h2>Instructions:</h2>
|
||||||
|
<p>Resize the columns until see ellipsis in column or header. Hover over cell to see tooltip.</p>
|
||||||
|
<h2>Usage:</h2>
|
||||||
|
<pre style="background-color: white; font-size: 110%; border-radius: 5px; padding: 20px; ">plugin = new Slick.AutoTooltips(pluginOptions);
|
||||||
|
grid.registerPlugin(plugin);
|
||||||
|
grid.render();</pre>
|
||||||
|
|
||||||
|
<h2>View Source:</h2>
|
||||||
|
<ul>
|
||||||
|
<li><A href="https://github.com/mleibman/SlickGrid/blob/gh-pages/examples/example-autotooltips.html" target="_sourcewindow"> View the source for this example on Github</a></li>
|
||||||
|
</ul>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<script src="../lib/jquery-1.7.min.js"></script>
|
||||||
|
<script src="../lib/jquery.event.drag-2.2.js"></script>
|
||||||
|
|
||||||
|
<script src="../slick.core.js"></script>
|
||||||
|
<script src="../slick.grid.js"></script>
|
||||||
|
<script src="../plugins/slick.autotooltips.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
var grid;
|
||||||
|
var columns = [
|
||||||
|
{id: "title", name: "Title", field: "title"},
|
||||||
|
{id: "duration", name: "Duration", field: "duration"},
|
||||||
|
{id: "%", name: "% Complete", field: "percentComplete"},
|
||||||
|
{id: "start", name: "Start", field: "start"},
|
||||||
|
{id: "finish", name: "Finish", field: "finish"},
|
||||||
|
{id: "effort-driven", name: "Effort Driven", field: "effortDriven"}
|
||||||
|
];
|
||||||
|
|
||||||
|
var options = {
|
||||||
|
enableCellNavigation: true,
|
||||||
|
enableColumnReorder: false
|
||||||
|
};
|
||||||
|
|
||||||
|
$(function () {
|
||||||
|
var data = [];
|
||||||
|
for (var i = 0; i < 500; i++) {
|
||||||
|
data[i] = {
|
||||||
|
title: "Task " + i,
|
||||||
|
duration: "5 days",
|
||||||
|
percentComplete: Math.round(Math.random() * 100),
|
||||||
|
start: "01/01/2009",
|
||||||
|
finish: "01/05/2009",
|
||||||
|
effortDriven: (i % 5 == 0)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
grid = new Slick.Grid("#myGrid", data, columns, options);
|
||||||
|
grid.registerPlugin( new Slick.AutoTooltips({ enableForHeaderCells: true }) );
|
||||||
|
grid.render();
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
96
static/sg/examples/example-checkbox-row-select.html
Normal file
|
@ -0,0 +1,96 @@
|
||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" href="../slick.grid.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="../css/smoothness/jquery-ui-1.8.16.custom.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="examples.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="../controls/slick.columnpicker.css" type="text/css"/>
|
||||||
|
<style>
|
||||||
|
.slick-cell-checkboxsel {
|
||||||
|
background: #f0f0f0;
|
||||||
|
border-right-color: silver;
|
||||||
|
border-right-style: solid;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div style="position:relative">
|
||||||
|
<div style="width:600px;">
|
||||||
|
<div id="myGrid" style="width:100%;height:500px;"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="options-panel">
|
||||||
|
<h2>Demonstrates:</h2>
|
||||||
|
<ul>
|
||||||
|
<li>Checkbox row select column</li>
|
||||||
|
</ul>
|
||||||
|
<h2>View Source:</h2>
|
||||||
|
<ul>
|
||||||
|
<li><A href="https://github.com/mleibman/SlickGrid/blob/gh-pages/examples/example-checkbox-row-select.html" target="_sourcewindow"> View the source for this example on Github</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="../lib/firebugx.js"></script>
|
||||||
|
|
||||||
|
<script src="../lib/jquery-1.7.min.js"></script>
|
||||||
|
<script src="../lib/jquery-ui-1.8.16.custom.min.js"></script>
|
||||||
|
<script src="../lib/jquery.event.drag-2.2.js"></script>
|
||||||
|
|
||||||
|
<script src="../slick.core.js"></script>
|
||||||
|
<script src="../plugins/slick.checkboxselectcolumn.js"></script>
|
||||||
|
<script src="../plugins/slick.autotooltips.js"></script>
|
||||||
|
<script src="../plugins/slick.cellrangedecorator.js"></script>
|
||||||
|
<script src="../plugins/slick.cellrangeselector.js"></script>
|
||||||
|
<script src="../plugins/slick.cellcopymanager.js"></script>
|
||||||
|
<script src="../plugins/slick.cellselectionmodel.js"></script>
|
||||||
|
<script src="../plugins/slick.rowselectionmodel.js"></script>
|
||||||
|
<script src="../controls/slick.columnpicker.js"></script>
|
||||||
|
<script src="../slick.formatters.js"></script>
|
||||||
|
<script src="../slick.editors.js"></script>
|
||||||
|
<script src="../slick.grid.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
var grid;
|
||||||
|
var data = [];
|
||||||
|
var options = {
|
||||||
|
editable: true,
|
||||||
|
enableCellNavigation: true,
|
||||||
|
asyncEditorLoading: false,
|
||||||
|
autoEdit: false
|
||||||
|
};
|
||||||
|
var columns = [];
|
||||||
|
|
||||||
|
$(function () {
|
||||||
|
for (var i = 0; i < 100; i++) {
|
||||||
|
var d = (data[i] = {});
|
||||||
|
d[0] = "Row " + i;
|
||||||
|
}
|
||||||
|
|
||||||
|
var checkboxSelector = new Slick.CheckboxSelectColumn({
|
||||||
|
cssClass: "slick-cell-checkboxsel"
|
||||||
|
});
|
||||||
|
|
||||||
|
columns.push(checkboxSelector.getColumnDefinition());
|
||||||
|
|
||||||
|
for (var i = 0; i < 5; i++) {
|
||||||
|
columns.push({
|
||||||
|
id: i,
|
||||||
|
name: String.fromCharCode("A".charCodeAt(0) + i),
|
||||||
|
field: i,
|
||||||
|
width: 100,
|
||||||
|
editor: Slick.Editors.Text
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
grid = new Slick.Grid("#myGrid", data, columns, options);
|
||||||
|
grid.setSelectionModel(new Slick.RowSelectionModel({selectActiveRow: false}));
|
||||||
|
grid.registerPlugin(checkboxSelector);
|
||||||
|
|
||||||
|
var columnpicker = new Slick.Controls.ColumnPicker(columns, grid, options);
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
91
static/sg/examples/example-colspan.html
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<link rel="stylesheet" href="../slick.grid.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="../css/smoothness/jquery-ui-1.8.16.custom.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="examples.css" type="text/css"/>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<table width="100%">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="50%">
|
||||||
|
<div id="myGrid" style="width:600px;height:500px;"></div>
|
||||||
|
</td>
|
||||||
|
<td valign="top">
|
||||||
|
<h2>Demonstrates:</h2>
|
||||||
|
<ul>
|
||||||
|
<li>column span</li>
|
||||||
|
</ul>
|
||||||
|
<h2>View Source:</h2>
|
||||||
|
<ul>
|
||||||
|
<li><A href="https://github.com/mleibman/SlickGrid/blob/gh-pages/examples/example-colspan.html" target="_sourcewindow"> View the source for this example on Github</a></li>
|
||||||
|
</ul>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<script src="../lib/jquery-1.7.min.js"></script>
|
||||||
|
<script src="../lib/jquery.event.drag-2.2.js"></script>
|
||||||
|
|
||||||
|
<script src="../slick.core.js"></script>
|
||||||
|
<script src="../plugins/slick.cellrangedecorator.js"></script>
|
||||||
|
<script src="../plugins/slick.cellrangeselector.js"></script>
|
||||||
|
<script src="../plugins/slick.cellselectionmodel.js"></script>
|
||||||
|
<script src="../slick.grid.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
var grid;
|
||||||
|
var columns = [
|
||||||
|
{id: "title", name: "Title", field: "title"},
|
||||||
|
{id: "duration", name: "Duration", field: "duration"},
|
||||||
|
{id: "%", name: "% Complete", field: "percentComplete", selectable: false},
|
||||||
|
{id: "start", name: "Start", field: "start"},
|
||||||
|
{id: "finish", name: "Finish", field: "finish"},
|
||||||
|
{id: "effort-driven", name: "Effort Driven", field: "effortDriven"}
|
||||||
|
];
|
||||||
|
|
||||||
|
var options = {
|
||||||
|
enableCellNavigation: true,
|
||||||
|
enableColumnReorder: false
|
||||||
|
};
|
||||||
|
|
||||||
|
$(function () {
|
||||||
|
var data = [];
|
||||||
|
for (var i = 0; i < 500; i++) {
|
||||||
|
data[i] = {
|
||||||
|
title: "Task " + i,
|
||||||
|
duration: "5 days",
|
||||||
|
percentComplete: Math.round(Math.random() * 100),
|
||||||
|
start: "01/01/2009",
|
||||||
|
finish: "01/05/2009",
|
||||||
|
effortDriven: (i % 5 == 0)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
data.getItemMetadata = function (row) {
|
||||||
|
if (row % 2 === 1) {
|
||||||
|
return {
|
||||||
|
"columns": {
|
||||||
|
"duration": {
|
||||||
|
"colspan": 3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
return {
|
||||||
|
"columns": {
|
||||||
|
0: {
|
||||||
|
"colspan": "*"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
grid = new Slick.Grid("#myGrid", data, columns, options);
|
||||||
|
|
||||||
|
grid.setSelectionModel(new Slick.CellSelectionModel());
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
236
static/sg/examples/example-composite-editor-item-details.html
Normal file
|
@ -0,0 +1,236 @@
|
||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<title>SlickGrid example: CompositeEditor</title>
|
||||||
|
<link rel="stylesheet" href="../slick.grid.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="../css/smoothness/jquery-ui-1.8.16.custom.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="examples.css" type="text/css"/>
|
||||||
|
<style>
|
||||||
|
.cell-title {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cell-effort-driven {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.item-details-form {
|
||||||
|
z-index: 10000;
|
||||||
|
display: inline-block;
|
||||||
|
border: 1px solid black;
|
||||||
|
margin: 8px;
|
||||||
|
padding: 10px;
|
||||||
|
background: #efefef;
|
||||||
|
-moz-box-shadow: 0px 0px 15px black;
|
||||||
|
-webkit-box-shadow: 0px 0px 15px black;
|
||||||
|
box-shadow: 0px 0px 15px black;
|
||||||
|
|
||||||
|
position: absolute;
|
||||||
|
top: 10px;
|
||||||
|
left: 150px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.item-details-form-buttons {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.item-details-label {
|
||||||
|
margin-left: 10px;
|
||||||
|
margin-top: 20px;
|
||||||
|
display: block;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.item-details-editor-container {
|
||||||
|
width: 200px;
|
||||||
|
height: 20px;
|
||||||
|
border: 1px solid silver;
|
||||||
|
background: white;
|
||||||
|
display: block;
|
||||||
|
margin: 10px;
|
||||||
|
margin-top: 4px;
|
||||||
|
padding: 0;
|
||||||
|
padding-left: 4px;
|
||||||
|
padding-right: 4px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div style="position:relative">
|
||||||
|
<div style="width:600px;">
|
||||||
|
<div id="myGrid" style="width:100%;height:500px;"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="options-panel">
|
||||||
|
<h2>Demonstrates:</h2>
|
||||||
|
<ul>
|
||||||
|
<li>using a CompositeEditor to implement detached item edit form</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Options:</h2>
|
||||||
|
<button onclick="openDetails()">Open Item Edit for active row</button>
|
||||||
|
|
||||||
|
<h2>View Source:</h2>
|
||||||
|
<ul>
|
||||||
|
<li><A href="https://github.com/mleibman/SlickGrid/blob/gh-pages/examples/example-composite-editor-item-details.html" target="_sourcewindow"> View the source for this example on Github</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script id="itemDetailsTemplate" type="text/x-jquery-tmpl">
|
||||||
|
<div class='item-details-form'>
|
||||||
|
{{each columns}}
|
||||||
|
<div class='item-details-label'>
|
||||||
|
${name}
|
||||||
|
</div>
|
||||||
|
<div class='item-details-editor-container' data-editorid='${id}'></div>
|
||||||
|
{{/each}}
|
||||||
|
|
||||||
|
<hr/>
|
||||||
|
<div class='item-details-form-buttons'>
|
||||||
|
<button data-action='save'>Save</button>
|
||||||
|
<button data-action='cancel'>Cancel</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
<script src="../lib/firebugx.js"></script>
|
||||||
|
|
||||||
|
<script src="../lib/jquery-1.7.min.js"></script>
|
||||||
|
<script src="../lib/jquery-ui-1.8.16.custom.min.js"></script>
|
||||||
|
<script src="../lib/jquery.event.drag-2.2.js"></script>
|
||||||
|
<script src="http://ajax.microsoft.com/ajax/jquery.templates/beta1/jquery.tmpl.min.js"></script>
|
||||||
|
|
||||||
|
<script src="../slick.core.js"></script>
|
||||||
|
<script src="../plugins/slick.cellrangeselector.js"></script>
|
||||||
|
<script src="../plugins/slick.cellselectionmodel.js"></script>
|
||||||
|
<script src="../slick.formatters.js"></script>
|
||||||
|
<script src="../slick.editors.js"></script>
|
||||||
|
<script src="../slick.grid.js"></script>
|
||||||
|
<script src="slick.compositeeditor.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
function requiredFieldValidator(value) {
|
||||||
|
if (value == null || value == undefined || !value.length) {
|
||||||
|
return {valid: false, msg: "This is a required field"};
|
||||||
|
} else {
|
||||||
|
return {valid: true, msg: null};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var grid;
|
||||||
|
var data = [];
|
||||||
|
var columns = [
|
||||||
|
{id: "title", name: "Title", field: "title", width: 120, cssClass: "cell-title", editor: Slick.Editors.Text, validator: requiredFieldValidator},
|
||||||
|
{id: "desc", name: "Description", field: "description", width: 100, editor: Slick.Editors.Text},
|
||||||
|
{id: "duration", name: "Duration", field: "duration", editor: Slick.Editors.Text},
|
||||||
|
{id: "percent", name: "% Complete", field: "percentComplete", width: 80, resizable: false, formatter: Slick.Formatters.PercentCompleteBar, editor: Slick.Editors.PercentComplete},
|
||||||
|
{id: "start", name: "Start", field: "start", minWidth: 60, editor: Slick.Editors.Date},
|
||||||
|
{id: "finish", name: "Finish", field: "finish", minWidth: 60, editor: Slick.Editors.Date},
|
||||||
|
{id: "effort-driven", name: "Effort Driven", width: 80, minWidth: 20, maxWidth: 80, cssClass: "cell-effort-driven", field: "effortDriven", formatter: Slick.Formatters.Checkmark, editor: Slick.Editors.Checkbox}
|
||||||
|
];
|
||||||
|
var options = {
|
||||||
|
editable: true,
|
||||||
|
enableAddRow: true,
|
||||||
|
enableCellNavigation: true,
|
||||||
|
asyncEditorLoading: false,
|
||||||
|
autoEdit: false
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
function openDetails() {
|
||||||
|
if (grid.getEditorLock().isActive() && !grid.getEditorLock().commitCurrentEdit()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var $modal = $("<div class='item-details-form'></div>");
|
||||||
|
|
||||||
|
$modal = $("#itemDetailsTemplate")
|
||||||
|
.tmpl({
|
||||||
|
context: grid.getDataItem(grid.getActiveCell().row),
|
||||||
|
columns: columns
|
||||||
|
})
|
||||||
|
.appendTo("body");
|
||||||
|
|
||||||
|
$modal.keydown(function (e) {
|
||||||
|
if (e.which == $.ui.keyCode.ENTER) {
|
||||||
|
grid.getEditController().commitCurrentEdit();
|
||||||
|
e.stopPropagation();
|
||||||
|
e.preventDefault();
|
||||||
|
} else if (e.which == $.ui.keyCode.ESCAPE) {
|
||||||
|
grid.getEditController().cancelCurrentEdit();
|
||||||
|
e.stopPropagation();
|
||||||
|
e.preventDefault();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$modal.find("[data-action=save]").click(function () {
|
||||||
|
grid.getEditController().commitCurrentEdit();
|
||||||
|
});
|
||||||
|
|
||||||
|
$modal.find("[data-action=cancel]").click(function () {
|
||||||
|
grid.getEditController().cancelCurrentEdit();
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
var containers = $.map(columns, function (c) {
|
||||||
|
return $modal.find("[data-editorid=" + c.id + "]");
|
||||||
|
});
|
||||||
|
|
||||||
|
var compositeEditor = new Slick.CompositeEditor(
|
||||||
|
columns,
|
||||||
|
containers,
|
||||||
|
{
|
||||||
|
destroy: function () {
|
||||||
|
$modal.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
grid.editActiveCell(compositeEditor);
|
||||||
|
}
|
||||||
|
|
||||||
|
$(function () {
|
||||||
|
for (var i = 0; i < 500; i++) {
|
||||||
|
var d = (data[i] = {});
|
||||||
|
|
||||||
|
d["title"] = "Task " + i;
|
||||||
|
d["description"] = "This is a sample task description.\n It can be multiline";
|
||||||
|
d["duration"] = "5 days";
|
||||||
|
d["percentComplete"] = Math.round(Math.random() * 100);
|
||||||
|
d["start"] = "01/01/2009";
|
||||||
|
d["finish"] = "01/05/2009";
|
||||||
|
d["effortDriven"] = (i % 5 == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
grid = new Slick.Grid("#myGrid", data, columns, options);
|
||||||
|
|
||||||
|
grid.onAddNewRow.subscribe(function (e, args) {
|
||||||
|
var item = args.item;
|
||||||
|
var column = args.column;
|
||||||
|
grid.invalidateRow(data.length);
|
||||||
|
data.push(item);
|
||||||
|
grid.updateRowCount();
|
||||||
|
grid.render();
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
grid.onValidationError.subscribe(function (e, args) {
|
||||||
|
// handle validation errors originating from the CompositeEditor
|
||||||
|
if (args.editor && (args.editor instanceof Slick.CompositeEditor)) {
|
||||||
|
var err;
|
||||||
|
var idx = args.validationResults.errors.length;
|
||||||
|
while (idx--) {
|
||||||
|
err = args.validationResults.errors[idx];
|
||||||
|
$(err.container).stop(true, true).effect("highlight", {color: "red"});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
grid.setActiveCell(0, 0);
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,77 @@
|
||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<title>SlickGrid example: Custom column value extractor</title>
|
||||||
|
<link rel="stylesheet" href="../slick.grid.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="../css/smoothness/jquery-ui-1.8.16.custom.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="examples.css" type="text/css"/>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<table width="100%">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="50%">
|
||||||
|
<div id="myGrid" style="width:600px;height:500px;"></div>
|
||||||
|
</td>
|
||||||
|
<td valign="top">
|
||||||
|
<h2>Demonstrates:</h2>
|
||||||
|
<ul>
|
||||||
|
<li>using <u>dataItemColumnValueExtractor</u> option to specify a custom column value extractor</li>
|
||||||
|
</ul>
|
||||||
|
<h2>View Source:</h2>
|
||||||
|
<ul>
|
||||||
|
<li><A href="https://github.com/mleibman/SlickGrid/blob/gh-pages/examples/example-custom-column-value-extractor.html" target="_sourcewindow"> View the source for this example on Github</a></li>
|
||||||
|
</ul>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<script src="../lib/jquery-1.7.min.js"></script>
|
||||||
|
<script src="../lib/jquery.event.drag-2.2.js"></script>
|
||||||
|
|
||||||
|
<script src="../slick.core.js"></script>
|
||||||
|
<script src="../slick.grid.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
var grid;
|
||||||
|
var columns = [
|
||||||
|
{id: "title", name: "Name", field: "name"},
|
||||||
|
{id: "field1", name: "Field1", field: "values", fieldIdx: 0},
|
||||||
|
{id: "field2", name: "Field2", field: "values", fieldIdx: 1},
|
||||||
|
{id: "field3", name: "Field3", field: "values", fieldIdx: 2}
|
||||||
|
];
|
||||||
|
|
||||||
|
var options = {
|
||||||
|
enableCellNavigation: true,
|
||||||
|
enableColumnReorder: false,
|
||||||
|
dataItemColumnValueExtractor: getItemColumnValue
|
||||||
|
};
|
||||||
|
|
||||||
|
// Get the item column value using a custom 'fieldIdx' column param
|
||||||
|
function getItemColumnValue(item, column) {
|
||||||
|
var values = item[column.field];
|
||||||
|
if (column.fieldIdx !== undefined) {
|
||||||
|
return values && values[column.fieldIdx];
|
||||||
|
} else {
|
||||||
|
return values;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$(function () {
|
||||||
|
var data = [];
|
||||||
|
for (var i = 0; i < 500; i++) {
|
||||||
|
data[i] = {
|
||||||
|
name: "Item " + i,
|
||||||
|
values: [
|
||||||
|
Math.round(Math.random() * 100),
|
||||||
|
Math.round(Math.random() * 100),
|
||||||
|
Math.round(Math.random() * 100)
|
||||||
|
]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
grid = new Slick.Grid("#myGrid", data, columns, options);
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
83
static/sg/examples/example-explicit-initialization.html
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<title>SlickGrid example: Explicit grid initialization</title>
|
||||||
|
<link rel="stylesheet" href="../slick.grid.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="../css/smoothness/jquery-ui-1.8.16.custom.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="examples.css" type="text/css"/>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<table width="100%" cellpadding="20">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="50%" id="myTable">
|
||||||
|
</td>
|
||||||
|
<td valign="top">
|
||||||
|
<h2>Demonstrates:</h2>
|
||||||
|
<p>
|
||||||
|
The container which the grid is being created in needs to be in the DOM and participate in layout
|
||||||
|
(can be 'visibility:hidden' but not 'display:none') in order for SlickGrid to be able to make certain
|
||||||
|
measurements and initialize event listeners. Normally, this is done when a SlickGrid instance is
|
||||||
|
being created. Optionally, you can defer the initialization until the above condition is met and call
|
||||||
|
the <b>grid.init()</b> method explicitly. To use explicit initialization, set the <b>explicitInitialization</b>
|
||||||
|
option to true.
|
||||||
|
<br/><br/>
|
||||||
|
This example demonstrates creating a SlickGrid inside a detached element and calling <b>init()</b> explicitly
|
||||||
|
when the element is added to the DOM.
|
||||||
|
</p>
|
||||||
|
<h2>View Source:</h2>
|
||||||
|
<ul>
|
||||||
|
<li><A href="https://github.com/mleibman/SlickGrid/blob/gh-pages/examples/example-explicit-initialization.html" target="_sourcewindow"> View the source for this example on Github</a></li>
|
||||||
|
</ul>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<script src="../lib/jquery-1.7.min.js"></script>
|
||||||
|
<script src="../lib/jquery.event.drag-2.2.js"></script>
|
||||||
|
|
||||||
|
<script src="../slick.core.js"></script>
|
||||||
|
<script src="../slick.grid.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
var grid;
|
||||||
|
var columns = [
|
||||||
|
{id: "title", name: "Title", field: "title"},
|
||||||
|
{id: "duration", name: "Duration", field: "duration"},
|
||||||
|
{id: "%", name: "% Complete", field: "percentComplete"},
|
||||||
|
{id: "start", name: "Start", field: "start"},
|
||||||
|
{id: "finish", name: "Finish", field: "finish"},
|
||||||
|
{id: "effort-driven", name: "Effort Driven", field: "effortDriven"}
|
||||||
|
];
|
||||||
|
|
||||||
|
var options = {
|
||||||
|
enableCellNavigation: true,
|
||||||
|
enableColumnReorder: false,
|
||||||
|
explicitInitialization: true
|
||||||
|
};
|
||||||
|
|
||||||
|
$(function () {
|
||||||
|
var data = [];
|
||||||
|
for (var i = 0; i < 500; i++) {
|
||||||
|
data[i] = {
|
||||||
|
title: "Task " + i,
|
||||||
|
duration: "5 days",
|
||||||
|
percentComplete: Math.round(Math.random() * 100),
|
||||||
|
start: "01/01/2009",
|
||||||
|
finish: "01/05/2009",
|
||||||
|
effortDriven: (i % 5 == 0)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// create a detached container element
|
||||||
|
var myGrid = $("<div id='myGrid' style='width:600px;height:500px;'></div>");
|
||||||
|
grid = new Slick.Grid(myGrid, data, columns, options);
|
||||||
|
|
||||||
|
|
||||||
|
// ... later on, append the container to the DOM and initialize SlickGrid
|
||||||
|
myGrid.appendTo($("#myTable"));
|
||||||
|
grid.init();
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
402
static/sg/examples/example-grouping.html
Normal file
|
@ -0,0 +1,402 @@
|
||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<title>SlickGrid example: Grouping</title>
|
||||||
|
<link rel="stylesheet" href="../slick.grid.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="../controls/slick.pager.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="../css/smoothness/jquery-ui-1.8.16.custom.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="examples.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="../controls/slick.columnpicker.css" type="text/css"/>
|
||||||
|
<style>
|
||||||
|
.cell-effort-driven {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slick-group-title[level='0'] {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slick-group-title[level='1'] {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slick-group-title[level='2'] {
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div style="position:relative">
|
||||||
|
<div style="width:600px;">
|
||||||
|
<div class="grid-header" style="width:100%">
|
||||||
|
<label>SlickGrid</label>
|
||||||
|
</div>
|
||||||
|
<div id="myGrid" style="width:100%;height:500px;"></div>
|
||||||
|
<div id="pager" style="width:100%;height:20px;"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="options-panel" style="width:450px;">
|
||||||
|
<b>Options:</b>
|
||||||
|
<hr/>
|
||||||
|
<div style="padding:6px;">
|
||||||
|
<label style="width:200px;float:left">Show tasks with % at least: </label>
|
||||||
|
|
||||||
|
<div style="padding:2px;">
|
||||||
|
<div style="width:100px;display:inline-block;" id="pcSlider"></div>
|
||||||
|
</div>
|
||||||
|
<br/><br/>
|
||||||
|
<button onclick="loadData(50)">50 rows</button>
|
||||||
|
<button onclick="loadData(50000)">50k rows</button>
|
||||||
|
<button onclick="loadData(500000)">500k rows</button>
|
||||||
|
<hr/>
|
||||||
|
<button onclick="dataView.setGrouping([])">Clear grouping</button>
|
||||||
|
<br/>
|
||||||
|
<button onclick="groupByDuration()">Group by duration & sort groups by value</button>
|
||||||
|
<br/>
|
||||||
|
<button onclick="groupByDurationOrderByCount(false)">Group by duration & sort groups by count</button>
|
||||||
|
<br/>
|
||||||
|
<button onclick="groupByDurationOrderByCount(true)">Group by duration & sort groups by count, aggregate
|
||||||
|
collapsed
|
||||||
|
</button>
|
||||||
|
<br/>
|
||||||
|
<br/>
|
||||||
|
<button onclick="groupByDurationEffortDriven()">Group by duration then effort-driven</button>
|
||||||
|
<br/>
|
||||||
|
<button onclick="groupByDurationEffortDrivenPercent()">Group by duration then effort-driven then percent.</button>
|
||||||
|
<br/>
|
||||||
|
<br/>
|
||||||
|
<button onclick="dataView.collapseAllGroups()">Collapse all groups</button>
|
||||||
|
<br/>
|
||||||
|
<button onclick="dataView.expandAllGroups()">Expand all groups</button>
|
||||||
|
<br/>
|
||||||
|
</div>
|
||||||
|
<hr/>
|
||||||
|
<h2>Demonstrates:</h2>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
Fully dynamic and interactive multi-level grouping with filtering and aggregates over <b>50'000</b> items<br>
|
||||||
|
Each grouping level can have its own aggregates (over child rows, child groups, or all descendant rows).<br>
|
||||||
|
Personally, this is just the coolest slickest thing I've ever seen done with DHTML grids!
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<h2>View Source:</h2>
|
||||||
|
<ul>
|
||||||
|
<li><A href="https://github.com/mleibman/SlickGrid/blob/gh-pages/examples/example-grouping.html" target="_sourcewindow"> View the source for this example on Github</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<script src="../lib/firebugx.js"></script>
|
||||||
|
|
||||||
|
<script src="../lib/jquery-1.7.min.js"></script>
|
||||||
|
<script src="../lib/jquery-ui-1.8.16.custom.min.js"></script>
|
||||||
|
<script src="../lib/jquery.event.drag-2.2.js"></script>
|
||||||
|
|
||||||
|
<script src="../slick.core.js"></script>
|
||||||
|
<script src="../slick.formatters.js"></script>
|
||||||
|
<script src="../slick.editors.js"></script>
|
||||||
|
<script src="../plugins/slick.cellrangedecorator.js"></script>
|
||||||
|
<script src="../plugins/slick.cellrangeselector.js"></script>
|
||||||
|
<script src="../plugins/slick.cellselectionmodel.js"></script>
|
||||||
|
<script src="../slick.grid.js"></script>
|
||||||
|
<script src="../slick.groupitemmetadataprovider.js"></script>
|
||||||
|
<script src="../slick.dataview.js"></script>
|
||||||
|
<script src="../controls/slick.pager.js"></script>
|
||||||
|
<script src="../controls/slick.columnpicker.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
var dataView;
|
||||||
|
var grid;
|
||||||
|
var data = [];
|
||||||
|
var columns = [
|
||||||
|
{id: "sel", name: "#", field: "num", cssClass: "cell-selection", width: 40, resizable: false, selectable: false, focusable: false },
|
||||||
|
{id: "title", name: "Title", field: "title", width: 70, minWidth: 50, cssClass: "cell-title", sortable: true, editor: Slick.Editors.Text},
|
||||||
|
{id: "duration", name: "Duration", field: "duration", width: 70, sortable: true, groupTotalsFormatter: sumTotalsFormatter},
|
||||||
|
{id: "%", name: "% Complete", field: "percentComplete", width: 80, formatter: Slick.Formatters.PercentCompleteBar, sortable: true, groupTotalsFormatter: avgTotalsFormatter},
|
||||||
|
{id: "start", name: "Start", field: "start", minWidth: 60, sortable: true},
|
||||||
|
{id: "finish", name: "Finish", field: "finish", minWidth: 60, sortable: true},
|
||||||
|
{id: "cost", name: "Cost", field: "cost", width: 90, sortable: true, groupTotalsFormatter: sumTotalsFormatter},
|
||||||
|
{id: "effort-driven", name: "Effort Driven", width: 80, minWidth: 20, maxWidth: 80, cssClass: "cell-effort-driven", field: "effortDriven", formatter: Slick.Formatters.Checkmark, sortable: true}
|
||||||
|
];
|
||||||
|
|
||||||
|
var options = {
|
||||||
|
enableCellNavigation: true,
|
||||||
|
editable: true
|
||||||
|
};
|
||||||
|
|
||||||
|
var sortcol = "title";
|
||||||
|
var sortdir = 1;
|
||||||
|
var percentCompleteThreshold = 0;
|
||||||
|
var prevPercentCompleteThreshold = 0;
|
||||||
|
|
||||||
|
function avgTotalsFormatter(totals, columnDef) {
|
||||||
|
var val = totals.avg && totals.avg[columnDef.field];
|
||||||
|
if (val != null) {
|
||||||
|
return "avg: " + Math.round(val) + "%";
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
function sumTotalsFormatter(totals, columnDef) {
|
||||||
|
var val = totals.sum && totals.sum[columnDef.field];
|
||||||
|
if (val != null) {
|
||||||
|
return "total: " + ((Math.round(parseFloat(val)*100)/100));
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
function myFilter(item, args) {
|
||||||
|
return item["percentComplete"] >= args.percentComplete;
|
||||||
|
}
|
||||||
|
|
||||||
|
function percentCompleteSort(a, b) {
|
||||||
|
return a["percentComplete"] - b["percentComplete"];
|
||||||
|
}
|
||||||
|
|
||||||
|
function comparer(a, b) {
|
||||||
|
var x = a[sortcol], y = b[sortcol];
|
||||||
|
return (x == y ? 0 : (x > y ? 1 : -1));
|
||||||
|
}
|
||||||
|
|
||||||
|
function groupByDuration() {
|
||||||
|
dataView.setGrouping({
|
||||||
|
getter: "duration",
|
||||||
|
formatter: function (g) {
|
||||||
|
return "Duration: " + g.value + " <span style='color:green'>(" + g.count + " items)</span>";
|
||||||
|
},
|
||||||
|
aggregators: [
|
||||||
|
new Slick.Data.Aggregators.Avg("percentComplete"),
|
||||||
|
new Slick.Data.Aggregators.Sum("cost")
|
||||||
|
],
|
||||||
|
aggregateCollapsed: false,
|
||||||
|
lazyTotalsCalculation: true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function groupByDurationOrderByCount(aggregateCollapsed) {
|
||||||
|
dataView.setGrouping({
|
||||||
|
getter: "duration",
|
||||||
|
formatter: function (g) {
|
||||||
|
return "Duration: " + g.value + " <span style='color:green'>(" + g.count + " items)</span>";
|
||||||
|
},
|
||||||
|
comparer: function (a, b) {
|
||||||
|
return a.count - b.count;
|
||||||
|
},
|
||||||
|
aggregators: [
|
||||||
|
new Slick.Data.Aggregators.Avg("percentComplete"),
|
||||||
|
new Slick.Data.Aggregators.Sum("cost")
|
||||||
|
],
|
||||||
|
aggregateCollapsed: aggregateCollapsed,
|
||||||
|
lazyTotalsCalculation: true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function groupByDurationEffortDriven() {
|
||||||
|
dataView.setGrouping([
|
||||||
|
{
|
||||||
|
getter: "duration",
|
||||||
|
formatter :function (g) {
|
||||||
|
return "Duration: " + g.value + " <span style='color:green'>(" + g.count + " items)</span>";
|
||||||
|
},
|
||||||
|
aggregators: [
|
||||||
|
new Slick.Data.Aggregators.Sum("duration"),
|
||||||
|
new Slick.Data.Aggregators.Sum("cost")
|
||||||
|
],
|
||||||
|
aggregateCollapsed: true,
|
||||||
|
lazyTotalsCalculation: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
getter: "effortDriven",
|
||||||
|
formatter :function (g) {
|
||||||
|
return "Effort-Driven: " + (g.value ? "True" : "False") + " <span style='color:green'>(" + g.count + " items)</span>";
|
||||||
|
},
|
||||||
|
aggregators: [
|
||||||
|
new Slick.Data.Aggregators.Avg("percentComplete"),
|
||||||
|
new Slick.Data.Aggregators.Sum("cost")
|
||||||
|
],
|
||||||
|
collapsed: true,
|
||||||
|
lazyTotalsCalculation: true
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
function groupByDurationEffortDrivenPercent() {
|
||||||
|
dataView.setGrouping([
|
||||||
|
{
|
||||||
|
getter: "duration",
|
||||||
|
formatter: function (g) {
|
||||||
|
return "Duration: " + g.value + " <span style='color:green'>(" + g.count + " items)</span>";
|
||||||
|
},
|
||||||
|
aggregators: [
|
||||||
|
new Slick.Data.Aggregators.Sum("duration"),
|
||||||
|
new Slick.Data.Aggregators.Sum("cost")
|
||||||
|
],
|
||||||
|
aggregateCollapsed: true,
|
||||||
|
lazyTotalsCalculation: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
getter: "effortDriven",
|
||||||
|
formatter: function (g) {
|
||||||
|
return "Effort-Driven: " + (g.value ? "True" : "False") + " <span style='color:green'>(" + g.count + " items)</span>";
|
||||||
|
},
|
||||||
|
aggregators :[
|
||||||
|
new Slick.Data.Aggregators.Sum("duration"),
|
||||||
|
new Slick.Data.Aggregators.Sum("cost")
|
||||||
|
],
|
||||||
|
lazyTotalsCalculation: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
getter: "percentComplete",
|
||||||
|
formatter: function (g) {
|
||||||
|
return "% Complete: " + g.value + " <span style='color:green'>(" + g.count + " items)</span>";
|
||||||
|
},
|
||||||
|
aggregators: [
|
||||||
|
new Slick.Data.Aggregators.Avg("percentComplete")
|
||||||
|
],
|
||||||
|
aggregateCollapsed: true,
|
||||||
|
collapsed: true,
|
||||||
|
lazyTotalsCalculation: true
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
function loadData(count) {
|
||||||
|
var someDates = ["01/01/2009", "02/02/2009", "03/03/2009"];
|
||||||
|
data = [];
|
||||||
|
// prepare the data
|
||||||
|
for (var i = 0; i < count; i++) {
|
||||||
|
var d = (data[i] = {});
|
||||||
|
|
||||||
|
d["id"] = "id_" + i;
|
||||||
|
d["num"] = i;
|
||||||
|
d["title"] = "Task " + i;
|
||||||
|
d["duration"] = Math.round(Math.random() * 30);
|
||||||
|
d["percentComplete"] = Math.round(Math.random() * 100);
|
||||||
|
d["start"] = someDates[ Math.floor((Math.random()*2)) ];
|
||||||
|
d["finish"] = someDates[ Math.floor((Math.random()*2)) ];
|
||||||
|
d["cost"] = Math.round(Math.random() * 10000) / 100;
|
||||||
|
d["effortDriven"] = (i % 5 == 0);
|
||||||
|
}
|
||||||
|
dataView.setItems(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$(".grid-header .ui-icon")
|
||||||
|
.addClass("ui-state-default ui-corner-all")
|
||||||
|
.mouseover(function (e) {
|
||||||
|
$(e.target).addClass("ui-state-hover")
|
||||||
|
})
|
||||||
|
.mouseout(function (e) {
|
||||||
|
$(e.target).removeClass("ui-state-hover")
|
||||||
|
});
|
||||||
|
|
||||||
|
$(function () {
|
||||||
|
var groupItemMetadataProvider = new Slick.Data.GroupItemMetadataProvider();
|
||||||
|
dataView = new Slick.Data.DataView({
|
||||||
|
groupItemMetadataProvider: groupItemMetadataProvider,
|
||||||
|
inlineFilters: true
|
||||||
|
});
|
||||||
|
grid = new Slick.Grid("#myGrid", dataView, columns, options);
|
||||||
|
|
||||||
|
// register the group item metadata provider to add expand/collapse group handlers
|
||||||
|
grid.registerPlugin(groupItemMetadataProvider);
|
||||||
|
grid.setSelectionModel(new Slick.CellSelectionModel());
|
||||||
|
|
||||||
|
var pager = new Slick.Controls.Pager(dataView, grid, $("#pager"));
|
||||||
|
var columnpicker = new Slick.Controls.ColumnPicker(columns, grid, options);
|
||||||
|
|
||||||
|
|
||||||
|
grid.onSort.subscribe(function (e, args) {
|
||||||
|
sortdir = args.sortAsc ? 1 : -1;
|
||||||
|
sortcol = args.sortCol.field;
|
||||||
|
|
||||||
|
if ($.browser.msie && $.browser.version <= 8) {
|
||||||
|
// using temporary Object.prototype.toString override
|
||||||
|
// more limited and does lexicographic sort only by default, but can be much faster
|
||||||
|
|
||||||
|
var percentCompleteValueFn = function () {
|
||||||
|
var val = this["percentComplete"];
|
||||||
|
if (val < 10) {
|
||||||
|
return "00" + val;
|
||||||
|
} else if (val < 100) {
|
||||||
|
return "0" + val;
|
||||||
|
} else {
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// use numeric sort of % and lexicographic for everything else
|
||||||
|
dataView.fastSort((sortcol == "percentComplete") ? percentCompleteValueFn : sortcol, args.sortAsc);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// using native sort with comparer
|
||||||
|
// preferred method but can be very slow in IE with huge datasets
|
||||||
|
dataView.sort(comparer, args.sortAsc);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// wire up model events to drive the grid
|
||||||
|
dataView.onRowCountChanged.subscribe(function (e, args) {
|
||||||
|
grid.updateRowCount();
|
||||||
|
grid.render();
|
||||||
|
});
|
||||||
|
|
||||||
|
dataView.onRowsChanged.subscribe(function (e, args) {
|
||||||
|
grid.invalidateRows(args.rows);
|
||||||
|
grid.render();
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
var h_runfilters = null;
|
||||||
|
|
||||||
|
// wire up the slider to apply the filter to the model
|
||||||
|
$("#pcSlider,#pcSlider2").slider({
|
||||||
|
"range": "min",
|
||||||
|
"slide": function (event, ui) {
|
||||||
|
Slick.GlobalEditorLock.cancelCurrentEdit();
|
||||||
|
|
||||||
|
if (percentCompleteThreshold != ui.value) {
|
||||||
|
window.clearTimeout(h_runfilters);
|
||||||
|
h_runfilters = window.setTimeout(filterAndUpdate, 10);
|
||||||
|
percentCompleteThreshold = ui.value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
function filterAndUpdate() {
|
||||||
|
var isNarrowing = percentCompleteThreshold > prevPercentCompleteThreshold;
|
||||||
|
var isExpanding = percentCompleteThreshold < prevPercentCompleteThreshold;
|
||||||
|
var renderedRange = grid.getRenderedRange();
|
||||||
|
|
||||||
|
dataView.setFilterArgs({
|
||||||
|
percentComplete: percentCompleteThreshold
|
||||||
|
});
|
||||||
|
dataView.setRefreshHints({
|
||||||
|
ignoreDiffsBefore: renderedRange.top,
|
||||||
|
ignoreDiffsAfter: renderedRange.bottom + 1,
|
||||||
|
isFilterNarrowing: isNarrowing,
|
||||||
|
isFilterExpanding: isExpanding
|
||||||
|
});
|
||||||
|
dataView.refresh();
|
||||||
|
|
||||||
|
prevPercentCompleteThreshold = percentCompleteThreshold;
|
||||||
|
}
|
||||||
|
|
||||||
|
// initialize the model after all the events have been hooked up
|
||||||
|
dataView.beginUpdate();
|
||||||
|
dataView.setFilter(myFilter);
|
||||||
|
dataView.setFilterArgs({
|
||||||
|
percentComplete: percentCompleteThreshold
|
||||||
|
});
|
||||||
|
loadData(50);
|
||||||
|
groupByDuration();
|
||||||
|
dataView.endUpdate();
|
||||||
|
|
||||||
|
$("#gridContainer").resizable();
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
139
static/sg/examples/example-header-row.html
Normal file
|
@ -0,0 +1,139 @@
|
||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" href="../css/smoothness/jquery-ui-1.8.16.custom.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="../slick.grid.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="examples.css" type="text/css"/>
|
||||||
|
<style>
|
||||||
|
.slick-headerrow-column {
|
||||||
|
background: #87ceeb;
|
||||||
|
text-overflow: clip;
|
||||||
|
-moz-box-sizing: border-box;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slick-headerrow-column input {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
-moz-box-sizing: border-box;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div style="position:relative">
|
||||||
|
<div style="width:600px;">
|
||||||
|
<div id="myGrid" style="width:100%;height:500px;"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="options-panel">
|
||||||
|
<h2>Demonstrates:</h2>
|
||||||
|
<ul>
|
||||||
|
<li>Using a fixed header row to implement column-level filters</li>
|
||||||
|
<li>Type numbers in textboxes to filter grid data</li>
|
||||||
|
</ul>
|
||||||
|
<h2>View Source:</h2>
|
||||||
|
<ul>
|
||||||
|
<li><A href="https://github.com/mleibman/SlickGrid/blob/gh-pages/examples/example-header-row.html" target="_sourcewindow"> View the source for this example on Github</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="../lib/firebugx.js"></script>
|
||||||
|
|
||||||
|
<script src="../lib/jquery-1.7.min.js"></script>
|
||||||
|
<script src="../lib/jquery-ui-1.8.16.custom.min.js"></script>
|
||||||
|
<script src="../lib/jquery.event.drag-2.2.js"></script>
|
||||||
|
|
||||||
|
<script src="../slick.core.js"></script>
|
||||||
|
<script src="../slick.dataview.js"></script>
|
||||||
|
<script src="../slick.grid.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
var dataView;
|
||||||
|
var grid;
|
||||||
|
var data = [];
|
||||||
|
var options = {
|
||||||
|
enableCellNavigation: true,
|
||||||
|
showHeaderRow: true,
|
||||||
|
headerRowHeight: 30,
|
||||||
|
explicitInitialization: true
|
||||||
|
};
|
||||||
|
var columns = [];
|
||||||
|
var columnFilters = {};
|
||||||
|
|
||||||
|
for (var i = 0; i < 10; i++) {
|
||||||
|
columns.push({
|
||||||
|
id: i,
|
||||||
|
name: String.fromCharCode("A".charCodeAt(0) + i),
|
||||||
|
field: i,
|
||||||
|
width: 60
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function filter(item) {
|
||||||
|
for (var columnId in columnFilters) {
|
||||||
|
if (columnId !== undefined && columnFilters[columnId] !== "") {
|
||||||
|
var c = grid.getColumns()[grid.getColumnIndex(columnId)];
|
||||||
|
if (item[c.field] != columnFilters[columnId]) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
$(function () {
|
||||||
|
for (var i = 0; i < 100; i++) {
|
||||||
|
var d = (data[i] = {});
|
||||||
|
d["id"] = i;
|
||||||
|
for (var j = 0; j < columns.length; j++) {
|
||||||
|
d[j] = Math.round(Math.random() * 10);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dataView = new Slick.Data.DataView();
|
||||||
|
grid = new Slick.Grid("#myGrid", dataView, columns, options);
|
||||||
|
|
||||||
|
|
||||||
|
dataView.onRowCountChanged.subscribe(function (e, args) {
|
||||||
|
grid.updateRowCount();
|
||||||
|
grid.render();
|
||||||
|
});
|
||||||
|
|
||||||
|
dataView.onRowsChanged.subscribe(function (e, args) {
|
||||||
|
grid.invalidateRows(args.rows);
|
||||||
|
grid.render();
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
$(grid.getHeaderRow()).delegate(":input", "change keyup", function (e) {
|
||||||
|
var columnId = $(this).data("columnId");
|
||||||
|
if (columnId != null) {
|
||||||
|
columnFilters[columnId] = $.trim($(this).val());
|
||||||
|
dataView.refresh();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
grid.onHeaderRowCellRendered.subscribe(function(e, args) {
|
||||||
|
$(args.node).empty();
|
||||||
|
$("<input type='text'>")
|
||||||
|
.data("columnId", args.column.id)
|
||||||
|
.val(columnFilters[args.column.id])
|
||||||
|
.appendTo(args.node);
|
||||||
|
});
|
||||||
|
|
||||||
|
grid.init();
|
||||||
|
|
||||||
|
dataView.beginUpdate();
|
||||||
|
dataView.setItems(data);
|
||||||
|
dataView.setFilter(filter);
|
||||||
|
dataView.endUpdate();
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
99
static/sg/examples/example-multi-column-sort.html
Normal file
|
@ -0,0 +1,99 @@
|
||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<title>SlickGrid example: Multi Column Sort</title>
|
||||||
|
<link rel="stylesheet" href="../slick.grid.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="../css/smoothness/jquery-ui-1.8.16.custom.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="examples.css" type="text/css"/>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<table width="100%">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="50%">
|
||||||
|
<div id="myGrid" style="width:600px;height:500px;"></div>
|
||||||
|
</td>
|
||||||
|
<td valign="top">
|
||||||
|
<h2>Demonstrates:</h2>
|
||||||
|
<ul>
|
||||||
|
<li>basic grid with multi-column sort option</li>
|
||||||
|
</ul>
|
||||||
|
<h2>View Source:</h2>
|
||||||
|
<ul>
|
||||||
|
<li><A href="https://github.com/mleibman/SlickGrid/blob/gh-pages/examples/example-multi-column-sort.html" target="_sourcewindow"> View the source for this example on Github</a></li>
|
||||||
|
</ul>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<script src="../lib/jquery-1.7.min.js"></script>
|
||||||
|
<script src="../lib/jquery.event.drag-2.2.js"></script>
|
||||||
|
|
||||||
|
<script src="../slick.core.js"></script>
|
||||||
|
<script src="../slick.grid.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
var grid;
|
||||||
|
var columns = [
|
||||||
|
{ id: "title", name: "Title", field: "title", sortable: true },
|
||||||
|
{ id: "duration", name: "Duration", field: "duration", sortable: true, formatter: dayFormatter },
|
||||||
|
{ id: "%", name: "% Complete", field: "percentComplete", sortable: true },
|
||||||
|
{ id: "start", name: "Start", field: "start", formatter: dateFormatter, sortable: true },
|
||||||
|
{ id: "finish", name: "Finish", field: "finish", formatter: dateFormatter, sortable: true },
|
||||||
|
{ id: "effort-driven", name: "Effort Driven", field: "effortDriven", sortable: true }
|
||||||
|
];
|
||||||
|
|
||||||
|
function dayFormatter(row, cell, value, columnDef, dataContext) {
|
||||||
|
return value + ' days';
|
||||||
|
}
|
||||||
|
|
||||||
|
function dateFormatter(row, cell, value, columnDef, dataContext) {
|
||||||
|
return value.getMonth() + '/' + value.getDate() + '/' + value.getFullYear();
|
||||||
|
}
|
||||||
|
|
||||||
|
var options = {
|
||||||
|
enableCellNavigation: true,
|
||||||
|
enableColumnReorder: false,
|
||||||
|
multiColumnSort: true
|
||||||
|
};
|
||||||
|
|
||||||
|
$(function () {
|
||||||
|
var MS_PER_DAY = 24 * 60 * 60 * 1000;
|
||||||
|
var data = [];
|
||||||
|
for (var i = 0; i < 500; i++) {
|
||||||
|
var startDate = new Date(new Date("1/1/1980").getTime() + Math.round(Math.random() * 365 * 25) * MS_PER_DAY);
|
||||||
|
var endDate = new Date(startDate.getTime() + Math.round(Math.random() * 365) * MS_PER_DAY);
|
||||||
|
data[i] = {
|
||||||
|
title: "Task " + i,
|
||||||
|
duration: Math.round(Math.random() * 30) + 2,
|
||||||
|
percentComplete: Math.round(Math.random() * 100),
|
||||||
|
start: startDate,
|
||||||
|
finish: endDate,
|
||||||
|
effortDriven: (i % 5 == 0)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
grid = new Slick.Grid("#myGrid", data, columns, options);
|
||||||
|
|
||||||
|
grid.onSort.subscribe(function (e, args) {
|
||||||
|
var cols = args.sortCols;
|
||||||
|
|
||||||
|
data.sort(function (dataRow1, dataRow2) {
|
||||||
|
for (var i = 0, l = cols.length; i < l; i++) {
|
||||||
|
var field = cols[i].sortCol.field;
|
||||||
|
var sign = cols[i].sortAsc ? 1 : -1;
|
||||||
|
var value1 = dataRow1[field], value2 = dataRow2[field];
|
||||||
|
var result = (value1 == value2 ? 0 : (value1 > value2 ? 1 : -1)) * sign;
|
||||||
|
if (result != 0) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
});
|
||||||
|
grid.invalidate();
|
||||||
|
grid.render();
|
||||||
|
});
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
182
static/sg/examples/example-optimizing-dataview.html
Normal file
|
@ -0,0 +1,182 @@
|
||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<title>SlickGrid example: Optimizing DataView</title>
|
||||||
|
<link rel="stylesheet" href="../slick.grid.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="../css/smoothness/jquery-ui-1.8.16.custom.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="../controls/slick.pager.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="examples.css" type="text/css"/>
|
||||||
|
<style>
|
||||||
|
.cell-title {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cell-effort-driven {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cell-selection {
|
||||||
|
border-right-color: silver;
|
||||||
|
border-right-style: solid;
|
||||||
|
background: #f5f5f5;
|
||||||
|
color: gray;
|
||||||
|
text-align: right;
|
||||||
|
font-size: 10px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div style="position:relative">
|
||||||
|
<div style="width:600px;">
|
||||||
|
<div class="grid-header" style="width:100%">
|
||||||
|
<label>SlickGrid</label>
|
||||||
|
</div>
|
||||||
|
<div id="myGrid" style="width:100%;height:500px;"></div>
|
||||||
|
<div id="pager" style="width:100%;height:20px;"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="options-panel">
|
||||||
|
<b>Search:</b>
|
||||||
|
<hr/>
|
||||||
|
<div style="padding:6px;">
|
||||||
|
<label style="width:200px;float:left">Show tasks with % at least: </label>
|
||||||
|
|
||||||
|
<div style="padding:2px;">
|
||||||
|
<div style="width:100px;display:inline-block;" id="pcSlider"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
This page demonstrates various techniques for optimizing DataView performance
|
||||||
|
for large client-side datasets. This page displays an interactive grid with
|
||||||
|
500'000 rows with real-time filtering.<br/>
|
||||||
|
This is achieved by:
|
||||||
|
<ul>
|
||||||
|
<li>Inlining filter function to cut down on the cost of function calls.</li>
|
||||||
|
<li>Providing hints to indicate whether a filtering operation will result in
|
||||||
|
narrowing or expanding scope or whether the scope is unchanged.
|
||||||
|
</li>
|
||||||
|
<li>Providing a range of rows for which onRowsChanged even should be fired.</li>
|
||||||
|
</ul>
|
||||||
|
</p>
|
||||||
|
<h2>View Source:</h2>
|
||||||
|
<ul>
|
||||||
|
<li><A href="https://github.com/mleibman/SlickGrid/blob/gh-pages/examples/example-optimizing-dataview.html" target="_sourcewindow"> View the source for this example on Github</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<script src="../lib/jquery-1.7.min.js"></script>
|
||||||
|
<script src="../lib/jquery-ui-1.8.16.custom.min.js"></script>
|
||||||
|
<script src="../lib/jquery.event.drag-2.2.js"></script>
|
||||||
|
|
||||||
|
<script src="../slick.core.js"></script>
|
||||||
|
<script src="../slick.formatters.js"></script>
|
||||||
|
<script src="../slick.grid.js"></script>
|
||||||
|
<script src="../slick.dataview.js"></script>
|
||||||
|
<script src="../controls/slick.pager.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
var dataView;
|
||||||
|
var grid;
|
||||||
|
var data = [];
|
||||||
|
var columns = [
|
||||||
|
{id: "sel", name: "#", field: "num", behavior: "select", cssClass: "cell-selection", width: 40, resizable: false, selectable: false },
|
||||||
|
{id: "title", name: "Title", field: "title", width: 120, minWidth: 120, cssClass: "cell-title"},
|
||||||
|
{id: "duration", name: "Duration", field: "duration"},
|
||||||
|
{id: "%", name: "% Complete", field: "percentComplete", width: 80, resizable: false, formatter: Slick.Formatters.PercentCompleteBar},
|
||||||
|
{id: "start", name: "Start", field: "start", minWidth: 60},
|
||||||
|
{id: "finish", name: "Finish", field: "finish", minWidth: 60},
|
||||||
|
{id: "effort-driven", name: "Effort Driven", width: 80, minWidth: 20, maxWidth: 80, cssClass: "cell-effort-driven", field: "effortDriven", formatter: Slick.Formatters.Checkmark}
|
||||||
|
];
|
||||||
|
|
||||||
|
var options = {
|
||||||
|
editable: false,
|
||||||
|
enableAddRow: false,
|
||||||
|
enableCellNavigation: true
|
||||||
|
};
|
||||||
|
|
||||||
|
var percentCompleteThreshold = 0;
|
||||||
|
var prevPercentCompleteThreshold = 0;
|
||||||
|
var h_runfilters = null;
|
||||||
|
|
||||||
|
function myFilter(item, args) {
|
||||||
|
return item["percentComplete"] >= args;
|
||||||
|
}
|
||||||
|
|
||||||
|
function DataItem(i) {
|
||||||
|
this.num = i;
|
||||||
|
this.id = "id_" + i;
|
||||||
|
this.percentComplete = Math.round(Math.random() * 100);
|
||||||
|
this.effortDriven = (i % 5 == 0);
|
||||||
|
this.start = "01/01/2009";
|
||||||
|
this.finish = "01/05/2009";
|
||||||
|
this.title = "Task " + i;
|
||||||
|
this.duration = "5 days";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$(function () {
|
||||||
|
// prepare the data
|
||||||
|
for (var i = 0; i < 500000; i++) {
|
||||||
|
data[i] = new DataItem(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
dataView = new Slick.Data.DataView({ inlineFilters: true });
|
||||||
|
grid = new Slick.Grid("#myGrid", dataView, columns, options);
|
||||||
|
var pager = new Slick.Controls.Pager(dataView, grid, $("#pager"));
|
||||||
|
|
||||||
|
// wire up model events to drive the grid
|
||||||
|
dataView.onRowCountChanged.subscribe(function (e, args) {
|
||||||
|
grid.updateRowCount();
|
||||||
|
grid.render();
|
||||||
|
});
|
||||||
|
|
||||||
|
dataView.onRowsChanged.subscribe(function (e, args) {
|
||||||
|
grid.invalidateRows(args.rows);
|
||||||
|
grid.render();
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// wire up the slider to apply the filter to the model
|
||||||
|
$("#pcSlider").slider({
|
||||||
|
"range": "min",
|
||||||
|
"slide": function (event, ui) {
|
||||||
|
if (percentCompleteThreshold != ui.value) {
|
||||||
|
window.clearTimeout(h_runfilters);
|
||||||
|
h_runfilters = window.setTimeout(filterAndUpdate, 10);
|
||||||
|
percentCompleteThreshold = ui.value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function filterAndUpdate() {
|
||||||
|
var isNarrowing = percentCompleteThreshold > prevPercentCompleteThreshold;
|
||||||
|
var isExpanding = percentCompleteThreshold < prevPercentCompleteThreshold;
|
||||||
|
var renderedRange = grid.getRenderedRange();
|
||||||
|
|
||||||
|
dataView.setFilterArgs(percentCompleteThreshold);
|
||||||
|
dataView.setRefreshHints({
|
||||||
|
ignoreDiffsBefore: renderedRange.top,
|
||||||
|
ignoreDiffsAfter: renderedRange.bottom + 1,
|
||||||
|
isFilterNarrowing: isNarrowing,
|
||||||
|
isFilterExpanding: isExpanding
|
||||||
|
});
|
||||||
|
dataView.refresh();
|
||||||
|
|
||||||
|
prevPercentCompleteThreshold = percentCompleteThreshold;
|
||||||
|
}
|
||||||
|
|
||||||
|
// initialize the model after all the events have been hooked up
|
||||||
|
dataView.beginUpdate();
|
||||||
|
dataView.setItems(data);
|
||||||
|
dataView.setFilter(myFilter);
|
||||||
|
dataView.setFilterArgs(0);
|
||||||
|
dataView.endUpdate();
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
167
static/sg/examples/example-plugin-headerbuttons.html
Normal file
|
@ -0,0 +1,167 @@
|
||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<link rel="stylesheet" href="../css/smoothness/jquery-ui-1.8.16.custom.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="../slick.grid.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="examples.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="../plugins/slick.headerbuttons.css" type="text/css"/>
|
||||||
|
<style>
|
||||||
|
.icon-highlight-off,
|
||||||
|
.icon-highlight-on {
|
||||||
|
background-image: url(../images/bullet_blue.png);
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-highlight-off {
|
||||||
|
opacity: 0.2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.negative-highlight {
|
||||||
|
background: red;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div style="position:relative">
|
||||||
|
<div style="width:600px;">
|
||||||
|
<div id="myGrid" style="width:100%;height:500px;"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="options-panel">
|
||||||
|
<p>
|
||||||
|
This example demonstrates using the <b>Slick.Plugins.HeaderButtons</b> plugin to easily add buttons to column
|
||||||
|
headers. These buttons can be specified directly in the column definition, and are very easy to configure and use.
|
||||||
|
</p>
|
||||||
|
<h2>View Source:</h2>
|
||||||
|
<ul>
|
||||||
|
<li><A href="https://github.com/mleibman/SlickGrid/blob/gh-pages/examples/example-plugin-headerbuttons.html" target="_sourcewindow"> View the source for this example on Github</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="../lib/firebugx.js"></script>
|
||||||
|
|
||||||
|
<script src="../lib/jquery-1.7.min.js"></script>
|
||||||
|
<script src="../lib/jquery-ui-1.8.16.custom.min.js"></script>
|
||||||
|
<script src="../lib/jquery.event.drag-2.2.js"></script>
|
||||||
|
|
||||||
|
<script src="../slick.core.js"></script>
|
||||||
|
<script src="../slick.grid.js"></script>
|
||||||
|
<script src="../plugins/slick.headerbuttons.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
var grid;
|
||||||
|
var data = [];
|
||||||
|
var options = {
|
||||||
|
enableCellNavigation: true
|
||||||
|
};
|
||||||
|
var columns = [];
|
||||||
|
var columnsWithHighlightingById = {};
|
||||||
|
|
||||||
|
|
||||||
|
// Set up some test columns.
|
||||||
|
for (var i = 0; i < 10; i++) {
|
||||||
|
columns.push({
|
||||||
|
id: i,
|
||||||
|
name: String.fromCharCode("A".charCodeAt(0) + i),
|
||||||
|
field: i,
|
||||||
|
width: 90,
|
||||||
|
sortable: true,
|
||||||
|
formatter: highlightingFormatter,
|
||||||
|
header: {
|
||||||
|
buttons: [
|
||||||
|
{
|
||||||
|
cssClass: "icon-highlight-off",
|
||||||
|
command: "toggle-highlight",
|
||||||
|
tooltip: "Highlight negative numbers."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set multiple buttons on the first column to demonstrate overflow.
|
||||||
|
columns[0].name = "Resize me!";
|
||||||
|
columns[0].header = {
|
||||||
|
buttons: [
|
||||||
|
{
|
||||||
|
image: "../images/tag_red.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
image: "../images/comment_yellow.gif"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
image: "../images/info.gif"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
image: "../images/help.png"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
// Set a button on the second column to demonstrate hover.
|
||||||
|
columns[1].name = "Hover me!";
|
||||||
|
columns[1].header = {
|
||||||
|
buttons: [
|
||||||
|
{
|
||||||
|
image: "../images/help.png",
|
||||||
|
showOnHover: true,
|
||||||
|
tooltip: "This button only appears on hover.",
|
||||||
|
handler: function(e) {
|
||||||
|
alert('Help');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Set up some test data.
|
||||||
|
for (var i = 0; i < 100; i++) {
|
||||||
|
var d = (data[i] = {});
|
||||||
|
d["id"] = i;
|
||||||
|
for (var j = 0; j < columns.length; j++) {
|
||||||
|
d[j] = Math.round(Math.random() * 10) - 5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function highlightingFormatter(row, cell, value, columnDef, dataContext) {
|
||||||
|
if (columnsWithHighlightingById[columnDef.id] && value < 0) {
|
||||||
|
return "<div style='color:red; font-weight:bold;'>" + value + "</div>";
|
||||||
|
} else {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
$(function () {
|
||||||
|
grid = new Slick.Grid("#myGrid", data, columns, options);
|
||||||
|
|
||||||
|
var headerButtonsPlugin = new Slick.Plugins.HeaderButtons();
|
||||||
|
|
||||||
|
headerButtonsPlugin.onCommand.subscribe(function(e, args) {
|
||||||
|
var column = args.column;
|
||||||
|
var button = args.button;
|
||||||
|
var command = args.command;
|
||||||
|
|
||||||
|
if (command == "toggle-highlight") {
|
||||||
|
if (button.cssClass == "icon-highlight-on") {
|
||||||
|
delete columnsWithHighlightingById[column.id];
|
||||||
|
button.cssClass = "icon-highlight-off";
|
||||||
|
button.tooltip = "Highlight negative numbers."
|
||||||
|
} else {
|
||||||
|
columnsWithHighlightingById[column.id] = true;
|
||||||
|
button.cssClass = "icon-highlight-on";
|
||||||
|
button.tooltip = "Remove highlight."
|
||||||
|
}
|
||||||
|
|
||||||
|
grid.invalidate();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
grid.registerPlugin(headerButtonsPlugin);
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
154
static/sg/examples/example-plugin-headermenu.html
Normal file
|
@ -0,0 +1,154 @@
|
||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" href="../slick.grid.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="../css/smoothness/jquery-ui-1.8.16.custom.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="../plugins/slick.headermenu.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="examples.css" type="text/css"/>
|
||||||
|
<style>
|
||||||
|
/**
|
||||||
|
* Style the drop-down menu here since the plugin stylesheet mostly contains structural CSS.
|
||||||
|
*/
|
||||||
|
|
||||||
|
.slick-header-menu {
|
||||||
|
border: 1px solid #718BB7;
|
||||||
|
background: #f0f0f0;
|
||||||
|
padding: 2px;
|
||||||
|
-moz-box-shadow: 2px 2px 2px silver;
|
||||||
|
-webkit-box-shadow: 2px 2px 2px silver;
|
||||||
|
min-width: 100px;
|
||||||
|
z-index: 20;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.slick-header-menuitem {
|
||||||
|
padding: 2px 4px;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slick-header-menuitem:hover {
|
||||||
|
border-color: silver;
|
||||||
|
background: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slick-header-menuitem-disabled {
|
||||||
|
border-color: transparent !important;
|
||||||
|
background: inherit !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-help {
|
||||||
|
background-image: url(../images/help.png);
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div style="position:relative">
|
||||||
|
<div style="width:600px;">
|
||||||
|
<div id="myGrid" style="width:100%;height:500px;"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="options-panel">
|
||||||
|
<p>
|
||||||
|
This example demonstrates using the <b>Slick.Plugins.HeaderMenu</b> plugin to add drop-down menus to column
|
||||||
|
headers. (Hover over the headers.)
|
||||||
|
</p>
|
||||||
|
<h2>View Source:</h2>
|
||||||
|
<ul>
|
||||||
|
<li><A href="https://github.com/mleibman/SlickGrid/blob/gh-pages/examples/example-plugin-headermenu.html" target="_sourcewindow"> View the source for this example on Github</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="../lib/jquery-1.7.min.js"></script>
|
||||||
|
<script src="../lib/jquery.event.drag-2.2.js"></script>
|
||||||
|
|
||||||
|
<script src="../slick.core.js"></script>
|
||||||
|
<script src="../slick.grid.js"></script>
|
||||||
|
<script src="../plugins/slick.headermenu.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
var grid;
|
||||||
|
var columns = [
|
||||||
|
{id: "title", name: "Title", field: "title"},
|
||||||
|
{id: "duration", name: "Duration", field: "duration"},
|
||||||
|
{id: "%", name: "% Complete", field: "percentComplete"},
|
||||||
|
{id: "start", name: "Start", field: "start"},
|
||||||
|
{id: "finish", name: "Finish", field: "finish"},
|
||||||
|
{id: "effort-driven", name: "Effort Driven", field: "effortDriven"}
|
||||||
|
];
|
||||||
|
|
||||||
|
for (var i = 0; i < columns.length; i++) {
|
||||||
|
columns[i].header = {
|
||||||
|
menu: {
|
||||||
|
items: [
|
||||||
|
{
|
||||||
|
iconImage: "../images/sort-asc.gif",
|
||||||
|
title: "Sort Ascending",
|
||||||
|
command: "sort-asc"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
iconImage: "../images/sort-desc.gif",
|
||||||
|
title: "Sort Descending",
|
||||||
|
command: "sort-desc"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Hide Column",
|
||||||
|
command: "hide",
|
||||||
|
disabled: true,
|
||||||
|
tooltip: "Can't hide this column"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
iconCssClass: "icon-help",
|
||||||
|
title: "Help",
|
||||||
|
command: "help"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
var options = {
|
||||||
|
enableColumnReorder: false
|
||||||
|
};
|
||||||
|
|
||||||
|
$(function () {
|
||||||
|
var data = [];
|
||||||
|
for (var i = 0; i < 500; i++) {
|
||||||
|
data[i] = {
|
||||||
|
title: "Task " + i,
|
||||||
|
duration: "5 days",
|
||||||
|
percentComplete: Math.round(Math.random() * 100),
|
||||||
|
start: "01/01/2009",
|
||||||
|
finish: "01/05/2009",
|
||||||
|
effortDriven: (i % 5 == 0)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
grid = new Slick.Grid("#myGrid", data, columns, options);
|
||||||
|
|
||||||
|
var headerMenuPlugin = new Slick.Plugins.HeaderMenu({});
|
||||||
|
|
||||||
|
headerMenuPlugin.onBeforeMenuShow.subscribe(function(e, args) {
|
||||||
|
var menu = args.menu;
|
||||||
|
|
||||||
|
// We can add or modify the menu here, or cancel it by returning false.
|
||||||
|
var i = menu.items.length;
|
||||||
|
menu.items.push({
|
||||||
|
title: "Menu item " + i,
|
||||||
|
command: "item" + i
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
headerMenuPlugin.onCommand.subscribe(function(e, args) {
|
||||||
|
alert("Command: " + args.command);
|
||||||
|
});
|
||||||
|
|
||||||
|
grid.registerPlugin(headerMenuPlugin);
|
||||||
|
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
175
static/sg/examples/example-spreadsheet.html
Normal file
|
@ -0,0 +1,175 @@
|
||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<title>SlickGrid example 3: Editing</title>
|
||||||
|
<link rel="stylesheet" href="../slick.grid.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="../css/smoothness/jquery-ui-1.8.16.custom.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="examples.css" type="text/css"/>
|
||||||
|
<style>
|
||||||
|
.slick-cell.copied {
|
||||||
|
background: blue;
|
||||||
|
background: rgba(0, 0, 255, 0.2);
|
||||||
|
-webkit-transition: 0.5s background;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div style="position:relative">
|
||||||
|
<div style="width:600px;">
|
||||||
|
<div id="myGrid" style="width:100%;height:500px;"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="options-panel">
|
||||||
|
<h2>Demonstrates:</h2>
|
||||||
|
<ul>
|
||||||
|
<li>Virtual scrolling on both rows and columns.</li>
|
||||||
|
<li>Select a range of cells with a mouse</li>
|
||||||
|
<li>Use Ctrl-C and Ctrl-V keyboard shortcuts to cut and paste cells</li>
|
||||||
|
<li>Use Esc to cancel a copy and paste operation</li>
|
||||||
|
<li>Edit the cell and select a cell range to paste the range</li>
|
||||||
|
</ul>
|
||||||
|
<h2>View Source:</h2>
|
||||||
|
<ul>
|
||||||
|
<li><A href="https://github.com/mleibman/SlickGrid/blob/gh-pages/examples/example-spreadsheet.html" target="_sourcewindow"> View the source for this example on Github</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="../lib/firebugx.js"></script>
|
||||||
|
|
||||||
|
<script src="../lib/jquery-1.7.min.js"></script>
|
||||||
|
<script src="../lib/jquery-ui-1.8.16.custom.min.js"></script>
|
||||||
|
<script src="../lib/jquery.event.drag-2.2.js"></script>
|
||||||
|
|
||||||
|
<script src="../slick.core.js"></script>
|
||||||
|
<script src="../plugins/slick.autotooltips.js"></script>
|
||||||
|
<script src="../plugins/slick.cellrangedecorator.js"></script>
|
||||||
|
<script src="../plugins/slick.cellrangeselector.js"></script>
|
||||||
|
<script src="../plugins/slick.cellcopymanager.js"></script>
|
||||||
|
<script src="../plugins/slick.cellselectionmodel.js"></script>
|
||||||
|
<script src="../slick.editors.js"></script>
|
||||||
|
<script src="../slick.grid.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
var grid;
|
||||||
|
var data = [];
|
||||||
|
var options = {
|
||||||
|
editable: true,
|
||||||
|
enableAddRow: true,
|
||||||
|
enableCellNavigation: true,
|
||||||
|
asyncEditorLoading: false,
|
||||||
|
autoEdit: false
|
||||||
|
};
|
||||||
|
|
||||||
|
var columns = [
|
||||||
|
{
|
||||||
|
id: "selector",
|
||||||
|
name: "",
|
||||||
|
field: "num",
|
||||||
|
width: 30
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
for (var i = 0; i < 100; i++) {
|
||||||
|
columns.push({
|
||||||
|
id: i,
|
||||||
|
name: String.fromCharCode("A".charCodeAt(0) + (i / 26) | 0) +
|
||||||
|
String.fromCharCode("A".charCodeAt(0) + (i % 26)),
|
||||||
|
field: i,
|
||||||
|
width: 60,
|
||||||
|
editor: FormulaEditor
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/***
|
||||||
|
* A proof-of-concept cell editor with Excel-like range selection and insertion.
|
||||||
|
*/
|
||||||
|
function FormulaEditor(args) {
|
||||||
|
var _self = this;
|
||||||
|
var _editor = new Slick.Editors.Text(args);
|
||||||
|
var _selector;
|
||||||
|
|
||||||
|
$.extend(this, _editor);
|
||||||
|
|
||||||
|
function init() {
|
||||||
|
// register a plugin to select a range and append it to the textbox
|
||||||
|
// since events are fired in reverse order (most recently added are executed first),
|
||||||
|
// this will override other plugins like moverows or selection model and will
|
||||||
|
// not require the grid to not be in the edit mode
|
||||||
|
_selector = new Slick.CellRangeSelector();
|
||||||
|
_selector.onCellRangeSelected.subscribe(_self.handleCellRangeSelected);
|
||||||
|
args.grid.registerPlugin(_selector);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.destroy = function () {
|
||||||
|
_selector.onCellRangeSelected.unsubscribe(_self.handleCellRangeSelected);
|
||||||
|
grid.unregisterPlugin(_selector);
|
||||||
|
_editor.destroy();
|
||||||
|
};
|
||||||
|
|
||||||
|
this.handleCellRangeSelected = function (e, args) {
|
||||||
|
_editor.setValue(
|
||||||
|
_editor.getValue() +
|
||||||
|
grid.getColumns()[args.range.fromCell].name +
|
||||||
|
args.range.fromRow +
|
||||||
|
":" +
|
||||||
|
grid.getColumns()[args.range.toCell].name +
|
||||||
|
args.range.toRow
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$(function () {
|
||||||
|
for (var i = 0; i < 100; i++) {
|
||||||
|
var d = (data[i] = {});
|
||||||
|
d["num"] = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
grid = new Slick.Grid("#myGrid", data, columns, options);
|
||||||
|
|
||||||
|
grid.setSelectionModel(new Slick.CellSelectionModel());
|
||||||
|
grid.registerPlugin(new Slick.AutoTooltips());
|
||||||
|
|
||||||
|
// set keyboard focus on the grid
|
||||||
|
grid.getCanvasNode().focus();
|
||||||
|
|
||||||
|
var copyManager = new Slick.CellCopyManager();
|
||||||
|
grid.registerPlugin(copyManager);
|
||||||
|
|
||||||
|
copyManager.onPasteCells.subscribe(function (e, args) {
|
||||||
|
if (args.from.length !== 1 || args.to.length !== 1) {
|
||||||
|
throw "This implementation only supports single range copy and paste operations";
|
||||||
|
}
|
||||||
|
|
||||||
|
var from = args.from[0];
|
||||||
|
var to = args.to[0];
|
||||||
|
var val;
|
||||||
|
for (var i = 0; i <= from.toRow - from.fromRow; i++) {
|
||||||
|
for (var j = 0; j <= from.toCell - from.fromCell; j++) {
|
||||||
|
if (i <= to.toRow - to.fromRow && j <= to.toCell - to.fromCell) {
|
||||||
|
val = data[from.fromRow + i][columns[from.fromCell + j].field];
|
||||||
|
data[to.fromRow + i][columns[to.fromCell + j].field] = val;
|
||||||
|
grid.invalidateRow(to.fromRow + i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
grid.render();
|
||||||
|
});
|
||||||
|
|
||||||
|
grid.onAddNewRow.subscribe(function (e, args) {
|
||||||
|
var item = args.item;
|
||||||
|
var column = args.column;
|
||||||
|
grid.invalidateRow(data.length);
|
||||||
|
data.push(item);
|
||||||
|
grid.updateRowCount();
|
||||||
|
grid.render();
|
||||||
|
});
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
134
static/sg/examples/example-totals-via-data-provider.html
Normal file
|
@ -0,0 +1,134 @@
|
||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<link rel="stylesheet" href="../css/smoothness/jquery-ui-1.8.16.custom.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="../slick.grid.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="examples.css" type="text/css"/>
|
||||||
|
<style>
|
||||||
|
.totals {
|
||||||
|
font-weight: bold;
|
||||||
|
color: gray;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div style="position:relative">
|
||||||
|
<div style="width:600px;">
|
||||||
|
<div id="myGrid" style="width:100%;height:500px;"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="options-panel">
|
||||||
|
<h2>Demonstrates:</h2>
|
||||||
|
<ul>
|
||||||
|
<li>Implementing a data provider to create a totals row at the end of the grid.</li>
|
||||||
|
<li>This is a simplification of what the DataView does. </li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<h2>View Source:</h2>
|
||||||
|
<ul>
|
||||||
|
<li><A href="https://github.com/mleibman/SlickGrid/blob/gh-pages/examples/example-totals-via-data-provider.html" target="_sourcewindow"> View the source for this example on Github</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="../lib/firebugx.js"></script>
|
||||||
|
|
||||||
|
<script src="../lib/jquery-1.7.min.js"></script>
|
||||||
|
<script src="../lib/jquery-ui-1.8.16.custom.min.js"></script>
|
||||||
|
<script src="../lib/jquery.event.drag-2.2.js"></script>
|
||||||
|
|
||||||
|
<script src="../slick.core.js"></script>
|
||||||
|
<script src="../slick.editors.js"></script>
|
||||||
|
<script src="../slick.grid.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
var grid;
|
||||||
|
var data = [];
|
||||||
|
var options = {
|
||||||
|
enableCellNavigation: true,
|
||||||
|
headerRowHeight: 30,
|
||||||
|
editable: true
|
||||||
|
};
|
||||||
|
|
||||||
|
var columns = [];
|
||||||
|
for (var i = 0; i < 10; i++) {
|
||||||
|
columns.push({
|
||||||
|
id: i,
|
||||||
|
name: String.fromCharCode("A".charCodeAt(0) + i),
|
||||||
|
field: i,
|
||||||
|
width: 60,
|
||||||
|
editor: Slick.Editors.Integer
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function TotalsDataProvider(data, columns) {
|
||||||
|
var totals = {};
|
||||||
|
var totalsMetadata = {
|
||||||
|
// Style the totals row differently.
|
||||||
|
cssClasses: "totals",
|
||||||
|
columns: {}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Make the totals not editable.
|
||||||
|
for (var i = 0; i < columns.length; i++) {
|
||||||
|
totalsMetadata.columns[i] = { editor: null };
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
this.getLength = function() {
|
||||||
|
return data.length + 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.getItem = function(index) {
|
||||||
|
return (index < data.length) ? data[index] : totals;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.updateTotals = function() {
|
||||||
|
var columnIdx = columns.length;
|
||||||
|
while (columnIdx--) {
|
||||||
|
var columnId = columns[columnIdx].id;
|
||||||
|
var total = 0;
|
||||||
|
var i = data.length;
|
||||||
|
while (i--) {
|
||||||
|
total += (parseInt(data[i][columnId], 10) || 0);
|
||||||
|
}
|
||||||
|
totals[columnId] = "Sum: " + total;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.getItemMetadata = function(index) {
|
||||||
|
return (index != data.length) ? null : totalsMetadata;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.updateTotals();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
$(function () {
|
||||||
|
for (var i = 0; i < 10; i++) {
|
||||||
|
var d = (data[i] = {});
|
||||||
|
d["id"] = i;
|
||||||
|
for (var j = 0; j < columns.length; j++) {
|
||||||
|
d[j] = Math.round(Math.random() * 10);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var dataProvider = new TotalsDataProvider(data, columns);
|
||||||
|
|
||||||
|
grid = new Slick.Grid("#myGrid", dataProvider, columns, options);
|
||||||
|
|
||||||
|
grid.onCellChange.subscribe(function(e, args) {
|
||||||
|
// The data has changed - recalculate the totals.
|
||||||
|
dataProvider.updateTotals();
|
||||||
|
|
||||||
|
// Rerender the totals row (last row).
|
||||||
|
grid.invalidateRow(dataProvider.getLength() - 1);
|
||||||
|
grid.render();
|
||||||
|
});
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
68
static/sg/examples/example1-simple.html
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<title>SlickGrid example 1: Basic grid</title>
|
||||||
|
<link rel="stylesheet" href="../slick.grid.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="../css/smoothness/jquery-ui-1.8.16.custom.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="examples.css" type="text/css"/>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<table width="100%">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="50%">
|
||||||
|
<div id="myGrid" style="width:600px;height:500px;"></div>
|
||||||
|
</td>
|
||||||
|
<td valign="top">
|
||||||
|
<h2>Demonstrates:</h2>
|
||||||
|
<ul>
|
||||||
|
<li>basic grid with minimal configuration</li>
|
||||||
|
</ul>
|
||||||
|
<h2>View Source:</h2>
|
||||||
|
<ul>
|
||||||
|
<li><A href="https://github.com/mleibman/SlickGrid/blob/gh-pages/examples/example1-simple.html" target="_sourcewindow"> View the source for this example on Github</a></li>
|
||||||
|
</ul>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<script src="../lib/jquery-1.7.min.js"></script>
|
||||||
|
<script src="../lib/jquery.event.drag-2.2.js"></script>
|
||||||
|
|
||||||
|
<script src="../slick.core.js"></script>
|
||||||
|
<script src="../slick.grid.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
var grid;
|
||||||
|
var columns = [
|
||||||
|
{id: "title", name: "Title", field: "title"},
|
||||||
|
{id: "duration", name: "Duration", field: "duration"},
|
||||||
|
{id: "%", name: "% Complete", field: "percentComplete"},
|
||||||
|
{id: "start", name: "Start", field: "start"},
|
||||||
|
{id: "finish", name: "Finish", field: "finish"},
|
||||||
|
{id: "effort-driven", name: "Effort Driven", field: "effortDriven"}
|
||||||
|
];
|
||||||
|
|
||||||
|
var options = {
|
||||||
|
enableCellNavigation: true,
|
||||||
|
enableColumnReorder: false
|
||||||
|
};
|
||||||
|
|
||||||
|
$(function () {
|
||||||
|
var data = [];
|
||||||
|
for (var i = 0; i < 500; i++) {
|
||||||
|
data[i] = {
|
||||||
|
title: "Task " + i,
|
||||||
|
duration: "5 days",
|
||||||
|
percentComplete: Math.round(Math.random() * 100),
|
||||||
|
start: "01/01/2009",
|
||||||
|
finish: "01/05/2009",
|
||||||
|
effortDriven: (i % 5 == 0)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
grid = new Slick.Grid("#myGrid", data, columns, options);
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
134
static/sg/examples/example10-async-post-render.html
Normal file
|
@ -0,0 +1,134 @@
|
||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<title>SlickGrid example 10: Async post render</title>
|
||||||
|
<link rel="stylesheet" href="../slick.grid.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="../css/smoothness/jquery-ui-1.8.16.custom.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="examples.css" type="text/css"/>
|
||||||
|
<style>
|
||||||
|
.cell-title {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cell-effort-driven {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.description * {
|
||||||
|
font-size: 11pt;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div style="width:600px;float:left;">
|
||||||
|
<div class="grid-header" style="width:100%">
|
||||||
|
<label>Scores:</label>
|
||||||
|
</div>
|
||||||
|
<div id="myGrid" style="width:100%;height:500px;"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style="margin-left:650px;margin-top:40px;" class="description">
|
||||||
|
<h2>Demonstrates:</h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
With SlickGrid, you can still have rich, complex cells rendered against the actual DOM nodes while still preserving
|
||||||
|
the speed and responsiveness.
|
||||||
|
This is achieved through async background post-rendering.
|
||||||
|
SlickGrid exposes a <u>asyncPostRender</u> property on a column which you can use to set your own function that will
|
||||||
|
manipulate the cell DOM node directly.
|
||||||
|
The event is fired one by one for all visible rows in the viewport on a timer so it doesn't impact the UI
|
||||||
|
responsiveness.
|
||||||
|
You should still make sure that post-processing one row doesn't take too long though.
|
||||||
|
SlickGrid will figure out what and when needs to be updated for you.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
The example below is a list of 500 rows with a title and 5 integer cells followed by graphical representation of
|
||||||
|
these integers.
|
||||||
|
The graph is drawn using a CANVAS element in the background.
|
||||||
|
The grid is editable, so you can edit the numbers and see the changes reflected (almost) immediately in the graph.
|
||||||
|
The graph cell behaves just like an ordinary cell and can be resized/reordered.
|
||||||
|
The graphs themselves are created using the excellent <a href="http://www.omnipotent.net/jquery.sparkline/"
|
||||||
|
target="_blank">jQuery Sparklines</a> library.
|
||||||
|
</p>
|
||||||
|
<h2>View Source:</h2>
|
||||||
|
<ul>
|
||||||
|
<li><A href="https://github.com/mleibman/SlickGrid/blob/gh-pages/examples/example10-async-post-render.html" target="_sourcewindow"> View the source for this example on Github</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="../lib/firebugx.js"></script>
|
||||||
|
|
||||||
|
<script src="../lib/jquery-1.7.min.js"></script>
|
||||||
|
<script src="../lib/jquery-ui-1.8.16.custom.min.js"></script>
|
||||||
|
<script src="../lib/jquery.event.drag-2.2.js"></script>
|
||||||
|
<script src="../lib/jquery.sparkline.min.js"></script>
|
||||||
|
|
||||||
|
<script src="../slick.core.js"></script>
|
||||||
|
<script src="../slick.editors.js"></script>
|
||||||
|
<script src="../slick.grid.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
function requiredFieldValidator(value) {
|
||||||
|
if (value == null || value == undefined || !value.length) {
|
||||||
|
return {valid: false, msg: "This is a required field"};
|
||||||
|
} else {
|
||||||
|
return {valid: true, msg: null};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function waitingFormatter(value) {
|
||||||
|
return "wait...";
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderSparkline(cellNode, row, dataContext, colDef) {
|
||||||
|
var vals = [
|
||||||
|
dataContext["n1"],
|
||||||
|
dataContext["n2"],
|
||||||
|
dataContext["n3"],
|
||||||
|
dataContext["n4"],
|
||||||
|
dataContext["n5"]
|
||||||
|
];
|
||||||
|
|
||||||
|
$(cellNode).empty().sparkline(vals, {width: "100%"});
|
||||||
|
}
|
||||||
|
|
||||||
|
var grid;
|
||||||
|
var data = [];
|
||||||
|
var columns = [
|
||||||
|
{id: "title", name: "Title", field: "title", sortable: false, width: 120, cssClass: "cell-title"},
|
||||||
|
{id: "n1", name: "1", field: "n1", sortable: false, editor: Slick.Editors.Integer, width: 40, validator: requiredFieldValidator},
|
||||||
|
{id: "n2", name: "2", field: "n2", sortable: false, editor: Slick.Editors.Integer, width: 40, validator: requiredFieldValidator},
|
||||||
|
{id: "n3", name: "3", field: "n3", sortable: false, editor: Slick.Editors.Integer, width: 40, validator: requiredFieldValidator},
|
||||||
|
{id: "n4", name: "4", field: "n4", sortable: false, editor: Slick.Editors.Integer, width: 40, validator: requiredFieldValidator},
|
||||||
|
{id: "n5", name: "5", field: "n5", sortable: false, editor: Slick.Editors.Integer, width: 40, validator: requiredFieldValidator},
|
||||||
|
{id: "chart", name: "Chart", sortable: false, width: 60, formatter: waitingFormatter, rerenderOnResize: true, asyncPostRender: renderSparkline}
|
||||||
|
];
|
||||||
|
|
||||||
|
var options = {
|
||||||
|
editable: true,
|
||||||
|
enableAddRow: false,
|
||||||
|
enableCellNavigation: true,
|
||||||
|
asyncEditorLoading: false,
|
||||||
|
enableAsyncPostRender: true
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
$(function () {
|
||||||
|
for (var i = 0; i < 500; i++) {
|
||||||
|
var d = (data[i] = {});
|
||||||
|
|
||||||
|
d["title"] = "Record " + i;
|
||||||
|
d["n1"] = Math.round(Math.random() * 10);
|
||||||
|
d["n2"] = Math.round(Math.random() * 10);
|
||||||
|
d["n3"] = Math.round(Math.random() * 10);
|
||||||
|
d["n4"] = Math.round(Math.random() * 10);
|
||||||
|
d["n5"] = Math.round(Math.random() * 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
grid = new Slick.Grid("#myGrid", data, columns, options);
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
87
static/sg/examples/example11-autoheight.html
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
|
||||||
|
<title>SlickGrid example 11: No vertical scrolling (autoHeight)</title>
|
||||||
|
<link rel="stylesheet" href="../slick.grid.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="examples.css" type="text/css"/>
|
||||||
|
<style>
|
||||||
|
html, body {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
font: 11px Helvetica, Arial, sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
#container {
|
||||||
|
margin: 10px;
|
||||||
|
border: solid 1px gray;
|
||||||
|
width: 480px;
|
||||||
|
background: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
#description {
|
||||||
|
position: fixed;
|
||||||
|
top: 30px;
|
||||||
|
right: 30px;
|
||||||
|
width: 25em;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="container"></div>
|
||||||
|
<div id="description">
|
||||||
|
<h2>Demonstrates:</h2>
|
||||||
|
<ul>
|
||||||
|
<li>autoHeight:true grid option</li>
|
||||||
|
</ul>
|
||||||
|
<h2>View Source:</h2>
|
||||||
|
<ul>
|
||||||
|
<li><A href="https://github.com/mleibman/SlickGrid/blob/gh-pages/examples/example11-autoheight.html" target="_sourcewindow"> View the source for this example on Github</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="../lib/jquery-1.7.min.js"></script>
|
||||||
|
<script src="../lib/jquery-ui-1.8.16.custom.min.js"></script>
|
||||||
|
<script src="../lib/jquery.event.drag-2.2.js"></script>
|
||||||
|
|
||||||
|
<script src="../slick.core.js"></script>
|
||||||
|
<script src="../slick.grid.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
var grid,
|
||||||
|
data = [],
|
||||||
|
columns = [
|
||||||
|
{ id: "title", name: "Title", field: "title" },
|
||||||
|
{ id: "duration", name: "Duration", field: "duration" },
|
||||||
|
{ id: "%", name: "% Complete", field: "percentComplete" },
|
||||||
|
{ id: "start", name: "Start", field: "start" },
|
||||||
|
{ id: "finish", name: "Finish", field: "finish" },
|
||||||
|
{ id: "effort-driven", name: "Effort Driven", field: "effortDriven" }
|
||||||
|
],
|
||||||
|
options = {
|
||||||
|
editable: false,
|
||||||
|
enableAddRow: false,
|
||||||
|
enableCellNavigation: false,
|
||||||
|
autoHeight: true
|
||||||
|
};
|
||||||
|
|
||||||
|
for (var i = 100; i-- > 0;) {
|
||||||
|
data[i] = {
|
||||||
|
title: "Task " + i,
|
||||||
|
duration: "5 days",
|
||||||
|
percentComplete: Math.round(Math.random() * 100),
|
||||||
|
start: "01/01/2009",
|
||||||
|
finish: "01/05/2009",
|
||||||
|
effortDriven: (i % 5 == 0)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
grid = new Slick.Grid("#container", data, columns, options);
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
116
static/sg/examples/example12-fillbrowser.html
Normal file
|
@ -0,0 +1,116 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
|
||||||
|
<title>SlickGrid example 12: Fill browser</title>
|
||||||
|
<link rel="stylesheet" href="../slick.grid.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="examples.css" type="text/css"/>
|
||||||
|
<style>
|
||||||
|
html, body {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
background-color: White;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
font: 11px Helvetica, Arial, sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
#container {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#description {
|
||||||
|
position: fixed;
|
||||||
|
top: 30px;
|
||||||
|
right: 30px;
|
||||||
|
width: 25em;
|
||||||
|
background: beige;
|
||||||
|
border: solid 1px gray;
|
||||||
|
z-index: 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
#description h2 {
|
||||||
|
padding-left: 0.5em;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="container"></div>
|
||||||
|
<div id="description">
|
||||||
|
<h2>Demonstrates:</h2>
|
||||||
|
<ul>
|
||||||
|
<li>Grid filling browser window completely (using absolute positioning)</li>
|
||||||
|
<li>Grid resizing when browser window changes size</li>
|
||||||
|
<li>Overall performance of the grid when displaying large tabular data (17 columns x 10,000 rows)</li>
|
||||||
|
</ul>
|
||||||
|
<h2>View Source:</h2>
|
||||||
|
<ul>
|
||||||
|
<li><A href="https://github.com/mleibman/SlickGrid/blob/gh-pages/examples/example12-fillbrowser.html" target="_sourcewindow"> View the source for this example on Github</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="../lib/jquery-1.7.min.js"></script>
|
||||||
|
<script src="../lib/jquery.event.drag-2.2.js"></script>
|
||||||
|
|
||||||
|
<script src="../slick.core.js"></script>
|
||||||
|
<script src="../slick.grid.js"></script>
|
||||||
|
<script>
|
||||||
|
var grid,
|
||||||
|
data = [],
|
||||||
|
columns = [
|
||||||
|
{ id: "title", name: "Title", field: "title", width: 120 },
|
||||||
|
{ id: "duration", name: "Duration", field: "duration", width: 120 },
|
||||||
|
{ id: "%", name: "% Complete", field: "percentComplete", width: 120 },
|
||||||
|
{ id: "start", name: "Start", field: "start", width: 120 },
|
||||||
|
{ id: "finish", name: "Finish", field: "finish", width: 120 },
|
||||||
|
{ id: "effort-driven", name: "Effort Driven", field: "effortDriven", width: 120 },
|
||||||
|
{ id: "c7", name: "C7", field: "c7", width: 120 },
|
||||||
|
{ id: "c8", name: "C8", field: "c8", width: 120 },
|
||||||
|
{ id: "c9", name: "C9", field: "c9", width: 120 },
|
||||||
|
{ id: "c10", name: "C10", field: "c10", width: 120 },
|
||||||
|
{ id: "c11", name: "C11", field: "c11", width: 120 },
|
||||||
|
{ id: "c12", name: "C12", field: "c12", width: 120 },
|
||||||
|
{ id: "c13", name: "C13", field: "c13", width: 120 },
|
||||||
|
{ id: "c14", name: "C14", field: "c14", width: 120 },
|
||||||
|
{ id: "c15", name: "C15", field: "c15", width: 120 },
|
||||||
|
{ id: "c16", name: "C16", field: "c16", width: 120 },
|
||||||
|
{ id: "c17", name: "C17", field: "c17", width: 120 }
|
||||||
|
],
|
||||||
|
options = {
|
||||||
|
enableCellNavigation: false,
|
||||||
|
enableColumnReorder: false
|
||||||
|
};
|
||||||
|
|
||||||
|
for (var i = 10000; i-- > 0;) {
|
||||||
|
data[i] = {
|
||||||
|
title: "Task " + i,
|
||||||
|
duration: "5 days",
|
||||||
|
percentComplete: Math.round(Math.random() * 100),
|
||||||
|
start: "01/01/2009",
|
||||||
|
finish: "01/05/2009",
|
||||||
|
effortDriven: (i % 5 == 0),
|
||||||
|
c7: "C7-" + i,
|
||||||
|
c8: "C8-" + i,
|
||||||
|
c9: "C9-" + i,
|
||||||
|
c10: "C10-" + i,
|
||||||
|
c11: "C11-" + i,
|
||||||
|
c12: "C12-" + i,
|
||||||
|
c13: "C13-" + i,
|
||||||
|
c14: "C14-" + i,
|
||||||
|
c15: "C15-" + i,
|
||||||
|
c16: "C16-" + i,
|
||||||
|
c17: "C17-" + i
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
grid = new Slick.Grid("#container", data, columns, options);
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
125
static/sg/examples/example13-getItem-sorting.html
Normal file
|
@ -0,0 +1,125 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
|
||||||
|
<title>SlickGrid example 13: Indexed Sorting using Functional Data Provider</title>
|
||||||
|
<link rel="stylesheet" href="../slick.grid.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="examples.css" type="text/css"/>
|
||||||
|
<style>
|
||||||
|
html, body {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
background-color: White;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
font: 11px Helvetica, Arial, sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
#container {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#description {
|
||||||
|
position: fixed;
|
||||||
|
top: 30px;
|
||||||
|
right: 30px;
|
||||||
|
width: 25em;
|
||||||
|
background-color: beige;
|
||||||
|
border: solid 1px gray;
|
||||||
|
z-index: 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
#description h2 {
|
||||||
|
padding-left: 0.5em;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="container"></div>
|
||||||
|
<div id="description">
|
||||||
|
<h2>Demonstrates:</h2>
|
||||||
|
<ul>
|
||||||
|
<li>Sorting grid items by an index</li>
|
||||||
|
<li>Using the getItem method to provide data</li>
|
||||||
|
</ul>
|
||||||
|
<h2>View Source:</h2>
|
||||||
|
<ul>
|
||||||
|
<li><A href="https://github.com/mleibman/SlickGrid/blob/gh-pages/examples/example13-getItem-sorting.html" target="_sourcewindow"> View the source for this example on Github</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="../lib/jquery-1.7.min.js"></script>
|
||||||
|
<script src="../lib/jquery.event.drag-2.2.js"></script>
|
||||||
|
<script src="../slick.core.js"></script>
|
||||||
|
<script src="../slick.grid.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
var grid,
|
||||||
|
data = [],
|
||||||
|
columns = [
|
||||||
|
{ id: "title", name: "Title", field: "title", width: 240, sortable: true },
|
||||||
|
{ id: "c1", name: "Sort 1", field: "c1", width: 240, sortable: true },
|
||||||
|
{ id: "c2", name: "Sort 2", field: "c2", width: 240, sortable: true },
|
||||||
|
{ id: "c3", name: "Sort 3", field: "c3", width: 240, sortable: true }
|
||||||
|
],
|
||||||
|
options = {
|
||||||
|
enableCellNavigation: false,
|
||||||
|
enableColumnReorder: false
|
||||||
|
},
|
||||||
|
numberOfItems = 25000, items = [], indices, isAsc = true, currentSortCol = { id: "title" }, i;
|
||||||
|
|
||||||
|
// Copies and shuffles the specified array and returns a new shuffled array.
|
||||||
|
function randomize(items) {
|
||||||
|
var randomItems = $.extend(true, null, items), randomIndex, temp, index;
|
||||||
|
for (index = items.length; index-- > 0;) {
|
||||||
|
randomIndex = Math.round(Math.random() * items.length - 1);
|
||||||
|
if (randomIndex > -1) {
|
||||||
|
temp = randomItems[randomIndex];
|
||||||
|
randomItems[randomIndex] = randomItems[index];
|
||||||
|
randomItems[index] = temp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return randomItems;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Build the items and indices.
|
||||||
|
for (i = numberOfItems; i-- > 0;) {
|
||||||
|
items[i] = i;
|
||||||
|
data[i] = {
|
||||||
|
title: "Task ".concat(i + 1)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
indices = { title: items, c1: randomize(items), c2: randomize(items), c3: randomize(items) };
|
||||||
|
|
||||||
|
// Assign values to the data.
|
||||||
|
for (i = numberOfItems; i-- > 0;) {
|
||||||
|
data[indices.c1[i]].c1 = "Value ".concat(i + 1);
|
||||||
|
data[indices.c2[i]].c2 = "Value ".concat(i + 1);
|
||||||
|
data[indices.c3[i]].c3 = "Value ".concat(i + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Define function used to get the data and sort it.
|
||||||
|
function getItem(index) {
|
||||||
|
return isAsc ? data[indices[currentSortCol.id][index]] : data[indices[currentSortCol.id][(data.length - 1) - index]];
|
||||||
|
}
|
||||||
|
function getLength() {
|
||||||
|
return data.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
grid = new Slick.Grid("#container", {getLength: getLength, getItem: getItem}, columns, options);
|
||||||
|
grid.onSort.subscribe(function (e, args) {
|
||||||
|
currentSortCol = args.sortCol;
|
||||||
|
isAsc = args.sortAsc;
|
||||||
|
grid.invalidateAllRows();
|
||||||
|
grid.render();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
157
static/sg/examples/example14-highlighting.html
Normal file
|
@ -0,0 +1,157 @@
|
||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<title>SlickGrid example 14: Highlighting and Flashing cells</title>
|
||||||
|
<link rel="stylesheet" href="../slick.grid.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="../css/smoothness/jquery-ui-1.8.16.custom.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="examples.css" type="text/css"/>
|
||||||
|
<style>
|
||||||
|
.load-medium {
|
||||||
|
color: orange;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.load-hi {
|
||||||
|
color: red;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.changed {
|
||||||
|
background: pink;
|
||||||
|
}
|
||||||
|
|
||||||
|
.current-server {
|
||||||
|
border: 1px solid black;
|
||||||
|
background: orange;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div style="position:relative">
|
||||||
|
<div style="width:520px;">
|
||||||
|
<div id="myGrid" style="width:100%;height:500px;"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="options-panel">
|
||||||
|
<h2>About</h2>
|
||||||
|
This example simulates a real-time display of CPU utilization in a web farm.
|
||||||
|
Data is updated in real-time, and cells with changed data are highlighted.
|
||||||
|
You can also click "Find current server" to scroll the row displaying data for the current
|
||||||
|
server into view and flash it.
|
||||||
|
<h2>Demonstrates</h2>
|
||||||
|
<ul>
|
||||||
|
<li>setHighlightedCells()</li>
|
||||||
|
<li>flashCell()</li>
|
||||||
|
</ul>
|
||||||
|
<h2>Controls</h2>
|
||||||
|
<button onclick="simulateRealTimeUpdates()">Start simulation</button>
|
||||||
|
<button onclick="findCurrentServer()">Find current server</button>
|
||||||
|
<h2>View Source:</h2>
|
||||||
|
<ul>
|
||||||
|
<li><A href="https://github.com/mleibman/SlickGrid/blob/gh-pages/examples/example14-highlighting.html" target="_sourcewindow"> View the source for this example on Github</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="../lib/firebugx.js"></script>
|
||||||
|
|
||||||
|
<script src="../lib/jquery-1.7.min.js"></script>
|
||||||
|
<script src="../lib/jquery-ui-1.8.16.custom.min.js"></script>
|
||||||
|
<script src="../lib/jquery.event.drag-2.2.js"></script>
|
||||||
|
|
||||||
|
<script src="../slick.core.js"></script>
|
||||||
|
<script src="../plugins/slick.cellselectionmodel.js"></script>
|
||||||
|
<script src="../plugins/slick.rowmovemanager.js"></script>
|
||||||
|
<script src="../slick.grid.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
var grid;
|
||||||
|
var data = [];
|
||||||
|
var columns = [
|
||||||
|
{id: "server", name: "Server", field: "server", width: 180}
|
||||||
|
];
|
||||||
|
var currentServer;
|
||||||
|
|
||||||
|
function cpuUtilizationFormatter(row, cell, value, columnDef, dataContext) {
|
||||||
|
if (value > 90) {
|
||||||
|
return "<span class='load-hi'>" + value + "%</span>";
|
||||||
|
}
|
||||||
|
else if (value > 70) {
|
||||||
|
return "<span class='load-medium'>" + value + "%</span>";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return value + "%";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 0; i < 4; i++) {
|
||||||
|
columns.push({
|
||||||
|
id: "cpu" + i,
|
||||||
|
name: "CPU" + i,
|
||||||
|
field: i,
|
||||||
|
width: 80,
|
||||||
|
formatter: cpuUtilizationFormatter
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
var options = {
|
||||||
|
editable: false,
|
||||||
|
enableAddRow: false,
|
||||||
|
enableCellNavigation: true,
|
||||||
|
cellHighlightCssClass: "changed",
|
||||||
|
cellFlashingCssClass: "current-server"
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
$(function () {
|
||||||
|
for (var i = 0; i < 500; i++) {
|
||||||
|
var d = (data[i] = {});
|
||||||
|
d.server = "Server " + i;
|
||||||
|
for (var j = 0; j < columns.length; j++) {
|
||||||
|
d[j] = Math.round(Math.random() * 100);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
grid = new Slick.Grid("#myGrid", data, columns, options);
|
||||||
|
|
||||||
|
currentServer = Math.round(Math.random() * (data.length - 1));
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
function simulateRealTimeUpdates() {
|
||||||
|
var changes = {};
|
||||||
|
var numberOfUpdates = Math.round(Math.random() * (data.length / 10));
|
||||||
|
for (var i = 0; i < numberOfUpdates; i++) {
|
||||||
|
var server = Math.round(Math.random() * (data.length - 1));
|
||||||
|
var cpu = Math.round(Math.random() * (columns.length - 1));
|
||||||
|
var delta = Math.round(Math.random() * 50) - 25;
|
||||||
|
var col = grid.getColumnIndex("cpu" + cpu);
|
||||||
|
var val = data[server][col] + delta;
|
||||||
|
val = Math.max(0, val);
|
||||||
|
val = Math.min(100, val);
|
||||||
|
|
||||||
|
data[server][col] = val;
|
||||||
|
|
||||||
|
if (!changes[server]) {
|
||||||
|
changes[server] = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
changes[server]["cpu" + cpu] = "changed";
|
||||||
|
|
||||||
|
grid.invalidateRow(server);
|
||||||
|
}
|
||||||
|
|
||||||
|
grid.setCellCssStyles("highlight", changes);
|
||||||
|
grid.render();
|
||||||
|
|
||||||
|
setTimeout(simulateRealTimeUpdates, 500);
|
||||||
|
}
|
||||||
|
|
||||||
|
function findCurrentServer() {
|
||||||
|
grid.scrollRowIntoView(currentServer);
|
||||||
|
grid.flashCell(currentServer, grid.getColumnIndex("server"), 100);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
93
static/sg/examples/example2-formatters.html
Normal file
|
@ -0,0 +1,93 @@
|
||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<title>SlickGrid example 2: Formatters</title>
|
||||||
|
<link rel="stylesheet" href="../slick.grid.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="../css/smoothness/jquery-ui-1.8.16.custom.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="examples.css" type="text/css"/>
|
||||||
|
<style>
|
||||||
|
.cell-title {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cell-effort-driven {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<input type=text>
|
||||||
|
|
||||||
|
<table width="100%">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="50%">
|
||||||
|
<div id="myGrid" style="width:600px;height:500px;"></div>
|
||||||
|
</td>
|
||||||
|
<td valign="top">
|
||||||
|
<h2>Demonstrates:</h2>
|
||||||
|
<ul>
|
||||||
|
<li>width, minWidth, maxWidth, resizable, cssClass column attributes</li>
|
||||||
|
<li>custom column formatters</li>
|
||||||
|
</ul>
|
||||||
|
<h2>View Source:</h2>
|
||||||
|
<ul>
|
||||||
|
<li><A href="https://github.com/mleibman/SlickGrid/blob/gh-pages/examples/example2-formatters.html" target="_sourcewindow"> View the source for this example on Github</a></li>
|
||||||
|
</ul>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<input type=text>
|
||||||
|
|
||||||
|
<script src="../lib/firebugx.js"></script>
|
||||||
|
|
||||||
|
<script src="../lib/jquery-1.7.min.js"></script>
|
||||||
|
<script src="../lib/jquery-ui-1.8.16.custom.min.js"></script>
|
||||||
|
<script src="../lib/jquery.event.drag-2.2.js"></script>
|
||||||
|
|
||||||
|
<script src="../slick.core.js"></script>
|
||||||
|
<script src="../slick.formatters.js"></script>
|
||||||
|
<script src="../slick.grid.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
function formatter(row, cell, value, columnDef, dataContext) {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
var grid;
|
||||||
|
var data = [];
|
||||||
|
var columns = [
|
||||||
|
{id: "title", name: "Title", field: "title", width: 120, cssClass: "cell-title", formatter: formatter},
|
||||||
|
{id: "duration", name: "Duration", field: "duration"},
|
||||||
|
{id: "%", name: "% Complete", field: "percentComplete", width: 80, resizable: false, formatter: Slick.Formatters.PercentCompleteBar},
|
||||||
|
{id: "start", name: "Start", field: "start", minWidth: 60},
|
||||||
|
{id: "finish", name: "Finish", field: "finish", minWidth: 60},
|
||||||
|
{id: "effort-driven", name: "Effort Driven", sortable: false, width: 80, minWidth: 20, maxWidth: 80, cssClass: "cell-effort-driven", field: "effortDriven", formatter: Slick.Formatters.Checkmark}
|
||||||
|
];
|
||||||
|
|
||||||
|
var options = {
|
||||||
|
editable: false,
|
||||||
|
enableAddRow: false,
|
||||||
|
enableCellNavigation: true
|
||||||
|
};
|
||||||
|
|
||||||
|
$(function () {
|
||||||
|
for (var i = 0; i < 5; i++) {
|
||||||
|
var d = (data[i] = {});
|
||||||
|
|
||||||
|
d["title"] = "<a href='#' tabindex='0'>Task</a> " + i;
|
||||||
|
d["duration"] = "5 days";
|
||||||
|
d["percentComplete"] = Math.min(100, Math.round(Math.random() * 110));
|
||||||
|
d["start"] = "01/01/2009";
|
||||||
|
d["finish"] = "01/05/2009";
|
||||||
|
d["effortDriven"] = (i % 5 == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
grid = new Slick.Grid("#myGrid", data, columns, options);
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
113
static/sg/examples/example3-editing.html
Normal file
|
@ -0,0 +1,113 @@
|
||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<title>SlickGrid example 3: Editing</title>
|
||||||
|
<link rel="stylesheet" href="../slick.grid.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="../css/smoothness/jquery-ui-1.8.16.custom.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="examples.css" type="text/css"/>
|
||||||
|
<style>
|
||||||
|
.cell-title {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cell-effort-driven {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div style="position:relative">
|
||||||
|
<div style="width:600px;">
|
||||||
|
<div id="myGrid" style="width:100%;height:500px;"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="options-panel">
|
||||||
|
<h2>Demonstrates:</h2>
|
||||||
|
<ul>
|
||||||
|
<li>adding basic keyboard navigation and editing</li>
|
||||||
|
<li>custom editors and validators</li>
|
||||||
|
<li>auto-edit settings</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Options:</h2>
|
||||||
|
<button onclick="grid.setOptions({autoEdit:true})">Auto-edit ON</button>
|
||||||
|
|
||||||
|
<button onclick="grid.setOptions({autoEdit:false})">Auto-edit OFF</button>
|
||||||
|
<h2>View Source:</h2>
|
||||||
|
<ul>
|
||||||
|
<li><A href="https://github.com/mleibman/SlickGrid/blob/gh-pages/examples/example3-editing.html" target="_sourcewindow"> View the source for this example on Github</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="../lib/firebugx.js"></script>
|
||||||
|
|
||||||
|
<script src="../lib/jquery-1.7.min.js"></script>
|
||||||
|
<script src="../lib/jquery-ui-1.8.16.custom.min.js"></script>
|
||||||
|
<script src="../lib/jquery.event.drag-2.2.js"></script>
|
||||||
|
|
||||||
|
<script src="../slick.core.js"></script>
|
||||||
|
<script src="../plugins/slick.cellrangedecorator.js"></script>
|
||||||
|
<script src="../plugins/slick.cellrangeselector.js"></script>
|
||||||
|
<script src="../plugins/slick.cellselectionmodel.js"></script>
|
||||||
|
<script src="../slick.formatters.js"></script>
|
||||||
|
<script src="../slick.editors.js"></script>
|
||||||
|
<script src="../slick.grid.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
function requiredFieldValidator(value) {
|
||||||
|
if (value == null || value == undefined || !value.length) {
|
||||||
|
return {valid: false, msg: "This is a required field"};
|
||||||
|
} else {
|
||||||
|
return {valid: true, msg: null};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var grid;
|
||||||
|
var data = [];
|
||||||
|
var columns = [
|
||||||
|
{id: "title", name: "Title", field: "title", width: 120, cssClass: "cell-title", editor: Slick.Editors.Text, validator: requiredFieldValidator},
|
||||||
|
{id: "desc", name: "Description", field: "description", width: 100, editor: Slick.Editors.LongText},
|
||||||
|
{id: "duration", name: "Duration", field: "duration", editor: Slick.Editors.Text},
|
||||||
|
{id: "%", name: "% Complete", field: "percentComplete", width: 80, resizable: false, formatter: Slick.Formatters.PercentCompleteBar, editor: Slick.Editors.PercentComplete},
|
||||||
|
{id: "start", name: "Start", field: "start", minWidth: 60, editor: Slick.Editors.Date},
|
||||||
|
{id: "finish", name: "Finish", field: "finish", minWidth: 60, editor: Slick.Editors.Date},
|
||||||
|
{id: "effort-driven", name: "Effort Driven", width: 80, minWidth: 20, maxWidth: 80, cssClass: "cell-effort-driven", field: "effortDriven", formatter: Slick.Formatters.Checkmark, editor: Slick.Editors.Checkbox}
|
||||||
|
];
|
||||||
|
var options = {
|
||||||
|
editable: true,
|
||||||
|
enableAddRow: true,
|
||||||
|
enableCellNavigation: true,
|
||||||
|
asyncEditorLoading: false,
|
||||||
|
autoEdit: false
|
||||||
|
};
|
||||||
|
|
||||||
|
$(function () {
|
||||||
|
for (var i = 0; i < 500; i++) {
|
||||||
|
var d = (data[i] = {});
|
||||||
|
|
||||||
|
d["title"] = "Task " + i;
|
||||||
|
d["description"] = "This is a sample task description.\n It can be multiline";
|
||||||
|
d["duration"] = "5 days";
|
||||||
|
d["percentComplete"] = Math.round(Math.random() * 100);
|
||||||
|
d["start"] = "01/01/2009";
|
||||||
|
d["finish"] = "01/05/2009";
|
||||||
|
d["effortDriven"] = (i % 5 == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
grid = new Slick.Grid("#myGrid", data, columns, options);
|
||||||
|
|
||||||
|
grid.setSelectionModel(new Slick.CellSelectionModel());
|
||||||
|
|
||||||
|
grid.onAddNewRow.subscribe(function (e, args) {
|
||||||
|
var item = args.item;
|
||||||
|
grid.invalidateRow(data.length);
|
||||||
|
data.push(item);
|
||||||
|
grid.updateRowCount();
|
||||||
|
grid.render();
|
||||||
|
});
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
149
static/sg/examples/example3a-compound-editors.html
Normal file
|
@ -0,0 +1,149 @@
|
||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<title>SlickGrid example 3a: Advanced Editing</title>
|
||||||
|
<link rel="stylesheet" href="../slick.grid.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="../css/smoothness/jquery-ui-1.8.16.custom.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="examples.css" type="text/css"/>
|
||||||
|
<style>
|
||||||
|
.cell-title {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<div style="position:relative">
|
||||||
|
<div style="width:600px;">
|
||||||
|
<div id="myGrid" style="width:100%;height:500px;"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="options-panel">
|
||||||
|
<h2>Demonstrates:</h2>
|
||||||
|
<ul>
|
||||||
|
<li>compound cell editors driving multiple fields from one cell</li>
|
||||||
|
<li>providing validation from the editor</li>
|
||||||
|
<li>hooking into validation events</li>
|
||||||
|
</ul>
|
||||||
|
<h2>View Source:</h2>
|
||||||
|
<ul>
|
||||||
|
<li><A href="https://github.com/mleibman/SlickGrid/blob/gh-pages/examples/example3a-compound-editors.html" target="_sourcewindow"> View the source for this example on Github</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="../lib/firebugx.js"></script>
|
||||||
|
|
||||||
|
<script src="../lib/jquery-1.7.min.js"></script>
|
||||||
|
<script src="../lib/jquery-ui-1.8.16.custom.min.js"></script>
|
||||||
|
<script src="../lib/jquery.event.drag-2.2.js"></script>
|
||||||
|
|
||||||
|
<script src="../slick.core.js"></script>
|
||||||
|
<script src="../slick.editors.js"></script>
|
||||||
|
<script src="../slick.grid.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
var grid;
|
||||||
|
var data = [];
|
||||||
|
var columns = [
|
||||||
|
{id: "title", name: "Title", field: "title", width: 120, cssClass: "cell-title", editor: Slick.Editors.Text},
|
||||||
|
{id: "range", name: "Range", width: 120, formatter: NumericRangeFormatter, editor: NumericRangeEditor}
|
||||||
|
];
|
||||||
|
|
||||||
|
var options = {
|
||||||
|
editable: true,
|
||||||
|
enableAddRow: false,
|
||||||
|
enableCellNavigation: true,
|
||||||
|
asyncEditorLoading: false
|
||||||
|
};
|
||||||
|
|
||||||
|
function NumericRangeFormatter(row, cell, value, columnDef, dataContext) {
|
||||||
|
return dataContext.from + " - " + dataContext.to;
|
||||||
|
}
|
||||||
|
|
||||||
|
function NumericRangeEditor(args) {
|
||||||
|
var $from, $to;
|
||||||
|
var scope = this;
|
||||||
|
|
||||||
|
this.init = function () {
|
||||||
|
$from = $("<INPUT type=text style='width:40px' />")
|
||||||
|
.appendTo(args.container)
|
||||||
|
.bind("keydown", scope.handleKeyDown);
|
||||||
|
|
||||||
|
$(args.container).append(" to ");
|
||||||
|
|
||||||
|
$to = $("<INPUT type=text style='width:40px' />")
|
||||||
|
.appendTo(args.container)
|
||||||
|
.bind("keydown", scope.handleKeyDown);
|
||||||
|
|
||||||
|
scope.focus();
|
||||||
|
};
|
||||||
|
|
||||||
|
this.handleKeyDown = function (e) {
|
||||||
|
if (e.keyCode == $.ui.keyCode.LEFT || e.keyCode == $.ui.keyCode.RIGHT || e.keyCode == $.ui.keyCode.TAB) {
|
||||||
|
e.stopImmediatePropagation();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.destroy = function () {
|
||||||
|
$(args.container).empty();
|
||||||
|
};
|
||||||
|
|
||||||
|
this.focus = function () {
|
||||||
|
$from.focus();
|
||||||
|
};
|
||||||
|
|
||||||
|
this.serializeValue = function () {
|
||||||
|
return {from: parseInt($from.val(), 10), to: parseInt($to.val(), 10)};
|
||||||
|
};
|
||||||
|
|
||||||
|
this.applyValue = function (item, state) {
|
||||||
|
item.from = state.from;
|
||||||
|
item.to = state.to;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.loadValue = function (item) {
|
||||||
|
$from.val(item.from);
|
||||||
|
$to.val(item.to);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.isValueChanged = function () {
|
||||||
|
return args.item.from != parseInt($from.val(), 10) || args.item.to != parseInt($from.val(), 10);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.validate = function () {
|
||||||
|
if (isNaN(parseInt($from.val(), 10)) || isNaN(parseInt($to.val(), 10))) {
|
||||||
|
return {valid: false, msg: "Please type in valid numbers."};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parseInt($from.val(), 10) > parseInt($to.val(), 10)) {
|
||||||
|
return {valid: false, msg: "'from' cannot be greater than 'to'"};
|
||||||
|
}
|
||||||
|
|
||||||
|
return {valid: true, msg: null};
|
||||||
|
};
|
||||||
|
|
||||||
|
this.init();
|
||||||
|
}
|
||||||
|
|
||||||
|
$(function () {
|
||||||
|
for (var i = 0; i < 500; i++) {
|
||||||
|
var d = (data[i] = {});
|
||||||
|
|
||||||
|
d["title"] = "Task " + i;
|
||||||
|
d["from"] = Math.round(Math.random() * 100);
|
||||||
|
d["to"] = d["from"] + Math.round(Math.random() * 100);
|
||||||
|
}
|
||||||
|
|
||||||
|
grid = new Slick.Grid("#myGrid", data, columns, options);
|
||||||
|
|
||||||
|
grid.onValidationError.subscribe(function (e, args) {
|
||||||
|
alert(args.validationResults.msg);
|
||||||
|
});
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
113
static/sg/examples/example3b-editing-with-undo.html
Normal file
|
@ -0,0 +1,113 @@
|
||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<title>SlickGrid example 3: Editing</title>
|
||||||
|
<link rel="stylesheet" href="../slick.grid.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="../css/smoothness/jquery-ui-1.8.16.custom.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="examples.css" type="text/css"/>
|
||||||
|
<style>
|
||||||
|
.cell-title {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cell-effort-driven {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div style="position:relative">
|
||||||
|
<div style="width:600px;">
|
||||||
|
<div id="myGrid" style="width:100%;height:500px;"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="options-panel">
|
||||||
|
<h2>Demonstrates:</h2>
|
||||||
|
<ul>
|
||||||
|
<li>Using "editCommandHandler" option to intercept edit commands and implement undo support</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Controls:</h2>
|
||||||
|
<button onclick="undo()"><img src="../images/arrow_undo.png" align="absmiddle"> Undo</button>
|
||||||
|
<h2>View Source:</h2>
|
||||||
|
<ul>
|
||||||
|
<li><A href="https://github.com/mleibman/SlickGrid/blob/gh-pages/examples/example3b-editing-with-undo.html" target="_sourcewindow"> View the source for this example on Github</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="../lib/firebugx.js"></script>
|
||||||
|
|
||||||
|
<script src="../lib/jquery-1.7.min.js"></script>
|
||||||
|
<script src="../lib/jquery-ui-1.8.16.custom.min.js"></script>
|
||||||
|
<script src="../lib/jquery.event.drag-2.2.js"></script>
|
||||||
|
|
||||||
|
<script src="../slick.core.js"></script>
|
||||||
|
<script src="../slick.formatters.js"></script>
|
||||||
|
<script src="../slick.editors.js"></script>
|
||||||
|
<script src="../slick.grid.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
function requiredFieldValidator(value) {
|
||||||
|
if (value == null || value == undefined || !value.length) {
|
||||||
|
return {valid: false, msg: "This is a required field"};
|
||||||
|
} else {
|
||||||
|
return {valid: true, msg: null};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var grid;
|
||||||
|
var data = [];
|
||||||
|
var columns = [
|
||||||
|
{id: "title", name: "Title", field: "title", width: 120, cssClass: "cell-title", editor: Slick.Editors.Text, validator: requiredFieldValidator},
|
||||||
|
{id: "desc", name: "Description", field: "description", width: 100, editor: Slick.Editors.LongText},
|
||||||
|
{id: "duration", name: "Duration", field: "duration", editor: Slick.Editors.Text},
|
||||||
|
{id: "%", name: "% Complete", field: "percentComplete", width: 80, resizable: false, formatter: Slick.Formatters.PercentCompleteBar, editor: Slick.Editors.PercentComplete},
|
||||||
|
{id: "start", name: "Start", field: "start", minWidth: 60, editor: Slick.Editors.Date},
|
||||||
|
{id: "finish", name: "Finish", field: "finish", minWidth: 60, editor: Slick.Editors.Date},
|
||||||
|
{id: "effort-driven", name: "Effort Driven", width: 80, minWidth: 20, maxWidth: 80, cssClass: "cell-effort-driven", field: "effortDriven", formatter: Slick.Formatters.Checkmark, editor: Slick.Editors.Checkbox}
|
||||||
|
];
|
||||||
|
|
||||||
|
var options = {
|
||||||
|
editable: true,
|
||||||
|
enableAddRow: false,
|
||||||
|
enableCellNavigation: true,
|
||||||
|
asyncEditorLoading: false,
|
||||||
|
autoEdit: false,
|
||||||
|
editCommandHandler: queueAndExecuteCommand
|
||||||
|
};
|
||||||
|
|
||||||
|
var commandQueue = [];
|
||||||
|
|
||||||
|
function queueAndExecuteCommand(item, column, editCommand) {
|
||||||
|
commandQueue.push(editCommand);
|
||||||
|
editCommand.execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
function undo() {
|
||||||
|
var command = commandQueue.pop();
|
||||||
|
if (command && Slick.GlobalEditorLock.cancelCurrentEdit()) {
|
||||||
|
command.undo();
|
||||||
|
grid.gotoCell(command.row, command.cell, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$(function () {
|
||||||
|
for (var i = 0; i < 500; i++) {
|
||||||
|
var d = (data[i] = {});
|
||||||
|
|
||||||
|
d["title"] = "Task " + i;
|
||||||
|
d["description"] = "This is a sample task description.\n It can be multiline";
|
||||||
|
d["duration"] = "5 days";
|
||||||
|
d["percentComplete"] = Math.round(Math.random() * 100);
|
||||||
|
d["start"] = "01/01/2009";
|
||||||
|
d["finish"] = "01/05/2009";
|
||||||
|
d["effortDriven"] = (i % 5 == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
grid = new Slick.Grid("#myGrid", data, columns, options);
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
356
static/sg/examples/example4-model.html
Normal file
|
@ -0,0 +1,356 @@
|
||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<title>SlickGrid example 4: Model</title>
|
||||||
|
<link rel="stylesheet" href="../slick.grid.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="../controls/slick.pager.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="../css/smoothness/jquery-ui-1.8.16.custom.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="examples.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="../controls/slick.columnpicker.css" type="text/css"/>
|
||||||
|
<style>
|
||||||
|
.cell-title {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cell-effort-driven {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cell-selection {
|
||||||
|
border-right-color: silver;
|
||||||
|
border-right-style: solid;
|
||||||
|
background: #f5f5f5;
|
||||||
|
color: gray;
|
||||||
|
text-align: right;
|
||||||
|
font-size: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slick-row.selected .cell-selection {
|
||||||
|
background-color: transparent; /* show default selected row background */
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div style="position:relative">
|
||||||
|
<div style="width:600px;">
|
||||||
|
<div class="grid-header" style="width:100%">
|
||||||
|
<label>SlickGrid</label>
|
||||||
|
<span style="float:right" class="ui-icon ui-icon-search" title="Toggle search panel"
|
||||||
|
onclick="toggleFilterRow()"></span>
|
||||||
|
</div>
|
||||||
|
<div id="myGrid" style="width:100%;height:500px;"></div>
|
||||||
|
<div id="pager" style="width:100%;height:20px;"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="options-panel">
|
||||||
|
<b>Search:</b>
|
||||||
|
<hr/>
|
||||||
|
<div style="padding:6px;">
|
||||||
|
<label style="width:200px;float:left">Show tasks with % at least: </label>
|
||||||
|
|
||||||
|
<div style="padding:2px;">
|
||||||
|
<div style="width:100px;display:inline-block;" id="pcSlider"></div>
|
||||||
|
</div>
|
||||||
|
<br/>
|
||||||
|
<label style="width:200px;float:left">And title including:</label>
|
||||||
|
<input type=text id="txtSearch" style="width:100px;">
|
||||||
|
<br/><br/>
|
||||||
|
<button id="btnSelectRows">Select first 10 rows</button>
|
||||||
|
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
<h2>Demonstrates:</h2>
|
||||||
|
<ul>
|
||||||
|
<li>a filtered Model (DataView) as a data source instead of a simple array</li>
|
||||||
|
<li>grid reacting to model events (onRowCountChanged, onRowsChanged)</li>
|
||||||
|
<li>
|
||||||
|
<b>FAST</b> DataView recalculation and <b>real-time</b> grid updating in response to data changes.<br/>
|
||||||
|
The grid holds <b>50'000</b> rows, yet you are able to sort, filter, scroll, navigate and edit as if it had 50
|
||||||
|
rows.
|
||||||
|
</li>
|
||||||
|
<li>adding new rows, bidirectional sorting</li>
|
||||||
|
<li>column options: cannotTriggerInsert</li>
|
||||||
|
<li>events: onCellChange, onAddNewRow, onKeyDown, onSelectedRowsChanged, onSort</li>
|
||||||
|
<li><font color=red>NOTE:</font> all filters are immediately applied to new/edited rows</li>
|
||||||
|
<li>Handling row selection against model changes.</li>
|
||||||
|
<li>Paging.</li>
|
||||||
|
<li>inline filter panel</li>
|
||||||
|
</ul>
|
||||||
|
<h2>View Source:</h2>
|
||||||
|
<ul>
|
||||||
|
<li><A href="https://github.com/mleibman/SlickGrid/blob/gh-pages/examples/example4-model.html" target="_sourcewindow"> View the source for this example on Github</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="inlineFilterPanel" style="display:none;background:#dddddd;padding:3px;color:black;">
|
||||||
|
Show tasks with title including <input type="text" id="txtSearch2">
|
||||||
|
and % at least
|
||||||
|
<div style="width:100px;display:inline-block;" id="pcSlider2"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="../lib/firebugx.js"></script>
|
||||||
|
|
||||||
|
<script src="../lib/jquery-1.7.min.js"></script>
|
||||||
|
<script src="../lib/jquery-ui-1.8.16.custom.min.js"></script>
|
||||||
|
<script src="../lib/jquery.event.drag-2.2.js"></script>
|
||||||
|
|
||||||
|
<script src="../slick.core.js"></script>
|
||||||
|
<script src="../slick.formatters.js"></script>
|
||||||
|
<script src="../slick.editors.js"></script>
|
||||||
|
<script src="../plugins/slick.rowselectionmodel.js"></script>
|
||||||
|
<script src="../slick.grid.js"></script>
|
||||||
|
<script src="../slick.dataview.js"></script>
|
||||||
|
<script src="../controls/slick.pager.js"></script>
|
||||||
|
<script src="../controls/slick.columnpicker.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
var dataView;
|
||||||
|
var grid;
|
||||||
|
var data = [];
|
||||||
|
var columns = [
|
||||||
|
{id: "sel", name: "#", field: "num", behavior: "select", cssClass: "cell-selection", width: 40, cannotTriggerInsert: true, resizable: false, selectable: false },
|
||||||
|
{id: "title", name: "Title", field: "title", width: 120, minWidth: 120, cssClass: "cell-title", editor: Slick.Editors.Text, validator: requiredFieldValidator, sortable: true},
|
||||||
|
{id: "duration", name: "Duration", field: "duration", editor: Slick.Editors.Text, sortable: true},
|
||||||
|
{id: "%", defaultSortAsc: false, name: "% Complete", field: "percentComplete", width: 80, resizable: false, formatter: Slick.Formatters.PercentCompleteBar, editor: Slick.Editors.PercentComplete, sortable: true},
|
||||||
|
{id: "start", name: "Start", field: "start", minWidth: 60, editor: Slick.Editors.Date, sortable: true},
|
||||||
|
{id: "finish", name: "Finish", field: "finish", minWidth: 60, editor: Slick.Editors.Date, sortable: true},
|
||||||
|
{id: "effort-driven", name: "Effort Driven", width: 80, minWidth: 20, maxWidth: 80, cssClass: "cell-effort-driven", field: "effortDriven", formatter: Slick.Formatters.Checkmark, editor: Slick.Editors.Checkbox, cannotTriggerInsert: true, sortable: true}
|
||||||
|
];
|
||||||
|
|
||||||
|
var options = {
|
||||||
|
editable: true,
|
||||||
|
enableAddRow: true,
|
||||||
|
enableCellNavigation: true,
|
||||||
|
asyncEditorLoading: true,
|
||||||
|
forceFitColumns: false,
|
||||||
|
topPanelHeight: 25
|
||||||
|
};
|
||||||
|
|
||||||
|
var sortcol = "title";
|
||||||
|
var sortdir = 1;
|
||||||
|
var percentCompleteThreshold = 0;
|
||||||
|
var searchString = "";
|
||||||
|
|
||||||
|
function requiredFieldValidator(value) {
|
||||||
|
if (value == null || value == undefined || !value.length) {
|
||||||
|
return {valid: false, msg: "This is a required field"};
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return {valid: true, msg: null};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function myFilter(item, args) {
|
||||||
|
if (item["percentComplete"] < args.percentCompleteThreshold) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args.searchString != "" && item["title"].indexOf(args.searchString) == -1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function percentCompleteSort(a, b) {
|
||||||
|
return a["percentComplete"] - b["percentComplete"];
|
||||||
|
}
|
||||||
|
|
||||||
|
function comparer(a, b) {
|
||||||
|
var x = a[sortcol], y = b[sortcol];
|
||||||
|
return (x == y ? 0 : (x > y ? 1 : -1));
|
||||||
|
}
|
||||||
|
|
||||||
|
function toggleFilterRow() {
|
||||||
|
grid.setTopPanelVisibility(!grid.getOptions().showTopPanel);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$(".grid-header .ui-icon")
|
||||||
|
.addClass("ui-state-default ui-corner-all")
|
||||||
|
.mouseover(function (e) {
|
||||||
|
$(e.target).addClass("ui-state-hover")
|
||||||
|
})
|
||||||
|
.mouseout(function (e) {
|
||||||
|
$(e.target).removeClass("ui-state-hover")
|
||||||
|
});
|
||||||
|
|
||||||
|
$(function () {
|
||||||
|
// prepare the data
|
||||||
|
for (var i = 0; i < 50000; i++) {
|
||||||
|
var d = (data[i] = {});
|
||||||
|
|
||||||
|
d["id"] = "id_" + i;
|
||||||
|
d["num"] = i;
|
||||||
|
d["title"] = "Task " + i;
|
||||||
|
d["duration"] = "5 days";
|
||||||
|
d["percentComplete"] = Math.round(Math.random() * 100);
|
||||||
|
d["start"] = "01/01/2009";
|
||||||
|
d["finish"] = "01/05/2009";
|
||||||
|
d["effortDriven"] = (i % 5 == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
dataView = new Slick.Data.DataView({ inlineFilters: true });
|
||||||
|
grid = new Slick.Grid("#myGrid", dataView, columns, options);
|
||||||
|
grid.setSelectionModel(new Slick.RowSelectionModel());
|
||||||
|
|
||||||
|
var pager = new Slick.Controls.Pager(dataView, grid, $("#pager"));
|
||||||
|
var columnpicker = new Slick.Controls.ColumnPicker(columns, grid, options);
|
||||||
|
|
||||||
|
|
||||||
|
// move the filter panel defined in a hidden div into grid top panel
|
||||||
|
$("#inlineFilterPanel")
|
||||||
|
.appendTo(grid.getTopPanel())
|
||||||
|
.show();
|
||||||
|
|
||||||
|
grid.onCellChange.subscribe(function (e, args) {
|
||||||
|
dataView.updateItem(args.item.id, args.item);
|
||||||
|
});
|
||||||
|
|
||||||
|
grid.onAddNewRow.subscribe(function (e, args) {
|
||||||
|
var item = {"num": data.length, "id": "new_" + (Math.round(Math.random() * 10000)), "title": "New task", "duration": "1 day", "percentComplete": 0, "start": "01/01/2009", "finish": "01/01/2009", "effortDriven": false};
|
||||||
|
$.extend(item, args.item);
|
||||||
|
dataView.addItem(item);
|
||||||
|
});
|
||||||
|
|
||||||
|
grid.onKeyDown.subscribe(function (e) {
|
||||||
|
// select all rows on ctrl-a
|
||||||
|
if (e.which != 65 || !e.ctrlKey) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
var rows = [];
|
||||||
|
for (var i = 0; i < dataView.getLength(); i++) {
|
||||||
|
rows.push(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
grid.setSelectedRows(rows);
|
||||||
|
e.preventDefault();
|
||||||
|
});
|
||||||
|
|
||||||
|
grid.onSort.subscribe(function (e, args) {
|
||||||
|
sortdir = args.sortAsc ? 1 : -1;
|
||||||
|
sortcol = args.sortCol.field;
|
||||||
|
|
||||||
|
if ($.browser.msie && $.browser.version <= 8) {
|
||||||
|
// using temporary Object.prototype.toString override
|
||||||
|
// more limited and does lexicographic sort only by default, but can be much faster
|
||||||
|
|
||||||
|
var percentCompleteValueFn = function () {
|
||||||
|
var val = this["percentComplete"];
|
||||||
|
if (val < 10) {
|
||||||
|
return "00" + val;
|
||||||
|
} else if (val < 100) {
|
||||||
|
return "0" + val;
|
||||||
|
} else {
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// use numeric sort of % and lexicographic for everything else
|
||||||
|
dataView.fastSort((sortcol == "percentComplete") ? percentCompleteValueFn : sortcol, args.sortAsc);
|
||||||
|
} else {
|
||||||
|
// using native sort with comparer
|
||||||
|
// preferred method but can be very slow in IE with huge datasets
|
||||||
|
dataView.sort(comparer, args.sortAsc);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// wire up model events to drive the grid
|
||||||
|
dataView.onRowCountChanged.subscribe(function (e, args) {
|
||||||
|
grid.updateRowCount();
|
||||||
|
grid.render();
|
||||||
|
});
|
||||||
|
|
||||||
|
dataView.onRowsChanged.subscribe(function (e, args) {
|
||||||
|
grid.invalidateRows(args.rows);
|
||||||
|
grid.render();
|
||||||
|
});
|
||||||
|
|
||||||
|
dataView.onPagingInfoChanged.subscribe(function (e, pagingInfo) {
|
||||||
|
var isLastPage = pagingInfo.pageNum == pagingInfo.totalPages - 1;
|
||||||
|
var enableAddRow = isLastPage || pagingInfo.pageSize == 0;
|
||||||
|
var options = grid.getOptions();
|
||||||
|
|
||||||
|
if (options.enableAddRow != enableAddRow) {
|
||||||
|
grid.setOptions({enableAddRow: enableAddRow});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
var h_runfilters = null;
|
||||||
|
|
||||||
|
// wire up the slider to apply the filter to the model
|
||||||
|
$("#pcSlider,#pcSlider2").slider({
|
||||||
|
"range": "min",
|
||||||
|
"slide": function (event, ui) {
|
||||||
|
Slick.GlobalEditorLock.cancelCurrentEdit();
|
||||||
|
|
||||||
|
if (percentCompleteThreshold != ui.value) {
|
||||||
|
window.clearTimeout(h_runfilters);
|
||||||
|
h_runfilters = window.setTimeout(updateFilter, 10);
|
||||||
|
percentCompleteThreshold = ui.value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// wire up the search textbox to apply the filter to the model
|
||||||
|
$("#txtSearch,#txtSearch2").keyup(function (e) {
|
||||||
|
Slick.GlobalEditorLock.cancelCurrentEdit();
|
||||||
|
|
||||||
|
// clear on Esc
|
||||||
|
if (e.which == 27) {
|
||||||
|
this.value = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
searchString = this.value;
|
||||||
|
updateFilter();
|
||||||
|
});
|
||||||
|
|
||||||
|
function updateFilter() {
|
||||||
|
dataView.setFilterArgs({
|
||||||
|
percentCompleteThreshold: percentCompleteThreshold,
|
||||||
|
searchString: searchString
|
||||||
|
});
|
||||||
|
dataView.refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
$("#btnSelectRows").click(function () {
|
||||||
|
if (!Slick.GlobalEditorLock.commitCurrentEdit()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var rows = [];
|
||||||
|
for (var i = 0; i < 10 && i < dataView.getLength(); i++) {
|
||||||
|
rows.push(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
grid.setSelectedRows(rows);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// initialize the model after all the events have been hooked up
|
||||||
|
dataView.beginUpdate();
|
||||||
|
dataView.setItems(data);
|
||||||
|
dataView.setFilterArgs({
|
||||||
|
percentCompleteThreshold: percentCompleteThreshold,
|
||||||
|
searchString: searchString
|
||||||
|
});
|
||||||
|
dataView.setFilter(myFilter);
|
||||||
|
dataView.endUpdate();
|
||||||
|
|
||||||
|
// if you don't want the items that are not visible (due to being filtered out
|
||||||
|
// or being on a different page) to stay selected, pass 'false' to the second arg
|
||||||
|
dataView.syncGridSelection(grid, true);
|
||||||
|
|
||||||
|
$("#gridContainer").resizable();
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
278
static/sg/examples/example5-collapsing.html
Normal file
|
@ -0,0 +1,278 @@
|
||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<title>SlickGrid example 5: Collapsing</title>
|
||||||
|
<link rel="stylesheet" href="../slick.grid.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="../css/smoothness/jquery-ui-1.8.16.custom.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="examples.css" type="text/css"/>
|
||||||
|
<style>
|
||||||
|
.cell-title {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cell-effort-driven {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.toggle {
|
||||||
|
height: 9px;
|
||||||
|
width: 9px;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.toggle.expand {
|
||||||
|
background: url(../images/expand.gif) no-repeat center center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.toggle.collapse {
|
||||||
|
background: url(../images/collapse.gif) no-repeat center center;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<table width="100%">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="50%">
|
||||||
|
<div style="border:1px solid gray;background:wheat;padding:6px;">
|
||||||
|
<label>Show tasks with % at least: </label>
|
||||||
|
|
||||||
|
<div style="padding:4px;">
|
||||||
|
<div style="width:100px;" id="pcSlider"></div>
|
||||||
|
</div>
|
||||||
|
<br/>
|
||||||
|
<label>And title including:</label>
|
||||||
|
<input type=text id="txtSearch">
|
||||||
|
</div>
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
<div id="myGrid" style="width:600px;height:500px;"></div>
|
||||||
|
</td>
|
||||||
|
<td valign="top">
|
||||||
|
<h2>Demonstrates:</h2>
|
||||||
|
<ul>
|
||||||
|
<li>implementing expand/collapse as a filter for DataView</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>View Source:</h2>
|
||||||
|
<ul>
|
||||||
|
<li><A href="https://github.com/mleibman/SlickGrid/blob/gh-pages/examples/example5-collapsing.html" target="_sourcewindow"> View the source for this example on Github</a></li>
|
||||||
|
</ul>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<script src="../lib/firebugx.js"></script>
|
||||||
|
|
||||||
|
<script src="../lib/jquery-1.7.min.js"></script>
|
||||||
|
<script src="../lib/jquery-ui-1.8.16.custom.min.js"></script>
|
||||||
|
<script src="../lib/jquery.event.drag-2.2.js"></script>
|
||||||
|
|
||||||
|
<script src="../slick.core.js"></script>
|
||||||
|
<script src="../slick.formatters.js"></script>
|
||||||
|
<script src="../slick.editors.js"></script>
|
||||||
|
<script src="../slick.grid.js"></script>
|
||||||
|
<script src="../slick.dataview.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
function requiredFieldValidator(value) {
|
||||||
|
if (value == null || value == undefined || !value.length) {
|
||||||
|
return {valid: false, msg: "This is a required field"};
|
||||||
|
} else {
|
||||||
|
return {valid: true, msg: null};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
var TaskNameFormatter = function (row, cell, value, columnDef, dataContext) {
|
||||||
|
value = value.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">");
|
||||||
|
var spacer = "<span style='display:inline-block;height:1px;width:" + (15 * dataContext["indent"]) + "px'></span>";
|
||||||
|
var idx = dataView.getIdxById(dataContext.id);
|
||||||
|
if (data[idx + 1] && data[idx + 1].indent > data[idx].indent) {
|
||||||
|
if (dataContext._collapsed) {
|
||||||
|
return spacer + " <span class='toggle expand'></span> " + value;
|
||||||
|
} else {
|
||||||
|
return spacer + " <span class='toggle collapse'></span> " + value;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return spacer + " <span class='toggle'></span> " + value;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var dataView;
|
||||||
|
var grid;
|
||||||
|
var data = [];
|
||||||
|
var columns = [
|
||||||
|
{id: "title", name: "Title", field: "title", width: 220, cssClass: "cell-title", formatter: TaskNameFormatter, editor: Slick.Editors.Text, validator: requiredFieldValidator},
|
||||||
|
{id: "duration", name: "Duration", field: "duration", editor: Slick.Editors.Text},
|
||||||
|
{id: "%", name: "% Complete", field: "percentComplete", width: 80, resizable: false, formatter: Slick.Formatters.PercentCompleteBar, editor: Slick.Editors.PercentComplete},
|
||||||
|
{id: "start", name: "Start", field: "start", minWidth: 60, editor: Slick.Editors.Date},
|
||||||
|
{id: "finish", name: "Finish", field: "finish", minWidth: 60, editor: Slick.Editors.Date},
|
||||||
|
{id: "effort-driven", name: "Effort Driven", width: 80, minWidth: 20, maxWidth: 80, cssClass: "cell-effort-driven", field: "effortDriven", formatter: Slick.Formatters.Checkmark, editor: Slick.Editors.Checkbox, cannotTriggerInsert: true}
|
||||||
|
];
|
||||||
|
|
||||||
|
var options = {
|
||||||
|
editable: true,
|
||||||
|
enableAddRow: true,
|
||||||
|
enableCellNavigation: true,
|
||||||
|
asyncEditorLoading: false
|
||||||
|
};
|
||||||
|
|
||||||
|
var percentCompleteThreshold = 0;
|
||||||
|
var searchString = "";
|
||||||
|
|
||||||
|
function myFilter(item) {
|
||||||
|
if (item["percentComplete"] < percentCompleteThreshold) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (searchString != "" && item["title"].indexOf(searchString) == -1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (item.parent != null) {
|
||||||
|
var parent = data[item.parent];
|
||||||
|
|
||||||
|
while (parent) {
|
||||||
|
if (parent._collapsed || (parent["percentComplete"] < percentCompleteThreshold) || (searchString != "" && parent["title"].indexOf(searchString) == -1)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
parent = data[parent.parent];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function percentCompleteSort(a, b) {
|
||||||
|
return a["percentComplete"] - b["percentComplete"];
|
||||||
|
}
|
||||||
|
|
||||||
|
$(function () {
|
||||||
|
var indent = 0;
|
||||||
|
var parents = [];
|
||||||
|
|
||||||
|
// prepare the data
|
||||||
|
for (var i = 0; i < 1000; i++) {
|
||||||
|
var d = (data[i] = {});
|
||||||
|
var parent;
|
||||||
|
|
||||||
|
if (Math.random() > 0.8 && i > 0) {
|
||||||
|
indent++;
|
||||||
|
parents.push(i - 1);
|
||||||
|
} else if (Math.random() < 0.3 && indent > 0) {
|
||||||
|
indent--;
|
||||||
|
parents.pop();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parents.length > 0) {
|
||||||
|
parent = parents[parents.length - 1];
|
||||||
|
} else {
|
||||||
|
parent = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
d["id"] = "id_" + i;
|
||||||
|
d["indent"] = indent;
|
||||||
|
d["parent"] = parent;
|
||||||
|
d["title"] = "Task " + i;
|
||||||
|
d["duration"] = "5 days";
|
||||||
|
d["percentComplete"] = Math.round(Math.random() * 100);
|
||||||
|
d["start"] = "01/01/2009";
|
||||||
|
d["finish"] = "01/05/2009";
|
||||||
|
d["effortDriven"] = (i % 5 == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// initialize the model
|
||||||
|
dataView = new Slick.Data.DataView({ inlineFilters: true });
|
||||||
|
dataView.beginUpdate();
|
||||||
|
dataView.setItems(data);
|
||||||
|
dataView.setFilter(myFilter);
|
||||||
|
dataView.endUpdate();
|
||||||
|
|
||||||
|
|
||||||
|
// initialize the grid
|
||||||
|
grid = new Slick.Grid("#myGrid", dataView, columns, options);
|
||||||
|
|
||||||
|
grid.onCellChange.subscribe(function (e, args) {
|
||||||
|
dataView.updateItem(args.item.id, args.item);
|
||||||
|
});
|
||||||
|
|
||||||
|
grid.onAddNewRow.subscribe(function (e, args) {
|
||||||
|
var item = {
|
||||||
|
"id": "new_" + (Math.round(Math.random() * 10000)),
|
||||||
|
"indent": 0,
|
||||||
|
"title": "New task",
|
||||||
|
"duration": "1 day",
|
||||||
|
"percentComplete": 0,
|
||||||
|
"start": "01/01/2009",
|
||||||
|
"finish": "01/01/2009",
|
||||||
|
"effortDriven": false};
|
||||||
|
$.extend(item, args.item);
|
||||||
|
dataView.addItem(item);
|
||||||
|
});
|
||||||
|
|
||||||
|
grid.onClick.subscribe(function (e, args) {
|
||||||
|
if ($(e.target).hasClass("toggle")) {
|
||||||
|
var item = dataView.getItem(args.row);
|
||||||
|
if (item) {
|
||||||
|
if (!item._collapsed) {
|
||||||
|
item._collapsed = true;
|
||||||
|
} else {
|
||||||
|
item._collapsed = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
dataView.updateItem(item.id, item);
|
||||||
|
}
|
||||||
|
e.stopImmediatePropagation();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// wire up model events to drive the grid
|
||||||
|
dataView.onRowCountChanged.subscribe(function (e, args) {
|
||||||
|
grid.updateRowCount();
|
||||||
|
grid.render();
|
||||||
|
});
|
||||||
|
|
||||||
|
dataView.onRowsChanged.subscribe(function (e, args) {
|
||||||
|
grid.invalidateRows(args.rows);
|
||||||
|
grid.render();
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
var h_runfilters = null;
|
||||||
|
|
||||||
|
// wire up the slider to apply the filter to the model
|
||||||
|
$("#pcSlider").slider({
|
||||||
|
"range": "min",
|
||||||
|
"slide": function (event, ui) {
|
||||||
|
Slick.GlobalEditorLock.cancelCurrentEdit();
|
||||||
|
|
||||||
|
if (percentCompleteThreshold != ui.value) {
|
||||||
|
window.clearTimeout(h_runfilters);
|
||||||
|
h_runfilters = window.setTimeout(dataView.refresh, 10);
|
||||||
|
percentCompleteThreshold = ui.value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// wire up the search textbox to apply the filter to the model
|
||||||
|
$("#txtSearch").keyup(function (e) {
|
||||||
|
Slick.GlobalEditorLock.cancelCurrentEdit();
|
||||||
|
|
||||||
|
// clear on Esc
|
||||||
|
if (e.which == 27) {
|
||||||
|
this.value = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
searchString = this.value;
|
||||||
|
dataView.refresh();
|
||||||
|
})
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
171
static/sg/examples/example6-ajax-loading.html
Normal file
|
@ -0,0 +1,171 @@
|
||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<title>SlickGrid example 6: AJAX Load</title>
|
||||||
|
<link rel="stylesheet" href="../slick.grid.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="../css/smoothness/jquery-ui-1.8.16.custom.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="examples.css" type="text/css"/>
|
||||||
|
<style>
|
||||||
|
.cell-story {
|
||||||
|
white-space: normal !important;
|
||||||
|
line-height: 19px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loading-indicator {
|
||||||
|
display: inline-block;
|
||||||
|
padding: 12px;
|
||||||
|
background: white;
|
||||||
|
-opacity: 0.5;
|
||||||
|
color: black;
|
||||||
|
font-weight: bold;
|
||||||
|
z-index: 9999;
|
||||||
|
border: 1px solid red;
|
||||||
|
-moz-border-radius: 10px;
|
||||||
|
-webkit-border-radius: 10px;
|
||||||
|
-moz-box-shadow: 0 0 5px red;
|
||||||
|
-webkit-box-shadow: 0px 0px 5px red;
|
||||||
|
-text-shadow: 1px 1px 1px white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loading-indicator label {
|
||||||
|
padding-left: 20px;
|
||||||
|
background: url('../images/ajax-loader-small.gif') no-repeat center left;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div style="width:700px;float:left;">
|
||||||
|
<div class="grid-header" style="width:100%">
|
||||||
|
<label>Hackernews stories</label>
|
||||||
|
<span style="float:right;display:inline-block;">
|
||||||
|
Search:
|
||||||
|
<input type="text" id="txtSearch" value="github">
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div id="myGrid" style="width:100%;height:600px;"></div>
|
||||||
|
<div id="pager" style="width:100%;height:20px;"></div>
|
||||||
|
</div>
|
||||||
|
<div style="margin-left:750px;margin-top:40px;;">
|
||||||
|
<h2>Demonstrates:</h2>
|
||||||
|
<ul>
|
||||||
|
<li>loading data through AJAX</li>
|
||||||
|
<li>custom row height</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>WARNING:</h2>
|
||||||
|
<ul>
|
||||||
|
<li>API access to Hackernews provided through ThriftDB has some latency when paging through results. Be patient.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>View Source:</h2>
|
||||||
|
<ul>
|
||||||
|
<li><A href="https://github.com/mleibman/SlickGrid/blob/gh-pages/examples/example6-ajax-loading.html" target="_sourcewindow"> View the source for this example on Github</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="../lib/firebugx.js"></script>
|
||||||
|
|
||||||
|
<script src="../lib/jquery-1.7.min.js"></script>
|
||||||
|
<script src="../lib/jquery-ui-1.8.16.custom.min.js"></script>
|
||||||
|
<script src="../lib/jquery.event.drag-2.2.js"></script>
|
||||||
|
<script src="../lib/jquery.jsonp-2.4.min.js"></script>
|
||||||
|
|
||||||
|
<script src="../slick.core.js"></script>
|
||||||
|
<script src="../slick.remotemodel.js"></script>
|
||||||
|
<script src="../slick.grid.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
var grid;
|
||||||
|
var loader = new Slick.Data.RemoteModel();
|
||||||
|
|
||||||
|
var storyTitleFormatter = function (row, cell, value, columnDef, dataContext) {
|
||||||
|
s ="<b><a href='" + dataContext["url"] + "' target=_blank>" +
|
||||||
|
dataContext["title"] + "</a></b><br/>";
|
||||||
|
desc = dataContext["text"];
|
||||||
|
if (desc) { // on Hackernews many stories don't have a description
|
||||||
|
s += desc;
|
||||||
|
}
|
||||||
|
return s;
|
||||||
|
};
|
||||||
|
|
||||||
|
var dateFormatter = function (row, cell, value, columnDef, dataContext) {
|
||||||
|
return (value.getMonth()+1) + "/" + value.getDate() + "/" + value.getFullYear();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
var columns = [
|
||||||
|
{id: "num", name: "#", field: "index", width: 40},
|
||||||
|
{id: "story", name: "Story", width: 520, formatter: storyTitleFormatter, cssClass: "cell-story"},
|
||||||
|
{id: "date", name: "Date", field: "create_ts", width: 60, formatter: dateFormatter, sortable: true},
|
||||||
|
{id: "points", name: "Points", field: "points", width: 60, sortable: true}
|
||||||
|
];
|
||||||
|
|
||||||
|
var options = {
|
||||||
|
rowHeight: 64,
|
||||||
|
editable: false,
|
||||||
|
enableAddRow: false,
|
||||||
|
enableCellNavigation: false
|
||||||
|
};
|
||||||
|
|
||||||
|
var loadingIndicator = null;
|
||||||
|
|
||||||
|
|
||||||
|
$(function () {
|
||||||
|
grid = new Slick.Grid("#myGrid", loader.data, columns, options);
|
||||||
|
|
||||||
|
grid.onViewportChanged.subscribe(function (e, args) {
|
||||||
|
var vp = grid.getViewport();
|
||||||
|
loader.ensureData(vp.top, vp.bottom);
|
||||||
|
});
|
||||||
|
|
||||||
|
grid.onSort.subscribe(function (e, args) {
|
||||||
|
loader.setSort(args.sortCol.field, args.sortAsc ? 1 : -1);
|
||||||
|
var vp = grid.getViewport();
|
||||||
|
loader.ensureData(vp.top, vp.bottom);
|
||||||
|
});
|
||||||
|
|
||||||
|
loader.onDataLoading.subscribe(function () {
|
||||||
|
if (!loadingIndicator) {
|
||||||
|
loadingIndicator = $("<span class='loading-indicator'><label>Buffering...</label></span>").appendTo(document.body);
|
||||||
|
var $g = $("#myGrid");
|
||||||
|
|
||||||
|
loadingIndicator
|
||||||
|
.css("position", "absolute")
|
||||||
|
.css("top", $g.position().top + $g.height() / 2 - loadingIndicator.height() / 2)
|
||||||
|
.css("left", $g.position().left + $g.width() / 2 - loadingIndicator.width() / 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
loadingIndicator.show();
|
||||||
|
});
|
||||||
|
|
||||||
|
loader.onDataLoaded.subscribe(function (e, args) {
|
||||||
|
for (var i = args.from; i <= args.to; i++) {
|
||||||
|
grid.invalidateRow(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
grid.updateRowCount();
|
||||||
|
grid.render();
|
||||||
|
|
||||||
|
loadingIndicator.fadeOut();
|
||||||
|
});
|
||||||
|
|
||||||
|
$("#txtSearch").keyup(function (e) {
|
||||||
|
if (e.which == 13) {
|
||||||
|
loader.setSearch($(this).val());
|
||||||
|
var vp = grid.getViewport();
|
||||||
|
loader.ensureData(vp.top, vp.bottom);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
loader.setSearch($("#txtSearch").val());
|
||||||
|
loader.setSort("create_ts", -1);
|
||||||
|
grid.setSortColumn("date", false);
|
||||||
|
|
||||||
|
// load the first page
|
||||||
|
grid.onViewportChanged.notify();
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
141
static/sg/examples/example7-events.html
Normal file
|
@ -0,0 +1,141 @@
|
||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<title>SlickGrid example 7: Events</title>
|
||||||
|
<link rel="stylesheet" href="../slick.grid.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="../css/smoothness/jquery-ui-1.8.16.custom.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="examples.css" type="text/css"/>
|
||||||
|
<style>
|
||||||
|
.cell-title {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
#contextMenu {
|
||||||
|
background: #e1efc7;
|
||||||
|
border: 1px solid gray;
|
||||||
|
padding: 2px;
|
||||||
|
display: inline-block;
|
||||||
|
min-width: 100px;
|
||||||
|
-moz-box-shadow: 2px 2px 2px silver;
|
||||||
|
-webkit-box-shadow: 2px 2px 2px silver;
|
||||||
|
z-index: 99999;
|
||||||
|
}
|
||||||
|
|
||||||
|
#contextMenu li {
|
||||||
|
padding: 4px 4px 4px 14px;
|
||||||
|
list-style: none;
|
||||||
|
cursor: pointer;
|
||||||
|
background: url("../images/arrow_right_peppermint.png") no-repeat center left;
|
||||||
|
}
|
||||||
|
|
||||||
|
#contextMenu li:hover {
|
||||||
|
background-color: white;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<table width="100%">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="50%">
|
||||||
|
<div id="myGrid" style="width:600px;height:500px;"></div>
|
||||||
|
</td>
|
||||||
|
<td valign="top">
|
||||||
|
<h2>Demonstrates:</h2>
|
||||||
|
<ul>
|
||||||
|
<li>handling events from the grid:</li>
|
||||||
|
<li>Right-click the row to open the context menu</li>
|
||||||
|
<li>Click the priority cell to toggle values</li>
|
||||||
|
</ul>
|
||||||
|
<h2>View Source:</h2>
|
||||||
|
<ul>
|
||||||
|
<li><A href="https://github.com/mleibman/SlickGrid/blob/gh-pages/examples/example7-events.html" target="_sourcewindow"> View the source for this example on Github</a></li>
|
||||||
|
</ul>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<ul id="contextMenu" style="display:none;position:absolute">
|
||||||
|
<b>Set priority:</b>
|
||||||
|
<li data="Low">Low</li>
|
||||||
|
<li data="Medium">Medium</li>
|
||||||
|
<li data="High">High</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<script src="../lib/firebugx.js"></script>
|
||||||
|
|
||||||
|
<script src="../lib/jquery-1.7.min.js"></script>
|
||||||
|
<script src="../lib/jquery-ui-1.8.16.custom.min.js"></script>
|
||||||
|
<script src="../lib/jquery.event.drag-2.2.js"></script>
|
||||||
|
|
||||||
|
<script src="../slick.core.js"></script>
|
||||||
|
<script src="../slick.editors.js"></script>
|
||||||
|
<script src="../slick.grid.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
var grid;
|
||||||
|
var data = [];
|
||||||
|
var columns = [
|
||||||
|
{id: "title", name: "Title", field: "title", width: 200, cssClass: "cell-title", editor: Slick.Editors.Text},
|
||||||
|
{id: "priority", name: "Priority", field: "priority", width: 80, selectable: false, resizable: false}
|
||||||
|
];
|
||||||
|
|
||||||
|
var options = {
|
||||||
|
editable: true,
|
||||||
|
enableAddRow: false,
|
||||||
|
enableCellNavigation: true,
|
||||||
|
asyncEditorLoading: false,
|
||||||
|
rowHeight: 30
|
||||||
|
};
|
||||||
|
|
||||||
|
$(function () {
|
||||||
|
for (var i = 0; i < 100; i++) {
|
||||||
|
var d = (data[i] = {});
|
||||||
|
d["title"] = "Task " + i;
|
||||||
|
d["priority"] = "Medium";
|
||||||
|
}
|
||||||
|
|
||||||
|
grid = new Slick.Grid("#myGrid", data, columns, options);
|
||||||
|
|
||||||
|
grid.onContextMenu.subscribe(function (e) {
|
||||||
|
e.preventDefault();
|
||||||
|
var cell = grid.getCellFromEvent(e);
|
||||||
|
$("#contextMenu")
|
||||||
|
.data("row", cell.row)
|
||||||
|
.css("top", e.pageY)
|
||||||
|
.css("left", e.pageX)
|
||||||
|
.show();
|
||||||
|
|
||||||
|
$("body").one("click", function () {
|
||||||
|
$("#contextMenu").hide();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
grid.onClick.subscribe(function (e) {
|
||||||
|
var cell = grid.getCellFromEvent(e);
|
||||||
|
if (grid.getColumns()[cell.cell].id == "priority") {
|
||||||
|
if (!grid.getEditorLock().commitCurrentEdit()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var states = { "Low": "Medium", "Medium": "High", "High": "Low" };
|
||||||
|
data[cell.row].priority = states[data[cell.row].priority];
|
||||||
|
grid.updateRow(cell.row);
|
||||||
|
e.stopPropagation();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
$("#contextMenu").click(function (e) {
|
||||||
|
if (!$(e.target).is("li")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!grid.getEditorLock().commitCurrentEdit()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var row = $(this).data("row");
|
||||||
|
data[row].priority = $(e.target).attr("data");
|
||||||
|
grid.updateRow(row);
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
176
static/sg/examples/example8-alternative-display.html
Normal file
|
@ -0,0 +1,176 @@
|
||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<title>SlickGrid example 8: Alternative display</title>
|
||||||
|
<link rel="stylesheet" href="../slick.grid.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="../css/smoothness/jquery-ui-1.8.16.custom.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="examples.css" type="text/css"/>
|
||||||
|
<style>
|
||||||
|
.slick-cell {
|
||||||
|
background: white !important;
|
||||||
|
border-color: transparent !important;
|
||||||
|
line-height: 19px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* alternating offsets */
|
||||||
|
.slick-row .cell-inner {
|
||||||
|
margin-right: 60px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slick-row[row$="1"] .cell-inner, .slick-row[row$="3"] .cell-inner, .slick-row[row$="5"] .cell-inner,
|
||||||
|
.slick-row[row$="7"] .cell-inner, .slick-row[row$="9"] .cell-inner {
|
||||||
|
margin-left: 60px;
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.contact-card-cell {
|
||||||
|
border-color: transparent !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cell-inner {
|
||||||
|
height: 80px;
|
||||||
|
margin: 10px;
|
||||||
|
padding: 10px;
|
||||||
|
background: #fafafa;
|
||||||
|
border: 1px solid gray;
|
||||||
|
-moz-border-radius: 10px;
|
||||||
|
-webkit-border-radius: 10px;
|
||||||
|
-moz-box-shadow: 1px 1px 5px silver;
|
||||||
|
-webkit-box-shadow: 1px 1px 5px silver;
|
||||||
|
-webkit-transition: all 0.5s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cell-inner:hover {
|
||||||
|
background: #f0f0f0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cell-left {
|
||||||
|
width: 40px;
|
||||||
|
height: 100%;
|
||||||
|
float: left;
|
||||||
|
border-right: 1px dotted gray;
|
||||||
|
background: url("../images/user_identity.gif") no-repeat top center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cell-main {
|
||||||
|
margin-left: 50px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<table width="100%">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="50%">
|
||||||
|
<div id="myGrid" style="width:600px;height:500px;"></div>
|
||||||
|
</td>
|
||||||
|
<td valign="top">
|
||||||
|
<h2>Demonstrates:</h2>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>Template-based rendering using John Resig's <a href="http://ejohn.org/blog/javascript-micro-templating/"
|
||||||
|
target=_blank>micro-templates</a> while still using
|
||||||
|
SlickGrid's virtual rendering technology.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<h2>View Source:</h2>
|
||||||
|
<ul>
|
||||||
|
<li><A href="https://github.com/mleibman/SlickGrid/blob/gh-pages/examples/example8-alternative-display.html" target="_sourcewindow"> View the source for this example on Github</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<!-- cell template -->
|
||||||
|
<script type="text/html" id="cell_template">
|
||||||
|
<div class="cell-inner">
|
||||||
|
<div class="cell-left"></div>
|
||||||
|
<div class="cell-main">
|
||||||
|
<b><%=name%></b><br/>
|
||||||
|
<%=title%><br/>
|
||||||
|
<%=email%><br/>
|
||||||
|
<%=phone%>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script src="../lib/firebugx.js"></script>
|
||||||
|
|
||||||
|
<script src="../lib/jquery-1.7.min.js"></script>
|
||||||
|
<script src="../lib/jquery.event.drag-2.2.js"></script>
|
||||||
|
|
||||||
|
<script src="../slick.core.js"></script>
|
||||||
|
<script src="../slick.grid.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
// Simple JavaScript Templating
|
||||||
|
// John Resig - http://ejohn.org/ - MIT Licensed
|
||||||
|
(function () {
|
||||||
|
var cache = {};
|
||||||
|
|
||||||
|
this.tmpl = function tmpl(str, data) {
|
||||||
|
// Figure out if we're getting a template, or if we need to
|
||||||
|
// load the template - and be sure to cache the result.
|
||||||
|
var fn = !/\W/.test(str) ?
|
||||||
|
cache[str] = cache[str] ||
|
||||||
|
tmpl(document.getElementById(str).innerHTML) :
|
||||||
|
|
||||||
|
// Generate a reusable function that will serve as a template
|
||||||
|
// generator (and which will be cached).
|
||||||
|
new Function("obj",
|
||||||
|
"var p=[],print=function(){p.push.apply(p,arguments);};" +
|
||||||
|
|
||||||
|
// Introduce the data as local variables using with(){}
|
||||||
|
"with(obj){p.push('" +
|
||||||
|
|
||||||
|
// Convert the template into pure JavaScript
|
||||||
|
str
|
||||||
|
.replace(/[\r\t\n]/g, " ")
|
||||||
|
.split("<%").join("\t")
|
||||||
|
.replace(/((^|%>)[^\t]*)'/g, "$1\r")
|
||||||
|
.replace(/\t=(.*?)%>/g, "',$1,'")
|
||||||
|
.split("\t").join("');")
|
||||||
|
.split("%>").join("p.push('")
|
||||||
|
.split("\r").join("\\'") + "');}return p.join('');");
|
||||||
|
|
||||||
|
// Provide some basic currying to the user
|
||||||
|
return data ? fn(data) : fn;
|
||||||
|
};
|
||||||
|
})();
|
||||||
|
|
||||||
|
var grid;
|
||||||
|
var data = [];
|
||||||
|
var columns = [
|
||||||
|
{id: "contact-card", name: "Contacts", formatter: renderCell, width: 500, cssClass: "contact-card-cell"}
|
||||||
|
];
|
||||||
|
|
||||||
|
var options = {
|
||||||
|
rowHeight: 140,
|
||||||
|
editable: false,
|
||||||
|
enableAddRow: false,
|
||||||
|
enableCellNavigation: false,
|
||||||
|
enableColumnReorder: false
|
||||||
|
};
|
||||||
|
|
||||||
|
var compiled_template = tmpl("cell_template");
|
||||||
|
|
||||||
|
function renderCell(row, cell, value, columnDef, dataContext) {
|
||||||
|
return compiled_template(dataContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
$(function () {
|
||||||
|
for (var i = 0; i < 100; i++) {
|
||||||
|
var d = (data[i] = {});
|
||||||
|
|
||||||
|
d["name"] = "User " + i;
|
||||||
|
d["email"] = "test.user@nospam.org";
|
||||||
|
d["title"] = "Regional sales manager";
|
||||||
|
d["phone"] = "206-000-0000";
|
||||||
|
}
|
||||||
|
|
||||||
|
grid = new Slick.Grid("#myGrid", data, columns, options);
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
321
static/sg/examples/example9-row-reordering.html
Normal file
|
@ -0,0 +1,321 @@
|
||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<title>SlickGrid example 9: Row reordering</title>
|
||||||
|
<link rel="stylesheet" href="../slick.grid.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="../css/smoothness/jquery-ui-1.8.16.custom.css" type="text/css"/>
|
||||||
|
<link rel="stylesheet" href="examples.css" type="text/css"/>
|
||||||
|
<style>
|
||||||
|
.cell-effort-driven {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cell-reorder {
|
||||||
|
cursor: move;
|
||||||
|
background: url("../images/drag-handle.png") no-repeat center center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cell-selection {
|
||||||
|
border-right-color: silver;
|
||||||
|
border-right-style: solid;
|
||||||
|
background: #f5f5f5;
|
||||||
|
color: gray;
|
||||||
|
text-align: right;
|
||||||
|
font-size: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slick-row.selected .cell-selection {
|
||||||
|
background-color: transparent; /* show default selected row background */
|
||||||
|
}
|
||||||
|
|
||||||
|
.recycle-bin {
|
||||||
|
width: 120px;
|
||||||
|
border: 1px solid gray;
|
||||||
|
background: beige;
|
||||||
|
padding: 4px;
|
||||||
|
font-size: 12pt;
|
||||||
|
font-weight: bold;
|
||||||
|
color: black;
|
||||||
|
text-align: center;
|
||||||
|
-moz-border-radius: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.red {
|
||||||
|
background: red;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bold {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div style="position:relative">
|
||||||
|
<div style="width:600px;">
|
||||||
|
<div class="grid-header" style="width:100%">
|
||||||
|
<label>Santa's TODO list:</label>
|
||||||
|
</div>
|
||||||
|
<div id="myGrid" style="width:100%;height:500px;"></div>
|
||||||
|
</div>
|
||||||
|
<div class="options-panel">
|
||||||
|
<b>Tips:</b>
|
||||||
|
<hr/>
|
||||||
|
<div style="padding:6px;">
|
||||||
|
Click to select, Ctrl-click to toggle selection, Shift-click to select a range.<br/>
|
||||||
|
Drag one or more rows by the handle to reorder.<br/>
|
||||||
|
Drag one or more rows to the recycle bin to delete.
|
||||||
|
|
||||||
|
<br/>
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
<div id="dropzone" class="recycle-bin">
|
||||||
|
Recycle Bin
|
||||||
|
</div>
|
||||||
|
<h2>View Source:</h2>
|
||||||
|
<ul>
|
||||||
|
<li><A href="https://github.com/mleibman/SlickGrid/blob/gh-pages/examples/example9-row-reordering.html" target="_sourcewindow"> View the source for this example on Github</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="../lib/firebugx.js"></script>
|
||||||
|
|
||||||
|
<script src="../lib/jquery-1.7.min.js"></script>
|
||||||
|
<script src="../lib/jquery-ui-1.8.16.custom.min.js"></script>
|
||||||
|
<script src="../lib/jquery.event.drag-2.2.js"></script>
|
||||||
|
<script src="../lib/jquery.event.drop-2.2.js"></script>
|
||||||
|
|
||||||
|
<script src="../slick.core.js"></script>
|
||||||
|
<script src="../plugins/slick.cellrangeselector.js"></script>
|
||||||
|
<script src="../plugins/slick.cellselectionmodel.js"></script>
|
||||||
|
<script src="../plugins/slick.rowselectionmodel.js"></script>
|
||||||
|
<script src="../plugins/slick.rowmovemanager.js"></script>
|
||||||
|
<script src="../slick.formatters.js"></script>
|
||||||
|
<script src="../slick.editors.js"></script>
|
||||||
|
<script src="../slick.grid.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
var grid;
|
||||||
|
var data = [];
|
||||||
|
var columns = [
|
||||||
|
{
|
||||||
|
id: "#",
|
||||||
|
name: "",
|
||||||
|
width: 40,
|
||||||
|
behavior: "selectAndMove",
|
||||||
|
selectable: false,
|
||||||
|
resizable: false,
|
||||||
|
cssClass: "cell-reorder dnd"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "name",
|
||||||
|
name: "Name",
|
||||||
|
field: "name",
|
||||||
|
width: 500,
|
||||||
|
cssClass: "cell-title",
|
||||||
|
editor: Slick.Editors.Text,
|
||||||
|
validator: requiredFieldValidator
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "complete",
|
||||||
|
name: "Complete",
|
||||||
|
width: 60,
|
||||||
|
cssClass: "cell-effort-driven",
|
||||||
|
field: "complete",
|
||||||
|
cannotTriggerInsert: true,
|
||||||
|
formatter: Slick.Formatters.Checkmark,
|
||||||
|
editor: Slick.Editors.Checkbox
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
var options = {
|
||||||
|
editable: true,
|
||||||
|
enableAddRow: true,
|
||||||
|
enableCellNavigation: true,
|
||||||
|
forceFitColumns: true,
|
||||||
|
autoEdit: false
|
||||||
|
};
|
||||||
|
|
||||||
|
function requiredFieldValidator(value) {
|
||||||
|
if (value == null || value == undefined || !value.length) {
|
||||||
|
return {valid: false, msg: "This is a required field"};
|
||||||
|
} else {
|
||||||
|
return {valid: true, msg: null};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$(function () {
|
||||||
|
data = [
|
||||||
|
{ name: "Make a list", complete: true},
|
||||||
|
{ name: "Check it twice", complete: false},
|
||||||
|
{ name: "Find out who's naughty", complete: false},
|
||||||
|
{ name: "Find out who's nice", complete: false}
|
||||||
|
];
|
||||||
|
|
||||||
|
grid = new Slick.Grid("#myGrid", data, columns, options);
|
||||||
|
|
||||||
|
grid.setSelectionModel(new Slick.RowSelectionModel());
|
||||||
|
|
||||||
|
var moveRowsPlugin = new Slick.RowMoveManager({
|
||||||
|
cancelEditOnDrag: true
|
||||||
|
});
|
||||||
|
|
||||||
|
moveRowsPlugin.onBeforeMoveRows.subscribe(function (e, data) {
|
||||||
|
for (var i = 0; i < data.rows.length; i++) {
|
||||||
|
// no point in moving before or after itself
|
||||||
|
if (data.rows[i] == data.insertBefore || data.rows[i] == data.insertBefore - 1) {
|
||||||
|
e.stopPropagation();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
|
moveRowsPlugin.onMoveRows.subscribe(function (e, args) {
|
||||||
|
var extractedRows = [], left, right;
|
||||||
|
var rows = args.rows;
|
||||||
|
var insertBefore = args.insertBefore;
|
||||||
|
left = data.slice(0, insertBefore);
|
||||||
|
right = data.slice(insertBefore, data.length);
|
||||||
|
|
||||||
|
rows.sort(function(a,b) { return a-b; });
|
||||||
|
|
||||||
|
for (var i = 0; i < rows.length; i++) {
|
||||||
|
extractedRows.push(data[rows[i]]);
|
||||||
|
}
|
||||||
|
|
||||||
|
rows.reverse();
|
||||||
|
|
||||||
|
for (var i = 0; i < rows.length; i++) {
|
||||||
|
var row = rows[i];
|
||||||
|
if (row < insertBefore) {
|
||||||
|
left.splice(row, 1);
|
||||||
|
} else {
|
||||||
|
right.splice(row - insertBefore, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
data = left.concat(extractedRows.concat(right));
|
||||||
|
|
||||||
|
var selectedRows = [];
|
||||||
|
for (var i = 0; i < rows.length; i++)
|
||||||
|
selectedRows.push(left.length + i);
|
||||||
|
|
||||||
|
grid.resetActiveCell();
|
||||||
|
grid.setData(data);
|
||||||
|
grid.setSelectedRows(selectedRows);
|
||||||
|
grid.render();
|
||||||
|
});
|
||||||
|
|
||||||
|
grid.registerPlugin(moveRowsPlugin);
|
||||||
|
|
||||||
|
grid.onDragInit.subscribe(function (e, dd) {
|
||||||
|
// prevent the grid from cancelling drag'n'drop by default
|
||||||
|
e.stopImmediatePropagation();
|
||||||
|
});
|
||||||
|
|
||||||
|
grid.onDragStart.subscribe(function (e, dd) {
|
||||||
|
var cell = grid.getCellFromEvent(e);
|
||||||
|
if (!cell) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
dd.row = cell.row;
|
||||||
|
if (!data[dd.row]) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Slick.GlobalEditorLock.isActive()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
e.stopImmediatePropagation();
|
||||||
|
dd.mode = "recycle";
|
||||||
|
|
||||||
|
var selectedRows = grid.getSelectedRows();
|
||||||
|
|
||||||
|
if (!selectedRows.length || $.inArray(dd.row, selectedRows) == -1) {
|
||||||
|
selectedRows = [dd.row];
|
||||||
|
grid.setSelectedRows(selectedRows);
|
||||||
|
}
|
||||||
|
|
||||||
|
dd.rows = selectedRows;
|
||||||
|
dd.count = selectedRows.length;
|
||||||
|
|
||||||
|
var proxy = $("<span></span>")
|
||||||
|
.css({
|
||||||
|
position: "absolute",
|
||||||
|
display: "inline-block",
|
||||||
|
padding: "4px 10px",
|
||||||
|
background: "#e0e0e0",
|
||||||
|
border: "1px solid gray",
|
||||||
|
"z-index": 99999,
|
||||||
|
"-moz-border-radius": "8px",
|
||||||
|
"-moz-box-shadow": "2px 2px 6px silver"
|
||||||
|
})
|
||||||
|
.text("Drag to Recycle Bin to delete " + dd.count + " selected row(s)")
|
||||||
|
.appendTo("body");
|
||||||
|
|
||||||
|
dd.helper = proxy;
|
||||||
|
|
||||||
|
$(dd.available).css("background", "pink");
|
||||||
|
|
||||||
|
return proxy;
|
||||||
|
});
|
||||||
|
|
||||||
|
grid.onDrag.subscribe(function (e, dd) {
|
||||||
|
if (dd.mode != "recycle") {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
dd.helper.css({top: e.pageY + 5, left: e.pageX + 5});
|
||||||
|
});
|
||||||
|
|
||||||
|
grid.onDragEnd.subscribe(function (e, dd) {
|
||||||
|
if (dd.mode != "recycle") {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
dd.helper.remove();
|
||||||
|
$(dd.available).css("background", "beige");
|
||||||
|
});
|
||||||
|
|
||||||
|
$.drop({mode: "mouse"});
|
||||||
|
$("#dropzone")
|
||||||
|
.bind("dropstart", function (e, dd) {
|
||||||
|
if (dd.mode != "recycle") {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$(this).css("background", "yellow");
|
||||||
|
})
|
||||||
|
.bind("dropend", function (e, dd) {
|
||||||
|
if (dd.mode != "recycle") {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$(dd.available).css("background", "pink");
|
||||||
|
})
|
||||||
|
.bind("drop", function (e, dd) {
|
||||||
|
if (dd.mode != "recycle") {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var rowsToDelete = dd.rows.sort().reverse();
|
||||||
|
for (var i = 0; i < rowsToDelete.length; i++) {
|
||||||
|
data.splice(rowsToDelete[i], 1);
|
||||||
|
}
|
||||||
|
grid.invalidate();
|
||||||
|
grid.setSelectedRows([]);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
grid.onAddNewRow.subscribe(function (e, args) {
|
||||||
|
var item = {name: "New task", complete: false};
|
||||||
|
$.extend(item, args.item);
|
||||||
|
data.push(item);
|
||||||
|
grid.invalidateRows([data.length - 1]);
|
||||||
|
grid.updateRowCount();
|
||||||
|
grid.render();
|
||||||
|
});
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
230
static/sg/examples/examples.css
Normal file
|
@ -0,0 +1,230 @@
|
||||||
|
@import url('../slick-default-theme.css');
|
||||||
|
|
||||||
|
* {
|
||||||
|
font-family: arial;
|
||||||
|
font-size: 8pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
background: beige;
|
||||||
|
padding: 0;
|
||||||
|
margin: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
font-size: 10pt;
|
||||||
|
border-bottom: 1px dotted gray;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul {
|
||||||
|
margin-left: 0;
|
||||||
|
padding: 0;
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
|
||||||
|
li {
|
||||||
|
background: url("../images/arrow_right_spearmint.png") no-repeat center left;
|
||||||
|
padding: 0 0 0 14px;
|
||||||
|
|
||||||
|
list-style: none;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#myGrid {
|
||||||
|
background: white;
|
||||||
|
outline: 0;
|
||||||
|
border: 1px solid gray;
|
||||||
|
}
|
||||||
|
|
||||||
|
.grid-header {
|
||||||
|
border: 1px solid gray;
|
||||||
|
border-bottom: 0;
|
||||||
|
border-top: 0;
|
||||||
|
background: url('../images/header-bg.gif') repeat-x center top;
|
||||||
|
color: black;
|
||||||
|
height: 24px;
|
||||||
|
line-height: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.grid-header label {
|
||||||
|
display: inline-block;
|
||||||
|
font-weight: bold;
|
||||||
|
margin: auto auto auto 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.grid-header .ui-icon {
|
||||||
|
margin: 4px 4px auto 6px;
|
||||||
|
background-color: transparent;
|
||||||
|
border-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.grid-header .ui-icon.ui-state-hover {
|
||||||
|
background-color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.grid-header #txtSearch {
|
||||||
|
margin: 0 4px 0 4px;
|
||||||
|
padding: 2px 2px;
|
||||||
|
-moz-border-radius: 2px;
|
||||||
|
-webkit-border-radius: 2px;
|
||||||
|
border: 1px solid silver;
|
||||||
|
}
|
||||||
|
|
||||||
|
.options-panel {
|
||||||
|
-moz-border-radius: 6px;
|
||||||
|
-webkit-border-radius: 6px;
|
||||||
|
border: 1px solid silver;
|
||||||
|
background: #f0f0f0;
|
||||||
|
padding: 4px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
width: 320px;
|
||||||
|
position: absolute;
|
||||||
|
top: 0px;
|
||||||
|
left: 650px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Individual cell styles */
|
||||||
|
.slick-cell.task-name {
|
||||||
|
font-weight: bold;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slick-cell.task-percent {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slick-cell.cell-move-handle {
|
||||||
|
font-weight: bold;
|
||||||
|
text-align: right;
|
||||||
|
border-right: solid gray;
|
||||||
|
|
||||||
|
background: #efefef;
|
||||||
|
cursor: move;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cell-move-handle:hover {
|
||||||
|
background: #b6b9bd;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slick-row.selected .cell-move-handle {
|
||||||
|
background: #D5DC8D;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slick-row .cell-actions {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slick-row.complete {
|
||||||
|
background-color: #DFD;
|
||||||
|
color: #555;
|
||||||
|
}
|
||||||
|
|
||||||
|
.percent-complete-bar {
|
||||||
|
display: inline-block;
|
||||||
|
height: 6px;
|
||||||
|
-moz-border-radius: 3px;
|
||||||
|
-webkit-border-radius: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Slick.Editors.Text, Slick.Editors.Date */
|
||||||
|
input.editor-text {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
border: 0;
|
||||||
|
margin: 0;
|
||||||
|
background: transparent;
|
||||||
|
outline: 0;
|
||||||
|
padding: 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui-datepicker-trigger {
|
||||||
|
margin-top: 2px;
|
||||||
|
padding: 0;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Slick.Editors.PercentComplete */
|
||||||
|
input.editor-percentcomplete {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
border: 0;
|
||||||
|
margin: 0;
|
||||||
|
background: transparent;
|
||||||
|
outline: 0;
|
||||||
|
padding: 0;
|
||||||
|
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.editor-percentcomplete-picker {
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
width: 16px;
|
||||||
|
height: 100%;
|
||||||
|
background: url("../images/pencil.gif") no-repeat center center;
|
||||||
|
overflow: visible;
|
||||||
|
z-index: 1000;
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.editor-percentcomplete-helper {
|
||||||
|
border: 0 solid gray;
|
||||||
|
position: absolute;
|
||||||
|
top: -2px;
|
||||||
|
left: -9px;
|
||||||
|
background: url("../images/editor-helper-bg.gif") no-repeat top left;
|
||||||
|
padding-left: 9px;
|
||||||
|
|
||||||
|
width: 120px;
|
||||||
|
height: 140px;
|
||||||
|
display: none;
|
||||||
|
overflow: visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
.editor-percentcomplete-wrapper {
|
||||||
|
background: beige;
|
||||||
|
padding: 20px 8px;
|
||||||
|
|
||||||
|
width: 100%;
|
||||||
|
height: 98px;
|
||||||
|
border: 1px solid gray;
|
||||||
|
border-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.editor-percentcomplete-buttons {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.editor-percentcomplete-buttons button {
|
||||||
|
width: 80px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.editor-percentcomplete-slider {
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.editor-percentcomplete-picker:hover .editor-percentcomplete-helper {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.editor-percentcomplete-helper:hover {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Slick.Editors.YesNoSelect */
|
||||||
|
select.editor-yesno {
|
||||||
|
width: 100%;
|
||||||
|
margin: 0;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Slick.Editors.Checkbox */
|
||||||
|
input.editor-checkbox {
|
||||||
|
margin: 0;
|
||||||
|
height: 100%;
|
||||||
|
padding: 0;
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
61
static/sg/examples/index.html
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>SlickGrid Examples</title>
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
font-family: Helvetica, arial, freesans, clean, sans-serif;
|
||||||
|
font-size: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: #4183c4;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
a:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
li {
|
||||||
|
margin-bottom: 15px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Examples</h1>
|
||||||
|
<div>
|
||||||
|
<ul>
|
||||||
|
<li><a href="example1-simple.html">Basic use with minimal configuration</a></li>
|
||||||
|
<li><a href="example2-formatters.html">Adding some formatting</a></li>
|
||||||
|
<li><a href="example7-events.html">Handling events</a></li>
|
||||||
|
<li><a href="example14-highlighting.html">Highlighting and flashing cells</a></li>
|
||||||
|
<li><a href="example3-editing.html">Making it editable</a></li>
|
||||||
|
<li><a href="example3a-compound-editors.html">Writing compound editors</a></li>
|
||||||
|
<li><a href="example3b-editing-with-undo.html">Implementing Undo</a></li>
|
||||||
|
<li><a href="example-composite-editor-item-details.html">Using a CompositeEditor to implement detached item edit form</a></li>
|
||||||
|
<li>(most comprehensive) <a href="example4-model.html">Using a filtered data view to drive the grid</a></li>
|
||||||
|
<li><a href="example5-collapsing.html">Adding tree functionality (expand/collapse) to the grid</a></li>
|
||||||
|
<li><a href="example6-ajax-loading.html"><span class="caps">AJAX</span>-loading data with search</a></li>
|
||||||
|
<li><a href="example8-alternative-display.html">Using pre-compiled micro-templates to render cells</a></li>
|
||||||
|
<li><a href="example9-row-reordering.html">Row selection & reordering</a></li>
|
||||||
|
<li><a href="example10-async-post-render.html">Using background post-rendering to add graphs</a></li>
|
||||||
|
<li><a href="example11-autoheight.html" title="autoHeight">No vertical scrolling</a></li>
|
||||||
|
<li><a href="example12-fillbrowser.html">Filling the whole window</a></li>
|
||||||
|
<li><a href="example13-getItem-sorting.html">Sorting by an index, getItem method</a></li>
|
||||||
|
<li><a href="example-header-row.html">Using fixed header row for quick filters</a></li>
|
||||||
|
<li><a href="example-checkbox-row-select.html">Plugin: Checkbox row selectors with CheckboxSelectColumn plugin</a></li>
|
||||||
|
<li><a href="example-spreadsheet.html">Spreadsheet: cell range selection, copy’n’paste and Excel-style formula editor</a></li>
|
||||||
|
<li><a href="example-grouping.html">Interactive grouping and aggregates</a>.</li>
|
||||||
|
<li><a href="example-colspan.html">Colspan</a></li>
|
||||||
|
<li><a href="example-optimizing-dataview.html">Optimizing DataView for 500’000 rows</a></li>
|
||||||
|
<li><a href="example-explicit-initialization.html">Explicit initialization</a></li>
|
||||||
|
<li><a href="example-multi-column-sort.html">Multi-column sorting</a></li>
|
||||||
|
<li><a href="example-custom-column-value-extractor.html">Using dataItemColumnValueExtractor option to specify a custom column value extractor</a></li>
|
||||||
|
<li><a href="example-plugin-headerbuttons.html">Plugin: Column header buttons</a></li>
|
||||||
|
<li><a href="example-plugin-headermenu.html">Plugin: Column header menu</a></li>
|
||||||
|
<li><a href="example-autotooltips.html">Plugin: Auto tooltips</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
211
static/sg/examples/slick.compositeeditor.js
vendored
Normal file
|
@ -0,0 +1,211 @@
|
||||||
|
;
|
||||||
|
(function ($) {
|
||||||
|
$.extend(true, window, {
|
||||||
|
Slick: {
|
||||||
|
CompositeEditor: CompositeEditor
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
/***
|
||||||
|
* A composite SlickGrid editor factory.
|
||||||
|
* Generates an editor that is composed of multiple editors for given columns.
|
||||||
|
* Individual editors are provided given containers instead of the original cell.
|
||||||
|
* Validation will be performed on all editors individually and the results will be aggregated into one
|
||||||
|
* validation result.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* The returned editor will have its prototype set to CompositeEditor, so you can use the "instanceof" check.
|
||||||
|
*
|
||||||
|
* NOTE: This doesn't work for detached editors since they will be created and positioned relative to the
|
||||||
|
* active cell and not the provided container.
|
||||||
|
*
|
||||||
|
* @namespace Slick
|
||||||
|
* @class CompositeEditor
|
||||||
|
* @constructor
|
||||||
|
* @param columns {Array} Column definitions from which editors will be pulled.
|
||||||
|
* @param containers {Array} Container HTMLElements in which editors will be placed.
|
||||||
|
* @param options {Object} Options hash:
|
||||||
|
* validationFailedMsg - A generic failed validation message set on the aggregated validation resuls.
|
||||||
|
* hide - A function to be called when the grid asks the editor to hide itself.
|
||||||
|
* show - A function to be called when the grid asks the editor to show itself.
|
||||||
|
* position - A function to be called when the grid asks the editor to reposition itself.
|
||||||
|
* destroy - A function to be called when the editor is destroyed.
|
||||||
|
*/
|
||||||
|
function CompositeEditor(columns, containers, options) {
|
||||||
|
var defaultOptions = {
|
||||||
|
validationFailedMsg: "Some of the fields have failed validation",
|
||||||
|
show: null,
|
||||||
|
hide: null,
|
||||||
|
position: null,
|
||||||
|
destroy: null
|
||||||
|
};
|
||||||
|
|
||||||
|
var noop = function () {
|
||||||
|
};
|
||||||
|
|
||||||
|
var firstInvalidEditor;
|
||||||
|
|
||||||
|
options = $.extend({}, defaultOptions, options);
|
||||||
|
|
||||||
|
|
||||||
|
function getContainerBox(i) {
|
||||||
|
var c = containers[i];
|
||||||
|
var offset = $(c).offset();
|
||||||
|
var w = $(c).width();
|
||||||
|
var h = $(c).height();
|
||||||
|
|
||||||
|
return {
|
||||||
|
top: offset.top,
|
||||||
|
left: offset.left,
|
||||||
|
bottom: offset.top + h,
|
||||||
|
right: offset.left + w,
|
||||||
|
width: w,
|
||||||
|
height: h,
|
||||||
|
visible: true
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function editor(args) {
|
||||||
|
var editors = [];
|
||||||
|
|
||||||
|
|
||||||
|
function init() {
|
||||||
|
var newArgs = {};
|
||||||
|
var idx = columns.length;
|
||||||
|
while (idx--) {
|
||||||
|
if (columns[idx].editor) {
|
||||||
|
newArgs = $.extend({}, args);
|
||||||
|
newArgs.container = containers[idx];
|
||||||
|
newArgs.column = columns[idx];
|
||||||
|
newArgs.position = getContainerBox(idx);
|
||||||
|
newArgs.commitChanges = noop;
|
||||||
|
newArgs.cancelChanges = noop;
|
||||||
|
|
||||||
|
editors[idx] = new (columns[idx].editor)(newArgs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
this.destroy = function () {
|
||||||
|
var idx = editors.length;
|
||||||
|
while (idx--) {
|
||||||
|
editors[idx].destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
options.destroy && options.destroy();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
this.focus = function () {
|
||||||
|
// if validation has failed, set the focus to the first invalid editor
|
||||||
|
(firstInvalidEditor || editors[0]).focus();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
this.isValueChanged = function () {
|
||||||
|
var idx = editors.length;
|
||||||
|
while (idx--) {
|
||||||
|
if (editors[idx].isValueChanged()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
this.serializeValue = function () {
|
||||||
|
var serializedValue = [];
|
||||||
|
var idx = editors.length;
|
||||||
|
while (idx--) {
|
||||||
|
serializedValue[idx] = editors[idx].serializeValue();
|
||||||
|
}
|
||||||
|
return serializedValue;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
this.applyValue = function (item, state) {
|
||||||
|
var idx = editors.length;
|
||||||
|
while (idx--) {
|
||||||
|
editors[idx].applyValue(item, state[idx]);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
this.loadValue = function (item) {
|
||||||
|
var idx = editors.length;
|
||||||
|
while (idx--) {
|
||||||
|
editors[idx].loadValue(item);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
this.validate = function () {
|
||||||
|
var validationResults;
|
||||||
|
var errors = [];
|
||||||
|
|
||||||
|
firstInvalidEditor = null;
|
||||||
|
|
||||||
|
var idx = editors.length;
|
||||||
|
while (idx--) {
|
||||||
|
validationResults = editors[idx].validate();
|
||||||
|
if (!validationResults.valid) {
|
||||||
|
firstInvalidEditor = editors[idx];
|
||||||
|
errors.push({
|
||||||
|
index: idx,
|
||||||
|
editor: editors[idx],
|
||||||
|
container: containers[idx],
|
||||||
|
msg: validationResults.msg
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (errors.length) {
|
||||||
|
return {
|
||||||
|
valid: false,
|
||||||
|
msg: options.validationFailedMsg,
|
||||||
|
errors: errors
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
return {
|
||||||
|
valid: true,
|
||||||
|
msg: ""
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
this.hide = function () {
|
||||||
|
var idx = editors.length;
|
||||||
|
while (idx--) {
|
||||||
|
editors[idx].hide && editors[idx].hide();
|
||||||
|
}
|
||||||
|
options.hide && options.hide();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
this.show = function () {
|
||||||
|
var idx = editors.length;
|
||||||
|
while (idx--) {
|
||||||
|
editors[idx].show && editors[idx].show();
|
||||||
|
}
|
||||||
|
options.show && options.show();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
this.position = function (box) {
|
||||||
|
options.position && options.position(box);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
|
||||||
|
// so we can do "editor instanceof Slick.CompositeEditor
|
||||||
|
editor.prototype = this;
|
||||||
|
|
||||||
|
return editor;
|
||||||
|
}
|
||||||
|
})(jQuery);
|
BIN
static/sg/images/actions.gif
Normal file
After Width: | Height: | Size: 170 B |
BIN
static/sg/images/ajax-loader-small.gif
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
static/sg/images/arrow_redo.png
Normal file
After Width: | Height: | Size: 572 B |
BIN
static/sg/images/arrow_right_peppermint.png
Normal file
After Width: | Height: | Size: 128 B |
BIN
static/sg/images/arrow_right_spearmint.png
Normal file
After Width: | Height: | Size: 128 B |
BIN
static/sg/images/arrow_undo.png
Normal file
After Width: | Height: | Size: 578 B |
BIN
static/sg/images/bullet_blue.png
Normal file
After Width: | Height: | Size: 241 B |
BIN
static/sg/images/bullet_star.png
Normal file
After Width: | Height: | Size: 279 B |
BIN
static/sg/images/bullet_toggle_minus.png
Normal file
After Width: | Height: | Size: 154 B |
BIN
static/sg/images/bullet_toggle_plus.png
Normal file
After Width: | Height: | Size: 156 B |
BIN
static/sg/images/calendar.gif
Normal file
After Width: | Height: | Size: 1.0 KiB |
BIN
static/sg/images/collapse.gif
Normal file
After Width: | Height: | Size: 846 B |
BIN
static/sg/images/comment_yellow.gif
Normal file
After Width: | Height: | Size: 257 B |
BIN
static/sg/images/down.gif
Normal file
After Width: | Height: | Size: 59 B |
BIN
static/sg/images/drag-handle.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
static/sg/images/editor-helper-bg.gif
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
static/sg/images/expand.gif
Normal file
After Width: | Height: | Size: 851 B |
BIN
static/sg/images/header-bg.gif
Normal file
After Width: | Height: | Size: 872 B |
BIN
static/sg/images/header-columns-bg.gif
Normal file
After Width: | Height: | Size: 836 B |
BIN
static/sg/images/header-columns-over-bg.gif
Normal file
After Width: | Height: | Size: 823 B |
BIN
static/sg/images/help.png
Normal file
After Width: | Height: | Size: 345 B |
BIN
static/sg/images/info.gif
Normal file
After Width: | Height: | Size: 80 B |
BIN
static/sg/images/listview.gif
Normal file
After Width: | Height: | Size: 2.3 KiB |
BIN
static/sg/images/pencil.gif
Normal file
After Width: | Height: | Size: 914 B |
BIN
static/sg/images/row-over-bg.gif
Normal file
After Width: | Height: | Size: 823 B |
BIN
static/sg/images/sort-asc.gif
Normal file
After Width: | Height: | Size: 830 B |
BIN
static/sg/images/sort-asc.png
Normal file
After Width: | Height: | Size: 105 B |
BIN
static/sg/images/sort-desc.gif
Normal file
After Width: | Height: | Size: 833 B |
BIN
static/sg/images/sort-desc.png
Normal file
After Width: | Height: | Size: 107 B |
BIN
static/sg/images/stripes.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
static/sg/images/tag_red.png
Normal file
After Width: | Height: | Size: 537 B |
BIN
static/sg/images/tick.png
Normal file
After Width: | Height: | Size: 484 B |
BIN
static/sg/images/user_identity.gif
Normal file
After Width: | Height: | Size: 905 B |
BIN
static/sg/images/user_identity_plus.gif
Normal file
After Width: | Height: | Size: 546 B |
9
static/sg/lib/firebugx.js
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
if (typeof console === "undefined" || typeof console.log === "undefined") {
|
||||||
|
var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
|
||||||
|
"group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];
|
||||||
|
|
||||||
|
window.console = {};
|
||||||
|
for (var i = 0; i < names.length; ++i) {
|
||||||
|
window.console[names[i]] = function() {}
|
||||||
|
}
|
||||||
|
}
|
4
static/sg/lib/jquery-1.7.min.js
vendored
Normal file
611
static/sg/lib/jquery-ui-1.8.16.custom.min.js
vendored
Normal file
|
@ -0,0 +1,611 @@
|
||||||
|
/*!
|
||||||
|
* jQuery UI 1.8.16
|
||||||
|
*
|
||||||
|
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI
|
||||||
|
*/
|
||||||
|
(function(c,j){function k(a,b){var d=a.nodeName.toLowerCase();if("area"===d){b=a.parentNode;d=b.name;if(!a.href||!d||b.nodeName.toLowerCase()!=="map")return false;a=c("img[usemap=#"+d+"]")[0];return!!a&&l(a)}return(/input|select|textarea|button|object/.test(d)?!a.disabled:"a"==d?a.href||b:b)&&l(a)}function l(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.16",
|
||||||
|
keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({propAttr:c.fn.prop||c.fn.attr,_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=
|
||||||
|
this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this,"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this,
|
||||||
|
"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position");if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"),10);if(!isNaN(b)&&b!==0)return b}a=a.parent()}}return 0},disableSelection:function(){return this.bind((c.support.selectstart?"selectstart":
|
||||||
|
"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});c.each(["Width","Height"],function(a,b){function d(f,g,m,n){c.each(e,function(){g-=parseFloat(c.curCSS(f,"padding"+this,true))||0;if(m)g-=parseFloat(c.curCSS(f,"border"+this+"Width",true))||0;if(n)g-=parseFloat(c.curCSS(f,"margin"+this,true))||0});return g}var e=b==="Width"?["Left","Right"]:["Top","Bottom"],h=b.toLowerCase(),i={innerWidth:c.fn.innerWidth,innerHeight:c.fn.innerHeight,
|
||||||
|
outerWidth:c.fn.outerWidth,outerHeight:c.fn.outerHeight};c.fn["inner"+b]=function(f){if(f===j)return i["inner"+b].call(this);return this.each(function(){c(this).css(h,d(this,f)+"px")})};c.fn["outer"+b]=function(f,g){if(typeof f!=="number")return i["outer"+b].call(this,f);return this.each(function(){c(this).css(h,d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){return k(a,!isNaN(c.attr(a,"tabindex")))},tabbable:function(a){var b=c.attr(a,
|
||||||
|
"tabindex"),d=isNaN(b);return(d||b>=0)&&k(a,!d)}});c(function(){var a=document.body,b=a.appendChild(b=document.createElement("div"));c.extend(b.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});c.support.minHeight=b.offsetHeight===100;c.support.selectstart="onselectstart"in b;a.removeChild(b).style.display="none"});c.extend(c.ui,{plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&
|
||||||
|
a.element[0].parentNode)for(var e=0;e<b.length;e++)a.options[b[e][0]]&&b[e][1].apply(a.element,d)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(a,b){if(c(a).css("overflow")==="hidden")return false;b=b&&b==="left"?"scrollLeft":"scrollTop";var d=false;if(a[b]>0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a<b+d},isOver:function(a,b,d,e,h,i){return c.ui.isOverAxis(a,d,h)&&
|
||||||
|
c.ui.isOverAxis(b,e,i)}})}})(jQuery);
|
||||||
|
;/*!
|
||||||
|
* jQuery UI Widget 1.8.16
|
||||||
|
*
|
||||||
|
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Widget
|
||||||
|
*/
|
||||||
|
(function(b,j){if(b.cleanData){var k=b.cleanData;b.cleanData=function(a){for(var c=0,d;(d=a[c])!=null;c++)try{b(d).triggerHandler("remove")}catch(e){}k(a)}}else{var l=b.fn.remove;b.fn.remove=function(a,c){return this.each(function(){if(!c)if(!a||b.filter(a,[this]).length)b("*",this).add([this]).each(function(){try{b(this).triggerHandler("remove")}catch(d){}});return l.call(b(this),a,c)})}}b.widget=function(a,c,d){var e=a.split(".")[0],f;a=a.split(".")[1];f=e+"-"+a;if(!d){d=c;c=b.Widget}b.expr[":"][f]=
|
||||||
|
function(h){return!!b.data(h,a)};b[e]=b[e]||{};b[e][a]=function(h,g){arguments.length&&this._createWidget(h,g)};c=new c;c.options=b.extend(true,{},c.options);b[e][a].prototype=b.extend(true,c,{namespace:e,widgetName:a,widgetEventPrefix:b[e][a].prototype.widgetEventPrefix||a,widgetBaseClass:f},d);b.widget.bridge(a,b[e][a])};b.widget.bridge=function(a,c){b.fn[a]=function(d){var e=typeof d==="string",f=Array.prototype.slice.call(arguments,1),h=this;d=!e&&f.length?b.extend.apply(null,[true,d].concat(f)):
|
||||||
|
d;if(e&&d.charAt(0)==="_")return h;e?this.each(function(){var g=b.data(this,a),i=g&&b.isFunction(g[d])?g[d].apply(g,f):g;if(i!==g&&i!==j){h=i;return false}}):this.each(function(){var g=b.data(this,a);g?g.option(d||{})._init():b.data(this,a,new c(d,this))});return h}};b.Widget=function(a,c){arguments.length&&this._createWidget(a,c)};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(a,c){b.data(c,this.widgetName,this);this.element=b(c);this.options=
|
||||||
|
b.extend(true,{},this.options,this._getCreateOptions(),a);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+
|
||||||
|
"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(a,c){var d=a;if(arguments.length===0)return b.extend({},this.options);if(typeof a==="string"){if(c===j)return this.options[a];d={};d[a]=c}this._setOptions(d);return this},_setOptions:function(a){var c=this;b.each(a,function(d,e){c._setOption(d,e)});return this},_setOption:function(a,c){this.options[a]=c;if(a==="disabled")this.widget()[c?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",
|
||||||
|
c);return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(a,c,d){var e=this.options[a];c=b.Event(c);c.type=(a===this.widgetEventPrefix?a:this.widgetEventPrefix+a).toLowerCase();d=d||{};if(c.originalEvent){a=b.event.props.length;for(var f;a;){f=b.event.props[--a];c[f]=c.originalEvent[f]}}this.element.trigger(c,d);return!(b.isFunction(e)&&e.call(this.element[0],c,d)===false||c.isDefaultPrevented())}}})(jQuery);
|
||||||
|
;/*!
|
||||||
|
* jQuery UI Mouse 1.8.16
|
||||||
|
*
|
||||||
|
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Mouse
|
||||||
|
*
|
||||||
|
* Depends:
|
||||||
|
* jquery.ui.widget.js
|
||||||
|
*/
|
||||||
|
(function(b){var d=false;b(document).mouseup(function(){d=false});b.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var a=this;this.element.bind("mousedown."+this.widgetName,function(c){return a._mouseDown(c)}).bind("click."+this.widgetName,function(c){if(true===b.data(c.target,a.widgetName+".preventClickEvent")){b.removeData(c.target,a.widgetName+".preventClickEvent");c.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+
|
||||||
|
this.widgetName)},_mouseDown:function(a){if(!d){this._mouseStarted&&this._mouseUp(a);this._mouseDownEvent=a;var c=this,f=a.which==1,g=typeof this.options.cancel=="string"&&a.target.nodeName?b(a.target).closest(this.options.cancel).length:false;if(!f||g||!this._mouseCapture(a))return true;this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet)this._mouseDelayTimer=setTimeout(function(){c.mouseDelayMet=true},this.options.delay);if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a)){this._mouseStarted=
|
||||||
|
this._mouseStart(a)!==false;if(!this._mouseStarted){a.preventDefault();return true}}true===b.data(a.target,this.widgetName+".preventClickEvent")&&b.removeData(a.target,this.widgetName+".preventClickEvent");this._mouseMoveDelegate=function(e){return c._mouseMove(e)};this._mouseUpDelegate=function(e){return c._mouseUp(e)};b(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);a.preventDefault();return d=true}},_mouseMove:function(a){if(b.browser.msie&&
|
||||||
|
!(document.documentMode>=9)&&!a.button)return this._mouseUp(a);if(this._mouseStarted){this._mouseDrag(a);return a.preventDefault()}if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a))(this._mouseStarted=this._mouseStart(this._mouseDownEvent,a)!==false)?this._mouseDrag(a):this._mouseUp(a);return!this._mouseStarted},_mouseUp:function(a){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=
|
||||||
|
false;a.target==this._mouseDownEvent.target&&b.data(a.target,this.widgetName+".preventClickEvent",true);this._mouseStop(a)}return false},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery);
|
||||||
|
;/*
|
||||||
|
* jQuery UI Position 1.8.16
|
||||||
|
*
|
||||||
|
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Position
|
||||||
|
*/
|
||||||
|
(function(c){c.ui=c.ui||{};var n=/left|center|right/,o=/top|center|bottom/,t=c.fn.position,u=c.fn.offset;c.fn.position=function(b){if(!b||!b.of)return t.apply(this,arguments);b=c.extend({},b);var a=c(b.of),d=a[0],g=(b.collision||"flip").split(" "),e=b.offset?b.offset.split(" "):[0,0],h,k,j;if(d.nodeType===9){h=a.width();k=a.height();j={top:0,left:0}}else if(d.setTimeout){h=a.width();k=a.height();j={top:a.scrollTop(),left:a.scrollLeft()}}else if(d.preventDefault){b.at="left top";h=k=0;j={top:b.of.pageY,
|
||||||
|
left:b.of.pageX}}else{h=a.outerWidth();k=a.outerHeight();j=a.offset()}c.each(["my","at"],function(){var f=(b[this]||"").split(" ");if(f.length===1)f=n.test(f[0])?f.concat(["center"]):o.test(f[0])?["center"].concat(f):["center","center"];f[0]=n.test(f[0])?f[0]:"center";f[1]=o.test(f[1])?f[1]:"center";b[this]=f});if(g.length===1)g[1]=g[0];e[0]=parseInt(e[0],10)||0;if(e.length===1)e[1]=e[0];e[1]=parseInt(e[1],10)||0;if(b.at[0]==="right")j.left+=h;else if(b.at[0]==="center")j.left+=h/2;if(b.at[1]==="bottom")j.top+=
|
||||||
|
k;else if(b.at[1]==="center")j.top+=k/2;j.left+=e[0];j.top+=e[1];return this.each(function(){var f=c(this),l=f.outerWidth(),m=f.outerHeight(),p=parseInt(c.curCSS(this,"marginLeft",true))||0,q=parseInt(c.curCSS(this,"marginTop",true))||0,v=l+p+(parseInt(c.curCSS(this,"marginRight",true))||0),w=m+q+(parseInt(c.curCSS(this,"marginBottom",true))||0),i=c.extend({},j),r;if(b.my[0]==="right")i.left-=l;else if(b.my[0]==="center")i.left-=l/2;if(b.my[1]==="bottom")i.top-=m;else if(b.my[1]==="center")i.top-=
|
||||||
|
m/2;i.left=Math.round(i.left);i.top=Math.round(i.top);r={left:i.left-p,top:i.top-q};c.each(["left","top"],function(s,x){c.ui.position[g[s]]&&c.ui.position[g[s]][x](i,{targetWidth:h,targetHeight:k,elemWidth:l,elemHeight:m,collisionPosition:r,collisionWidth:v,collisionHeight:w,offset:e,my:b.my,at:b.at})});c.fn.bgiframe&&f.bgiframe();f.offset(c.extend(i,{using:b.using}))})};c.ui.position={fit:{left:function(b,a){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();b.left=
|
||||||
|
d>0?b.left-d:Math.max(b.left-a.collisionPosition.left,b.left)},top:function(b,a){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();b.top=d>0?b.top-d:Math.max(b.top-a.collisionPosition.top,b.top)}},flip:{left:function(b,a){if(a.at[0]!=="center"){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();var g=a.my[0]==="left"?-a.elemWidth:a.my[0]==="right"?a.elemWidth:0,e=a.at[0]==="left"?a.targetWidth:-a.targetWidth,h=-2*a.offset[0];b.left+=
|
||||||
|
a.collisionPosition.left<0?g+e+h:d>0?g+e+h:0}},top:function(b,a){if(a.at[1]!=="center"){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();var g=a.my[1]==="top"?-a.elemHeight:a.my[1]==="bottom"?a.elemHeight:0,e=a.at[1]==="top"?a.targetHeight:-a.targetHeight,h=-2*a.offset[1];b.top+=a.collisionPosition.top<0?g+e+h:d>0?g+e+h:0}}}};if(!c.offset.setOffset){c.offset.setOffset=function(b,a){if(/static/.test(c.curCSS(b,"position")))b.style.position="relative";var d=c(b),
|
||||||
|
g=d.offset(),e=parseInt(c.curCSS(b,"top",true),10)||0,h=parseInt(c.curCSS(b,"left",true),10)||0;g={top:a.top-g.top+e,left:a.left-g.left+h};"using"in a?a.using.call(b,g):d.css(g)};c.fn.offset=function(b){var a=this[0];if(!a||!a.ownerDocument)return null;if(b)return this.each(function(){c.offset.setOffset(this,b)});return u.call(this)}}})(jQuery);
|
||||||
|
;/*
|
||||||
|
* jQuery UI Draggable 1.8.16
|
||||||
|
*
|
||||||
|
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Draggables
|
||||||
|
*
|
||||||
|
* Depends:
|
||||||
|
* jquery.ui.core.js
|
||||||
|
* jquery.ui.mouse.js
|
||||||
|
* jquery.ui.widget.js
|
||||||
|
*/
|
||||||
|
(function(d){d.widget("ui.draggable",d.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:true,appendTo:"parent",axis:false,connectToSortable:false,containment:false,cursor:"auto",cursorAt:false,grid:false,handle:false,helper:"original",iframeFix:false,opacity:false,refreshPositions:false,revert:false,revertDuration:500,scope:"default",scroll:true,scrollSensitivity:20,scrollSpeed:20,snap:false,snapMode:"both",snapTolerance:20,stack:false,zIndex:false},_create:function(){if(this.options.helper==
|
||||||
|
"original"&&!/^(?:r|a|f)/.test(this.element.css("position")))this.element[0].style.position="relative";this.options.addClasses&&this.element.addClass("ui-draggable");this.options.disabled&&this.element.addClass("ui-draggable-disabled");this._mouseInit()},destroy:function(){if(this.element.data("draggable")){this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");this._mouseDestroy();return this}},_mouseCapture:function(a){var b=
|
||||||
|
this.options;if(this.helper||b.disabled||d(a.target).is(".ui-resizable-handle"))return false;this.handle=this._getHandle(a);if(!this.handle)return false;if(b.iframeFix)d(b.iframeFix===true?"iframe":b.iframeFix).each(function(){d('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1E3}).css(d(this).offset()).appendTo("body")});return true},_mouseStart:function(a){var b=this.options;
|
||||||
|
this.helper=this._createHelper(a);this._cacheHelperProportions();if(d.ui.ddmanager)d.ui.ddmanager.current=this;this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.positionAbs=this.element.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};d.extend(this.offset,{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});
|
||||||
|
this.originalPosition=this.position=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);b.containment&&this._setContainment();if(this._trigger("start",a)===false){this._clear();return false}this._cacheHelperProportions();d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.helper.addClass("ui-draggable-dragging");this._mouseDrag(a,true);d.ui.ddmanager&&d.ui.ddmanager.dragStart(this,a);return true},
|
||||||
|
_mouseDrag:function(a,b){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");if(!b){b=this._uiHash();if(this._trigger("drag",a,b)===false){this._mouseUp({});return false}this.position=b.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);return false},_mouseStop:function(a){var b=
|
||||||
|
false;if(d.ui.ddmanager&&!this.options.dropBehaviour)b=d.ui.ddmanager.drop(this,a);if(this.dropped){b=this.dropped;this.dropped=false}if((!this.element[0]||!this.element[0].parentNode)&&this.options.helper=="original")return false;if(this.options.revert=="invalid"&&!b||this.options.revert=="valid"&&b||this.options.revert===true||d.isFunction(this.options.revert)&&this.options.revert.call(this.element,b)){var c=this;d(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,
|
||||||
|
10),function(){c._trigger("stop",a)!==false&&c._clear()})}else this._trigger("stop",a)!==false&&this._clear();return false},_mouseUp:function(a){this.options.iframeFix===true&&d("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)});d.ui.ddmanager&&d.ui.ddmanager.dragStop(this,a);return d.ui.mouse.prototype._mouseUp.call(this,a)},cancel:function(){this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear();return this},_getHandle:function(a){var b=!this.options.handle||
|
||||||
|
!d(this.options.handle,this.element).length?true:false;d(this.options.handle,this.element).find("*").andSelf().each(function(){if(this==a.target)b=true});return b},_createHelper:function(a){var b=this.options;a=d.isFunction(b.helper)?d(b.helper.apply(this.element[0],[a])):b.helper=="clone"?this.element.clone().removeAttr("id"):this.element;a.parents("body").length||a.appendTo(b.appendTo=="parent"?this.element[0].parentNode:b.appendTo);a[0]!=this.element[0]&&!/(fixed|absolute)/.test(a.css("position"))&&
|
||||||
|
a.css("position","absolute");return a},_adjustOffsetFromHelper:function(a){if(typeof a=="string")a=a.split(" ");if(d.isArray(a))a={left:+a[0],top:+a[1]||0};if("left"in a)this.offset.click.left=a.left+this.margins.left;if("right"in a)this.offset.click.left=this.helperProportions.width-a.right+this.margins.left;if("top"in a)this.offset.click.top=a.top+this.margins.top;if("bottom"in a)this.offset.click.top=this.helperProportions.height-a.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=
|
||||||
|
this.helper.offsetParent();var a=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0])){a.left+=this.scrollParent.scrollLeft();a.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&d.browser.msie)a={top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"),
|
||||||
|
10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.element.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),
|
||||||
|
10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var a=this.options;if(a.containment=="parent")a.containment=this.helper[0].parentNode;if(a.containment=="document"||a.containment=="window")this.containment=[a.containment=="document"?0:d(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,a.containment=="document"?0:d(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,
|
||||||
|
(a.containment=="document"?0:d(window).scrollLeft())+d(a.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(a.containment=="document"?0:d(window).scrollTop())+(d(a.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)&&a.containment.constructor!=Array){a=d(a.containment);var b=a[0];if(b){a.offset();var c=d(b).css("overflow")!=
|
||||||
|
"hidden";this.containment=[(parseInt(d(b).css("borderLeftWidth"),10)||0)+(parseInt(d(b).css("paddingLeft"),10)||0),(parseInt(d(b).css("borderTopWidth"),10)||0)+(parseInt(d(b).css("paddingTop"),10)||0),(c?Math.max(b.scrollWidth,b.offsetWidth):b.offsetWidth)-(parseInt(d(b).css("borderLeftWidth"),10)||0)-(parseInt(d(b).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(c?Math.max(b.scrollHeight,b.offsetHeight):b.offsetHeight)-(parseInt(d(b).css("borderTopWidth"),
|
||||||
|
10)||0)-(parseInt(d(b).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom];this.relative_container=a}}else if(a.containment.constructor==Array)this.containment=a.containment},_convertPositionTo:function(a,b){if(!b)b=this.position;a=a=="absolute"?1:-1;var c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName);return{top:b.top+
|
||||||
|
this.offset.relative.top*a+this.offset.parent.top*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent.left*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b=this.options,c=this.cssPosition=="absolute"&&
|
||||||
|
!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName),e=a.pageX,h=a.pageY;if(this.originalPosition){var g;if(this.containment){if(this.relative_container){g=this.relative_container.offset();g=[this.containment[0]+g.left,this.containment[1]+g.top,this.containment[2]+g.left,this.containment[3]+g.top]}else g=this.containment;if(a.pageX-this.offset.click.left<g[0])e=g[0]+this.offset.click.left;
|
||||||
|
if(a.pageY-this.offset.click.top<g[1])h=g[1]+this.offset.click.top;if(a.pageX-this.offset.click.left>g[2])e=g[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>g[3])h=g[3]+this.offset.click.top}if(b.grid){h=b.grid[1]?this.originalPageY+Math.round((h-this.originalPageY)/b.grid[1])*b.grid[1]:this.originalPageY;h=g?!(h-this.offset.click.top<g[1]||h-this.offset.click.top>g[3])?h:!(h-this.offset.click.top<g[1])?h-b.grid[1]:h+b.grid[1]:h;e=b.grid[0]?this.originalPageX+Math.round((e-this.originalPageX)/
|
||||||
|
b.grid[0])*b.grid[0]:this.originalPageX;e=g?!(e-this.offset.click.left<g[0]||e-this.offset.click.left>g[2])?e:!(e-this.offset.click.left<g[0])?e-b.grid[0]:e+b.grid[0]:e}}return{top:h-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:c.scrollTop()),left:e-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(d.browser.safari&&d.browser.version<
|
||||||
|
526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:c.scrollLeft())}},_clear:function(){this.helper.removeClass("ui-draggable-dragging");this.helper[0]!=this.element[0]&&!this.cancelHelperRemoval&&this.helper.remove();this.helper=null;this.cancelHelperRemoval=false},_trigger:function(a,b,c){c=c||this._uiHash();d.ui.plugin.call(this,a,[b,c]);if(a=="drag")this.positionAbs=this._convertPositionTo("absolute");return d.Widget.prototype._trigger.call(this,a,b,
|
||||||
|
c)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}});d.extend(d.ui.draggable,{version:"1.8.16"});d.ui.plugin.add("draggable","connectToSortable",{start:function(a,b){var c=d(this).data("draggable"),f=c.options,e=d.extend({},b,{item:c.element});c.sortables=[];d(f.connectToSortable).each(function(){var h=d.data(this,"sortable");if(h&&!h.options.disabled){c.sortables.push({instance:h,shouldRevert:h.options.revert});
|
||||||
|
h.refreshPositions();h._trigger("activate",a,e)}})},stop:function(a,b){var c=d(this).data("draggable"),f=d.extend({},b,{item:c.element});d.each(c.sortables,function(){if(this.instance.isOver){this.instance.isOver=0;c.cancelHelperRemoval=true;this.instance.cancelHelperRemoval=false;if(this.shouldRevert)this.instance.options.revert=true;this.instance._mouseStop(a);this.instance.options.helper=this.instance.options._helper;c.options.helper=="original"&&this.instance.currentItem.css({top:"auto",left:"auto"})}else{this.instance.cancelHelperRemoval=
|
||||||
|
false;this.instance._trigger("deactivate",a,f)}})},drag:function(a,b){var c=d(this).data("draggable"),f=this;d.each(c.sortables,function(){this.instance.positionAbs=c.positionAbs;this.instance.helperProportions=c.helperProportions;this.instance.offset.click=c.offset.click;if(this.instance._intersectsWith(this.instance.containerCache)){if(!this.instance.isOver){this.instance.isOver=1;this.instance.currentItem=d(f).clone().removeAttr("id").appendTo(this.instance.element).data("sortable-item",true);
|
||||||
|
this.instance.options._helper=this.instance.options.helper;this.instance.options.helper=function(){return b.helper[0]};a.target=this.instance.currentItem[0];this.instance._mouseCapture(a,true);this.instance._mouseStart(a,true,true);this.instance.offset.click.top=c.offset.click.top;this.instance.offset.click.left=c.offset.click.left;this.instance.offset.parent.left-=c.offset.parent.left-this.instance.offset.parent.left;this.instance.offset.parent.top-=c.offset.parent.top-this.instance.offset.parent.top;
|
||||||
|
c._trigger("toSortable",a);c.dropped=this.instance.element;c.currentItem=c.element;this.instance.fromOutside=c}this.instance.currentItem&&this.instance._mouseDrag(a)}else if(this.instance.isOver){this.instance.isOver=0;this.instance.cancelHelperRemoval=true;this.instance.options.revert=false;this.instance._trigger("out",a,this.instance._uiHash(this.instance));this.instance._mouseStop(a,true);this.instance.options.helper=this.instance.options._helper;this.instance.currentItem.remove();this.instance.placeholder&&
|
||||||
|
this.instance.placeholder.remove();c._trigger("fromSortable",a);c.dropped=false}})}});d.ui.plugin.add("draggable","cursor",{start:function(){var a=d("body"),b=d(this).data("draggable").options;if(a.css("cursor"))b._cursor=a.css("cursor");a.css("cursor",b.cursor)},stop:function(){var a=d(this).data("draggable").options;a._cursor&&d("body").css("cursor",a._cursor)}});d.ui.plugin.add("draggable","opacity",{start:function(a,b){a=d(b.helper);b=d(this).data("draggable").options;if(a.css("opacity"))b._opacity=
|
||||||
|
a.css("opacity");a.css("opacity",b.opacity)},stop:function(a,b){a=d(this).data("draggable").options;a._opacity&&d(b.helper).css("opacity",a._opacity)}});d.ui.plugin.add("draggable","scroll",{start:function(){var a=d(this).data("draggable");if(a.scrollParent[0]!=document&&a.scrollParent[0].tagName!="HTML")a.overflowOffset=a.scrollParent.offset()},drag:function(a){var b=d(this).data("draggable"),c=b.options,f=false;if(b.scrollParent[0]!=document&&b.scrollParent[0].tagName!="HTML"){if(!c.axis||c.axis!=
|
||||||
|
"x")if(b.overflowOffset.top+b.scrollParent[0].offsetHeight-a.pageY<c.scrollSensitivity)b.scrollParent[0].scrollTop=f=b.scrollParent[0].scrollTop+c.scrollSpeed;else if(a.pageY-b.overflowOffset.top<c.scrollSensitivity)b.scrollParent[0].scrollTop=f=b.scrollParent[0].scrollTop-c.scrollSpeed;if(!c.axis||c.axis!="y")if(b.overflowOffset.left+b.scrollParent[0].offsetWidth-a.pageX<c.scrollSensitivity)b.scrollParent[0].scrollLeft=f=b.scrollParent[0].scrollLeft+c.scrollSpeed;else if(a.pageX-b.overflowOffset.left<
|
||||||
|
c.scrollSensitivity)b.scrollParent[0].scrollLeft=f=b.scrollParent[0].scrollLeft-c.scrollSpeed}else{if(!c.axis||c.axis!="x")if(a.pageY-d(document).scrollTop()<c.scrollSensitivity)f=d(document).scrollTop(d(document).scrollTop()-c.scrollSpeed);else if(d(window).height()-(a.pageY-d(document).scrollTop())<c.scrollSensitivity)f=d(document).scrollTop(d(document).scrollTop()+c.scrollSpeed);if(!c.axis||c.axis!="y")if(a.pageX-d(document).scrollLeft()<c.scrollSensitivity)f=d(document).scrollLeft(d(document).scrollLeft()-
|
||||||
|
c.scrollSpeed);else if(d(window).width()-(a.pageX-d(document).scrollLeft())<c.scrollSensitivity)f=d(document).scrollLeft(d(document).scrollLeft()+c.scrollSpeed)}f!==false&&d.ui.ddmanager&&!c.dropBehaviour&&d.ui.ddmanager.prepareOffsets(b,a)}});d.ui.plugin.add("draggable","snap",{start:function(){var a=d(this).data("draggable"),b=a.options;a.snapElements=[];d(b.snap.constructor!=String?b.snap.items||":data(draggable)":b.snap).each(function(){var c=d(this),f=c.offset();this!=a.element[0]&&a.snapElements.push({item:this,
|
||||||
|
width:c.outerWidth(),height:c.outerHeight(),top:f.top,left:f.left})})},drag:function(a,b){for(var c=d(this).data("draggable"),f=c.options,e=f.snapTolerance,h=b.offset.left,g=h+c.helperProportions.width,n=b.offset.top,o=n+c.helperProportions.height,i=c.snapElements.length-1;i>=0;i--){var j=c.snapElements[i].left,l=j+c.snapElements[i].width,k=c.snapElements[i].top,m=k+c.snapElements[i].height;if(j-e<h&&h<l+e&&k-e<n&&n<m+e||j-e<h&&h<l+e&&k-e<o&&o<m+e||j-e<g&&g<l+e&&k-e<n&&n<m+e||j-e<g&&g<l+e&&k-e<o&&
|
||||||
|
o<m+e){if(f.snapMode!="inner"){var p=Math.abs(k-o)<=e,q=Math.abs(m-n)<=e,r=Math.abs(j-g)<=e,s=Math.abs(l-h)<=e;if(p)b.position.top=c._convertPositionTo("relative",{top:k-c.helperProportions.height,left:0}).top-c.margins.top;if(q)b.position.top=c._convertPositionTo("relative",{top:m,left:0}).top-c.margins.top;if(r)b.position.left=c._convertPositionTo("relative",{top:0,left:j-c.helperProportions.width}).left-c.margins.left;if(s)b.position.left=c._convertPositionTo("relative",{top:0,left:l}).left-c.margins.left}var t=
|
||||||
|
p||q||r||s;if(f.snapMode!="outer"){p=Math.abs(k-n)<=e;q=Math.abs(m-o)<=e;r=Math.abs(j-h)<=e;s=Math.abs(l-g)<=e;if(p)b.position.top=c._convertPositionTo("relative",{top:k,left:0}).top-c.margins.top;if(q)b.position.top=c._convertPositionTo("relative",{top:m-c.helperProportions.height,left:0}).top-c.margins.top;if(r)b.position.left=c._convertPositionTo("relative",{top:0,left:j}).left-c.margins.left;if(s)b.position.left=c._convertPositionTo("relative",{top:0,left:l-c.helperProportions.width}).left-c.margins.left}if(!c.snapElements[i].snapping&&
|
||||||
|
(p||q||r||s||t))c.options.snap.snap&&c.options.snap.snap.call(c.element,a,d.extend(c._uiHash(),{snapItem:c.snapElements[i].item}));c.snapElements[i].snapping=p||q||r||s||t}else{c.snapElements[i].snapping&&c.options.snap.release&&c.options.snap.release.call(c.element,a,d.extend(c._uiHash(),{snapItem:c.snapElements[i].item}));c.snapElements[i].snapping=false}}}});d.ui.plugin.add("draggable","stack",{start:function(){var a=d(this).data("draggable").options;a=d.makeArray(d(a.stack)).sort(function(c,f){return(parseInt(d(c).css("zIndex"),
|
||||||
|
10)||0)-(parseInt(d(f).css("zIndex"),10)||0)});if(a.length){var b=parseInt(a[0].style.zIndex)||0;d(a).each(function(c){this.style.zIndex=b+c});this[0].style.zIndex=b+a.length}}});d.ui.plugin.add("draggable","zIndex",{start:function(a,b){a=d(b.helper);b=d(this).data("draggable").options;if(a.css("zIndex"))b._zIndex=a.css("zIndex");a.css("zIndex",b.zIndex)},stop:function(a,b){a=d(this).data("draggable").options;a._zIndex&&d(b.helper).css("zIndex",a._zIndex)}})})(jQuery);
|
||||||
|
;/*
|
||||||
|
* jQuery UI Droppable 1.8.16
|
||||||
|
*
|
||||||
|
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Droppables
|
||||||
|
*
|
||||||
|
* Depends:
|
||||||
|
* jquery.ui.core.js
|
||||||
|
* jquery.ui.widget.js
|
||||||
|
* jquery.ui.mouse.js
|
||||||
|
* jquery.ui.draggable.js
|
||||||
|
*/
|
||||||
|
(function(d){d.widget("ui.droppable",{widgetEventPrefix:"drop",options:{accept:"*",activeClass:false,addClasses:true,greedy:false,hoverClass:false,scope:"default",tolerance:"intersect"},_create:function(){var a=this.options,b=a.accept;this.isover=0;this.isout=1;this.accept=d.isFunction(b)?b:function(c){return c.is(b)};this.proportions={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight};d.ui.ddmanager.droppables[a.scope]=d.ui.ddmanager.droppables[a.scope]||[];d.ui.ddmanager.droppables[a.scope].push(this);
|
||||||
|
a.addClasses&&this.element.addClass("ui-droppable")},destroy:function(){for(var a=d.ui.ddmanager.droppables[this.options.scope],b=0;b<a.length;b++)a[b]==this&&a.splice(b,1);this.element.removeClass("ui-droppable ui-droppable-disabled").removeData("droppable").unbind(".droppable");return this},_setOption:function(a,b){if(a=="accept")this.accept=d.isFunction(b)?b:function(c){return c.is(b)};d.Widget.prototype._setOption.apply(this,arguments)},_activate:function(a){var b=d.ui.ddmanager.current;this.options.activeClass&&
|
||||||
|
this.element.addClass(this.options.activeClass);b&&this._trigger("activate",a,this.ui(b))},_deactivate:function(a){var b=d.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass);b&&this._trigger("deactivate",a,this.ui(b))},_over:function(a){var b=d.ui.ddmanager.current;if(!(!b||(b.currentItem||b.element)[0]==this.element[0]))if(this.accept.call(this.element[0],b.currentItem||b.element)){this.options.hoverClass&&this.element.addClass(this.options.hoverClass);
|
||||||
|
this._trigger("over",a,this.ui(b))}},_out:function(a){var b=d.ui.ddmanager.current;if(!(!b||(b.currentItem||b.element)[0]==this.element[0]))if(this.accept.call(this.element[0],b.currentItem||b.element)){this.options.hoverClass&&this.element.removeClass(this.options.hoverClass);this._trigger("out",a,this.ui(b))}},_drop:function(a,b){var c=b||d.ui.ddmanager.current;if(!c||(c.currentItem||c.element)[0]==this.element[0])return false;var e=false;this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function(){var g=
|
||||||
|
d.data(this,"droppable");if(g.options.greedy&&!g.options.disabled&&g.options.scope==c.options.scope&&g.accept.call(g.element[0],c.currentItem||c.element)&&d.ui.intersect(c,d.extend(g,{offset:g.element.offset()}),g.options.tolerance)){e=true;return false}});if(e)return false;if(this.accept.call(this.element[0],c.currentItem||c.element)){this.options.activeClass&&this.element.removeClass(this.options.activeClass);this.options.hoverClass&&this.element.removeClass(this.options.hoverClass);this._trigger("drop",
|
||||||
|
a,this.ui(c));return this.element}return false},ui:function(a){return{draggable:a.currentItem||a.element,helper:a.helper,position:a.position,offset:a.positionAbs}}});d.extend(d.ui.droppable,{version:"1.8.16"});d.ui.intersect=function(a,b,c){if(!b.offset)return false;var e=(a.positionAbs||a.position.absolute).left,g=e+a.helperProportions.width,f=(a.positionAbs||a.position.absolute).top,h=f+a.helperProportions.height,i=b.offset.left,k=i+b.proportions.width,j=b.offset.top,l=j+b.proportions.height;
|
||||||
|
switch(c){case "fit":return i<=e&&g<=k&&j<=f&&h<=l;case "intersect":return i<e+a.helperProportions.width/2&&g-a.helperProportions.width/2<k&&j<f+a.helperProportions.height/2&&h-a.helperProportions.height/2<l;case "pointer":return d.ui.isOver((a.positionAbs||a.position.absolute).top+(a.clickOffset||a.offset.click).top,(a.positionAbs||a.position.absolute).left+(a.clickOffset||a.offset.click).left,j,i,b.proportions.height,b.proportions.width);case "touch":return(f>=j&&f<=l||h>=j&&h<=l||f<j&&h>l)&&(e>=
|
||||||
|
i&&e<=k||g>=i&&g<=k||e<i&&g>k);default:return false}};d.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(a,b){var c=d.ui.ddmanager.droppables[a.options.scope]||[],e=b?b.type:null,g=(a.currentItem||a.element).find(":data(droppable)").andSelf(),f=0;a:for(;f<c.length;f++)if(!(c[f].options.disabled||a&&!c[f].accept.call(c[f].element[0],a.currentItem||a.element))){for(var h=0;h<g.length;h++)if(g[h]==c[f].element[0]){c[f].proportions.height=0;continue a}c[f].visible=c[f].element.css("display")!=
|
||||||
|
"none";if(c[f].visible){e=="mousedown"&&c[f]._activate.call(c[f],b);c[f].offset=c[f].element.offset();c[f].proportions={width:c[f].element[0].offsetWidth,height:c[f].element[0].offsetHeight}}}},drop:function(a,b){var c=false;d.each(d.ui.ddmanager.droppables[a.options.scope]||[],function(){if(this.options){if(!this.options.disabled&&this.visible&&d.ui.intersect(a,this,this.options.tolerance))c=c||this._drop.call(this,b);if(!this.options.disabled&&this.visible&&this.accept.call(this.element[0],a.currentItem||
|
||||||
|
a.element)){this.isout=1;this.isover=0;this._deactivate.call(this,b)}}});return c},dragStart:function(a,b){a.element.parents(":not(body,html)").bind("scroll.droppable",function(){a.options.refreshPositions||d.ui.ddmanager.prepareOffsets(a,b)})},drag:function(a,b){a.options.refreshPositions&&d.ui.ddmanager.prepareOffsets(a,b);d.each(d.ui.ddmanager.droppables[a.options.scope]||[],function(){if(!(this.options.disabled||this.greedyChild||!this.visible)){var c=d.ui.intersect(a,this,this.options.tolerance);
|
||||||
|
if(c=!c&&this.isover==1?"isout":c&&this.isover==0?"isover":null){var e;if(this.options.greedy){var g=this.element.parents(":data(droppable):eq(0)");if(g.length){e=d.data(g[0],"droppable");e.greedyChild=c=="isover"?1:0}}if(e&&c=="isover"){e.isover=0;e.isout=1;e._out.call(e,b)}this[c]=1;this[c=="isout"?"isover":"isout"]=0;this[c=="isover"?"_over":"_out"].call(this,b);if(e&&c=="isout"){e.isout=0;e.isover=1;e._over.call(e,b)}}}})},dragStop:function(a,b){a.element.parents(":not(body,html)").unbind("scroll.droppable");
|
||||||
|
a.options.refreshPositions||d.ui.ddmanager.prepareOffsets(a,b)}}})(jQuery);
|
||||||
|
;/*
|
||||||
|
* jQuery UI Resizable 1.8.16
|
||||||
|
*
|
||||||
|
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Resizables
|
||||||
|
*
|
||||||
|
* Depends:
|
||||||
|
* jquery.ui.core.js
|
||||||
|
* jquery.ui.mouse.js
|
||||||
|
* jquery.ui.widget.js
|
||||||
|
*/
|
||||||
|
(function(e){e.widget("ui.resizable",e.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1E3},_create:function(){var b=this,a=this.options;this.element.addClass("ui-resizable");e.extend(this,{_aspectRatio:!!a.aspectRatio,aspectRatio:a.aspectRatio,originalElement:this.element,
|
||||||
|
_proportionallyResizeElements:[],_helper:a.helper||a.ghost||a.animate?a.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){/relative/.test(this.element.css("position"))&&e.browser.opera&&this.element.css({position:"relative",top:"auto",left:"auto"});this.element.wrap(e('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),
|
||||||
|
top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=
|
||||||
|
this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=a.handles||(!e(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",
|
||||||
|
nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all")this.handles="n,e,s,w,se,sw,ne,nw";var c=this.handles.split(",");this.handles={};for(var d=0;d<c.length;d++){var f=e.trim(c[d]),g=e('<div class="ui-resizable-handle '+("ui-resizable-"+f)+'"></div>');/sw|se|ne|nw/.test(f)&&g.css({zIndex:++a.zIndex});"se"==f&&g.addClass("ui-icon ui-icon-gripsmall-diagonal-se");this.handles[f]=".ui-resizable-"+f;this.element.append(g)}}this._renderAxis=function(h){h=h||this.element;for(var i in this.handles){if(this.handles[i].constructor==
|
||||||
|
String)this.handles[i]=e(this.handles[i],this.element).show();if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var j=e(this.handles[i],this.element),l=0;l=/sw|ne|nw|se|n|s/.test(i)?j.outerHeight():j.outerWidth();j=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join("");h.css(j,l);this._proportionallyResize()}e(this.handles[i])}};this._renderAxis(this.element);this._handles=e(".ui-resizable-handle",this.element).disableSelection();
|
||||||
|
this._handles.mouseover(function(){if(!b.resizing){if(this.className)var h=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=h&&h[1]?h[1]:"se"}});if(a.autoHide){this._handles.hide();e(this.element).addClass("ui-resizable-autohide").hover(function(){if(!a.disabled){e(this).removeClass("ui-resizable-autohide");b._handles.show()}},function(){if(!a.disabled)if(!b.resizing){e(this).addClass("ui-resizable-autohide");b._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();
|
||||||
|
var b=function(c){e(c).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){b(this.element);var a=this.element;a.after(this.originalElement.css({position:a.css("position"),width:a.outerWidth(),height:a.outerHeight(),top:a.css("top"),left:a.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);b(this.originalElement);return this},_mouseCapture:function(b){var a=
|
||||||
|
false;for(var c in this.handles)if(e(this.handles[c])[0]==b.target)a=true;return!this.options.disabled&&a},_mouseStart:function(b){var a=this.options,c=this.element.position(),d=this.element;this.resizing=true;this.documentScroll={top:e(document).scrollTop(),left:e(document).scrollLeft()};if(d.is(".ui-draggable")||/absolute/.test(d.css("position")))d.css({position:"absolute",top:c.top,left:c.left});e.browser.opera&&/relative/.test(d.css("position"))&&d.css({position:"relative",top:"auto",left:"auto"});
|
||||||
|
this._renderProxy();c=m(this.helper.css("left"));var f=m(this.helper.css("top"));if(a.containment){c+=e(a.containment).scrollLeft()||0;f+=e(a.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:c,top:f};this.size=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalSize=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalPosition={left:c,top:f};this.sizeDiff=
|
||||||
|
{width:d.outerWidth()-d.width(),height:d.outerHeight()-d.height()};this.originalMousePosition={left:b.pageX,top:b.pageY};this.aspectRatio=typeof a.aspectRatio=="number"?a.aspectRatio:this.originalSize.width/this.originalSize.height||1;a=e(".ui-resizable-"+this.axis).css("cursor");e("body").css("cursor",a=="auto"?this.axis+"-resize":a);d.addClass("ui-resizable-resizing");this._propagate("start",b);return true},_mouseDrag:function(b){var a=this.helper,c=this.originalMousePosition,d=this._change[this.axis];
|
||||||
|
if(!d)return false;c=d.apply(this,[b,b.pageX-c.left||0,b.pageY-c.top||0]);this._updateVirtualBoundaries(b.shiftKey);if(this._aspectRatio||b.shiftKey)c=this._updateRatio(c,b);c=this._respectSize(c,b);this._propagate("resize",b);a.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize();this._updateCache(c);this._trigger("resize",b,this.ui());return false},
|
||||||
|
_mouseStop:function(b){this.resizing=false;var a=this.options,c=this;if(this._helper){var d=this._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName);d=f&&e.ui.hasScroll(d[0],"left")?0:c.sizeDiff.height;f=f?0:c.sizeDiff.width;f={width:c.helper.width()-f,height:c.helper.height()-d};d=parseInt(c.element.css("left"),10)+(c.position.left-c.originalPosition.left)||null;var g=parseInt(c.element.css("top"),10)+(c.position.top-c.originalPosition.top)||null;a.animate||this.element.css(e.extend(f,
|
||||||
|
{top:g,left:d}));c.helper.height(c.size.height);c.helper.width(c.size.width);this._helper&&!a.animate&&this._proportionallyResize()}e("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",b);this._helper&&this.helper.remove();return false},_updateVirtualBoundaries:function(b){var a=this.options,c,d,f;a={minWidth:k(a.minWidth)?a.minWidth:0,maxWidth:k(a.maxWidth)?a.maxWidth:Infinity,minHeight:k(a.minHeight)?a.minHeight:0,maxHeight:k(a.maxHeight)?a.maxHeight:
|
||||||
|
Infinity};if(this._aspectRatio||b){b=a.minHeight*this.aspectRatio;d=a.minWidth/this.aspectRatio;c=a.maxHeight*this.aspectRatio;f=a.maxWidth/this.aspectRatio;if(b>a.minWidth)a.minWidth=b;if(d>a.minHeight)a.minHeight=d;if(c<a.maxWidth)a.maxWidth=c;if(f<a.maxHeight)a.maxHeight=f}this._vBoundaries=a},_updateCache:function(b){this.offset=this.helper.offset();if(k(b.left))this.position.left=b.left;if(k(b.top))this.position.top=b.top;if(k(b.height))this.size.height=b.height;if(k(b.width))this.size.width=
|
||||||
|
b.width},_updateRatio:function(b){var a=this.position,c=this.size,d=this.axis;if(k(b.height))b.width=b.height*this.aspectRatio;else if(k(b.width))b.height=b.width/this.aspectRatio;if(d=="sw"){b.left=a.left+(c.width-b.width);b.top=null}if(d=="nw"){b.top=a.top+(c.height-b.height);b.left=a.left+(c.width-b.width)}return b},_respectSize:function(b){var a=this._vBoundaries,c=this.axis,d=k(b.width)&&a.maxWidth&&a.maxWidth<b.width,f=k(b.height)&&a.maxHeight&&a.maxHeight<b.height,g=k(b.width)&&a.minWidth&&
|
||||||
|
a.minWidth>b.width,h=k(b.height)&&a.minHeight&&a.minHeight>b.height;if(g)b.width=a.minWidth;if(h)b.height=a.minHeight;if(d)b.width=a.maxWidth;if(f)b.height=a.maxHeight;var i=this.originalPosition.left+this.originalSize.width,j=this.position.top+this.size.height,l=/sw|nw|w/.test(c);c=/nw|ne|n/.test(c);if(g&&l)b.left=i-a.minWidth;if(d&&l)b.left=i-a.maxWidth;if(h&&c)b.top=j-a.minHeight;if(f&&c)b.top=j-a.maxHeight;if((a=!b.width&&!b.height)&&!b.left&&b.top)b.top=null;else if(a&&!b.top&&b.left)b.left=
|
||||||
|
null;return b},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var b=this.helper||this.element,a=0;a<this._proportionallyResizeElements.length;a++){var c=this._proportionallyResizeElements[a];if(!this.borderDif){var d=[c.css("borderTopWidth"),c.css("borderRightWidth"),c.css("borderBottomWidth"),c.css("borderLeftWidth")],f=[c.css("paddingTop"),c.css("paddingRight"),c.css("paddingBottom"),c.css("paddingLeft")];this.borderDif=e.map(d,function(g,h){g=parseInt(g,10)||
|
||||||
|
0;h=parseInt(f[h],10)||0;return g+h})}e.browser.msie&&(e(b).is(":hidden")||e(b).parents(":hidden").length)||c.css({height:b.height()-this.borderDif[0]-this.borderDif[2]||0,width:b.width()-this.borderDif[1]-this.borderDif[3]||0})}},_renderProxy:function(){var b=this.options;this.elementOffset=this.element.offset();if(this._helper){this.helper=this.helper||e('<div style="overflow:hidden;"></div>');var a=e.browser.msie&&e.browser.version<7,c=a?1:0;a=a?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+
|
||||||
|
a,height:this.element.outerHeight()+a,position:"absolute",left:this.elementOffset.left-c+"px",top:this.elementOffset.top-c+"px",zIndex:++b.zIndex});this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(b,a){return{width:this.originalSize.width+a}},w:function(b,a){return{left:this.originalPosition.left+a,width:this.originalSize.width-a}},n:function(b,a,c){return{top:this.originalPosition.top+c,height:this.originalSize.height-c}},s:function(b,a,c){return{height:this.originalSize.height+
|
||||||
|
c}},se:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},sw:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,a,c]))},ne:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},nw:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,a,c]))}},_propagate:function(b,a){e.ui.plugin.call(this,b,[a,this.ui()]);
|
||||||
|
b!="resize"&&this._trigger(b,a,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});e.extend(e.ui.resizable,{version:"1.8.16"});e.ui.plugin.add("resizable","alsoResize",{start:function(){var b=e(this).data("resizable").options,a=function(c){e(c).each(function(){var d=e(this);d.data("resizable-alsoresize",{width:parseInt(d.width(),
|
||||||
|
10),height:parseInt(d.height(),10),left:parseInt(d.css("left"),10),top:parseInt(d.css("top"),10),position:d.css("position")})})};if(typeof b.alsoResize=="object"&&!b.alsoResize.parentNode)if(b.alsoResize.length){b.alsoResize=b.alsoResize[0];a(b.alsoResize)}else e.each(b.alsoResize,function(c){a(c)});else a(b.alsoResize)},resize:function(b,a){var c=e(this).data("resizable");b=c.options;var d=c.originalSize,f=c.originalPosition,g={height:c.size.height-d.height||0,width:c.size.width-d.width||0,top:c.position.top-
|
||||||
|
f.top||0,left:c.position.left-f.left||0},h=function(i,j){e(i).each(function(){var l=e(this),q=e(this).data("resizable-alsoresize"),p={},r=j&&j.length?j:l.parents(a.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(r,function(n,o){if((n=(q[o]||0)+(g[o]||0))&&n>=0)p[o]=n||null});if(e.browser.opera&&/relative/.test(l.css("position"))){c._revertToRelativePosition=true;l.css({position:"absolute",top:"auto",left:"auto"})}l.css(p)})};typeof b.alsoResize=="object"&&!b.alsoResize.nodeType?
|
||||||
|
e.each(b.alsoResize,function(i,j){h(i,j)}):h(b.alsoResize)},stop:function(){var b=e(this).data("resizable"),a=b.options,c=function(d){e(d).each(function(){var f=e(this);f.css({position:f.data("resizable-alsoresize").position})})};if(b._revertToRelativePosition){b._revertToRelativePosition=false;typeof a.alsoResize=="object"&&!a.alsoResize.nodeType?e.each(a.alsoResize,function(d){c(d)}):c(a.alsoResize)}e(this).removeData("resizable-alsoresize")}});e.ui.plugin.add("resizable","animate",{stop:function(b){var a=
|
||||||
|
e(this).data("resizable"),c=a.options,d=a._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName),g=f&&e.ui.hasScroll(d[0],"left")?0:a.sizeDiff.height;f={width:a.size.width-(f?0:a.sizeDiff.width),height:a.size.height-g};g=parseInt(a.element.css("left"),10)+(a.position.left-a.originalPosition.left)||null;var h=parseInt(a.element.css("top"),10)+(a.position.top-a.originalPosition.top)||null;a.element.animate(e.extend(f,h&&g?{top:h,left:g}:{}),{duration:c.animateDuration,easing:c.animateEasing,
|
||||||
|
step:function(){var i={width:parseInt(a.element.css("width"),10),height:parseInt(a.element.css("height"),10),top:parseInt(a.element.css("top"),10),left:parseInt(a.element.css("left"),10)};d&&d.length&&e(d[0]).css({width:i.width,height:i.height});a._updateCache(i);a._propagate("resize",b)}})}});e.ui.plugin.add("resizable","containment",{start:function(){var b=e(this).data("resizable"),a=b.element,c=b.options.containment;if(a=c instanceof e?c.get(0):/parent/.test(c)?a.parent().get(0):c){b.containerElement=
|
||||||
|
e(a);if(/document/.test(c)||c==document){b.containerOffset={left:0,top:0};b.containerPosition={left:0,top:0};b.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}}else{var d=e(a),f=[];e(["Top","Right","Left","Bottom"]).each(function(i,j){f[i]=m(d.css("padding"+j))});b.containerOffset=d.offset();b.containerPosition=d.position();b.containerSize={height:d.innerHeight()-f[3],width:d.innerWidth()-f[1]};c=b.containerOffset;
|
||||||
|
var g=b.containerSize.height,h=b.containerSize.width;h=e.ui.hasScroll(a,"left")?a.scrollWidth:h;g=e.ui.hasScroll(a)?a.scrollHeight:g;b.parentData={element:a,left:c.left,top:c.top,width:h,height:g}}}},resize:function(b){var a=e(this).data("resizable"),c=a.options,d=a.containerOffset,f=a.position;b=a._aspectRatio||b.shiftKey;var g={top:0,left:0},h=a.containerElement;if(h[0]!=document&&/static/.test(h.css("position")))g=d;if(f.left<(a._helper?d.left:0)){a.size.width+=a._helper?a.position.left-d.left:
|
||||||
|
a.position.left-g.left;if(b)a.size.height=a.size.width/c.aspectRatio;a.position.left=c.helper?d.left:0}if(f.top<(a._helper?d.top:0)){a.size.height+=a._helper?a.position.top-d.top:a.position.top;if(b)a.size.width=a.size.height*c.aspectRatio;a.position.top=a._helper?d.top:0}a.offset.left=a.parentData.left+a.position.left;a.offset.top=a.parentData.top+a.position.top;c=Math.abs((a._helper?a.offset.left-g.left:a.offset.left-g.left)+a.sizeDiff.width);d=Math.abs((a._helper?a.offset.top-g.top:a.offset.top-
|
||||||
|
d.top)+a.sizeDiff.height);f=a.containerElement.get(0)==a.element.parent().get(0);g=/relative|absolute/.test(a.containerElement.css("position"));if(f&&g)c-=a.parentData.left;if(c+a.size.width>=a.parentData.width){a.size.width=a.parentData.width-c;if(b)a.size.height=a.size.width/a.aspectRatio}if(d+a.size.height>=a.parentData.height){a.size.height=a.parentData.height-d;if(b)a.size.width=a.size.height*a.aspectRatio}},stop:function(){var b=e(this).data("resizable"),a=b.options,c=b.containerOffset,d=b.containerPosition,
|
||||||
|
f=b.containerElement,g=e(b.helper),h=g.offset(),i=g.outerWidth()-b.sizeDiff.width;g=g.outerHeight()-b.sizeDiff.height;b._helper&&!a.animate&&/relative/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g});b._helper&&!a.animate&&/static/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g})}});e.ui.plugin.add("resizable","ghost",{start:function(){var b=e(this).data("resizable"),a=b.options,c=b.size;b.ghost=b.originalElement.clone();b.ghost.css({opacity:0.25,
|
||||||
|
display:"block",position:"relative",height:c.height,width:c.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof a.ghost=="string"?a.ghost:"");b.ghost.appendTo(b.helper)},resize:function(){var b=e(this).data("resizable");b.ghost&&b.ghost.css({position:"relative",height:b.size.height,width:b.size.width})},stop:function(){var b=e(this).data("resizable");b.ghost&&b.helper&&b.helper.get(0).removeChild(b.ghost.get(0))}});e.ui.plugin.add("resizable","grid",{resize:function(){var b=
|
||||||
|
e(this).data("resizable"),a=b.options,c=b.size,d=b.originalSize,f=b.originalPosition,g=b.axis;a.grid=typeof a.grid=="number"?[a.grid,a.grid]:a.grid;var h=Math.round((c.width-d.width)/(a.grid[0]||1))*(a.grid[0]||1);a=Math.round((c.height-d.height)/(a.grid[1]||1))*(a.grid[1]||1);if(/^(se|s|e)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a}else if(/^(ne)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}else{if(/^(sw)$/.test(g)){b.size.width=d.width+h;b.size.height=
|
||||||
|
d.height+a}else{b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}b.position.left=f.left-h}}});var m=function(b){return parseInt(b,10)||0},k=function(b){return!isNaN(parseInt(b,10))}})(jQuery);
|
||||||
|
;/*
|
||||||
|
* jQuery UI Selectable 1.8.16
|
||||||
|
*
|
||||||
|
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Selectables
|
||||||
|
*
|
||||||
|
* Depends:
|
||||||
|
* jquery.ui.core.js
|
||||||
|
* jquery.ui.mouse.js
|
||||||
|
* jquery.ui.widget.js
|
||||||
|
*/
|
||||||
|
(function(e){e.widget("ui.selectable",e.ui.mouse,{options:{appendTo:"body",autoRefresh:true,distance:0,filter:"*",tolerance:"touch"},_create:function(){var c=this;this.element.addClass("ui-selectable");this.dragged=false;var f;this.refresh=function(){f=e(c.options.filter,c.element[0]);f.each(function(){var d=e(this),b=d.offset();e.data(this,"selectable-item",{element:this,$element:d,left:b.left,top:b.top,right:b.left+d.outerWidth(),bottom:b.top+d.outerHeight(),startselected:false,selected:d.hasClass("ui-selected"),
|
||||||
|
selecting:d.hasClass("ui-selecting"),unselecting:d.hasClass("ui-unselecting")})})};this.refresh();this.selectees=f.addClass("ui-selectee");this._mouseInit();this.helper=e("<div class='ui-selectable-helper'></div>")},destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item");this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable");this._mouseDestroy();return this},_mouseStart:function(c){var f=this;this.opos=[c.pageX,
|
||||||
|
c.pageY];if(!this.options.disabled){var d=this.options;this.selectees=e(d.filter,this.element[0]);this._trigger("start",c);e(d.appendTo).append(this.helper);this.helper.css({left:c.clientX,top:c.clientY,width:0,height:0});d.autoRefresh&&this.refresh();this.selectees.filter(".ui-selected").each(function(){var b=e.data(this,"selectable-item");b.startselected=true;if(!c.metaKey){b.$element.removeClass("ui-selected");b.selected=false;b.$element.addClass("ui-unselecting");b.unselecting=true;f._trigger("unselecting",
|
||||||
|
c,{unselecting:b.element})}});e(c.target).parents().andSelf().each(function(){var b=e.data(this,"selectable-item");if(b){var g=!c.metaKey||!b.$element.hasClass("ui-selected");b.$element.removeClass(g?"ui-unselecting":"ui-selected").addClass(g?"ui-selecting":"ui-unselecting");b.unselecting=!g;b.selecting=g;(b.selected=g)?f._trigger("selecting",c,{selecting:b.element}):f._trigger("unselecting",c,{unselecting:b.element});return false}})}},_mouseDrag:function(c){var f=this;this.dragged=true;if(!this.options.disabled){var d=
|
||||||
|
this.options,b=this.opos[0],g=this.opos[1],h=c.pageX,i=c.pageY;if(b>h){var j=h;h=b;b=j}if(g>i){j=i;i=g;g=j}this.helper.css({left:b,top:g,width:h-b,height:i-g});this.selectees.each(function(){var a=e.data(this,"selectable-item");if(!(!a||a.element==f.element[0])){var k=false;if(d.tolerance=="touch")k=!(a.left>h||a.right<b||a.top>i||a.bottom<g);else if(d.tolerance=="fit")k=a.left>b&&a.right<h&&a.top>g&&a.bottom<i;if(k){if(a.selected){a.$element.removeClass("ui-selected");a.selected=false}if(a.unselecting){a.$element.removeClass("ui-unselecting");
|
||||||
|
a.unselecting=false}if(!a.selecting){a.$element.addClass("ui-selecting");a.selecting=true;f._trigger("selecting",c,{selecting:a.element})}}else{if(a.selecting)if(c.metaKey&&a.startselected){a.$element.removeClass("ui-selecting");a.selecting=false;a.$element.addClass("ui-selected");a.selected=true}else{a.$element.removeClass("ui-selecting");a.selecting=false;if(a.startselected){a.$element.addClass("ui-unselecting");a.unselecting=true}f._trigger("unselecting",c,{unselecting:a.element})}if(a.selected)if(!c.metaKey&&
|
||||||
|
!a.startselected){a.$element.removeClass("ui-selected");a.selected=false;a.$element.addClass("ui-unselecting");a.unselecting=true;f._trigger("unselecting",c,{unselecting:a.element})}}}});return false}},_mouseStop:function(c){var f=this;this.dragged=false;e(".ui-unselecting",this.element[0]).each(function(){var d=e.data(this,"selectable-item");d.$element.removeClass("ui-unselecting");d.unselecting=false;d.startselected=false;f._trigger("unselected",c,{unselected:d.element})});e(".ui-selecting",this.element[0]).each(function(){var d=
|
||||||
|
e.data(this,"selectable-item");d.$element.removeClass("ui-selecting").addClass("ui-selected");d.selecting=false;d.selected=true;d.startselected=true;f._trigger("selected",c,{selected:d.element})});this._trigger("stop",c);this.helper.remove();return false}});e.extend(e.ui.selectable,{version:"1.8.16"})})(jQuery);
|
||||||
|
;/*
|
||||||
|
* jQuery UI Sortable 1.8.16
|
||||||
|
*
|
||||||
|
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Sortables
|
||||||
|
*
|
||||||
|
* Depends:
|
||||||
|
* jquery.ui.core.js
|
||||||
|
* jquery.ui.mouse.js
|
||||||
|
* jquery.ui.widget.js
|
||||||
|
*/
|
||||||
|
(function(d){d.widget("ui.sortable",d.ui.mouse,{widgetEventPrefix:"sort",options:{appendTo:"parent",axis:false,connectWith:false,containment:false,cursor:"auto",cursorAt:false,dropOnEmpty:true,forcePlaceholderSize:false,forceHelperSize:false,grid:false,handle:false,helper:"original",items:"> *",opacity:false,placeholder:false,revert:false,scroll:true,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1E3},_create:function(){var a=this.options;this.containerCache={};this.element.addClass("ui-sortable");
|
||||||
|
this.refresh();this.floating=this.items.length?a.axis==="x"||/left|right/.test(this.items[0].item.css("float"))||/inline|table-cell/.test(this.items[0].item.css("display")):false;this.offset=this.element.offset();this._mouseInit()},destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").removeData("sortable").unbind(".sortable");this._mouseDestroy();for(var a=this.items.length-1;a>=0;a--)this.items[a].item.removeData("sortable-item");return this},_setOption:function(a,b){if(a===
|
||||||
|
"disabled"){this.options[a]=b;this.widget()[b?"addClass":"removeClass"]("ui-sortable-disabled")}else d.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(a,b){if(this.reverting)return false;if(this.options.disabled||this.options.type=="static")return false;this._refreshItems(a);var c=null,e=this;d(a.target).parents().each(function(){if(d.data(this,"sortable-item")==e){c=d(this);return false}});if(d.data(a.target,"sortable-item")==e)c=d(a.target);if(!c)return false;if(this.options.handle&&
|
||||||
|
!b){var f=false;d(this.options.handle,c).find("*").andSelf().each(function(){if(this==a.target)f=true});if(!f)return false}this.currentItem=c;this._removeCurrentsFromItems();return true},_mouseStart:function(a,b,c){b=this.options;var e=this;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(a);this._cacheHelperProportions();this._cacheMargins();this.scrollParent=this.helper.scrollParent();this.offset=this.currentItem.offset();this.offset={top:this.offset.top-this.margins.top,
|
||||||
|
left:this.offset.left-this.margins.left};this.helper.css("position","absolute");this.cssPosition=this.helper.css("position");d.extend(this.offset,{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]};
|
||||||
|
this.helper[0]!=this.currentItem[0]&&this.currentItem.hide();this._createPlaceholder();b.containment&&this._setContainment();if(b.cursor){if(d("body").css("cursor"))this._storedCursor=d("body").css("cursor");d("body").css("cursor",b.cursor)}if(b.opacity){if(this.helper.css("opacity"))this._storedOpacity=this.helper.css("opacity");this.helper.css("opacity",b.opacity)}if(b.zIndex){if(this.helper.css("zIndex"))this._storedZIndex=this.helper.css("zIndex");this.helper.css("zIndex",b.zIndex)}if(this.scrollParent[0]!=
|
||||||
|
document&&this.scrollParent[0].tagName!="HTML")this.overflowOffset=this.scrollParent.offset();this._trigger("start",a,this._uiHash());this._preserveHelperProportions||this._cacheHelperProportions();if(!c)for(c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("activate",a,e._uiHash(this));if(d.ui.ddmanager)d.ui.ddmanager.current=this;d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.dragging=true;this.helper.addClass("ui-sortable-helper");this._mouseDrag(a);
|
||||||
|
return true},_mouseDrag:function(a){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");if(!this.lastPositionAbs)this.lastPositionAbs=this.positionAbs;if(this.options.scroll){var b=this.options,c=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if(this.overflowOffset.top+this.scrollParent[0].offsetHeight-a.pageY<b.scrollSensitivity)this.scrollParent[0].scrollTop=c=this.scrollParent[0].scrollTop+b.scrollSpeed;else if(a.pageY-this.overflowOffset.top<
|
||||||
|
b.scrollSensitivity)this.scrollParent[0].scrollTop=c=this.scrollParent[0].scrollTop-b.scrollSpeed;if(this.overflowOffset.left+this.scrollParent[0].offsetWidth-a.pageX<b.scrollSensitivity)this.scrollParent[0].scrollLeft=c=this.scrollParent[0].scrollLeft+b.scrollSpeed;else if(a.pageX-this.overflowOffset.left<b.scrollSensitivity)this.scrollParent[0].scrollLeft=c=this.scrollParent[0].scrollLeft-b.scrollSpeed}else{if(a.pageY-d(document).scrollTop()<b.scrollSensitivity)c=d(document).scrollTop(d(document).scrollTop()-
|
||||||
|
b.scrollSpeed);else if(d(window).height()-(a.pageY-d(document).scrollTop())<b.scrollSensitivity)c=d(document).scrollTop(d(document).scrollTop()+b.scrollSpeed);if(a.pageX-d(document).scrollLeft()<b.scrollSensitivity)c=d(document).scrollLeft(d(document).scrollLeft()-b.scrollSpeed);else if(d(window).width()-(a.pageX-d(document).scrollLeft())<b.scrollSensitivity)c=d(document).scrollLeft(d(document).scrollLeft()+b.scrollSpeed)}c!==false&&d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,
|
||||||
|
a)}this.positionAbs=this._convertPositionTo("absolute");if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";for(b=this.items.length-1;b>=0;b--){c=this.items[b];var e=c.item[0],f=this._intersectsWithPointer(c);if(f)if(e!=this.currentItem[0]&&this.placeholder[f==1?"next":"prev"]()[0]!=e&&!d.ui.contains(this.placeholder[0],e)&&(this.options.type=="semi-dynamic"?!d.ui.contains(this.element[0],
|
||||||
|
e):true)){this.direction=f==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(c))this._rearrange(a,c);else break;this._trigger("change",a,this._uiHash());break}}this._contactContainers(a);d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);this._trigger("sort",a,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(a,b){if(a){d.ui.ddmanager&&!this.options.dropBehaviour&&d.ui.ddmanager.drop(this,a);if(this.options.revert){var c=this;b=c.placeholder.offset();
|
||||||
|
c.reverting=true;d(this.helper).animate({left:b.left-this.offset.parent.left-c.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:b.top-this.offset.parent.top-c.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){c._clear(a)})}else this._clear(a,b);return false}},cancel:function(){var a=this;if(this.dragging){this._mouseUp({target:null});this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):
|
||||||
|
this.currentItem.show();for(var b=this.containers.length-1;b>=0;b--){this.containers[b]._trigger("deactivate",null,a._uiHash(this));if(this.containers[b].containerCache.over){this.containers[b]._trigger("out",null,a._uiHash(this));this.containers[b].containerCache.over=0}}}if(this.placeholder){this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove();d.extend(this,{helper:null,
|
||||||
|
dragging:false,reverting:false,_noFinalSort:null});this.domPosition.prev?d(this.domPosition.prev).after(this.currentItem):d(this.domPosition.parent).prepend(this.currentItem)}return this},serialize:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};d(b).each(function(){var e=(d(a.item||this).attr(a.attribute||"id")||"").match(a.expression||/(.+)[-=_](.+)/);if(e)c.push((a.key||e[1]+"[]")+"="+(a.key&&a.expression?e[1]:e[2]))});!c.length&&a.key&&c.push(a.key+"=");return c.join("&")},
|
||||||
|
toArray:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};b.each(function(){c.push(d(a.item||this).attr(a.attribute||"id")||"")});return c},_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,e=this.positionAbs.top,f=e+this.helperProportions.height,g=a.left,h=g+a.width,i=a.top,k=i+a.height,j=this.offset.click.top,l=this.offset.click.left;j=e+j>i&&e+j<k&&b+l>g&&b+l<h;return this.options.tolerance=="pointer"||this.options.forcePointerForContainers||
|
||||||
|
this.options.tolerance!="pointer"&&this.helperProportions[this.floating?"width":"height"]>a[this.floating?"width":"height"]?j:g<b+this.helperProportions.width/2&&c-this.helperProportions.width/2<h&&i<e+this.helperProportions.height/2&&f-this.helperProportions.height/2<k},_intersectsWithPointer:function(a){var b=d.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,a.top,a.height);a=d.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,a.left,a.width);b=b&&a;a=this._getDragVerticalDirection();
|
||||||
|
var c=this._getDragHorizontalDirection();if(!b)return false;return this.floating?c&&c=="right"||a=="down"?2:1:a&&(a=="down"?2:1)},_intersectsWithSides:function(a){var b=d.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,a.top+a.height/2,a.height);a=d.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,a.left+a.width/2,a.width);var c=this._getDragVerticalDirection(),e=this._getDragHorizontalDirection();return this.floating&&e?e=="right"&&a||e=="left"&&!a:c&&(c=="down"&&b||c=="up"&&!b)},
|
||||||
|
_getDragVerticalDirection:function(){var a=this.positionAbs.top-this.lastPositionAbs.top;return a!=0&&(a>0?"down":"up")},_getDragHorizontalDirection:function(){var a=this.positionAbs.left-this.lastPositionAbs.left;return a!=0&&(a>0?"right":"left")},refresh:function(a){this._refreshItems(a);this.refreshPositions();return this},_connectWith:function(){var a=this.options;return a.connectWith.constructor==String?[a.connectWith]:a.connectWith},_getItemsAsjQuery:function(a){var b=[],c=[],e=this._connectWith();
|
||||||
|
if(e&&a)for(a=e.length-1;a>=0;a--)for(var f=d(e[a]),g=f.length-1;g>=0;g--){var h=d.data(f[g],"sortable");if(h&&h!=this&&!h.options.disabled)c.push([d.isFunction(h.options.items)?h.options.items.call(h.element):d(h.options.items,h.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),h])}c.push([d.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):d(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),
|
||||||
|
this]);for(a=c.length-1;a>=0;a--)c[a][0].each(function(){b.push(this)});return d(b)},_removeCurrentsFromItems:function(){for(var a=this.currentItem.find(":data(sortable-item)"),b=0;b<this.items.length;b++)for(var c=0;c<a.length;c++)a[c]==this.items[b].item[0]&&this.items.splice(b,1)},_refreshItems:function(a){this.items=[];this.containers=[this];var b=this.items,c=[[d.isFunction(this.options.items)?this.options.items.call(this.element[0],a,{item:this.currentItem}):d(this.options.items,this.element),
|
||||||
|
this]],e=this._connectWith();if(e)for(var f=e.length-1;f>=0;f--)for(var g=d(e[f]),h=g.length-1;h>=0;h--){var i=d.data(g[h],"sortable");if(i&&i!=this&&!i.options.disabled){c.push([d.isFunction(i.options.items)?i.options.items.call(i.element[0],a,{item:this.currentItem}):d(i.options.items,i.element),i]);this.containers.push(i)}}for(f=c.length-1;f>=0;f--){a=c[f][1];e=c[f][0];h=0;for(g=e.length;h<g;h++){i=d(e[h]);i.data("sortable-item",a);b.push({item:i,instance:a,width:0,height:0,left:0,top:0})}}},refreshPositions:function(a){if(this.offsetParent&&
|
||||||
|
this.helper)this.offset.parent=this._getParentOffset();for(var b=this.items.length-1;b>=0;b--){var c=this.items[b];if(!(c.instance!=this.currentContainer&&this.currentContainer&&c.item[0]!=this.currentItem[0])){var e=this.options.toleranceElement?d(this.options.toleranceElement,c.item):c.item;if(!a){c.width=e.outerWidth();c.height=e.outerHeight()}e=e.offset();c.left=e.left;c.top=e.top}}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(b=
|
||||||
|
this.containers.length-1;b>=0;b--){e=this.containers[b].element.offset();this.containers[b].containerCache.left=e.left;this.containers[b].containerCache.top=e.top;this.containers[b].containerCache.width=this.containers[b].element.outerWidth();this.containers[b].containerCache.height=this.containers[b].element.outerHeight()}return this},_createPlaceholder:function(a){var b=a||this,c=b.options;if(!c.placeholder||c.placeholder.constructor==String){var e=c.placeholder;c.placeholder={element:function(){var f=
|
||||||
|
d(document.createElement(b.currentItem[0].nodeName)).addClass(e||b.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];if(!e)f.style.visibility="hidden";return f},update:function(f,g){if(!(e&&!c.forcePlaceholderSize)){g.height()||g.height(b.currentItem.innerHeight()-parseInt(b.currentItem.css("paddingTop")||0,10)-parseInt(b.currentItem.css("paddingBottom")||0,10));g.width()||g.width(b.currentItem.innerWidth()-parseInt(b.currentItem.css("paddingLeft")||0,10)-parseInt(b.currentItem.css("paddingRight")||
|
||||||
|
0,10))}}}}b.placeholder=d(c.placeholder.element.call(b.element,b.currentItem));b.currentItem.after(b.placeholder);c.placeholder.update(b,b.placeholder)},_contactContainers:function(a){for(var b=null,c=null,e=this.containers.length-1;e>=0;e--)if(!d.ui.contains(this.currentItem[0],this.containers[e].element[0]))if(this._intersectsWith(this.containers[e].containerCache)){if(!(b&&d.ui.contains(this.containers[e].element[0],b.element[0]))){b=this.containers[e];c=e}}else if(this.containers[e].containerCache.over){this.containers[e]._trigger("out",
|
||||||
|
a,this._uiHash(this));this.containers[e].containerCache.over=0}if(b)if(this.containers.length===1){this.containers[c]._trigger("over",a,this._uiHash(this));this.containers[c].containerCache.over=1}else if(this.currentContainer!=this.containers[c]){b=1E4;e=null;for(var f=this.positionAbs[this.containers[c].floating?"left":"top"],g=this.items.length-1;g>=0;g--)if(d.ui.contains(this.containers[c].element[0],this.items[g].item[0])){var h=this.items[g][this.containers[c].floating?"left":"top"];if(Math.abs(h-
|
||||||
|
f)<b){b=Math.abs(h-f);e=this.items[g]}}if(e||this.options.dropOnEmpty){this.currentContainer=this.containers[c];e?this._rearrange(a,e,null,true):this._rearrange(a,null,this.containers[c].element,true);this._trigger("change",a,this._uiHash());this.containers[c]._trigger("change",a,this._uiHash(this));this.options.placeholder.update(this.currentContainer,this.placeholder);this.containers[c]._trigger("over",a,this._uiHash(this));this.containers[c].containerCache.over=1}}},_createHelper:function(a){var b=
|
||||||
|
this.options;a=d.isFunction(b.helper)?d(b.helper.apply(this.element[0],[a,this.currentItem])):b.helper=="clone"?this.currentItem.clone():this.currentItem;a.parents("body").length||d(b.appendTo!="parent"?b.appendTo:this.currentItem[0].parentNode)[0].appendChild(a[0]);if(a[0]==this.currentItem[0])this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")};if(a[0].style.width==
|
||||||
|
""||b.forceHelperSize)a.width(this.currentItem.width());if(a[0].style.height==""||b.forceHelperSize)a.height(this.currentItem.height());return a},_adjustOffsetFromHelper:function(a){if(typeof a=="string")a=a.split(" ");if(d.isArray(a))a={left:+a[0],top:+a[1]||0};if("left"in a)this.offset.click.left=a.left+this.margins.left;if("right"in a)this.offset.click.left=this.helperProportions.width-a.right+this.margins.left;if("top"in a)this.offset.click.top=a.top+this.margins.top;if("bottom"in a)this.offset.click.top=
|
||||||
|
this.helperProportions.height-a.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var a=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0])){a.left+=this.scrollParent.scrollLeft();a.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&d.browser.msie)a=
|
||||||
|
{top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.currentItem.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),
|
||||||
|
10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var a=this.options;if(a.containment=="parent")a.containment=this.helper[0].parentNode;if(a.containment=="document"||a.containment=="window")this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,d(a.containment=="document"?
|
||||||
|
document:window).width()-this.helperProportions.width-this.margins.left,(d(a.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)){var b=d(a.containment)[0];a=d(a.containment).offset();var c=d(b).css("overflow")!="hidden";this.containment=[a.left+(parseInt(d(b).css("borderLeftWidth"),10)||0)+(parseInt(d(b).css("paddingLeft"),10)||0)-this.margins.left,a.top+(parseInt(d(b).css("borderTopWidth"),
|
||||||
|
10)||0)+(parseInt(d(b).css("paddingTop"),10)||0)-this.margins.top,a.left+(c?Math.max(b.scrollWidth,b.offsetWidth):b.offsetWidth)-(parseInt(d(b).css("borderLeftWidth"),10)||0)-(parseInt(d(b).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,a.top+(c?Math.max(b.scrollHeight,b.offsetHeight):b.offsetHeight)-(parseInt(d(b).css("borderTopWidth"),10)||0)-(parseInt(d(b).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}},_convertPositionTo:function(a,b){if(!b)b=
|
||||||
|
this.position;a=a=="absolute"?1:-1;var c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(c[0].tagName);return{top:b.top+this.offset.relative.top*a+this.offset.parent.top*a-(d.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():e?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent.left*a-(d.browser.safari&&
|
||||||
|
this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():e?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b=this.options,c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(c[0].tagName);if(this.cssPosition=="relative"&&!(this.scrollParent[0]!=document&&this.scrollParent[0]!=this.offsetParent[0]))this.offset.relative=this._getRelativeOffset();
|
||||||
|
var f=a.pageX,g=a.pageY;if(this.originalPosition){if(this.containment){if(a.pageX-this.offset.click.left<this.containment[0])f=this.containment[0]+this.offset.click.left;if(a.pageY-this.offset.click.top<this.containment[1])g=this.containment[1]+this.offset.click.top;if(a.pageX-this.offset.click.left>this.containment[2])f=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g-
|
||||||
|
this.originalPageY)/b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.top<this.containment[1]||g-this.offset.click.top>this.containment[3])?g:!(g-this.offset.click.top<this.containment[1])?g-b.grid[1]:g+b.grid[1]:g;f=this.originalPageX+Math.round((f-this.originalPageX)/b.grid[0])*b.grid[0];f=this.containment?!(f-this.offset.click.left<this.containment[0]||f-this.offset.click.left>this.containment[2])?f:!(f-this.offset.click.left<this.containment[0])?f-b.grid[0]:f+b.grid[0]:f}}return{top:g-
|
||||||
|
this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(d.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():e?0:c.scrollTop()),left:f-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(d.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():e?0:c.scrollLeft())}},_rearrange:function(a,b,c,e){c?c[0].appendChild(this.placeholder[0]):b.item[0].parentNode.insertBefore(this.placeholder[0],
|
||||||
|
this.direction=="down"?b.item[0]:b.item[0].nextSibling);this.counter=this.counter?++this.counter:1;var f=this,g=this.counter;window.setTimeout(function(){g==f.counter&&f.refreshPositions(!e)},0)},_clear:function(a,b){this.reverting=false;var c=[];!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem);this._noFinalSort=null;if(this.helper[0]==this.currentItem[0]){for(var e in this._storedCSS)if(this._storedCSS[e]=="auto"||this._storedCSS[e]=="static")this._storedCSS[e]=
|
||||||
|
"";this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();this.fromOutside&&!b&&c.push(function(f){this._trigger("receive",f,this._uiHash(this.fromOutside))});if((this.fromOutside||this.domPosition.prev!=this.currentItem.prev().not(".ui-sortable-helper")[0]||this.domPosition.parent!=this.currentItem.parent()[0])&&!b)c.push(function(f){this._trigger("update",f,this._uiHash())});if(!d.ui.contains(this.element[0],this.currentItem[0])){b||c.push(function(f){this._trigger("remove",
|
||||||
|
f,this._uiHash())});for(e=this.containers.length-1;e>=0;e--)if(d.ui.contains(this.containers[e].element[0],this.currentItem[0])&&!b){c.push(function(f){return function(g){f._trigger("receive",g,this._uiHash(this))}}.call(this,this.containers[e]));c.push(function(f){return function(g){f._trigger("update",g,this._uiHash(this))}}.call(this,this.containers[e]))}}for(e=this.containers.length-1;e>=0;e--){b||c.push(function(f){return function(g){f._trigger("deactivate",g,this._uiHash(this))}}.call(this,
|
||||||
|
this.containers[e]));if(this.containers[e].containerCache.over){c.push(function(f){return function(g){f._trigger("out",g,this._uiHash(this))}}.call(this,this.containers[e]));this.containers[e].containerCache.over=0}}this._storedCursor&&d("body").css("cursor",this._storedCursor);this._storedOpacity&&this.helper.css("opacity",this._storedOpacity);if(this._storedZIndex)this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex);this.dragging=false;if(this.cancelHelperRemoval){if(!b){this._trigger("beforeStop",
|
||||||
|
a,this._uiHash());for(e=0;e<c.length;e++)c[e].call(this,a);this._trigger("stop",a,this._uiHash())}return false}b||this._trigger("beforeStop",a,this._uiHash());this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.helper[0]!=this.currentItem[0]&&this.helper.remove();this.helper=null;if(!b){for(e=0;e<c.length;e++)c[e].call(this,a);this._trigger("stop",a,this._uiHash())}this.fromOutside=false;return true},_trigger:function(){d.Widget.prototype._trigger.apply(this,arguments)===false&&this.cancel()},
|
||||||
|
_uiHash:function(a){var b=a||this;return{helper:b.helper,placeholder:b.placeholder||d([]),position:b.position,originalPosition:b.originalPosition,offset:b.positionAbs,item:b.currentItem,sender:a?a.element:null}}});d.extend(d.ui.sortable,{version:"1.8.16"})})(jQuery);
|
||||||
|
;/*
|
||||||
|
* jQuery UI Slider 1.8.16
|
||||||
|
*
|
||||||
|
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Slider
|
||||||
|
*
|
||||||
|
* Depends:
|
||||||
|
* jquery.ui.core.js
|
||||||
|
* jquery.ui.mouse.js
|
||||||
|
* jquery.ui.widget.js
|
||||||
|
*/
|
||||||
|
(function(d){d.widget("ui.slider",d.ui.mouse,{widgetEventPrefix:"slide",options:{animate:false,distance:0,max:100,min:0,orientation:"horizontal",range:false,step:1,value:0,values:null},_create:function(){var a=this,b=this.options,c=this.element.find(".ui-slider-handle").addClass("ui-state-default ui-corner-all"),f=b.values&&b.values.length||1,e=[];this._mouseSliding=this._keySliding=false;this._animateOff=true;this._handleIndex=null;this._detectOrientation();this._mouseInit();this.element.addClass("ui-slider ui-slider-"+
|
||||||
|
this.orientation+" ui-widget ui-widget-content ui-corner-all"+(b.disabled?" ui-slider-disabled ui-disabled":""));this.range=d([]);if(b.range){if(b.range===true){if(!b.values)b.values=[this._valueMin(),this._valueMin()];if(b.values.length&&b.values.length!==2)b.values=[b.values[0],b.values[0]]}this.range=d("<div></div>").appendTo(this.element).addClass("ui-slider-range ui-widget-header"+(b.range==="min"||b.range==="max"?" ui-slider-range-"+b.range:""))}for(var j=c.length;j<f;j+=1)e.push("<a class='ui-slider-handle ui-state-default ui-corner-all' href='#'></a>");
|
||||||
|
this.handles=c.add(d(e.join("")).appendTo(a.element));this.handle=this.handles.eq(0);this.handles.add(this.range).filter("a").click(function(g){g.preventDefault()}).hover(function(){b.disabled||d(this).addClass("ui-state-hover")},function(){d(this).removeClass("ui-state-hover")}).focus(function(){if(b.disabled)d(this).blur();else{d(".ui-slider .ui-state-focus").removeClass("ui-state-focus");d(this).addClass("ui-state-focus")}}).blur(function(){d(this).removeClass("ui-state-focus")});this.handles.each(function(g){d(this).data("index.ui-slider-handle",
|
||||||
|
g)});this.handles.keydown(function(g){var k=true,l=d(this).data("index.ui-slider-handle"),i,h,m;if(!a.options.disabled){switch(g.keyCode){case d.ui.keyCode.HOME:case d.ui.keyCode.END:case d.ui.keyCode.PAGE_UP:case d.ui.keyCode.PAGE_DOWN:case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:k=false;if(!a._keySliding){a._keySliding=true;d(this).addClass("ui-state-active");i=a._start(g,l);if(i===false)return}break}m=a.options.step;i=a.options.values&&a.options.values.length?
|
||||||
|
(h=a.values(l)):(h=a.value());switch(g.keyCode){case d.ui.keyCode.HOME:h=a._valueMin();break;case d.ui.keyCode.END:h=a._valueMax();break;case d.ui.keyCode.PAGE_UP:h=a._trimAlignValue(i+(a._valueMax()-a._valueMin())/5);break;case d.ui.keyCode.PAGE_DOWN:h=a._trimAlignValue(i-(a._valueMax()-a._valueMin())/5);break;case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:if(i===a._valueMax())return;h=a._trimAlignValue(i+m);break;case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:if(i===a._valueMin())return;h=a._trimAlignValue(i-
|
||||||
|
m);break}a._slide(g,l,h);return k}}).keyup(function(g){var k=d(this).data("index.ui-slider-handle");if(a._keySliding){a._keySliding=false;a._stop(g,k);a._change(g,k);d(this).removeClass("ui-state-active")}});this._refreshValue();this._animateOff=false},destroy:function(){this.handles.remove();this.range.remove();this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider");this._mouseDestroy();
|
||||||
|
return this},_mouseCapture:function(a){var b=this.options,c,f,e,j,g;if(b.disabled)return false;this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();c=this._normValueFromMouse({x:a.pageX,y:a.pageY});f=this._valueMax()-this._valueMin()+1;j=this;this.handles.each(function(k){var l=Math.abs(c-j.values(k));if(f>l){f=l;e=d(this);g=k}});if(b.range===true&&this.values(1)===b.min){g+=1;e=d(this.handles[g])}if(this._start(a,g)===false)return false;
|
||||||
|
this._mouseSliding=true;j._handleIndex=g;e.addClass("ui-state-active").focus();b=e.offset();this._clickOffset=!d(a.target).parents().andSelf().is(".ui-slider-handle")?{left:0,top:0}:{left:a.pageX-b.left-e.width()/2,top:a.pageY-b.top-e.height()/2-(parseInt(e.css("borderTopWidth"),10)||0)-(parseInt(e.css("borderBottomWidth"),10)||0)+(parseInt(e.css("marginTop"),10)||0)};this.handles.hasClass("ui-state-hover")||this._slide(a,g,c);return this._animateOff=true},_mouseStart:function(){return true},_mouseDrag:function(a){var b=
|
||||||
|
this._normValueFromMouse({x:a.pageX,y:a.pageY});this._slide(a,this._handleIndex,b);return false},_mouseStop:function(a){this.handles.removeClass("ui-state-active");this._mouseSliding=false;this._stop(a,this._handleIndex);this._change(a,this._handleIndex);this._clickOffset=this._handleIndex=null;return this._animateOff=false},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(a){var b;if(this.orientation==="horizontal"){b=
|
||||||
|
this.elementSize.width;a=a.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{b=this.elementSize.height;a=a.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}b=a/b;if(b>1)b=1;if(b<0)b=0;if(this.orientation==="vertical")b=1-b;a=this._valueMax()-this._valueMin();return this._trimAlignValue(this._valueMin()+b*a)},_start:function(a,b){var c={handle:this.handles[b],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(b);
|
||||||
|
c.values=this.values()}return this._trigger("start",a,c)},_slide:function(a,b,c){var f;if(this.options.values&&this.options.values.length){f=this.values(b?0:1);if(this.options.values.length===2&&this.options.range===true&&(b===0&&c>f||b===1&&c<f))c=f;if(c!==this.values(b)){f=this.values();f[b]=c;a=this._trigger("slide",a,{handle:this.handles[b],value:c,values:f});this.values(b?0:1);a!==false&&this.values(b,c,true)}}else if(c!==this.value()){a=this._trigger("slide",a,{handle:this.handles[b],value:c});
|
||||||
|
a!==false&&this.value(c)}},_stop:function(a,b){var c={handle:this.handles[b],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(b);c.values=this.values()}this._trigger("stop",a,c)},_change:function(a,b){if(!this._keySliding&&!this._mouseSliding){var c={handle:this.handles[b],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(b);c.values=this.values()}this._trigger("change",a,c)}},value:function(a){if(arguments.length){this.options.value=
|
||||||
|
this._trimAlignValue(a);this._refreshValue();this._change(null,0)}else return this._value()},values:function(a,b){var c,f,e;if(arguments.length>1){this.options.values[a]=this._trimAlignValue(b);this._refreshValue();this._change(null,a)}else if(arguments.length)if(d.isArray(arguments[0])){c=this.options.values;f=arguments[0];for(e=0;e<c.length;e+=1){c[e]=this._trimAlignValue(f[e]);this._change(null,e)}this._refreshValue()}else return this.options.values&&this.options.values.length?this._values(a):
|
||||||
|
this.value();else return this._values()},_setOption:function(a,b){var c,f=0;if(d.isArray(this.options.values))f=this.options.values.length;d.Widget.prototype._setOption.apply(this,arguments);switch(a){case "disabled":if(b){this.handles.filter(".ui-state-focus").blur();this.handles.removeClass("ui-state-hover");this.handles.propAttr("disabled",true);this.element.addClass("ui-disabled")}else{this.handles.propAttr("disabled",false);this.element.removeClass("ui-disabled")}break;case "orientation":this._detectOrientation();
|
||||||
|
this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation);this._refreshValue();break;case "value":this._animateOff=true;this._refreshValue();this._change(null,0);this._animateOff=false;break;case "values":this._animateOff=true;this._refreshValue();for(c=0;c<f;c+=1)this._change(null,c);this._animateOff=false;break}},_value:function(){var a=this.options.value;return a=this._trimAlignValue(a)},_values:function(a){var b,c;if(arguments.length){b=this.options.values[a];
|
||||||
|
return b=this._trimAlignValue(b)}else{b=this.options.values.slice();for(c=0;c<b.length;c+=1)b[c]=this._trimAlignValue(b[c]);return b}},_trimAlignValue:function(a){if(a<=this._valueMin())return this._valueMin();if(a>=this._valueMax())return this._valueMax();var b=this.options.step>0?this.options.step:1,c=(a-this._valueMin())%b;a=a-c;if(Math.abs(c)*2>=b)a+=c>0?b:-b;return parseFloat(a.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var a=
|
||||||
|
this.options.range,b=this.options,c=this,f=!this._animateOff?b.animate:false,e,j={},g,k,l,i;if(this.options.values&&this.options.values.length)this.handles.each(function(h){e=(c.values(h)-c._valueMin())/(c._valueMax()-c._valueMin())*100;j[c.orientation==="horizontal"?"left":"bottom"]=e+"%";d(this).stop(1,1)[f?"animate":"css"](j,b.animate);if(c.options.range===true)if(c.orientation==="horizontal"){if(h===0)c.range.stop(1,1)[f?"animate":"css"]({left:e+"%"},b.animate);if(h===1)c.range[f?"animate":"css"]({width:e-
|
||||||
|
g+"%"},{queue:false,duration:b.animate})}else{if(h===0)c.range.stop(1,1)[f?"animate":"css"]({bottom:e+"%"},b.animate);if(h===1)c.range[f?"animate":"css"]({height:e-g+"%"},{queue:false,duration:b.animate})}g=e});else{k=this.value();l=this._valueMin();i=this._valueMax();e=i!==l?(k-l)/(i-l)*100:0;j[c.orientation==="horizontal"?"left":"bottom"]=e+"%";this.handle.stop(1,1)[f?"animate":"css"](j,b.animate);if(a==="min"&&this.orientation==="horizontal")this.range.stop(1,1)[f?"animate":"css"]({width:e+"%"},
|
||||||
|
b.animate);if(a==="max"&&this.orientation==="horizontal")this.range[f?"animate":"css"]({width:100-e+"%"},{queue:false,duration:b.animate});if(a==="min"&&this.orientation==="vertical")this.range.stop(1,1)[f?"animate":"css"]({height:e+"%"},b.animate);if(a==="max"&&this.orientation==="vertical")this.range[f?"animate":"css"]({height:100-e+"%"},{queue:false,duration:b.animate})}}});d.extend(d.ui.slider,{version:"1.8.16"})})(jQuery);
|
||||||
|
;/*
|
||||||
|
* jQuery UI Datepicker 1.8.16
|
||||||
|
*
|
||||||
|
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Datepicker
|
||||||
|
*
|
||||||
|
* Depends:
|
||||||
|
* jquery.ui.core.js
|
||||||
|
*/
|
||||||
|
(function(d,C){function M(){this.debug=false;this._curInst=null;this._keyEvent=false;this._disabledInputs=[];this._inDialog=this._datepickerShowing=false;this._mainDivId="ui-datepicker-div";this._inlineClass="ui-datepicker-inline";this._appendClass="ui-datepicker-append";this._triggerClass="ui-datepicker-trigger";this._dialogClass="ui-datepicker-dialog";this._disableClass="ui-datepicker-disabled";this._unselectableClass="ui-datepicker-unselectable";this._currentClass="ui-datepicker-current-day";this._dayOverClass=
|
||||||
|
"ui-datepicker-days-cell-over";this.regional=[];this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su",
|
||||||
|
"Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:false,showMonthAfterYear:false,yearSuffix:""};this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:false,hideIfNoPrevNext:false,navigationAsDateFormat:false,gotoCurrent:false,changeMonth:false,changeYear:false,yearRange:"c-10:c+10",showOtherMonths:false,selectOtherMonths:false,showWeek:false,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",
|
||||||
|
minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:true,showButtonPanel:false,autoSize:false,disabled:false};d.extend(this._defaults,this.regional[""]);this.dpDiv=N(d('<div id="'+this._mainDivId+'" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'))}function N(a){return a.bind("mouseout",
|
||||||
|
function(b){b=d(b.target).closest("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a");b.length&&b.removeClass("ui-state-hover ui-datepicker-prev-hover ui-datepicker-next-hover")}).bind("mouseover",function(b){b=d(b.target).closest("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a");if(!(d.datepicker._isDisabledDatepicker(J.inline?a.parent()[0]:J.input[0])||!b.length)){b.parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");
|
||||||
|
b.addClass("ui-state-hover");b.hasClass("ui-datepicker-prev")&&b.addClass("ui-datepicker-prev-hover");b.hasClass("ui-datepicker-next")&&b.addClass("ui-datepicker-next-hover")}})}function H(a,b){d.extend(a,b);for(var c in b)if(b[c]==null||b[c]==C)a[c]=b[c];return a}d.extend(d.ui,{datepicker:{version:"1.8.16"}});var B=(new Date).getTime(),J;d.extend(M.prototype,{markerClassName:"hasDatepicker",maxRows:4,log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},
|
||||||
|
setDefaults:function(a){H(this._defaults,a||{});return this},_attachDatepicker:function(a,b){var c=null;for(var e in this._defaults){var f=a.getAttribute("date:"+e);if(f){c=c||{};try{c[e]=eval(f)}catch(h){c[e]=f}}}e=a.nodeName.toLowerCase();f=e=="div"||e=="span";if(!a.id){this.uuid+=1;a.id="dp"+this.uuid}var i=this._newInst(d(a),f);i.settings=d.extend({},b||{},c||{});if(e=="input")this._connectDatepicker(a,i);else f&&this._inlineDatepicker(a,i)},_newInst:function(a,b){return{id:a[0].id.replace(/([^A-Za-z0-9_-])/g,
|
||||||
|
"\\\\$1"),input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:!b?this.dpDiv:N(d('<div class="'+this._inlineClass+' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'))}},_connectDatepicker:function(a,b){var c=d(a);b.append=d([]);b.trigger=d([]);if(!c.hasClass(this.markerClassName)){this._attachments(c,b);c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",
|
||||||
|
function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});this._autoSize(b);d.data(a,"datepicker",b);b.settings.disabled&&this._disableDatepicker(a)}},_attachments:function(a,b){var c=this._get(b,"appendText"),e=this._get(b,"isRTL");b.append&&b.append.remove();if(c){b.append=d('<span class="'+this._appendClass+'">'+c+"</span>");a[e?"before":"after"](b.append)}a.unbind("focus",this._showDatepicker);b.trigger&&b.trigger.remove();c=this._get(b,"showOn");if(c==
|
||||||
|
"focus"||c=="both")a.focus(this._showDatepicker);if(c=="button"||c=="both"){c=this._get(b,"buttonText");var f=this._get(b,"buttonImage");b.trigger=d(this._get(b,"buttonImageOnly")?d("<img/>").addClass(this._triggerClass).attr({src:f,alt:c,title:c}):d('<button type="button"></button>').addClass(this._triggerClass).html(f==""?c:d("<img/>").attr({src:f,alt:c,title:c})));a[e?"before":"after"](b.trigger);b.trigger.click(function(){d.datepicker._datepickerShowing&&d.datepicker._lastInput==a[0]?d.datepicker._hideDatepicker():
|
||||||
|
d.datepicker._showDatepicker(a[0]);return false})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var e=function(f){for(var h=0,i=0,g=0;g<f.length;g++)if(f[g].length>h){h=f[g].length;i=g}return i};b.setMonth(e(this._get(a,c.match(/MM/)?"monthNames":"monthNamesShort")));b.setDate(e(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a,
|
||||||
|
b){var c=d(a);if(!c.hasClass(this.markerClassName)){c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});d.data(a,"datepicker",b);this._setDate(b,this._getDefaultDate(b),true);this._updateDatepicker(b);this._updateAlternate(b);b.settings.disabled&&this._disableDatepicker(a);b.dpDiv.css("display","block")}},_dialogDatepicker:function(a,b,c,e,f){a=this._dialogInst;if(!a){this.uuid+=
|
||||||
|
1;this._dialogInput=d('<input type="text" id="'+("dp"+this.uuid)+'" style="position: absolute; top: -100px; width: 0px; z-index: -10;"/>');this._dialogInput.keydown(this._doKeyDown);d("body").append(this._dialogInput);a=this._dialogInst=this._newInst(this._dialogInput,false);a.settings={};d.data(this._dialogInput[0],"datepicker",a)}H(a.settings,e||{});b=b&&b.constructor==Date?this._formatDate(a,b):b;this._dialogInput.val(b);this._pos=f?f.length?f:[f.pageX,f.pageY]:null;if(!this._pos)this._pos=[document.documentElement.clientWidth/
|
||||||
|
2-100+(document.documentElement.scrollLeft||document.body.scrollLeft),document.documentElement.clientHeight/2-150+(document.documentElement.scrollTop||document.body.scrollTop)];this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px");a.settings.onSelect=c;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);this._showDatepicker(this._dialogInput[0]);d.blockUI&&d.blockUI(this.dpDiv);d.data(this._dialogInput[0],"datepicker",a);return this},_destroyDatepicker:function(a){var b=
|
||||||
|
d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();d.removeData(a,"datepicker");if(e=="input"){c.append.remove();c.trigger.remove();b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)}else if(e=="div"||e=="span")b.removeClass(this.markerClassName).empty()}},_enableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=
|
||||||
|
a.nodeName.toLowerCase();if(e=="input"){a.disabled=false;c.trigger.filter("button").each(function(){this.disabled=false}).end().filter("img").css({opacity:"1.0",cursor:""})}else if(e=="div"||e=="span"){b=b.children("."+this._inlineClass);b.children().removeClass("ui-state-disabled");b.find("select.ui-datepicker-month, select.ui-datepicker-year").removeAttr("disabled")}this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f})}},_disableDatepicker:function(a){var b=d(a),c=d.data(a,
|
||||||
|
"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=true;c.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else if(e=="div"||e=="span"){b=b.children("."+this._inlineClass);b.children().addClass("ui-state-disabled");b.find("select.ui-datepicker-month, select.ui-datepicker-year").attr("disabled","disabled")}this._disabledInputs=d.map(this._disabledInputs,function(f){return f==
|
||||||
|
a?null:f});this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return false;for(var b=0;b<this._disabledInputs.length;b++)if(this._disabledInputs[b]==a)return true;return false},_getInst:function(a){try{return d.data(a,"datepicker")}catch(b){throw"Missing instance data for this datepicker";}},_optionDatepicker:function(a,b,c){var e=this._getInst(a);if(arguments.length==2&&typeof b=="string")return b=="defaults"?d.extend({},d.datepicker._defaults):e?b=="all"?
|
||||||
|
d.extend({},e.settings):this._get(e,b):null;var f=b||{};if(typeof b=="string"){f={};f[b]=c}if(e){this._curInst==e&&this._hideDatepicker();var h=this._getDateDatepicker(a,true),i=this._getMinMaxDate(e,"min"),g=this._getMinMaxDate(e,"max");H(e.settings,f);if(i!==null&&f.dateFormat!==C&&f.minDate===C)e.settings.minDate=this._formatDate(e,i);if(g!==null&&f.dateFormat!==C&&f.maxDate===C)e.settings.maxDate=this._formatDate(e,g);this._attachments(d(a),e);this._autoSize(e);this._setDate(e,h);this._updateAlternate(e);
|
||||||
|
this._updateDatepicker(e)}},_changeDatepicker:function(a,b,c){this._optionDatepicker(a,b,c)},_refreshDatepicker:function(a){(a=this._getInst(a))&&this._updateDatepicker(a)},_setDateDatepicker:function(a,b){if(a=this._getInst(a)){this._setDate(a,b);this._updateDatepicker(a);this._updateAlternate(a)}},_getDateDatepicker:function(a,b){(a=this._getInst(a))&&!a.inline&&this._setDateFromField(a,b);return a?this._getDate(a):null},_doKeyDown:function(a){var b=d.datepicker._getInst(a.target),c=true,e=b.dpDiv.is(".ui-datepicker-rtl");
|
||||||
|
b._keyEvent=true;if(d.datepicker._datepickerShowing)switch(a.keyCode){case 9:d.datepicker._hideDatepicker();c=false;break;case 13:c=d("td."+d.datepicker._dayOverClass+":not(."+d.datepicker._currentClass+")",b.dpDiv);c[0]&&d.datepicker._selectDay(a.target,b.selectedMonth,b.selectedYear,c[0]);if(a=d.datepicker._get(b,"onSelect")){c=d.datepicker._formatDate(b);a.apply(b.input?b.input[0]:null,[c,b])}else d.datepicker._hideDatepicker();return false;case 27:d.datepicker._hideDatepicker();break;case 33:d.datepicker._adjustDate(a.target,
|
||||||
|
a.ctrlKey?-d.datepicker._get(b,"stepBigMonths"):-d.datepicker._get(b,"stepMonths"),"M");break;case 34:d.datepicker._adjustDate(a.target,a.ctrlKey?+d.datepicker._get(b,"stepBigMonths"):+d.datepicker._get(b,"stepMonths"),"M");break;case 35:if(a.ctrlKey||a.metaKey)d.datepicker._clearDate(a.target);c=a.ctrlKey||a.metaKey;break;case 36:if(a.ctrlKey||a.metaKey)d.datepicker._gotoToday(a.target);c=a.ctrlKey||a.metaKey;break;case 37:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,e?+1:-1,"D");c=
|
||||||
|
a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)d.datepicker._adjustDate(a.target,a.ctrlKey?-d.datepicker._get(b,"stepBigMonths"):-d.datepicker._get(b,"stepMonths"),"M");break;case 38:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,-7,"D");c=a.ctrlKey||a.metaKey;break;case 39:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,e?-1:+1,"D");c=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)d.datepicker._adjustDate(a.target,a.ctrlKey?+d.datepicker._get(b,"stepBigMonths"):+d.datepicker._get(b,
|
||||||
|
"stepMonths"),"M");break;case 40:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,+7,"D");c=a.ctrlKey||a.metaKey;break;default:c=false}else if(a.keyCode==36&&a.ctrlKey)d.datepicker._showDatepicker(this);else c=false;if(c){a.preventDefault();a.stopPropagation()}},_doKeyPress:function(a){var b=d.datepicker._getInst(a.target);if(d.datepicker._get(b,"constrainInput")){b=d.datepicker._possibleChars(d.datepicker._get(b,"dateFormat"));var c=String.fromCharCode(a.charCode==C?a.keyCode:a.charCode);
|
||||||
|
return a.ctrlKey||a.metaKey||c<" "||!b||b.indexOf(c)>-1}},_doKeyUp:function(a){a=d.datepicker._getInst(a.target);if(a.input.val()!=a.lastVal)try{if(d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),a.input?a.input.val():null,d.datepicker._getFormatConfig(a))){d.datepicker._setDateFromField(a);d.datepicker._updateAlternate(a);d.datepicker._updateDatepicker(a)}}catch(b){d.datepicker.log(b)}return true},_showDatepicker:function(a){a=a.target||a;if(a.nodeName.toLowerCase()!="input")a=d("input",
|
||||||
|
a.parentNode)[0];if(!(d.datepicker._isDisabledDatepicker(a)||d.datepicker._lastInput==a)){var b=d.datepicker._getInst(a);if(d.datepicker._curInst&&d.datepicker._curInst!=b){d.datepicker._datepickerShowing&&d.datepicker._triggerOnClose(d.datepicker._curInst);d.datepicker._curInst.dpDiv.stop(true,true)}var c=d.datepicker._get(b,"beforeShow");c=c?c.apply(a,[a,b]):{};if(c!==false){H(b.settings,c);b.lastVal=null;d.datepicker._lastInput=a;d.datepicker._setDateFromField(b);if(d.datepicker._inDialog)a.value=
|
||||||
|
"";if(!d.datepicker._pos){d.datepicker._pos=d.datepicker._findPos(a);d.datepicker._pos[1]+=a.offsetHeight}var e=false;d(a).parents().each(function(){e|=d(this).css("position")=="fixed";return!e});if(e&&d.browser.opera){d.datepicker._pos[0]-=document.documentElement.scrollLeft;d.datepicker._pos[1]-=document.documentElement.scrollTop}c={left:d.datepicker._pos[0],top:d.datepicker._pos[1]};d.datepicker._pos=null;b.dpDiv.empty();b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});d.datepicker._updateDatepicker(b);
|
||||||
|
c=d.datepicker._checkOffset(b,c,e);b.dpDiv.css({position:d.datepicker._inDialog&&d.blockUI?"static":e?"fixed":"absolute",display:"none",left:c.left+"px",top:c.top+"px"});if(!b.inline){c=d.datepicker._get(b,"showAnim");var f=d.datepicker._get(b,"duration"),h=function(){var i=b.dpDiv.find("iframe.ui-datepicker-cover");if(i.length){var g=d.datepicker._getBorders(b.dpDiv);i.css({left:-g[0],top:-g[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})}};b.dpDiv.zIndex(d(a).zIndex()+1);d.datepicker._datepickerShowing=
|
||||||
|
true;d.effects&&d.effects[c]?b.dpDiv.show(c,d.datepicker._get(b,"showOptions"),f,h):b.dpDiv[c||"show"](c?f:null,h);if(!c||!f)h();b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus();d.datepicker._curInst=b}}}},_updateDatepicker:function(a){this.maxRows=4;var b=d.datepicker._getBorders(a.dpDiv);J=a;a.dpDiv.empty().append(this._generateHTML(a));var c=a.dpDiv.find("iframe.ui-datepicker-cover");c.length&&c.css({left:-b[0],top:-b[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()});
|
||||||
|
a.dpDiv.find("."+this._dayOverClass+" a").mouseover();b=this._getNumberOfMonths(a);c=b[1];a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");c>1&&a.dpDiv.addClass("ui-datepicker-multi-"+c).css("width",17*c+"em");a.dpDiv[(b[0]!=1||b[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl");a==d.datepicker._curInst&&d.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&
|
||||||
|
!a.input.is(":disabled")&&a.input[0]!=document.activeElement&&a.input.focus();if(a.yearshtml){var e=a.yearshtml;setTimeout(function(){e===a.yearshtml&&a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml);e=a.yearshtml=null},0)}},_getBorders:function(a){var b=function(c){return{thin:1,medium:2,thick:3}[c]||c};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var e=a.dpDiv.outerWidth(),f=a.dpDiv.outerHeight(),
|
||||||
|
h=a.input?a.input.outerWidth():0,i=a.input?a.input.outerHeight():0,g=document.documentElement.clientWidth+d(document).scrollLeft(),j=document.documentElement.clientHeight+d(document).scrollTop();b.left-=this._get(a,"isRTL")?e-h:0;b.left-=c&&b.left==a.input.offset().left?d(document).scrollLeft():0;b.top-=c&&b.top==a.input.offset().top+i?d(document).scrollTop():0;b.left-=Math.min(b.left,b.left+e>g&&g>e?Math.abs(b.left+e-g):0);b.top-=Math.min(b.top,b.top+f>j&&j>f?Math.abs(f+i):0);return b},_findPos:function(a){for(var b=
|
||||||
|
this._get(this._getInst(a),"isRTL");a&&(a.type=="hidden"||a.nodeType!=1||d.expr.filters.hidden(a));)a=a[b?"previousSibling":"nextSibling"];a=d(a).offset();return[a.left,a.top]},_triggerOnClose:function(a){var b=this._get(a,"onClose");if(b)b.apply(a.input?a.input[0]:null,[a.input?a.input.val():"",a])},_hideDatepicker:function(a){var b=this._curInst;if(!(!b||a&&b!=d.data(a,"datepicker")))if(this._datepickerShowing){a=this._get(b,"showAnim");var c=this._get(b,"duration"),e=function(){d.datepicker._tidyDialog(b);
|
||||||
|
this._curInst=null};d.effects&&d.effects[a]?b.dpDiv.hide(a,d.datepicker._get(b,"showOptions"),c,e):b.dpDiv[a=="slideDown"?"slideUp":a=="fadeIn"?"fadeOut":"hide"](a?c:null,e);a||e();d.datepicker._triggerOnClose(b);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(d.blockUI){d.unblockUI();d("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},
|
||||||
|
_checkExternalClick:function(a){if(d.datepicker._curInst){a=d(a.target);a[0].id!=d.datepicker._mainDivId&&a.parents("#"+d.datepicker._mainDivId).length==0&&!a.hasClass(d.datepicker.markerClassName)&&!a.hasClass(d.datepicker._triggerClass)&&d.datepicker._datepickerShowing&&!(d.datepicker._inDialog&&d.blockUI)&&d.datepicker._hideDatepicker()}},_adjustDate:function(a,b,c){a=d(a);var e=this._getInst(a[0]);if(!this._isDisabledDatepicker(a[0])){this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"):
|
||||||
|
0),c);this._updateDatepicker(e)}},_gotoToday:function(a){a=d(a);var b=this._getInst(a[0]);if(this._get(b,"gotoCurrent")&&b.currentDay){b.selectedDay=b.currentDay;b.drawMonth=b.selectedMonth=b.currentMonth;b.drawYear=b.selectedYear=b.currentYear}else{var c=new Date;b.selectedDay=c.getDate();b.drawMonth=b.selectedMonth=c.getMonth();b.drawYear=b.selectedYear=c.getFullYear()}this._notifyChange(b);this._adjustDate(a)},_selectMonthYear:function(a,b,c){a=d(a);var e=this._getInst(a[0]);e["selected"+(c=="M"?
|
||||||
|
"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10);this._notifyChange(e);this._adjustDate(a)},_selectDay:function(a,b,c,e){var f=d(a);if(!(d(e).hasClass(this._unselectableClass)||this._isDisabledDatepicker(f[0]))){f=this._getInst(f[0]);f.selectedDay=f.currentDay=d("a",e).html();f.selectedMonth=f.currentMonth=b;f.selectedYear=f.currentYear=c;this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))}},_clearDate:function(a){a=d(a);
|
||||||
|
this._getInst(a[0]);this._selectDate(a,"")},_selectDate:function(a,b){a=this._getInst(d(a)[0]);b=b!=null?b:this._formatDate(a);a.input&&a.input.val(b);this._updateAlternate(a);var c=this._get(a,"onSelect");if(c)c.apply(a.input?a.input[0]:null,[b,a]);else a.input&&a.input.trigger("change");if(a.inline)this._updateDatepicker(a);else{this._hideDatepicker();this._lastInput=a.input[0];typeof a.input[0]!="object"&&a.input.focus();this._lastInput=null}},_updateAlternate:function(a){var b=this._get(a,"altField");
|
||||||
|
if(b){var c=this._get(a,"altFormat")||this._get(a,"dateFormat"),e=this._getDate(a),f=this.formatDate(c,e,this._getFormatConfig(a));d(b).each(function(){d(this).val(f)})}},noWeekends:function(a){a=a.getDay();return[a>0&&a<6,""]},iso8601Week:function(a){a=new Date(a.getTime());a.setDate(a.getDate()+4-(a.getDay()||7));var b=a.getTime();a.setMonth(0);a.setDate(1);return Math.floor(Math.round((b-a)/864E5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b=="object"?
|
||||||
|
b.toString():b+"";if(b=="")return null;var e=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff;e=typeof e!="string"?e:(new Date).getFullYear()%100+parseInt(e,10);for(var f=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,h=(c?c.dayNames:null)||this._defaults.dayNames,i=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,g=(c?c.monthNames:null)||this._defaults.monthNames,j=c=-1,l=-1,u=-1,k=false,o=function(p){(p=A+1<a.length&&a.charAt(A+1)==p)&&A++;return p},m=function(p){var D=
|
||||||
|
o(p);p=new RegExp("^\\d{1,"+(p=="@"?14:p=="!"?20:p=="y"&&D?4:p=="o"?3:2)+"}");p=b.substring(q).match(p);if(!p)throw"Missing number at position "+q;q+=p[0].length;return parseInt(p[0],10)},n=function(p,D,K){p=d.map(o(p)?K:D,function(w,x){return[[x,w]]}).sort(function(w,x){return-(w[1].length-x[1].length)});var E=-1;d.each(p,function(w,x){w=x[1];if(b.substr(q,w.length).toLowerCase()==w.toLowerCase()){E=x[0];q+=w.length;return false}});if(E!=-1)return E+1;else throw"Unknown name at position "+q;},s=
|
||||||
|
function(){if(b.charAt(q)!=a.charAt(A))throw"Unexpected literal at position "+q;q++},q=0,A=0;A<a.length;A++)if(k)if(a.charAt(A)=="'"&&!o("'"))k=false;else s();else switch(a.charAt(A)){case "d":l=m("d");break;case "D":n("D",f,h);break;case "o":u=m("o");break;case "m":j=m("m");break;case "M":j=n("M",i,g);break;case "y":c=m("y");break;case "@":var v=new Date(m("@"));c=v.getFullYear();j=v.getMonth()+1;l=v.getDate();break;case "!":v=new Date((m("!")-this._ticksTo1970)/1E4);c=v.getFullYear();j=v.getMonth()+
|
||||||
|
1;l=v.getDate();break;case "'":if(o("'"))s();else k=true;break;default:s()}if(q<b.length)throw"Extra/unparsed characters found in date: "+b.substring(q);if(c==-1)c=(new Date).getFullYear();else if(c<100)c+=(new Date).getFullYear()-(new Date).getFullYear()%100+(c<=e?0:-100);if(u>-1){j=1;l=u;do{e=this._getDaysInMonth(c,j-1);if(l<=e)break;j++;l-=e}while(1)}v=this._daylightSavingAdjust(new Date(c,j-1,l));if(v.getFullYear()!=c||v.getMonth()+1!=j||v.getDate()!=l)throw"Invalid date";return v},ATOM:"yy-mm-dd",
|
||||||
|
COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1E7,formatDate:function(a,b,c){if(!b)return"";var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames,h=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort;c=(c?c.monthNames:
|
||||||
|
null)||this._defaults.monthNames;var i=function(o){(o=k+1<a.length&&a.charAt(k+1)==o)&&k++;return o},g=function(o,m,n){m=""+m;if(i(o))for(;m.length<n;)m="0"+m;return m},j=function(o,m,n,s){return i(o)?s[m]:n[m]},l="",u=false;if(b)for(var k=0;k<a.length;k++)if(u)if(a.charAt(k)=="'"&&!i("'"))u=false;else l+=a.charAt(k);else switch(a.charAt(k)){case "d":l+=g("d",b.getDate(),2);break;case "D":l+=j("D",b.getDay(),e,f);break;case "o":l+=g("o",Math.round(((new Date(b.getFullYear(),b.getMonth(),b.getDate())).getTime()-
|
||||||
|
(new Date(b.getFullYear(),0,0)).getTime())/864E5),3);break;case "m":l+=g("m",b.getMonth()+1,2);break;case "M":l+=j("M",b.getMonth(),h,c);break;case "y":l+=i("y")?b.getFullYear():(b.getYear()%100<10?"0":"")+b.getYear()%100;break;case "@":l+=b.getTime();break;case "!":l+=b.getTime()*1E4+this._ticksTo1970;break;case "'":if(i("'"))l+="'";else u=true;break;default:l+=a.charAt(k)}return l},_possibleChars:function(a){for(var b="",c=false,e=function(h){(h=f+1<a.length&&a.charAt(f+1)==h)&&f++;return h},f=
|
||||||
|
0;f<a.length;f++)if(c)if(a.charAt(f)=="'"&&!e("'"))c=false;else b+=a.charAt(f);else switch(a.charAt(f)){case "d":case "m":case "y":case "@":b+="0123456789";break;case "D":case "M":return null;case "'":if(e("'"))b+="'";else c=true;break;default:b+=a.charAt(f)}return b},_get:function(a,b){return a.settings[b]!==C?a.settings[b]:this._defaults[b]},_setDateFromField:function(a,b){if(a.input.val()!=a.lastVal){var c=this._get(a,"dateFormat"),e=a.lastVal=a.input?a.input.val():null,f,h;f=h=this._getDefaultDate(a);
|
||||||
|
var i=this._getFormatConfig(a);try{f=this.parseDate(c,e,i)||h}catch(g){this.log(g);e=b?"":e}a.selectedDay=f.getDate();a.drawMonth=a.selectedMonth=f.getMonth();a.drawYear=a.selectedYear=f.getFullYear();a.currentDay=e?f.getDate():0;a.currentMonth=e?f.getMonth():0;a.currentYear=e?f.getFullYear():0;this._adjustInstDate(a)}},_getDefaultDate:function(a){return this._restrictMinMax(a,this._determineDate(a,this._get(a,"defaultDate"),new Date))},_determineDate:function(a,b,c){var e=function(h){var i=new Date;
|
||||||
|
i.setDate(i.getDate()+h);return i},f=function(h){try{return d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),h,d.datepicker._getFormatConfig(a))}catch(i){}var g=(h.toLowerCase().match(/^c/)?d.datepicker._getDate(a):null)||new Date,j=g.getFullYear(),l=g.getMonth();g=g.getDate();for(var u=/([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,k=u.exec(h);k;){switch(k[2]||"d"){case "d":case "D":g+=parseInt(k[1],10);break;case "w":case "W":g+=parseInt(k[1],10)*7;break;case "m":case "M":l+=parseInt(k[1],10);g=
|
||||||
|
Math.min(g,d.datepicker._getDaysInMonth(j,l));break;case "y":case "Y":j+=parseInt(k[1],10);g=Math.min(g,d.datepicker._getDaysInMonth(j,l));break}k=u.exec(h)}return new Date(j,l,g)};if(b=(b=b==null||b===""?c:typeof b=="string"?f(b):typeof b=="number"?isNaN(b)?c:e(b):new Date(b.getTime()))&&b.toString()=="Invalid Date"?c:b){b.setHours(0);b.setMinutes(0);b.setSeconds(0);b.setMilliseconds(0)}return this._daylightSavingAdjust(b)},_daylightSavingAdjust:function(a){if(!a)return null;a.setHours(a.getHours()>
|
||||||
|
12?a.getHours()+2:0);return a},_setDate:function(a,b,c){var e=!b,f=a.selectedMonth,h=a.selectedYear;b=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=a.currentDay=b.getDate();a.drawMonth=a.selectedMonth=a.currentMonth=b.getMonth();a.drawYear=a.selectedYear=a.currentYear=b.getFullYear();if((f!=a.selectedMonth||h!=a.selectedYear)&&!c)this._notifyChange(a);this._adjustInstDate(a);if(a.input)a.input.val(e?"":this._formatDate(a))},_getDate:function(a){return!a.currentYear||a.input&&
|
||||||
|
a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay))},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(),b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),e=this._get(a,"showButtonPanel"),f=this._get(a,"hideIfNoPrevNext"),h=this._get(a,"navigationAsDateFormat"),i=this._getNumberOfMonths(a),g=this._get(a,"showCurrentAtPos"),j=this._get(a,"stepMonths"),l=i[0]!=1||i[1]!=1,u=this._daylightSavingAdjust(!a.currentDay?
|
||||||
|
new Date(9999,9,9):new Date(a.currentYear,a.currentMonth,a.currentDay)),k=this._getMinMaxDate(a,"min"),o=this._getMinMaxDate(a,"max");g=a.drawMonth-g;var m=a.drawYear;if(g<0){g+=12;m--}if(o){var n=this._daylightSavingAdjust(new Date(o.getFullYear(),o.getMonth()-i[0]*i[1]+1,o.getDate()));for(n=k&&n<k?k:n;this._daylightSavingAdjust(new Date(m,g,1))>n;){g--;if(g<0){g=11;m--}}}a.drawMonth=g;a.drawYear=m;n=this._get(a,"prevText");n=!h?n:this.formatDate(n,this._daylightSavingAdjust(new Date(m,g-j,1)),this._getFormatConfig(a));
|
||||||
|
n=this._canAdjustMonth(a,-1,m,g)?'<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery_'+B+".datepicker._adjustDate('#"+a.id+"', -"+j+", 'M');\" title=\""+n+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+n+"</span></a>":f?"":'<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+n+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+n+"</span></a>";var s=this._get(a,"nextText");s=!h?s:this.formatDate(s,this._daylightSavingAdjust(new Date(m,
|
||||||
|
g+j,1)),this._getFormatConfig(a));f=this._canAdjustMonth(a,+1,m,g)?'<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery_'+B+".datepicker._adjustDate('#"+a.id+"', +"+j+", 'M');\" title=\""+s+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"w":"e")+'">'+s+"</span></a>":f?"":'<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+s+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"w":"e")+'">'+s+"</span></a>";j=this._get(a,"currentText");s=this._get(a,"gotoCurrent")&&
|
||||||
|
a.currentDay?u:b;j=!h?j:this.formatDate(j,s,this._getFormatConfig(a));h=!a.inline?'<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery_'+B+'.datepicker._hideDatepicker();">'+this._get(a,"closeText")+"</button>":"";e=e?'<div class="ui-datepicker-buttonpane ui-widget-content">'+(c?h:"")+(this._isInRange(a,s)?'<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery_'+
|
||||||
|
B+".datepicker._gotoToday('#"+a.id+"');\">"+j+"</button>":"")+(c?"":h)+"</div>":"";h=parseInt(this._get(a,"firstDay"),10);h=isNaN(h)?0:h;j=this._get(a,"showWeek");s=this._get(a,"dayNames");this._get(a,"dayNamesShort");var q=this._get(a,"dayNamesMin"),A=this._get(a,"monthNames"),v=this._get(a,"monthNamesShort"),p=this._get(a,"beforeShowDay"),D=this._get(a,"showOtherMonths"),K=this._get(a,"selectOtherMonths");this._get(a,"calculateWeek");for(var E=this._getDefaultDate(a),w="",x=0;x<i[0];x++){var O=
|
||||||
|
"";this.maxRows=4;for(var G=0;G<i[1];G++){var P=this._daylightSavingAdjust(new Date(m,g,a.selectedDay)),t=" ui-corner-all",y="";if(l){y+='<div class="ui-datepicker-group';if(i[1]>1)switch(G){case 0:y+=" ui-datepicker-group-first";t=" ui-corner-"+(c?"right":"left");break;case i[1]-1:y+=" ui-datepicker-group-last";t=" ui-corner-"+(c?"left":"right");break;default:y+=" ui-datepicker-group-middle";t="";break}y+='">'}y+='<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix'+t+'">'+(/all|left/.test(t)&&
|
||||||
|
x==0?c?f:n:"")+(/all|right/.test(t)&&x==0?c?n:f:"")+this._generateMonthYearHeader(a,g,m,k,o,x>0||G>0,A,v)+'</div><table class="ui-datepicker-calendar"><thead><tr>';var z=j?'<th class="ui-datepicker-week-col">'+this._get(a,"weekHeader")+"</th>":"";for(t=0;t<7;t++){var r=(t+h)%7;z+="<th"+((t+h+6)%7>=5?' class="ui-datepicker-week-end"':"")+'><span title="'+s[r]+'">'+q[r]+"</span></th>"}y+=z+"</tr></thead><tbody>";z=this._getDaysInMonth(m,g);if(m==a.selectedYear&&g==a.selectedMonth)a.selectedDay=Math.min(a.selectedDay,
|
||||||
|
z);t=(this._getFirstDayOfMonth(m,g)-h+7)%7;z=Math.ceil((t+z)/7);this.maxRows=z=l?this.maxRows>z?this.maxRows:z:z;r=this._daylightSavingAdjust(new Date(m,g,1-t));for(var Q=0;Q<z;Q++){y+="<tr>";var R=!j?"":'<td class="ui-datepicker-week-col">'+this._get(a,"calculateWeek")(r)+"</td>";for(t=0;t<7;t++){var I=p?p.apply(a.input?a.input[0]:null,[r]):[true,""],F=r.getMonth()!=g,L=F&&!K||!I[0]||k&&r<k||o&&r>o;R+='<td class="'+((t+h+6)%7>=5?" ui-datepicker-week-end":"")+(F?" ui-datepicker-other-month":"")+(r.getTime()==
|
||||||
|
P.getTime()&&g==a.selectedMonth&&a._keyEvent||E.getTime()==r.getTime()&&E.getTime()==P.getTime()?" "+this._dayOverClass:"")+(L?" "+this._unselectableClass+" ui-state-disabled":"")+(F&&!D?"":" "+I[1]+(r.getTime()==u.getTime()?" "+this._currentClass:"")+(r.getTime()==b.getTime()?" ui-datepicker-today":""))+'"'+((!F||D)&&I[2]?' title="'+I[2]+'"':"")+(L?"":' onclick="DP_jQuery_'+B+".datepicker._selectDay('#"+a.id+"',"+r.getMonth()+","+r.getFullYear()+', this);return false;"')+">"+(F&&!D?" ":L?'<span class="ui-state-default">'+
|
||||||
|
r.getDate()+"</span>":'<a class="ui-state-default'+(r.getTime()==b.getTime()?" ui-state-highlight":"")+(r.getTime()==u.getTime()?" ui-state-active":"")+(F?" ui-priority-secondary":"")+'" href="#">'+r.getDate()+"</a>")+"</td>";r.setDate(r.getDate()+1);r=this._daylightSavingAdjust(r)}y+=R+"</tr>"}g++;if(g>11){g=0;m++}y+="</tbody></table>"+(l?"</div>"+(i[0]>0&&G==i[1]-1?'<div class="ui-datepicker-row-break"></div>':""):"");O+=y}w+=O}w+=e+(d.browser.msie&&parseInt(d.browser.version,10)<7&&!a.inline?'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>':
|
||||||
|
"");a._keyEvent=false;return w},_generateMonthYearHeader:function(a,b,c,e,f,h,i,g){var j=this._get(a,"changeMonth"),l=this._get(a,"changeYear"),u=this._get(a,"showMonthAfterYear"),k='<div class="ui-datepicker-title">',o="";if(h||!j)o+='<span class="ui-datepicker-month">'+i[b]+"</span>";else{i=e&&e.getFullYear()==c;var m=f&&f.getFullYear()==c;o+='<select class="ui-datepicker-month" onchange="DP_jQuery_'+B+".datepicker._selectMonthYear('#"+a.id+"', this, 'M');\" >";for(var n=0;n<12;n++)if((!i||n>=e.getMonth())&&
|
||||||
|
(!m||n<=f.getMonth()))o+='<option value="'+n+'"'+(n==b?' selected="selected"':"")+">"+g[n]+"</option>";o+="</select>"}u||(k+=o+(h||!(j&&l)?" ":""));if(!a.yearshtml){a.yearshtml="";if(h||!l)k+='<span class="ui-datepicker-year">'+c+"</span>";else{g=this._get(a,"yearRange").split(":");var s=(new Date).getFullYear();i=function(q){q=q.match(/c[+-].*/)?c+parseInt(q.substring(1),10):q.match(/[+-].*/)?s+parseInt(q,10):parseInt(q,10);return isNaN(q)?s:q};b=i(g[0]);g=Math.max(b,i(g[1]||""));b=e?Math.max(b,
|
||||||
|
e.getFullYear()):b;g=f?Math.min(g,f.getFullYear()):g;for(a.yearshtml+='<select class="ui-datepicker-year" onchange="DP_jQuery_'+B+".datepicker._selectMonthYear('#"+a.id+"', this, 'Y');\" >";b<=g;b++)a.yearshtml+='<option value="'+b+'"'+(b==c?' selected="selected"':"")+">"+b+"</option>";a.yearshtml+="</select>";k+=a.yearshtml;a.yearshtml=null}}k+=this._get(a,"yearSuffix");if(u)k+=(h||!(j&&l)?" ":"")+o;k+="</div>";return k},_adjustInstDate:function(a,b,c){var e=a.drawYear+(c=="Y"?b:0),f=a.drawMonth+
|
||||||
|
(c=="M"?b:0);b=Math.min(a.selectedDay,this._getDaysInMonth(e,f))+(c=="D"?b:0);e=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(e,f,b)));a.selectedDay=e.getDate();a.drawMonth=a.selectedMonth=e.getMonth();a.drawYear=a.selectedYear=e.getFullYear();if(c=="M"||c=="Y")this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");b=c&&b<c?c:b;return b=a&&b>a?a:b},_notifyChange:function(a){var b=this._get(a,"onChangeMonthYear");if(b)b.apply(a.input?
|
||||||
|
a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return a==null?[1,1]:typeof a=="number"?[1,a]:a},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-this._daylightSavingAdjust(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,e){var f=this._getNumberOfMonths(a);c=this._daylightSavingAdjust(new Date(c,
|
||||||
|
e+(b<0?b:f[0]*f[1]),1));b<0&&c.setDate(this._getDaysInMonth(c.getFullYear(),c.getMonth()));return this._isInRange(a,c)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!a||b.getTime()<=a.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a,"dayNamesShort"),dayNames:this._get(a,
|
||||||
|
"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,e){if(!b){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}b=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(e,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),b,this._getFormatConfig(a))}});d.fn.datepicker=function(a){if(!this.length)return this;
|
||||||
|
if(!d.datepicker.initialized){d(document).mousedown(d.datepicker._checkExternalClick).find("body").append(d.datepicker.dpDiv);d.datepicker.initialized=true}var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));return this.each(function(){typeof a==
|
||||||
|
"string"?d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this].concat(b)):d.datepicker._attachDatepicker(this,a)})};d.datepicker=new M;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.16";window["DP_jQuery_"+B]=d})(jQuery);
|
||||||
|
;/*
|
||||||
|
* jQuery UI Effects 1.8.16
|
||||||
|
*
|
||||||
|
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Effects/
|
||||||
|
*/
|
||||||
|
jQuery.effects||function(f,j){function m(c){var a;if(c&&c.constructor==Array&&c.length==3)return c;if(a=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c))return[parseInt(a[1],10),parseInt(a[2],10),parseInt(a[3],10)];if(a=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c))return[parseFloat(a[1])*2.55,parseFloat(a[2])*2.55,parseFloat(a[3])*2.55];if(a=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c))return[parseInt(a[1],
|
||||||
|
16),parseInt(a[2],16),parseInt(a[3],16)];if(a=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c))return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16)];if(/rgba\(0, 0, 0, 0\)/.exec(c))return n.transparent;return n[f.trim(c).toLowerCase()]}function s(c,a){var b;do{b=f.curCSS(c,a);if(b!=""&&b!="transparent"||f.nodeName(c,"body"))break;a="backgroundColor"}while(c=c.parentNode);return m(b)}function o(){var c=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle,
|
||||||
|
a={},b,d;if(c&&c.length&&c[0]&&c[c[0]])for(var e=c.length;e--;){b=c[e];if(typeof c[b]=="string"){d=b.replace(/\-(\w)/g,function(g,h){return h.toUpperCase()});a[d]=c[b]}}else for(b in c)if(typeof c[b]==="string")a[b]=c[b];return a}function p(c){var a,b;for(a in c){b=c[a];if(b==null||f.isFunction(b)||a in t||/scrollbar/.test(a)||!/color/i.test(a)&&isNaN(parseFloat(b)))delete c[a]}return c}function u(c,a){var b={_:0},d;for(d in a)if(c[d]!=a[d])b[d]=a[d];return b}function k(c,a,b,d){if(typeof c=="object"){d=
|
||||||
|
a;b=null;a=c;c=a.effect}if(f.isFunction(a)){d=a;b=null;a={}}if(typeof a=="number"||f.fx.speeds[a]){d=b;b=a;a={}}if(f.isFunction(b)){d=b;b=null}a=a||{};b=b||a.duration;b=f.fx.off?0:typeof b=="number"?b:b in f.fx.speeds?f.fx.speeds[b]:f.fx.speeds._default;d=d||a.complete;return[c,a,b,d]}function l(c){if(!c||typeof c==="number"||f.fx.speeds[c])return true;if(typeof c==="string"&&!f.effects[c])return true;return false}f.effects={};f.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor",
|
||||||
|
"borderTopColor","borderColor","color","outlineColor"],function(c,a){f.fx.step[a]=function(b){if(!b.colorInit){b.start=s(b.elem,a);b.end=m(b.end);b.colorInit=true}b.elem.style[a]="rgb("+Math.max(Math.min(parseInt(b.pos*(b.end[0]-b.start[0])+b.start[0],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[1]-b.start[1])+b.start[1],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[2]-b.start[2])+b.start[2],10),255),0)+")"}});var n={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,
|
||||||
|
0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,
|
||||||
|
211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},q=["add","remove","toggle"],t={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};f.effects.animateClass=function(c,a,b,
|
||||||
|
d){if(f.isFunction(b)){d=b;b=null}return this.queue(function(){var e=f(this),g=e.attr("style")||" ",h=p(o.call(this)),r,v=e.attr("class");f.each(q,function(w,i){c[i]&&e[i+"Class"](c[i])});r=p(o.call(this));e.attr("class",v);e.animate(u(h,r),{queue:false,duration:a,easing:b,complete:function(){f.each(q,function(w,i){c[i]&&e[i+"Class"](c[i])});if(typeof e.attr("style")=="object"){e.attr("style").cssText="";e.attr("style").cssText=g}else e.attr("style",g);d&&d.apply(this,arguments);f.dequeue(this)}})})};
|
||||||
|
f.fn.extend({_addClass:f.fn.addClass,addClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{add:c},a,b,d]):this._addClass(c)},_removeClass:f.fn.removeClass,removeClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{remove:c},a,b,d]):this._removeClass(c)},_toggleClass:f.fn.toggleClass,toggleClass:function(c,a,b,d,e){return typeof a=="boolean"||a===j?b?f.effects.animateClass.apply(this,[a?{add:c}:{remove:c},b,d,e]):this._toggleClass(c,a):f.effects.animateClass.apply(this,
|
||||||
|
[{toggle:c},a,b,d])},switchClass:function(c,a,b,d,e){return f.effects.animateClass.apply(this,[{add:a,remove:c},b,d,e])}});f.extend(f.effects,{version:"1.8.16",save:function(c,a){for(var b=0;b<a.length;b++)a[b]!==null&&c.data("ec.storage."+a[b],c[0].style[a[b]])},restore:function(c,a){for(var b=0;b<a.length;b++)a[b]!==null&&c.css(a[b],c.data("ec.storage."+a[b]))},setMode:function(c,a){if(a=="toggle")a=c.is(":hidden")?"show":"hide";return a},getBaseline:function(c,a){var b;switch(c[0]){case "top":b=
|
||||||
|
0;break;case "middle":b=0.5;break;case "bottom":b=1;break;default:b=c[0]/a.height}switch(c[1]){case "left":c=0;break;case "center":c=0.5;break;case "right":c=1;break;default:c=c[1]/a.width}return{x:c,y:b}},createWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent();var a={width:c.outerWidth(true),height:c.outerHeight(true),"float":c.css("float")},b=f("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),
|
||||||
|
d=document.activeElement;c.wrap(b);if(c[0]===d||f.contains(c[0],d))f(d).focus();b=c.parent();if(c.css("position")=="static"){b.css({position:"relative"});c.css({position:"relative"})}else{f.extend(a,{position:c.css("position"),zIndex:c.css("z-index")});f.each(["top","left","bottom","right"],function(e,g){a[g]=c.css(g);if(isNaN(parseInt(a[g],10)))a[g]="auto"});c.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})}return b.css(a).show()},removeWrapper:function(c){var a,b=document.activeElement;
|
||||||
|
if(c.parent().is(".ui-effects-wrapper")){a=c.parent().replaceWith(c);if(c[0]===b||f.contains(c[0],b))f(b).focus();return a}return c},setTransition:function(c,a,b,d){d=d||{};f.each(a,function(e,g){unit=c.cssUnit(g);if(unit[0]>0)d[g]=unit[0]*b+unit[1]});return d}});f.fn.extend({effect:function(c){var a=k.apply(this,arguments),b={options:a[1],duration:a[2],callback:a[3]};a=b.options.mode;var d=f.effects[c];if(f.fx.off||!d)return a?this[a](b.duration,b.callback):this.each(function(){b.callback&&b.callback.call(this)});
|
||||||
|
return d.call(this,b)},_show:f.fn.show,show:function(c){if(l(c))return this._show.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="show";return this.effect.apply(this,a)}},_hide:f.fn.hide,hide:function(c){if(l(c))return this._hide.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="hide";return this.effect.apply(this,a)}},__toggle:f.fn.toggle,toggle:function(c){if(l(c)||typeof c==="boolean"||f.isFunction(c))return this.__toggle.apply(this,arguments);else{var a=k.apply(this,
|
||||||
|
arguments);a[1].mode="toggle";return this.effect.apply(this,a)}},cssUnit:function(c){var a=this.css(c),b=[];f.each(["em","px","%","pt"],function(d,e){if(a.indexOf(e)>0)b=[parseFloat(a),e]});return b}});f.easing.jswing=f.easing.swing;f.extend(f.easing,{def:"easeOutQuad",swing:function(c,a,b,d,e){return f.easing[f.easing.def](c,a,b,d,e)},easeInQuad:function(c,a,b,d,e){return d*(a/=e)*a+b},easeOutQuad:function(c,a,b,d,e){return-d*(a/=e)*(a-2)+b},easeInOutQuad:function(c,a,b,d,e){if((a/=e/2)<1)return d/
|
||||||
|
2*a*a+b;return-d/2*(--a*(a-2)-1)+b},easeInCubic:function(c,a,b,d,e){return d*(a/=e)*a*a+b},easeOutCubic:function(c,a,b,d,e){return d*((a=a/e-1)*a*a+1)+b},easeInOutCubic:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a+b;return d/2*((a-=2)*a*a+2)+b},easeInQuart:function(c,a,b,d,e){return d*(a/=e)*a*a*a+b},easeOutQuart:function(c,a,b,d,e){return-d*((a=a/e-1)*a*a*a-1)+b},easeInOutQuart:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a+b;return-d/2*((a-=2)*a*a*a-2)+b},easeInQuint:function(c,a,b,
|
||||||
|
d,e){return d*(a/=e)*a*a*a*a+b},easeOutQuint:function(c,a,b,d,e){return d*((a=a/e-1)*a*a*a*a+1)+b},easeInOutQuint:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a*a+b;return d/2*((a-=2)*a*a*a*a+2)+b},easeInSine:function(c,a,b,d,e){return-d*Math.cos(a/e*(Math.PI/2))+d+b},easeOutSine:function(c,a,b,d,e){return d*Math.sin(a/e*(Math.PI/2))+b},easeInOutSine:function(c,a,b,d,e){return-d/2*(Math.cos(Math.PI*a/e)-1)+b},easeInExpo:function(c,a,b,d,e){return a==0?b:d*Math.pow(2,10*(a/e-1))+b},easeOutExpo:function(c,
|
||||||
|
a,b,d,e){return a==e?b+d:d*(-Math.pow(2,-10*a/e)+1)+b},easeInOutExpo:function(c,a,b,d,e){if(a==0)return b;if(a==e)return b+d;if((a/=e/2)<1)return d/2*Math.pow(2,10*(a-1))+b;return d/2*(-Math.pow(2,-10*--a)+2)+b},easeInCirc:function(c,a,b,d,e){return-d*(Math.sqrt(1-(a/=e)*a)-1)+b},easeOutCirc:function(c,a,b,d,e){return d*Math.sqrt(1-(a=a/e-1)*a)+b},easeInOutCirc:function(c,a,b,d,e){if((a/=e/2)<1)return-d/2*(Math.sqrt(1-a*a)-1)+b;return d/2*(Math.sqrt(1-(a-=2)*a)+1)+b},easeInElastic:function(c,a,b,
|
||||||
|
d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/h);return-(h*Math.pow(2,10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g))+b},easeOutElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/h);return h*Math.pow(2,-10*a)*Math.sin((a*e-c)*2*Math.PI/g)+d+b},easeInOutElastic:function(c,a,b,d,e){c=1.70158;var g=
|
||||||
|
0,h=d;if(a==0)return b;if((a/=e/2)==2)return b+d;g||(g=e*0.3*1.5);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/h);if(a<1)return-0.5*h*Math.pow(2,10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g)+b;return h*Math.pow(2,-10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g)*0.5+d+b},easeInBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;return d*(a/=e)*a*((g+1)*a-g)+b},easeOutBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;return d*((a=a/e-1)*a*((g+1)*a+g)+1)+b},easeInOutBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;
|
||||||
|
if((a/=e/2)<1)return d/2*a*a*(((g*=1.525)+1)*a-g)+b;return d/2*((a-=2)*a*(((g*=1.525)+1)*a+g)+2)+b},easeInBounce:function(c,a,b,d,e){return d-f.easing.easeOutBounce(c,e-a,0,d,e)+b},easeOutBounce:function(c,a,b,d,e){return(a/=e)<1/2.75?d*7.5625*a*a+b:a<2/2.75?d*(7.5625*(a-=1.5/2.75)*a+0.75)+b:a<2.5/2.75?d*(7.5625*(a-=2.25/2.75)*a+0.9375)+b:d*(7.5625*(a-=2.625/2.75)*a+0.984375)+b},easeInOutBounce:function(c,a,b,d,e){if(a<e/2)return f.easing.easeInBounce(c,a*2,0,d,e)*0.5+b;return f.easing.easeOutBounce(c,
|
||||||
|
a*2-e,0,d,e)*0.5+d*0.5+b}})}(jQuery);
|
||||||
|
;/*
|
||||||
|
* jQuery UI Effects Blind 1.8.16
|
||||||
|
*
|
||||||
|
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Effects/Blind
|
||||||
|
*
|
||||||
|
* Depends:
|
||||||
|
* jquery.effects.core.js
|
||||||
|
*/
|
||||||
|
(function(b){b.effects.blind=function(c){return this.queue(function(){var a=b(this),g=["position","top","bottom","left","right"],f=b.effects.setMode(a,c.options.mode||"hide"),d=c.options.direction||"vertical";b.effects.save(a,g);a.show();var e=b.effects.createWrapper(a).css({overflow:"hidden"}),h=d=="vertical"?"height":"width";d=d=="vertical"?e.height():e.width();f=="show"&&e.css(h,0);var i={};i[h]=f=="show"?d:0;e.animate(i,c.duration,c.options.easing,function(){f=="hide"&&a.hide();b.effects.restore(a,
|
||||||
|
g);b.effects.removeWrapper(a);c.callback&&c.callback.apply(a[0],arguments);a.dequeue()})})}})(jQuery);
|
||||||
|
;/*
|
||||||
|
* jQuery UI Effects Bounce 1.8.16
|
||||||
|
*
|
||||||
|
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Effects/Bounce
|
||||||
|
*
|
||||||
|
* Depends:
|
||||||
|
* jquery.effects.core.js
|
||||||
|
*/
|
||||||
|
(function(e){e.effects.bounce=function(b){return this.queue(function(){var a=e(this),l=["position","top","bottom","left","right"],h=e.effects.setMode(a,b.options.mode||"effect"),d=b.options.direction||"up",c=b.options.distance||20,m=b.options.times||5,i=b.duration||250;/show|hide/.test(h)&&l.push("opacity");e.effects.save(a,l);a.show();e.effects.createWrapper(a);var f=d=="up"||d=="down"?"top":"left";d=d=="up"||d=="left"?"pos":"neg";c=b.options.distance||(f=="top"?a.outerHeight({margin:true})/3:a.outerWidth({margin:true})/
|
||||||
|
3);if(h=="show")a.css("opacity",0).css(f,d=="pos"?-c:c);if(h=="hide")c/=m*2;h!="hide"&&m--;if(h=="show"){var g={opacity:1};g[f]=(d=="pos"?"+=":"-=")+c;a.animate(g,i/2,b.options.easing);c/=2;m--}for(g=0;g<m;g++){var j={},k={};j[f]=(d=="pos"?"-=":"+=")+c;k[f]=(d=="pos"?"+=":"-=")+c;a.animate(j,i/2,b.options.easing).animate(k,i/2,b.options.easing);c=h=="hide"?c*2:c/2}if(h=="hide"){g={opacity:0};g[f]=(d=="pos"?"-=":"+=")+c;a.animate(g,i/2,b.options.easing,function(){a.hide();e.effects.restore(a,l);e.effects.removeWrapper(a);
|
||||||
|
b.callback&&b.callback.apply(this,arguments)})}else{j={};k={};j[f]=(d=="pos"?"-=":"+=")+c;k[f]=(d=="pos"?"+=":"-=")+c;a.animate(j,i/2,b.options.easing).animate(k,i/2,b.options.easing,function(){e.effects.restore(a,l);e.effects.removeWrapper(a);b.callback&&b.callback.apply(this,arguments)})}a.queue("fx",function(){a.dequeue()});a.dequeue()})}})(jQuery);
|
||||||
|
;/*
|
||||||
|
* jQuery UI Effects Clip 1.8.16
|
||||||
|
*
|
||||||
|
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Effects/Clip
|
||||||
|
*
|
||||||
|
* Depends:
|
||||||
|
* jquery.effects.core.js
|
||||||
|
*/
|
||||||
|
(function(b){b.effects.clip=function(e){return this.queue(function(){var a=b(this),i=["position","top","bottom","left","right","height","width"],f=b.effects.setMode(a,e.options.mode||"hide"),c=e.options.direction||"vertical";b.effects.save(a,i);a.show();var d=b.effects.createWrapper(a).css({overflow:"hidden"});d=a[0].tagName=="IMG"?d:a;var g={size:c=="vertical"?"height":"width",position:c=="vertical"?"top":"left"};c=c=="vertical"?d.height():d.width();if(f=="show"){d.css(g.size,0);d.css(g.position,
|
||||||
|
c/2)}var h={};h[g.size]=f=="show"?c:0;h[g.position]=f=="show"?0:c/2;d.animate(h,{queue:false,duration:e.duration,easing:e.options.easing,complete:function(){f=="hide"&&a.hide();b.effects.restore(a,i);b.effects.removeWrapper(a);e.callback&&e.callback.apply(a[0],arguments);a.dequeue()}})})}})(jQuery);
|
||||||
|
;/*
|
||||||
|
* jQuery UI Effects Drop 1.8.16
|
||||||
|
*
|
||||||
|
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Effects/Drop
|
||||||
|
*
|
||||||
|
* Depends:
|
||||||
|
* jquery.effects.core.js
|
||||||
|
*/
|
||||||
|
(function(c){c.effects.drop=function(d){return this.queue(function(){var a=c(this),h=["position","top","bottom","left","right","opacity"],e=c.effects.setMode(a,d.options.mode||"hide"),b=d.options.direction||"left";c.effects.save(a,h);a.show();c.effects.createWrapper(a);var f=b=="up"||b=="down"?"top":"left";b=b=="up"||b=="left"?"pos":"neg";var g=d.options.distance||(f=="top"?a.outerHeight({margin:true})/2:a.outerWidth({margin:true})/2);if(e=="show")a.css("opacity",0).css(f,b=="pos"?-g:g);var i={opacity:e==
|
||||||
|
"show"?1:0};i[f]=(e=="show"?b=="pos"?"+=":"-=":b=="pos"?"-=":"+=")+g;a.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){e=="hide"&&a.hide();c.effects.restore(a,h);c.effects.removeWrapper(a);d.callback&&d.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
|
||||||
|
;/*
|
||||||
|
* jQuery UI Effects Explode 1.8.16
|
||||||
|
*
|
||||||
|
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Effects/Explode
|
||||||
|
*
|
||||||
|
* Depends:
|
||||||
|
* jquery.effects.core.js
|
||||||
|
*/
|
||||||
|
(function(j){j.effects.explode=function(a){return this.queue(function(){var c=a.options.pieces?Math.round(Math.sqrt(a.options.pieces)):3,d=a.options.pieces?Math.round(Math.sqrt(a.options.pieces)):3;a.options.mode=a.options.mode=="toggle"?j(this).is(":visible")?"hide":"show":a.options.mode;var b=j(this).show().css("visibility","hidden"),g=b.offset();g.top-=parseInt(b.css("marginTop"),10)||0;g.left-=parseInt(b.css("marginLeft"),10)||0;for(var h=b.outerWidth(true),i=b.outerHeight(true),e=0;e<c;e++)for(var f=
|
||||||
|
0;f<d;f++)b.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-f*(h/d),top:-e*(i/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:h/d,height:i/c,left:g.left+f*(h/d)+(a.options.mode=="show"?(f-Math.floor(d/2))*(h/d):0),top:g.top+e*(i/c)+(a.options.mode=="show"?(e-Math.floor(c/2))*(i/c):0),opacity:a.options.mode=="show"?0:1}).animate({left:g.left+f*(h/d)+(a.options.mode=="show"?0:(f-Math.floor(d/2))*(h/d)),top:g.top+
|
||||||
|
e*(i/c)+(a.options.mode=="show"?0:(e-Math.floor(c/2))*(i/c)),opacity:a.options.mode=="show"?1:0},a.duration||500);setTimeout(function(){a.options.mode=="show"?b.css({visibility:"visible"}):b.css({visibility:"visible"}).hide();a.callback&&a.callback.apply(b[0]);b.dequeue();j("div.ui-effects-explode").remove()},a.duration||500)})}})(jQuery);
|
||||||
|
;/*
|
||||||
|
* jQuery UI Effects Fade 1.8.16
|
||||||
|
*
|
||||||
|
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Effects/Fade
|
||||||
|
*
|
||||||
|
* Depends:
|
||||||
|
* jquery.effects.core.js
|
||||||
|
*/
|
||||||
|
(function(b){b.effects.fade=function(a){return this.queue(function(){var c=b(this),d=b.effects.setMode(c,a.options.mode||"hide");c.animate({opacity:d},{queue:false,duration:a.duration,easing:a.options.easing,complete:function(){a.callback&&a.callback.apply(this,arguments);c.dequeue()}})})}})(jQuery);
|
||||||
|
;/*
|
||||||
|
* jQuery UI Effects Fold 1.8.16
|
||||||
|
*
|
||||||
|
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Effects/Fold
|
||||||
|
*
|
||||||
|
* Depends:
|
||||||
|
* jquery.effects.core.js
|
||||||
|
*/
|
||||||
|
(function(c){c.effects.fold=function(a){return this.queue(function(){var b=c(this),j=["position","top","bottom","left","right"],d=c.effects.setMode(b,a.options.mode||"hide"),g=a.options.size||15,h=!!a.options.horizFirst,k=a.duration?a.duration/2:c.fx.speeds._default/2;c.effects.save(b,j);b.show();var e=c.effects.createWrapper(b).css({overflow:"hidden"}),f=d=="show"!=h,l=f?["width","height"]:["height","width"];f=f?[e.width(),e.height()]:[e.height(),e.width()];var i=/([0-9]+)%/.exec(g);if(i)g=parseInt(i[1],
|
||||||
|
10)/100*f[d=="hide"?0:1];if(d=="show")e.css(h?{height:0,width:g}:{height:g,width:0});h={};i={};h[l[0]]=d=="show"?f[0]:g;i[l[1]]=d=="show"?f[1]:0;e.animate(h,k,a.options.easing).animate(i,k,a.options.easing,function(){d=="hide"&&b.hide();c.effects.restore(b,j);c.effects.removeWrapper(b);a.callback&&a.callback.apply(b[0],arguments);b.dequeue()})})}})(jQuery);
|
||||||
|
;/*
|
||||||
|
* jQuery UI Effects Highlight 1.8.16
|
||||||
|
*
|
||||||
|
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Effects/Highlight
|
||||||
|
*
|
||||||
|
* Depends:
|
||||||
|
* jquery.effects.core.js
|
||||||
|
*/
|
||||||
|
(function(b){b.effects.highlight=function(c){return this.queue(function(){var a=b(this),e=["backgroundImage","backgroundColor","opacity"],d=b.effects.setMode(a,c.options.mode||"show"),f={backgroundColor:a.css("backgroundColor")};if(d=="hide")f.opacity=0;b.effects.save(a,e);a.show().css({backgroundImage:"none",backgroundColor:c.options.color||"#ffff99"}).animate(f,{queue:false,duration:c.duration,easing:c.options.easing,complete:function(){d=="hide"&&a.hide();b.effects.restore(a,e);d=="show"&&!b.support.opacity&&
|
||||||
|
this.style.removeAttribute("filter");c.callback&&c.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
|
||||||
|
;/*
|
||||||
|
* jQuery UI Effects Pulsate 1.8.16
|
||||||
|
*
|
||||||
|
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Effects/Pulsate
|
||||||
|
*
|
||||||
|
* Depends:
|
||||||
|
* jquery.effects.core.js
|
||||||
|
*/
|
||||||
|
(function(d){d.effects.pulsate=function(a){return this.queue(function(){var b=d(this),c=d.effects.setMode(b,a.options.mode||"show");times=(a.options.times||5)*2-1;duration=a.duration?a.duration/2:d.fx.speeds._default/2;isVisible=b.is(":visible");animateTo=0;if(!isVisible){b.css("opacity",0).show();animateTo=1}if(c=="hide"&&isVisible||c=="show"&&!isVisible)times--;for(c=0;c<times;c++){b.animate({opacity:animateTo},duration,a.options.easing);animateTo=(animateTo+1)%2}b.animate({opacity:animateTo},duration,
|
||||||
|
a.options.easing,function(){animateTo==0&&b.hide();a.callback&&a.callback.apply(this,arguments)});b.queue("fx",function(){b.dequeue()}).dequeue()})}})(jQuery);
|
||||||
|
;/*
|
||||||
|
* jQuery UI Effects Scale 1.8.16
|
||||||
|
*
|
||||||
|
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Effects/Scale
|
||||||
|
*
|
||||||
|
* Depends:
|
||||||
|
* jquery.effects.core.js
|
||||||
|
*/
|
||||||
|
(function(c){c.effects.puff=function(b){return this.queue(function(){var a=c(this),e=c.effects.setMode(a,b.options.mode||"hide"),g=parseInt(b.options.percent,10)||150,h=g/100,i={height:a.height(),width:a.width()};c.extend(b.options,{fade:true,mode:e,percent:e=="hide"?g:100,from:e=="hide"?i:{height:i.height*h,width:i.width*h}});a.effect("scale",b.options,b.duration,b.callback);a.dequeue()})};c.effects.scale=function(b){return this.queue(function(){var a=c(this),e=c.extend(true,{},b.options),g=c.effects.setMode(a,
|
||||||
|
b.options.mode||"effect"),h=parseInt(b.options.percent,10)||(parseInt(b.options.percent,10)==0?0:g=="hide"?0:100),i=b.options.direction||"both",f=b.options.origin;if(g!="effect"){e.origin=f||["middle","center"];e.restore=true}f={height:a.height(),width:a.width()};a.from=b.options.from||(g=="show"?{height:0,width:0}:f);h={y:i!="horizontal"?h/100:1,x:i!="vertical"?h/100:1};a.to={height:f.height*h.y,width:f.width*h.x};if(b.options.fade){if(g=="show"){a.from.opacity=0;a.to.opacity=1}if(g=="hide"){a.from.opacity=
|
||||||
|
1;a.to.opacity=0}}e.from=a.from;e.to=a.to;e.mode=g;a.effect("size",e,b.duration,b.callback);a.dequeue()})};c.effects.size=function(b){return this.queue(function(){var a=c(this),e=["position","top","bottom","left","right","width","height","overflow","opacity"],g=["position","top","bottom","left","right","overflow","opacity"],h=["width","height","overflow"],i=["fontSize"],f=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],k=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],
|
||||||
|
p=c.effects.setMode(a,b.options.mode||"effect"),n=b.options.restore||false,m=b.options.scale||"both",l=b.options.origin,j={height:a.height(),width:a.width()};a.from=b.options.from||j;a.to=b.options.to||j;if(l){l=c.effects.getBaseline(l,j);a.from.top=(j.height-a.from.height)*l.y;a.from.left=(j.width-a.from.width)*l.x;a.to.top=(j.height-a.to.height)*l.y;a.to.left=(j.width-a.to.width)*l.x}var d={from:{y:a.from.height/j.height,x:a.from.width/j.width},to:{y:a.to.height/j.height,x:a.to.width/j.width}};
|
||||||
|
if(m=="box"||m=="both"){if(d.from.y!=d.to.y){e=e.concat(f);a.from=c.effects.setTransition(a,f,d.from.y,a.from);a.to=c.effects.setTransition(a,f,d.to.y,a.to)}if(d.from.x!=d.to.x){e=e.concat(k);a.from=c.effects.setTransition(a,k,d.from.x,a.from);a.to=c.effects.setTransition(a,k,d.to.x,a.to)}}if(m=="content"||m=="both")if(d.from.y!=d.to.y){e=e.concat(i);a.from=c.effects.setTransition(a,i,d.from.y,a.from);a.to=c.effects.setTransition(a,i,d.to.y,a.to)}c.effects.save(a,n?e:g);a.show();c.effects.createWrapper(a);
|
||||||
|
a.css("overflow","hidden").css(a.from);if(m=="content"||m=="both"){f=f.concat(["marginTop","marginBottom"]).concat(i);k=k.concat(["marginLeft","marginRight"]);h=e.concat(f).concat(k);a.find("*[width]").each(function(){child=c(this);n&&c.effects.save(child,h);var o={height:child.height(),width:child.width()};child.from={height:o.height*d.from.y,width:o.width*d.from.x};child.to={height:o.height*d.to.y,width:o.width*d.to.x};if(d.from.y!=d.to.y){child.from=c.effects.setTransition(child,f,d.from.y,child.from);
|
||||||
|
child.to=c.effects.setTransition(child,f,d.to.y,child.to)}if(d.from.x!=d.to.x){child.from=c.effects.setTransition(child,k,d.from.x,child.from);child.to=c.effects.setTransition(child,k,d.to.x,child.to)}child.css(child.from);child.animate(child.to,b.duration,b.options.easing,function(){n&&c.effects.restore(child,h)})})}a.animate(a.to,{queue:false,duration:b.duration,easing:b.options.easing,complete:function(){a.to.opacity===0&&a.css("opacity",a.from.opacity);p=="hide"&&a.hide();c.effects.restore(a,
|
||||||
|
n?e:g);c.effects.removeWrapper(a);b.callback&&b.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
|
||||||
|
;/*
|
||||||
|
* jQuery UI Effects Shake 1.8.16
|
||||||
|
*
|
||||||
|
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Effects/Shake
|
||||||
|
*
|
||||||
|
* Depends:
|
||||||
|
* jquery.effects.core.js
|
||||||
|
*/
|
||||||
|
(function(d){d.effects.shake=function(a){return this.queue(function(){var b=d(this),j=["position","top","bottom","left","right"];d.effects.setMode(b,a.options.mode||"effect");var c=a.options.direction||"left",e=a.options.distance||20,l=a.options.times||3,f=a.duration||a.options.duration||140;d.effects.save(b,j);b.show();d.effects.createWrapper(b);var g=c=="up"||c=="down"?"top":"left",h=c=="up"||c=="left"?"pos":"neg";c={};var i={},k={};c[g]=(h=="pos"?"-=":"+=")+e;i[g]=(h=="pos"?"+=":"-=")+e*2;k[g]=
|
||||||
|
(h=="pos"?"-=":"+=")+e*2;b.animate(c,f,a.options.easing);for(e=1;e<l;e++)b.animate(i,f,a.options.easing).animate(k,f,a.options.easing);b.animate(i,f,a.options.easing).animate(c,f/2,a.options.easing,function(){d.effects.restore(b,j);d.effects.removeWrapper(b);a.callback&&a.callback.apply(this,arguments)});b.queue("fx",function(){b.dequeue()});b.dequeue()})}})(jQuery);
|
||||||
|
;/*
|
||||||
|
* jQuery UI Effects Slide 1.8.16
|
||||||
|
*
|
||||||
|
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Effects/Slide
|
||||||
|
*
|
||||||
|
* Depends:
|
||||||
|
* jquery.effects.core.js
|
||||||
|
*/
|
||||||
|
(function(c){c.effects.slide=function(d){return this.queue(function(){var a=c(this),h=["position","top","bottom","left","right"],f=c.effects.setMode(a,d.options.mode||"show"),b=d.options.direction||"left";c.effects.save(a,h);a.show();c.effects.createWrapper(a).css({overflow:"hidden"});var g=b=="up"||b=="down"?"top":"left";b=b=="up"||b=="left"?"pos":"neg";var e=d.options.distance||(g=="top"?a.outerHeight({margin:true}):a.outerWidth({margin:true}));if(f=="show")a.css(g,b=="pos"?isNaN(e)?"-"+e:-e:e);
|
||||||
|
var i={};i[g]=(f=="show"?b=="pos"?"+=":"-=":b=="pos"?"-=":"+=")+e;a.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){f=="hide"&&a.hide();c.effects.restore(a,h);c.effects.removeWrapper(a);d.callback&&d.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
|
||||||
|
;/*
|
||||||
|
* jQuery UI Effects Transfer 1.8.16
|
||||||
|
*
|
||||||
|
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Effects/Transfer
|
||||||
|
*
|
||||||
|
* Depends:
|
||||||
|
* jquery.effects.core.js
|
||||||
|
*/
|
||||||
|
(function(e){e.effects.transfer=function(a){return this.queue(function(){var b=e(this),c=e(a.options.to),d=c.offset();c={top:d.top,left:d.left,height:c.innerHeight(),width:c.innerWidth()};d=b.offset();var f=e('<div class="ui-effects-transfer"></div>').appendTo(document.body).addClass(a.options.className).css({top:d.top,left:d.left,height:b.innerHeight(),width:b.innerWidth(),position:"absolute"}).animate(c,a.duration,a.options.easing,function(){f.remove();a.callback&&a.callback.apply(b[0],arguments);
|
||||||
|
b.dequeue()})})}})(jQuery);
|
||||||
|
;
|
402
static/sg/lib/jquery.event.drag-2.2.js
Normal file
|
@ -0,0 +1,402 @@
|
||||||
|
/*!
|
||||||
|
* jquery.event.drag - v 2.2
|
||||||
|
* Copyright (c) 2010 Three Dub Media - http://threedubmedia.com
|
||||||
|
* Open Source MIT License - http://threedubmedia.com/code/license
|
||||||
|
*/
|
||||||
|
// Created: 2008-06-04
|
||||||
|
// Updated: 2012-05-21
|
||||||
|
// REQUIRES: jquery 1.7.x
|
||||||
|
|
||||||
|
;(function( $ ){
|
||||||
|
|
||||||
|
// add the jquery instance method
|
||||||
|
$.fn.drag = function( str, arg, opts ){
|
||||||
|
// figure out the event type
|
||||||
|
var type = typeof str == "string" ? str : "",
|
||||||
|
// figure out the event handler...
|
||||||
|
fn = $.isFunction( str ) ? str : $.isFunction( arg ) ? arg : null;
|
||||||
|
// fix the event type
|
||||||
|
if ( type.indexOf("drag") !== 0 )
|
||||||
|
type = "drag"+ type;
|
||||||
|
// were options passed
|
||||||
|
opts = ( str == fn ? arg : opts ) || {};
|
||||||
|
// trigger or bind event handler
|
||||||
|
return fn ? this.bind( type, opts, fn ) : this.trigger( type );
|
||||||
|
};
|
||||||
|
|
||||||
|
// local refs (increase compression)
|
||||||
|
var $event = $.event,
|
||||||
|
$special = $event.special,
|
||||||
|
// configure the drag special event
|
||||||
|
drag = $special.drag = {
|
||||||
|
|
||||||
|
// these are the default settings
|
||||||
|
defaults: {
|
||||||
|
which: 1, // mouse button pressed to start drag sequence
|
||||||
|
distance: 0, // distance dragged before dragstart
|
||||||
|
not: ':input', // selector to suppress dragging on target elements
|
||||||
|
handle: null, // selector to match handle target elements
|
||||||
|
relative: false, // true to use "position", false to use "offset"
|
||||||
|
drop: true, // false to suppress drop events, true or selector to allow
|
||||||
|
click: false // false to suppress click events after dragend (no proxy)
|
||||||
|
},
|
||||||
|
|
||||||
|
// the key name for stored drag data
|
||||||
|
datakey: "dragdata",
|
||||||
|
|
||||||
|
// prevent bubbling for better performance
|
||||||
|
noBubble: true,
|
||||||
|
|
||||||
|
// count bound related events
|
||||||
|
add: function( obj ){
|
||||||
|
// read the interaction data
|
||||||
|
var data = $.data( this, drag.datakey ),
|
||||||
|
// read any passed options
|
||||||
|
opts = obj.data || {};
|
||||||
|
// count another realted event
|
||||||
|
data.related += 1;
|
||||||
|
// extend data options bound with this event
|
||||||
|
// don't iterate "opts" in case it is a node
|
||||||
|
$.each( drag.defaults, function( key, def ){
|
||||||
|
if ( opts[ key ] !== undefined )
|
||||||
|
data[ key ] = opts[ key ];
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
// forget unbound related events
|
||||||
|
remove: function(){
|
||||||
|
$.data( this, drag.datakey ).related -= 1;
|
||||||
|
},
|
||||||
|
|
||||||
|
// configure interaction, capture settings
|
||||||
|
setup: function(){
|
||||||
|
// check for related events
|
||||||
|
if ( $.data( this, drag.datakey ) )
|
||||||
|
return;
|
||||||
|
// initialize the drag data with copied defaults
|
||||||
|
var data = $.extend({ related:0 }, drag.defaults );
|
||||||
|
// store the interaction data
|
||||||
|
$.data( this, drag.datakey, data );
|
||||||
|
// bind the mousedown event, which starts drag interactions
|
||||||
|
$event.add( this, "touchstart mousedown", drag.init, data );
|
||||||
|
// prevent image dragging in IE...
|
||||||
|
if ( this.attachEvent )
|
||||||
|
this.attachEvent("ondragstart", drag.dontstart );
|
||||||
|
},
|
||||||
|
|
||||||
|
// destroy configured interaction
|
||||||
|
teardown: function(){
|
||||||
|
var data = $.data( this, drag.datakey ) || {};
|
||||||
|
// check for related events
|
||||||
|
if ( data.related )
|
||||||
|
return;
|
||||||
|
// remove the stored data
|
||||||
|
$.removeData( this, drag.datakey );
|
||||||
|
// remove the mousedown event
|
||||||
|
$event.remove( this, "touchstart mousedown", drag.init );
|
||||||
|
// enable text selection
|
||||||
|
drag.textselect( true );
|
||||||
|
// un-prevent image dragging in IE...
|
||||||
|
if ( this.detachEvent )
|
||||||
|
this.detachEvent("ondragstart", drag.dontstart );
|
||||||
|
},
|
||||||
|
|
||||||
|
// initialize the interaction
|
||||||
|
init: function( event ){
|
||||||
|
// sorry, only one touch at a time
|
||||||
|
if ( drag.touched )
|
||||||
|
return;
|
||||||
|
// the drag/drop interaction data
|
||||||
|
var dd = event.data, results;
|
||||||
|
// check the which directive
|
||||||
|
if ( event.which != 0 && dd.which > 0 && event.which != dd.which )
|
||||||
|
return;
|
||||||
|
// check for suppressed selector
|
||||||
|
if ( $( event.target ).is( dd.not ) )
|
||||||
|
return;
|
||||||
|
// check for handle selector
|
||||||
|
if ( dd.handle && !$( event.target ).closest( dd.handle, event.currentTarget ).length )
|
||||||
|
return;
|
||||||
|
|
||||||
|
drag.touched = event.type == 'touchstart' ? this : null;
|
||||||
|
dd.propagates = 1;
|
||||||
|
dd.mousedown = this;
|
||||||
|
dd.interactions = [ drag.interaction( this, dd ) ];
|
||||||
|
dd.target = event.target;
|
||||||
|
dd.pageX = event.pageX;
|
||||||
|
dd.pageY = event.pageY;
|
||||||
|
dd.dragging = null;
|
||||||
|
// handle draginit event...
|
||||||
|
results = drag.hijack( event, "draginit", dd );
|
||||||
|
// early cancel
|
||||||
|
if ( !dd.propagates )
|
||||||
|
return;
|
||||||
|
// flatten the result set
|
||||||
|
results = drag.flatten( results );
|
||||||
|
// insert new interaction elements
|
||||||
|
if ( results && results.length ){
|
||||||
|
dd.interactions = [];
|
||||||
|
$.each( results, function(){
|
||||||
|
dd.interactions.push( drag.interaction( this, dd ) );
|
||||||
|
});
|
||||||
|
}
|
||||||
|
// remember how many interactions are propagating
|
||||||
|
dd.propagates = dd.interactions.length;
|
||||||
|
// locate and init the drop targets
|
||||||
|
if ( dd.drop !== false && $special.drop )
|
||||||
|
$special.drop.handler( event, dd );
|
||||||
|
// disable text selection
|
||||||
|
drag.textselect( false );
|
||||||
|
// bind additional events...
|
||||||
|
if ( drag.touched )
|
||||||
|
$event.add( drag.touched, "touchmove touchend", drag.handler, dd );
|
||||||
|
else
|
||||||
|
$event.add( document, "mousemove mouseup", drag.handler, dd );
|
||||||
|
// helps prevent text selection or scrolling
|
||||||
|
if ( !drag.touched || dd.live )
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
|
||||||
|
// returns an interaction object
|
||||||
|
interaction: function( elem, dd ){
|
||||||
|
var offset = $( elem )[ dd.relative ? "position" : "offset" ]() || { top:0, left:0 };
|
||||||
|
return {
|
||||||
|
drag: elem,
|
||||||
|
callback: new drag.callback(),
|
||||||
|
droppable: [],
|
||||||
|
offset: offset
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
// handle drag-releatd DOM events
|
||||||
|
handler: function( event ){
|
||||||
|
// read the data before hijacking anything
|
||||||
|
var dd = event.data;
|
||||||
|
// handle various events
|
||||||
|
switch ( event.type ){
|
||||||
|
// mousemove, check distance, start dragging
|
||||||
|
case !dd.dragging && 'touchmove':
|
||||||
|
event.preventDefault();
|
||||||
|
case !dd.dragging && 'mousemove':
|
||||||
|
// drag tolerance, x≤ + y≤ = distance≤
|
||||||
|
if ( Math.pow( event.pageX-dd.pageX, 2 ) + Math.pow( event.pageY-dd.pageY, 2 ) < Math.pow( dd.distance, 2 ) )
|
||||||
|
break; // distance tolerance not reached
|
||||||
|
event.target = dd.target; // force target from "mousedown" event (fix distance issue)
|
||||||
|
drag.hijack( event, "dragstart", dd ); // trigger "dragstart"
|
||||||
|
if ( dd.propagates ) // "dragstart" not rejected
|
||||||
|
dd.dragging = true; // activate interaction
|
||||||
|
// mousemove, dragging
|
||||||
|
case 'touchmove':
|
||||||
|
event.preventDefault();
|
||||||
|
case 'mousemove':
|
||||||
|
if ( dd.dragging ){
|
||||||
|
// trigger "drag"
|
||||||
|
drag.hijack( event, "drag", dd );
|
||||||
|
if ( dd.propagates ){
|
||||||
|
// manage drop events
|
||||||
|
if ( dd.drop !== false && $special.drop )
|
||||||
|
$special.drop.handler( event, dd ); // "dropstart", "dropend"
|
||||||
|
break; // "drag" not rejected, stop
|
||||||
|
}
|
||||||
|
event.type = "mouseup"; // helps "drop" handler behave
|
||||||
|
}
|
||||||
|
// mouseup, stop dragging
|
||||||
|
case 'touchend':
|
||||||
|
case 'mouseup':
|
||||||
|
default:
|
||||||
|
if ( drag.touched )
|
||||||
|
$event.remove( drag.touched, "touchmove touchend", drag.handler ); // remove touch events
|
||||||
|
else
|
||||||
|
$event.remove( document, "mousemove mouseup", drag.handler ); // remove page events
|
||||||
|
if ( dd.dragging ){
|
||||||
|
if ( dd.drop !== false && $special.drop )
|
||||||
|
$special.drop.handler( event, dd ); // "drop"
|
||||||
|
drag.hijack( event, "dragend", dd ); // trigger "dragend"
|
||||||
|
}
|
||||||
|
drag.textselect( true ); // enable text selection
|
||||||
|
// if suppressing click events...
|
||||||
|
if ( dd.click === false && dd.dragging )
|
||||||
|
$.data( dd.mousedown, "suppress.click", new Date().getTime() + 5 );
|
||||||
|
dd.dragging = drag.touched = false; // deactivate element
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// re-use event object for custom events
|
||||||
|
hijack: function( event, type, dd, x, elem ){
|
||||||
|
// not configured
|
||||||
|
if ( !dd )
|
||||||
|
return;
|
||||||
|
// remember the original event and type
|
||||||
|
var orig = { event:event.originalEvent, type:event.type },
|
||||||
|
// is the event drag related or drog related?
|
||||||
|
mode = type.indexOf("drop") ? "drag" : "drop",
|
||||||
|
// iteration vars
|
||||||
|
result, i = x || 0, ia, $elems, callback,
|
||||||
|
len = !isNaN( x ) ? x : dd.interactions.length;
|
||||||
|
// modify the event type
|
||||||
|
event.type = type;
|
||||||
|
// remove the original event
|
||||||
|
event.originalEvent = null;
|
||||||
|
// initialize the results
|
||||||
|
dd.results = [];
|
||||||
|
// handle each interacted element
|
||||||
|
do if ( ia = dd.interactions[ i ] ){
|
||||||
|
// validate the interaction
|
||||||
|
if ( type !== "dragend" && ia.cancelled )
|
||||||
|
continue;
|
||||||
|
// set the dragdrop properties on the event object
|
||||||
|
callback = drag.properties( event, dd, ia );
|
||||||
|
// prepare for more results
|
||||||
|
ia.results = [];
|
||||||
|
// handle each element
|
||||||
|
$( elem || ia[ mode ] || dd.droppable ).each(function( p, subject ){
|
||||||
|
// identify drag or drop targets individually
|
||||||
|
callback.target = subject;
|
||||||
|
// force propagtion of the custom event
|
||||||
|
event.isPropagationStopped = function(){ return false; };
|
||||||
|
// handle the event
|
||||||
|
result = subject ? $event.dispatch.call( subject, event, callback ) : null;
|
||||||
|
// stop the drag interaction for this element
|
||||||
|
if ( result === false ){
|
||||||
|
if ( mode == "drag" ){
|
||||||
|
ia.cancelled = true;
|
||||||
|
dd.propagates -= 1;
|
||||||
|
}
|
||||||
|
if ( type == "drop" ){
|
||||||
|
ia[ mode ][p] = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// assign any dropinit elements
|
||||||
|
else if ( type == "dropinit" )
|
||||||
|
ia.droppable.push( drag.element( result ) || subject );
|
||||||
|
// accept a returned proxy element
|
||||||
|
if ( type == "dragstart" )
|
||||||
|
ia.proxy = $( drag.element( result ) || ia.drag )[0];
|
||||||
|
// remember this result
|
||||||
|
ia.results.push( result );
|
||||||
|
// forget the event result, for recycling
|
||||||
|
delete event.result;
|
||||||
|
// break on cancelled handler
|
||||||
|
if ( type !== "dropinit" )
|
||||||
|
return result;
|
||||||
|
});
|
||||||
|
// flatten the results
|
||||||
|
dd.results[ i ] = drag.flatten( ia.results );
|
||||||
|
// accept a set of valid drop targets
|
||||||
|
if ( type == "dropinit" )
|
||||||
|
ia.droppable = drag.flatten( ia.droppable );
|
||||||
|
// locate drop targets
|
||||||
|
if ( type == "dragstart" && !ia.cancelled )
|
||||||
|
callback.update();
|
||||||
|
}
|
||||||
|
while ( ++i < len )
|
||||||
|
// restore the original event & type
|
||||||
|
event.type = orig.type;
|
||||||
|
event.originalEvent = orig.event;
|
||||||
|
// return all handler results
|
||||||
|
return drag.flatten( dd.results );
|
||||||
|
},
|
||||||
|
|
||||||
|
// extend the callback object with drag/drop properties...
|
||||||
|
properties: function( event, dd, ia ){
|
||||||
|
var obj = ia.callback;
|
||||||
|
// elements
|
||||||
|
obj.drag = ia.drag;
|
||||||
|
obj.proxy = ia.proxy || ia.drag;
|
||||||
|
// starting mouse position
|
||||||
|
obj.startX = dd.pageX;
|
||||||
|
obj.startY = dd.pageY;
|
||||||
|
// current distance dragged
|
||||||
|
obj.deltaX = event.pageX - dd.pageX;
|
||||||
|
obj.deltaY = event.pageY - dd.pageY;
|
||||||
|
// original element position
|
||||||
|
obj.originalX = ia.offset.left;
|
||||||
|
obj.originalY = ia.offset.top;
|
||||||
|
// adjusted element position
|
||||||
|
obj.offsetX = obj.originalX + obj.deltaX;
|
||||||
|
obj.offsetY = obj.originalY + obj.deltaY;
|
||||||
|
// assign the drop targets information
|
||||||
|
obj.drop = drag.flatten( ( ia.drop || [] ).slice() );
|
||||||
|
obj.available = drag.flatten( ( ia.droppable || [] ).slice() );
|
||||||
|
return obj;
|
||||||
|
},
|
||||||
|
|
||||||
|
// determine is the argument is an element or jquery instance
|
||||||
|
element: function( arg ){
|
||||||
|
if ( arg && ( arg.jquery || arg.nodeType == 1 ) )
|
||||||
|
return arg;
|
||||||
|
},
|
||||||
|
|
||||||
|
// flatten nested jquery objects and arrays into a single dimension array
|
||||||
|
flatten: function( arr ){
|
||||||
|
return $.map( arr, function( member ){
|
||||||
|
return member && member.jquery ? $.makeArray( member ) :
|
||||||
|
member && member.length ? drag.flatten( member ) : member;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
// toggles text selection attributes ON (true) or OFF (false)
|
||||||
|
textselect: function( bool ){
|
||||||
|
$( document )[ bool ? "unbind" : "bind" ]("selectstart", drag.dontstart )
|
||||||
|
.css("MozUserSelect", bool ? "" : "none" );
|
||||||
|
// .attr("unselectable", bool ? "off" : "on" )
|
||||||
|
document.unselectable = bool ? "off" : "on";
|
||||||
|
},
|
||||||
|
|
||||||
|
// suppress "selectstart" and "ondragstart" events
|
||||||
|
dontstart: function(){
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
|
||||||
|
// a callback instance contructor
|
||||||
|
callback: function(){}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
// callback methods
|
||||||
|
drag.callback.prototype = {
|
||||||
|
update: function(){
|
||||||
|
if ( $special.drop && this.available.length )
|
||||||
|
$.each( this.available, function( i ){
|
||||||
|
$special.drop.locate( this, i );
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// patch $.event.$dispatch to allow suppressing clicks
|
||||||
|
var $dispatch = $event.dispatch;
|
||||||
|
$event.dispatch = function( event ){
|
||||||
|
if ( $.data( this, "suppress."+ event.type ) - new Date().getTime() > 0 ){
|
||||||
|
$.removeData( this, "suppress."+ event.type );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
return $dispatch.apply( this, arguments );
|
||||||
|
};
|
||||||
|
|
||||||
|
// event fix hooks for touch events...
|
||||||
|
var touchHooks =
|
||||||
|
$event.fixHooks.touchstart =
|
||||||
|
$event.fixHooks.touchmove =
|
||||||
|
$event.fixHooks.touchend =
|
||||||
|
$event.fixHooks.touchcancel = {
|
||||||
|
props: "clientX clientY pageX pageY screenX screenY".split( " " ),
|
||||||
|
filter: function( event, orig ) {
|
||||||
|
if ( orig ){
|
||||||
|
var touched = ( orig.touches && orig.touches[0] )
|
||||||
|
|| ( orig.changedTouches && orig.changedTouches[0] )
|
||||||
|
|| null;
|
||||||
|
// iOS webkit: touchstart, touchmove, touchend
|
||||||
|
if ( touched )
|
||||||
|
$.each( touchHooks.props, function( i, prop ){
|
||||||
|
event[ prop ] = touched[ prop ];
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return event;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// share the same special event configuration with related events...
|
||||||
|
$special.draginit = $special.dragstart = $special.dragend = drag;
|
||||||
|
|
||||||
|
})( jQuery );
|
302
static/sg/lib/jquery.event.drop-2.2.js
Normal file
|
@ -0,0 +1,302 @@
|
||||||
|
/*!
|
||||||
|
* jquery.event.drop - v 2.2
|
||||||
|
* Copyright (c) 2010 Three Dub Media - http://threedubmedia.com
|
||||||
|
* Open Source MIT License - http://threedubmedia.com/code/license
|
||||||
|
*/
|
||||||
|
// Created: 2008-06-04
|
||||||
|
// Updated: 2012-05-21
|
||||||
|
// REQUIRES: jquery 1.7.x, event.drag 2.2
|
||||||
|
|
||||||
|
;(function($){ // secure $ jQuery alias
|
||||||
|
|
||||||
|
// Events: drop, dropstart, dropend
|
||||||
|
|
||||||
|
// add the jquery instance method
|
||||||
|
$.fn.drop = function( str, arg, opts ){
|
||||||
|
// figure out the event type
|
||||||
|
var type = typeof str == "string" ? str : "",
|
||||||
|
// figure out the event handler...
|
||||||
|
fn = $.isFunction( str ) ? str : $.isFunction( arg ) ? arg : null;
|
||||||
|
// fix the event type
|
||||||
|
if ( type.indexOf("drop") !== 0 )
|
||||||
|
type = "drop"+ type;
|
||||||
|
// were options passed
|
||||||
|
opts = ( str == fn ? arg : opts ) || {};
|
||||||
|
// trigger or bind event handler
|
||||||
|
return fn ? this.bind( type, opts, fn ) : this.trigger( type );
|
||||||
|
};
|
||||||
|
|
||||||
|
// DROP MANAGEMENT UTILITY
|
||||||
|
// returns filtered drop target elements, caches their positions
|
||||||
|
$.drop = function( opts ){
|
||||||
|
opts = opts || {};
|
||||||
|
// safely set new options...
|
||||||
|
drop.multi = opts.multi === true ? Infinity :
|
||||||
|
opts.multi === false ? 1 : !isNaN( opts.multi ) ? opts.multi : drop.multi;
|
||||||
|
drop.delay = opts.delay || drop.delay;
|
||||||
|
drop.tolerance = $.isFunction( opts.tolerance ) ? opts.tolerance :
|
||||||
|
opts.tolerance === null ? null : drop.tolerance;
|
||||||
|
drop.mode = opts.mode || drop.mode || 'intersect';
|
||||||
|
};
|
||||||
|
|
||||||
|
// local refs (increase compression)
|
||||||
|
var $event = $.event,
|
||||||
|
$special = $event.special,
|
||||||
|
// configure the drop special event
|
||||||
|
drop = $.event.special.drop = {
|
||||||
|
|
||||||
|
// these are the default settings
|
||||||
|
multi: 1, // allow multiple drop winners per dragged element
|
||||||
|
delay: 20, // async timeout delay
|
||||||
|
mode: 'overlap', // drop tolerance mode
|
||||||
|
|
||||||
|
// internal cache
|
||||||
|
targets: [],
|
||||||
|
|
||||||
|
// the key name for stored drop data
|
||||||
|
datakey: "dropdata",
|
||||||
|
|
||||||
|
// prevent bubbling for better performance
|
||||||
|
noBubble: true,
|
||||||
|
|
||||||
|
// count bound related events
|
||||||
|
add: function( obj ){
|
||||||
|
// read the interaction data
|
||||||
|
var data = $.data( this, drop.datakey );
|
||||||
|
// count another realted event
|
||||||
|
data.related += 1;
|
||||||
|
},
|
||||||
|
|
||||||
|
// forget unbound related events
|
||||||
|
remove: function(){
|
||||||
|
$.data( this, drop.datakey ).related -= 1;
|
||||||
|
},
|
||||||
|
|
||||||
|
// configure the interactions
|
||||||
|
setup: function(){
|
||||||
|
// check for related events
|
||||||
|
if ( $.data( this, drop.datakey ) )
|
||||||
|
return;
|
||||||
|
// initialize the drop element data
|
||||||
|
var data = {
|
||||||
|
related: 0,
|
||||||
|
active: [],
|
||||||
|
anyactive: 0,
|
||||||
|
winner: 0,
|
||||||
|
location: {}
|
||||||
|
};
|
||||||
|
// store the drop data on the element
|
||||||
|
$.data( this, drop.datakey, data );
|
||||||
|
// store the drop target in internal cache
|
||||||
|
drop.targets.push( this );
|
||||||
|
},
|
||||||
|
|
||||||
|
// destroy the configure interaction
|
||||||
|
teardown: function(){
|
||||||
|
var data = $.data( this, drop.datakey ) || {};
|
||||||
|
// check for related events
|
||||||
|
if ( data.related )
|
||||||
|
return;
|
||||||
|
// remove the stored data
|
||||||
|
$.removeData( this, drop.datakey );
|
||||||
|
// reference the targeted element
|
||||||
|
var element = this;
|
||||||
|
// remove from the internal cache
|
||||||
|
drop.targets = $.grep( drop.targets, function( target ){
|
||||||
|
return ( target !== element );
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
// shared event handler
|
||||||
|
handler: function( event, dd ){
|
||||||
|
// local vars
|
||||||
|
var results, $targets;
|
||||||
|
// make sure the right data is available
|
||||||
|
if ( !dd )
|
||||||
|
return;
|
||||||
|
// handle various events
|
||||||
|
switch ( event.type ){
|
||||||
|
// draginit, from $.event.special.drag
|
||||||
|
case 'mousedown': // DROPINIT >>
|
||||||
|
case 'touchstart': // DROPINIT >>
|
||||||
|
// collect and assign the drop targets
|
||||||
|
$targets = $( drop.targets );
|
||||||
|
if ( typeof dd.drop == "string" )
|
||||||
|
$targets = $targets.filter( dd.drop );
|
||||||
|
// reset drop data winner properties
|
||||||
|
$targets.each(function(){
|
||||||
|
var data = $.data( this, drop.datakey );
|
||||||
|
data.active = [];
|
||||||
|
data.anyactive = 0;
|
||||||
|
data.winner = 0;
|
||||||
|
});
|
||||||
|
// set available target elements
|
||||||
|
dd.droppable = $targets;
|
||||||
|
// activate drop targets for the initial element being dragged
|
||||||
|
$special.drag.hijack( event, "dropinit", dd );
|
||||||
|
break;
|
||||||
|
// drag, from $.event.special.drag
|
||||||
|
case 'mousemove': // TOLERATE >>
|
||||||
|
case 'touchmove': // TOLERATE >>
|
||||||
|
drop.event = event; // store the mousemove event
|
||||||
|
if ( !drop.timer )
|
||||||
|
// monitor drop targets
|
||||||
|
drop.tolerate( dd );
|
||||||
|
break;
|
||||||
|
// dragend, from $.event.special.drag
|
||||||
|
case 'mouseup': // DROP >> DROPEND >>
|
||||||
|
case 'touchend': // DROP >> DROPEND >>
|
||||||
|
drop.timer = clearTimeout( drop.timer ); // delete timer
|
||||||
|
if ( dd.propagates ){
|
||||||
|
$special.drag.hijack( event, "drop", dd );
|
||||||
|
$special.drag.hijack( event, "dropend", dd );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// returns the location positions of an element
|
||||||
|
locate: function( elem, index ){
|
||||||
|
var data = $.data( elem, drop.datakey ),
|
||||||
|
$elem = $( elem ),
|
||||||
|
posi = $elem.offset() || {},
|
||||||
|
height = $elem.outerHeight(),
|
||||||
|
width = $elem.outerWidth(),
|
||||||
|
location = {
|
||||||
|
elem: elem,
|
||||||
|
width: width,
|
||||||
|
height: height,
|
||||||
|
top: posi.top,
|
||||||
|
left: posi.left,
|
||||||
|
right: posi.left + width,
|
||||||
|
bottom: posi.top + height
|
||||||
|
};
|
||||||
|
// drag elements might not have dropdata
|
||||||
|
if ( data ){
|
||||||
|
data.location = location;
|
||||||
|
data.index = index;
|
||||||
|
data.elem = elem;
|
||||||
|
}
|
||||||
|
return location;
|
||||||
|
},
|
||||||
|
|
||||||
|
// test the location positions of an element against another OR an X,Y coord
|
||||||
|
contains: function( target, test ){ // target { location } contains test [x,y] or { location }
|
||||||
|
return ( ( test[0] || test.left ) >= target.left && ( test[0] || test.right ) <= target.right
|
||||||
|
&& ( test[1] || test.top ) >= target.top && ( test[1] || test.bottom ) <= target.bottom );
|
||||||
|
},
|
||||||
|
|
||||||
|
// stored tolerance modes
|
||||||
|
modes: { // fn scope: "$.event.special.drop" object
|
||||||
|
// target with mouse wins, else target with most overlap wins
|
||||||
|
'intersect': function( event, proxy, target ){
|
||||||
|
return this.contains( target, [ event.pageX, event.pageY ] ) ? // check cursor
|
||||||
|
1e9 : this.modes.overlap.apply( this, arguments ); // check overlap
|
||||||
|
},
|
||||||
|
// target with most overlap wins
|
||||||
|
'overlap': function( event, proxy, target ){
|
||||||
|
// calculate the area of overlap...
|
||||||
|
return Math.max( 0, Math.min( target.bottom, proxy.bottom ) - Math.max( target.top, proxy.top ) )
|
||||||
|
* Math.max( 0, Math.min( target.right, proxy.right ) - Math.max( target.left, proxy.left ) );
|
||||||
|
},
|
||||||
|
// proxy is completely contained within target bounds
|
||||||
|
'fit': function( event, proxy, target ){
|
||||||
|
return this.contains( target, proxy ) ? 1 : 0;
|
||||||
|
},
|
||||||
|
// center of the proxy is contained within target bounds
|
||||||
|
'middle': function( event, proxy, target ){
|
||||||
|
return this.contains( target, [ proxy.left + proxy.width * .5, proxy.top + proxy.height * .5 ] ) ? 1 : 0;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// sort drop target cache by by winner (dsc), then index (asc)
|
||||||
|
sort: function( a, b ){
|
||||||
|
return ( b.winner - a.winner ) || ( a.index - b.index );
|
||||||
|
},
|
||||||
|
|
||||||
|
// async, recursive tolerance execution
|
||||||
|
tolerate: function( dd ){
|
||||||
|
// declare local refs
|
||||||
|
var i, drp, drg, data, arr, len, elem,
|
||||||
|
// interaction iteration variables
|
||||||
|
x = 0, ia, end = dd.interactions.length,
|
||||||
|
// determine the mouse coords
|
||||||
|
xy = [ drop.event.pageX, drop.event.pageY ],
|
||||||
|
// custom or stored tolerance fn
|
||||||
|
tolerance = drop.tolerance || drop.modes[ drop.mode ];
|
||||||
|
// go through each passed interaction...
|
||||||
|
do if ( ia = dd.interactions[x] ){
|
||||||
|
// check valid interaction
|
||||||
|
if ( !ia )
|
||||||
|
return;
|
||||||
|
// initialize or clear the drop data
|
||||||
|
ia.drop = [];
|
||||||
|
// holds the drop elements
|
||||||
|
arr = [];
|
||||||
|
len = ia.droppable.length;
|
||||||
|
// determine the proxy location, if needed
|
||||||
|
if ( tolerance )
|
||||||
|
drg = drop.locate( ia.proxy );
|
||||||
|
// reset the loop
|
||||||
|
i = 0;
|
||||||
|
// loop each stored drop target
|
||||||
|
do if ( elem = ia.droppable[i] ){
|
||||||
|
data = $.data( elem, drop.datakey );
|
||||||
|
drp = data.location;
|
||||||
|
if ( !drp ) continue;
|
||||||
|
// find a winner: tolerance function is defined, call it
|
||||||
|
data.winner = tolerance ? tolerance.call( drop, drop.event, drg, drp )
|
||||||
|
// mouse position is always the fallback
|
||||||
|
: drop.contains( drp, xy ) ? 1 : 0;
|
||||||
|
arr.push( data );
|
||||||
|
} while ( ++i < len ); // loop
|
||||||
|
// sort the drop targets
|
||||||
|
arr.sort( drop.sort );
|
||||||
|
// reset the loop
|
||||||
|
i = 0;
|
||||||
|
// loop through all of the targets again
|
||||||
|
do if ( data = arr[ i ] ){
|
||||||
|
// winners...
|
||||||
|
if ( data.winner && ia.drop.length < drop.multi ){
|
||||||
|
// new winner... dropstart
|
||||||
|
if ( !data.active[x] && !data.anyactive ){
|
||||||
|
// check to make sure that this is not prevented
|
||||||
|
if ( $special.drag.hijack( drop.event, "dropstart", dd, x, data.elem )[0] !== false ){
|
||||||
|
data.active[x] = 1;
|
||||||
|
data.anyactive += 1;
|
||||||
|
}
|
||||||
|
// if false, it is not a winner
|
||||||
|
else
|
||||||
|
data.winner = 0;
|
||||||
|
}
|
||||||
|
// if it is still a winner
|
||||||
|
if ( data.winner )
|
||||||
|
ia.drop.push( data.elem );
|
||||||
|
}
|
||||||
|
// losers...
|
||||||
|
else if ( data.active[x] && data.anyactive == 1 ){
|
||||||
|
// former winner... dropend
|
||||||
|
$special.drag.hijack( drop.event, "dropend", dd, x, data.elem );
|
||||||
|
data.active[x] = 0;
|
||||||
|
data.anyactive -= 1;
|
||||||
|
}
|
||||||
|
} while ( ++i < len ); // loop
|
||||||
|
} while ( ++x < end ) // loop
|
||||||
|
// check if the mouse is still moving or is idle
|
||||||
|
if ( drop.last && xy[0] == drop.last.pageX && xy[1] == drop.last.pageY )
|
||||||
|
delete drop.timer; // idle, don't recurse
|
||||||
|
else // recurse
|
||||||
|
drop.timer = setTimeout(function(){
|
||||||
|
drop.tolerate( dd );
|
||||||
|
}, drop.delay );
|
||||||
|
// remember event, to compare idleness
|
||||||
|
drop.last = drop.event;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
// share the same special event configuration with related events...
|
||||||
|
$special.dropinit = $special.dropstart = $special.dropend = drop;
|
||||||
|
|
||||||
|
})(jQuery); // confine scope
|