fixws and 'new' button in grid query
This commit is contained in:
1 parent
01f6f82cdf
commit
d281acb421
305 files changed
+8352
-8032
No files matched your search
@@ -1 +1 @@
|
||||
Version 1.99.3 (2011-12-05 11:26:15) dev
|
||||
Version 1.99.3 (2011-12-05 11:39:10) dev
|
||||
@@ -1,3 +1,4 @@
|
||||
|
||||
|
||||
|
||||
|
||||
+28
-27
@@ -132,17 +132,17 @@ class Servers:
|
||||
def eventlet(app,address, **options):
|
||||
from eventlet import wsgi, listen
|
||||
wsgi.server(listen(address), app)
|
||||
|
||||
|
||||
@staticmethod
|
||||
def mongrel2(app,address,**options):
|
||||
import uuid
|
||||
sys.path.append(os.path.abspath(os.path.dirname(__file__)))
|
||||
from mongrel2 import handler
|
||||
conn = handler.Connection(str(uuid.uuid4()),
|
||||
conn = handler.Connection(str(uuid.uuid4()),
|
||||
"tcp://127.0.0.1:9997",
|
||||
"tcp://127.0.0.1:9996")
|
||||
mongrel2_handler(app,conn,debug=False)
|
||||
|
||||
|
||||
|
||||
def run(servername,ip,port,softcron=True,logging=False,profiler=None):
|
||||
if logging:
|
||||
@@ -161,8 +161,8 @@ def mongrel2_handler(application,conn,debug=False):
|
||||
Based on :
|
||||
https://github.com/berry/Mongrel2-WSGI-Handler/blob/master/wsgi-handler.py
|
||||
|
||||
WSGI handler based on the Python wsgiref SimpleHandler.
|
||||
A WSGI application should return a iterable op StringTypes.
|
||||
WSGI handler based on the Python wsgiref SimpleHandler.
|
||||
A WSGI application should return a iterable op StringTypes.
|
||||
Any encoding must be handled by the WSGI application itself.
|
||||
"""
|
||||
from wsgiref.handlers import SimpleHandler
|
||||
@@ -170,28 +170,28 @@ def mongrel2_handler(application,conn,debug=False):
|
||||
import cStringIO as StringIO
|
||||
except:
|
||||
import StringIO
|
||||
|
||||
# TODO - this wsgi handler executes the application and renders a page
|
||||
# in memory completely before returning it as a response to the client.
|
||||
# Thus, it does not "stream" the result back to the client. It should be
|
||||
# possible though. The SimpleHandler accepts file-like stream objects. So,
|
||||
# it should be just a matter of connecting 0MQ requests/response streams to
|
||||
# the SimpleHandler requests and response streams. However, the Python API
|
||||
# for Mongrel2 doesn't seem to support file-like stream objects for requests
|
||||
|
||||
# TODO - this wsgi handler executes the application and renders a page
|
||||
# in memory completely before returning it as a response to the client.
|
||||
# Thus, it does not "stream" the result back to the client. It should be
|
||||
# possible though. The SimpleHandler accepts file-like stream objects. So,
|
||||
# it should be just a matter of connecting 0MQ requests/response streams to
|
||||
# the SimpleHandler requests and response streams. However, the Python API
|
||||
# for Mongrel2 doesn't seem to support file-like stream objects for requests
|
||||
# and responses. Unless I have missed something.
|
||||
|
||||
|
||||
while True:
|
||||
if debug: print "WAITING FOR REQUEST"
|
||||
|
||||
|
||||
# receive a request
|
||||
req = conn.recv()
|
||||
if debug: print "REQUEST BODY: %r\n" % req.body
|
||||
|
||||
|
||||
if req.is_disconnect():
|
||||
if debug: print "DISCONNECT"
|
||||
continue #effectively ignore the disconnect from the client
|
||||
|
||||
# Set a couple of environment attributes a.k.a. header attributes
|
||||
|
||||
# Set a couple of environment attributes a.k.a. header attributes
|
||||
# that are a must according to PEP 333
|
||||
environ = req.headers
|
||||
environ['SERVER_PROTOCOL'] = 'HTTP/1.1' # SimpleHandler expects a server_protocol, lets assume it is HTTP 1.1
|
||||
@@ -211,21 +211,21 @@ def mongrel2_handler(application,conn,debug=False):
|
||||
if environ.has_key('Content-Length'):
|
||||
environ['CONTENT_LENGTH'] = environ['Content-Length'] # necessary for POST to work with Django
|
||||
environ['wsgi.input'] = req.body
|
||||
|
||||
|
||||
if debug: print "ENVIRON: %r\n" % environ
|
||||
|
||||
|
||||
# SimpleHandler needs file-like stream objects for
|
||||
# requests, errors and responses
|
||||
reqIO = StringIO.StringIO(req.body)
|
||||
errIO = StringIO.StringIO()
|
||||
respIO = StringIO.StringIO()
|
||||
|
||||
|
||||
# execute the application
|
||||
handler = SimpleHandler(reqIO, respIO, errIO, environ, multithread = False, multiprocess = False)
|
||||
handler.run(application)
|
||||
|
||||
|
||||
# Get the response and filter out the response (=data) itself,
|
||||
# the response headers,
|
||||
# the response headers,
|
||||
# the response status code and the response status description
|
||||
response = respIO.getvalue()
|
||||
response = response.split("\r\n")
|
||||
@@ -233,22 +233,22 @@ def mongrel2_handler(application,conn,debug=False):
|
||||
headers = dict([r.split(": ") for r in response[1:-2]])
|
||||
code = response[0][9:12]
|
||||
status = response[0][13:]
|
||||
|
||||
|
||||
# strip BOM's from response data
|
||||
# Especially the WSGI handler from Django seems to generate them (2 actually, huh?)
|
||||
# a BOM isn't really necessary and cause HTML parsing errors in Chrome and Safari
|
||||
# See also: http://www.xs4all.nl/~mechiel/projects/bomstrip/
|
||||
# Although I still find this a ugly hack, it does work.
|
||||
data = data.replace('\xef\xbb\xbf', '')
|
||||
|
||||
|
||||
# Get the generated errors
|
||||
errors = errIO.getvalue()
|
||||
|
||||
|
||||
# return the response
|
||||
if debug: print "RESPONSE: %r\n" % response
|
||||
if errors:
|
||||
if debug: print "ERRORS: %r" % errors
|
||||
data = "%s\r\n\r\n%s" % (data, errors)
|
||||
data = "%s\r\n\r\n%s" % (data, errors)
|
||||
conn.reply_http(req, data, code = code, status = status, headers = headers)
|
||||
|
||||
def main():
|
||||
@@ -298,3 +298,4 @@ def main():
|
||||
if __name__=='__main__':
|
||||
main()
|
||||
|
||||
|
||||
@@ -3,3 +3,4 @@ def webapp_add_wsgi_middleware(app):
|
||||
app = recording.appstats_wsgi_middleware(app)
|
||||
return app
|
||||
|
||||
|
||||
@@ -349,7 +349,7 @@ def ccache():
|
||||
seconds = math.floor(seconds)
|
||||
|
||||
return (hours, minutes, seconds)
|
||||
|
||||
|
||||
for key, value in cache.ram.storage.items():
|
||||
if isinstance(value, dict):
|
||||
ram['hits'] = value['hit_total'] - value['misses']
|
||||
@@ -388,7 +388,7 @@ def ccache():
|
||||
if value[0] < disk['oldest']:
|
||||
disk['oldest'] = value[0]
|
||||
disk['keys'].append((key, GetInHMS(time.time() - value[0])))
|
||||
|
||||
|
||||
finally:
|
||||
portalocker.unlock(locker)
|
||||
locker.close()
|
||||
@@ -417,14 +417,16 @@ def ccache():
|
||||
def key_table(keys):
|
||||
return TABLE(
|
||||
TR(TD(B('Key')), TD(B('Time in Cache (h:m:s)'))),
|
||||
*[TR(TD(k[0]), TD('%02d:%02d:%02d' % k[1])) for k in keys],
|
||||
*[TR(TD(k[0]), TD('%02d:%02d:%02d' % k[1])) for k in keys],
|
||||
**dict(_class='cache-keys',
|
||||
_style="border-collapse: separate; border-spacing: .5em;"))
|
||||
|
||||
|
||||
ram['keys'] = key_table(ram['keys'])
|
||||
disk['keys'] = key_table(disk['keys'])
|
||||
total['keys'] = key_table(total['keys'])
|
||||
|
||||
|
||||
return dict(form=form, total=total,
|
||||
ram=ram, disk=disk, object_stats=hp != False)
|
||||
|
||||
|
||||
|
||||
@@ -31,3 +31,5 @@ def reset():
|
||||
session['debug_commands:'+app] = []
|
||||
return 'done'
|
||||
|
||||
|
||||
|
||||
@@ -271,7 +271,7 @@ def uninstall():
|
||||
else:
|
||||
session.flash = T('no permission to uninstall "%s"', app)
|
||||
redirect(URL('site'))
|
||||
if app_uninstall(app, request):
|
||||
if app_uninstall(app, request):
|
||||
session.flash = T('application "%s" uninstalled', app)
|
||||
else:
|
||||
session.flash = T('unable to uninstall "%s"', app)
|
||||
@@ -946,7 +946,7 @@ def create_file():
|
||||
raise SyntaxError
|
||||
|
||||
msg = T('This is the %(filename)s template',
|
||||
dict(filename=filename))
|
||||
dict(filename=filename))
|
||||
if extension == 'html':
|
||||
text = dedent("""
|
||||
{{extend 'layout.html'}}
|
||||
@@ -958,7 +958,7 @@ def create_file():
|
||||
text = read_file(generic)
|
||||
else:
|
||||
text = ''
|
||||
|
||||
|
||||
elif path[-9:] == '/modules/':
|
||||
if request.vars.plugin and not filename.startswith('plugin_%s/' % request.vars.plugin):
|
||||
filename = 'plugin_%s/%s' % (request.vars.plugin, filename)
|
||||
@@ -1103,27 +1103,27 @@ def errors():
|
||||
decorated.sort(key=operator.itemgetter(0), reverse=True)
|
||||
|
||||
return dict(errors = [x[1] for x in decorated], app=app, method=method)
|
||||
|
||||
|
||||
elif method == 'dbnew':
|
||||
errors_path = apath('%s/errors' % app, r=request)
|
||||
tk_db, tk_table = get_ticket_storage(app)
|
||||
|
||||
|
||||
delete_hashes = []
|
||||
for item in request.vars:
|
||||
if item[:7] == 'delete_':
|
||||
delete_hashes.append(item[7:])
|
||||
|
||||
hash2error = dict()
|
||||
|
||||
|
||||
for fn in tk_db(tk_table.id>0).select():
|
||||
try:
|
||||
error = pickle.loads(fn.ticket_data)
|
||||
except AttributeError:
|
||||
tk_db(tk_table.id == fn.id).delete()
|
||||
tk_db.commit()
|
||||
|
||||
|
||||
hash = hashlib.md5(error['traceback']).hexdigest()
|
||||
|
||||
|
||||
if hash in delete_hashes:
|
||||
tk_db(tk_table.id == fn.id).delete()
|
||||
tk_db.commit()
|
||||
@@ -1140,9 +1140,9 @@ def errors():
|
||||
hash=hash,ticket=fn.ticket_id)
|
||||
|
||||
decorated = [(x['count'], x) for x in hash2error.values()]
|
||||
|
||||
|
||||
decorated.sort(key=operator.itemgetter(0), reverse=True)
|
||||
|
||||
|
||||
return dict(errors = [x[1] for x in decorated], app=app, method=method)
|
||||
|
||||
elif method == 'dbold':
|
||||
@@ -1153,7 +1153,7 @@ def errors():
|
||||
tk_db.commit()
|
||||
tickets_ = tk_db(tk_table.id>0).select(tk_table.ticket_id, tk_table.created_datetime, orderby=~tk_table.created_datetime)
|
||||
tickets = [row.ticket_id for row in tickets_]
|
||||
times = dict([(row.ticket_id, row.created_datetime) for row in tickets_])
|
||||
times = dict([(row.ticket_id, row.created_datetime) for row in tickets_])
|
||||
|
||||
return dict(app=app, tickets=tickets, method=method, times=times)
|
||||
|
||||
@@ -1323,7 +1323,7 @@ def twitter():
|
||||
def user():
|
||||
if MULTI_USER_MODE:
|
||||
if not db(db.auth_user).count():
|
||||
auth.settings.registration_requires_approval = False
|
||||
auth.settings.registration_requires_approval = False
|
||||
return dict(form=auth())
|
||||
else:
|
||||
return dict(form=T("Disabled"))
|
||||
@@ -1333,3 +1333,5 @@ def reload_routes():
|
||||
import gluon.rewrite
|
||||
gluon.rewrite.load()
|
||||
redirect(URL('site'))
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ try:
|
||||
import signal
|
||||
import os
|
||||
import shutil
|
||||
from gluon.fileutils import read_file, write_file
|
||||
from gluon.fileutils import read_file, write_file
|
||||
except:
|
||||
session.flash='sorry, only on Unix systems'
|
||||
redirect(URL(request.application,'default','site'))
|
||||
@@ -53,7 +53,7 @@ def deploy():
|
||||
yaml = apath('../app.yaml', r=request)
|
||||
if not os.path.exists(yaml):
|
||||
example = apath('../app.example.yaml', r=request)
|
||||
shutil.copyfile(example,yaml)
|
||||
shutil.copyfile(example,yaml)
|
||||
data = read_file(yaml)
|
||||
data = re.sub('application:.*','application: %s' % form.vars.google_application_id,data)
|
||||
data = regex.sub('(applications/(%s)/.*)|' % '|'.join(ignore_apps),data)
|
||||
@@ -85,3 +85,5 @@ def callback():
|
||||
except:
|
||||
errors=''
|
||||
return (output+errors).replace('\n','<br/>')
|
||||
|
||||
|
||||
@@ -80,3 +80,5 @@ def revision():
|
||||
desc=ctx.description(),
|
||||
form=form
|
||||
)
|
||||
|
||||
|
||||
@@ -6,3 +6,5 @@ def index():
|
||||
|
||||
def about():
|
||||
return locals()
|
||||
|
||||
|
||||
@@ -43,3 +43,5 @@ def reset():
|
||||
session['commands:'+app] = []
|
||||
session['history:'+app] = gluon.contrib.shell.History()
|
||||
return 'done'
|
||||
|
||||
|
||||
@@ -20,10 +20,12 @@ def profiler():
|
||||
size = 0
|
||||
if os.path.exists(filename):
|
||||
data = read_file('profiler.log','rb')
|
||||
if size<len(data):
|
||||
if size<len(data):
|
||||
data = data[size:]
|
||||
else:
|
||||
else:
|
||||
size=0
|
||||
size += len(data)
|
||||
response.cookies[KEY] = size
|
||||
return data
|
||||
|
||||
|
||||
@@ -288,7 +288,7 @@ def make_table(table,fields):
|
||||
'text':'text','file':'upload','image':'upload',
|
||||
'upload':'upload','wiki':'text', 'html':'text'}
|
||||
for key,t in deftypes.items():
|
||||
if key in has:
|
||||
if key in has:
|
||||
ftype = t
|
||||
if refs:
|
||||
key = refs[0]
|
||||
@@ -458,7 +458,7 @@ def create(options):
|
||||
fn = 'web2py.plugin.layout_%s.w2p' % params['layout_theme']
|
||||
theme = urllib.urlopen(LAYOUTS_APP+'/static/plugin_layouts/plugins/'+fn)
|
||||
plugin_install(app, theme, request, fn)
|
||||
except:
|
||||
except:
|
||||
session.flash = T("unable to download layout")
|
||||
|
||||
### apply plugins
|
||||
@@ -467,9 +467,9 @@ def create(options):
|
||||
plugin_name = 'web2py.plugin.'+plugin+'.w2p'
|
||||
stream = urllib.urlopen(PLUGINS_APP+'/static/'+plugin_name)
|
||||
plugin_install(app, stream, request, plugin_name)
|
||||
except Exception, e:
|
||||
except Exception, e:
|
||||
session.flash = T("unable to download plugin: %s" % plugin)
|
||||
|
||||
|
||||
### write configuration file into newapp/models/0.py
|
||||
model = os.path.join(request.folder,'..',app,'models','0.py')
|
||||
file = open(model, 'wb')
|
||||
@@ -547,5 +547,7 @@ def call(): return service()
|
||||
|
||||
if options.erase_database:
|
||||
path = os.path.join(request.folder,'..',app,'databases','*')
|
||||
for file in glob.glob(path):
|
||||
for file in glob.glob(path):
|
||||
os.unlink(file)
|
||||
|
||||
|
||||
@@ -1 +1,2 @@
|
||||
10 * * * * root **applications/admin/cron/expire_sessions.py
|
||||
|
||||
@@ -19,3 +19,5 @@ for filename in os.listdir(path):
|
||||
os.unlink(fullpath)
|
||||
except:
|
||||
logging.exception('failure to check %s'%fullpath)
|
||||
|
||||
|
||||
@@ -85,3 +85,5 @@
|
||||
'views': 'views',
|
||||
'web2py Recent Tweets': 'web2py Onlangse Tweets',
|
||||
}
|
||||
|
||||
|
||||
@@ -275,3 +275,5 @@
|
||||
'web2py is up to date': 'web2py is up to date',
|
||||
'web2py upgraded; please restart it': 'web2py upgraded; please restart it',
|
||||
}
|
||||
|
||||
|
||||
@@ -339,3 +339,5 @@
|
||||
'web2py is up to date': 'web2py ist auf dem neuesten Stand',
|
||||
'xml': 'xml',
|
||||
}
|
||||
|
||||
|
||||
@@ -280,3 +280,5 @@
|
||||
'web2py is up to date': 'web2py está actualizado',
|
||||
'web2py upgraded; please restart it': 'web2py actualizado; favor reiniciar',
|
||||
}
|
||||
|
||||
|
||||
@@ -277,3 +277,5 @@
|
||||
'web2py is up to date': 'web2py est à jour',
|
||||
'web2py upgraded; please restart it': 'web2py upgraded; please restart it',
|
||||
}
|
||||
|
||||
|
||||
@@ -268,3 +268,5 @@
|
||||
'web2py is up to date': 'web2py מותקנת בגירסתה האחרונה',
|
||||
'web2py upgraded; please restart it': 'web2py שודרגה; נא אתחל אותה',
|
||||
}
|
||||
|
||||
|
||||
@@ -262,3 +262,5 @@
|
||||
'web2py is up to date': 'web2py è aggiornato',
|
||||
'web2py upgraded; please restart it': 'web2py aggiornato; prego riavviarlo',
|
||||
}
|
||||
|
||||
|
||||
@@ -264,3 +264,5 @@
|
||||
'web2py is up to date': 'web2py è aggiornato',
|
||||
'web2py upgraded; please restart it': 'web2py aggiornato; prego riavviarlo',
|
||||
}
|
||||
|
||||
|
||||
@@ -260,3 +260,5 @@
|
||||
'web2py is up to date': 'web2py jest aktualne',
|
||||
'web2py upgraded; please restart it': 'web2py upgraded; please restart it',
|
||||
}
|
||||
|
||||
|
||||
@@ -275,3 +275,5 @@
|
||||
'web2py is up to date': 'web2py jest aktualne',
|
||||
'web2py upgraded; please restart it': 'web2py upgraded; please restart it',
|
||||
}
|
||||
|
||||
|
||||
@@ -318,3 +318,5 @@
|
||||
'web2py is up to date': 'web2py está atualizado',
|
||||
'web2py upgraded; please restart it': 'web2py atualizado; favor reiniciar',
|
||||
}
|
||||
|
||||
|
||||
@@ -288,3 +288,5 @@
|
||||
'web2py is up to date': 'web2py现在已经是最新的版本了',
|
||||
'web2py upgraded; please restart it': 'web2py upgraded; please restart it',
|
||||
}
|
||||
|
||||
|
||||
@@ -300,3 +300,5 @@
|
||||
'web2py is up to date': 'web2py 已經是最新版',
|
||||
'web2py upgraded; please restart it': '已升級 web2py ; 請重新啟動',
|
||||
}
|
||||
|
||||
|
||||
@@ -63,3 +63,5 @@ PLUGINS_APP = 'http://web2py.com/plugins'
|
||||
# set the language
|
||||
if 'adminLanguage' in request.cookies and not (request.cookies['adminLanguage'] is None):
|
||||
T.force(request.cookies['adminLanguage'].value)
|
||||
|
||||
|
||||
@@ -24,3 +24,5 @@ from gluon.languages import findT, update_all_languages
|
||||
from gluon.myregex import *
|
||||
from gluon.restricted import *
|
||||
from gluon.compileapp import compile_application, remove_compiled_application
|
||||
|
||||
|
||||
@@ -77,9 +77,9 @@ def read_hosts_deny():
|
||||
int(fields[2].strip()) # last attempts
|
||||
)
|
||||
portalocker.unlock(f)
|
||||
f.close()
|
||||
f.close()
|
||||
return hosts
|
||||
|
||||
|
||||
def write_hosts_deny(denied_hosts):
|
||||
f = open(deny_file, 'w')
|
||||
portalocker.lock(f, portalocker.LOCK_EX)
|
||||
@@ -88,7 +88,7 @@ def write_hosts_deny(denied_hosts):
|
||||
line = '%s %s %s\n' % (key, val[0], val[1])
|
||||
f.write(line)
|
||||
portalocker.unlock(f)
|
||||
f.close()
|
||||
f.close()
|
||||
|
||||
def login_record(success=True):
|
||||
denied_hosts = read_hosts_deny()
|
||||
@@ -101,11 +101,11 @@ def login_record(success=True):
|
||||
and val[0] >= allowed_number_of_attempts:
|
||||
return val[0] # locked out
|
||||
time.sleep(2**val[0])
|
||||
val = (val[0]+1,int(time.time()))
|
||||
val = (val[0]+1,int(time.time()))
|
||||
denied_hosts[request.client] = val
|
||||
write_hosts_deny(denied_hosts)
|
||||
return val[0]
|
||||
|
||||
|
||||
|
||||
# ###########################################################
|
||||
# ## session expiration
|
||||
@@ -144,3 +144,5 @@ if request.controller=='appadmin' and DEMO_MODE:
|
||||
session.flash = 'Appadmin disabled in demo mode'
|
||||
redirect(URL('default','sites'))
|
||||
|
||||
|
||||
|
||||
@@ -7,10 +7,10 @@ def button(href, label):
|
||||
|
||||
def button_enable(href, app):
|
||||
if os.path.exists(os.path.join(apath(app,r=request),'DISABLED')):
|
||||
label = SPAN(T('Enable'),_style='color:red')
|
||||
label = SPAN(T('Enable'),_style='color:red')
|
||||
else:
|
||||
label = SPAN(T('Disable'),_style='color:green')
|
||||
id = 'enable_'+app
|
||||
id = 'enable_'+app
|
||||
return A(label,_class='button',_id=id,callback=href,target=id)
|
||||
|
||||
def sp_button(href, label):
|
||||
@@ -21,3 +21,5 @@ def helpicon():
|
||||
|
||||
def searchbox(elementid):
|
||||
return TAG[''](LABEL(IMG(_src=URL('static', 'images/search.png'), _alt=T('filter')), _class='icon', _for=elementid), ' ', INPUT(_id=elementid, _type='text', _size=12))
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ if MULTI_USER_MODE:
|
||||
crud = Crud(globals(),db) # for CRUD helpers using auth
|
||||
service = Service(globals()) # for json, xml, jsonrpc, xmlrpc, amfrpc
|
||||
plugins = PluginManager()
|
||||
|
||||
|
||||
mail.settings.server = 'logging' or 'smtp.gmail.com:587' # your SMTP server
|
||||
mail.settings.sender = 'you@gmail.com' # your email
|
||||
mail.settings.login = 'username:password' # your credentials or None
|
||||
@@ -38,3 +38,5 @@ def is_manager():
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
|
||||
@@ -31,3 +31,5 @@ if os.path.exists('applications/examples'):
|
||||
response.menu.append((T('Help'), False, URL('examples','default','index')))
|
||||
else:
|
||||
response.menu.append((T('Help'), False, 'http://web2py.com/examples'))
|
||||
|
||||
|
||||
@@ -2,3 +2,5 @@ response.files.append(URL('static','plugin_multiselect/jquery.dimensions.js'))
|
||||
response.files.append(URL('static','plugin_multiselect/jquery.multiselect.js'))
|
||||
response.files.append(URL('static','plugin_multiselect/jquery.multiselect.css'))
|
||||
response.files.append(URL('static','plugin_multiselect/start.js'))
|
||||
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
|
||||
|
||||
@@ -4,4 +4,4 @@ border-radius: 10px;
|
||||
-webkit-border-radius: 10px;
|
||||
}.calendar table{margin:0px;font-size:11px;color:#000;cursor:default;font-family:tahoma,verdana,sans-serif;}.calendar .button{text-align:center;padding:1px;color:#fff;background:#000;}.calendar .nav{background:#000;color:#fff}.calendar thead .title{font-weight:bold;padding:1px;background:#000;color:#fff;text-align:center;}.calendar thead .name{padding:2px;text-align:center;background:#bbb;}.calendar thead .weekend{color:#f00;}.calendar thead .hilite {background-color:#666;}.calendar thead .active{padding:2px 0 0 2px;background-color:#c4c0b8;}.calendar tbody .day{width:2em;text-align:right;padding:2px 4px 2px 2px;}.calendar tbody .day.othermonth{color:#aaa;}.calendar tbody .day.othermonth.oweekend{color:#faa;}.calendar table .wn{padding:2px 3px 2px 2px;background:#bbb;}.calendar tbody .rowhilite td{background:#ddd;}.calendar tbody td.hilite{background:#bbb;}.calendar tbody td.active{background:#bbb;}.calendar tbody td.selected{font-weight:bold;background:#ddd;}.calendar tbody td.weekend{color:#f00;}.calendar tbody td.today{font-weight:bold;color:#00f;}.calendar tbody .disabled{color:#999;}.calendar tbody .emptycell{visibility:hidden;}.calendar tbody .emptyrow{display:none;}.calendar tfoot .ttip{background:#bbb;padding:1px;background:#000;color:#fff;text-align:center;}.calendar tfoot .hilite{background:#ddd;}.calendar tfoot .active{}.calendar .combo{position:absolute;display:none;width:4em;top:0;left:0;cursor:default;background:#e4e0d8;padding:1px;z-index:100;}.calendar .combo .label,.calendar .combo .label-IEfix{text-align:center;padding:1px;}.calendar .combo .label-IEfix{width:4em;}.calendar .combo .active{background:#c4c0b8;}.calendar .combo .hilite{background:#048;color:#fea;}.calendar td.time{padding:1px 0;text-align:center;background-color:#bbb;}.calendar td.time .hour,.calendar td.time .minute,.calendar td.time .ampm{padding:0 3px 0 4px;font-weight:bold;}.calendar td.time .ampm{text-align:center;}.calendar td.time .colon{padding:0 2px 0 3px;font-weight:bold;}.calendar td.time span.hilite{}.calendar td.time span.active{border-color:#f00;background-color:#000;color:#0f0;}.hour,.minute{font-size:2em;}
|
||||
|
||||
#CP_hourcont{z-index:99;padding:0;position:absolute;border:1px dashed #666;background-color:#eee;display:none;}#CP_minutecont{z-index:99;background-color:#ddd;padding:1px;position:absolute;width:45px;display:none;}.floatleft{float:left;}.CP_hour{z-index:99;padding:1px;font-family:Arial,Helvetica,sans-serif;font-size:9px;white-space:nowrap;cursor:pointer;width:35px;}.CP_minute{z-index:99;padding:1px;font-family:Arial,Helvetica,sans-serif;font-size:9px;white-space:nowrap;cursor:pointer;width:auto;}.CP_over{background-color:#fff;z-index:99}
|
||||
#CP_hourcont{z-index:99;padding:0;position:absolute;border:1px dashed #666;background-color:#eee;display:none;}#CP_minutecont{z-index:99;background-color:#ddd;padding:1px;position:absolute;width:45px;display:none;}.floatleft{float:left;}.CP_hour{z-index:99;padding:1px;font-family:Arial,Helvetica,sans-serif;font-size:9px;white-space:nowrap;cursor:pointer;width:35px;}.CP_minute{z-index:99;padding:1px;font-family:Arial,Helvetica,sans-serif;font-size:9px;white-space:nowrap;cursor:pointer;width:auto;}.CP_over{background-color:#fff;z-index:99}
|
||||
@@ -11,7 +11,7 @@
|
||||
background: right center no-repeat;
|
||||
}
|
||||
|
||||
.multiSelect.active,
|
||||
.multiSelect.active,
|
||||
.multiSelect.focus {
|
||||
border: inset 1px #000;
|
||||
}
|
||||
@@ -44,4 +44,4 @@
|
||||
|
||||
.multiSelectOptions LABEL.hover {
|
||||
background: #CFCFCF;
|
||||
}
|
||||
}
|
||||
@@ -181,7 +181,7 @@ fieldset.inline {
|
||||
float:left;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
|
||||
/* 4.4. Inline-block element must content any element inside (div, p, etc) for the correct visualization in FF<3 */
|
||||
.inline-block-top,.inline-block-middle,.inline-block-bottom {
|
||||
float:none !important;
|
||||
@@ -330,7 +330,7 @@ a.button,
|
||||
padding: 4px 0 6px 10px; /*Padding-left: 10px */
|
||||
margin: 0 0 0 -10px; /* Margin-left: -10px */
|
||||
}
|
||||
|
||||
|
||||
/* 3. HACKS */
|
||||
|
||||
ul.button {
|
||||
@@ -348,7 +348,7 @@ a.button {
|
||||
-moz-box-orient: vertical; /* FF<3 */
|
||||
*display: inline; /* IE */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* cSans Tooltip pluging v0.1
|
||||
* 2009 Copyright A navalla suíza http://anavallasuiza.com
|
||||
@@ -372,7 +372,7 @@ a.button {
|
||||
display:inline;
|
||||
position:absolute;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* cSans Flexible v0.1
|
||||
* 2009 Copyright A navalla suíza http://anavallasuiza.com
|
||||
@@ -957,17 +957,17 @@ ul#snapshot > li {
|
||||
.shell #output pre {
|
||||
color: #e8953c;
|
||||
background: white;
|
||||
border: 1px solid #333;
|
||||
border: 1px solid #333;
|
||||
}
|
||||
|
||||
.shell .prompt,
|
||||
.shell #output,
|
||||
.shell .prompt,
|
||||
.shell #output,
|
||||
.shell pre,
|
||||
.shell #caret {
|
||||
font-family: monospace;
|
||||
}
|
||||
|
||||
.shell .prompt,
|
||||
.shell .prompt,
|
||||
.shell #output,
|
||||
.shell #caret {
|
||||
font-size: 10pt;
|
||||
@@ -977,7 +977,7 @@ ul#snapshot > li {
|
||||
|
||||
.shell #shellwrapper {
|
||||
background: white;
|
||||
border: 1px solid #333;
|
||||
border: 1px solid #333;
|
||||
color: #e8953c;
|
||||
width: 75%;
|
||||
// padding: 6px;
|
||||
@@ -1063,3 +1063,4 @@ ul#snapshot > li {
|
||||
.translated { background-color: white; }
|
||||
.ui-multiselect { border: 1px solid #ccc; width:400px;}
|
||||
#editor_area textarea { height: 400px; width: 100% }
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
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.
|
||||
|
||||
|
||||
*
|
||||
*
|
||||
* This file is auto-generated from original Fry Framework and Amy Editor sources..
|
||||
@@ -387,3 +387,4 @@ snippet = {tab_activation: '=', code: '{{=$0}}'};
|
||||
eamy.snippets.push(snippet);
|
||||
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
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.
|
||||
|
||||
|
||||
*
|
||||
*
|
||||
* This file is auto-generated from original Fry Framework and Amy Editor sources..
|
||||
@@ -294,3 +294,4 @@ snippet = {tab_activation: 're', code: 'redirect(\'$0\')'};
|
||||
eamy.snippets.push(snippet);
|
||||
snippet = {tab_activation: 'rej', code: 'response.json=\'$0\''};
|
||||
eamy.snippets.push(snippet);
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
@@ -16,7 +16,7 @@
|
||||
.acw-chap .sidebar
|
||||
{
|
||||
background-image:url('chap-bg-sidebar.gif');
|
||||
line-height:11px;
|
||||
line-height:11px;
|
||||
}
|
||||
/*.acw-chap .sidebar .row-number
|
||||
{
|
||||
@@ -52,5 +52,5 @@
|
||||
}
|
||||
.acw-chap .void
|
||||
{
|
||||
background-image:url('void.gif');
|
||||
}
|
||||
background-image:url('void.gif');
|
||||
}
|
||||
@@ -1,491 +1,491 @@
|
||||
/**
|
||||
* Autocompletion class
|
||||
*
|
||||
* An auto completion box appear while you're writing. It's possible to force it to appear with Ctrl+Space short cut
|
||||
*
|
||||
* Loaded as a plugin inside editArea (everything made here could have been made in the plugin directory)
|
||||
* But is definitly linked to syntax selection (no need to do 2 different files for color and auto complete for each syntax language)
|
||||
* and add a too important feature that many people would miss if included as a plugin
|
||||
*
|
||||
* - init param: autocompletion_start
|
||||
* - Button name: "autocompletion"
|
||||
*/
|
||||
|
||||
var EditArea_autocompletion= {
|
||||
|
||||
/**
|
||||
* Get called once this file is loaded (editArea still not initialized)
|
||||
*
|
||||
* @return nothing
|
||||
*/
|
||||
init: function(){
|
||||
// alert("test init: "+ this._someInternalFunction(2, 3));
|
||||
|
||||
if(editArea.settings["autocompletion"])
|
||||
this.enabled= true;
|
||||
else
|
||||
this.enabled= false;
|
||||
this.current_word = false;
|
||||
this.shown = false;
|
||||
this.selectIndex = -1;
|
||||
this.forceDisplay = false;
|
||||
this.isInMiddleWord = false;
|
||||
this.autoSelectIfOneResult = false;
|
||||
this.delayBeforeDisplay = 100;
|
||||
this.checkDelayTimer = false;
|
||||
this.curr_syntax_str = '';
|
||||
|
||||
this.file_syntax_datas = {};
|
||||
}
|
||||
/**
|
||||
* Returns the HTML code for a specific control string or false if this plugin doesn't have that control.
|
||||
* A control can be a button, select list or any other HTML item to present in the EditArea user interface.
|
||||
* Language variables such as {$lang_somekey} will also be replaced with contents from
|
||||
* the language packs.
|
||||
*
|
||||
* @param {string} ctrl_name: the name of the control to add
|
||||
* @return HTML code for a specific control or false.
|
||||
* @type string or boolean
|
||||
*/
|
||||
/*,get_control_html: function(ctrl_name){
|
||||
switch( ctrl_name ){
|
||||
case 'autocompletion':
|
||||
// Control id, button img, command
|
||||
return parent.editAreaLoader.get_button_html('autocompletion_but', 'autocompletion.gif', 'toggle_autocompletion', false, this.baseURL);
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
}*/
|
||||
/**
|
||||
* Get called once EditArea is fully loaded and initialised
|
||||
*
|
||||
* @return nothing
|
||||
*/
|
||||
,onload: function(){
|
||||
if(this.enabled)
|
||||
{
|
||||
var icon= document.getElementById("autocompletion");
|
||||
if(icon)
|
||||
editArea.switchClassSticky(icon, 'editAreaButtonSelected', true);
|
||||
}
|
||||
|
||||
this.container = document.createElement('div');
|
||||
this.container.id = "auto_completion_area";
|
||||
editArea.container.insertBefore( this.container, editArea.container.firstChild );
|
||||
|
||||
// add event detection for hiding suggestion box
|
||||
parent.editAreaLoader.add_event( document, "click", function(){ editArea.plugins['autocompletion']._hide();} );
|
||||
parent.editAreaLoader.add_event( editArea.textarea, "blur", function(){ editArea.plugins['autocompletion']._hide();} );
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Is called each time the user touch a keyboard key.
|
||||
*
|
||||
* @param (event) e: the keydown event
|
||||
* @return true - pass to next handler in chain, false - stop chain execution
|
||||
* @type boolean
|
||||
*/
|
||||
,onkeydown: function(e){
|
||||
if(!this.enabled)
|
||||
return true;
|
||||
|
||||
if (EA_keys[e.keyCode])
|
||||
letter=EA_keys[e.keyCode];
|
||||
else
|
||||
letter=String.fromCharCode(e.keyCode);
|
||||
// shown
|
||||
if( this._isShown() )
|
||||
{
|
||||
// if escape, hide the box
|
||||
if(letter=="Esc")
|
||||
{
|
||||
this._hide();
|
||||
return false;
|
||||
}
|
||||
// Enter
|
||||
else if( letter=="Entrer")
|
||||
{
|
||||
var as = this.container.getElementsByTagName('A');
|
||||
// select a suggested entry
|
||||
if( this.selectIndex >= 0 && this.selectIndex < as.length )
|
||||
{
|
||||
as[ this.selectIndex ].onmousedown();
|
||||
return false
|
||||
}
|
||||
// simply add an enter in the code
|
||||
else
|
||||
{
|
||||
this._hide();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else if( letter=="Tab" || letter=="Down")
|
||||
{
|
||||
this._selectNext();
|
||||
return false;
|
||||
}
|
||||
else if( letter=="Up")
|
||||
{
|
||||
this._selectBefore();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
// hidden
|
||||
else
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
// show current suggestion list and do autoSelect if possible (no matter it's shown or hidden)
|
||||
if( letter=="Space" && CtrlPressed(e) )
|
||||
{
|
||||
//parent.console.log('SHOW SUGGEST');
|
||||
this.forceDisplay = true;
|
||||
this.autoSelectIfOneResult = true;
|
||||
this._checkLetter();
|
||||
return false;
|
||||
}
|
||||
|
||||
// wait a short period for check that the cursor isn't moving
|
||||
setTimeout("editArea.plugins['autocompletion']._checkDelayAndCursorBeforeDisplay();", editArea.check_line_selection_timer +5 );
|
||||
this.checkDelayTimer = false;
|
||||
return true;
|
||||
}
|
||||
/**
|
||||
* Executes a specific command, this function handles plugin commands.
|
||||
*
|
||||
* @param {string} cmd: the name of the command being executed
|
||||
* @param {unknown} param: the parameter of the command
|
||||
* @return true - pass to next handler in chain, false - stop chain execution
|
||||
* @type boolean
|
||||
*/
|
||||
,execCommand: function(cmd, param){
|
||||
switch( cmd ){
|
||||
case 'toggle_autocompletion':
|
||||
var icon= document.getElementById("autocompletion");
|
||||
if(!this.enabled)
|
||||
{
|
||||
if(icon != null){
|
||||
editArea.restoreClass(icon);
|
||||
editArea.switchClassSticky(icon, 'editAreaButtonSelected', true);
|
||||
}
|
||||
this.enabled= true;
|
||||
}
|
||||
else
|
||||
{
|
||||
this.enabled= false;
|
||||
if(icon != null)
|
||||
editArea.switchClassSticky(icon, 'editAreaButtonNormal', false);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
,_checkDelayAndCursorBeforeDisplay: function()
|
||||
{
|
||||
this.checkDelayTimer = setTimeout("if(editArea.textarea.selectionStart == "+ editArea.textarea.selectionStart +") EditArea_autocompletion._checkLetter();", this.delayBeforeDisplay - editArea.check_line_selection_timer - 5 );
|
||||
}
|
||||
// hide the suggested box
|
||||
,_hide: function(){
|
||||
this.container.style.display="none";
|
||||
this.selectIndex = -1;
|
||||
this.shown = false;
|
||||
this.forceDisplay = false;
|
||||
this.autoSelectIfOneResult = false;
|
||||
}
|
||||
// display the suggested box
|
||||
,_show: function(){
|
||||
if( !this._isShown() )
|
||||
{
|
||||
this.container.style.display="block";
|
||||
this.selectIndex = -1;
|
||||
this.shown = true;
|
||||
}
|
||||
}
|
||||
// is the suggested box displayed?
|
||||
,_isShown: function(){
|
||||
return this.shown;
|
||||
}
|
||||
// setter and getter
|
||||
,_isInMiddleWord: function( new_value ){
|
||||
if( typeof( new_value ) == "undefined" )
|
||||
return this.isInMiddleWord;
|
||||
else
|
||||
this.isInMiddleWord = new_value;
|
||||
}
|
||||
// select the next element in the suggested box
|
||||
,_selectNext: function()
|
||||
{
|
||||
var as = this.container.getElementsByTagName('A');
|
||||
|
||||
// clean existing elements
|
||||
for( var i=0; i<as.length; i++ )
|
||||
{
|
||||
if( as[i].className )
|
||||
as[i].className = as[i].className.replace(/ focus/g, '');
|
||||
}
|
||||
|
||||
this.selectIndex++;
|
||||
this.selectIndex = ( this.selectIndex >= as.length || this.selectIndex < 0 ) ? 0 : this.selectIndex;
|
||||
as[ this.selectIndex ].className += " focus";
|
||||
}
|
||||
// select the previous element in the suggested box
|
||||
,_selectBefore: function()
|
||||
{
|
||||
var as = this.container.getElementsByTagName('A');
|
||||
|
||||
// clean existing elements
|
||||
for( var i=0; i<as.length; i++ )
|
||||
{
|
||||
if( as[i].className )
|
||||
as[i].className = as[ i ].className.replace(/ focus/g, '');
|
||||
}
|
||||
|
||||
this.selectIndex--;
|
||||
|
||||
this.selectIndex = ( this.selectIndex >= as.length || this.selectIndex < 0 ) ? as.length-1 : this.selectIndex;
|
||||
as[ this.selectIndex ].className += " focus";
|
||||
}
|
||||
,_select: function( content )
|
||||
{
|
||||
cursor_forced_position = content.indexOf( '{@}' );
|
||||
content = content.replace(/{@}/g, '' );
|
||||
editArea.getIESelection();
|
||||
|
||||
// retrive the number of matching characters
|
||||
var start_index = Math.max( 0, editArea.textarea.selectionEnd - content.length );
|
||||
|
||||
line_string = editArea.textarea.value.substring( start_index, editArea.textarea.selectionEnd + 1);
|
||||
limit = line_string.length -1;
|
||||
nbMatch = 0;
|
||||
for( i =0; i<limit ; i++ )
|
||||
{
|
||||
if( line_string.substring( limit - i - 1, limit ) == content.substring( 0, i + 1 ) )
|
||||
nbMatch = i + 1;
|
||||
}
|
||||
// if characters match, we should include them in the selection that will be replaced
|
||||
if( nbMatch > 0 )
|
||||
parent.editAreaLoader.setSelectionRange(editArea.id, editArea.textarea.selectionStart - nbMatch , editArea.textarea.selectionEnd);
|
||||
|
||||
parent.editAreaLoader.setSelectedText(editArea.id, content );
|
||||
range= parent.editAreaLoader.getSelectionRange(editArea.id);
|
||||
|
||||
if( cursor_forced_position != -1 )
|
||||
new_pos = range["end"] - ( content.length-cursor_forced_position );
|
||||
else
|
||||
new_pos = range["end"];
|
||||
parent.editAreaLoader.setSelectionRange(editArea.id, new_pos, new_pos);
|
||||
this._hide();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Parse the AUTO_COMPLETION part of syntax definition files
|
||||
*/
|
||||
,_parseSyntaxAutoCompletionDatas: function(){
|
||||
//foreach syntax loaded
|
||||
for(var lang in parent.editAreaLoader.load_syntax)
|
||||
{
|
||||
if(!parent.editAreaLoader.syntax[lang]['autocompletion']) // init the regexp if not already initialized
|
||||
{
|
||||
parent.editAreaLoader.syntax[lang]['autocompletion']= {};
|
||||
// the file has auto completion datas
|
||||
if(parent.editAreaLoader.load_syntax[lang]['AUTO_COMPLETION'])
|
||||
{
|
||||
// parse them
|
||||
for(var i in parent.editAreaLoader.load_syntax[lang]['AUTO_COMPLETION'])
|
||||
{
|
||||
datas = parent.editAreaLoader.load_syntax[lang]['AUTO_COMPLETION'][i];
|
||||
tmp = {};
|
||||
if(datas["CASE_SENSITIVE"]!="undefined" && datas["CASE_SENSITIVE"]==false)
|
||||
tmp["modifiers"]="i";
|
||||
else
|
||||
tmp["modifiers"]="";
|
||||
tmp["prefix_separator"]= datas["REGEXP"]["prefix_separator"];
|
||||
tmp["match_prefix_separator"]= new RegExp( datas["REGEXP"]["prefix_separator"] +"$", tmp["modifiers"]);
|
||||
tmp["match_word"]= new RegExp("(?:"+ datas["REGEXP"]["before_word"] +")("+ datas["REGEXP"]["possible_words_letters"] +")$", tmp["modifiers"]);
|
||||
tmp["match_next_letter"]= new RegExp("^("+ datas["REGEXP"]["letter_after_word_must_match"] +")$", tmp["modifiers"]);
|
||||
tmp["keywords"]= {};
|
||||
//console.log( datas["KEYWORDS"] );
|
||||
for( var prefix in datas["KEYWORDS"] )
|
||||
{
|
||||
tmp["keywords"][prefix]= {
|
||||
prefix: prefix,
|
||||
prefix_name: prefix,
|
||||
prefix_reg: new RegExp("(?:"+ parent.editAreaLoader.get_escaped_regexp( prefix ) +")(?:"+ tmp["prefix_separator"] +")$", tmp["modifiers"] ),
|
||||
datas: []
|
||||
};
|
||||
for( var j=0; j<datas["KEYWORDS"][prefix].length; j++ )
|
||||
{
|
||||
tmp["keywords"][prefix]['datas'][j]= {
|
||||
is_typing: datas["KEYWORDS"][prefix][j][0],
|
||||
// if replace with is empty, replace with the is_typing value
|
||||
replace_with: datas["KEYWORDS"][prefix][j][1] ? datas["KEYWORDS"][prefix][j][1].replace('§', datas["KEYWORDS"][prefix][j][0] ) : '',
|
||||
comment: datas["KEYWORDS"][prefix][j][2] ? datas["KEYWORDS"][prefix][j][2] : ''
|
||||
};
|
||||
|
||||
// the replace with shouldn't be empty
|
||||
if( tmp["keywords"][prefix]['datas'][j]['replace_with'].length == 0 )
|
||||
tmp["keywords"][prefix]['datas'][j]['replace_with'] = tmp["keywords"][prefix]['datas'][j]['is_typing'];
|
||||
|
||||
// if the comment is empty, display the replace_with value
|
||||
if( tmp["keywords"][prefix]['datas'][j]['comment'].length == 0 )
|
||||
tmp["keywords"][prefix]['datas'][j]['comment'] = tmp["keywords"][prefix]['datas'][j]['replace_with'].replace(/{@}/g, '' );
|
||||
}
|
||||
|
||||
}
|
||||
tmp["max_text_length"]= datas["MAX_TEXT_LENGTH"];
|
||||
parent.editAreaLoader.syntax[lang]['autocompletion'][i] = tmp;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
,_checkLetter: function(){
|
||||
// check that syntax hasn't changed
|
||||
if( this.curr_syntax_str != editArea.settings['syntax'] )
|
||||
{
|
||||
if( !parent.editAreaLoader.syntax[editArea.settings['syntax']]['autocompletion'] )
|
||||
this._parseSyntaxAutoCompletionDatas();
|
||||
this.curr_syntax= parent.editAreaLoader.syntax[editArea.settings['syntax']]['autocompletion'];
|
||||
this.curr_syntax_str = editArea.settings['syntax'];
|
||||
//console.log( this.curr_syntax );
|
||||
}
|
||||
|
||||
if( editArea.is_editable )
|
||||
{
|
||||
time=new Date;
|
||||
t1= time.getTime();
|
||||
editArea.getIESelection();
|
||||
this.selectIndex = -1;
|
||||
start=editArea.textarea.selectionStart;
|
||||
var str = editArea.textarea.value;
|
||||
var results= [];
|
||||
|
||||
|
||||
for(var i in this.curr_syntax)
|
||||
{
|
||||
var last_chars = str.substring(Math.max(0, start-this.curr_syntax[i]["max_text_length"]), start);
|
||||
var matchNextletter = str.substring(start, start+1).match( this.curr_syntax[i]["match_next_letter"]);
|
||||
// if not writting in the middle of a word or if forcing display
|
||||
if( matchNextletter || this.forceDisplay )
|
||||
{
|
||||
// check if the last chars match a separator
|
||||
var match_prefix_separator = last_chars.match(this.curr_syntax[i]["match_prefix_separator"]);
|
||||
|
||||
// check if it match a possible word
|
||||
var match_word= last_chars.match(this.curr_syntax[i]["match_word"]);
|
||||
|
||||
//console.log( match_word );
|
||||
if( match_word )
|
||||
{
|
||||
var begin_word= match_word[1];
|
||||
var match_curr_word= new RegExp("^"+ parent.editAreaLoader.get_escaped_regexp( begin_word ), this.curr_syntax[i]["modifiers"]);
|
||||
//console.log( match_curr_word );
|
||||
for(var prefix in this.curr_syntax[i]["keywords"])
|
||||
{
|
||||
// parent.console.log( this.curr_syntax[i]["keywords"][prefix] );
|
||||
for(var j=0; j<this.curr_syntax[i]["keywords"][prefix]['datas'].length; j++)
|
||||
{
|
||||
// parent.console.log( this.curr_syntax[i]["keywords"][prefix]['datas'][j]['is_typing'] );
|
||||
// the key word match or force display
|
||||
if( this.curr_syntax[i]["keywords"][prefix]['datas'][j]['is_typing'].match(match_curr_word) )
|
||||
{
|
||||
// parent.console.log('match');
|
||||
hasMatch = false;
|
||||
var before = last_chars.substr( 0, last_chars.length - begin_word.length );
|
||||
|
||||
// no prefix to match => it's valid
|
||||
if( !match_prefix_separator && this.curr_syntax[i]["keywords"][prefix]['prefix'].length == 0 )
|
||||
{
|
||||
if( ! before.match( this.curr_syntax[i]["keywords"][prefix]['prefix_reg'] ) )
|
||||
hasMatch = true;
|
||||
}
|
||||
// we still need to check the prefix if there is one
|
||||
else if( this.curr_syntax[i]["keywords"][prefix]['prefix'].length > 0 )
|
||||
{
|
||||
if( before.match( this.curr_syntax[i]["keywords"][prefix]['prefix_reg'] ) )
|
||||
hasMatch = true;
|
||||
}
|
||||
|
||||
if( hasMatch )
|
||||
results[results.length]= [ this.curr_syntax[i]["keywords"][prefix], this.curr_syntax[i]["keywords"][prefix]['datas'][j] ];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// it doesn't match any possible word but we want to display something
|
||||
// we'll display to list of all available words
|
||||
else if( this.forceDisplay || match_prefix_separator )
|
||||
{
|
||||
for(var prefix in this.curr_syntax[i]["keywords"])
|
||||
{
|
||||
for(var j=0; j<this.curr_syntax[i]["keywords"][prefix]['datas'].length; j++)
|
||||
{
|
||||
hasMatch = false;
|
||||
// no prefix to match => it's valid
|
||||
if( !match_prefix_separator && this.curr_syntax[i]["keywords"][prefix]['prefix'].length == 0 )
|
||||
{
|
||||
hasMatch = true;
|
||||
}
|
||||
// we still need to check the prefix if there is one
|
||||
else if( match_prefix_separator && this.curr_syntax[i]["keywords"][prefix]['prefix'].length > 0 )
|
||||
{
|
||||
var before = last_chars; //.substr( 0, last_chars.length );
|
||||
if( before.match( this.curr_syntax[i]["keywords"][prefix]['prefix_reg'] ) )
|
||||
hasMatch = true;
|
||||
}
|
||||
|
||||
if( hasMatch )
|
||||
results[results.length]= [ this.curr_syntax[i]["keywords"][prefix], this.curr_syntax[i]["keywords"][prefix]['datas'][j] ];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// there is only one result, and we can select it automatically
|
||||
if( results.length == 1 && this.autoSelectIfOneResult )
|
||||
{
|
||||
// console.log( results );
|
||||
this._select( results[0][1]['replace_with'] );
|
||||
}
|
||||
else if( results.length == 0 )
|
||||
{
|
||||
this._hide();
|
||||
}
|
||||
else
|
||||
{
|
||||
// build the suggestion box content
|
||||
var lines=[];
|
||||
for(var i=0; i<results.length; i++)
|
||||
{
|
||||
var line= "<li><a href=\"#\" class=\"entry\" onmousedown=\"EditArea_autocompletion._select('"+ results[i][1]['replace_with'].replace(new RegExp('"', "g"), """) +"');return false;\">"+ results[i][1]['comment'];
|
||||
if(results[i][0]['prefix_name'].length>0)
|
||||
line+='<span class="prefix">'+ results[i][0]['prefix_name'] +'</span>';
|
||||
line+='</a></li>';
|
||||
lines[lines.length]=line;
|
||||
}
|
||||
// sort results
|
||||
this.container.innerHTML = '<ul>'+ lines.sort().join('') +'</ul>';
|
||||
|
||||
var cursor = _$("cursor_pos");
|
||||
this.container.style.top = ( cursor.cursor_top + editArea.lineHeight ) +"px";
|
||||
this.container.style.left = ( cursor.cursor_left + 8 ) +"px";
|
||||
this._show();
|
||||
}
|
||||
|
||||
this.autoSelectIfOneResult = false;
|
||||
time=new Date;
|
||||
t2= time.getTime();
|
||||
|
||||
//parent.console.log( begin_word +"\n"+ (t2-t1) +"\n"+ html );
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Load as a plugin
|
||||
editArea.settings['plugins'][ editArea.settings['plugins'].length ] = 'autocompletion';
|
||||
editArea.add_plugin('autocompletion', EditArea_autocompletion);
|
||||
/**
|
||||
* Autocompletion class
|
||||
*
|
||||
* An auto completion box appear while you're writing. It's possible to force it to appear with Ctrl+Space short cut
|
||||
*
|
||||
* Loaded as a plugin inside editArea (everything made here could have been made in the plugin directory)
|
||||
* But is definitly linked to syntax selection (no need to do 2 different files for color and auto complete for each syntax language)
|
||||
* and add a too important feature that many people would miss if included as a plugin
|
||||
*
|
||||
* - init param: autocompletion_start
|
||||
* - Button name: "autocompletion"
|
||||
*/
|
||||
|
||||
var EditArea_autocompletion= {
|
||||
|
||||
/**
|
||||
* Get called once this file is loaded (editArea still not initialized)
|
||||
*
|
||||
* @return nothing
|
||||
*/
|
||||
init: function(){
|
||||
// alert("test init: "+ this._someInternalFunction(2, 3));
|
||||
|
||||
if(editArea.settings["autocompletion"])
|
||||
this.enabled= true;
|
||||
else
|
||||
this.enabled= false;
|
||||
this.current_word = false;
|
||||
this.shown = false;
|
||||
this.selectIndex = -1;
|
||||
this.forceDisplay = false;
|
||||
this.isInMiddleWord = false;
|
||||
this.autoSelectIfOneResult = false;
|
||||
this.delayBeforeDisplay = 100;
|
||||
this.checkDelayTimer = false;
|
||||
this.curr_syntax_str = '';
|
||||
|
||||
this.file_syntax_datas = {};
|
||||
}
|
||||
/**
|
||||
* Returns the HTML code for a specific control string or false if this plugin doesn't have that control.
|
||||
* A control can be a button, select list or any other HTML item to present in the EditArea user interface.
|
||||
* Language variables such as {$lang_somekey} will also be replaced with contents from
|
||||
* the language packs.
|
||||
*
|
||||
* @param {string} ctrl_name: the name of the control to add
|
||||
* @return HTML code for a specific control or false.
|
||||
* @type string or boolean
|
||||
*/
|
||||
/*,get_control_html: function(ctrl_name){
|
||||
switch( ctrl_name ){
|
||||
case 'autocompletion':
|
||||
// Control id, button img, command
|
||||
return parent.editAreaLoader.get_button_html('autocompletion_but', 'autocompletion.gif', 'toggle_autocompletion', false, this.baseURL);
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
}*/
|
||||
/**
|
||||
* Get called once EditArea is fully loaded and initialised
|
||||
*
|
||||
* @return nothing
|
||||
*/
|
||||
,onload: function(){
|
||||
if(this.enabled)
|
||||
{
|
||||
var icon= document.getElementById("autocompletion");
|
||||
if(icon)
|
||||
editArea.switchClassSticky(icon, 'editAreaButtonSelected', true);
|
||||
}
|
||||
|
||||
this.container = document.createElement('div');
|
||||
this.container.id = "auto_completion_area";
|
||||
editArea.container.insertBefore( this.container, editArea.container.firstChild );
|
||||
|
||||
// add event detection for hiding suggestion box
|
||||
parent.editAreaLoader.add_event( document, "click", function(){ editArea.plugins['autocompletion']._hide();} );
|
||||
parent.editAreaLoader.add_event( editArea.textarea, "blur", function(){ editArea.plugins['autocompletion']._hide();} );
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Is called each time the user touch a keyboard key.
|
||||
*
|
||||
* @param (event) e: the keydown event
|
||||
* @return true - pass to next handler in chain, false - stop chain execution
|
||||
* @type boolean
|
||||
*/
|
||||
,onkeydown: function(e){
|
||||
if(!this.enabled)
|
||||
return true;
|
||||
|
||||
if (EA_keys[e.keyCode])
|
||||
letter=EA_keys[e.keyCode];
|
||||
else
|
||||
letter=String.fromCharCode(e.keyCode);
|
||||
// shown
|
||||
if( this._isShown() )
|
||||
{
|
||||
// if escape, hide the box
|
||||
if(letter=="Esc")
|
||||
{
|
||||
this._hide();
|
||||
return false;
|
||||
}
|
||||
// Enter
|
||||
else if( letter=="Entrer")
|
||||
{
|
||||
var as = this.container.getElementsByTagName('A');
|
||||
// select a suggested entry
|
||||
if( this.selectIndex >= 0 && this.selectIndex < as.length )
|
||||
{
|
||||
as[ this.selectIndex ].onmousedown();
|
||||
return false
|
||||
}
|
||||
// simply add an enter in the code
|
||||
else
|
||||
{
|
||||
this._hide();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else if( letter=="Tab" || letter=="Down")
|
||||
{
|
||||
this._selectNext();
|
||||
return false;
|
||||
}
|
||||
else if( letter=="Up")
|
||||
{
|
||||
this._selectBefore();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
// hidden
|
||||
else
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
// show current suggestion list and do autoSelect if possible (no matter it's shown or hidden)
|
||||
if( letter=="Space" && CtrlPressed(e) )
|
||||
{
|
||||
//parent.console.log('SHOW SUGGEST');
|
||||
this.forceDisplay = true;
|
||||
this.autoSelectIfOneResult = true;
|
||||
this._checkLetter();
|
||||
return false;
|
||||
}
|
||||
|
||||
// wait a short period for check that the cursor isn't moving
|
||||
setTimeout("editArea.plugins['autocompletion']._checkDelayAndCursorBeforeDisplay();", editArea.check_line_selection_timer +5 );
|
||||
this.checkDelayTimer = false;
|
||||
return true;
|
||||
}
|
||||
/**
|
||||
* Executes a specific command, this function handles plugin commands.
|
||||
*
|
||||
* @param {string} cmd: the name of the command being executed
|
||||
* @param {unknown} param: the parameter of the command
|
||||
* @return true - pass to next handler in chain, false - stop chain execution
|
||||
* @type boolean
|
||||
*/
|
||||
,execCommand: function(cmd, param){
|
||||
switch( cmd ){
|
||||
case 'toggle_autocompletion':
|
||||
var icon= document.getElementById("autocompletion");
|
||||
if(!this.enabled)
|
||||
{
|
||||
if(icon != null){
|
||||
editArea.restoreClass(icon);
|
||||
editArea.switchClassSticky(icon, 'editAreaButtonSelected', true);
|
||||
}
|
||||
this.enabled= true;
|
||||
}
|
||||
else
|
||||
{
|
||||
this.enabled= false;
|
||||
if(icon != null)
|
||||
editArea.switchClassSticky(icon, 'editAreaButtonNormal', false);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
,_checkDelayAndCursorBeforeDisplay: function()
|
||||
{
|
||||
this.checkDelayTimer = setTimeout("if(editArea.textarea.selectionStart == "+ editArea.textarea.selectionStart +") EditArea_autocompletion._checkLetter();", this.delayBeforeDisplay - editArea.check_line_selection_timer - 5 );
|
||||
}
|
||||
// hide the suggested box
|
||||
,_hide: function(){
|
||||
this.container.style.display="none";
|
||||
this.selectIndex = -1;
|
||||
this.shown = false;
|
||||
this.forceDisplay = false;
|
||||
this.autoSelectIfOneResult = false;
|
||||
}
|
||||
// display the suggested box
|
||||
,_show: function(){
|
||||
if( !this._isShown() )
|
||||
{
|
||||
this.container.style.display="block";
|
||||
this.selectIndex = -1;
|
||||
this.shown = true;
|
||||
}
|
||||
}
|
||||
// is the suggested box displayed?
|
||||
,_isShown: function(){
|
||||
return this.shown;
|
||||
}
|
||||
// setter and getter
|
||||
,_isInMiddleWord: function( new_value ){
|
||||
if( typeof( new_value ) == "undefined" )
|
||||
return this.isInMiddleWord;
|
||||
else
|
||||
this.isInMiddleWord = new_value;
|
||||
}
|
||||
// select the next element in the suggested box
|
||||
,_selectNext: function()
|
||||
{
|
||||
var as = this.container.getElementsByTagName('A');
|
||||
|
||||
// clean existing elements
|
||||
for( var i=0; i<as.length; i++ )
|
||||
{
|
||||
if( as[i].className )
|
||||
as[i].className = as[i].className.replace(/ focus/g, '');
|
||||
}
|
||||
|
||||
this.selectIndex++;
|
||||
this.selectIndex = ( this.selectIndex >= as.length || this.selectIndex < 0 ) ? 0 : this.selectIndex;
|
||||
as[ this.selectIndex ].className += " focus";
|
||||
}
|
||||
// select the previous element in the suggested box
|
||||
,_selectBefore: function()
|
||||
{
|
||||
var as = this.container.getElementsByTagName('A');
|
||||
|
||||
// clean existing elements
|
||||
for( var i=0; i<as.length; i++ )
|
||||
{
|
||||
if( as[i].className )
|
||||
as[i].className = as[ i ].className.replace(/ focus/g, '');
|
||||
}
|
||||
|
||||
this.selectIndex--;
|
||||
|
||||
this.selectIndex = ( this.selectIndex >= as.length || this.selectIndex < 0 ) ? as.length-1 : this.selectIndex;
|
||||
as[ this.selectIndex ].className += " focus";
|
||||
}
|
||||
,_select: function( content )
|
||||
{
|
||||
cursor_forced_position = content.indexOf( '{@}' );
|
||||
content = content.replace(/{@}/g, '' );
|
||||
editArea.getIESelection();
|
||||
|
||||
// retrive the number of matching characters
|
||||
var start_index = Math.max( 0, editArea.textarea.selectionEnd - content.length );
|
||||
|
||||
line_string = editArea.textarea.value.substring( start_index, editArea.textarea.selectionEnd + 1);
|
||||
limit = line_string.length -1;
|
||||
nbMatch = 0;
|
||||
for( i =0; i<limit ; i++ )
|
||||
{
|
||||
if( line_string.substring( limit - i - 1, limit ) == content.substring( 0, i + 1 ) )
|
||||
nbMatch = i + 1;
|
||||
}
|
||||
// if characters match, we should include them in the selection that will be replaced
|
||||
if( nbMatch > 0 )
|
||||
parent.editAreaLoader.setSelectionRange(editArea.id, editArea.textarea.selectionStart - nbMatch , editArea.textarea.selectionEnd);
|
||||
|
||||
parent.editAreaLoader.setSelectedText(editArea.id, content );
|
||||
range= parent.editAreaLoader.getSelectionRange(editArea.id);
|
||||
|
||||
if( cursor_forced_position != -1 )
|
||||
new_pos = range["end"] - ( content.length-cursor_forced_position );
|
||||
else
|
||||
new_pos = range["end"];
|
||||
parent.editAreaLoader.setSelectionRange(editArea.id, new_pos, new_pos);
|
||||
this._hide();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Parse the AUTO_COMPLETION part of syntax definition files
|
||||
*/
|
||||
,_parseSyntaxAutoCompletionDatas: function(){
|
||||
//foreach syntax loaded
|
||||
for(var lang in parent.editAreaLoader.load_syntax)
|
||||
{
|
||||
if(!parent.editAreaLoader.syntax[lang]['autocompletion']) // init the regexp if not already initialized
|
||||
{
|
||||
parent.editAreaLoader.syntax[lang]['autocompletion']= {};
|
||||
// the file has auto completion datas
|
||||
if(parent.editAreaLoader.load_syntax[lang]['AUTO_COMPLETION'])
|
||||
{
|
||||
// parse them
|
||||
for(var i in parent.editAreaLoader.load_syntax[lang]['AUTO_COMPLETION'])
|
||||
{
|
||||
datas = parent.editAreaLoader.load_syntax[lang]['AUTO_COMPLETION'][i];
|
||||
tmp = {};
|
||||
if(datas["CASE_SENSITIVE"]!="undefined" && datas["CASE_SENSITIVE"]==false)
|
||||
tmp["modifiers"]="i";
|
||||
else
|
||||
tmp["modifiers"]="";
|
||||
tmp["prefix_separator"]= datas["REGEXP"]["prefix_separator"];
|
||||
tmp["match_prefix_separator"]= new RegExp( datas["REGEXP"]["prefix_separator"] +"$", tmp["modifiers"]);
|
||||
tmp["match_word"]= new RegExp("(?:"+ datas["REGEXP"]["before_word"] +")("+ datas["REGEXP"]["possible_words_letters"] +")$", tmp["modifiers"]);
|
||||
tmp["match_next_letter"]= new RegExp("^("+ datas["REGEXP"]["letter_after_word_must_match"] +")$", tmp["modifiers"]);
|
||||
tmp["keywords"]= {};
|
||||
//console.log( datas["KEYWORDS"] );
|
||||
for( var prefix in datas["KEYWORDS"] )
|
||||
{
|
||||
tmp["keywords"][prefix]= {
|
||||
prefix: prefix,
|
||||
prefix_name: prefix,
|
||||
prefix_reg: new RegExp("(?:"+ parent.editAreaLoader.get_escaped_regexp( prefix ) +")(?:"+ tmp["prefix_separator"] +")$", tmp["modifiers"] ),
|
||||
datas: []
|
||||
};
|
||||
for( var j=0; j<datas["KEYWORDS"][prefix].length; j++ )
|
||||
{
|
||||
tmp["keywords"][prefix]['datas'][j]= {
|
||||
is_typing: datas["KEYWORDS"][prefix][j][0],
|
||||
// if replace with is empty, replace with the is_typing value
|
||||
replace_with: datas["KEYWORDS"][prefix][j][1] ? datas["KEYWORDS"][prefix][j][1].replace('§', datas["KEYWORDS"][prefix][j][0] ) : '',
|
||||
comment: datas["KEYWORDS"][prefix][j][2] ? datas["KEYWORDS"][prefix][j][2] : ''
|
||||
};
|
||||
|
||||
// the replace with shouldn't be empty
|
||||
if( tmp["keywords"][prefix]['datas'][j]['replace_with'].length == 0 )
|
||||
tmp["keywords"][prefix]['datas'][j]['replace_with'] = tmp["keywords"][prefix]['datas'][j]['is_typing'];
|
||||
|
||||
// if the comment is empty, display the replace_with value
|
||||
if( tmp["keywords"][prefix]['datas'][j]['comment'].length == 0 )
|
||||
tmp["keywords"][prefix]['datas'][j]['comment'] = tmp["keywords"][prefix]['datas'][j]['replace_with'].replace(/{@}/g, '' );
|
||||
}
|
||||
|
||||
}
|
||||
tmp["max_text_length"]= datas["MAX_TEXT_LENGTH"];
|
||||
parent.editAreaLoader.syntax[lang]['autocompletion'][i] = tmp;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
,_checkLetter: function(){
|
||||
// check that syntax hasn't changed
|
||||
if( this.curr_syntax_str != editArea.settings['syntax'] )
|
||||
{
|
||||
if( !parent.editAreaLoader.syntax[editArea.settings['syntax']]['autocompletion'] )
|
||||
this._parseSyntaxAutoCompletionDatas();
|
||||
this.curr_syntax= parent.editAreaLoader.syntax[editArea.settings['syntax']]['autocompletion'];
|
||||
this.curr_syntax_str = editArea.settings['syntax'];
|
||||
//console.log( this.curr_syntax );
|
||||
}
|
||||
|
||||
if( editArea.is_editable )
|
||||
{
|
||||
time=new Date;
|
||||
t1= time.getTime();
|
||||
editArea.getIESelection();
|
||||
this.selectIndex = -1;
|
||||
start=editArea.textarea.selectionStart;
|
||||
var str = editArea.textarea.value;
|
||||
var results= [];
|
||||
|
||||
|
||||
for(var i in this.curr_syntax)
|
||||
{
|
||||
var last_chars = str.substring(Math.max(0, start-this.curr_syntax[i]["max_text_length"]), start);
|
||||
var matchNextletter = str.substring(start, start+1).match( this.curr_syntax[i]["match_next_letter"]);
|
||||
// if not writting in the middle of a word or if forcing display
|
||||
if( matchNextletter || this.forceDisplay )
|
||||
{
|
||||
// check if the last chars match a separator
|
||||
var match_prefix_separator = last_chars.match(this.curr_syntax[i]["match_prefix_separator"]);
|
||||
|
||||
// check if it match a possible word
|
||||
var match_word= last_chars.match(this.curr_syntax[i]["match_word"]);
|
||||
|
||||
//console.log( match_word );
|
||||
if( match_word )
|
||||
{
|
||||
var begin_word= match_word[1];
|
||||
var match_curr_word= new RegExp("^"+ parent.editAreaLoader.get_escaped_regexp( begin_word ), this.curr_syntax[i]["modifiers"]);
|
||||
//console.log( match_curr_word );
|
||||
for(var prefix in this.curr_syntax[i]["keywords"])
|
||||
{
|
||||
// parent.console.log( this.curr_syntax[i]["keywords"][prefix] );
|
||||
for(var j=0; j<this.curr_syntax[i]["keywords"][prefix]['datas'].length; j++)
|
||||
{
|
||||
// parent.console.log( this.curr_syntax[i]["keywords"][prefix]['datas'][j]['is_typing'] );
|
||||
// the key word match or force display
|
||||
if( this.curr_syntax[i]["keywords"][prefix]['datas'][j]['is_typing'].match(match_curr_word) )
|
||||
{
|
||||
// parent.console.log('match');
|
||||
hasMatch = false;
|
||||
var before = last_chars.substr( 0, last_chars.length - begin_word.length );
|
||||
|
||||
// no prefix to match => it's valid
|
||||
if( !match_prefix_separator && this.curr_syntax[i]["keywords"][prefix]['prefix'].length == 0 )
|
||||
{
|
||||
if( ! before.match( this.curr_syntax[i]["keywords"][prefix]['prefix_reg'] ) )
|
||||
hasMatch = true;
|
||||
}
|
||||
// we still need to check the prefix if there is one
|
||||
else if( this.curr_syntax[i]["keywords"][prefix]['prefix'].length > 0 )
|
||||
{
|
||||
if( before.match( this.curr_syntax[i]["keywords"][prefix]['prefix_reg'] ) )
|
||||
hasMatch = true;
|
||||
}
|
||||
|
||||
if( hasMatch )
|
||||
results[results.length]= [ this.curr_syntax[i]["keywords"][prefix], this.curr_syntax[i]["keywords"][prefix]['datas'][j] ];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// it doesn't match any possible word but we want to display something
|
||||
// we'll display to list of all available words
|
||||
else if( this.forceDisplay || match_prefix_separator )
|
||||
{
|
||||
for(var prefix in this.curr_syntax[i]["keywords"])
|
||||
{
|
||||
for(var j=0; j<this.curr_syntax[i]["keywords"][prefix]['datas'].length; j++)
|
||||
{
|
||||
hasMatch = false;
|
||||
// no prefix to match => it's valid
|
||||
if( !match_prefix_separator && this.curr_syntax[i]["keywords"][prefix]['prefix'].length == 0 )
|
||||
{
|
||||
hasMatch = true;
|
||||
}
|
||||
// we still need to check the prefix if there is one
|
||||
else if( match_prefix_separator && this.curr_syntax[i]["keywords"][prefix]['prefix'].length > 0 )
|
||||
{
|
||||
var before = last_chars; //.substr( 0, last_chars.length );
|
||||
if( before.match( this.curr_syntax[i]["keywords"][prefix]['prefix_reg'] ) )
|
||||
hasMatch = true;
|
||||
}
|
||||
|
||||
if( hasMatch )
|
||||
results[results.length]= [ this.curr_syntax[i]["keywords"][prefix], this.curr_syntax[i]["keywords"][prefix]['datas'][j] ];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// there is only one result, and we can select it automatically
|
||||
if( results.length == 1 && this.autoSelectIfOneResult )
|
||||
{
|
||||
// console.log( results );
|
||||
this._select( results[0][1]['replace_with'] );
|
||||
}
|
||||
else if( results.length == 0 )
|
||||
{
|
||||
this._hide();
|
||||
}
|
||||
else
|
||||
{
|
||||
// build the suggestion box content
|
||||
var lines=[];
|
||||
for(var i=0; i<results.length; i++)
|
||||
{
|
||||
var line= "<li><a href=\"#\" class=\"entry\" onmousedown=\"EditArea_autocompletion._select('"+ results[i][1]['replace_with'].replace(new RegExp('"', "g"), """) +"');return false;\">"+ results[i][1]['comment'];
|
||||
if(results[i][0]['prefix_name'].length>0)
|
||||
line+='<span class="prefix">'+ results[i][0]['prefix_name'] +'</span>';
|
||||
line+='</a></li>';
|
||||
lines[lines.length]=line;
|
||||
}
|
||||
// sort results
|
||||
this.container.innerHTML = '<ul>'+ lines.sort().join('') +'</ul>';
|
||||
|
||||
var cursor = _$("cursor_pos");
|
||||
this.container.style.top = ( cursor.cursor_top + editArea.lineHeight ) +"px";
|
||||
this.container.style.left = ( cursor.cursor_left + 8 ) +"px";
|
||||
this._show();
|
||||
}
|
||||
|
||||
this.autoSelectIfOneResult = false;
|
||||
time=new Date;
|
||||
t2= time.getTime();
|
||||
|
||||
//parent.console.log( begin_word +"\n"+ (t2-t1) +"\n"+ html );
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Load as a plugin
|
||||
editArea.settings['plugins'][ editArea.settings['plugins'].length ] = 'autocompletion';
|
||||
editArea.add_plugin('autocompletion', EditArea_autocompletion);
|
||||
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
@@ -36,3 +36,4 @@ else{lang_style[lang][i]=this.load_syntax[lang]['STYLES'][i];}}}var style="";for
|
||||
var editAreaLoader= eAL;var editAreas=eAs;EditAreaLoader=EAL;editAreaLoader.iframe_script= "<script type='text/javascript'> Ã EA(){var t=Á;t.error=Ì;t.inlinePopup=[{popup_id:\"area_search_replace\",icon_id:\"search\"},{popup_id:\"edit_area_help\",icon_id:\"help\"}];t.plugins={};t.line_number=0;È.eAL.set_browser_infos(t);if(t.isIE >=8)t.isIE=7;t.É={};t.last_text_to_highlight=\"\";t.last_hightlighted_text=\"\";t.syntax_list=[];t.allready_used_syntax={};t.check_line_selection_timer=50;t.ÂFocused=Ì;t.highlight_selection_line=null;t.previous=[];t.next=[];t.last_undo=\"\";t.files={};t.filesIdAssoc={};t.curr_file='';t.assocBracket={};t.revertAssocBracket={};t.assocBracket[\"(\"]=\")\";t.assocBracket[\"{\"]=\"}\";t.assocBracket[\"[\"]=\"]\";for(var index in t.assocBracket){t.revertAssocBracket[t.assocBracket[index]]=index;}t.is_editable=Ë;t.lineHeight=16;t.tab_nb_char=8;if(t.isOpera)t.tab_nb_char=6;t.is_tabbing=Ì;t.fullscreen={'isFull':Ì};t.isResizing=Ì;t.id=area_id;t.Å=eAs[t.id][\"Å\"];if((\"\"+t.Å['replace_tab_by_spaces']).match(/^[0-9]+$/)){t.tab_nb_char=t.Å['replace_tab_by_spaces'];t.tabulation=\"\";for(var i=0;i<t.tab_nb_char;i++)t.tabulation+=\" \";}\nelse{t.tabulation=\"\t\";}if(t.Å[\"syntax_selection_allow\"]&&t.Å[\"syntax_selection_allow\"].Æ>0)t.syntax_list=t.Å[\"syntax_selection_allow\"].replace(/ /g,\"\").split(\",\");if(t.Å['syntax'])t.allready_used_syntax[t.Å['syntax']]=Ë;};EA.Ä.init=Ã(){var t=Á,a,s=t.Å;t.Â=_$(\"Â\");t.container=_$(\"container\");t.result=_$(\"result\");t.content_highlight=_$(\"content_highlight\");t.selection_field=_$(\"selection_field\");t.selection_field_text=_$(\"selection_field_text\");t.processing_screen=_$(\"processing\");t.editor_area=_$(\"editor\");t.tab_browsing_area=_$(\"tab_browsing_area\");t.test_font_size=_$(\"test_font_size\");a=t.Â;if(!s['is_editable'])t.set_editable(Ì);t.set_show_line_colors(s['show_line_colors']);if(syntax_selec=_$(\"syntax_selection\")){for(var i=0;i<t.syntax_list.Æ;i++){var syntax=t.syntax_list[i];var option=document.createElement(\"option\");option.Ê=syntax;if(syntax==s['syntax'])option.selected=\"selected\";dispSyntax=È.eAL.syntax_display_name[ syntax ];option.innerHTML=typeof(dispSyntax)=='undefined' ? syntax.substring(0,1).toUpperCase()+syntax.substring(1):dispSyntax;syntax_selec.appendChild(option);}}spans=È.getChildren(_$(\"toolbar_1\"),\"span\",\"\",\"\",\"all\",-1);for(var i=0;i<spans.Æ;i++){id=spans[i].id.replace(/tmp_tool_(.*)/,\"$1\");if(id!=spans[i].id){for(var j in t.plugins){if(typeof(t.plugins[j].get_control_html)==\"Ã\"){html=t.plugins[j].get_control_html(id);if(html!=Ì){html=t.get_translation(html,\"template\");var new_span=document.createElement(\"span\");new_span.innerHTML=html;var father=spans[i].ÈNode;spans[i].ÈNode.replaceChild(new_span,spans[i]);break;}}}}}if(s[\"debug\"]){t.debug=È.document.getElementById(\"edit_area_debug_\"+t.id);}if(_$(\"redo\")!=null)t.switchClassSticky(_$(\"redo\"),'editAreaButtonDisabled',Ë);if(typeof(È.eAL.syntax[s[\"syntax\"]])!=\"undefined\"){for(var i in È.eAL.syntax){if(typeof(È.eAL.syntax[i][\"Çs\"])!=\"undefined\"){t.add_Ç(È.eAL.syntax[i][\"Çs\"]);}}}if(t.isOpera)_$(\"editor\").onkeypress=keyDown;\nelse _$(\"editor\").onkeydown=keyDown;for(var i=0;i<t.inlinePopup.Æ;i++){if(t.isOpera)_$(t.inlinePopup[i][\"popup_id\"]).onkeypress=keyDown;\nelse _$(t.inlinePopup[i][\"popup_id\"]).onkeydown=keyDown;}if(s[\"allow_resize\"]==\"both\"||s[\"allow_resize\"]==\"x\"||s[\"allow_resize\"]==\"y\")t.allow_resize(Ë);È.eAL.toggle(t.id,\"on\");t.change_smooth_selection_mode(eA.smooth_selection);t.execCommand(\"change_highlight\",s[\"start_highlight\"]);t.set_font(eA.Å[\"font_family\"],eA.Å[\"font_size\"]);children=È.getChildren(document.body,\"\",\"selec\",\"none\",\"all\",-1);for(var i=0;i<children.Æ;i++){if(t.isIE)children[i].unselectable=Ë;\nelse children[i].onmousedown=Ã(){return Ì};}a.spellcheck=s[\"gecko_spellcheck\"];if(t.isFirefox >='3'){t.content_highlight.Ç.paddingLeft=\"1px\";t.selection_field.Ç.paddingLeft=\"1px\";t.selection_field_text.Ç.paddingLeft=\"1px\";}if(t.isIE&&t.isIE < 8){a.Ç.marginTop=\"-1px\";}if(t.isSafari){t.editor_area.Ç.position=\"absolute\";if(t.isSafari < 3.2)a.Ç.marginTop=\"1px\";}È.eAL.add_event(t.result,\"click\",Ã(e){if((e.target||e.srcElement)==eA.result){eA.area_select(eA.Â.Ê.Æ,0);}});if(s['is_multi_files']!=Ì)t.open_file({'id':t.curr_file,'text':''});t.set_word_wrap(s['word_wrap']);setTimeout(\"eA.focus();eA.manage_size();eA.execCommand('EA_load');\",10);t.check_undo();t.check_line_selection(Ë);t.scroll_to_view();for(var i in t.plugins){if(typeof(t.plugins[i].onload)==\"Ã\")t.plugins[i].onload();}if(s['fullscreen']==Ë)t.toggle_full_screen(Ë);È.eAL.add_event(window,\"resize\",eA.update_size);È.eAL.add_event(È.window,\"resize\",eA.update_size);È.eAL.add_event(top.window,\"resize\",eA.update_size);È.eAL.add_event(window,\"unload\",Ã(){if(È.eAL){È.eAL.remove_event(È.window,\"resize\",eA.update_sizeLine truncated
|
||||
editAreaLoader.template= "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\"> <html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" > <head> <title>EditArea</title> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /> <meta http-equiv=\"X-UA-Compatible\" content=\"IE=EmulateIE7\"/> [__CSSRULES__] [__JSCODE__] </head> <body> <div id='editor'> <div class='area_toolbar' id='toolbar_1'>[__TOOLBAR__]</div> <div class='area_toolbar' id='tab_browsing_area'><ul id='tab_browsing_list' class='menu'> <li> </li> </ul></div> <div id='result'> <div id='no_file_selected'></div> <div id='container'> <div id='cursor_pos' class='edit_area_cursor'> </div> <div id='end_bracket' class='edit_area_cursor'> </div> <div id='selection_field'></div> <div id='line_number' selec='none'></div> <div id='content_highlight'></div> <div id='test_font_size'></div> <div id='selection_field_text'></div> <textarea id='textarea' wrap='off' onchange='editArea.execCommand(\"onchange\");' onfocus='javascript:editArea.textareaFocused=true;' onblur='javascript:editArea.textareaFocused=false;'> </textarea> </div> </div> <div class='area_toolbar' id='toolbar_2'> <table class='statusbar' cellspacing='0' cellpadding='0'> <tr> <td class='total' selec='none'>{$position}:</td> <td class='infos' selec='none'> {$line_abbr} <span id='linePos'>0</span>, {$char_abbr} <span id='currPos'>0</span> </td> <td class='total' selec='none'>{$total}:</td> <td class='infos' selec='none'> {$line_abbr} <span id='nbLine'>0</span>, {$char_abbr} <span id='nbChar'>0</span> </td> <td class='resize'> <span id='resize_area'><img src='[__BASEURL__]images/statusbar_resize.gif' alt='resize' selec='none'></span> </td> </tr> </table> </div> </div> <div id='processing'> <div id='processing_text'> {$processing} </div> </div> <div id='area_search_replace' class='editarea_popup'> <table cellspacing='2' cellpadding='0' style='width: 100%'> <tr> <td selec='none'>{$search}</td> <td><input type='text' id='area_search' /></td> <td id='close_area_search_replace'> <a onclick='Javascript:editArea.execCommand(\"hidden_search\")'><img selec='none' src='[__BASEURL__]images/close.gif' alt='{$close_popup}' title='{$close_popup}' /></a><br /> </tr><tr> <td selec='none'>{$replace}</td> <td><input type='text' id='area_replace' /></td> <td><img id='move_area_search_replace' onmousedown='return parent.start_move_element(event,\"area_search_replace\", parent.frames[\"frame_\"+editArea.id]);' src='[__BASEURL__]images/move.gif' alt='{$move_popup}' title='{$move_popup}' /></td> </tr> </table> <div class='button'> <input type='checkbox' id='area_search_match_case' /><label for='area_search_match_case' selec='none'>{$match_case}</label> <input type='checkbox' id='area_search_reg_exp' /><label for='area_search_reg_exp' selec='none'>{$reg_exp}</label> <br /> <a onclick='Javascript:editArea.execCommand(\"area_search\")' selec='none'>{$find_next}</a> <a onclick='Javascript:editArea.execCommand(\"area_replace\")' selec='none'>{$replace}</a> <a onclick='Javascript:editArea.execCommand(\"area_replace_all\")' selec='none'>{$replace_all}</a><br /> </div> <div id='area_search_msg' selec='none'></div> </div> <div id='edit_area_help' class='editarea_popup'> <div class='close_popup'> <a onclick='Javascript:editArea.execCommand(\"close_all_inline_popup\")'><img src='[__BASEURL__]images/close.gif' alt='{$close_popup}' title='{$close_popup}' /></a> </div> <div><h2>Editarea [__EA_VERSION__]</h2><br /> <h3>{$shortcuts}:</h3> {$tab}: {$add_tab}<br /> {$shift}+{$tab}: {$remove_tab}<br /> {$ctrl}+f: {$search_command}<br /> {$ctrl}+r: {$replace_command}<br /> {$ctrl}+h: {$highlight}<br /> {$ctrl}+g: {$go_to_line}<br /> {$ctrl}+z: {$undo}<br /> {$ctrl}+y: {$redo}<br /> {$ctrl}+e: {$help}<br /> {$ctrl}+q, {$esc}: {$close_popup}<br /> {$accesskey} E: {$toggle}<br /> <br /> <em>{$about_notice}</em> <br /><div class='copyright'>© Christophe Dolivet 2007-2010</div> </div> </div> </body> </html> ";
|
||||
editAreaLoader.iframe_css= "<style>body,html{margin:0;padding:0;height:100%;border:none;overflow:hidden;background-color:#FFF;}body,html,table,form,textarea{font:12px monospace,sans-serif;}#editor{border:solid #888 1px;overflow:hidden;}#result{z-index:4;overflow-x:auto;overflow-y:scroll;border-top:solid #888 1px;border-bottom:solid #888 1px;position:relative;clear:both;}#result.empty{overflow:hidden;}#container{overflow:hidden;border:solid blue 0;position:relative;z-index:10;padding:0 5px 0 45px;}#textarea{position:relative;top:0;left:0;margin:0;padding:0;width:100%;height:100%;overflow:hidden;z-index:7;border-width:0;background-color:transparent;resize:none;}#textarea,#textarea:hover{outline:none;}#content_highlight{white-space:pre;margin:0;padding:0;position:absolute;z-index:4;overflow:visible;}#selection_field,#selection_field_text{margin:0;background-color:#E1F2F9;position:absolute;z-index:5;top:-100px;padding:0;white-space:pre;overflow:hidden;}#selection_field.show_colors {z-index:3;background-color:#EDF9FC;}#selection_field strong{font-weight:normal;}#selection_field.show_colors *,#selection_field_text * {visibility:hidden;}#selection_field_text{background-color:transparent;}#selection_field_text strong{font-weight:normal;background-color:#3399FE;color:#FFF;visibility:visible;}#container.word_wrap #content_highlight,#container.word_wrap #selection_field,#container.word_wrap #selection_field_text,#container.word_wrap #test_font_size{white-space:pre-wrap;white-space:-moz-pre-wrap !important;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word;width:99%;}#line_number{position:absolute;overflow:hidden;border-right:solid black 1px;z-index:8;width:38px;padding:0 5px 0 0;margin:0 0 0 -45px;text-align:right;color:#AAAAAA;}#test_font_size{padding:0;margin:0;visibility:hidden;position:absolute;white-space:pre;}pre{margin:0;padding:0;}.hidden{opacity:0.2;filter:alpha(opacity=20);}#result .edit_area_cursor{position:absolute;z-index:6;background-color:#FF6633;top:-100px;margin:0;}#result .edit_area_selection_field .overline{background-color:#996600;}.editarea_popup{border:solid 1px #888888;background-color:#ECE9D8;width:250px;padding:4px;position:absolute;visibility:hidden;z-index:15;top:-500px;}.editarea_popup,.editarea_popup table{font-family:sans-serif;font-size:10pt;}.editarea_popup img{border:0;}.editarea_popup .close_popup{float:right;line-height:16px;border:0;padding:0;}.editarea_popup h1,.editarea_popup h2,.editarea_popup h3,.editarea_popup h4,.editarea_popup h5,.editarea_popup h6{margin:0;padding:0;}.editarea_popup .copyright{text-align:right;}div#area_search_replace{}div#area_search_replace img{border:0;}div#area_search_replace div.button{text-align:center;line-height:1.7em;}div#area_search_replace .button a{cursor:pointer;border:solid 1px #888888;background-color:#DEDEDE;text-decoration:none;padding:0 2px;color:#000000;white-space:nowrap;}div#area_search_replace a:hover{background-color:#EDEDED;}div#area_search_replace #move_area_search_replace{cursor:move;border:solid 1px #888;}div#area_search_replace #close_area_search_replace{text-align:right;vertical-align:top;white-space:nowrap;}div#area_search_replace #area_search_msg{height:18px;overflow:hidden;border-top:solid 1px #888;margin-top:3px;}#edit_area_help{width:350px;}#edit_area_help div.close_popup{float:right;}.area_toolbar{width:100%;margin:0;padding:0;background-color:#ECE9D8;text-align:center;}.area_toolbar,.area_toolbar table{font:11px sans-serif;}.area_toolbar img{border:0;vertical-align:middle;}.area_toolbar input{margin:0;padding:0;}.area_toolbar select{font-family:'MS Sans Serif',sans-serif,Verdana,Arial;font-size:7pt;font-weight:normal;margin:2px 0 0 0 ;padding:0;vertical-align:top;background-color:#F0F0EE;}table.statusbar{width:100%;}.area_toolbar td.infos{text-align:center;width:130px;border-right:solid 1px #888;border-width:0 1px 0 0;padding:0;}.area_toolbar td.total{text-align:right;width:50px;padding:0;}.area_toolbar td.resize{text-align:right;}.area_toolbar span#resize_area{cursor:nw-resize;visibility:hidden;}.editAreaButtonNormal,.editAreaButtonOver,.editAreaButtonDown,.editAreaSeparator,.editAreaSeparatorLine,.editAreaButtonDisabled,.editAreaButtonSelected {border:0; margin:0; padding:0; background:transparent;margin-top:0;margin-left:1px;padding:0;}.editAreaButtonNormal {border:1px solid #ECE9D8 !important;cursor:pointer;}.editAreaButtonOver {border:1px solid #0A246A !important;cursor:pointer;background-color:#B6BDD2;}.editAreaButtonDown {cursor:pointer;border:1px solid #0A246A !important;background-color:#8592B5;}.editAreaButtonSelected {border:1px solid #C0C0BB !important;cursor:pointer;background-color:#F4F2E8;}.editAreaButtonDisabled {filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30);-moz-opacity:0.3;opacity:0.3;border:1px solid #F0F0EE !important;cursor:pointer;}.editAreaSeparatorLine {margin:1px 2px;background-color:#C0C0BB;width:2px;height:18px;}#processing{display:none;background-color:#ECE9D8;boLine truncated
|
||||
|
||||
@@ -37,3 +37,4 @@ var editAreaLoader= eAL;var editAreas=eAs;EditAreaLoader=EAL;editAreaLoader.ifra
|
||||
editAreaLoader.all_plugins_loaded=true;
|
||||
editAreaLoader.template= "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\"> <html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" > <head> <title>EditArea</title> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /> <meta http-equiv=\"X-UA-Compatible\" content=\"IE=EmulateIE7\"/> [__CSSRULES__] [__JSCODE__] </head> <body> <div id='editor'> <div class='area_toolbar' id='toolbar_1'>[__TOOLBAR__]</div> <div class='area_toolbar' id='tab_browsing_area'><ul id='tab_browsing_list' class='menu'> <li> </li> </ul></div> <div id='result'> <div id='no_file_selected'></div> <div id='container'> <div id='cursor_pos' class='edit_area_cursor'> </div> <div id='end_bracket' class='edit_area_cursor'> </div> <div id='selection_field'></div> <div id='line_number' selec='none'></div> <div id='content_highlight'></div> <div id='test_font_size'></div> <div id='selection_field_text'></div> <textarea id='textarea' wrap='off' onchange='editArea.execCommand(\"onchange\");' onfocus='javascript:editArea.textareaFocused=true;' onblur='javascript:editArea.textareaFocused=false;'> </textarea> </div> </div> <div class='area_toolbar' id='toolbar_2'> <table class='statusbar' cellspacing='0' cellpadding='0'> <tr> <td class='total' selec='none'>{$position}:</td> <td class='infos' selec='none'> {$line_abbr} <span id='linePos'>0</span>, {$char_abbr} <span id='currPos'>0</span> </td> <td class='total' selec='none'>{$total}:</td> <td class='infos' selec='none'> {$line_abbr} <span id='nbLine'>0</span>, {$char_abbr} <span id='nbChar'>0</span> </td> <td class='resize'> <span id='resize_area'><img src='[__BASEURL__]images/statusbar_resize.gif' alt='resize' selec='none'></span> </td> </tr> </table> </div> </div> <div id='processing'> <div id='processing_text'> {$processing} </div> </div> <div id='area_search_replace' class='editarea_popup'> <table cellspacing='2' cellpadding='0' style='width: 100%'> <tr> <td selec='none'>{$search}</td> <td><input type='text' id='area_search' /></td> <td id='close_area_search_replace'> <a onclick='Javascript:editArea.execCommand(\"hidden_search\")'><img selec='none' src='[__BASEURL__]images/close.gif' alt='{$close_popup}' title='{$close_popup}' /></a><br /> </tr><tr> <td selec='none'>{$replace}</td> <td><input type='text' id='area_replace' /></td> <td><img id='move_area_search_replace' onmousedown='return parent.start_move_element(event,\"area_search_replace\", parent.frames[\"frame_\"+editArea.id]);' src='[__BASEURL__]images/move.gif' alt='{$move_popup}' title='{$move_popup}' /></td> </tr> </table> <div class='button'> <input type='checkbox' id='area_search_match_case' /><label for='area_search_match_case' selec='none'>{$match_case}</label> <input type='checkbox' id='area_search_reg_exp' /><label for='area_search_reg_exp' selec='none'>{$reg_exp}</label> <br /> <a onclick='Javascript:editArea.execCommand(\"area_search\")' selec='none'>{$find_next}</a> <a onclick='Javascript:editArea.execCommand(\"area_replace\")' selec='none'>{$replace}</a> <a onclick='Javascript:editArea.execCommand(\"area_replace_all\")' selec='none'>{$replace_all}</a><br /> </div> <div id='area_search_msg' selec='none'></div> </div> <div id='edit_area_help' class='editarea_popup'> <div class='close_popup'> <a onclick='Javascript:editArea.execCommand(\"close_all_inline_popup\")'><img src='[__BASEURL__]images/close.gif' alt='{$close_popup}' title='{$close_popup}' /></a> </div> <div><h2>Editarea [__EA_VERSION__]</h2><br /> <h3>{$shortcuts}:</h3> {$tab}: {$add_tab}<br /> {$shift}+{$tab}: {$remove_tab}<br /> {$ctrl}+f: {$search_command}<br /> {$ctrl}+r: {$replace_command}<br /> {$ctrl}+h: {$highlight}<br /> {$ctrl}+g: {$go_to_line}<br /> {$ctrl}+z: {$undo}<br /> {$ctrl}+y: {$redo}<br /> {$ctrl}+e: {$help}<br /> {$ctrl}+q, {$esc}: {$close_popup}<br /> {$accesskey} E: {$toggle}<br /> <br /> <em>{$about_notice}</em> <br /><div class='copyright'>© Christophe Dolivet 2007-2009</div> </div> </div> </body> </html> ";
|
||||
editAreaLoader.iframe_css= "<style>body,html{margin:0;padding:0;height:100%;border:none;overflow:hidden;background-color:#FFF;}body,html,table,form,textarea{font:12px monospace,sans-serif;}#editor{border:solid #888 1px;overflow:hidden;}#result{z-index:4;overflow-x:auto;overflow-y:scroll;border-top:solid #888 1px;border-bottom:solid #888 1px;position:relative;clear:both;}#result.empty{overflow:hidden;}#container{overflow:hidden;border:solid blue 0;position:relative;z-index:10;padding:0 5px 0 45px;}#textarea{position:relative;top:0;left:0;margin:0;padding:0;width:100%;height:100%;overflow:hidden;z-index:7;border-width:0;background-color:transparent;resize:none;}#textarea,#textarea:hover{outline:none;}#content_highlight{white-space:pre;margin:0;padding:0;position:absolute;z-index:4;overflow:visible;}#selection_field,#selection_field_text{margin:0;background-color:#E1F2F9;position:absolute;z-index:5;top:-100px;padding:0;white-space:pre;overflow:hidden;}#selection_field.show_colors {z-index:3;background-color:#EDF9FC;}#selection_field strong{font-weight:normal;}#selection_field.show_colors *,#selection_field_text * {visibility:hidden;}#selection_field_text{background-color:transparent;}#selection_field_text strong{font-weight:normal;background-color:#3399FE;color:#FFF;visibility:visible;}#container.word_wrap #content_highlight,#container.word_wrap #selection_field,#container.word_wrap #selection_field_text,#container.word_wrap #test_font_size{white-space:pre-wrap;white-space:-moz-pre-wrap !important;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word;width:99%;}#line_number{position:absolute;overflow:hidden;border-right:solid black 1px;z-index:8;width:38px;padding:0 5px 0 0;margin:0 0 0 -45px;text-align:right;color:#AAAAAA;}#test_font_size{padding:0;margin:0;visibility:hidden;position:absolute;white-space:pre;}pre{margin:0;padding:0;}.hidden{opacity:0.2;filter:alpha(opacity=20);}#result .edit_area_cursor{position:absolute;z-index:6;background-color:#FF6633;top:-100px;margin:0;}#result .edit_area_selection_field .overline{background-color:#996600;}.editarea_popup{border:solid 1px #888888;background-color:#ECE9D8;width:250px;padding:4px;position:absolute;visibility:hidden;z-index:15;top:-500px;}.editarea_popup,.editarea_popup table{font-family:sans-serif;font-size:10pt;}.editarea_popup img{border:0;}.editarea_popup .close_popup{float:right;line-height:16px;border:0;padding:0;}.editarea_popup h1,.editarea_popup h2,.editarea_popup h3,.editarea_popup h4,.editarea_popup h5,.editarea_popup h6{margin:0;padding:0;}.editarea_popup .copyright{text-align:right;}div#area_search_replace{}div#area_search_replace img{border:0;}div#area_search_replace div.button{text-align:center;line-height:1.7em;}div#area_search_replace .button a{cursor:pointer;border:solid 1px #888888;background-color:#DEDEDE;text-decoration:none;padding:0 2px;color:#000000;white-space:nowrap;}div#area_search_replace a:hover{background-color:#EDEDED;}div#area_search_replace #move_area_search_replace{cursor:move;border:solid 1px #888;}div#area_search_replace #close_area_search_replace{text-align:right;vertical-align:top;white-space:nowrap;}div#area_search_replace #area_search_msg{height:18px;overflow:hidden;border-top:solid 1px #888;margin-top:3px;}#edit_area_help{width:350px;}#edit_area_help div.close_popup{float:right;}.area_toolbar{width:100%;margin:0;padding:0;background-color:#ECE9D8;text-align:center;}.area_toolbar,.area_toolbar table{font:11px sans-serif;}.area_toolbar img{border:0;vertical-align:middle;}.area_toolbar input{margin:0;padding:0;}.area_toolbar select{font-family:'MS Sans Serif',sans-serif,Verdana,Arial;font-size:7pt;font-weight:normal;margin:2px 0 0 0 ;padding:0;vertical-align:top;background-color:#F0F0EE;}table.statusbar{width:100%;}.area_toolbar td.infos{text-align:center;width:130px;border-right:solid 1px #888;border-width:0 1px 0 0;padding:0;}.area_toolbar td.total{text-align:right;width:50px;padding:0;}.area_toolbar td.resize{text-align:right;}.area_toolbar span#resize_area{cursor:nw-resize;visibility:hidden;}.editAreaButtonNormal,.editAreaButtonOver,.editAreaButtonDown,.editAreaSeparator,.editAreaSeparatorLine,.editAreaButtonDisabled,.editAreaButtonSelected {border:0; margin:0; padding:0; background:transparent;margin-top:0;margin-left:1px;padding:0;}.editAreaButtonNormal {border:1px solid #ECE9D8 !important;cursor:pointer;}.editAreaButtonOver {border:1px solid #0A246A !important;cursor:pointer;background-color:#B6BDD2;}.editAreaButtonDown {cursor:pointer;border:1px solid #0A246A !important;background-color:#8592B5;}.editAreaButtonSelected {border:1px solid #C0C0BB !important;cursor:pointer;background-color:#F4F2E8;}.editAreaButtonDisabled {filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30);-moz-opacity:0.3;opacity:0.3;border:1px solid #F0F0EE !important;cursor:pointer;}.editAreaSeparatorLine {margin:1px 2px;background-color:#C0C0BB;width:2px;height:18px;}#processing{display:none;background-color:#ECE9D8;boLine truncated
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
@@ -1,336 +1,337 @@
|
||||
/****
|
||||
* This page contains some general usefull functions for javascript
|
||||
*
|
||||
****/
|
||||
|
||||
|
||||
// need to redefine this functiondue to IE problem
|
||||
function getAttribute( elm, aName ) {
|
||||
var aValue,taName,i;
|
||||
try{
|
||||
aValue = elm.getAttribute( aName );
|
||||
}catch(exept){}
|
||||
|
||||
if( ! aValue ){
|
||||
for( i = 0; i < elm.attributes.length; i ++ ) {
|
||||
taName = elm.attributes[i] .name.toLowerCase();
|
||||
if( taName == aName ) {
|
||||
aValue = elm.attributes[i] .value;
|
||||
return aValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
return aValue;
|
||||
};
|
||||
|
||||
// need to redefine this function due to IE problem
|
||||
function setAttribute( elm, attr, val ) {
|
||||
if(attr=="class"){
|
||||
elm.setAttribute("className", val);
|
||||
elm.setAttribute("class", val);
|
||||
}else{
|
||||
elm.setAttribute(attr, val);
|
||||
}
|
||||
};
|
||||
|
||||
/* return a child element
|
||||
elem: element we are searching in
|
||||
elem_type: type of the eleemnt we are searching (DIV, A, etc...)
|
||||
elem_attribute: attribute of the searched element that must match
|
||||
elem_attribute_match: value that elem_attribute must match
|
||||
option: "all" if must return an array of all children, otherwise return the first match element
|
||||
depth: depth of search (-1 or no set => unlimited)
|
||||
*/
|
||||
function getChildren(elem, elem_type, elem_attribute, elem_attribute_match, option, depth)
|
||||
{
|
||||
if(!option)
|
||||
var option="single";
|
||||
if(!depth)
|
||||
var depth=-1;
|
||||
if(elem){
|
||||
var children= elem.childNodes;
|
||||
var result=null;
|
||||
var results= [];
|
||||
for (var x=0;x<children.length;x++) {
|
||||
strTagName = new String(children[x].tagName);
|
||||
children_class="?";
|
||||
if(strTagName!= "undefined"){
|
||||
child_attribute= getAttribute(children[x],elem_attribute);
|
||||
if((strTagName.toLowerCase()==elem_type.toLowerCase() || elem_type=="") && (elem_attribute=="" || child_attribute==elem_attribute_match)){
|
||||
if(option=="all"){
|
||||
results.push(children[x]);
|
||||
}else{
|
||||
return children[x];
|
||||
}
|
||||
}
|
||||
if(depth!=0){
|
||||
result=getChildren(children[x], elem_type, elem_attribute, elem_attribute_match, option, depth-1);
|
||||
if(option=="all"){
|
||||
if(result.length>0){
|
||||
results= results.concat(result);
|
||||
}
|
||||
}else if(result!=null){
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(option=="all")
|
||||
return results;
|
||||
}
|
||||
return null;
|
||||
};
|
||||
|
||||
function isChildOf(elem, parent){
|
||||
if(elem){
|
||||
if(elem==parent)
|
||||
return true;
|
||||
while(elem.parentNode != 'undefined'){
|
||||
return isChildOf(elem.parentNode, parent);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
function getMouseX(e){
|
||||
|
||||
if(e!=null && typeof(e.pageX)!="undefined"){
|
||||
return e.pageX;
|
||||
}else{
|
||||
return (e!=null?e.x:event.x)+ document.documentElement.scrollLeft;
|
||||
}
|
||||
};
|
||||
|
||||
function getMouseY(e){
|
||||
if(e!=null && typeof(e.pageY)!="undefined"){
|
||||
return e.pageY;
|
||||
}else{
|
||||
return (e!=null?e.y:event.y)+ document.documentElement.scrollTop;
|
||||
}
|
||||
};
|
||||
|
||||
function calculeOffsetLeft(r){
|
||||
return calculeOffset(r,"offsetLeft")
|
||||
};
|
||||
|
||||
function calculeOffsetTop(r){
|
||||
return calculeOffset(r,"offsetTop")
|
||||
};
|
||||
|
||||
function calculeOffset(element,attr){
|
||||
var offset=0;
|
||||
while(element){
|
||||
offset+=element[attr];
|
||||
element=element.offsetParent
|
||||
}
|
||||
return offset;
|
||||
};
|
||||
|
||||
/** return the computed style
|
||||
* @param: elem: the reference to the element
|
||||
* @param: prop: the name of the css property
|
||||
*/
|
||||
function get_css_property(elem, prop)
|
||||
{
|
||||
if(document.defaultView)
|
||||
{
|
||||
return document.defaultView.getComputedStyle(elem, null).getPropertyValue(prop);
|
||||
}
|
||||
else if(elem.currentStyle)
|
||||
{
|
||||
var prop = prop.replace(/-\D/gi, function(sMatch)
|
||||
{
|
||||
return sMatch.charAt(sMatch.length - 1).toUpperCase();
|
||||
});
|
||||
return elem.currentStyle[prop];
|
||||
}
|
||||
else return null;
|
||||
}
|
||||
|
||||
/****
|
||||
* Moving an element
|
||||
***/
|
||||
|
||||
var _mCE; // currently moving element
|
||||
|
||||
/* allow to move an element in a window
|
||||
e: the event
|
||||
id: the id of the element
|
||||
frame: the frame of the element
|
||||
ex of use:
|
||||
in html: <img id='move_area_search_replace' onmousedown='return parent.start_move_element(event,"area_search_replace", parent.frames["this_frame_id"]);' .../>
|
||||
or
|
||||
in javascript: document.getElementById("my_div").onmousedown= start_move_element
|
||||
*/
|
||||
function start_move_element(e, id, frame){
|
||||
var elem_id=(e.target || e.srcElement).id;
|
||||
if(id)
|
||||
elem_id=id;
|
||||
if(!frame)
|
||||
frame=window;
|
||||
if(frame.event)
|
||||
e=frame.event;
|
||||
|
||||
_mCE= frame.document.getElementById(elem_id);
|
||||
_mCE.frame=frame;
|
||||
frame.document.onmousemove= move_element;
|
||||
frame.document.onmouseup= end_move_element;
|
||||
/*_mCE.onmousemove= move_element;
|
||||
_mCE.onmouseup= end_move_element;*/
|
||||
|
||||
//alert(_mCE.frame.document.body.offsetHeight);
|
||||
|
||||
mouse_x= getMouseX(e);
|
||||
mouse_y= getMouseY(e);
|
||||
//window.status=frame+ " elem: "+elem_id+" elem: "+ _mCE + " mouse_x: "+mouse_x;
|
||||
_mCE.start_pos_x = mouse_x - (_mCE.style.left.replace("px","") || calculeOffsetLeft(_mCE));
|
||||
_mCE.start_pos_y = mouse_y - (_mCE.style.top.replace("px","") || calculeOffsetTop(_mCE));
|
||||
return false;
|
||||
};
|
||||
|
||||
function end_move_element(e){
|
||||
_mCE.frame.document.onmousemove= "";
|
||||
_mCE.frame.document.onmouseup= "";
|
||||
_mCE=null;
|
||||
};
|
||||
|
||||
function move_element(e){
|
||||
var newTop,newLeft,maxLeft;
|
||||
|
||||
if( _mCE.frame && _mCE.frame.event )
|
||||
e=_mCE.frame.event;
|
||||
newTop = getMouseY(e) - _mCE.start_pos_y;
|
||||
newLeft = getMouseX(e) - _mCE.start_pos_x;
|
||||
|
||||
maxLeft = _mCE.frame.document.body.offsetWidth- _mCE.offsetWidth;
|
||||
max_top = _mCE.frame.document.body.offsetHeight- _mCE.offsetHeight;
|
||||
newTop = Math.min(Math.max(0, newTop), max_top);
|
||||
newLeft = Math.min(Math.max(0, newLeft), maxLeft);
|
||||
|
||||
_mCE.style.top = newTop+"px";
|
||||
_mCE.style.left = newLeft+"px";
|
||||
return false;
|
||||
};
|
||||
|
||||
/***
|
||||
* Managing a textarea (this part need the navigator infos from editAreaLoader
|
||||
***/
|
||||
|
||||
var nav= editAreaLoader.nav;
|
||||
|
||||
// allow to get infos on the selection: array(start, end)
|
||||
function getSelectionRange(textarea){
|
||||
return {"start": textarea.selectionStart, "end": textarea.selectionEnd};
|
||||
};
|
||||
|
||||
// allow to set the selection
|
||||
function setSelectionRange(t, start, end){
|
||||
t.focus();
|
||||
|
||||
start = Math.max(0, Math.min(t.value.length, start));
|
||||
end = Math.max(start, Math.min(t.value.length, end));
|
||||
|
||||
if( nav.isOpera && nav.isOpera < 9.6 ){ // Opera bug when moving selection start and selection end
|
||||
t.selectionEnd = 1;
|
||||
t.selectionStart = 0;
|
||||
t.selectionEnd = 1;
|
||||
t.selectionStart = 0;
|
||||
}
|
||||
t.selectionStart = start;
|
||||
t.selectionEnd = end;
|
||||
//textarea.setSelectionRange(start, end);
|
||||
|
||||
if(nav.isIE)
|
||||
set_IE_selection(t);
|
||||
};
|
||||
|
||||
|
||||
// set IE position in Firefox mode (textarea.selectionStart and textarea.selectionEnd). should work as a repeated task
|
||||
function get_IE_selection(t){
|
||||
var d=document,div,range,stored_range,elem,scrollTop,relative_top,line_start,line_nb,range_start,range_end,tab;
|
||||
if(t && t.focused)
|
||||
{
|
||||
if(!t.ea_line_height)
|
||||
{ // calculate the lineHeight
|
||||
div= d.createElement("div");
|
||||
div.style.fontFamily= get_css_property(t, "font-family");
|
||||
div.style.fontSize= get_css_property(t, "font-size");
|
||||
div.style.visibility= "hidden";
|
||||
div.innerHTML="0";
|
||||
d.body.appendChild(div);
|
||||
t.ea_line_height= div.offsetHeight;
|
||||
d.body.removeChild(div);
|
||||
}
|
||||
//t.focus();
|
||||
range = d.selection.createRange();
|
||||
try
|
||||
{
|
||||
stored_range = range.duplicate();
|
||||
stored_range.moveToElementText( t );
|
||||
stored_range.setEndPoint( 'EndToEnd', range );
|
||||
if(stored_range.parentElement() == t){
|
||||
// the range don't take care of empty lines in the end of the selection
|
||||
elem = t;
|
||||
scrollTop = 0;
|
||||
while(elem.parentNode){
|
||||
scrollTop+= elem.scrollTop;
|
||||
elem = elem.parentNode;
|
||||
}
|
||||
|
||||
// var scrollTop= t.scrollTop + document.body.scrollTop;
|
||||
|
||||
// var relative_top= range.offsetTop - calculeOffsetTop(t) + scrollTop;
|
||||
relative_top= range.offsetTop - calculeOffsetTop(t)+ scrollTop;
|
||||
// alert("rangeoffset: "+ range.offsetTop +"\ncalcoffsetTop: "+ calculeOffsetTop(t) +"\nrelativeTop: "+ relative_top);
|
||||
line_start = Math.round((relative_top / t.ea_line_height) +1);
|
||||
|
||||
line_nb = Math.round(range.boundingHeight / t.ea_line_height);
|
||||
|
||||
range_start = stored_range.text.length - range.text.length;
|
||||
tab = t.value.substr(0, range_start).split("\n");
|
||||
range_start += (line_start - tab.length)*2; // add missing empty lines to the selection
|
||||
t.selectionStart = range_start;
|
||||
|
||||
range_end = t.selectionStart + range.text.length;
|
||||
tab = t.value.substr(0, range_start + range.text.length).split("\n");
|
||||
range_end += (line_start + line_nb - 1 - tab.length)*2;
|
||||
t.selectionEnd = range_end;
|
||||
}
|
||||
}
|
||||
catch(e){}
|
||||
}
|
||||
if( t && t.id )
|
||||
{
|
||||
setTimeout("get_IE_selection(document.getElementById('"+ t.id +"'));", 50);
|
||||
}
|
||||
};
|
||||
|
||||
function IE_textarea_focus(){
|
||||
event.srcElement.focused= true;
|
||||
}
|
||||
|
||||
function IE_textarea_blur(){
|
||||
event.srcElement.focused= false;
|
||||
}
|
||||
|
||||
// select the text for IE (take into account the \r difference)
|
||||
function set_IE_selection( t ){
|
||||
var nbLineStart,nbLineStart,nbLineEnd,range;
|
||||
if(!window.closed){
|
||||
nbLineStart=t.value.substr(0, t.selectionStart).split("\n").length - 1;
|
||||
nbLineEnd=t.value.substr(0, t.selectionEnd).split("\n").length - 1;
|
||||
try
|
||||
{
|
||||
range = document.selection.createRange();
|
||||
range.moveToElementText( t );
|
||||
range.setEndPoint( 'EndToStart', range );
|
||||
range.moveStart('character', t.selectionStart - nbLineStart);
|
||||
range.moveEnd('character', t.selectionEnd - nbLineEnd - (t.selectionStart - nbLineStart) );
|
||||
range.select();
|
||||
}
|
||||
catch(e){}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
editAreaLoader.waiting_loading["elements_functions.js"]= "loaded";
|
||||
/****
|
||||
* This page contains some general usefull functions for javascript
|
||||
*
|
||||
****/
|
||||
|
||||
|
||||
// need to redefine this functiondue to IE problem
|
||||
function getAttribute( elm, aName ) {
|
||||
var aValue,taName,i;
|
||||
try{
|
||||
aValue = elm.getAttribute( aName );
|
||||
}catch(exept){}
|
||||
|
||||
if( ! aValue ){
|
||||
for( i = 0; i < elm.attributes.length; i ++ ) {
|
||||
taName = elm.attributes[i] .name.toLowerCase();
|
||||
if( taName == aName ) {
|
||||
aValue = elm.attributes[i] .value;
|
||||
return aValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
return aValue;
|
||||
};
|
||||
|
||||
// need to redefine this function due to IE problem
|
||||
function setAttribute( elm, attr, val ) {
|
||||
if(attr=="class"){
|
||||
elm.setAttribute("className", val);
|
||||
elm.setAttribute("class", val);
|
||||
}else{
|
||||
elm.setAttribute(attr, val);
|
||||
}
|
||||
};
|
||||
|
||||
/* return a child element
|
||||
elem: element we are searching in
|
||||
elem_type: type of the eleemnt we are searching (DIV, A, etc...)
|
||||
elem_attribute: attribute of the searched element that must match
|
||||
elem_attribute_match: value that elem_attribute must match
|
||||
option: "all" if must return an array of all children, otherwise return the first match element
|
||||
depth: depth of search (-1 or no set => unlimited)
|
||||
*/
|
||||
function getChildren(elem, elem_type, elem_attribute, elem_attribute_match, option, depth)
|
||||
{
|
||||
if(!option)
|
||||
var option="single";
|
||||
if(!depth)
|
||||
var depth=-1;
|
||||
if(elem){
|
||||
var children= elem.childNodes;
|
||||
var result=null;
|
||||
var results= [];
|
||||
for (var x=0;x<children.length;x++) {
|
||||
strTagName = new String(children[x].tagName);
|
||||
children_class="?";
|
||||
if(strTagName!= "undefined"){
|
||||
child_attribute= getAttribute(children[x],elem_attribute);
|
||||
if((strTagName.toLowerCase()==elem_type.toLowerCase() || elem_type=="") && (elem_attribute=="" || child_attribute==elem_attribute_match)){
|
||||
if(option=="all"){
|
||||
results.push(children[x]);
|
||||
}else{
|
||||
return children[x];
|
||||
}
|
||||
}
|
||||
if(depth!=0){
|
||||
result=getChildren(children[x], elem_type, elem_attribute, elem_attribute_match, option, depth-1);
|
||||
if(option=="all"){
|
||||
if(result.length>0){
|
||||
results= results.concat(result);
|
||||
}
|
||||
}else if(result!=null){
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(option=="all")
|
||||
return results;
|
||||
}
|
||||
return null;
|
||||
};
|
||||
|
||||
function isChildOf(elem, parent){
|
||||
if(elem){
|
||||
if(elem==parent)
|
||||
return true;
|
||||
while(elem.parentNode != 'undefined'){
|
||||
return isChildOf(elem.parentNode, parent);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
function getMouseX(e){
|
||||
|
||||
if(e!=null && typeof(e.pageX)!="undefined"){
|
||||
return e.pageX;
|
||||
}else{
|
||||
return (e!=null?e.x:event.x)+ document.documentElement.scrollLeft;
|
||||
}
|
||||
};
|
||||
|
||||
function getMouseY(e){
|
||||
if(e!=null && typeof(e.pageY)!="undefined"){
|
||||
return e.pageY;
|
||||
}else{
|
||||
return (e!=null?e.y:event.y)+ document.documentElement.scrollTop;
|
||||
}
|
||||
};
|
||||
|
||||
function calculeOffsetLeft(r){
|
||||
return calculeOffset(r,"offsetLeft")
|
||||
};
|
||||
|
||||
function calculeOffsetTop(r){
|
||||
return calculeOffset(r,"offsetTop")
|
||||
};
|
||||
|
||||
function calculeOffset(element,attr){
|
||||
var offset=0;
|
||||
while(element){
|
||||
offset+=element[attr];
|
||||
element=element.offsetParent
|
||||
}
|
||||
return offset;
|
||||
};
|
||||
|
||||
/** return the computed style
|
||||
* @param: elem: the reference to the element
|
||||
* @param: prop: the name of the css property
|
||||
*/
|
||||
function get_css_property(elem, prop)
|
||||
{
|
||||
if(document.defaultView)
|
||||
{
|
||||
return document.defaultView.getComputedStyle(elem, null).getPropertyValue(prop);
|
||||
}
|
||||
else if(elem.currentStyle)
|
||||
{
|
||||
var prop = prop.replace(/-\D/gi, function(sMatch)
|
||||
{
|
||||
return sMatch.charAt(sMatch.length - 1).toUpperCase();
|
||||
});
|
||||
return elem.currentStyle[prop];
|
||||
}
|
||||
else return null;
|
||||
}
|
||||
|
||||
/****
|
||||
* Moving an element
|
||||
***/
|
||||
|
||||
var _mCE; // currently moving element
|
||||
|
||||
/* allow to move an element in a window
|
||||
e: the event
|
||||
id: the id of the element
|
||||
frame: the frame of the element
|
||||
ex of use:
|
||||
in html: <img id='move_area_search_replace' onmousedown='return parent.start_move_element(event,"area_search_replace", parent.frames["this_frame_id"]);' .../>
|
||||
or
|
||||
in javascript: document.getElementById("my_div").onmousedown= start_move_element
|
||||
*/
|
||||
function start_move_element(e, id, frame){
|
||||
var elem_id=(e.target || e.srcElement).id;
|
||||
if(id)
|
||||
elem_id=id;
|
||||
if(!frame)
|
||||
frame=window;
|
||||
if(frame.event)
|
||||
e=frame.event;
|
||||
|
||||
_mCE= frame.document.getElementById(elem_id);
|
||||
_mCE.frame=frame;
|
||||
frame.document.onmousemove= move_element;
|
||||
frame.document.onmouseup= end_move_element;
|
||||
/*_mCE.onmousemove= move_element;
|
||||
_mCE.onmouseup= end_move_element;*/
|
||||
|
||||
//alert(_mCE.frame.document.body.offsetHeight);
|
||||
|
||||
mouse_x= getMouseX(e);
|
||||
mouse_y= getMouseY(e);
|
||||
//window.status=frame+ " elem: "+elem_id+" elem: "+ _mCE + " mouse_x: "+mouse_x;
|
||||
_mCE.start_pos_x = mouse_x - (_mCE.style.left.replace("px","") || calculeOffsetLeft(_mCE));
|
||||
_mCE.start_pos_y = mouse_y - (_mCE.style.top.replace("px","") || calculeOffsetTop(_mCE));
|
||||
return false;
|
||||
};
|
||||
|
||||
function end_move_element(e){
|
||||
_mCE.frame.document.onmousemove= "";
|
||||
_mCE.frame.document.onmouseup= "";
|
||||
_mCE=null;
|
||||
};
|
||||
|
||||
function move_element(e){
|
||||
var newTop,newLeft,maxLeft;
|
||||
|
||||
if( _mCE.frame && _mCE.frame.event )
|
||||
e=_mCE.frame.event;
|
||||
newTop = getMouseY(e) - _mCE.start_pos_y;
|
||||
newLeft = getMouseX(e) - _mCE.start_pos_x;
|
||||
|
||||
maxLeft = _mCE.frame.document.body.offsetWidth- _mCE.offsetWidth;
|
||||
max_top = _mCE.frame.document.body.offsetHeight- _mCE.offsetHeight;
|
||||
newTop = Math.min(Math.max(0, newTop), max_top);
|
||||
newLeft = Math.min(Math.max(0, newLeft), maxLeft);
|
||||
|
||||
_mCE.style.top = newTop+"px";
|
||||
_mCE.style.left = newLeft+"px";
|
||||
return false;
|
||||
};
|
||||
|
||||
/***
|
||||
* Managing a textarea (this part need the navigator infos from editAreaLoader
|
||||
***/
|
||||
|
||||
var nav= editAreaLoader.nav;
|
||||
|
||||
// allow to get infos on the selection: array(start, end)
|
||||
function getSelectionRange(textarea){
|
||||
return {"start": textarea.selectionStart, "end": textarea.selectionEnd};
|
||||
};
|
||||
|
||||
// allow to set the selection
|
||||
function setSelectionRange(t, start, end){
|
||||
t.focus();
|
||||
|
||||
start = Math.max(0, Math.min(t.value.length, start));
|
||||
end = Math.max(start, Math.min(t.value.length, end));
|
||||
|
||||
if( nav.isOpera && nav.isOpera < 9.6 ){ // Opera bug when moving selection start and selection end
|
||||
t.selectionEnd = 1;
|
||||
t.selectionStart = 0;
|
||||
t.selectionEnd = 1;
|
||||
t.selectionStart = 0;
|
||||
}
|
||||
t.selectionStart = start;
|
||||
t.selectionEnd = end;
|
||||
//textarea.setSelectionRange(start, end);
|
||||
|
||||
if(nav.isIE)
|
||||
set_IE_selection(t);
|
||||
};
|
||||
|
||||
|
||||
// set IE position in Firefox mode (textarea.selectionStart and textarea.selectionEnd). should work as a repeated task
|
||||
function get_IE_selection(t){
|
||||
var d=document,div,range,stored_range,elem,scrollTop,relative_top,line_start,line_nb,range_start,range_end,tab;
|
||||
if(t && t.focused)
|
||||
{
|
||||
if(!t.ea_line_height)
|
||||
{ // calculate the lineHeight
|
||||
div= d.createElement("div");
|
||||
div.style.fontFamily= get_css_property(t, "font-family");
|
||||
div.style.fontSize= get_css_property(t, "font-size");
|
||||
div.style.visibility= "hidden";
|
||||
div.innerHTML="0";
|
||||
d.body.appendChild(div);
|
||||
t.ea_line_height= div.offsetHeight;
|
||||
d.body.removeChild(div);
|
||||
}
|
||||
//t.focus();
|
||||
range = d.selection.createRange();
|
||||
try
|
||||
{
|
||||
stored_range = range.duplicate();
|
||||
stored_range.moveToElementText( t );
|
||||
stored_range.setEndPoint( 'EndToEnd', range );
|
||||
if(stored_range.parentElement() == t){
|
||||
// the range don't take care of empty lines in the end of the selection
|
||||
elem = t;
|
||||
scrollTop = 0;
|
||||
while(elem.parentNode){
|
||||
scrollTop+= elem.scrollTop;
|
||||
elem = elem.parentNode;
|
||||
}
|
||||
|
||||
// var scrollTop= t.scrollTop + document.body.scrollTop;
|
||||
|
||||
// var relative_top= range.offsetTop - calculeOffsetTop(t) + scrollTop;
|
||||
relative_top= range.offsetTop - calculeOffsetTop(t)+ scrollTop;
|
||||
// alert("rangeoffset: "+ range.offsetTop +"\ncalcoffsetTop: "+ calculeOffsetTop(t) +"\nrelativeTop: "+ relative_top);
|
||||
line_start = Math.round((relative_top / t.ea_line_height) +1);
|
||||
|
||||
line_nb = Math.round(range.boundingHeight / t.ea_line_height);
|
||||
|
||||
range_start = stored_range.text.length - range.text.length;
|
||||
tab = t.value.substr(0, range_start).split("\n");
|
||||
range_start += (line_start - tab.length)*2; // add missing empty lines to the selection
|
||||
t.selectionStart = range_start;
|
||||
|
||||
range_end = t.selectionStart + range.text.length;
|
||||
tab = t.value.substr(0, range_start + range.text.length).split("\n");
|
||||
range_end += (line_start + line_nb - 1 - tab.length)*2;
|
||||
t.selectionEnd = range_end;
|
||||
}
|
||||
}
|
||||
catch(e){}
|
||||
}
|
||||
if( t && t.id )
|
||||
{
|
||||
setTimeout("get_IE_selection(document.getElementById('"+ t.id +"'));", 50);
|
||||
}
|
||||
};
|
||||
|
||||
function IE_textarea_focus(){
|
||||
event.srcElement.focused= true;
|
||||
}
|
||||
|
||||
function IE_textarea_blur(){
|
||||
event.srcElement.focused= false;
|
||||
}
|
||||
|
||||
// select the text for IE (take into account the \r difference)
|
||||
function set_IE_selection( t ){
|
||||
var nbLineStart,nbLineStart,nbLineEnd,range;
|
||||
if(!window.closed){
|
||||
nbLineStart=t.value.substr(0, t.selectionStart).split("\n").length - 1;
|
||||
nbLineEnd=t.value.substr(0, t.selectionEnd).split("\n").length - 1;
|
||||
try
|
||||
{
|
||||
range = document.selection.createRange();
|
||||
range.moveToElementText( t );
|
||||
range.setEndPoint( 'EndToStart', range );
|
||||
range.moveStart('character', t.selectionStart - nbLineStart);
|
||||
range.moveEnd('character', t.selectionEnd - nbLineEnd - (t.selectionStart - nbLineStart) );
|
||||
range.select();
|
||||
}
|
||||
catch(e){}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
editAreaLoader.waiting_loading["elements_functions.js"]= "loaded";
|
||||
|
||||
@@ -1,407 +1,408 @@
|
||||
// change_to: "on" or "off"
|
||||
EditArea.prototype.change_highlight= function(change_to){
|
||||
if(this.settings["syntax"].length==0 && change_to==false){
|
||||
this.switchClassSticky(_$("highlight"), 'editAreaButtonDisabled', true);
|
||||
this.switchClassSticky(_$("reset_highlight"), 'editAreaButtonDisabled', true);
|
||||
return false;
|
||||
}
|
||||
|
||||
if(this.do_highlight==change_to)
|
||||
return false;
|
||||
|
||||
|
||||
this.getIESelection();
|
||||
var pos_start= this.textarea.selectionStart;
|
||||
var pos_end= this.textarea.selectionEnd;
|
||||
|
||||
if(this.do_highlight===true || change_to==false)
|
||||
this.disable_highlight();
|
||||
else
|
||||
this.enable_highlight();
|
||||
this.textarea.focus();
|
||||
this.textarea.selectionStart = pos_start;
|
||||
this.textarea.selectionEnd = pos_end;
|
||||
this.setIESelection();
|
||||
|
||||
};
|
||||
|
||||
EditArea.prototype.disable_highlight= function(displayOnly){
|
||||
var t= this, a=t.textarea, new_Obj, old_class, new_class;
|
||||
|
||||
t.selection_field.innerHTML="";
|
||||
t.selection_field_text.innerHTML="";
|
||||
t.content_highlight.style.visibility="hidden";
|
||||
// replacing the node is far more faster than deleting it's content in firefox
|
||||
new_Obj= t.content_highlight.cloneNode(false);
|
||||
new_Obj.innerHTML= "";
|
||||
t.content_highlight.parentNode.insertBefore(new_Obj, t.content_highlight);
|
||||
t.content_highlight.parentNode.removeChild(t.content_highlight);
|
||||
t.content_highlight= new_Obj;
|
||||
old_class= parent.getAttribute( a,"class" );
|
||||
if(old_class){
|
||||
new_class= old_class.replace( "hidden","" );
|
||||
parent.setAttribute( a, "class", new_class );
|
||||
}
|
||||
|
||||
a.style.backgroundColor="transparent"; // needed in order to see the bracket finders
|
||||
|
||||
//var icon= document.getElementById("highlight");
|
||||
//setAttribute(icon, "class", getAttribute(icon, "class").replace(/ selected/g, "") );
|
||||
//t.restoreClass(icon);
|
||||
//t.switchClass(icon,'editAreaButtonNormal');
|
||||
t.switchClassSticky(_$("highlight"), 'editAreaButtonNormal', true);
|
||||
t.switchClassSticky(_$("reset_highlight"), 'editAreaButtonDisabled', true);
|
||||
|
||||
t.do_highlight=false;
|
||||
|
||||
t.switchClassSticky(_$("change_smooth_selection"), 'editAreaButtonSelected', true);
|
||||
if(typeof(t.smooth_selection_before_highlight)!="undefined" && t.smooth_selection_before_highlight===false){
|
||||
t.change_smooth_selection_mode(false);
|
||||
}
|
||||
|
||||
// this.textarea.style.backgroundColor="#FFFFFF";
|
||||
};
|
||||
|
||||
EditArea.prototype.enable_highlight= function(){
|
||||
var t=this, a=t.textarea, new_class;
|
||||
t.show_waiting_screen();
|
||||
|
||||
t.content_highlight.style.visibility="visible";
|
||||
new_class =parent.getAttribute(a,"class")+" hidden";
|
||||
parent.setAttribute( a, "class", new_class );
|
||||
|
||||
// IE can't manage mouse click outside text range without this
|
||||
if( t.isIE )
|
||||
a.style.backgroundColor="#FFFFFF";
|
||||
|
||||
t.switchClassSticky(_$("highlight"), 'editAreaButtonSelected', false);
|
||||
t.switchClassSticky(_$("reset_highlight"), 'editAreaButtonNormal', false);
|
||||
|
||||
t.smooth_selection_before_highlight=t.smooth_selection;
|
||||
if(!t.smooth_selection)
|
||||
t.change_smooth_selection_mode(true);
|
||||
t.switchClassSticky(_$("change_smooth_selection"), 'editAreaButtonDisabled', true);
|
||||
|
||||
|
||||
t.do_highlight=true;
|
||||
t.resync_highlight();
|
||||
|
||||
t.hide_waiting_screen();
|
||||
};
|
||||
|
||||
/**
|
||||
* Ask to update highlighted text
|
||||
* @param Array infos - Array of datas returned by EditArea.get_selection_infos()
|
||||
*/
|
||||
EditArea.prototype.maj_highlight= function(infos){
|
||||
// for speed mesure
|
||||
var debug_opti="",tps_start= new Date().getTime(), tps_middle_opti=new Date().getTime();
|
||||
var t=this, hightlighted_text, updated_highlight;
|
||||
var textToHighlight=infos["full_text"], doSyntaxOpti = false, doHtmlOpti = false, stay_begin="", stay_end="", trace_new , trace_last;
|
||||
|
||||
if(t.last_text_to_highlight==infos["full_text"] && t.resync_highlight!==true)
|
||||
return;
|
||||
|
||||
// OPTIMISATION: will search to update only changed lines
|
||||
if(t.reload_highlight===true){
|
||||
t.reload_highlight=false;
|
||||
}else if(textToHighlight.length==0){
|
||||
textToHighlight="\n ";
|
||||
}else{
|
||||
// get text change datas
|
||||
changes = t.checkTextEvolution(t.last_text_to_highlight,textToHighlight);
|
||||
|
||||
// check if it can only reparse the changed text
|
||||
trace_new = t.get_syntax_trace(changes.newTextLine).replace(/\r/g, '');
|
||||
trace_last = t.get_syntax_trace(changes.lastTextLine).replace(/\r/g, '');
|
||||
doSyntaxOpti = ( trace_new == trace_last );
|
||||
|
||||
// check if the difference comes only from a new line created
|
||||
// => we have to remember that the editor can automaticaly add tabulation or space after the new line)
|
||||
if( !doSyntaxOpti && trace_new == "\n"+trace_last && /^[ \t\s]*\n[ \t\s]*$/.test( changes.newText.replace(/\r/g, '') ) && changes.lastText =="" )
|
||||
{
|
||||
doSyntaxOpti = true;
|
||||
}
|
||||
|
||||
// we do the syntax optimisation
|
||||
if( doSyntaxOpti ){
|
||||
|
||||
tps_middle_opti=new Date().getTime();
|
||||
|
||||
stay_begin= t.last_hightlighted_text.split("\n").slice(0, changes.lineStart).join("\n");
|
||||
if(changes.lineStart>0)
|
||||
stay_begin+= "\n";
|
||||
stay_end= t.last_hightlighted_text.split("\n").slice(changes.lineLastEnd+1).join("\n");
|
||||
if(stay_end.length>0)
|
||||
stay_end= "\n"+stay_end;
|
||||
|
||||
// Final check to see that we're not in the middle of span tags
|
||||
if( stay_begin.split('<span').length != stay_begin.split('</span').length
|
||||
|| stay_end.split('<span').length != stay_end.split('</span').length )
|
||||
{
|
||||
doSyntaxOpti = false;
|
||||
stay_end = '';
|
||||
stay_begin = '';
|
||||
}
|
||||
else
|
||||
{
|
||||
if(stay_begin.length==0 && changes.posLastEnd==-1)
|
||||
changes.newTextLine+="\n";
|
||||
textToHighlight=changes.newTextLine;
|
||||
}
|
||||
}
|
||||
if(t.settings["debug"]){
|
||||
var ch =changes;
|
||||
debug_opti= ( doSyntaxOpti?"Optimisation": "No optimisation" )
|
||||
+" start: "+ch.posStart +"("+ch.lineStart+")"
|
||||
+" end_new: "+ ch.posNewEnd+"("+ch.lineNewEnd+")"
|
||||
+" end_last: "+ ch.posLastEnd+"("+ch.lineLastEnd+")"
|
||||
+"\nchanged_text: "+ch.newText+" => trace: "+trace_new
|
||||
+"\nchanged_last_text: "+ch.lastText+" => trace: "+trace_last
|
||||
//debug_opti+= "\nchanged: "+ infos["full_text"].substring(ch.posStart, ch.posNewEnd);
|
||||
+ "\nchanged_line: "+ch.newTextLine
|
||||
+ "\nlast_changed_line: "+ch.lastTextLine
|
||||
+"\nstay_begin: "+ stay_begin.slice(-100)
|
||||
+"\nstay_end: "+ stay_end.substr( 0, 100 );
|
||||
//debug_opti="start: "+stay_begin_len+ "("+nb_line_start_unchanged+") end: "+ (stay_end_len)+ "("+(splited.length-nb_line_end_unchanged)+") ";
|
||||
//debug_opti+="changed: "+ textToHighlight.substring(stay_begin_len, textToHighlight.length-stay_end_len)+" \n";
|
||||
|
||||
//debug_opti+="changed: "+ stay_begin.substr(stay_begin.length-200)+ "----------"+ textToHighlight+"------------------"+ stay_end.substr(0,200) +"\n";
|
||||
+"\n";
|
||||
}
|
||||
|
||||
|
||||
// END OPTIMISATION
|
||||
}
|
||||
|
||||
tps_end_opti = new Date().getTime();
|
||||
|
||||
// apply highlight
|
||||
updated_highlight = t.colorize_text(textToHighlight);
|
||||
tpsAfterReg = new Date().getTime();
|
||||
|
||||
/***
|
||||
* see if we can optimize for updating only the required part of the HTML code
|
||||
*
|
||||
* The goal here will be to find the text node concerned by the modification and to update it
|
||||
*/
|
||||
//-------------------------------------------
|
||||
|
||||
// disable latest optimization tricks (introduced in 0.8.1 and removed in 0.8.2), TODO: check for another try later
|
||||
doSyntaxOpti = doHtmlOpti = false;
|
||||
if( doSyntaxOpti )
|
||||
{
|
||||
try
|
||||
{
|
||||
var replacedBloc, i, nbStart = '', nbEnd = '', newHtml, lengthOld, lengthNew;
|
||||
replacedBloc = t.last_hightlighted_text.substring( stay_begin.length, t.last_hightlighted_text.length - stay_end.length );
|
||||
|
||||
lengthOld = replacedBloc.length;
|
||||
lengthNew = updated_highlight.length;
|
||||
|
||||
// find the identical caracters at the beginning
|
||||
for( i=0; i < lengthOld && i < lengthNew && replacedBloc.charAt(i) == updated_highlight.charAt(i) ; i++ )
|
||||
{
|
||||
}
|
||||
nbStart = i;
|
||||
// find the identical caracters at the end
|
||||
for( i=0; i + nbStart < lengthOld && i + nbStart < lengthNew && replacedBloc.charAt(lengthOld-i-1) == updated_highlight.charAt(lengthNew-i-1) ; i++ )
|
||||
{
|
||||
}
|
||||
nbEnd = i;
|
||||
//console.log( nbStart, nbEnd, replacedBloc, updated_highlight );
|
||||
// get the changes
|
||||
lastHtml = replacedBloc.substring( nbStart, lengthOld - nbEnd );
|
||||
newHtml = updated_highlight.substring( nbStart, lengthNew - nbEnd );
|
||||
|
||||
// We can do the optimisation only if we havn't touch to span elements
|
||||
if( newHtml.indexOf('<span') == -1 && newHtml.indexOf('</span') == -1
|
||||
&& lastHtml.indexOf('<span') == -1 && lastHtml.indexOf('</span') == -1 )
|
||||
{
|
||||
var beginStr, nbOpendedSpan, nbClosedSpan, nbUnchangedChars, span, textNode;
|
||||
doHtmlOpti = true;
|
||||
beginStr = t.last_hightlighted_text.substr( 0, stay_begin.length + nbStart );
|
||||
// fix special chars
|
||||
newHtml = newHtml.replace( /</g, '<').replace( />/g, '>').replace( /&/g, '&');
|
||||
|
||||
nbOpendedSpan = beginStr.split('<span').length - 1;
|
||||
nbClosedSpan = beginStr.split('</span').length - 1;
|
||||
// retrieve the previously opened span (Add 1 for the first level span?)
|
||||
span = t.content_highlight.getElementsByTagName('span')[ nbOpendedSpan ];
|
||||
|
||||
//--------[
|
||||
// get the textNode to update
|
||||
|
||||
// if we're inside a span, we'll take the one that is opened (can be a parent of the current span)
|
||||
parentSpan = span;
|
||||
maxStartOffset = maxEndOffset = 0;
|
||||
|
||||
// it will be in the child of the root node
|
||||
if( nbOpendedSpan == nbClosedSpan )
|
||||
{
|
||||
while( parentSpan.parentNode != t.content_highlight && parentSpan.parentNode.tagName != 'PRE' )
|
||||
{
|
||||
parentSpan = parentSpan.parentNode;
|
||||
}
|
||||
}
|
||||
// get the last opened span
|
||||
else
|
||||
{
|
||||
maxStartOffset = maxEndOffset = beginStr.length + 1;
|
||||
// move to parent node for each closed span found after the lastest open span
|
||||
nbClosed = beginStr.substr( Math.max( 0, beginStr.lastIndexOf( '<span', maxStartOffset - 1 ) ) ).split('</span').length - 1;
|
||||
while( nbClosed > 0 )
|
||||
{
|
||||
nbClosed--;
|
||||
parentSpan = parentSpan.parentNode;
|
||||
}
|
||||
|
||||
// find the position of the last opended tag
|
||||
while( parentSpan.parentNode != t.content_highlight && parentSpan.parentNode.tagName != 'PRE' && ( tmpMaxStartOffset = Math.max( 0, beginStr.lastIndexOf( '<span', maxStartOffset - 1 ) ) ) < ( tmpMaxEndOffset = Math.max( 0, beginStr.lastIndexOf( '</span', maxEndOffset - 1 ) ) ) )
|
||||
{
|
||||
maxStartOffset = tmpMaxStartOffset;
|
||||
maxEndOffset = tmpMaxEndOffset;
|
||||
}
|
||||
}
|
||||
// Note: maxEndOffset is no more used but maxStartOffset will be used
|
||||
|
||||
if( parentSpan.parentNode == t.content_highlight || parentSpan.parentNode.tagName == 'PRE' )
|
||||
{
|
||||
maxStartOffset = Math.max( 0, beginStr.indexOf( '<span' ) );
|
||||
}
|
||||
|
||||
// find the matching text node (this will be one that will be at the end of the beginStr
|
||||
if( maxStartOffset == beginStr.length )
|
||||
{
|
||||
nbSubSpanBefore = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
lastEndPos = Math.max( 0, beginStr.lastIndexOf( '>', maxStartOffset ) );
|
||||
|
||||
// count the number of sub spans
|
||||
nbSubSpanBefore = beginStr.substr( lastEndPos ).split('<span').length-1;
|
||||
}
|
||||
|
||||
// there is no sub-span before
|
||||
if( nbSubSpanBefore == 0 )
|
||||
{
|
||||
textNode = parentSpan.firstChild;
|
||||
}
|
||||
// we need to find where is the text node modified
|
||||
else
|
||||
{
|
||||
// take the last direct child (no sub-child)
|
||||
lastSubSpan = parentSpan.getElementsByTagName('span')[ nbSubSpanBefore - 1 ];
|
||||
while( lastSubSpan.parentNode != parentSpan )
|
||||
{
|
||||
lastSubSpan = lastSubSpan.parentNode;
|
||||
}
|
||||
|
||||
// associate to next text node following the last sub span
|
||||
if( lastSubSpan.nextSibling == null || lastSubSpan.nextSibling.nodeType != 3 )
|
||||
{
|
||||
textNode = document.createTextNode('');
|
||||
lastSubSpan.parentNode.insertBefore( textNode, lastSubSpan.nextSibling );
|
||||
}
|
||||
else
|
||||
{
|
||||
textNode = lastSubSpan.nextSibling;
|
||||
}
|
||||
}
|
||||
//--------]
|
||||
|
||||
|
||||
//--------[
|
||||
// update the textNode content
|
||||
|
||||
// number of caracters after the last opened of closed span
|
||||
//nbUnchangedChars = ( lastIndex = beginStr.lastIndexOf( '>' ) ) == -1 ? beginStr.length : beginStr.length - ( lastIndex + 1 );
|
||||
//nbUnchangedChars = ? beginStr.length : beginStr.substr( lastIndex + 1 ).replace( /</g, '<').replace( />/g, '>').replace( /&/g, '&').length;
|
||||
|
||||
if( ( lastIndex = beginStr.lastIndexOf( '>' ) ) == -1 )
|
||||
{
|
||||
nbUnchangedChars = beginStr.length;
|
||||
}
|
||||
else
|
||||
{
|
||||
nbUnchangedChars = beginStr.substr( lastIndex + 1 ).replace( /</g, '<').replace( />/g, '>').replace( /&/g, '&').length;
|
||||
//nbUnchangedChars += beginStr.substr( ).replace( /&/g, '&').replace( /</g, '<').replace( />/g, '>').length - beginStr.length;
|
||||
}
|
||||
//alert( nbUnchangedChars );
|
||||
// console.log( span, textNode, nbOpendedSpan,nbClosedSpan, span.nextSibling, textNode.length, nbUnchangedChars, lastHtml, lastHtml.length, newHtml, newHtml.length );
|
||||
// alert( textNode.parentNode.className +'-'+ textNode.parentNode.tagName+"\n"+ textNode.data +"\n"+ nbUnchangedChars +"\n"+ lastHtml.length +"\n"+ newHtml +"\n"+ newHtml.length );
|
||||
// console.log( nbUnchangedChars, lastIndex, beginStr.length, beginStr.replace(/&/g, '&'), lastHtml.length, '|', newHtml.replace( /\t/g, 't').replace( /\n/g, 'n').replace( /\r/g, 'r'), lastHtml.replace( /\t/g, 't').replace( /\n/g, 'n').replace( /\r/, 'r') );
|
||||
// console.log( textNode.data.replace(/&/g, '&') );
|
||||
// IE only manage \r for cariage return in textNode and not \n or \r\n
|
||||
if( t.isIE )
|
||||
{
|
||||
nbUnchangedChars -= ( beginStr.substr( beginStr.length - nbUnchangedChars ).split("\n").length - 1 );
|
||||
//alert( textNode.data.replace(/\r/g, '_r').replace(/\n/g, '_n'));
|
||||
textNode.replaceData( nbUnchangedChars, lastHtml.replace(/\n/g, '').length, newHtml.replace(/\n/g, '') );
|
||||
}
|
||||
else
|
||||
{
|
||||
textNode.replaceData( nbUnchangedChars, lastHtml.length, newHtml );
|
||||
}
|
||||
//--------]
|
||||
}
|
||||
}
|
||||
// an exception shouldn't occured but if replaceData failed at least it won't break everything
|
||||
catch( e )
|
||||
{
|
||||
// throw e;
|
||||
// console.log( e );
|
||||
doHtmlOpti = false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*** END HTML update's optimisation ***/
|
||||
// end test
|
||||
|
||||
// console.log( (TPS6-TPS5), (TPS5-TPS4), (TPS4-TPS3), (TPS3-TPS2), (TPS2-TPS1), _CPT );
|
||||
// get the new highlight content
|
||||
tpsAfterOpti2 = new Date().getTime();
|
||||
hightlighted_text = stay_begin + updated_highlight + stay_end;
|
||||
if( !doHtmlOpti )
|
||||
{
|
||||
// update the content of the highlight div by first updating a clone node (as there is no display in the same time for t node it's quite faster (5*))
|
||||
var new_Obj= t.content_highlight.cloneNode(false);
|
||||
if( ( t.isIE && t.isIE < 8 ) || ( t.isOpera && t.isOpera < 9.6 ) )
|
||||
new_Obj.innerHTML= "<pre><span class='"+ t.settings["syntax"] +"'>" + hightlighted_text + "</span></pre>";
|
||||
else
|
||||
new_Obj.innerHTML= "<span class='"+ t.settings["syntax"] +"'>"+ hightlighted_text +"</span>";
|
||||
|
||||
t.content_highlight.parentNode.replaceChild(new_Obj, t.content_highlight);
|
||||
|
||||
t.content_highlight= new_Obj;
|
||||
}
|
||||
|
||||
t.last_text_to_highlight= infos["full_text"];
|
||||
t.last_hightlighted_text= hightlighted_text;
|
||||
|
||||
tps3=new Date().getTime();
|
||||
|
||||
if(t.settings["debug"]){
|
||||
//lineNumber=tab_text.length;
|
||||
//t.debug.value+=" \nNB char: "+_$("src").value.length+" Nb line: "+ lineNumber;
|
||||
|
||||
t.debug.value= "Tps optimisation "+(tps_end_opti-tps_start)
|
||||
+" | tps reg exp: "+ (tpsAfterReg-tps_end_opti)
|
||||
+" | tps opti HTML : "+ (tpsAfterOpti2-tpsAfterReg) + ' '+ ( doHtmlOpti ? 'yes' : 'no' )
|
||||
+" | tps update highlight content: "+ (tps3-tpsAfterOpti2)
|
||||
+" | tpsTotal: "+ (tps3-tps_start)
|
||||
+ "("+tps3+")\n"+ debug_opti;
|
||||
// t.debug.value+= "highlight\n"+hightlighted_text;*/
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
EditArea.prototype.resync_highlight= function(reload_now){
|
||||
this.reload_highlight=true;
|
||||
this.last_text_to_highlight="";
|
||||
this.focus();
|
||||
if(reload_now)
|
||||
this.check_line_selection(false);
|
||||
};
|
||||
// change_to: "on" or "off"
|
||||
EditArea.prototype.change_highlight= function(change_to){
|
||||
if(this.settings["syntax"].length==0 && change_to==false){
|
||||
this.switchClassSticky(_$("highlight"), 'editAreaButtonDisabled', true);
|
||||
this.switchClassSticky(_$("reset_highlight"), 'editAreaButtonDisabled', true);
|
||||
return false;
|
||||
}
|
||||
|
||||
if(this.do_highlight==change_to)
|
||||
return false;
|
||||
|
||||
|
||||
this.getIESelection();
|
||||
var pos_start= this.textarea.selectionStart;
|
||||
var pos_end= this.textarea.selectionEnd;
|
||||
|
||||
if(this.do_highlight===true || change_to==false)
|
||||
this.disable_highlight();
|
||||
else
|
||||
this.enable_highlight();
|
||||
this.textarea.focus();
|
||||
this.textarea.selectionStart = pos_start;
|
||||
this.textarea.selectionEnd = pos_end;
|
||||
this.setIESelection();
|
||||
|
||||
};
|
||||
|
||||
EditArea.prototype.disable_highlight= function(displayOnly){
|
||||
var t= this, a=t.textarea, new_Obj, old_class, new_class;
|
||||
|
||||
t.selection_field.innerHTML="";
|
||||
t.selection_field_text.innerHTML="";
|
||||
t.content_highlight.style.visibility="hidden";
|
||||
// replacing the node is far more faster than deleting it's content in firefox
|
||||
new_Obj= t.content_highlight.cloneNode(false);
|
||||
new_Obj.innerHTML= "";
|
||||
t.content_highlight.parentNode.insertBefore(new_Obj, t.content_highlight);
|
||||
t.content_highlight.parentNode.removeChild(t.content_highlight);
|
||||
t.content_highlight= new_Obj;
|
||||
old_class= parent.getAttribute( a,"class" );
|
||||
if(old_class){
|
||||
new_class= old_class.replace( "hidden","" );
|
||||
parent.setAttribute( a, "class", new_class );
|
||||
}
|
||||
|
||||
a.style.backgroundColor="transparent"; // needed in order to see the bracket finders
|
||||
|
||||
//var icon= document.getElementById("highlight");
|
||||
//setAttribute(icon, "class", getAttribute(icon, "class").replace(/ selected/g, "") );
|
||||
//t.restoreClass(icon);
|
||||
//t.switchClass(icon,'editAreaButtonNormal');
|
||||
t.switchClassSticky(_$("highlight"), 'editAreaButtonNormal', true);
|
||||
t.switchClassSticky(_$("reset_highlight"), 'editAreaButtonDisabled', true);
|
||||
|
||||
t.do_highlight=false;
|
||||
|
||||
t.switchClassSticky(_$("change_smooth_selection"), 'editAreaButtonSelected', true);
|
||||
if(typeof(t.smooth_selection_before_highlight)!="undefined" && t.smooth_selection_before_highlight===false){
|
||||
t.change_smooth_selection_mode(false);
|
||||
}
|
||||
|
||||
// this.textarea.style.backgroundColor="#FFFFFF";
|
||||
};
|
||||
|
||||
EditArea.prototype.enable_highlight= function(){
|
||||
var t=this, a=t.textarea, new_class;
|
||||
t.show_waiting_screen();
|
||||
|
||||
t.content_highlight.style.visibility="visible";
|
||||
new_class =parent.getAttribute(a,"class")+" hidden";
|
||||
parent.setAttribute( a, "class", new_class );
|
||||
|
||||
// IE can't manage mouse click outside text range without this
|
||||
if( t.isIE )
|
||||
a.style.backgroundColor="#FFFFFF";
|
||||
|
||||
t.switchClassSticky(_$("highlight"), 'editAreaButtonSelected', false);
|
||||
t.switchClassSticky(_$("reset_highlight"), 'editAreaButtonNormal', false);
|
||||
|
||||
t.smooth_selection_before_highlight=t.smooth_selection;
|
||||
if(!t.smooth_selection)
|
||||
t.change_smooth_selection_mode(true);
|
||||
t.switchClassSticky(_$("change_smooth_selection"), 'editAreaButtonDisabled', true);
|
||||
|
||||
|
||||
t.do_highlight=true;
|
||||
t.resync_highlight();
|
||||
|
||||
t.hide_waiting_screen();
|
||||
};
|
||||
|
||||
/**
|
||||
* Ask to update highlighted text
|
||||
* @param Array infos - Array of datas returned by EditArea.get_selection_infos()
|
||||
*/
|
||||
EditArea.prototype.maj_highlight= function(infos){
|
||||
// for speed mesure
|
||||
var debug_opti="",tps_start= new Date().getTime(), tps_middle_opti=new Date().getTime();
|
||||
var t=this, hightlighted_text, updated_highlight;
|
||||
var textToHighlight=infos["full_text"], doSyntaxOpti = false, doHtmlOpti = false, stay_begin="", stay_end="", trace_new , trace_last;
|
||||
|
||||
if(t.last_text_to_highlight==infos["full_text"] && t.resync_highlight!==true)
|
||||
return;
|
||||
|
||||
// OPTIMISATION: will search to update only changed lines
|
||||
if(t.reload_highlight===true){
|
||||
t.reload_highlight=false;
|
||||
}else if(textToHighlight.length==0){
|
||||
textToHighlight="\n ";
|
||||
}else{
|
||||
// get text change datas
|
||||
changes = t.checkTextEvolution(t.last_text_to_highlight,textToHighlight);
|
||||
|
||||
// check if it can only reparse the changed text
|
||||
trace_new = t.get_syntax_trace(changes.newTextLine).replace(/\r/g, '');
|
||||
trace_last = t.get_syntax_trace(changes.lastTextLine).replace(/\r/g, '');
|
||||
doSyntaxOpti = ( trace_new == trace_last );
|
||||
|
||||
// check if the difference comes only from a new line created
|
||||
// => we have to remember that the editor can automaticaly add tabulation or space after the new line)
|
||||
if( !doSyntaxOpti && trace_new == "\n"+trace_last && /^[ \t\s]*\n[ \t\s]*$/.test( changes.newText.replace(/\r/g, '') ) && changes.lastText =="" )
|
||||
{
|
||||
doSyntaxOpti = true;
|
||||
}
|
||||
|
||||
// we do the syntax optimisation
|
||||
if( doSyntaxOpti ){
|
||||
|
||||
tps_middle_opti=new Date().getTime();
|
||||
|
||||
stay_begin= t.last_hightlighted_text.split("\n").slice(0, changes.lineStart).join("\n");
|
||||
if(changes.lineStart>0)
|
||||
stay_begin+= "\n";
|
||||
stay_end= t.last_hightlighted_text.split("\n").slice(changes.lineLastEnd+1).join("\n");
|
||||
if(stay_end.length>0)
|
||||
stay_end= "\n"+stay_end;
|
||||
|
||||
// Final check to see that we're not in the middle of span tags
|
||||
if( stay_begin.split('<span').length != stay_begin.split('</span').length
|
||||
|| stay_end.split('<span').length != stay_end.split('</span').length )
|
||||
{
|
||||
doSyntaxOpti = false;
|
||||
stay_end = '';
|
||||
stay_begin = '';
|
||||
}
|
||||
else
|
||||
{
|
||||
if(stay_begin.length==0 && changes.posLastEnd==-1)
|
||||
changes.newTextLine+="\n";
|
||||
textToHighlight=changes.newTextLine;
|
||||
}
|
||||
}
|
||||
if(t.settings["debug"]){
|
||||
var ch =changes;
|
||||
debug_opti= ( doSyntaxOpti?"Optimisation": "No optimisation" )
|
||||
+" start: "+ch.posStart +"("+ch.lineStart+")"
|
||||
+" end_new: "+ ch.posNewEnd+"("+ch.lineNewEnd+")"
|
||||
+" end_last: "+ ch.posLastEnd+"("+ch.lineLastEnd+")"
|
||||
+"\nchanged_text: "+ch.newText+" => trace: "+trace_new
|
||||
+"\nchanged_last_text: "+ch.lastText+" => trace: "+trace_last
|
||||
//debug_opti+= "\nchanged: "+ infos["full_text"].substring(ch.posStart, ch.posNewEnd);
|
||||
+ "\nchanged_line: "+ch.newTextLine
|
||||
+ "\nlast_changed_line: "+ch.lastTextLine
|
||||
+"\nstay_begin: "+ stay_begin.slice(-100)
|
||||
+"\nstay_end: "+ stay_end.substr( 0, 100 );
|
||||
//debug_opti="start: "+stay_begin_len+ "("+nb_line_start_unchanged+") end: "+ (stay_end_len)+ "("+(splited.length-nb_line_end_unchanged)+") ";
|
||||
//debug_opti+="changed: "+ textToHighlight.substring(stay_begin_len, textToHighlight.length-stay_end_len)+" \n";
|
||||
|
||||
//debug_opti+="changed: "+ stay_begin.substr(stay_begin.length-200)+ "----------"+ textToHighlight+"------------------"+ stay_end.substr(0,200) +"\n";
|
||||
+"\n";
|
||||
}
|
||||
|
||||
|
||||
// END OPTIMISATION
|
||||
}
|
||||
|
||||
tps_end_opti = new Date().getTime();
|
||||
|
||||
// apply highlight
|
||||
updated_highlight = t.colorize_text(textToHighlight);
|
||||
tpsAfterReg = new Date().getTime();
|
||||
|
||||
/***
|
||||
* see if we can optimize for updating only the required part of the HTML code
|
||||
*
|
||||
* The goal here will be to find the text node concerned by the modification and to update it
|
||||
*/
|
||||
//-------------------------------------------
|
||||
|
||||
// disable latest optimization tricks (introduced in 0.8.1 and removed in 0.8.2), TODO: check for another try later
|
||||
doSyntaxOpti = doHtmlOpti = false;
|
||||
if( doSyntaxOpti )
|
||||
{
|
||||
try
|
||||
{
|
||||
var replacedBloc, i, nbStart = '', nbEnd = '', newHtml, lengthOld, lengthNew;
|
||||
replacedBloc = t.last_hightlighted_text.substring( stay_begin.length, t.last_hightlighted_text.length - stay_end.length );
|
||||
|
||||
lengthOld = replacedBloc.length;
|
||||
lengthNew = updated_highlight.length;
|
||||
|
||||
// find the identical caracters at the beginning
|
||||
for( i=0; i < lengthOld && i < lengthNew && replacedBloc.charAt(i) == updated_highlight.charAt(i) ; i++ )
|
||||
{
|
||||
}
|
||||
nbStart = i;
|
||||
// find the identical caracters at the end
|
||||
for( i=0; i + nbStart < lengthOld && i + nbStart < lengthNew && replacedBloc.charAt(lengthOld-i-1) == updated_highlight.charAt(lengthNew-i-1) ; i++ )
|
||||
{
|
||||
}
|
||||
nbEnd = i;
|
||||
//console.log( nbStart, nbEnd, replacedBloc, updated_highlight );
|
||||
// get the changes
|
||||
lastHtml = replacedBloc.substring( nbStart, lengthOld - nbEnd );
|
||||
newHtml = updated_highlight.substring( nbStart, lengthNew - nbEnd );
|
||||
|
||||
// We can do the optimisation only if we havn't touch to span elements
|
||||
if( newHtml.indexOf('<span') == -1 && newHtml.indexOf('</span') == -1
|
||||
&& lastHtml.indexOf('<span') == -1 && lastHtml.indexOf('</span') == -1 )
|
||||
{
|
||||
var beginStr, nbOpendedSpan, nbClosedSpan, nbUnchangedChars, span, textNode;
|
||||
doHtmlOpti = true;
|
||||
beginStr = t.last_hightlighted_text.substr( 0, stay_begin.length + nbStart );
|
||||
// fix special chars
|
||||
newHtml = newHtml.replace( /</g, '<').replace( />/g, '>').replace( /&/g, '&');
|
||||
|
||||
nbOpendedSpan = beginStr.split('<span').length - 1;
|
||||
nbClosedSpan = beginStr.split('</span').length - 1;
|
||||
// retrieve the previously opened span (Add 1 for the first level span?)
|
||||
span = t.content_highlight.getElementsByTagName('span')[ nbOpendedSpan ];
|
||||
|
||||
//--------[
|
||||
// get the textNode to update
|
||||
|
||||
// if we're inside a span, we'll take the one that is opened (can be a parent of the current span)
|
||||
parentSpan = span;
|
||||
maxStartOffset = maxEndOffset = 0;
|
||||
|
||||
// it will be in the child of the root node
|
||||
if( nbOpendedSpan == nbClosedSpan )
|
||||
{
|
||||
while( parentSpan.parentNode != t.content_highlight && parentSpan.parentNode.tagName != 'PRE' )
|
||||
{
|
||||
parentSpan = parentSpan.parentNode;
|
||||
}
|
||||
}
|
||||
// get the last opened span
|
||||
else
|
||||
{
|
||||
maxStartOffset = maxEndOffset = beginStr.length + 1;
|
||||
// move to parent node for each closed span found after the lastest open span
|
||||
nbClosed = beginStr.substr( Math.max( 0, beginStr.lastIndexOf( '<span', maxStartOffset - 1 ) ) ).split('</span').length - 1;
|
||||
while( nbClosed > 0 )
|
||||
{
|
||||
nbClosed--;
|
||||
parentSpan = parentSpan.parentNode;
|
||||
}
|
||||
|
||||
// find the position of the last opended tag
|
||||
while( parentSpan.parentNode != t.content_highlight && parentSpan.parentNode.tagName != 'PRE' && ( tmpMaxStartOffset = Math.max( 0, beginStr.lastIndexOf( '<span', maxStartOffset - 1 ) ) ) < ( tmpMaxEndOffset = Math.max( 0, beginStr.lastIndexOf( '</span', maxEndOffset - 1 ) ) ) )
|
||||
{
|
||||
maxStartOffset = tmpMaxStartOffset;
|
||||
maxEndOffset = tmpMaxEndOffset;
|
||||
}
|
||||
}
|
||||
// Note: maxEndOffset is no more used but maxStartOffset will be used
|
||||
|
||||
if( parentSpan.parentNode == t.content_highlight || parentSpan.parentNode.tagName == 'PRE' )
|
||||
{
|
||||
maxStartOffset = Math.max( 0, beginStr.indexOf( '<span' ) );
|
||||
}
|
||||
|
||||
// find the matching text node (this will be one that will be at the end of the beginStr
|
||||
if( maxStartOffset == beginStr.length )
|
||||
{
|
||||
nbSubSpanBefore = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
lastEndPos = Math.max( 0, beginStr.lastIndexOf( '>', maxStartOffset ) );
|
||||
|
||||
// count the number of sub spans
|
||||
nbSubSpanBefore = beginStr.substr( lastEndPos ).split('<span').length-1;
|
||||
}
|
||||
|
||||
// there is no sub-span before
|
||||
if( nbSubSpanBefore == 0 )
|
||||
{
|
||||
textNode = parentSpan.firstChild;
|
||||
}
|
||||
// we need to find where is the text node modified
|
||||
else
|
||||
{
|
||||
// take the last direct child (no sub-child)
|
||||
lastSubSpan = parentSpan.getElementsByTagName('span')[ nbSubSpanBefore - 1 ];
|
||||
while( lastSubSpan.parentNode != parentSpan )
|
||||
{
|
||||
lastSubSpan = lastSubSpan.parentNode;
|
||||
}
|
||||
|
||||
// associate to next text node following the last sub span
|
||||
if( lastSubSpan.nextSibling == null || lastSubSpan.nextSibling.nodeType != 3 )
|
||||
{
|
||||
textNode = document.createTextNode('');
|
||||
lastSubSpan.parentNode.insertBefore( textNode, lastSubSpan.nextSibling );
|
||||
}
|
||||
else
|
||||
{
|
||||
textNode = lastSubSpan.nextSibling;
|
||||
}
|
||||
}
|
||||
//--------]
|
||||
|
||||
|
||||
//--------[
|
||||
// update the textNode content
|
||||
|
||||
// number of caracters after the last opened of closed span
|
||||
//nbUnchangedChars = ( lastIndex = beginStr.lastIndexOf( '>' ) ) == -1 ? beginStr.length : beginStr.length - ( lastIndex + 1 );
|
||||
//nbUnchangedChars = ? beginStr.length : beginStr.substr( lastIndex + 1 ).replace( /</g, '<').replace( />/g, '>').replace( /&/g, '&').length;
|
||||
|
||||
if( ( lastIndex = beginStr.lastIndexOf( '>' ) ) == -1 )
|
||||
{
|
||||
nbUnchangedChars = beginStr.length;
|
||||
}
|
||||
else
|
||||
{
|
||||
nbUnchangedChars = beginStr.substr( lastIndex + 1 ).replace( /</g, '<').replace( />/g, '>').replace( /&/g, '&').length;
|
||||
//nbUnchangedChars += beginStr.substr( ).replace( /&/g, '&').replace( /</g, '<').replace( />/g, '>').length - beginStr.length;
|
||||
}
|
||||
//alert( nbUnchangedChars );
|
||||
// console.log( span, textNode, nbOpendedSpan,nbClosedSpan, span.nextSibling, textNode.length, nbUnchangedChars, lastHtml, lastHtml.length, newHtml, newHtml.length );
|
||||
// alert( textNode.parentNode.className +'-'+ textNode.parentNode.tagName+"\n"+ textNode.data +"\n"+ nbUnchangedChars +"\n"+ lastHtml.length +"\n"+ newHtml +"\n"+ newHtml.length );
|
||||
// console.log( nbUnchangedChars, lastIndex, beginStr.length, beginStr.replace(/&/g, '&'), lastHtml.length, '|', newHtml.replace( /\t/g, 't').replace( /\n/g, 'n').replace( /\r/g, 'r'), lastHtml.replace( /\t/g, 't').replace( /\n/g, 'n').replace( /\r/, 'r') );
|
||||
// console.log( textNode.data.replace(/&/g, '&') );
|
||||
// IE only manage \r for cariage return in textNode and not \n or \r\n
|
||||
if( t.isIE )
|
||||
{
|
||||
nbUnchangedChars -= ( beginStr.substr( beginStr.length - nbUnchangedChars ).split("\n").length - 1 );
|
||||
//alert( textNode.data.replace(/\r/g, '_r').replace(/\n/g, '_n'));
|
||||
textNode.replaceData( nbUnchangedChars, lastHtml.replace(/\n/g, '').length, newHtml.replace(/\n/g, '') );
|
||||
}
|
||||
else
|
||||
{
|
||||
textNode.replaceData( nbUnchangedChars, lastHtml.length, newHtml );
|
||||
}
|
||||
//--------]
|
||||
}
|
||||
}
|
||||
// an exception shouldn't occured but if replaceData failed at least it won't break everything
|
||||
catch( e )
|
||||
{
|
||||
// throw e;
|
||||
// console.log( e );
|
||||
doHtmlOpti = false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*** END HTML update's optimisation ***/
|
||||
// end test
|
||||
|
||||
// console.log( (TPS6-TPS5), (TPS5-TPS4), (TPS4-TPS3), (TPS3-TPS2), (TPS2-TPS1), _CPT );
|
||||
// get the new highlight content
|
||||
tpsAfterOpti2 = new Date().getTime();
|
||||
hightlighted_text = stay_begin + updated_highlight + stay_end;
|
||||
if( !doHtmlOpti )
|
||||
{
|
||||
// update the content of the highlight div by first updating a clone node (as there is no display in the same time for t node it's quite faster (5*))
|
||||
var new_Obj= t.content_highlight.cloneNode(false);
|
||||
if( ( t.isIE && t.isIE < 8 ) || ( t.isOpera && t.isOpera < 9.6 ) )
|
||||
new_Obj.innerHTML= "<pre><span class='"+ t.settings["syntax"] +"'>" + hightlighted_text + "</span></pre>";
|
||||
else
|
||||
new_Obj.innerHTML= "<span class='"+ t.settings["syntax"] +"'>"+ hightlighted_text +"</span>";
|
||||
|
||||
t.content_highlight.parentNode.replaceChild(new_Obj, t.content_highlight);
|
||||
|
||||
t.content_highlight= new_Obj;
|
||||
}
|
||||
|
||||
t.last_text_to_highlight= infos["full_text"];
|
||||
t.last_hightlighted_text= hightlighted_text;
|
||||
|
||||
tps3=new Date().getTime();
|
||||
|
||||
if(t.settings["debug"]){
|
||||
//lineNumber=tab_text.length;
|
||||
//t.debug.value+=" \nNB char: "+_$("src").value.length+" Nb line: "+ lineNumber;
|
||||
|
||||
t.debug.value= "Tps optimisation "+(tps_end_opti-tps_start)
|
||||
+" | tps reg exp: "+ (tpsAfterReg-tps_end_opti)
|
||||
+" | tps opti HTML : "+ (tpsAfterOpti2-tpsAfterReg) + ' '+ ( doHtmlOpti ? 'yes' : 'no' )
|
||||
+" | tps update highlight content: "+ (tps3-tpsAfterOpti2)
|
||||
+" | tpsTotal: "+ (tps3-tps_start)
|
||||
+ "("+tps3+")\n"+ debug_opti;
|
||||
// t.debug.value+= "highlight\n"+hightlighted_text;*/
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
EditArea.prototype.resync_highlight= function(reload_now){
|
||||
this.reload_highlight=true;
|
||||
this.last_text_to_highlight="";
|
||||
this.focus();
|
||||
if(reload_now)
|
||||
this.check_line_selection(false);
|
||||
};
|
||||
|
||||
@@ -1,145 +1,146 @@
|
||||
var EA_keys = {8:"Retour arriere",9:"Tabulation",12:"Milieu (pave numerique)",13:"Entrer",16:"Shift",17:"Ctrl",18:"Alt",19:"Pause",20:"Verr Maj",27:"Esc",32:"Space",33:"Page up",34:"Page down",35:"End",36:"Begin",37:"Left",38:"Up",39:"Right",40:"Down",44:"Impr ecran",45:"Inser",46:"Suppr",91:"Menu Demarrer Windows / touche pomme Mac",92:"Menu Demarrer Windows",93:"Menu contextuel Windows",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"Verr Num",145:"Arret defil"};
|
||||
|
||||
|
||||
|
||||
function keyDown(e){
|
||||
if(!e){ // if IE
|
||||
e=event;
|
||||
}
|
||||
|
||||
// send the event to the plugins
|
||||
for(var i in editArea.plugins){
|
||||
if(typeof(editArea.plugins[i].onkeydown)=="function"){
|
||||
if(editArea.plugins[i].onkeydown(e)===false){ // stop propaging
|
||||
if(editArea.isIE)
|
||||
e.keyCode=0;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var target_id=(e.target || e.srcElement).id;
|
||||
var use=false;
|
||||
if (EA_keys[e.keyCode])
|
||||
letter=EA_keys[e.keyCode];
|
||||
else
|
||||
letter=String.fromCharCode(e.keyCode);
|
||||
|
||||
var low_letter= letter.toLowerCase();
|
||||
|
||||
if(letter=="Page up" && !AltPressed(e) && !editArea.isOpera){
|
||||
editArea.execCommand("scroll_page", {"dir": "up", "shift": ShiftPressed(e)});
|
||||
use=true;
|
||||
}else if(letter=="Page down" && !AltPressed(e) && !editArea.isOpera){
|
||||
editArea.execCommand("scroll_page", {"dir": "down", "shift": ShiftPressed(e)});
|
||||
use=true;
|
||||
}else if(editArea.is_editable==false){
|
||||
// do nothing but also do nothing else (allow to navigate with page up and page down)
|
||||
return true;
|
||||
}else if(letter=="Tabulation" && target_id=="textarea" && !CtrlPressed(e) && !AltPressed(e)){
|
||||
if(ShiftPressed(e))
|
||||
editArea.execCommand("invert_tab_selection");
|
||||
else
|
||||
editArea.execCommand("tab_selection");
|
||||
|
||||
use=true;
|
||||
if(editArea.isOpera || (editArea.isFirefox && editArea.isMac) ) // opera && firefox mac can't cancel tabulation events...
|
||||
setTimeout("editArea.execCommand('focus');", 1);
|
||||
}else if(letter=="Entrer" && target_id=="textarea"){
|
||||
if(editArea.press_enter())
|
||||
use=true;
|
||||
}else if(letter=="Entrer" && target_id=="area_search"){
|
||||
editArea.execCommand("area_search");
|
||||
use=true;
|
||||
}else if(letter=="Esc"){
|
||||
editArea.execCommand("close_all_inline_popup", e);
|
||||
use=true;
|
||||
}else if(CtrlPressed(e) && !AltPressed(e) && !ShiftPressed(e)){
|
||||
switch(low_letter){
|
||||
case "f":
|
||||
editArea.execCommand("area_search");
|
||||
use=true;
|
||||
break;
|
||||
case "r":
|
||||
editArea.execCommand("area_replace");
|
||||
use=true;
|
||||
break;
|
||||
case "q":
|
||||
editArea.execCommand("close_all_inline_popup", e);
|
||||
use=true;
|
||||
break;
|
||||
case "h":
|
||||
editArea.execCommand("change_highlight");
|
||||
use=true;
|
||||
break;
|
||||
case "g":
|
||||
setTimeout("editArea.execCommand('go_to_line');", 5); // the prompt stop the return false otherwise
|
||||
use=true;
|
||||
break;
|
||||
case "e":
|
||||
editArea.execCommand("show_help");
|
||||
use=true;
|
||||
break;
|
||||
case "z":
|
||||
use=true;
|
||||
editArea.execCommand("undo");
|
||||
break;
|
||||
case "y":
|
||||
use=true;
|
||||
editArea.execCommand("redo");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// check to disable the redo possibility if the textarea content change
|
||||
if(editArea.next.length > 0){
|
||||
setTimeout("editArea.check_redo();", 10);
|
||||
}
|
||||
|
||||
setTimeout("editArea.check_file_changes();", 10);
|
||||
|
||||
|
||||
if(use){
|
||||
// in case of a control that sould'nt be used by IE but that is used => THROW a javascript error that will stop key action
|
||||
if(editArea.isIE)
|
||||
e.keyCode=0;
|
||||
return false;
|
||||
}
|
||||
//alert("Test: "+ letter + " ("+e.keyCode+") ALT: "+ AltPressed(e) + " CTRL "+ CtrlPressed(e) + " SHIFT "+ ShiftPressed(e));
|
||||
|
||||
return true;
|
||||
|
||||
};
|
||||
|
||||
|
||||
// return true if Alt key is pressed
|
||||
function AltPressed(e) {
|
||||
if (window.event) {
|
||||
return (window.event.altKey);
|
||||
} else {
|
||||
if(e.modifiers)
|
||||
return (e.altKey || (e.modifiers % 2));
|
||||
else
|
||||
return e.altKey;
|
||||
}
|
||||
};
|
||||
|
||||
// return true if Ctrl key is pressed
|
||||
function CtrlPressed(e) {
|
||||
if (window.event) {
|
||||
return (window.event.ctrlKey);
|
||||
} else {
|
||||
return (e.ctrlKey || (e.modifiers==2) || (e.modifiers==3) || (e.modifiers>5));
|
||||
}
|
||||
};
|
||||
|
||||
// return true if Shift key is pressed
|
||||
function ShiftPressed(e) {
|
||||
if (window.event) {
|
||||
return (window.event.shiftKey);
|
||||
} else {
|
||||
return (e.shiftKey || (e.modifiers>3));
|
||||
}
|
||||
};
|
||||
var EA_keys = {8:"Retour arriere",9:"Tabulation",12:"Milieu (pave numerique)",13:"Entrer",16:"Shift",17:"Ctrl",18:"Alt",19:"Pause",20:"Verr Maj",27:"Esc",32:"Space",33:"Page up",34:"Page down",35:"End",36:"Begin",37:"Left",38:"Up",39:"Right",40:"Down",44:"Impr ecran",45:"Inser",46:"Suppr",91:"Menu Demarrer Windows / touche pomme Mac",92:"Menu Demarrer Windows",93:"Menu contextuel Windows",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"Verr Num",145:"Arret defil"};
|
||||
|
||||
|
||||
|
||||
function keyDown(e){
|
||||
if(!e){ // if IE
|
||||
e=event;
|
||||
}
|
||||
|
||||
// send the event to the plugins
|
||||
for(var i in editArea.plugins){
|
||||
if(typeof(editArea.plugins[i].onkeydown)=="function"){
|
||||
if(editArea.plugins[i].onkeydown(e)===false){ // stop propaging
|
||||
if(editArea.isIE)
|
||||
e.keyCode=0;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var target_id=(e.target || e.srcElement).id;
|
||||
var use=false;
|
||||
if (EA_keys[e.keyCode])
|
||||
letter=EA_keys[e.keyCode];
|
||||
else
|
||||
letter=String.fromCharCode(e.keyCode);
|
||||
|
||||
var low_letter= letter.toLowerCase();
|
||||
|
||||
if(letter=="Page up" && !AltPressed(e) && !editArea.isOpera){
|
||||
editArea.execCommand("scroll_page", {"dir": "up", "shift": ShiftPressed(e)});
|
||||
use=true;
|
||||
}else if(letter=="Page down" && !AltPressed(e) && !editArea.isOpera){
|
||||
editArea.execCommand("scroll_page", {"dir": "down", "shift": ShiftPressed(e)});
|
||||
use=true;
|
||||
}else if(editArea.is_editable==false){
|
||||
// do nothing but also do nothing else (allow to navigate with page up and page down)
|
||||
return true;
|
||||
}else if(letter=="Tabulation" && target_id=="textarea" && !CtrlPressed(e) && !AltPressed(e)){
|
||||
if(ShiftPressed(e))
|
||||
editArea.execCommand("invert_tab_selection");
|
||||
else
|
||||
editArea.execCommand("tab_selection");
|
||||
|
||||
use=true;
|
||||
if(editArea.isOpera || (editArea.isFirefox && editArea.isMac) ) // opera && firefox mac can't cancel tabulation events...
|
||||
setTimeout("editArea.execCommand('focus');", 1);
|
||||
}else if(letter=="Entrer" && target_id=="textarea"){
|
||||
if(editArea.press_enter())
|
||||
use=true;
|
||||
}else if(letter=="Entrer" && target_id=="area_search"){
|
||||
editArea.execCommand("area_search");
|
||||
use=true;
|
||||
}else if(letter=="Esc"){
|
||||
editArea.execCommand("close_all_inline_popup", e);
|
||||
use=true;
|
||||
}else if(CtrlPressed(e) && !AltPressed(e) && !ShiftPressed(e)){
|
||||
switch(low_letter){
|
||||
case "f":
|
||||
editArea.execCommand("area_search");
|
||||
use=true;
|
||||
break;
|
||||
case "r":
|
||||
editArea.execCommand("area_replace");
|
||||
use=true;
|
||||
break;
|
||||
case "q":
|
||||
editArea.execCommand("close_all_inline_popup", e);
|
||||
use=true;
|
||||
break;
|
||||
case "h":
|
||||
editArea.execCommand("change_highlight");
|
||||
use=true;
|
||||
break;
|
||||
case "g":
|
||||
setTimeout("editArea.execCommand('go_to_line');", 5); // the prompt stop the return false otherwise
|
||||
use=true;
|
||||
break;
|
||||
case "e":
|
||||
editArea.execCommand("show_help");
|
||||
use=true;
|
||||
break;
|
||||
case "z":
|
||||
use=true;
|
||||
editArea.execCommand("undo");
|
||||
break;
|
||||
case "y":
|
||||
use=true;
|
||||
editArea.execCommand("redo");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// check to disable the redo possibility if the textarea content change
|
||||
if(editArea.next.length > 0){
|
||||
setTimeout("editArea.check_redo();", 10);
|
||||
}
|
||||
|
||||
setTimeout("editArea.check_file_changes();", 10);
|
||||
|
||||
|
||||
if(use){
|
||||
// in case of a control that sould'nt be used by IE but that is used => THROW a javascript error that will stop key action
|
||||
if(editArea.isIE)
|
||||
e.keyCode=0;
|
||||
return false;
|
||||
}
|
||||
//alert("Test: "+ letter + " ("+e.keyCode+") ALT: "+ AltPressed(e) + " CTRL "+ CtrlPressed(e) + " SHIFT "+ ShiftPressed(e));
|
||||
|
||||
return true;
|
||||
|
||||
};
|
||||
|
||||
|
||||
// return true if Alt key is pressed
|
||||
function AltPressed(e) {
|
||||
if (window.event) {
|
||||
return (window.event.altKey);
|
||||
} else {
|
||||
if(e.modifiers)
|
||||
return (e.altKey || (e.modifiers % 2));
|
||||
else
|
||||
return e.altKey;
|
||||
}
|
||||
};
|
||||
|
||||
// return true if Ctrl key is pressed
|
||||
function CtrlPressed(e) {
|
||||
if (window.event) {
|
||||
return (window.event.ctrlKey);
|
||||
} else {
|
||||
return (e.ctrlKey || (e.modifiers==2) || (e.modifiers==3) || (e.modifiers>5));
|
||||
}
|
||||
};
|
||||
|
||||
// return true if Shift key is pressed
|
||||
function ShiftPressed(e) {
|
||||
if (window.event) {
|
||||
return (window.event.shiftKey);
|
||||
} else {
|
||||
return (e.shiftKey || (e.modifiers>3));
|
||||
}
|
||||
};
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
@@ -1,166 +1,167 @@
|
||||
EditAreaLoader.prototype.get_regexp= function(text_array){
|
||||
//res="( |=|\\n|\\r|\\[|\\(|µ|)(";
|
||||
res="(\\b)(";
|
||||
for(i=0; i<text_array.length; i++){
|
||||
if(i>0)
|
||||
res+="|";
|
||||
//res+="("+ tab_text[i] +")";
|
||||
//res+=tab_text[i].replace(/(\.|\?|\*|\+|\\|\(|\)|\[|\]|\{|\})/g, "\\$1");
|
||||
res+=this.get_escaped_regexp(text_array[i]);
|
||||
}
|
||||
//res+=")( |\\.|:|\\{|\\(|\\)|\\[|\\]|\'|\"|\\r|\\n|\\t|$)";
|
||||
res+=")(\\b)";
|
||||
reg= new RegExp(res);
|
||||
|
||||
return res;
|
||||
};
|
||||
|
||||
|
||||
EditAreaLoader.prototype.get_escaped_regexp= function(str){
|
||||
return str.toString().replace(/(\.|\?|\*|\+|\\|\(|\)|\[|\]|\}|\{|\$|\^|\|)/g, "\\$1");
|
||||
};
|
||||
|
||||
EditAreaLoader.prototype.init_syntax_regexp= function(){
|
||||
var lang_style= {};
|
||||
for(var lang in this.load_syntax){
|
||||
if(!this.syntax[lang]) // init the regexp if not already initialized
|
||||
{
|
||||
this.syntax[lang]= {};
|
||||
this.syntax[lang]["keywords_reg_exp"]= {};
|
||||
this.keywords_reg_exp_nb=0;
|
||||
|
||||
if(this.load_syntax[lang]['KEYWORDS']){
|
||||
param="g";
|
||||
if(this.load_syntax[lang]['KEYWORD_CASE_SENSITIVE']===false)
|
||||
param+="i";
|
||||
for(var i in this.load_syntax[lang]['KEYWORDS']){
|
||||
if(typeof(this.load_syntax[lang]['KEYWORDS'][i])=="function") continue;
|
||||
this.syntax[lang]["keywords_reg_exp"][i]= new RegExp(this.get_regexp( this.load_syntax[lang]['KEYWORDS'][i] ), param);
|
||||
this.keywords_reg_exp_nb++;
|
||||
}
|
||||
}
|
||||
|
||||
if(this.load_syntax[lang]['OPERATORS']){
|
||||
var str="";
|
||||
var nb=0;
|
||||
for(var i in this.load_syntax[lang]['OPERATORS']){
|
||||
if(typeof(this.load_syntax[lang]['OPERATORS'][i])=="function") continue;
|
||||
if(nb>0)
|
||||
str+="|";
|
||||
str+=this.get_escaped_regexp(this.load_syntax[lang]['OPERATORS'][i]);
|
||||
nb++;
|
||||
}
|
||||
if(str.length>0)
|
||||
this.syntax[lang]["operators_reg_exp"]= new RegExp("("+str+")","g");
|
||||
}
|
||||
|
||||
if(this.load_syntax[lang]['DELIMITERS']){
|
||||
var str="";
|
||||
var nb=0;
|
||||
for(var i in this.load_syntax[lang]['DELIMITERS']){
|
||||
if(typeof(this.load_syntax[lang]['DELIMITERS'][i])=="function") continue;
|
||||
if(nb>0)
|
||||
str+="|";
|
||||
str+=this.get_escaped_regexp(this.load_syntax[lang]['DELIMITERS'][i]);
|
||||
nb++;
|
||||
}
|
||||
if(str.length>0)
|
||||
this.syntax[lang]["delimiters_reg_exp"]= new RegExp("("+str+")","g");
|
||||
}
|
||||
|
||||
|
||||
// /(("(\\"|[^"])*"?)|('(\\'|[^'])*'?)|(//(.|\r|\t)*\n)|(/\*(.|\n|\r|\t)*\*/)|(<!--(.|\n|\r|\t)*-->))/gi
|
||||
var syntax_trace=[];
|
||||
|
||||
// /("(?:[^"\\]*(\\\\)*(\\"?)?)*("|$))/g
|
||||
|
||||
this.syntax[lang]["quotes"]={};
|
||||
var quote_tab= [];
|
||||
if(this.load_syntax[lang]['QUOTEMARKS']){
|
||||
for(var i in this.load_syntax[lang]['QUOTEMARKS']){
|
||||
if(typeof(this.load_syntax[lang]['QUOTEMARKS'][i])=="function") continue;
|
||||
var x=this.get_escaped_regexp(this.load_syntax[lang]['QUOTEMARKS'][i]);
|
||||
this.syntax[lang]["quotes"][x]=x;
|
||||
//quote_tab[quote_tab.length]="("+x+"(?:\\\\"+x+"|[^"+x+"])*("+x+"|$))";
|
||||
//previous working : quote_tab[quote_tab.length]="("+x+"(?:[^"+x+"\\\\]*(\\\\\\\\)*(\\\\"+x+"?)?)*("+x+"|$))";
|
||||
quote_tab[quote_tab.length]="("+ x +"(\\\\.|[^"+ x +"])*(?:"+ x +"|$))";
|
||||
|
||||
syntax_trace.push(x);
|
||||
}
|
||||
}
|
||||
|
||||
this.syntax[lang]["comments"]={};
|
||||
if(this.load_syntax[lang]['COMMENT_SINGLE']){
|
||||
for(var i in this.load_syntax[lang]['COMMENT_SINGLE']){
|
||||
if(typeof(this.load_syntax[lang]['COMMENT_SINGLE'][i])=="function") continue;
|
||||
var x=this.get_escaped_regexp(this.load_syntax[lang]['COMMENT_SINGLE'][i]);
|
||||
quote_tab[quote_tab.length]="("+x+"(.|\\r|\\t)*(\\n|$))";
|
||||
syntax_trace.push(x);
|
||||
this.syntax[lang]["comments"][x]="\n";
|
||||
}
|
||||
}
|
||||
// (/\*(.|[\r\n])*?\*/)
|
||||
if(this.load_syntax[lang]['COMMENT_MULTI']){
|
||||
for(var i in this.load_syntax[lang]['COMMENT_MULTI']){
|
||||
if(typeof(this.load_syntax[lang]['COMMENT_MULTI'][i])=="function") continue;
|
||||
var start=this.get_escaped_regexp(i);
|
||||
var end=this.get_escaped_regexp(this.load_syntax[lang]['COMMENT_MULTI'][i]);
|
||||
quote_tab[quote_tab.length]="("+start+"(.|\\n|\\r)*?("+end+"|$))";
|
||||
syntax_trace.push(start);
|
||||
syntax_trace.push(end);
|
||||
this.syntax[lang]["comments"][i]=this.load_syntax[lang]['COMMENT_MULTI'][i];
|
||||
}
|
||||
}
|
||||
if(quote_tab.length>0)
|
||||
this.syntax[lang]["comment_or_quote_reg_exp"]= new RegExp("("+quote_tab.join("|")+")","gi");
|
||||
|
||||
if(syntax_trace.length>0) // /((.|\n)*?)(\\*("|'|\/\*|\*\/|\/\/|$))/g
|
||||
this.syntax[lang]["syntax_trace_regexp"]= new RegExp("((.|\n)*?)(\\\\*("+ syntax_trace.join("|") +"|$))", "gmi");
|
||||
|
||||
if(this.load_syntax[lang]['SCRIPT_DELIMITERS']){
|
||||
this.syntax[lang]["script_delimiters"]= {};
|
||||
for(var i in this.load_syntax[lang]['SCRIPT_DELIMITERS']){
|
||||
if(typeof(this.load_syntax[lang]['SCRIPT_DELIMITERS'][i])=="function") continue;
|
||||
this.syntax[lang]["script_delimiters"][i]= this.load_syntax[lang]['SCRIPT_DELIMITERS'];
|
||||
}
|
||||
}
|
||||
|
||||
this.syntax[lang]["custom_regexp"]= {};
|
||||
if(this.load_syntax[lang]['REGEXPS']){
|
||||
for(var i in this.load_syntax[lang]['REGEXPS']){
|
||||
if(typeof(this.load_syntax[lang]['REGEXPS'][i])=="function") continue;
|
||||
var val= this.load_syntax[lang]['REGEXPS'][i];
|
||||
if(!this.syntax[lang]["custom_regexp"][val['execute']])
|
||||
this.syntax[lang]["custom_regexp"][val['execute']]= {};
|
||||
this.syntax[lang]["custom_regexp"][val['execute']][i]={'regexp' : new RegExp(val['search'], val['modifiers'])
|
||||
, 'class' : val['class']};
|
||||
}
|
||||
}
|
||||
|
||||
if(this.load_syntax[lang]['STYLES']){
|
||||
lang_style[lang]= {};
|
||||
for(var i in this.load_syntax[lang]['STYLES']){
|
||||
if(typeof(this.load_syntax[lang]['STYLES'][i])=="function") continue;
|
||||
if(typeof(this.load_syntax[lang]['STYLES'][i]) != "string"){
|
||||
for(var j in this.load_syntax[lang]['STYLES'][i]){
|
||||
lang_style[lang][j]= this.load_syntax[lang]['STYLES'][i][j];
|
||||
}
|
||||
}else{
|
||||
lang_style[lang][i]= this.load_syntax[lang]['STYLES'][i];
|
||||
}
|
||||
}
|
||||
}
|
||||
// build style string
|
||||
var style="";
|
||||
for(var i in lang_style[lang]){
|
||||
if(lang_style[lang][i].length>0){
|
||||
style+= "."+ lang +" ."+ i.toLowerCase() +" span{"+lang_style[lang][i]+"}\n";
|
||||
style+= "."+ lang +" ."+ i.toLowerCase() +"{"+lang_style[lang][i]+"}\n";
|
||||
}
|
||||
}
|
||||
this.syntax[lang]["styles"]=style;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
editAreaLoader.waiting_loading["reg_syntax.js"]= "loaded";
|
||||
EditAreaLoader.prototype.get_regexp= function(text_array){
|
||||
//res="( |=|\\n|\\r|\\[|\\(|µ|)(";
|
||||
res="(\\b)(";
|
||||
for(i=0; i<text_array.length; i++){
|
||||
if(i>0)
|
||||
res+="|";
|
||||
//res+="("+ tab_text[i] +")";
|
||||
//res+=tab_text[i].replace(/(\.|\?|\*|\+|\\|\(|\)|\[|\]|\{|\})/g, "\\$1");
|
||||
res+=this.get_escaped_regexp(text_array[i]);
|
||||
}
|
||||
//res+=")( |\\.|:|\\{|\\(|\\)|\\[|\\]|\'|\"|\\r|\\n|\\t|$)";
|
||||
res+=")(\\b)";
|
||||
reg= new RegExp(res);
|
||||
|
||||
return res;
|
||||
};
|
||||
|
||||
|
||||
EditAreaLoader.prototype.get_escaped_regexp= function(str){
|
||||
return str.toString().replace(/(\.|\?|\*|\+|\\|\(|\)|\[|\]|\}|\{|\$|\^|\|)/g, "\\$1");
|
||||
};
|
||||
|
||||
EditAreaLoader.prototype.init_syntax_regexp= function(){
|
||||
var lang_style= {};
|
||||
for(var lang in this.load_syntax){
|
||||
if(!this.syntax[lang]) // init the regexp if not already initialized
|
||||
{
|
||||
this.syntax[lang]= {};
|
||||
this.syntax[lang]["keywords_reg_exp"]= {};
|
||||
this.keywords_reg_exp_nb=0;
|
||||
|
||||
if(this.load_syntax[lang]['KEYWORDS']){
|
||||
param="g";
|
||||
if(this.load_syntax[lang]['KEYWORD_CASE_SENSITIVE']===false)
|
||||
param+="i";
|
||||
for(var i in this.load_syntax[lang]['KEYWORDS']){
|
||||
if(typeof(this.load_syntax[lang]['KEYWORDS'][i])=="function") continue;
|
||||
this.syntax[lang]["keywords_reg_exp"][i]= new RegExp(this.get_regexp( this.load_syntax[lang]['KEYWORDS'][i] ), param);
|
||||
this.keywords_reg_exp_nb++;
|
||||
}
|
||||
}
|
||||
|
||||
if(this.load_syntax[lang]['OPERATORS']){
|
||||
var str="";
|
||||
var nb=0;
|
||||
for(var i in this.load_syntax[lang]['OPERATORS']){
|
||||
if(typeof(this.load_syntax[lang]['OPERATORS'][i])=="function") continue;
|
||||
if(nb>0)
|
||||
str+="|";
|
||||
str+=this.get_escaped_regexp(this.load_syntax[lang]['OPERATORS'][i]);
|
||||
nb++;
|
||||
}
|
||||
if(str.length>0)
|
||||
this.syntax[lang]["operators_reg_exp"]= new RegExp("("+str+")","g");
|
||||
}
|
||||
|
||||
if(this.load_syntax[lang]['DELIMITERS']){
|
||||
var str="";
|
||||
var nb=0;
|
||||
for(var i in this.load_syntax[lang]['DELIMITERS']){
|
||||
if(typeof(this.load_syntax[lang]['DELIMITERS'][i])=="function") continue;
|
||||
if(nb>0)
|
||||
str+="|";
|
||||
str+=this.get_escaped_regexp(this.load_syntax[lang]['DELIMITERS'][i]);
|
||||
nb++;
|
||||
}
|
||||
if(str.length>0)
|
||||
this.syntax[lang]["delimiters_reg_exp"]= new RegExp("("+str+")","g");
|
||||
}
|
||||
|
||||
|
||||
// /(("(\\"|[^"])*"?)|('(\\'|[^'])*'?)|(//(.|\r|\t)*\n)|(/\*(.|\n|\r|\t)*\*/)|(<!--(.|\n|\r|\t)*-->))/gi
|
||||
var syntax_trace=[];
|
||||
|
||||
// /("(?:[^"\\]*(\\\\)*(\\"?)?)*("|$))/g
|
||||
|
||||
this.syntax[lang]["quotes"]={};
|
||||
var quote_tab= [];
|
||||
if(this.load_syntax[lang]['QUOTEMARKS']){
|
||||
for(var i in this.load_syntax[lang]['QUOTEMARKS']){
|
||||
if(typeof(this.load_syntax[lang]['QUOTEMARKS'][i])=="function") continue;
|
||||
var x=this.get_escaped_regexp(this.load_syntax[lang]['QUOTEMARKS'][i]);
|
||||
this.syntax[lang]["quotes"][x]=x;
|
||||
//quote_tab[quote_tab.length]="("+x+"(?:\\\\"+x+"|[^"+x+"])*("+x+"|$))";
|
||||
//previous working : quote_tab[quote_tab.length]="("+x+"(?:[^"+x+"\\\\]*(\\\\\\\\)*(\\\\"+x+"?)?)*("+x+"|$))";
|
||||
quote_tab[quote_tab.length]="("+ x +"(\\\\.|[^"+ x +"])*(?:"+ x +"|$))";
|
||||
|
||||
syntax_trace.push(x);
|
||||
}
|
||||
}
|
||||
|
||||
this.syntax[lang]["comments"]={};
|
||||
if(this.load_syntax[lang]['COMMENT_SINGLE']){
|
||||
for(var i in this.load_syntax[lang]['COMMENT_SINGLE']){
|
||||
if(typeof(this.load_syntax[lang]['COMMENT_SINGLE'][i])=="function") continue;
|
||||
var x=this.get_escaped_regexp(this.load_syntax[lang]['COMMENT_SINGLE'][i]);
|
||||
quote_tab[quote_tab.length]="("+x+"(.|\\r|\\t)*(\\n|$))";
|
||||
syntax_trace.push(x);
|
||||
this.syntax[lang]["comments"][x]="\n";
|
||||
}
|
||||
}
|
||||
// (/\*(.|[\r\n])*?\*/)
|
||||
if(this.load_syntax[lang]['COMMENT_MULTI']){
|
||||
for(var i in this.load_syntax[lang]['COMMENT_MULTI']){
|
||||
if(typeof(this.load_syntax[lang]['COMMENT_MULTI'][i])=="function") continue;
|
||||
var start=this.get_escaped_regexp(i);
|
||||
var end=this.get_escaped_regexp(this.load_syntax[lang]['COMMENT_MULTI'][i]);
|
||||
quote_tab[quote_tab.length]="("+start+"(.|\\n|\\r)*?("+end+"|$))";
|
||||
syntax_trace.push(start);
|
||||
syntax_trace.push(end);
|
||||
this.syntax[lang]["comments"][i]=this.load_syntax[lang]['COMMENT_MULTI'][i];
|
||||
}
|
||||
}
|
||||
if(quote_tab.length>0)
|
||||
this.syntax[lang]["comment_or_quote_reg_exp"]= new RegExp("("+quote_tab.join("|")+")","gi");
|
||||
|
||||
if(syntax_trace.length>0) // /((.|\n)*?)(\\*("|'|\/\*|\*\/|\/\/|$))/g
|
||||
this.syntax[lang]["syntax_trace_regexp"]= new RegExp("((.|\n)*?)(\\\\*("+ syntax_trace.join("|") +"|$))", "gmi");
|
||||
|
||||
if(this.load_syntax[lang]['SCRIPT_DELIMITERS']){
|
||||
this.syntax[lang]["script_delimiters"]= {};
|
||||
for(var i in this.load_syntax[lang]['SCRIPT_DELIMITERS']){
|
||||
if(typeof(this.load_syntax[lang]['SCRIPT_DELIMITERS'][i])=="function") continue;
|
||||
this.syntax[lang]["script_delimiters"][i]= this.load_syntax[lang]['SCRIPT_DELIMITERS'];
|
||||
}
|
||||
}
|
||||
|
||||
this.syntax[lang]["custom_regexp"]= {};
|
||||
if(this.load_syntax[lang]['REGEXPS']){
|
||||
for(var i in this.load_syntax[lang]['REGEXPS']){
|
||||
if(typeof(this.load_syntax[lang]['REGEXPS'][i])=="function") continue;
|
||||
var val= this.load_syntax[lang]['REGEXPS'][i];
|
||||
if(!this.syntax[lang]["custom_regexp"][val['execute']])
|
||||
this.syntax[lang]["custom_regexp"][val['execute']]= {};
|
||||
this.syntax[lang]["custom_regexp"][val['execute']][i]={'regexp' : new RegExp(val['search'], val['modifiers'])
|
||||
, 'class' : val['class']};
|
||||
}
|
||||
}
|
||||
|
||||
if(this.load_syntax[lang]['STYLES']){
|
||||
lang_style[lang]= {};
|
||||
for(var i in this.load_syntax[lang]['STYLES']){
|
||||
if(typeof(this.load_syntax[lang]['STYLES'][i])=="function") continue;
|
||||
if(typeof(this.load_syntax[lang]['STYLES'][i]) != "string"){
|
||||
for(var j in this.load_syntax[lang]['STYLES'][i]){
|
||||
lang_style[lang][j]= this.load_syntax[lang]['STYLES'][i][j];
|
||||
}
|
||||
}else{
|
||||
lang_style[lang][i]= this.load_syntax[lang]['STYLES'][i];
|
||||
}
|
||||
}
|
||||
}
|
||||
// build style string
|
||||
var style="";
|
||||
for(var i in lang_style[lang]){
|
||||
if(lang_style[lang][i].length>0){
|
||||
style+= "."+ lang +" ."+ i.toLowerCase() +" span{"+lang_style[lang][i]+"}\n";
|
||||
style+= "."+ lang +" ."+ i.toLowerCase() +"{"+lang_style[lang][i]+"}\n";
|
||||
}
|
||||
}
|
||||
this.syntax[lang]["styles"]=style;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
editAreaLoader.waiting_loading["reg_syntax.js"]= "loaded";
|
||||
|
||||
@@ -1,139 +1,140 @@
|
||||
/*EditArea.prototype.comment_or_quotes= function(v0, v1, v2, v3, v4,v5,v6,v7,v8,v9, v10){
|
||||
new_class="quotes";
|
||||
if(v6 && v6 != undefined && v6!="")
|
||||
new_class="comments";
|
||||
return "µ__"+ new_class +"__µ"+v0+"µ_END_µ";
|
||||
|
||||
};*/
|
||||
|
||||
/* EditArea.prototype.htmlTag= function(v0, v1, v2, v3, v4,v5,v6,v7,v8,v9, v10){
|
||||
res="<span class=htmlTag>"+v2;
|
||||
alert("v2: "+v2+" v3: "+v3);
|
||||
tab=v3.split("=");
|
||||
attributes="";
|
||||
if(tab.length>1){
|
||||
attributes="<span class=attribute>"+tab[0]+"</span>=";
|
||||
for(i=1; i<tab.length-1; i++){
|
||||
cut=tab[i].lastIndexOf(" ");
|
||||
attributes+="<span class=attributeVal>"+tab[i].substr(0,cut)+"</span>";
|
||||
attributes+="<span class=attribute>"+tab[i].substr(cut)+"</span>=";
|
||||
}
|
||||
attributes+="<span class=attributeVal>"+tab[tab.length-1]+"</span>";
|
||||
}
|
||||
res+=attributes+v5+"</span>";
|
||||
return res;
|
||||
};*/
|
||||
|
||||
// determine if the selected text if a comment or a quoted text
|
||||
EditArea.prototype.comment_or_quote= function(){
|
||||
var new_class="", close_tag="", sy, arg, i;
|
||||
sy = parent.editAreaLoader.syntax[editArea.current_code_lang];
|
||||
arg = EditArea.prototype.comment_or_quote.arguments[0];
|
||||
|
||||
for( i in sy["quotes"] ){
|
||||
if(arg.indexOf(i)==0){
|
||||
new_class="quotesmarks";
|
||||
close_tag=sy["quotes"][i];
|
||||
}
|
||||
}
|
||||
if(new_class.length==0)
|
||||
{
|
||||
for(var i in sy["comments"]){
|
||||
if( arg.indexOf(i)==0 ){
|
||||
new_class="comments";
|
||||
close_tag=sy["comments"][i];
|
||||
}
|
||||
}
|
||||
}
|
||||
// for single line comment the \n must not be included in the span tags
|
||||
if(close_tag=="\n"){
|
||||
return "µ__"+ new_class +"__µ"+ arg.replace(/(\r?\n)?$/m, "µ_END_µ$1");
|
||||
}else{
|
||||
// the closing tag must be set only if the comment or quotes is closed
|
||||
reg= new RegExp(parent.editAreaLoader.get_escaped_regexp(close_tag)+"$", "m");
|
||||
if( arg.search(reg)!=-1 )
|
||||
return "µ__"+ new_class +"__µ"+ arg +"µ_END_µ";
|
||||
else
|
||||
return "µ__"+ new_class +"__µ"+ arg;
|
||||
}
|
||||
};
|
||||
|
||||
/*
|
||||
// apply special tags arround text to highlight
|
||||
EditArea.prototype.custom_highlight= function(){
|
||||
res= EditArea.prototype.custom_highlight.arguments[1]+"µ__"+ editArea.reg_exp_span_tag +"__µ" + EditArea.prototype.custom_highlight.arguments[2]+"µ_END_µ";
|
||||
if(EditArea.prototype.custom_highlight.arguments.length>5)
|
||||
res+= EditArea.prototype.custom_highlight.arguments[ EditArea.prototype.custom_highlight.arguments.length-3 ];
|
||||
return res;
|
||||
};
|
||||
*/
|
||||
|
||||
// return identication that allow to know if revalidating only the text line won't make the syntax go mad
|
||||
EditArea.prototype.get_syntax_trace= function(text){
|
||||
if(this.settings["syntax"].length>0 && parent.editAreaLoader.syntax[this.settings["syntax"]]["syntax_trace_regexp"])
|
||||
return text.replace(parent.editAreaLoader.syntax[this.settings["syntax"]]["syntax_trace_regexp"], "$3");
|
||||
};
|
||||
|
||||
|
||||
EditArea.prototype.colorize_text= function(text){
|
||||
//text="<div id='result' class='area' style='position: relative; z-index: 4; height: 500px; overflow: scroll;border: solid black 1px;'> ";
|
||||
/*
|
||||
if(this.isOpera){
|
||||
// opera can't use pre element tabulation cause a tab=6 chars in the textarea and 8 chars in the pre
|
||||
text= this.replace_tab(text);
|
||||
}*/
|
||||
|
||||
text= " "+text; // for easier regExp
|
||||
|
||||
/*if(this.do_html_tags)
|
||||
text= text.replace(/(<[a-z]+ [^>]*>)/gi, '[__htmlTag__]$1[_END_]');*/
|
||||
if(this.settings["syntax"].length>0)
|
||||
text= this.apply_syntax(text, this.settings["syntax"]);
|
||||
|
||||
// remove the first space added
|
||||
return text.substr(1).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/µ_END_µ/g,"</span>").replace(/µ__([a-zA-Z0-9]+)__µ/g,"<span class='$1'>");
|
||||
};
|
||||
|
||||
EditArea.prototype.apply_syntax= function(text, lang){
|
||||
var sy;
|
||||
this.current_code_lang=lang;
|
||||
|
||||
if(!parent.editAreaLoader.syntax[lang])
|
||||
return text;
|
||||
|
||||
sy = parent.editAreaLoader.syntax[lang];
|
||||
if(sy["custom_regexp"]['before']){
|
||||
for( var i in sy["custom_regexp"]['before']){
|
||||
var convert="$1µ__"+ sy["custom_regexp"]['before'][i]['class'] +"__µ$2µ_END_µ$3";
|
||||
text= text.replace(sy["custom_regexp"]['before'][i]['regexp'], convert);
|
||||
}
|
||||
}
|
||||
|
||||
if(sy["comment_or_quote_reg_exp"]){
|
||||
//setTimeout("_$('debug_area').value=editArea.comment_or_quote_reg_exp;", 500);
|
||||
text= text.replace(sy["comment_or_quote_reg_exp"], this.comment_or_quote);
|
||||
}
|
||||
|
||||
if(sy["keywords_reg_exp"]){
|
||||
for(var i in sy["keywords_reg_exp"]){
|
||||
text= text.replace(sy["keywords_reg_exp"][i], 'µ__'+i+'__µ$2µ_END_µ');
|
||||
}
|
||||
}
|
||||
|
||||
if(sy["delimiters_reg_exp"]){
|
||||
text= text.replace(sy["delimiters_reg_exp"], 'µ__delimiters__µ$1µ_END_µ');
|
||||
}
|
||||
|
||||
if(sy["operators_reg_exp"]){
|
||||
text= text.replace(sy["operators_reg_exp"], 'µ__operators__µ$1µ_END_µ');
|
||||
}
|
||||
|
||||
if(sy["custom_regexp"]['after']){
|
||||
for( var i in sy["custom_regexp"]['after']){
|
||||
var convert="$1µ__"+ sy["custom_regexp"]['after'][i]['class'] +"__µ$2µ_END_µ$3";
|
||||
text= text.replace(sy["custom_regexp"]['after'][i]['regexp'], convert);
|
||||
}
|
||||
}
|
||||
|
||||
return text;
|
||||
};
|
||||
/*EditArea.prototype.comment_or_quotes= function(v0, v1, v2, v3, v4,v5,v6,v7,v8,v9, v10){
|
||||
new_class="quotes";
|
||||
if(v6 && v6 != undefined && v6!="")
|
||||
new_class="comments";
|
||||
return "µ__"+ new_class +"__µ"+v0+"µ_END_µ";
|
||||
|
||||
};*/
|
||||
|
||||
/* EditArea.prototype.htmlTag= function(v0, v1, v2, v3, v4,v5,v6,v7,v8,v9, v10){
|
||||
res="<span class=htmlTag>"+v2;
|
||||
alert("v2: "+v2+" v3: "+v3);
|
||||
tab=v3.split("=");
|
||||
attributes="";
|
||||
if(tab.length>1){
|
||||
attributes="<span class=attribute>"+tab[0]+"</span>=";
|
||||
for(i=1; i<tab.length-1; i++){
|
||||
cut=tab[i].lastIndexOf(" ");
|
||||
attributes+="<span class=attributeVal>"+tab[i].substr(0,cut)+"</span>";
|
||||
attributes+="<span class=attribute>"+tab[i].substr(cut)+"</span>=";
|
||||
}
|
||||
attributes+="<span class=attributeVal>"+tab[tab.length-1]+"</span>";
|
||||
}
|
||||
res+=attributes+v5+"</span>";
|
||||
return res;
|
||||
};*/
|
||||
|
||||
// determine if the selected text if a comment or a quoted text
|
||||
EditArea.prototype.comment_or_quote= function(){
|
||||
var new_class="", close_tag="", sy, arg, i;
|
||||
sy = parent.editAreaLoader.syntax[editArea.current_code_lang];
|
||||
arg = EditArea.prototype.comment_or_quote.arguments[0];
|
||||
|
||||
for( i in sy["quotes"] ){
|
||||
if(arg.indexOf(i)==0){
|
||||
new_class="quotesmarks";
|
||||
close_tag=sy["quotes"][i];
|
||||
}
|
||||
}
|
||||
if(new_class.length==0)
|
||||
{
|
||||
for(var i in sy["comments"]){
|
||||
if( arg.indexOf(i)==0 ){
|
||||
new_class="comments";
|
||||
close_tag=sy["comments"][i];
|
||||
}
|
||||
}
|
||||
}
|
||||
// for single line comment the \n must not be included in the span tags
|
||||
if(close_tag=="\n"){
|
||||
return "µ__"+ new_class +"__µ"+ arg.replace(/(\r?\n)?$/m, "µ_END_µ$1");
|
||||
}else{
|
||||
// the closing tag must be set only if the comment or quotes is closed
|
||||
reg= new RegExp(parent.editAreaLoader.get_escaped_regexp(close_tag)+"$", "m");
|
||||
if( arg.search(reg)!=-1 )
|
||||
return "µ__"+ new_class +"__µ"+ arg +"µ_END_µ";
|
||||
else
|
||||
return "µ__"+ new_class +"__µ"+ arg;
|
||||
}
|
||||
};
|
||||
|
||||
/*
|
||||
// apply special tags arround text to highlight
|
||||
EditArea.prototype.custom_highlight= function(){
|
||||
res= EditArea.prototype.custom_highlight.arguments[1]+"µ__"+ editArea.reg_exp_span_tag +"__µ" + EditArea.prototype.custom_highlight.arguments[2]+"µ_END_µ";
|
||||
if(EditArea.prototype.custom_highlight.arguments.length>5)
|
||||
res+= EditArea.prototype.custom_highlight.arguments[ EditArea.prototype.custom_highlight.arguments.length-3 ];
|
||||
return res;
|
||||
};
|
||||
*/
|
||||
|
||||
// return identication that allow to know if revalidating only the text line won't make the syntax go mad
|
||||
EditArea.prototype.get_syntax_trace= function(text){
|
||||
if(this.settings["syntax"].length>0 && parent.editAreaLoader.syntax[this.settings["syntax"]]["syntax_trace_regexp"])
|
||||
return text.replace(parent.editAreaLoader.syntax[this.settings["syntax"]]["syntax_trace_regexp"], "$3");
|
||||
};
|
||||
|
||||
|
||||
EditArea.prototype.colorize_text= function(text){
|
||||
//text="<div id='result' class='area' style='position: relative; z-index: 4; height: 500px; overflow: scroll;border: solid black 1px;'> ";
|
||||
/*
|
||||
if(this.isOpera){
|
||||
// opera can't use pre element tabulation cause a tab=6 chars in the textarea and 8 chars in the pre
|
||||
text= this.replace_tab(text);
|
||||
}*/
|
||||
|
||||
text= " "+text; // for easier regExp
|
||||
|
||||
/*if(this.do_html_tags)
|
||||
text= text.replace(/(<[a-z]+ [^>]*>)/gi, '[__htmlTag__]$1[_END_]');*/
|
||||
if(this.settings["syntax"].length>0)
|
||||
text= this.apply_syntax(text, this.settings["syntax"]);
|
||||
|
||||
// remove the first space added
|
||||
return text.substr(1).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/µ_END_µ/g,"</span>").replace(/µ__([a-zA-Z0-9]+)__µ/g,"<span class='$1'>");
|
||||
};
|
||||
|
||||
EditArea.prototype.apply_syntax= function(text, lang){
|
||||
var sy;
|
||||
this.current_code_lang=lang;
|
||||
|
||||
if(!parent.editAreaLoader.syntax[lang])
|
||||
return text;
|
||||
|
||||
sy = parent.editAreaLoader.syntax[lang];
|
||||
if(sy["custom_regexp"]['before']){
|
||||
for( var i in sy["custom_regexp"]['before']){
|
||||
var convert="$1µ__"+ sy["custom_regexp"]['before'][i]['class'] +"__µ$2µ_END_µ$3";
|
||||
text= text.replace(sy["custom_regexp"]['before'][i]['regexp'], convert);
|
||||
}
|
||||
}
|
||||
|
||||
if(sy["comment_or_quote_reg_exp"]){
|
||||
//setTimeout("_$('debug_area').value=editArea.comment_or_quote_reg_exp;", 500);
|
||||
text= text.replace(sy["comment_or_quote_reg_exp"], this.comment_or_quote);
|
||||
}
|
||||
|
||||
if(sy["keywords_reg_exp"]){
|
||||
for(var i in sy["keywords_reg_exp"]){
|
||||
text= text.replace(sy["keywords_reg_exp"][i], 'µ__'+i+'__µ$2µ_END_µ');
|
||||
}
|
||||
}
|
||||
|
||||
if(sy["delimiters_reg_exp"]){
|
||||
text= text.replace(sy["delimiters_reg_exp"], 'µ__delimiters__µ$1µ_END_µ');
|
||||
}
|
||||
|
||||
if(sy["operators_reg_exp"]){
|
||||
text= text.replace(sy["operators_reg_exp"], 'µ__operators__µ$1µ_END_µ');
|
||||
}
|
||||
|
||||
if(sy["custom_regexp"]['after']){
|
||||
for( var i in sy["custom_regexp"]['after']){
|
||||
var convert="$1µ__"+ sy["custom_regexp"]['after'][i]['class'] +"__µ$2µ_END_µ$3";
|
||||
text= text.replace(sy["custom_regexp"]['after'][i]['regexp'], convert);
|
||||
}
|
||||
}
|
||||
|
||||
return text;
|
||||
};
|
||||
|
||||
@@ -1,73 +1,74 @@
|
||||
|
||||
EditAreaLoader.prototype.start_resize_area= function(){
|
||||
var d=document,a,div,width,height,father;
|
||||
|
||||
d.onmouseup= editAreaLoader.end_resize_area;
|
||||
d.onmousemove= editAreaLoader.resize_area;
|
||||
editAreaLoader.toggle(editAreaLoader.resize["id"]);
|
||||
|
||||
a = editAreas[editAreaLoader.resize["id"]]["textarea"];
|
||||
div = d.getElementById("edit_area_resize");
|
||||
if(!div){
|
||||
div= d.createElement("div");
|
||||
div.id="edit_area_resize";
|
||||
div.style.border="dashed #888888 1px";
|
||||
}
|
||||
width = a.offsetWidth -2;
|
||||
height = a.offsetHeight -2;
|
||||
|
||||
div.style.display = "block";
|
||||
div.style.width = width+"px";
|
||||
div.style.height = height+"px";
|
||||
father= a.parentNode;
|
||||
father.insertBefore(div, a);
|
||||
|
||||
a.style.display="none";
|
||||
|
||||
editAreaLoader.resize["start_top"]= calculeOffsetTop(div);
|
||||
editAreaLoader.resize["start_left"]= calculeOffsetLeft(div);
|
||||
};
|
||||
|
||||
EditAreaLoader.prototype.end_resize_area= function(e){
|
||||
var d=document,div,a,width,height;
|
||||
|
||||
d.onmouseup="";
|
||||
d.onmousemove="";
|
||||
|
||||
div = d.getElementById("edit_area_resize");
|
||||
a= editAreas[editAreaLoader.resize["id"]]["textarea"];
|
||||
width = Math.max(editAreas[editAreaLoader.resize["id"]]["settings"]["min_width"], div.offsetWidth-4);
|
||||
height = Math.max(editAreas[editAreaLoader.resize["id"]]["settings"]["min_height"], div.offsetHeight-4);
|
||||
if(editAreaLoader.isIE==6){
|
||||
width-=2;
|
||||
height-=2;
|
||||
}
|
||||
a.style.width = width+"px";
|
||||
a.style.height = height+"px";
|
||||
div.style.display = "none";
|
||||
a.style.display = "inline";
|
||||
a.selectionStart = editAreaLoader.resize["selectionStart"];
|
||||
a.selectionEnd = editAreaLoader.resize["selectionEnd"];
|
||||
editAreaLoader.toggle(editAreaLoader.resize["id"]);
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
EditAreaLoader.prototype.resize_area= function(e){
|
||||
var allow,newHeight,newWidth;
|
||||
allow = editAreas[editAreaLoader.resize["id"]]["settings"]["allow_resize"];
|
||||
if(allow=="both" || allow=="y")
|
||||
{
|
||||
newHeight = Math.max(20, getMouseY(e)- editAreaLoader.resize["start_top"]);
|
||||
document.getElementById("edit_area_resize").style.height= newHeight+"px";
|
||||
}
|
||||
if(allow=="both" || allow=="x")
|
||||
{
|
||||
newWidth= Math.max(20, getMouseX(e)- editAreaLoader.resize["start_left"]);
|
||||
document.getElementById("edit_area_resize").style.width= newWidth+"px";
|
||||
}
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
editAreaLoader.waiting_loading["resize_area.js"]= "loaded";
|
||||
|
||||
EditAreaLoader.prototype.start_resize_area= function(){
|
||||
var d=document,a,div,width,height,father;
|
||||
|
||||
d.onmouseup= editAreaLoader.end_resize_area;
|
||||
d.onmousemove= editAreaLoader.resize_area;
|
||||
editAreaLoader.toggle(editAreaLoader.resize["id"]);
|
||||
|
||||
a = editAreas[editAreaLoader.resize["id"]]["textarea"];
|
||||
div = d.getElementById("edit_area_resize");
|
||||
if(!div){
|
||||
div= d.createElement("div");
|
||||
div.id="edit_area_resize";
|
||||
div.style.border="dashed #888888 1px";
|
||||
}
|
||||
width = a.offsetWidth -2;
|
||||
height = a.offsetHeight -2;
|
||||
|
||||
div.style.display = "block";
|
||||
div.style.width = width+"px";
|
||||
div.style.height = height+"px";
|
||||
father= a.parentNode;
|
||||
father.insertBefore(div, a);
|
||||
|
||||
a.style.display="none";
|
||||
|
||||
editAreaLoader.resize["start_top"]= calculeOffsetTop(div);
|
||||
editAreaLoader.resize["start_left"]= calculeOffsetLeft(div);
|
||||
};
|
||||
|
||||
EditAreaLoader.prototype.end_resize_area= function(e){
|
||||
var d=document,div,a,width,height;
|
||||
|
||||
d.onmouseup="";
|
||||
d.onmousemove="";
|
||||
|
||||
div = d.getElementById("edit_area_resize");
|
||||
a= editAreas[editAreaLoader.resize["id"]]["textarea"];
|
||||
width = Math.max(editAreas[editAreaLoader.resize["id"]]["settings"]["min_width"], div.offsetWidth-4);
|
||||
height = Math.max(editAreas[editAreaLoader.resize["id"]]["settings"]["min_height"], div.offsetHeight-4);
|
||||
if(editAreaLoader.isIE==6){
|
||||
width-=2;
|
||||
height-=2;
|
||||
}
|
||||
a.style.width = width+"px";
|
||||
a.style.height = height+"px";
|
||||
div.style.display = "none";
|
||||
a.style.display = "inline";
|
||||
a.selectionStart = editAreaLoader.resize["selectionStart"];
|
||||
a.selectionEnd = editAreaLoader.resize["selectionEnd"];
|
||||
editAreaLoader.toggle(editAreaLoader.resize["id"]);
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
EditAreaLoader.prototype.resize_area= function(e){
|
||||
var allow,newHeight,newWidth;
|
||||
allow = editAreas[editAreaLoader.resize["id"]]["settings"]["allow_resize"];
|
||||
if(allow=="both" || allow=="y")
|
||||
{
|
||||
newHeight = Math.max(20, getMouseY(e)- editAreaLoader.resize["start_top"]);
|
||||
document.getElementById("edit_area_resize").style.height= newHeight+"px";
|
||||
}
|
||||
if(allow=="both" || allow=="x")
|
||||
{
|
||||
newWidth= Math.max(20, getMouseX(e)- editAreaLoader.resize["start_left"]);
|
||||
document.getElementById("edit_area_resize").style.width= newWidth+"px";
|
||||
}
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
editAreaLoader.waiting_loading["resize_area.js"]= "loaded";
|
||||
|
||||
@@ -1,174 +1,175 @@
|
||||
EditArea.prototype.show_search = function(){
|
||||
if(_$("area_search_replace").style.visibility=="visible"){
|
||||
this.hidden_search();
|
||||
}else{
|
||||
this.open_inline_popup("area_search_replace");
|
||||
var text= this.area_get_selection();
|
||||
var search= text.split("\n")[0];
|
||||
_$("area_search").value= search;
|
||||
_$("area_search").focus();
|
||||
}
|
||||
};
|
||||
|
||||
EditArea.prototype.hidden_search= function(){
|
||||
/*_$("area_search_replace").style.visibility="hidden";
|
||||
this.textarea.focus();
|
||||
var icon= _$("search");
|
||||
setAttribute(icon, "class", getAttribute(icon, "class").replace(/ selected/g, "") );*/
|
||||
this.close_inline_popup("area_search_replace");
|
||||
};
|
||||
|
||||
EditArea.prototype.area_search= function(mode){
|
||||
|
||||
if(!mode)
|
||||
mode="search";
|
||||
_$("area_search_msg").innerHTML="";
|
||||
var search=_$("area_search").value;
|
||||
|
||||
this.textarea.focus();
|
||||
this.textarea.textareaFocused=true;
|
||||
|
||||
var infos= this.get_selection_infos();
|
||||
var start= infos["selectionStart"];
|
||||
var pos=-1;
|
||||
var pos_begin=-1;
|
||||
var length=search.length;
|
||||
|
||||
if(_$("area_search_replace").style.visibility!="visible"){
|
||||
this.show_search();
|
||||
return;
|
||||
}
|
||||
if(search.length==0){
|
||||
_$("area_search_msg").innerHTML=this.get_translation("search_field_empty");
|
||||
return;
|
||||
}
|
||||
// advance to the next occurence if no text selected
|
||||
if(mode!="replace" ){
|
||||
if(_$("area_search_reg_exp").checked)
|
||||
start++;
|
||||
else
|
||||
start+= search.length;
|
||||
}
|
||||
|
||||
//search
|
||||
if(_$("area_search_reg_exp").checked){
|
||||
// regexp search
|
||||
var opt="m";
|
||||
if(!_$("area_search_match_case").checked)
|
||||
opt+="i";
|
||||
var reg= new RegExp(search, opt);
|
||||
pos= infos["full_text"].substr(start).search(reg);
|
||||
pos_begin= infos["full_text"].search(reg);
|
||||
if(pos!=-1){
|
||||
pos+=start;
|
||||
length=infos["full_text"].substr(start).match(reg)[0].length;
|
||||
}else if(pos_begin!=-1){
|
||||
length=infos["full_text"].match(reg)[0].length;
|
||||
}
|
||||
}else{
|
||||
if(_$("area_search_match_case").checked){
|
||||
pos= infos["full_text"].indexOf(search, start);
|
||||
pos_begin= infos["full_text"].indexOf(search);
|
||||
}else{
|
||||
pos= infos["full_text"].toLowerCase().indexOf(search.toLowerCase(), start);
|
||||
pos_begin= infos["full_text"].toLowerCase().indexOf(search.toLowerCase());
|
||||
}
|
||||
}
|
||||
|
||||
// interpret result
|
||||
if(pos==-1 && pos_begin==-1){
|
||||
_$("area_search_msg").innerHTML="<strong>"+search+"</strong> "+this.get_translation("not_found");
|
||||
return;
|
||||
}else if(pos==-1 && pos_begin != -1){
|
||||
begin= pos_begin;
|
||||
_$("area_search_msg").innerHTML=this.get_translation("restart_search_at_begin");
|
||||
}else
|
||||
begin= pos;
|
||||
|
||||
//_$("area_search_msg").innerHTML+="<strong>"+search+"</strong> found at "+begin+" strat at "+start+" pos "+pos+" curs"+ infos["indexOfCursor"]+".";
|
||||
if(mode=="replace" && pos==infos["indexOfCursor"]){
|
||||
var replace= _$("area_replace").value;
|
||||
var new_text="";
|
||||
if(_$("area_search_reg_exp").checked){
|
||||
var opt="m";
|
||||
if(!_$("area_search_match_case").checked)
|
||||
opt+="i";
|
||||
var reg= new RegExp(search, opt);
|
||||
new_text= infos["full_text"].substr(0, begin) + infos["full_text"].substr(start).replace(reg, replace);
|
||||
}else{
|
||||
new_text= infos["full_text"].substr(0, begin) + replace + infos["full_text"].substr(begin + length);
|
||||
}
|
||||
this.textarea.value=new_text;
|
||||
this.area_select(begin, length);
|
||||
this.area_search();
|
||||
}else
|
||||
this.area_select(begin, length);
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
EditArea.prototype.area_replace= function(){
|
||||
this.area_search("replace");
|
||||
};
|
||||
|
||||
EditArea.prototype.area_replace_all= function(){
|
||||
/* this.area_select(0, 0);
|
||||
_$("area_search_msg").innerHTML="";
|
||||
while(_$("area_search_msg").innerHTML==""){
|
||||
this.area_replace();
|
||||
}*/
|
||||
|
||||
var base_text= this.textarea.value;
|
||||
var search= _$("area_search").value;
|
||||
var replace= _$("area_replace").value;
|
||||
if(search.length==0){
|
||||
_$("area_search_msg").innerHTML=this.get_translation("search_field_empty");
|
||||
return ;
|
||||
}
|
||||
|
||||
var new_text="";
|
||||
var nb_change=0;
|
||||
if(_$("area_search_reg_exp").checked){
|
||||
// regExp
|
||||
var opt="mg";
|
||||
if(!_$("area_search_match_case").checked)
|
||||
opt+="i";
|
||||
var reg= new RegExp(search, opt);
|
||||
nb_change= infos["full_text"].match(reg).length;
|
||||
new_text= infos["full_text"].replace(reg, replace);
|
||||
|
||||
}else{
|
||||
|
||||
if(_$("area_search_match_case").checked){
|
||||
var tmp_tab=base_text.split(search);
|
||||
nb_change= tmp_tab.length -1 ;
|
||||
new_text= tmp_tab.join(replace);
|
||||
}else{
|
||||
// case insensitive
|
||||
var lower_value=base_text.toLowerCase();
|
||||
var lower_search=search.toLowerCase();
|
||||
|
||||
var start=0;
|
||||
var pos= lower_value.indexOf(lower_search);
|
||||
while(pos!=-1){
|
||||
nb_change++;
|
||||
new_text+= this.textarea.value.substring(start , pos)+replace;
|
||||
start=pos+ search.length;
|
||||
pos= lower_value.indexOf(lower_search, pos+1);
|
||||
}
|
||||
new_text+= this.textarea.value.substring(start);
|
||||
}
|
||||
}
|
||||
if(new_text==base_text){
|
||||
_$("area_search_msg").innerHTML="<strong>"+search+"</strong> "+this.get_translation("not_found");
|
||||
}else{
|
||||
this.textarea.value= new_text;
|
||||
_$("area_search_msg").innerHTML="<strong>"+nb_change+"</strong> "+this.get_translation("occurrence_replaced");
|
||||
// firefox and opera doesn't manage with the focus if it's done directly
|
||||
//editArea.textarea.focus();editArea.textarea.textareaFocused=true;
|
||||
setTimeout("editArea.textarea.focus();editArea.textarea.textareaFocused=true;", 100);
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
EditArea.prototype.show_search = function(){
|
||||
if(_$("area_search_replace").style.visibility=="visible"){
|
||||
this.hidden_search();
|
||||
}else{
|
||||
this.open_inline_popup("area_search_replace");
|
||||
var text= this.area_get_selection();
|
||||
var search= text.split("\n")[0];
|
||||
_$("area_search").value= search;
|
||||
_$("area_search").focus();
|
||||
}
|
||||
};
|
||||
|
||||
EditArea.prototype.hidden_search= function(){
|
||||
/*_$("area_search_replace").style.visibility="hidden";
|
||||
this.textarea.focus();
|
||||
var icon= _$("search");
|
||||
setAttribute(icon, "class", getAttribute(icon, "class").replace(/ selected/g, "") );*/
|
||||
this.close_inline_popup("area_search_replace");
|
||||
};
|
||||
|
||||
EditArea.prototype.area_search= function(mode){
|
||||
|
||||
if(!mode)
|
||||
mode="search";
|
||||
_$("area_search_msg").innerHTML="";
|
||||
var search=_$("area_search").value;
|
||||
|
||||
this.textarea.focus();
|
||||
this.textarea.textareaFocused=true;
|
||||
|
||||
var infos= this.get_selection_infos();
|
||||
var start= infos["selectionStart"];
|
||||
var pos=-1;
|
||||
var pos_begin=-1;
|
||||
var length=search.length;
|
||||
|
||||
if(_$("area_search_replace").style.visibility!="visible"){
|
||||
this.show_search();
|
||||
return;
|
||||
}
|
||||
if(search.length==0){
|
||||
_$("area_search_msg").innerHTML=this.get_translation("search_field_empty");
|
||||
return;
|
||||
}
|
||||
// advance to the next occurence if no text selected
|
||||
if(mode!="replace" ){
|
||||
if(_$("area_search_reg_exp").checked)
|
||||
start++;
|
||||
else
|
||||
start+= search.length;
|
||||
}
|
||||
|
||||
//search
|
||||
if(_$("area_search_reg_exp").checked){
|
||||
// regexp search
|
||||
var opt="m";
|
||||
if(!_$("area_search_match_case").checked)
|
||||
opt+="i";
|
||||
var reg= new RegExp(search, opt);
|
||||
pos= infos["full_text"].substr(start).search(reg);
|
||||
pos_begin= infos["full_text"].search(reg);
|
||||
if(pos!=-1){
|
||||
pos+=start;
|
||||
length=infos["full_text"].substr(start).match(reg)[0].length;
|
||||
}else if(pos_begin!=-1){
|
||||
length=infos["full_text"].match(reg)[0].length;
|
||||
}
|
||||
}else{
|
||||
if(_$("area_search_match_case").checked){
|
||||
pos= infos["full_text"].indexOf(search, start);
|
||||
pos_begin= infos["full_text"].indexOf(search);
|
||||
}else{
|
||||
pos= infos["full_text"].toLowerCase().indexOf(search.toLowerCase(), start);
|
||||
pos_begin= infos["full_text"].toLowerCase().indexOf(search.toLowerCase());
|
||||
}
|
||||
}
|
||||
|
||||
// interpret result
|
||||
if(pos==-1 && pos_begin==-1){
|
||||
_$("area_search_msg").innerHTML="<strong>"+search+"</strong> "+this.get_translation("not_found");
|
||||
return;
|
||||
}else if(pos==-1 && pos_begin != -1){
|
||||
begin= pos_begin;
|
||||
_$("area_search_msg").innerHTML=this.get_translation("restart_search_at_begin");
|
||||
}else
|
||||
begin= pos;
|
||||
|
||||
//_$("area_search_msg").innerHTML+="<strong>"+search+"</strong> found at "+begin+" strat at "+start+" pos "+pos+" curs"+ infos["indexOfCursor"]+".";
|
||||
if(mode=="replace" && pos==infos["indexOfCursor"]){
|
||||
var replace= _$("area_replace").value;
|
||||
var new_text="";
|
||||
if(_$("area_search_reg_exp").checked){
|
||||
var opt="m";
|
||||
if(!_$("area_search_match_case").checked)
|
||||
opt+="i";
|
||||
var reg= new RegExp(search, opt);
|
||||
new_text= infos["full_text"].substr(0, begin) + infos["full_text"].substr(start).replace(reg, replace);
|
||||
}else{
|
||||
new_text= infos["full_text"].substr(0, begin) + replace + infos["full_text"].substr(begin + length);
|
||||
}
|
||||
this.textarea.value=new_text;
|
||||
this.area_select(begin, length);
|
||||
this.area_search();
|
||||
}else
|
||||
this.area_select(begin, length);
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
EditArea.prototype.area_replace= function(){
|
||||
this.area_search("replace");
|
||||
};
|
||||
|
||||
EditArea.prototype.area_replace_all= function(){
|
||||
/* this.area_select(0, 0);
|
||||
_$("area_search_msg").innerHTML="";
|
||||
while(_$("area_search_msg").innerHTML==""){
|
||||
this.area_replace();
|
||||
}*/
|
||||
|
||||
var base_text= this.textarea.value;
|
||||
var search= _$("area_search").value;
|
||||
var replace= _$("area_replace").value;
|
||||
if(search.length==0){
|
||||
_$("area_search_msg").innerHTML=this.get_translation("search_field_empty");
|
||||
return ;
|
||||
}
|
||||
|
||||
var new_text="";
|
||||
var nb_change=0;
|
||||
if(_$("area_search_reg_exp").checked){
|
||||
// regExp
|
||||
var opt="mg";
|
||||
if(!_$("area_search_match_case").checked)
|
||||
opt+="i";
|
||||
var reg= new RegExp(search, opt);
|
||||
nb_change= infos["full_text"].match(reg).length;
|
||||
new_text= infos["full_text"].replace(reg, replace);
|
||||
|
||||
}else{
|
||||
|
||||
if(_$("area_search_match_case").checked){
|
||||
var tmp_tab=base_text.split(search);
|
||||
nb_change= tmp_tab.length -1 ;
|
||||
new_text= tmp_tab.join(replace);
|
||||
}else{
|
||||
// case insensitive
|
||||
var lower_value=base_text.toLowerCase();
|
||||
var lower_search=search.toLowerCase();
|
||||
|
||||
var start=0;
|
||||
var pos= lower_value.indexOf(lower_search);
|
||||
while(pos!=-1){
|
||||
nb_change++;
|
||||
new_text+= this.textarea.value.substring(start , pos)+replace;
|
||||
start=pos+ search.length;
|
||||
pos= lower_value.indexOf(lower_search, pos+1);
|
||||
}
|
||||
new_text+= this.textarea.value.substring(start);
|
||||
}
|
||||
}
|
||||
if(new_text==base_text){
|
||||
_$("area_search_msg").innerHTML="<strong>"+search+"</strong> "+this.get_translation("not_found");
|
||||
}else{
|
||||
this.textarea.value= new_text;
|
||||
_$("area_search_msg").innerHTML="<strong>"+nb_change+"</strong> "+this.get_translation("occurrence_replaced");
|
||||
// firefox and opera doesn't manage with the focus if it's done directly
|
||||
//editArea.textarea.focus();editArea.textarea.textareaFocused=true;
|
||||
setTimeout("editArea.textarea.focus();editArea.textarea.textareaFocused=true;", 100);
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
|
||||
@@ -1,100 +1,101 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
|
||||
<head>
|
||||
<title>EditArea</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7"/>
|
||||
[__CSSRULES__]
|
||||
[__JSCODE__]
|
||||
</head>
|
||||
<body>
|
||||
<div id='editor'>
|
||||
<div class='area_toolbar' id='toolbar_1'>[__TOOLBAR__]</div>
|
||||
<div class='area_toolbar' id='tab_browsing_area'><ul id='tab_browsing_list' class='menu'> <li> </li> </ul></div>
|
||||
<div id='result'>
|
||||
<div id='no_file_selected'></div>
|
||||
<div id='container'>
|
||||
<div id='cursor_pos' class='edit_area_cursor'> </div>
|
||||
<div id='end_bracket' class='edit_area_cursor'> </div>
|
||||
<div id='selection_field'></div>
|
||||
<div id='line_number' selec='none'></div>
|
||||
<div id='content_highlight'></div>
|
||||
<div id='test_font_size'></div>
|
||||
<div id='selection_field_text'></div>
|
||||
<textarea id='textarea' wrap='off' onchange='editArea.execCommand("onchange");' onfocus='javascript:editArea.textareaFocused=true;' onblur='javascript:editArea.textareaFocused=false;'>
|
||||
</textarea>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class='area_toolbar' id='toolbar_2'>
|
||||
<table class='statusbar' cellspacing='0' cellpadding='0'>
|
||||
<tr>
|
||||
<td class='total' selec='none'>{$position}:</td>
|
||||
<td class='infos' selec='none'>
|
||||
{$line_abbr} <span id='linePos'>0</span>, {$char_abbr} <span id='currPos'>0</span>
|
||||
</td>
|
||||
<td class='total' selec='none'>{$total}:</td>
|
||||
<td class='infos' selec='none'>
|
||||
{$line_abbr} <span id='nbLine'>0</span>, {$char_abbr} <span id='nbChar'>0</span>
|
||||
</td>
|
||||
<td class='resize'>
|
||||
<span id='resize_area'><img src='[__BASEURL__]images/statusbar_resize.gif' alt='resize' selec='none'></span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div id='processing'>
|
||||
<div id='processing_text'>
|
||||
{$processing}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id='area_search_replace' class='editarea_popup'>
|
||||
<table cellspacing='2' cellpadding='0' style='width: 100%'>
|
||||
<tr>
|
||||
<td selec='none'>{$search}</td>
|
||||
<td><input type='text' id='area_search' /></td>
|
||||
<td id='close_area_search_replace'>
|
||||
<a onclick='Javascript:editArea.execCommand("hidden_search")'><img selec='none' src='[__BASEURL__]images/close.gif' alt='{$close_popup}' title='{$close_popup}' /></a><br />
|
||||
</tr><tr>
|
||||
<td selec='none'>{$replace}</td>
|
||||
<td><input type='text' id='area_replace' /></td>
|
||||
<td><img id='move_area_search_replace' onmousedown='return parent.start_move_element(event,"area_search_replace", parent.frames["frame_"+editArea.id]);' src='[__BASEURL__]images/move.gif' alt='{$move_popup}' title='{$move_popup}' /></td>
|
||||
</tr>
|
||||
</table>
|
||||
<div class='button'>
|
||||
<input type='checkbox' id='area_search_match_case' /><label for='area_search_match_case' selec='none'>{$match_case}</label>
|
||||
<input type='checkbox' id='area_search_reg_exp' /><label for='area_search_reg_exp' selec='none'>{$reg_exp}</label>
|
||||
<br />
|
||||
<a onclick='Javascript:editArea.execCommand("area_search")' selec='none'>{$find_next}</a>
|
||||
<a onclick='Javascript:editArea.execCommand("area_replace")' selec='none'>{$replace}</a>
|
||||
<a onclick='Javascript:editArea.execCommand("area_replace_all")' selec='none'>{$replace_all}</a><br />
|
||||
</div>
|
||||
<div id='area_search_msg' selec='none'></div>
|
||||
</div>
|
||||
<div id='edit_area_help' class='editarea_popup'>
|
||||
<div class='close_popup'>
|
||||
<a onclick='Javascript:editArea.execCommand("close_all_inline_popup")'><img src='[__BASEURL__]images/close.gif' alt='{$close_popup}' title='{$close_popup}' /></a>
|
||||
</div>
|
||||
<div><h2>Editarea [__EA_VERSION__]</h2><br />
|
||||
<h3>{$shortcuts}:</h3>
|
||||
{$tab}: {$add_tab}<br />
|
||||
{$shift}+{$tab}: {$remove_tab}<br />
|
||||
{$ctrl}+f: {$search_command}<br />
|
||||
{$ctrl}+r: {$replace_command}<br />
|
||||
{$ctrl}+h: {$highlight}<br />
|
||||
{$ctrl}+g: {$go_to_line}<br />
|
||||
{$ctrl}+z: {$undo}<br />
|
||||
{$ctrl}+y: {$redo}<br />
|
||||
{$ctrl}+e: {$help}<br />
|
||||
{$ctrl}+q, {$esc}: {$close_popup}<br />
|
||||
{$accesskey} E: {$toggle}<br />
|
||||
<br />
|
||||
<em>{$about_notice}</em>
|
||||
<br /><div class='copyright'>© Christophe Dolivet 2007-2010</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
|
||||
<head>
|
||||
<title>EditArea</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7"/>
|
||||
[__CSSRULES__]
|
||||
[__JSCODE__]
|
||||
</head>
|
||||
<body>
|
||||
<div id='editor'>
|
||||
<div class='area_toolbar' id='toolbar_1'>[__TOOLBAR__]</div>
|
||||
<div class='area_toolbar' id='tab_browsing_area'><ul id='tab_browsing_list' class='menu'> <li> </li> </ul></div>
|
||||
<div id='result'>
|
||||
<div id='no_file_selected'></div>
|
||||
<div id='container'>
|
||||
<div id='cursor_pos' class='edit_area_cursor'> </div>
|
||||
<div id='end_bracket' class='edit_area_cursor'> </div>
|
||||
<div id='selection_field'></div>
|
||||
<div id='line_number' selec='none'></div>
|
||||
<div id='content_highlight'></div>
|
||||
<div id='test_font_size'></div>
|
||||
<div id='selection_field_text'></div>
|
||||
<textarea id='textarea' wrap='off' onchange='editArea.execCommand("onchange");' onfocus='javascript:editArea.textareaFocused=true;' onblur='javascript:editArea.textareaFocused=false;'>
|
||||
</textarea>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class='area_toolbar' id='toolbar_2'>
|
||||
<table class='statusbar' cellspacing='0' cellpadding='0'>
|
||||
<tr>
|
||||
<td class='total' selec='none'>{$position}:</td>
|
||||
<td class='infos' selec='none'>
|
||||
{$line_abbr} <span id='linePos'>0</span>, {$char_abbr} <span id='currPos'>0</span>
|
||||
</td>
|
||||
<td class='total' selec='none'>{$total}:</td>
|
||||
<td class='infos' selec='none'>
|
||||
{$line_abbr} <span id='nbLine'>0</span>, {$char_abbr} <span id='nbChar'>0</span>
|
||||
</td>
|
||||
<td class='resize'>
|
||||
<span id='resize_area'><img src='[__BASEURL__]images/statusbar_resize.gif' alt='resize' selec='none'></span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div id='processing'>
|
||||
<div id='processing_text'>
|
||||
{$processing}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id='area_search_replace' class='editarea_popup'>
|
||||
<table cellspacing='2' cellpadding='0' style='width: 100%'>
|
||||
<tr>
|
||||
<td selec='none'>{$search}</td>
|
||||
<td><input type='text' id='area_search' /></td>
|
||||
<td id='close_area_search_replace'>
|
||||
<a onclick='Javascript:editArea.execCommand("hidden_search")'><img selec='none' src='[__BASEURL__]images/close.gif' alt='{$close_popup}' title='{$close_popup}' /></a><br />
|
||||
</tr><tr>
|
||||
<td selec='none'>{$replace}</td>
|
||||
<td><input type='text' id='area_replace' /></td>
|
||||
<td><img id='move_area_search_replace' onmousedown='return parent.start_move_element(event,"area_search_replace", parent.frames["frame_"+editArea.id]);' src='[__BASEURL__]images/move.gif' alt='{$move_popup}' title='{$move_popup}' /></td>
|
||||
</tr>
|
||||
</table>
|
||||
<div class='button'>
|
||||
<input type='checkbox' id='area_search_match_case' /><label for='area_search_match_case' selec='none'>{$match_case}</label>
|
||||
<input type='checkbox' id='area_search_reg_exp' /><label for='area_search_reg_exp' selec='none'>{$reg_exp}</label>
|
||||
<br />
|
||||
<a onclick='Javascript:editArea.execCommand("area_search")' selec='none'>{$find_next}</a>
|
||||
<a onclick='Javascript:editArea.execCommand("area_replace")' selec='none'>{$replace}</a>
|
||||
<a onclick='Javascript:editArea.execCommand("area_replace_all")' selec='none'>{$replace_all}</a><br />
|
||||
</div>
|
||||
<div id='area_search_msg' selec='none'></div>
|
||||
</div>
|
||||
<div id='edit_area_help' class='editarea_popup'>
|
||||
<div class='close_popup'>
|
||||
<a onclick='Javascript:editArea.execCommand("close_all_inline_popup")'><img src='[__BASEURL__]images/close.gif' alt='{$close_popup}' title='{$close_popup}' /></a>
|
||||
</div>
|
||||
<div><h2>Editarea [__EA_VERSION__]</h2><br />
|
||||
<h3>{$shortcuts}:</h3>
|
||||
{$tab}: {$add_tab}<br />
|
||||
{$shift}+{$tab}: {$remove_tab}<br />
|
||||
{$ctrl}+f: {$search_command}<br />
|
||||
{$ctrl}+r: {$replace_command}<br />
|
||||
{$ctrl}+h: {$highlight}<br />
|
||||
{$ctrl}+g: {$go_to_line}<br />
|
||||
{$ctrl}+z: {$undo}<br />
|
||||
{$ctrl}+y: {$redo}<br />
|
||||
{$ctrl}+e: {$help}<br />
|
||||
{$ctrl}+q, {$esc}: {$close_popup}<br />
|
||||
{$accesskey} E: {$toggle}<br />
|
||||
<br />
|
||||
<em>{$about_notice}</em>
|
||||
<br /><div class='copyright'>© Christophe Dolivet 2007-2010</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -51,7 +51,7 @@ function doClickSave() {
|
||||
xhr.setRequestHeader('web2py-component-location',document.location);
|
||||
xhr.setRequestHeader('web2py-component-element','doClickSave');},
|
||||
success: function(json,text,xhr){
|
||||
|
||||
|
||||
// show flash message (if any)
|
||||
var flash=xhr.getResponseHeader('web2py-component-flash');
|
||||
if (flash) jQuery('.flash').html(flash).slideDown();
|
||||
@@ -73,13 +73,13 @@ function doClickSave() {
|
||||
editAreaLoader.setSelectionRange('body', json.highlight.start, json.highlight.end);
|
||||
} else {
|
||||
jQuery("input[name='saved_on']").attr('style','background-color:#99FF99');
|
||||
jQuery(".flash").delay(1000).fadeOut('slow');
|
||||
jQuery(".flash").delay(1000).fadeOut('slow');
|
||||
}
|
||||
// console.info(jQuery("input[name='file_hash']").val());
|
||||
|
||||
|
||||
var output = '<b>exposes:</b> ';
|
||||
for ( var i in json.functions) {
|
||||
output += ' <a href="/' + json.application + '/' + json.controller + '/' + json.functions[i] + '">' + json.functions[i] + '</a>,';
|
||||
output += ' <a href="/' + json.application + '/' + json.controller + '/' + json.functions[i] + '">' + json.functions[i] + '</a>,';
|
||||
}
|
||||
if(output!='<b>exposes:</b> ') {
|
||||
jQuery("#exposed").html( output.substring(0, output.length-1));
|
||||
@@ -89,7 +89,7 @@ function doClickSave() {
|
||||
on_error();
|
||||
}
|
||||
},
|
||||
error: function(json) { on_error(); }
|
||||
error: function(json) { on_error(); }
|
||||
});
|
||||
return false;
|
||||
}
|
||||
@@ -102,3 +102,4 @@ function keepalive(url) {
|
||||
success: function(){},
|
||||
error: function(x) { on_error(); } });
|
||||
}
|
||||
|
||||
@@ -60,3 +60,4 @@ jQuery(document).ready(function () {
|
||||
// todo: some key - toggle off
|
||||
// todo: drag scrollbar up - toggle off
|
||||
// todo: drag scrollbar to bottom - toggle off
|
||||
|
||||
@@ -1,42 +1,42 @@
|
||||
/* Copyright Notice for Dynarch Date Time Picker */
|
||||
/* Copyright Mihai Bazon, 2002-2005 | www.bazon.net/mishoo
|
||||
* -----------------------------------------------------------
|
||||
*
|
||||
* The DHTML Calendar, version 1.0 "It is happening again"
|
||||
*
|
||||
* Details and latest version at:
|
||||
* www.dynarch.com/projects/calendar
|
||||
*
|
||||
* This script is developed by Dynarch.com. Visit us at www.dynarch.com.
|
||||
*
|
||||
* This script is distributed under the GNU Lesser General Public License.
|
||||
* Read the entire license text here: http://www.gnu.org/licenses/lgpl.html
|
||||
*/
|
||||
|
||||
// Calendar EN language
|
||||
// Author: Mihai Bazon, <mihai_bazon@yahoo.com>
|
||||
// Encoding: any
|
||||
// Distributed under the same terms as the calendar itself.
|
||||
/* End Copyright Notice for Dynarch Date Time Picker */
|
||||
|
||||
Calendar=function(J,K,H,G){this.activeDiv=null;this.currentDateEl=null;this.getDateStatus=null;this.getDateToolTip=null;this.getDateText=null;this.timeout=null;this.onSelected=H||null;this.onClose=G||null;this.dragging=false;this.hidden=false;this.minYear=1970;this.maxYear=2050;this.dateFormat=Calendar._TT.DEF_DATE_FORMAT;this.ttDateFormat=Calendar._TT.TT_DATE_FORMAT;this.isPopup=true;this.weekNumbers=true;this.firstDayOfWeek=typeof J=="number"?J:Calendar._FD;this.showsOtherMonths=false;this.dateStr=K;this.ar_days=null;this.showsTime=false;this.time24=true;this.yearStep=2;this.hiliteToday=true;this.multiple=null;this.table=null;this.element=null;this.tbody=null;this.firstdayname=null;this.monthsCombo=null;this.yearsCombo=null;this.hilitedMonth=null;this.activeMonth=null;this.hilitedYear=null;this.activeYear=null;this.dateClicked=false;if(typeof Calendar._SDN=="undefined"){if(typeof Calendar._SDN_len=="undefined"){Calendar._SDN_len=3}var L=new Array();for(var I=8;I>0;){L[--I]=Calendar._DN[I].substr(0,Calendar._SDN_len)}Calendar._SDN=L;if(typeof Calendar._SMN_len=="undefined"){Calendar._SMN_len=3}L=new Array();for(var I=12;I>0;){L[--I]=Calendar._MN[I].substr(0,Calendar._SMN_len)}Calendar._SMN=L}};Calendar._C=null;Calendar.is_ie=(/msie/i.test(navigator.userAgent)&&!/opera/i.test(navigator.userAgent));Calendar.is_ie5=(Calendar.is_ie&&/msie 5\.0/i.test(navigator.userAgent));Calendar.is_opera=/opera/i.test(navigator.userAgent);Calendar.is_khtml=/Konqueror|Safari|KHTML/i.test(navigator.userAgent);Calendar.getAbsolutePos=function(I){var G=0,J=0;var K=/^div$/i.test(I.tagName);if(K&&I.scrollLeft){G=I.scrollLeft}if(K&&I.scrollTop){J=I.scrollTop}var H={x:I.offsetLeft-G,y:I.offsetTop-J};if(I.offsetParent){var L=this.getAbsolutePos(I.offsetParent);H.x+=L.x;H.y+=L.y}return H};Calendar.isRelated=function(G,E){var F=E.relatedTarget;if(!F){var H=E.type;if(H=="mouseover"){F=E.fromElement}else{if(H=="mouseout"){F=E.toElement}}}while(F){if(F==G){return true}F=F.parentNode}return false};Calendar.removeClass=function(G,H){if(!(G&&G.className)){return }var F=G.className.split(" ");var J=new Array();for(var I=F.length;I>0;){if(F[--I]!=H){J[J.length]=F[I]}}G.className=J.join(" ")};Calendar.addClass=function(D,C){Calendar.removeClass(D,C);D.className+=" "+C};Calendar.getElement=function(C){var D=Calendar.is_ie?window.event.srcElement:C.currentTarget;while(D.nodeType!=1||/^div$/i.test(D.tagName)){D=D.parentNode}return D};Calendar.getTargetElement=function(C){var D=Calendar.is_ie?window.event.srcElement:C.target;while(D.nodeType!=1){D=D.parentNode}return D};Calendar.stopEvent=function(B){B||(B=window.event);if(Calendar.is_ie){B.cancelBubble=true;B.returnValue=false}else{B.preventDefault();B.stopPropagation()}return false};Calendar.addEvent=function(D,E,F){if(D.attachEvent){D.attachEvent("on"+E,F)}else{if(D.addEventListener){D.addEventListener(E,F,true)}else{D["on"+E]=F}}};Calendar.removeEvent=function(D,E,F){if(D.detachEvent){D.detachEvent("on"+E,F)}else{if(D.removeEventListener){D.removeEventListener(E,F,true)}else{D["on"+E]=null}}};Calendar.createElement=function(E,F){var D=null;if(document.createElementNS){D=document.createElementNS("http://www.w3.org/1999/xhtml",E)}else{D=document.createElement(E)}if(typeof F!="undefined"){F.appendChild(D)}return D};Calendar._add_evs=function(el){with(Calendar){addEvent(el,"mouseover",dayMouseOver);addEvent(el,"mousedown",dayMouseDown);addEvent(el,"mouseout",dayMouseOut);if(is_ie){addEvent(el,"dblclick",dayMouseDblClick);el.setAttribute("unselectable",true)}}};Calendar.findMonth=function(B){if(typeof B.month!="undefined"){return B}else{if(typeof B.parentNode.month!="undefined"){return B.parentNode}}return null};Calendar.findYear=function(B){if(typeof B.year!="undefined"){return B}else{if(typeof B.parentNode.year!="undefined"){return B.parentNode}}return null};Calendar.showMonthsCombo=function(){var I=Calendar._C;if(!I){return false}var I=I;var H=I.activeDiv;var J=I.monthsCombo;if(I.hilitedMonth){Calendar.removeClass(I.hilitedMonth,"hilite")}if(I.activeMonth){Calendar.removeClass(I.activeMonth,"active")}var K=I.monthsCombo.getElementsByTagName("div")[I.date.getMonth()];Calendar.addClass(K,"active");I.activeMonth=K;var L=J.style;L.display="block";if(H.navtype<0){L.left=H.offsetLeft+"px"}else{var G=J.offsetWidth;if(typeof G=="undefined"){G=50}L.left=(H.offsetLeft+H.offsetWidth-G)+"px"}L.top=(H.offsetTop+H.offsetHeight)+"px"};Calendar.showYearsCombo=function(K){var N=Calendar._C;if(!N){return false}var N=N;var L=N.activeDiv;var S=N.yearsCombo;if(N.hilitedYear){Calendar.removeClass(N.hilitedYear,"hilite")}if(N.activeYear){Calendar.removeClass(N.activeYear,"active")}N.activeYear=null;var M=N.date.getFullYear()+(K?1:-1);var P=S.firstChild;var Q=false;for(var T=12;T>0;--T){if(M>=N.minYear&&M<=N.maxYear){P.innerHTML=M;P.year=M;P.style.display="block";Q=true}else{P.style.display="none"}P=P.nextSibling;M+=K?N.yearStep:-N.yearStep}if(Q){var O=S.style;O.display="block";if(L.navtype<0){O.left=L.offsetLeft+"px"}Line truncated
|
||||
|
||||
/*
|
||||
http://keith-wood.name/timeEntry.html
|
||||
Time entry for jQuery v1.4.8.
|
||||
Written by Keith Wood (kbwood{at}iinet.com.au) June 2007.
|
||||
Minor changes by Massimo Di Pierro Nov 2010 (simplified and changed behavior)
|
||||
Dual licensed under the GPL (http://dev.jquery.com/browser/trunk/jquery/GPL-LICENSE.txt) and
|
||||
MIT (http://dev.jquery.com/browser/trunk/jquery/MIT-LICENSE.txt) licenses.
|
||||
Please attribute the author if you use it.
|
||||
|
||||
Turn an input field into an entry point for a time value.
|
||||
The time can be entered via directly typing the value,
|
||||
via the arrow keys.
|
||||
It is configurable to show 12 or 24-hour time, to show or hide seconds,
|
||||
to enforce a minimum and/or maximum time, to change the spinner image.
|
||||
|
||||
Example: jQuery('input.time').timeEntry();
|
||||
*/
|
||||
|
||||
(function(a){var d=12,k="ampmNames",i="show24Hours",m="showSeconds",l="character",b=10,f=false,j="string",e=-1,c=null,h=true,g="timeEntry";function o(){this._disabledInputs=[];this._defaults={showSeconds:h,defaultTime:c,minTime:c,maxTime:c,show24Hours:h,ampmNames:["am","pm"]};a.extend(this._defaults)}a.extend(o.prototype,{markerClassName:"hasTimeEntry",setDefaults:function(a){n(this._defaults,a||{});return this},_connectTimeEntry:function(e,f){var c=this,d=a(e);if(d.hasClass(c.markerClassName))return;var b={};b.options=a.extend({},f);b._selectedHour=0;b._selectedMinute=0;b._selectedSecond=0;b._field=0;b.input=a(e);a.data(e,g,b);d.addClass(c.markerClassName).bind("focus.timeEntry",c._doFocus).bind("blur.timeEntry",c._doBlur).bind("click.timeEntry",c._doClick).bind("keydown.timeEntry",c._doKeyDown).bind("keypress.timeEntry",c._doKeyPress);a.browser.mozilla&&d.bind("input.timeEntry",function(){a.timeEntry._parseTime(b)});a.browser.msie&&d.bind("paste.timeEntry",function(){setTimeout(function(){a.timeEntry._parseTime(b)},1)})},_isDisabledTimeEntry:function(b){return a.inArray(b,this._disabledInputs)>e},_changeTimeEntry:function(e,b,f){var c=a.data(e,g);if(c){if(typeof b==j){var h=b;b={};b[h]=f}var d=this._extractTime(c);n(c.options,b||{});d&&this._setTime(c,new Date(0,0,0,d[0],d[1],d[2]))}a.data(e,g,c)},_destroyTimeEntry:function(d){var b=this;jQueryinput=a(d);if(!jQueryinput.hasClass(b.markerClassName))return;jQueryinput.removeClass(b.markerClassName).unbind(".timeEntry");b._disabledInputs=a.map(b._disabledInputs,function(a){return a==d?c:a});jQueryinput.parent().replaceWith(jQueryinput);a.removeData(d,g)},_setTimeTimeEntry:function(e,b){var d=a.data(e,g);d&&this._setTime(d,b?typeof b=="object"?new Date(b.getTime()):b:c)},_getTimeTimeEntry:function(e){var d=a.data(e,g),b=d?this._extractTime(d):c;return !b?c:new Date(0,0,0,b[0],b[1],b[2])},_getOffsetTimeEntry:function(e){var d=a.data(e,g),b=d?this._extractTime(d):c;return !b?0:(b[0]*3600+b[1]*60+b[2])*1e3},_doFocus:function(e){var d=e.nodeName&&e.nodeName.toLowerCase()=="input"?e:this;if(a.timeEntry._lastInput==d||a.timeEntry._isDisabledTimeEntry(d)){a.timeEntry._focussed=f;return}var i=a.data(d,g);a.timeEntry._focussed=h;a.timeEntry._lastInput=d;a.timeEntry._blurredInput=c;a.data(d,g,i);a.timeEntry._parseTime(i);setTimeout(function(){a.timeEntry._showField(i)},b)},_doBlur:function(){a.timeEntry._blurredInput=a.timeEntry._lastInput;a.timeEntry._lastInput=c},_doClick:function(k){var h=k.target,d=a.data(h,g);if(!a.timeEntry._focussed){var i=3;d._field=0;if(h.selectionStart!=c)for(var e=0;e<=Math.max(1,d._secondField,d._ampmField);e++){var m=e!=d._ampmField?e*i+2:d._ampmField*i+2;d._field=e;if(h.selectionStart<m)break}else if(h.createTextRange)for(var n=a(k.srcElement),j=h.createTextRange(),o=function(a){return ({thin:2,medium:4,thick:6})[a]||a},p=k.clientX+document.documentElement.scrollLeft-(n.offset().left+parseInt(o(n.css("border-left-width")),b))-j.offsetLeft,e=0;e<=Math.max(1,d._secondField,d._ampmField);e++){var m=e!=d._ampmField?e*i+2:d._ampmField*i+2;j.collapse();j.moveEnd(l,m);d._field=e;if(p<j.boundingWidth)break}}a.data(h,g,d);a.timeEntry._showField(d);a.timeEntry._focussed=f},_doKeyDown:function(c){if(c.keyCode>=48)return h;var b=a.data(c.target,g);switch(c.keyCode){case 9:var d=a(":input");d.eq(d.index(this)+(c.shiftKey?e:+1)).focus();break;case 37:a.timeEntry._changeField(b,e,f);break;case 38:a.timeEntry._adjustField(b,e);break;case 16:!c.shiftKey&&a.timeEntry._changeField(b,+1,f);break;case 39:a.timeEntry._changeField(b,+1,f);break;case 40:a.timeEntry._adjustField(b,+1);break;case 32:case 46:a.timeEntry._setValue(b,"")}return f},_doKeyPress:function(b){var c=String.fromCharCode(b.charCode==undefined?b.keyCode:b.charCode);if(c<" ")return h;var d=a.data(b.target,g);a.timeEntry._handleKeyPress(d,c);return f},_get:function(d,b){return d.options[b]!=c?d.options[b]:a.timeEntry._defaults[b]},_parseTime:function(a){var b=this,c=b._extractTime(a),d=b._get(a,m);if(c){a._selectedHour=c[0];a._selectedMinute=c[1];a._selectedSecond=c[2]}else{var f=b._constrainTime(a);a._selectedHour=f[0];a._selectedMinute=f[1];a._selectedSecond=d?f[2]:0}a._secondField=d?2:e;a._ampmField=b._get(a,i)?e:d?3:2;a._lastChr="";a._field=Math.max(0,Math.min(Math.max(1,a._secondField,a._ampmField),0));a.input.val()!=""&&b._showTime(a)},_extractTime:function(h,g){var n=this;g=g||h.input.val();var f=g.split(":"),p=n._get(h,k),o=n._get(h,i);if(f.length>=2){var r=!o&&g.indexOf(p[0])>e,q=!o&&g.indexOf(p[1])>e,a=parseInt(f[0],b);a=isNaN(a)?0:a;a=((r||q)&&a==d?0:a)+(q?d:0);var j=parseInt(f[1],b);j=isNaN(j)?0:j;var l=f.length>=3?parseInt(f[2],b):0;l=isNaN(l)||!n._get(h,m)?0:l;return n._constrainTime(h,[a,j,l])}return c},_constrainTime:function(d,a){var e=a!=c;if(!e){var b=this._determineTime(d,this._get(d,"defaultTime"))||new Date;a=[b.getHours(),b.getMinutes(),b.getSeconds()]}return a},_showTime:function(a){var b=this,c=b._get(a,i),e=b._formatNumber(c?a._selectedHour:(a._selectedHour+11)%d+1)+"Line truncated
|
||||
/* Copyright Notice for Dynarch Date Time Picker */
|
||||
/* Copyright Mihai Bazon, 2002-2005 | www.bazon.net/mishoo
|
||||
* -----------------------------------------------------------
|
||||
*
|
||||
* The DHTML Calendar, version 1.0 "It is happening again"
|
||||
*
|
||||
* Details and latest version at:
|
||||
* www.dynarch.com/projects/calendar
|
||||
*
|
||||
* This script is developed by Dynarch.com. Visit us at www.dynarch.com.
|
||||
*
|
||||
* This script is distributed under the GNU Lesser General Public License.
|
||||
* Read the entire license text here: http://www.gnu.org/licenses/lgpl.html
|
||||
*/
|
||||
|
||||
// Calendar EN language
|
||||
// Author: Mihai Bazon, <mihai_bazon@yahoo.com>
|
||||
// Encoding: any
|
||||
// Distributed under the same terms as the calendar itself.
|
||||
/* End Copyright Notice for Dynarch Date Time Picker */
|
||||
|
||||
Calendar=function(J,K,H,G){this.activeDiv=null;this.currentDateEl=null;this.getDateStatus=null;this.getDateToolTip=null;this.getDateText=null;this.timeout=null;this.onSelected=H||null;this.onClose=G||null;this.dragging=false;this.hidden=false;this.minYear=1970;this.maxYear=2050;this.dateFormat=Calendar._TT.DEF_DATE_FORMAT;this.ttDateFormat=Calendar._TT.TT_DATE_FORMAT;this.isPopup=true;this.weekNumbers=true;this.firstDayOfWeek=typeof J=="number"?J:Calendar._FD;this.showsOtherMonths=false;this.dateStr=K;this.ar_days=null;this.showsTime=false;this.time24=true;this.yearStep=2;this.hiliteToday=true;this.multiple=null;this.table=null;this.element=null;this.tbody=null;this.firstdayname=null;this.monthsCombo=null;this.yearsCombo=null;this.hilitedMonth=null;this.activeMonth=null;this.hilitedYear=null;this.activeYear=null;this.dateClicked=false;if(typeof Calendar._SDN=="undefined"){if(typeof Calendar._SDN_len=="undefined"){Calendar._SDN_len=3}var L=new Array();for(var I=8;I>0;){L[--I]=Calendar._DN[I].substr(0,Calendar._SDN_len)}Calendar._SDN=L;if(typeof Calendar._SMN_len=="undefined"){Calendar._SMN_len=3}L=new Array();for(var I=12;I>0;){L[--I]=Calendar._MN[I].substr(0,Calendar._SMN_len)}Calendar._SMN=L}};Calendar._C=null;Calendar.is_ie=(/msie/i.test(navigator.userAgent)&&!/opera/i.test(navigator.userAgent));Calendar.is_ie5=(Calendar.is_ie&&/msie 5\.0/i.test(navigator.userAgent));Calendar.is_opera=/opera/i.test(navigator.userAgent);Calendar.is_khtml=/Konqueror|Safari|KHTML/i.test(navigator.userAgent);Calendar.getAbsolutePos=function(I){var G=0,J=0;var K=/^div$/i.test(I.tagName);if(K&&I.scrollLeft){G=I.scrollLeft}if(K&&I.scrollTop){J=I.scrollTop}var H={x:I.offsetLeft-G,y:I.offsetTop-J};if(I.offsetParent){var L=this.getAbsolutePos(I.offsetParent);H.x+=L.x;H.y+=L.y}return H};Calendar.isRelated=function(G,E){var F=E.relatedTarget;if(!F){var H=E.type;if(H=="mouseover"){F=E.fromElement}else{if(H=="mouseout"){F=E.toElement}}}while(F){if(F==G){return true}F=F.parentNode}return false};Calendar.removeClass=function(G,H){if(!(G&&G.className)){return }var F=G.className.split(" ");var J=new Array();for(var I=F.length;I>0;){if(F[--I]!=H){J[J.length]=F[I]}}G.className=J.join(" ")};Calendar.addClass=function(D,C){Calendar.removeClass(D,C);D.className+=" "+C};Calendar.getElement=function(C){var D=Calendar.is_ie?window.event.srcElement:C.currentTarget;while(D.nodeType!=1||/^div$/i.test(D.tagName)){D=D.parentNode}return D};Calendar.getTargetElement=function(C){var D=Calendar.is_ie?window.event.srcElement:C.target;while(D.nodeType!=1){D=D.parentNode}return D};Calendar.stopEvent=function(B){B||(B=window.event);if(Calendar.is_ie){B.cancelBubble=true;B.returnValue=false}else{B.preventDefault();B.stopPropagation()}return false};Calendar.addEvent=function(D,E,F){if(D.attachEvent){D.attachEvent("on"+E,F)}else{if(D.addEventListener){D.addEventListener(E,F,true)}else{D["on"+E]=F}}};Calendar.removeEvent=function(D,E,F){if(D.detachEvent){D.detachEvent("on"+E,F)}else{if(D.removeEventListener){D.removeEventListener(E,F,true)}else{D["on"+E]=null}}};Calendar.createElement=function(E,F){var D=null;if(document.createElementNS){D=document.createElementNS("http://www.w3.org/1999/xhtml",E)}else{D=document.createElement(E)}if(typeof F!="undefined"){F.appendChild(D)}return D};Calendar._add_evs=function(el){with(Calendar){addEvent(el,"mouseover",dayMouseOver);addEvent(el,"mousedown",dayMouseDown);addEvent(el,"mouseout",dayMouseOut);if(is_ie){addEvent(el,"dblclick",dayMouseDblClick);el.setAttribute("unselectable",true)}}};Calendar.findMonth=function(B){if(typeof B.month!="undefined"){return B}else{if(typeof B.parentNode.month!="undefined"){return B.parentNode}}return null};Calendar.findYear=function(B){if(typeof B.year!="undefined"){return B}else{if(typeof B.parentNode.year!="undefined"){return B.parentNode}}return null};Calendar.showMonthsCombo=function(){var I=Calendar._C;if(!I){return false}var I=I;var H=I.activeDiv;var J=I.monthsCombo;if(I.hilitedMonth){Calendar.removeClass(I.hilitedMonth,"hilite")}if(I.activeMonth){Calendar.removeClass(I.activeMonth,"active")}var K=I.monthsCombo.getElementsByTagName("div")[I.date.getMonth()];Calendar.addClass(K,"active");I.activeMonth=K;var L=J.style;L.display="block";if(H.navtype<0){L.left=H.offsetLeft+"px"}else{var G=J.offsetWidth;if(typeof G=="undefined"){G=50}L.left=(H.offsetLeft+H.offsetWidth-G)+"px"}L.top=(H.offsetTop+H.offsetHeight)+"px"};Calendar.showYearsCombo=function(K){var N=Calendar._C;if(!N){return false}var N=N;var L=N.activeDiv;var S=N.yearsCombo;if(N.hilitedYear){Calendar.removeClass(N.hilitedYear,"hilite")}if(N.activeYear){Calendar.removeClass(N.activeYear,"active")}N.activeYear=null;var M=N.date.getFullYear()+(K?1:-1);var P=S.firstChild;var Q=false;for(var T=12;T>0;--T){if(M>=N.minYear&&M<=N.maxYear){P.innerHTML=M;P.year=M;P.style.display="block";Q=true}else{P.style.display="none"}P=P.nextSibling;M+=K?N.yearStep:-N.yearStep}if(Q){var O=S.style;O.display="block";if(L.navtype<0){O.left=L.offsetLeft+"px"}Line truncated
|
||||
|
||||
/*
|
||||
http://keith-wood.name/timeEntry.html
|
||||
Time entry for jQuery v1.4.8.
|
||||
Written by Keith Wood (kbwood{at}iinet.com.au) June 2007.
|
||||
Minor changes by Massimo Di Pierro Nov 2010 (simplified and changed behavior)
|
||||
Dual licensed under the GPL (http://dev.jquery.com/browser/trunk/jquery/GPL-LICENSE.txt) and
|
||||
MIT (http://dev.jquery.com/browser/trunk/jquery/MIT-LICENSE.txt) licenses.
|
||||
Please attribute the author if you use it.
|
||||
|
||||
Turn an input field into an entry point for a time value.
|
||||
The time can be entered via directly typing the value,
|
||||
via the arrow keys.
|
||||
It is configurable to show 12 or 24-hour time, to show or hide seconds,
|
||||
to enforce a minimum and/or maximum time, to change the spinner image.
|
||||
|
||||
Example: jQuery('input.time').timeEntry();
|
||||
*/
|
||||
|
||||
(function(a){var d=12,k="ampmNames",i="show24Hours",m="showSeconds",l="character",b=10,f=false,j="string",e=-1,c=null,h=true,g="timeEntry";function o(){this._disabledInputs=[];this._defaults={showSeconds:h,defaultTime:c,minTime:c,maxTime:c,show24Hours:h,ampmNames:["am","pm"]};a.extend(this._defaults)}a.extend(o.prototype,{markerClassName:"hasTimeEntry",setDefaults:function(a){n(this._defaults,a||{});return this},_connectTimeEntry:function(e,f){var c=this,d=a(e);if(d.hasClass(c.markerClassName))return;var b={};b.options=a.extend({},f);b._selectedHour=0;b._selectedMinute=0;b._selectedSecond=0;b._field=0;b.input=a(e);a.data(e,g,b);d.addClass(c.markerClassName).bind("focus.timeEntry",c._doFocus).bind("blur.timeEntry",c._doBlur).bind("click.timeEntry",c._doClick).bind("keydown.timeEntry",c._doKeyDown).bind("keypress.timeEntry",c._doKeyPress);a.browser.mozilla&&d.bind("input.timeEntry",function(){a.timeEntry._parseTime(b)});a.browser.msie&&d.bind("paste.timeEntry",function(){setTimeout(function(){a.timeEntry._parseTime(b)},1)})},_isDisabledTimeEntry:function(b){return a.inArray(b,this._disabledInputs)>e},_changeTimeEntry:function(e,b,f){var c=a.data(e,g);if(c){if(typeof b==j){var h=b;b={};b[h]=f}var d=this._extractTime(c);n(c.options,b||{});d&&this._setTime(c,new Date(0,0,0,d[0],d[1],d[2]))}a.data(e,g,c)},_destroyTimeEntry:function(d){var b=this;jQueryinput=a(d);if(!jQueryinput.hasClass(b.markerClassName))return;jQueryinput.removeClass(b.markerClassName).unbind(".timeEntry");b._disabledInputs=a.map(b._disabledInputs,function(a){return a==d?c:a});jQueryinput.parent().replaceWith(jQueryinput);a.removeData(d,g)},_setTimeTimeEntry:function(e,b){var d=a.data(e,g);d&&this._setTime(d,b?typeof b=="object"?new Date(b.getTime()):b:c)},_getTimeTimeEntry:function(e){var d=a.data(e,g),b=d?this._extractTime(d):c;return !b?c:new Date(0,0,0,b[0],b[1],b[2])},_getOffsetTimeEntry:function(e){var d=a.data(e,g),b=d?this._extractTime(d):c;return !b?0:(b[0]*3600+b[1]*60+b[2])*1e3},_doFocus:function(e){var d=e.nodeName&&e.nodeName.toLowerCase()=="input"?e:this;if(a.timeEntry._lastInput==d||a.timeEntry._isDisabledTimeEntry(d)){a.timeEntry._focussed=f;return}var i=a.data(d,g);a.timeEntry._focussed=h;a.timeEntry._lastInput=d;a.timeEntry._blurredInput=c;a.data(d,g,i);a.timeEntry._parseTime(i);setTimeout(function(){a.timeEntry._showField(i)},b)},_doBlur:function(){a.timeEntry._blurredInput=a.timeEntry._lastInput;a.timeEntry._lastInput=c},_doClick:function(k){var h=k.target,d=a.data(h,g);if(!a.timeEntry._focussed){var i=3;d._field=0;if(h.selectionStart!=c)for(var e=0;e<=Math.max(1,d._secondField,d._ampmField);e++){var m=e!=d._ampmField?e*i+2:d._ampmField*i+2;d._field=e;if(h.selectionStart<m)break}else if(h.createTextRange)for(var n=a(k.srcElement),j=h.createTextRange(),o=function(a){return ({thin:2,medium:4,thick:6})[a]||a},p=k.clientX+document.documentElement.scrollLeft-(n.offset().left+parseInt(o(n.css("border-left-width")),b))-j.offsetLeft,e=0;e<=Math.max(1,d._secondField,d._ampmField);e++){var m=e!=d._ampmField?e*i+2:d._ampmField*i+2;j.collapse();j.moveEnd(l,m);d._field=e;if(p<j.boundingWidth)break}}a.data(h,g,d);a.timeEntry._showField(d);a.timeEntry._focussed=f},_doKeyDown:function(c){if(c.keyCode>=48)return h;var b=a.data(c.target,g);switch(c.keyCode){case 9:var d=a(":input");d.eq(d.index(this)+(c.shiftKey?e:+1)).focus();break;case 37:a.timeEntry._changeField(b,e,f);break;case 38:a.timeEntry._adjustField(b,e);break;case 16:!c.shiftKey&&a.timeEntry._changeField(b,+1,f);break;case 39:a.timeEntry._changeField(b,+1,f);break;case 40:a.timeEntry._adjustField(b,+1);break;case 32:case 46:a.timeEntry._setValue(b,"")}return f},_doKeyPress:function(b){var c=String.fromCharCode(b.charCode==undefined?b.keyCode:b.charCode);if(c<" ")return h;var d=a.data(b.target,g);a.timeEntry._handleKeyPress(d,c);return f},_get:function(d,b){return d.options[b]!=c?d.options[b]:a.timeEntry._defaults[b]},_parseTime:function(a){var b=this,c=b._extractTime(a),d=b._get(a,m);if(c){a._selectedHour=c[0];a._selectedMinute=c[1];a._selectedSecond=c[2]}else{var f=b._constrainTime(a);a._selectedHour=f[0];a._selectedMinute=f[1];a._selectedSecond=d?f[2]:0}a._secondField=d?2:e;a._ampmField=b._get(a,i)?e:d?3:2;a._lastChr="";a._field=Math.max(0,Math.min(Math.max(1,a._secondField,a._ampmField),0));a.input.val()!=""&&b._showTime(a)},_extractTime:function(h,g){var n=this;g=g||h.input.val();var f=g.split(":"),p=n._get(h,k),o=n._get(h,i);if(f.length>=2){var r=!o&&g.indexOf(p[0])>e,q=!o&&g.indexOf(p[1])>e,a=parseInt(f[0],b);a=isNaN(a)?0:a;a=((r||q)&&a==d?0:a)+(q?d:0);var j=parseInt(f[1],b);j=isNaN(j)?0:j;var l=f.length>=3?parseInt(f[2],b):0;l=isNaN(l)||!n._get(h,m)?0:l;return n._constrainTime(h,[a,j,l])}return c},_constrainTime:function(d,a){var e=a!=c;if(!e){var b=this._determineTime(d,this._get(d,"defaultTime"))||new Date;a=[b.getHours(),b.getMinutes(),b.getSeconds()]}return a},_showTime:function(a){var b=this,c=b._get(a,i),e=b._formatNumber(c?a._selectedHour:(a._selectedHour+11)%d+1)+"Line truncated
|
||||
@@ -2,28 +2,28 @@
|
||||
(c) Copyrights 2007 - 2008
|
||||
|
||||
Original idea by by Binny V A, http://www.openjs.com/scripts/events/keyboard_shortcuts/
|
||||
|
||||
jQuery Plugin by Tzury Bar Yochay
|
||||
|
||||
jQuery Plugin by Tzury Bar Yochay
|
||||
tzury.by@gmail.com
|
||||
http://evalinux.wordpress.com
|
||||
http://facebook.com/profile.php?id=513676303
|
||||
|
||||
Project's sites:
|
||||
Project's sites:
|
||||
http://code.google.com/p/js-hotkeys/
|
||||
http://github.com/tzuryby/hotkeys/tree/master
|
||||
|
||||
License: same as jQuery license.
|
||||
License: same as jQuery license.
|
||||
|
||||
USAGE:
|
||||
// simple usage
|
||||
$(document).bind('keydown', 'Ctrl+c', function(){ alert('copy anyone?');});
|
||||
|
||||
|
||||
// special options such as disableInIput
|
||||
$(document).bind('keydown', {combi:'Ctrl+x', disableInInput: true} , function() {});
|
||||
|
||||
|
||||
Note:
|
||||
This plugin wraps the following jQuery methods: $.fn.find, $.fn.bind and $.fn.unbind
|
||||
|
||||
|
||||
*/
|
||||
|
||||
|
||||
@@ -32,23 +32,23 @@ Note:
|
||||
jQuery.fn.__bind__ = jQuery.fn.bind;
|
||||
jQuery.fn.__unbind__ = jQuery.fn.unbind;
|
||||
jQuery.fn.__find__ = jQuery.fn.find;
|
||||
|
||||
|
||||
var hotkeys = {
|
||||
version: '0.7.8',
|
||||
override: /keydown|keypress|keyup/g,
|
||||
triggersMap: {},
|
||||
|
||||
specialKeys: { 27: 'esc', 9: 'tab', 32:'space', 13: 'return', 8:'backspace', 145: 'scroll',
|
||||
|
||||
specialKeys: { 27: 'esc', 9: 'tab', 32:'space', 13: 'return', 8:'backspace', 145: 'scroll',
|
||||
20: 'capslock', 144: 'numlock', 19:'pause', 45:'insert', 36:'home', 46:'del',
|
||||
35:'end', 33: 'pageup', 34:'pagedown', 37:'left', 38:'up', 39:'right',40:'down',
|
||||
112:'f1',113:'f2', 114:'f3', 115:'f4', 116:'f5', 117:'f6', 118:'f7', 119:'f8',
|
||||
35:'end', 33: 'pageup', 34:'pagedown', 37:'left', 38:'up', 39:'right',40:'down',
|
||||
112:'f1',113:'f2', 114:'f3', 115:'f4', 116:'f5', 117:'f6', 118:'f7', 119:'f8',
|
||||
120:'f9', 121:'f10', 122:'f11', 123:'f12' },
|
||||
|
||||
shiftNums: { "`":"~", "1":"!", "2":"@", "3":"#", "4":"$", "5":"%", "6":"^", "7":"&",
|
||||
"8":"*", "9":"(", "0":")", "-":"_", "=":"+", ";":":", "'":"\"", ",":"<",
|
||||
|
||||
shiftNums: { "`":"~", "1":"!", "2":"@", "3":"#", "4":"$", "5":"%", "6":"^", "7":"&",
|
||||
"8":"*", "9":"(", "0":")", "-":"_", "=":"+", ";":":", "'":"\"", ",":"<",
|
||||
".":">", "/":"?", "\\":"|" },
|
||||
|
||||
newTrigger: function (type, combi, callback) {
|
||||
|
||||
newTrigger: function (type, combi, callback) {
|
||||
// i.e. {'keyup': {'ctrl': {cb: callback, disableInInput: false}}}
|
||||
var result = {};
|
||||
result[type] = {};
|
||||
@@ -58,17 +58,17 @@ Note:
|
||||
};
|
||||
// add firefox num pad char codes
|
||||
if (jQuery.browser.mozilla){
|
||||
hotkeys.specialKeys = jQuery.extend(hotkeys.specialKeys, { 96: '0', 97:'1', 98: '2', 99:
|
||||
hotkeys.specialKeys = jQuery.extend(hotkeys.specialKeys, { 96: '0', 97:'1', 98: '2', 99:
|
||||
'3', 100: '4', 101: '5', 102: '6', 103: '7', 104: '8', 105: '9' });
|
||||
}
|
||||
|
||||
// a wrapper around of $.fn.find
|
||||
|
||||
// a wrapper around of $.fn.find
|
||||
// see more at: http://groups.google.com/group/jquery-en/browse_thread/thread/18f9825e8d22f18d
|
||||
jQuery.fn.find = function( selector ) {
|
||||
this.query=selector;
|
||||
return jQuery.fn.__find__.apply(this, arguments);
|
||||
};
|
||||
|
||||
|
||||
jQuery.fn.unbind = function (type, combi, fn){
|
||||
if (jQuery.isFunction(combi)){
|
||||
fn = combi;
|
||||
@@ -84,27 +84,27 @@ Note:
|
||||
// call jQuery original unbind
|
||||
return this.__unbind__(type, fn);
|
||||
};
|
||||
|
||||
|
||||
jQuery.fn.bind = function(type, data, fn){
|
||||
// grab keyup,keydown,keypress
|
||||
var handle = type.match(hotkeys.override);
|
||||
|
||||
|
||||
if (jQuery.isFunction(data) || !handle){
|
||||
// call jQuery.bind only
|
||||
return this.__bind__(type, data, fn);
|
||||
}
|
||||
else{
|
||||
// split the job
|
||||
var result = null,
|
||||
var result = null,
|
||||
// pass the rest to the original $.fn.bind
|
||||
pass2jq = jQuery.trim(type.replace(hotkeys.override, ''));
|
||||
|
||||
|
||||
// see if there are other types, pass them to the original $.fn.bind
|
||||
if (pass2jq){
|
||||
// call original jQuery.bind()
|
||||
result = this.__bind__(pass2jq, data, fn);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (typeof data === "string"){
|
||||
data = {'combi': data};
|
||||
}
|
||||
@@ -114,10 +114,10 @@ Note:
|
||||
var combi = data.combi.toLowerCase(),
|
||||
trigger = hotkeys.newTrigger(eventType, combi, fn),
|
||||
selectorId = ((this.prevObject && this.prevObject.query) || (this[0].id && this[0].id) || this[0]).toString();
|
||||
|
||||
|
||||
//trigger[eventType][combi].propagate = data.propagate;
|
||||
trigger[eventType][combi].disableInInput = data.disableInInput;
|
||||
|
||||
|
||||
// first time selector is bounded
|
||||
if (!hotkeys.triggersMap[selectorId]) {
|
||||
hotkeys.triggersMap[selectorId] = trigger;
|
||||
@@ -137,12 +137,12 @@ Note:
|
||||
else {
|
||||
hotkeys.triggersMap[selectorId][eventType][combi][mapPoint.length] = trigger[eventType][combi];
|
||||
}
|
||||
|
||||
|
||||
// add attribute and call $.event.add per matched element
|
||||
this.each(function(){
|
||||
// jQuery wrapper for the current element
|
||||
var jqElem = jQuery(this);
|
||||
|
||||
|
||||
// element already associated with another collection
|
||||
if (jqElem.attr('hkId') && jqElem.attr('hkId') !== selectorId){
|
||||
selectorId = jqElem.attr('hkId') + ";" + selectorId;
|
||||
@@ -155,7 +155,7 @@ Note:
|
||||
return result;
|
||||
}
|
||||
};
|
||||
// work-around for opera and safari where (sometimes) the target is the element which was last
|
||||
// work-around for opera and safari where (sometimes) the target is the element which was last
|
||||
// clicked with the mouse and not the document event it would make sense to get the document
|
||||
hotkeys.findElement = function (elem){
|
||||
if (!jQuery(elem).attr('hkId')){
|
||||
@@ -169,10 +169,10 @@ Note:
|
||||
};
|
||||
// the event handler
|
||||
hotkeys.handler = function(event) {
|
||||
var target = hotkeys.findElement(event.currentTarget),
|
||||
var target = hotkeys.findElement(event.currentTarget),
|
||||
jTarget = jQuery(target),
|
||||
ids = jTarget.attr('hkId');
|
||||
|
||||
|
||||
if(ids){
|
||||
ids = ids.split(';');
|
||||
var code = event.which,
|
||||
@@ -181,8 +181,8 @@ Note:
|
||||
// prevent f5 overlapping with 't' (or f4 with 's', etc.)
|
||||
character = !special && String.fromCharCode(code).toLowerCase(),
|
||||
shift = event.shiftKey,
|
||||
ctrl = event.ctrlKey,
|
||||
// patch for jquery 1.2.5 && 1.2.6 see more at:
|
||||
ctrl = event.ctrlKey,
|
||||
// patch for jquery 1.2.5 && 1.2.6 see more at:
|
||||
// http://groups.google.com/group/jquery-en/browse_thread/thread/83e10b3bb1f1c32b
|
||||
alt = event.altKey || event.originalEvent.altKey,
|
||||
mapPoint = null;
|
||||
@@ -193,9 +193,9 @@ Note:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//find by: id.type.combi.options
|
||||
if (mapPoint){
|
||||
|
||||
//find by: id.type.combi.options
|
||||
if (mapPoint){
|
||||
var trigger;
|
||||
// event type is associated with the hkId
|
||||
if(!shift && !ctrl && !alt) { // No Modifiers
|
||||
@@ -207,12 +207,12 @@ Note:
|
||||
if(alt) modif +='alt+';
|
||||
if(ctrl) modif+= 'ctrl+';
|
||||
if(shift) modif += 'shift+';
|
||||
|
||||
|
||||
// modifiers + special keys or modifiers + character or modifiers + shift character or just shift character
|
||||
trigger = mapPoint[modif+special];
|
||||
if (!trigger){
|
||||
if (character){
|
||||
trigger = mapPoint[modif+character]
|
||||
trigger = mapPoint[modif+character]
|
||||
|| mapPoint[modif+hotkeys.shiftNums[character]]
|
||||
// '$' can be triggered as 'Shift+4' or 'Shift+$' or just '$'
|
||||
|| (modif === 'shift+' && mapPoint[hotkeys.shiftNums[character]]);
|
||||
@@ -225,7 +225,7 @@ Note:
|
||||
if(trigger[x].disableInInput){
|
||||
// double check event.currentTarget and event.target
|
||||
var elem = jQuery(event.target);
|
||||
if (jTarget.is("input") || jTarget.is("textarea")
|
||||
if (jTarget.is("input") || jTarget.is("textarea")
|
||||
|| elem.is("input") || elem.is("textarea")) {
|
||||
return true;
|
||||
}
|
||||
@@ -242,3 +242,4 @@ Note:
|
||||
window.hotkeys = hotkeys;
|
||||
return jQuery;
|
||||
})(jQuery);
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
/*! jQuery v1.7.1 jquery.com | jquery.org/license */
|
||||
(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function cb(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function ca(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bE.test(a)?d(a,e):ca(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)ca(a+"["+e+"]",b[e],c,d);else d(a,b)}function b_(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function b$(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bT,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=b$(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=b$(a,c,d,e,"*",g));return l}function bZ(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bP),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bC(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bx:by,g=0,h=e.length;if(d>0){if(c!=="border")for(;g<h;g++)c||(d-=parseFloat(f.css(a,"padding"+e[g]))||0),c==="margin"?d+=parseFloat(f.css(a,c+e[g]))||0:d-=parseFloat(f.css(a,"border"+e[g]+"Width"))||0;return d+"px"}d=bz(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0;if(c)for(;g<h;g++)d+=parseFloat(f.css(a,"padding"+e[g]))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+e[g]+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+e[g]))||0);return d+"px"}function bp(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bm)}function bm(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bk(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c+(i[c][d].namespace?".":"")+i[c][d].namespace,i[c][d],i[c][d].data)}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;iLine truncated
|
||||
f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:G(g),namespace:n.join(".")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent("on"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||"")).split(" ");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp("(^|\\.)"+l.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d==="**"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.handle,q&&(q.elem=null),f.removeData(a,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f.event.triggered))return;h.indexOf("!")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,"events")||{})[c.type]&&f._data(m,"handle"),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)&&o&&e[h]&&(h!=="focus"&&h!=="blur"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,"events")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=[],j,k,l,m,n,o,p,q,r,s,t;g[0]=c,c.delegateTarget=this;if(e&&!c.target.disabled&&(!c.button||c.type!=="click")){m=f(this),m.context=this.ownerDocument||this;for(l=c.target;l!=this;l=l.parentNode||this){o={},q=[],m[0]=l;for(j=0;j<e;j++)r=d[j],s=r.selector,o[s]===b&&(o[s]=r.quick?H(l,r.quick):m.is(s)),o[s]&&q.push(r);q.length&&i.push({elem:l,matches:q})}}d.length>e&&i.push({elem:this,matches:d.slice(e)});for(j=0;j<i.length&&!c.isPropagationStopped();j++){p=i[j],c.currentTarget=p.elem;for(k=0;k<p.matches.length&&!c.isImmediatePropagationStopped();k++){r=p.matches[k];if(h||!c.namespace&&!r.namespace||c.namespace_re&&c.namespace_re.test(r.namespace))c.data=r.data,c.handleObj=r,n=((f.event.special[r.origType]||{}).handle||r.handler).apply(p.elem,g),n!==b&&(c.result=n,n===!1&&(c.preventDefault(),c.stopPropagation()))}}return c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pageX==null&&d.cLine truncated
|
||||
{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bp)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1></$2>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bn(k[i]);else bn(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||be.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bq=/alpha\([^)]*\)/i,br=/opacitLine truncated
|
||||
{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bp)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1></$2>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bn(k[i]);else bn(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||be.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bq=/alpha\([^)]*\)/i,br=/opacitLine truncated
|
||||
File diff suppressed because it is too large.
Load diff
+270
-270
@@ -1,270 +1,270 @@
|
||||
/*
|
||||
// jQuery multiSelect
|
||||
//
|
||||
// Version 1.0 beta
|
||||
//
|
||||
// Cory S.N. LaViska
|
||||
// A Beautiful Site (http://abeautifulsite.net/)
|
||||
// 06 April 2008
|
||||
//
|
||||
// Visit http://abeautifulsite.net/notebook.php?article=62 for more information
|
||||
//
|
||||
// Usage: $('#control_id').multiSelect( options, callback )
|
||||
//
|
||||
// Options: selectAll - whether or not to display the Select All option; true/false, default = true
|
||||
// selectAllText - text to display for selecting/unselecting all options simultaneously
|
||||
// noneSelected - text to display when there are no selected items in the list
|
||||
// oneOrMoreSelected - text to display when there are one or more selected items in the list
|
||||
// (note: you can use % as a placeholder for the number of items selected).
|
||||
// Use * to show a comma separated list of all selected; default = '% selected'
|
||||
//
|
||||
// Dependencies: jQuery 1.2 or higher (http://jquery.com/)
|
||||
// the jQuery Dimensions plugin (http://plugins.jquery.com/project/dimensions)
|
||||
//
|
||||
// Licensing & Terms of Use
|
||||
//
|
||||
// jQuery File Tree is licensed under a Creative Commons License and is copyrighted (C)2008 by Cory S.N. LaViska.
|
||||
// For details, visit http://creativecommons.org/licenses/by/3.0/us/
|
||||
//
|
||||
*/
|
||||
if(jQuery) (function($){
|
||||
|
||||
$.extend($.fn, {
|
||||
multiSelect: function(o, callback) {
|
||||
// Default options
|
||||
if( !o ) var o = {};
|
||||
if( o.selectAll == undefined ) o.selectAll = true;
|
||||
if( o.selectAllText == undefined ) o.selectAllText = "Select All";
|
||||
if( o.noneSelected == undefined ) o.noneSelected = 'Select options';
|
||||
if( o.oneOrMoreSelected == undefined ) o.oneOrMoreSelected = '% selected';
|
||||
|
||||
// Initialize each multiSelect
|
||||
$(this).each( function() {
|
||||
var select = $(this);
|
||||
var html = '<input type="text" readonly="readonly" class="multiSelect" value="" style="cursor: default;" />';
|
||||
html += '<div class="multiSelectOptions" style="position: absolute; z-index: 99999; display: none;">';
|
||||
if( o.selectAll ) html += '<label class="selectAll"><input type="checkbox" class="selectAll" />' + o.selectAllText + '</label>';
|
||||
$(select).find('OPTION').each( function() {
|
||||
if( $(this).val() != '' ) {
|
||||
html += '<label><input type="checkbox" name="' + $(select).attr('name') + '" value="' + $(this).val() + '"';
|
||||
if( $(this).attr('selected') ) html += ' checked="checked"';
|
||||
html += ' />' + $(this).html() + '</label>';
|
||||
}
|
||||
});
|
||||
html += '</div>';
|
||||
$(select).after(html);
|
||||
|
||||
// Events
|
||||
$(select).next('.multiSelect').mouseover( function() {
|
||||
$(this).addClass('hover');
|
||||
}).mouseout( function() {
|
||||
$(this).removeClass('hover');
|
||||
}).click( function() {
|
||||
// Show/hide on click
|
||||
if( $(this).hasClass('active') ) {
|
||||
$(this).multiSelectOptionsHide();
|
||||
} else {
|
||||
$(this).multiSelectOptionsShow();
|
||||
}
|
||||
return false;
|
||||
}).focus( function() {
|
||||
// So it can be styled with CSS
|
||||
$(this).addClass('focus');
|
||||
}).blur( function() {
|
||||
// So it can be styled with CSS
|
||||
$(this).removeClass('focus');
|
||||
});
|
||||
|
||||
// Determine if Select All should be checked initially
|
||||
if( o.selectAll ) {
|
||||
var sa = true;
|
||||
$(select).next('.multiSelect').next('.multiSelectOptions').find('INPUT:checkbox').not('.selectAll').each( function() {
|
||||
if( !$(this).attr('checked') ) sa = false;
|
||||
});
|
||||
if( sa ) $(select).next('.multiSelect').next('.multiSelectOptions').find('INPUT.selectAll').attr('checked', true).parent().addClass('checked');
|
||||
}
|
||||
|
||||
// Handle Select All
|
||||
$(select).next('.multiSelect').next('.multiSelectOptions').find('INPUT.selectAll').click( function() {
|
||||
if( $(this).attr('checked') == true ) $(this).parent().parent().find('INPUT:checkbox').attr('checked', true).parent().addClass('checked'); else $(this).parent().parent().find('INPUT:checkbox').attr('checked', false).parent().removeClass('checked');
|
||||
});
|
||||
|
||||
// Handle checkboxes
|
||||
$(select).next('.multiSelect').next('.multiSelectOptions').find('INPUT:checkbox').click( function() {
|
||||
$(this).parent().parent().multiSelectUpdateSelected(o);
|
||||
$(this).parent().parent().find('LABEL').removeClass('checked').find('INPUT:checked').parent().addClass('checked');
|
||||
$(this).parent().parent().prev('.multiSelect').focus();
|
||||
if( !$(this).attr('checked') ) $(this).parent().parent().find('INPUT:checkbox.selectAll').attr('checked', false).parent().removeClass('checked');
|
||||
if( callback ) callback($(this));
|
||||
});
|
||||
|
||||
// Initial display
|
||||
$(select).next('.multiSelect').next('.multiSelectOptions').each( function() {
|
||||
$(this).multiSelectUpdateSelected(o);
|
||||
$(this).find('INPUT:checked').parent().addClass('checked');
|
||||
});
|
||||
|
||||
// Handle hovers
|
||||
$(select).next('.multiSelect').next('.multiSelectOptions').find('LABEL').mouseover( function() {
|
||||
$(this).parent().find('LABEL').removeClass('hover');
|
||||
$(this).addClass('hover');
|
||||
}).mouseout( function() {
|
||||
$(this).parent().find('LABEL').removeClass('hover');
|
||||
});
|
||||
|
||||
// Keyboard
|
||||
$(select).next('.multiSelect').keydown( function(e) {
|
||||
// Is dropdown visible?
|
||||
if( $(this).next('.multiSelectOptions').is(':visible') ) {
|
||||
// Dropdown is visible
|
||||
// Tab
|
||||
if( e.keyCode == 9 ) {
|
||||
$(this).addClass('focus').trigger('click'); // esc, left, right - hide
|
||||
$(this).focus().next(':input').focus();
|
||||
return true;
|
||||
}
|
||||
|
||||
// ESC, Left, Right
|
||||
if( e.keyCode == 27 || e.keyCode == 37 || e.keyCode == 39 ) {
|
||||
// Hide dropdown
|
||||
$(this).addClass('focus').trigger('click');
|
||||
}
|
||||
// Down
|
||||
if( e.keyCode == 40 ) {
|
||||
if( !$(this).next('.multiSelectOptions').find('LABEL').hasClass('hover') ) {
|
||||
// Default to first item
|
||||
$(this).next('.multiSelectOptions').find('LABEL:first').addClass('hover');
|
||||
} else {
|
||||
// Move down, cycle to top if on bottom
|
||||
$(this).next('.multiSelectOptions').find('LABEL.hover').removeClass('hover').next('LABEL').addClass('hover');
|
||||
if( !$(this).next('.multiSelectOptions').find('LABEL').hasClass('hover') ) {
|
||||
$(this).next('.multiSelectOptions').find('LABEL:first').addClass('hover');
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
// Up
|
||||
if( e.keyCode == 38 ) {
|
||||
if( !$(this).next('.multiSelectOptions').find('LABEL').hasClass('hover') ) {
|
||||
// Default to first item
|
||||
$(this).next('.multiSelectOptions').find('LABEL:first').addClass('hover');
|
||||
} else {
|
||||
// Move up, cycle to bottom if on top
|
||||
$(this).next('.multiSelectOptions').find('LABEL.hover').removeClass('hover').prev('LABEL').addClass('hover');
|
||||
if( !$(this).next('.multiSelectOptions').find('LABEL').hasClass('hover') ) {
|
||||
$(this).next('.multiSelectOptions').find('LABEL:last').addClass('hover');
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
// Enter, Space
|
||||
if( e.keyCode == 13 || e.keyCode == 32 ) {
|
||||
// Select All
|
||||
if( $(this).next('.multiSelectOptions').find('LABEL.hover INPUT:checkbox').hasClass('selectAll') ) {
|
||||
if( $(this).next('.multiSelectOptions').find('LABEL.hover INPUT:checkbox').attr('checked') ) {
|
||||
// Uncheck all
|
||||
$(this).next('.multiSelectOptions').find('INPUT:checkbox').attr('checked', false).parent().removeClass('checked');
|
||||
} else {
|
||||
// Check all
|
||||
$(this).next('.multiSelectOptions').find('INPUT:checkbox').attr('checked', true).parent().addClass('checked');
|
||||
}
|
||||
$(this).next('.multiSelectOptions').multiSelectUpdateSelected(o);
|
||||
if( callback ) callback($(this));
|
||||
return false;
|
||||
}
|
||||
// Other checkboxes
|
||||
if( $(this).next('.multiSelectOptions').find('LABEL.hover INPUT:checkbox').attr('checked') ) {
|
||||
// Uncheck
|
||||
$(this).next('.multiSelectOptions').find('LABEL.hover INPUT:checkbox').attr('checked', false);
|
||||
$(this).next('.multiSelectOptions').multiSelectUpdateSelected(o);
|
||||
$(this).next('.multiSelectOptions').find('LABEL').removeClass('checked').find('INPUT:checked').parent().addClass('checked');
|
||||
// Select all status can't be checked at this point
|
||||
$(this).next('.multiSelectOptions').find('INPUT:checkbox.selectAll').attr('checked', false).parent().removeClass('checked');
|
||||
if( callback ) callback($(this));
|
||||
} else {
|
||||
// Check
|
||||
$(this).next('.multiSelectOptions').find('LABEL.hover INPUT:checkbox').attr('checked', true);
|
||||
$(this).next('.multiSelectOptions').multiSelectUpdateSelected(o);
|
||||
$(this).next('.multiSelectOptions').find('LABEL').removeClass('checked').find('INPUT:checked').parent().addClass('checked');
|
||||
if( callback ) callback($(this));
|
||||
}
|
||||
}
|
||||
return false;
|
||||
} else {
|
||||
// Dropdown is not visible
|
||||
if( e.keyCode == 38 || e.keyCode == 40 || e.keyCode == 13 || e.keyCode == 32 ) { // down, enter, space - show
|
||||
// Show dropdown
|
||||
$(this).removeClass('focus').trigger('click');
|
||||
$(this).next('.multiSelectOptions').find('LABEL:first').addClass('hover');
|
||||
return false;
|
||||
}
|
||||
// Tab key
|
||||
if( e.keyCode == 9 ) {
|
||||
// Shift focus to next INPUT element on page
|
||||
$(this).focus().next(':input').focus();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
// Prevent enter key from submitting form
|
||||
if( e.keyCode == 13 ) return false;
|
||||
});
|
||||
|
||||
// Eliminate the original form element
|
||||
$(select).remove();
|
||||
});
|
||||
|
||||
},
|
||||
|
||||
// Hide the dropdown
|
||||
multiSelectOptionsHide: function() {
|
||||
$(this).removeClass('active').next('.multiSelectOptions').hide();
|
||||
},
|
||||
|
||||
// Show the dropdown
|
||||
multiSelectOptionsShow: function() {
|
||||
// Hide any open option boxes
|
||||
$('.multiSelect').multiSelectOptionsHide();
|
||||
$(this).next('.multiSelectOptions').find('LABEL').removeClass('hover');
|
||||
$(this).addClass('active').next('.multiSelectOptions').show();
|
||||
|
||||
// Position it
|
||||
var offset = $(this).offset();
|
||||
$(this).next('.multiSelectOptions').css({ top: offset.top + $(this).outerHeight() + 'px' });
|
||||
$(this).next('.multiSelectOptions').css({ left: offset.left + 'px' });
|
||||
|
||||
// Disappear on hover out
|
||||
multiSelectCurrent = $(this);
|
||||
var timer = '';
|
||||
$(this).next('.multiSelectOptions').hover( function() {
|
||||
clearTimeout(timer);
|
||||
}, function() {
|
||||
timer = setTimeout('$(multiSelectCurrent).multiSelectOptionsHide(); $(multiSelectCurrent).unbind("hover");', 250);
|
||||
});
|
||||
|
||||
},
|
||||
|
||||
// Update the textbox with the total number of selected items
|
||||
multiSelectUpdateSelected: function(o) {
|
||||
var i = 0, s = '';
|
||||
$(this).find('INPUT:checkbox:checked').not('.selectAll').each( function() {
|
||||
i++;
|
||||
})
|
||||
if( i == 0 ) {
|
||||
$(this).prev('INPUT.multiSelect').val( o.noneSelected );
|
||||
} else {
|
||||
if( o.oneOrMoreSelected == '*' ) {
|
||||
var display = '';
|
||||
$(this).find('INPUT:checkbox:checked').each( function() {
|
||||
if( $(this).parent().text() != o.selectAllText ) display = display + $(this).parent().text() + ', ';
|
||||
});
|
||||
display = display.substr(0, display.length - 2);
|
||||
$(this).prev('INPUT.multiSelect').val( display );
|
||||
} else {
|
||||
$(this).prev('INPUT.multiSelect').val( o.oneOrMoreSelected.replace('%', i) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
})(jQuery);
|
||||
/*
|
||||
// jQuery multiSelect
|
||||
//
|
||||
// Version 1.0 beta
|
||||
//
|
||||
// Cory S.N. LaViska
|
||||
// A Beautiful Site (http://abeautifulsite.net/)
|
||||
// 06 April 2008
|
||||
//
|
||||
// Visit http://abeautifulsite.net/notebook.php?article=62 for more information
|
||||
//
|
||||
// Usage: $('#control_id').multiSelect( options, callback )
|
||||
//
|
||||
// Options: selectAll - whether or not to display the Select All option; true/false, default = true
|
||||
// selectAllText - text to display for selecting/unselecting all options simultaneously
|
||||
// noneSelected - text to display when there are no selected items in the list
|
||||
// oneOrMoreSelected - text to display when there are one or more selected items in the list
|
||||
// (note: you can use % as a placeholder for the number of items selected).
|
||||
// Use * to show a comma separated list of all selected; default = '% selected'
|
||||
//
|
||||
// Dependencies: jQuery 1.2 or higher (http://jquery.com/)
|
||||
// the jQuery Dimensions plugin (http://plugins.jquery.com/project/dimensions)
|
||||
//
|
||||
// Licensing & Terms of Use
|
||||
//
|
||||
// jQuery File Tree is licensed under a Creative Commons License and is copyrighted (C)2008 by Cory S.N. LaViska.
|
||||
// For details, visit http://creativecommons.org/licenses/by/3.0/us/
|
||||
//
|
||||
*/
|
||||
if(jQuery) (function($){
|
||||
|
||||
$.extend($.fn, {
|
||||
multiSelect: function(o, callback) {
|
||||
// Default options
|
||||
if( !o ) var o = {};
|
||||
if( o.selectAll == undefined ) o.selectAll = true;
|
||||
if( o.selectAllText == undefined ) o.selectAllText = "Select All";
|
||||
if( o.noneSelected == undefined ) o.noneSelected = 'Select options';
|
||||
if( o.oneOrMoreSelected == undefined ) o.oneOrMoreSelected = '% selected';
|
||||
|
||||
// Initialize each multiSelect
|
||||
$(this).each( function() {
|
||||
var select = $(this);
|
||||
var html = '<input type="text" readonly="readonly" class="multiSelect" value="" style="cursor: default;" />';
|
||||
html += '<div class="multiSelectOptions" style="position: absolute; z-index: 99999; display: none;">';
|
||||
if( o.selectAll ) html += '<label class="selectAll"><input type="checkbox" class="selectAll" />' + o.selectAllText + '</label>';
|
||||
$(select).find('OPTION').each( function() {
|
||||
if( $(this).val() != '' ) {
|
||||
html += '<label><input type="checkbox" name="' + $(select).attr('name') + '" value="' + $(this).val() + '"';
|
||||
if( $(this).attr('selected') ) html += ' checked="checked"';
|
||||
html += ' />' + $(this).html() + '</label>';
|
||||
}
|
||||
});
|
||||
html += '</div>';
|
||||
$(select).after(html);
|
||||
|
||||
// Events
|
||||
$(select).next('.multiSelect').mouseover( function() {
|
||||
$(this).addClass('hover');
|
||||
}).mouseout( function() {
|
||||
$(this).removeClass('hover');
|
||||
}).click( function() {
|
||||
// Show/hide on click
|
||||
if( $(this).hasClass('active') ) {
|
||||
$(this).multiSelectOptionsHide();
|
||||
} else {
|
||||
$(this).multiSelectOptionsShow();
|
||||
}
|
||||
return false;
|
||||
}).focus( function() {
|
||||
// So it can be styled with CSS
|
||||
$(this).addClass('focus');
|
||||
}).blur( function() {
|
||||
// So it can be styled with CSS
|
||||
$(this).removeClass('focus');
|
||||
});
|
||||
|
||||
// Determine if Select All should be checked initially
|
||||
if( o.selectAll ) {
|
||||
var sa = true;
|
||||
$(select).next('.multiSelect').next('.multiSelectOptions').find('INPUT:checkbox').not('.selectAll').each( function() {
|
||||
if( !$(this).attr('checked') ) sa = false;
|
||||
});
|
||||
if( sa ) $(select).next('.multiSelect').next('.multiSelectOptions').find('INPUT.selectAll').attr('checked', true).parent().addClass('checked');
|
||||
}
|
||||
|
||||
// Handle Select All
|
||||
$(select).next('.multiSelect').next('.multiSelectOptions').find('INPUT.selectAll').click( function() {
|
||||
if( $(this).attr('checked') == true ) $(this).parent().parent().find('INPUT:checkbox').attr('checked', true).parent().addClass('checked'); else $(this).parent().parent().find('INPUT:checkbox').attr('checked', false).parent().removeClass('checked');
|
||||
});
|
||||
|
||||
// Handle checkboxes
|
||||
$(select).next('.multiSelect').next('.multiSelectOptions').find('INPUT:checkbox').click( function() {
|
||||
$(this).parent().parent().multiSelectUpdateSelected(o);
|
||||
$(this).parent().parent().find('LABEL').removeClass('checked').find('INPUT:checked').parent().addClass('checked');
|
||||
$(this).parent().parent().prev('.multiSelect').focus();
|
||||
if( !$(this).attr('checked') ) $(this).parent().parent().find('INPUT:checkbox.selectAll').attr('checked', false).parent().removeClass('checked');
|
||||
if( callback ) callback($(this));
|
||||
});
|
||||
|
||||
// Initial display
|
||||
$(select).next('.multiSelect').next('.multiSelectOptions').each( function() {
|
||||
$(this).multiSelectUpdateSelected(o);
|
||||
$(this).find('INPUT:checked').parent().addClass('checked');
|
||||
});
|
||||
|
||||
// Handle hovers
|
||||
$(select).next('.multiSelect').next('.multiSelectOptions').find('LABEL').mouseover( function() {
|
||||
$(this).parent().find('LABEL').removeClass('hover');
|
||||
$(this).addClass('hover');
|
||||
}).mouseout( function() {
|
||||
$(this).parent().find('LABEL').removeClass('hover');
|
||||
});
|
||||
|
||||
// Keyboard
|
||||
$(select).next('.multiSelect').keydown( function(e) {
|
||||
// Is dropdown visible?
|
||||
if( $(this).next('.multiSelectOptions').is(':visible') ) {
|
||||
// Dropdown is visible
|
||||
// Tab
|
||||
if( e.keyCode == 9 ) {
|
||||
$(this).addClass('focus').trigger('click'); // esc, left, right - hide
|
||||
$(this).focus().next(':input').focus();
|
||||
return true;
|
||||
}
|
||||
|
||||
// ESC, Left, Right
|
||||
if( e.keyCode == 27 || e.keyCode == 37 || e.keyCode == 39 ) {
|
||||
// Hide dropdown
|
||||
$(this).addClass('focus').trigger('click');
|
||||
}
|
||||
// Down
|
||||
if( e.keyCode == 40 ) {
|
||||
if( !$(this).next('.multiSelectOptions').find('LABEL').hasClass('hover') ) {
|
||||
// Default to first item
|
||||
$(this).next('.multiSelectOptions').find('LABEL:first').addClass('hover');
|
||||
} else {
|
||||
// Move down, cycle to top if on bottom
|
||||
$(this).next('.multiSelectOptions').find('LABEL.hover').removeClass('hover').next('LABEL').addClass('hover');
|
||||
if( !$(this).next('.multiSelectOptions').find('LABEL').hasClass('hover') ) {
|
||||
$(this).next('.multiSelectOptions').find('LABEL:first').addClass('hover');
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
// Up
|
||||
if( e.keyCode == 38 ) {
|
||||
if( !$(this).next('.multiSelectOptions').find('LABEL').hasClass('hover') ) {
|
||||
// Default to first item
|
||||
$(this).next('.multiSelectOptions').find('LABEL:first').addClass('hover');
|
||||
} else {
|
||||
// Move up, cycle to bottom if on top
|
||||
$(this).next('.multiSelectOptions').find('LABEL.hover').removeClass('hover').prev('LABEL').addClass('hover');
|
||||
if( !$(this).next('.multiSelectOptions').find('LABEL').hasClass('hover') ) {
|
||||
$(this).next('.multiSelectOptions').find('LABEL:last').addClass('hover');
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
// Enter, Space
|
||||
if( e.keyCode == 13 || e.keyCode == 32 ) {
|
||||
// Select All
|
||||
if( $(this).next('.multiSelectOptions').find('LABEL.hover INPUT:checkbox').hasClass('selectAll') ) {
|
||||
if( $(this).next('.multiSelectOptions').find('LABEL.hover INPUT:checkbox').attr('checked') ) {
|
||||
// Uncheck all
|
||||
$(this).next('.multiSelectOptions').find('INPUT:checkbox').attr('checked', false).parent().removeClass('checked');
|
||||
} else {
|
||||
// Check all
|
||||
$(this).next('.multiSelectOptions').find('INPUT:checkbox').attr('checked', true).parent().addClass('checked');
|
||||
}
|
||||
$(this).next('.multiSelectOptions').multiSelectUpdateSelected(o);
|
||||
if( callback ) callback($(this));
|
||||
return false;
|
||||
}
|
||||
// Other checkboxes
|
||||
if( $(this).next('.multiSelectOptions').find('LABEL.hover INPUT:checkbox').attr('checked') ) {
|
||||
// Uncheck
|
||||
$(this).next('.multiSelectOptions').find('LABEL.hover INPUT:checkbox').attr('checked', false);
|
||||
$(this).next('.multiSelectOptions').multiSelectUpdateSelected(o);
|
||||
$(this).next('.multiSelectOptions').find('LABEL').removeClass('checked').find('INPUT:checked').parent().addClass('checked');
|
||||
// Select all status can't be checked at this point
|
||||
$(this).next('.multiSelectOptions').find('INPUT:checkbox.selectAll').attr('checked', false).parent().removeClass('checked');
|
||||
if( callback ) callback($(this));
|
||||
} else {
|
||||
// Check
|
||||
$(this).next('.multiSelectOptions').find('LABEL.hover INPUT:checkbox').attr('checked', true);
|
||||
$(this).next('.multiSelectOptions').multiSelectUpdateSelected(o);
|
||||
$(this).next('.multiSelectOptions').find('LABEL').removeClass('checked').find('INPUT:checked').parent().addClass('checked');
|
||||
if( callback ) callback($(this));
|
||||
}
|
||||
}
|
||||
return false;
|
||||
} else {
|
||||
// Dropdown is not visible
|
||||
if( e.keyCode == 38 || e.keyCode == 40 || e.keyCode == 13 || e.keyCode == 32 ) { // down, enter, space - show
|
||||
// Show dropdown
|
||||
$(this).removeClass('focus').trigger('click');
|
||||
$(this).next('.multiSelectOptions').find('LABEL:first').addClass('hover');
|
||||
return false;
|
||||
}
|
||||
// Tab key
|
||||
if( e.keyCode == 9 ) {
|
||||
// Shift focus to next INPUT element on page
|
||||
$(this).focus().next(':input').focus();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
// Prevent enter key from submitting form
|
||||
if( e.keyCode == 13 ) return false;
|
||||
});
|
||||
|
||||
// Eliminate the original form element
|
||||
$(select).remove();
|
||||
});
|
||||
|
||||
},
|
||||
|
||||
// Hide the dropdown
|
||||
multiSelectOptionsHide: function() {
|
||||
$(this).removeClass('active').next('.multiSelectOptions').hide();
|
||||
},
|
||||
|
||||
// Show the dropdown
|
||||
multiSelectOptionsShow: function() {
|
||||
// Hide any open option boxes
|
||||
$('.multiSelect').multiSelectOptionsHide();
|
||||
$(this).next('.multiSelectOptions').find('LABEL').removeClass('hover');
|
||||
$(this).addClass('active').next('.multiSelectOptions').show();
|
||||
|
||||
// Position it
|
||||
var offset = $(this).offset();
|
||||
$(this).next('.multiSelectOptions').css({ top: offset.top + $(this).outerHeight() + 'px' });
|
||||
$(this).next('.multiSelectOptions').css({ left: offset.left + 'px' });
|
||||
|
||||
// Disappear on hover out
|
||||
multiSelectCurrent = $(this);
|
||||
var timer = '';
|
||||
$(this).next('.multiSelectOptions').hover( function() {
|
||||
clearTimeout(timer);
|
||||
}, function() {
|
||||
timer = setTimeout('$(multiSelectCurrent).multiSelectOptionsHide(); $(multiSelectCurrent).unbind("hover");', 250);
|
||||
});
|
||||
|
||||
},
|
||||
|
||||
// Update the textbox with the total number of selected items
|
||||
multiSelectUpdateSelected: function(o) {
|
||||
var i = 0, s = '';
|
||||
$(this).find('INPUT:checkbox:checked').not('.selectAll').each( function() {
|
||||
i++;
|
||||
})
|
||||
if( i == 0 ) {
|
||||
$(this).prev('INPUT.multiSelect').val( o.noneSelected );
|
||||
} else {
|
||||
if( o.oneOrMoreSelected == '*' ) {
|
||||
var display = '';
|
||||
$(this).find('INPUT:checkbox:checked').each( function() {
|
||||
if( $(this).parent().text() != o.selectAllText ) display = display + $(this).parent().text() + ', ';
|
||||
});
|
||||
display = display.substr(0, display.length - 2);
|
||||
$(this).prev('INPUT.multiSelect').val( display );
|
||||
} else {
|
||||
$(this).prev('INPUT.multiSelect').val( o.oneOrMoreSelected.replace('%', i) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
})(jQuery);
|
||||
@@ -18,7 +18,7 @@ function ajax(u,s,t) {
|
||||
}
|
||||
if (pcs.length>0){query = pcs.join("&");}
|
||||
}
|
||||
jQuery.ajax({type: "POST", url: u, data: query, success: function(msg) { if(t) { if(t==':eval') eval(msg); else jQuery("#" + t).html(msg); } } });
|
||||
jQuery.ajax({type: "POST", url: u, data: query, success: function(msg) { if(t) { if(t==':eval') eval(msg); else jQuery("#" + t).html(msg); } } });
|
||||
}
|
||||
|
||||
String.prototype.reverse = function () { return this.split('').reverse().join('');};
|
||||
@@ -30,9 +30,9 @@ function web2py_ajax_fields(target) {
|
||||
var date_format = (typeof w2p_ajax_date_format != 'undefined') ? w2p_ajax_date_format : "%Y-%m-%d";
|
||||
var datetime_format = (typeof w2p_ajax_datetime_format != 'undefined') ? w2p_ajax_datetime_format : "%Y-%m-%d %H:%M:%S";
|
||||
jQuery("input.date",target).each(function() {Calendar.setup({inputField:this, ifFormat:date_format, showsTime:false });});
|
||||
jQuery("input.datetime",target).each(function() {Calendar.setup({inputField:this, ifFormat:datetime_format, showsTime: true, timeFormat: "24" });});
|
||||
jQuery("input.datetime",target).each(function() {Calendar.setup({inputField:this, ifFormat:datetime_format, showsTime: true, timeFormat: "24" });});
|
||||
jQuery("input.time",target).each(function(){jQuery(this).timeEntry();});
|
||||
|
||||
|
||||
};
|
||||
|
||||
function web2py_ajax_init(target) {
|
||||
@@ -43,7 +43,7 @@ function web2py_ajax_init(target) {
|
||||
web2py_ajax_fields(target);
|
||||
};
|
||||
|
||||
jQuery(function() {
|
||||
jQuery(function() {
|
||||
var flash = jQuery('.flash');
|
||||
flash.hide();
|
||||
if(flash.html()) flash.slideDown();
|
||||
@@ -68,7 +68,7 @@ function web2py_trap_link(target) {
|
||||
web2py_ajax_page('get',link.attr('href'),[],target);
|
||||
e.preventDefault();
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
function web2py_ajax_page(method,action,data,target) {
|
||||
jQuery.ajax({'type':method,'url':action,'data':data,
|
||||
@@ -77,16 +77,16 @@ function web2py_ajax_page(method,action,data,target) {
|
||||
xhr.setRequestHeader('web2py-component-element',target);},
|
||||
'complete':function(xhr,text){
|
||||
var html=xhr.responseText;
|
||||
var content=xhr.getResponseHeader('web2py-component-content');
|
||||
var content=xhr.getResponseHeader('web2py-component-content');
|
||||
var command=xhr.getResponseHeader('web2py-component-command');
|
||||
var flash=xhr.getResponseHeader('web2py-component-flash');
|
||||
var t = jQuery('#'+target);
|
||||
if(content=='prepend') t.prepend(html);
|
||||
if(content=='prepend') t.prepend(html);
|
||||
else if(content=='append') t.append(html);
|
||||
else if(content!='hide') t.html(html);
|
||||
else if(content!='hide') t.html(html);
|
||||
web2py_trap_form(action,target);
|
||||
web2py_trap_link(target);
|
||||
web2py_ajax_init('#'+target);
|
||||
web2py_ajax_init('#'+target);
|
||||
if(command) eval(command);
|
||||
if(flash) jQuery('.flash').html(flash).slideDown();
|
||||
}
|
||||
@@ -104,3 +104,4 @@ function web2py_comet(url,onmessage,onopen,onclose) {
|
||||
return true; // supported
|
||||
} else return false; // not supported
|
||||
}
|
||||
|
||||
@@ -10,4 +10,4 @@
|
||||
* DD_belatedPNG.fix('.png_bg'); // argument is a CSS selector
|
||||
* DD_belatedPNG.fixPng( someNode ); // argument is an HTMLDomElement
|
||||
**/
|
||||
var DD_belatedPNG={ns:"DD_belatedPNG",imgSize:{},delay:10,nodesFixed:0,createVmlNameSpace:function(){if(document.namespaces&&!document.namespaces[this.ns]){document.namespaces.add(this.ns,"urn:schemas-microsoft-com:vml")}},createVmlStyleSheet:function(){var b,a;b=document.createElement("style");b.setAttribute("media","screen");document.documentElement.firstChild.insertBefore(b,document.documentElement.firstChild.firstChild);if(b.styleSheet){b=b.styleSheet;b.addRule(this.ns+"\\:*","{behavior:url(#default#VML)}");b.addRule(this.ns+"\\:shape","position:absolute;");b.addRule("img."+this.ns+"_sizeFinder","behavior:none; border:none; position:absolute; z-index:-1; top:-10000px; visibility:hidden;");this.screenStyleSheet=b;a=document.createElement("style");a.setAttribute("media","print");document.documentElement.firstChild.insertBefore(a,document.documentElement.firstChild.firstChild);a=a.styleSheet;a.addRule(this.ns+"\\:*","{display: none !important;}");a.addRule("img."+this.ns+"_sizeFinder","{display: none !important;}")}},readPropertyChange:function(){var b,c,a;b=event.srcElement;if(!b.vmlInitiated){return}if(event.propertyName.search("background")!=-1||event.propertyName.search("border")!=-1){DD_belatedPNG.applyVML(b)}if(event.propertyName=="style.display"){c=(b.currentStyle.display=="none")?"none":"block";for(a in b.vml){if(b.vml.hasOwnProperty(a)){b.vml[a].shape.style.display=c}}}if(event.propertyName.search("filter")!=-1){DD_belatedPNG.vmlOpacity(b)}},vmlOpacity:function(b){if(b.currentStyle.filter.search("lpha")!=-1){var a=b.currentStyle.filter;a=parseInt(a.substring(a.lastIndexOf("=")+1,a.lastIndexOf(")")),10)/100;b.vml.color.shape.style.filter=b.currentStyle.filter;b.vml.image.fill.opacity=a}},handlePseudoHover:function(a){setTimeout(function(){DD_belatedPNG.applyVML(a)},1)},fix:function(a){if(this.screenStyleSheet){var c,b;c=a.split(",");for(b=0;b<c.length;b++){this.screenStyleSheet.addRule(c[b],"behavior:expression(DD_belatedPNG.fixPng(this))")}}},applyVML:function(a){a.runtimeStyle.cssText="";this.vmlFill(a);this.vmlOffsets(a);this.vmlOpacity(a);if(a.isImg){this.copyImageBorders(a)}},attachHandlers:function(i){var d,c,g,e,b,f;d=this;c={resize:"vmlOffsets",move:"vmlOffsets"};if(i.nodeName=="A"){e={mouseleave:"handlePseudoHover",mouseenter:"handlePseudoHover",focus:"handlePseudoHover",blur:"handlePseudoHover"};for(b in e){if(e.hasOwnProperty(b)){c[b]=e[b]}}}for(f in c){if(c.hasOwnProperty(f)){g=function(){d[c[f]](i)};i.attachEvent("on"+f,g)}}i.attachEvent("onpropertychange",this.readPropertyChange)},giveLayout:function(a){a.style.zoom=1;if(a.currentStyle.position=="static"){a.style.position="relative"}},copyImageBorders:function(b){var c,a;c={borderStyle:true,borderWidth:true,borderColor:true};for(a in c){if(c.hasOwnProperty(a)){b.vml.color.shape.style[a]=b.currentStyle[a]}}},vmlFill:function(e){if(!e.currentStyle){return}else{var d,f,g,b,a,c;d=e.currentStyle}for(b in e.vml){if(e.vml.hasOwnProperty(b)){e.vml[b].shape.style.zIndex=d.zIndex}}e.runtimeStyle.backgroundColor="";e.runtimeStyle.backgroundImage="";f=true;if(d.backgroundImage!="none"||e.isImg){if(!e.isImg){e.vmlBg=d.backgroundImage;e.vmlBg=e.vmlBg.substr(5,e.vmlBg.lastIndexOf('")')-5)}else{e.vmlBg=e.src}g=this;if(!g.imgSize[e.vmlBg]){a=document.createElement("img");g.imgSize[e.vmlBg]=a;a.className=g.ns+"_sizeFinder";a.runtimeStyle.cssText="behavior:none; position:absolute; left:-10000px; top:-10000px; border:none; margin:0; padding:0;";c=function(){this.width=this.offsetWidth;this.height=this.offsetHeight;g.vmlOffsets(e)};a.attachEvent("onload",c);a.src=e.vmlBg;a.removeAttribute("width");a.removeAttribute("height");document.body.insertBefore(a,document.body.firstChild)}e.vml.image.fill.src=e.vmlBg;f=false}e.vml.image.fill.on=!f;e.vml.image.fill.color="none";e.vml.color.shape.style.backgroundColor=d.backgroundColor;e.runtimeStyle.backgroundImage="none";e.runtimeStyle.backgroundColor="transparent"},vmlOffsets:function(d){var h,n,a,e,g,m,f,l,j,i,k;h=d.currentStyle;n={W:d.clientWidth+1,H:d.clientHeight+1,w:this.imgSize[d.vmlBg].width,h:this.imgSize[d.vmlBg].height,L:d.offsetLeft,T:d.offsetTop,bLW:d.clientLeft,bTW:d.clientTop};a=(n.L+n.bLW==1)?1:0;e=function(b,p,q,c,s,u){b.coordsize=c+","+s;b.coordorigin=u+","+u;b.path="m0,0l"+c+",0l"+c+","+s+"l0,"+s+" xe";b.style.width=c+"px";b.style.height=s+"px";b.style.left=p+"px";b.style.top=q+"px"};e(d.vml.color.shape,(n.L+(d.isImg?0:n.bLW)),(n.T+(d.isImg?0:n.bTW)),(n.W-1),(n.H-1),0);e(d.vml.image.shape,(n.L+n.bLW),(n.T+n.bTW),(n.W),(n.H),1);g={X:0,Y:0};if(d.isImg){g.X=parseInt(h.paddingLeft,10)+1;g.Y=parseInt(h.paddingTop,10)+1}else{for(j in g){if(g.hasOwnProperty(j)){this.figurePercentage(g,n,j,h["backgroundPosition"+j])}}}d.vml.image.fill.position=(g.X/n.W)+","+(g.Y/n.H);m=h.backgroundRepeat;f={T:1,R:n.W+a,B:n.H,L:1+a};l={X:{b1:"L",b2:"R",d:"W"},Y:{b1:"T",b2:"B",d:"H"}};if(m!="repeat"||d.isImg){i={T:(g.Y),R:(g.X+n.w),B:(g.Y+n.h),L:(g.X)};if(m.search("repeat-")!=-1){k=m.split("repeat-")[1].toUpperCase();i[l[Line truncated
|
||||
var DD_belatedPNG={ns:"DD_belatedPNG",imgSize:{},delay:10,nodesFixed:0,createVmlNameSpace:function(){if(document.namespaces&&!document.namespaces[this.ns]){document.namespaces.add(this.ns,"urn:schemas-microsoft-com:vml")}},createVmlStyleSheet:function(){var b,a;b=document.createElement("style");b.setAttribute("media","screen");document.documentElement.firstChild.insertBefore(b,document.documentElement.firstChild.firstChild);if(b.styleSheet){b=b.styleSheet;b.addRule(this.ns+"\\:*","{behavior:url(#default#VML)}");b.addRule(this.ns+"\\:shape","position:absolute;");b.addRule("img."+this.ns+"_sizeFinder","behavior:none; border:none; position:absolute; z-index:-1; top:-10000px; visibility:hidden;");this.screenStyleSheet=b;a=document.createElement("style");a.setAttribute("media","print");document.documentElement.firstChild.insertBefore(a,document.documentElement.firstChild.firstChild);a=a.styleSheet;a.addRule(this.ns+"\\:*","{display: none !important;}");a.addRule("img."+this.ns+"_sizeFinder","{display: none !important;}")}},readPropertyChange:function(){var b,c,a;b=event.srcElement;if(!b.vmlInitiated){return}if(event.propertyName.search("background")!=-1||event.propertyName.search("border")!=-1){DD_belatedPNG.applyVML(b)}if(event.propertyName=="style.display"){c=(b.currentStyle.display=="none")?"none":"block";for(a in b.vml){if(b.vml.hasOwnProperty(a)){b.vml[a].shape.style.display=c}}}if(event.propertyName.search("filter")!=-1){DD_belatedPNG.vmlOpacity(b)}},vmlOpacity:function(b){if(b.currentStyle.filter.search("lpha")!=-1){var a=b.currentStyle.filter;a=parseInt(a.substring(a.lastIndexOf("=")+1,a.lastIndexOf(")")),10)/100;b.vml.color.shape.style.filter=b.currentStyle.filter;b.vml.image.fill.opacity=a}},handlePseudoHover:function(a){setTimeout(function(){DD_belatedPNG.applyVML(a)},1)},fix:function(a){if(this.screenStyleSheet){var c,b;c=a.split(",");for(b=0;b<c.length;b++){this.screenStyleSheet.addRule(c[b],"behavior:expression(DD_belatedPNG.fixPng(this))")}}},applyVML:function(a){a.runtimeStyle.cssText="";this.vmlFill(a);this.vmlOffsets(a);this.vmlOpacity(a);if(a.isImg){this.copyImageBorders(a)}},attachHandlers:function(i){var d,c,g,e,b,f;d=this;c={resize:"vmlOffsets",move:"vmlOffsets"};if(i.nodeName=="A"){e={mouseleave:"handlePseudoHover",mouseenter:"handlePseudoHover",focus:"handlePseudoHover",blur:"handlePseudoHover"};for(b in e){if(e.hasOwnProperty(b)){c[b]=e[b]}}}for(f in c){if(c.hasOwnProperty(f)){g=function(){d[c[f]](i)};i.attachEvent("on"+f,g)}}i.attachEvent("onpropertychange",this.readPropertyChange)},giveLayout:function(a){a.style.zoom=1;if(a.currentStyle.position=="static"){a.style.position="relative"}},copyImageBorders:function(b){var c,a;c={borderStyle:true,borderWidth:true,borderColor:true};for(a in c){if(c.hasOwnProperty(a)){b.vml.color.shape.style[a]=b.currentStyle[a]}}},vmlFill:function(e){if(!e.currentStyle){return}else{var d,f,g,b,a,c;d=e.currentStyle}for(b in e.vml){if(e.vml.hasOwnProperty(b)){e.vml[b].shape.style.zIndex=d.zIndex}}e.runtimeStyle.backgroundColor="";e.runtimeStyle.backgroundImage="";f=true;if(d.backgroundImage!="none"||e.isImg){if(!e.isImg){e.vmlBg=d.backgroundImage;e.vmlBg=e.vmlBg.substr(5,e.vmlBg.lastIndexOf('")')-5)}else{e.vmlBg=e.src}g=this;if(!g.imgSize[e.vmlBg]){a=document.createElement("img");g.imgSize[e.vmlBg]=a;a.className=g.ns+"_sizeFinder";a.runtimeStyle.cssText="behavior:none; position:absolute; left:-10000px; top:-10000px; border:none; margin:0; padding:0;";c=function(){this.width=this.offsetWidth;this.height=this.offsetHeight;g.vmlOffsets(e)};a.attachEvent("onload",c);a.src=e.vmlBg;a.removeAttribute("width");a.removeAttribute("height");document.body.insertBefore(a,document.body.firstChild)}e.vml.image.fill.src=e.vmlBg;f=false}e.vml.image.fill.on=!f;e.vml.image.fill.color="none";e.vml.color.shape.style.backgroundColor=d.backgroundColor;e.runtimeStyle.backgroundImage="none";e.runtimeStyle.backgroundColor="transparent"},vmlOffsets:function(d){var h,n,a,e,g,m,f,l,j,i,k;h=d.currentStyle;n={W:d.clientWidth+1,H:d.clientHeight+1,w:this.imgSize[d.vmlBg].width,h:this.imgSize[d.vmlBg].height,L:d.offsetLeft,T:d.offsetTop,bLW:d.clientLeft,bTW:d.clientTop};a=(n.L+n.bLW==1)?1:0;e=function(b,p,q,c,s,u){b.coordsize=c+","+s;b.coordorigin=u+","+u;b.path="m0,0l"+c+",0l"+c+","+s+"l0,"+s+" xe";b.style.width=c+"px";b.style.height=s+"px";b.style.left=p+"px";b.style.top=q+"px"};e(d.vml.color.shape,(n.L+(d.isImg?0:n.bLW)),(n.T+(d.isImg?0:n.bTW)),(n.W-1),(n.H-1),0);e(d.vml.image.shape,(n.L+n.bLW),(n.T+n.bTW),(n.W),(n.H),1);g={X:0,Y:0};if(d.isImg){g.X=parseInt(h.paddingLeft,10)+1;g.Y=parseInt(h.paddingTop,10)+1}else{for(j in g){if(g.hasOwnProperty(j)){this.figurePercentage(g,n,j,h["backgroundPosition"+j])}}}d.vml.image.fill.position=(g.X/n.W)+","+(g.Y/n.H);m=h.backgroundRepeat;f={T:1,R:n.W+a,B:n.H,L:1+a};l={X:{b1:"L",b2:"R",d:"W"},Y:{b1:"T",b2:"B",d:"H"}};if(m!="repeat"||d.isImg){i={T:(g.Y),R:(g.X+n.w),B:(g.Y+n.h),L:(g.X)};if(m.search("repeat-")!=-1){k=m.split("repeat-")[1].toUpperCase();i[l[Line truncated
|
||||
@@ -1,2 +1,2 @@
|
||||
/*! jQuery Mobile v1.0 jquerymobile.com | jquery.org/license */
|
||||
.ui-bar-a{border:1px solid #2a2a2a;background:#111;color:#fff;font-weight:bold;text-shadow:0 -1px 1px #000;background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#111));background-image:-webkit-linear-gradient(#3c3c3c,#111);background-image:-moz-linear-gradient(#3c3c3c,#111);background-image:-ms-linear-gradient(#3c3c3c,#111);background-image:-o-linear-gradient(#3c3c3c,#111);background-image:linear-gradient(#3c3c3c,#111)}.ui-bar-a,.ui-bar-a input,.ui-bar-a select,.ui-bar-a textarea,.ui-bar-a button{font-family:Helvetica,Arial,sans-serif}.ui-bar-a .ui-link-inherit{color:#fff}.ui-bar-a .ui-link{color:#7cc4e7;font-weight:bold}.ui-bar-a .ui-link:hover{color:#2489ce}.ui-bar-a .ui-link:active{color:#2489ce}.ui-bar-a .ui-link:visited{color:#2489ce}.ui-body-a,.ui-dialog.ui-overlay-a{border:1px solid #2a2a2a;background:#222;color:#fff;text-shadow:0 1px 0 #000;font-weight:normal;background-image:-webkit-gradient(linear,left top,left bottom,from(#666),to(#222));background-image:-webkit-linear-gradient(#666,#222);background-image:-moz-linear-gradient(#666,#222);background-image:-ms-linear-gradient(#666,#222);background-image:-o-linear-gradient(#666,#222);background-image:linear-gradient(#666,#222)}.ui-body-a,.ui-body-a input,.ui-body-a select,.ui-body-a textarea,.ui-body-a button{font-family:Helvetica,Arial,sans-serif}.ui-body-a .ui-link-inherit{color:#fff}.ui-body-a .ui-link{color:#2489ce;font-weight:bold}.ui-body-a .ui-link:hover{color:#2489ce}.ui-body-a .ui-link:active{color:#2489ce}.ui-body-a .ui-link:visited{color:#2489ce}.ui-btn-up-a{border:1px solid #222;background:#333;font-weight:bold;color:#fff;text-shadow:0 -1px 1px #000;background-image:-webkit-gradient(linear,left top,left bottom,from(#555),to(#333));background-image:-webkit-linear-gradient(#555,#333);background-image:-moz-linear-gradient(#555,#333);background-image:-ms-linear-gradient(#555,#333);background-image:-o-linear-gradient(#555,#333);background-image:linear-gradient(#555,#333)}.ui-btn-up-a a.ui-link-inherit{color:#fff}.ui-btn-hover-a{border:1px solid #000;background:#444;font-weight:bold;color:#fff;text-shadow:0 -1px 1px #000;background-image:-webkit-gradient(linear,left top,left bottom,from(#666),to(#444));background-image:-webkit-linear-gradient(#666,#444);background-image:-moz-linear-gradient(#666,#444);background-image:-ms-linear-gradient(#666,#444);background-image:-o-linear-gradient(#666,#444);background-image:linear-gradient(#666,#444)}.ui-btn-hover-a a.ui-link-inherit{color:#fff}.ui-btn-down-a{border:1px solid #000;background:#3d3d3d;font-weight:bold;color:#fff;text-shadow:0 -1px 1px #000;background-image:-webkit-gradient(linear,left top,left bottom,from(#333),to(#5a5a5a));background-image:-webkit-linear-gradient(#333,#5a5a5a);background-image:-moz-linear-gradient(#333,#5a5a5a);background-image:-ms-linear-gradient(#333,#5a5a5a);background-image:-o-linear-gradient(#333,#5a5a5a);background-image:linear-gradient(#333,#5a5a5a)}.ui-btn-down-a a.ui-link-inherit{color:#fff}.ui-btn-up-a,.ui-btn-hover-a,.ui-btn-down-a{font-family:Helvetica,Arial,sans-serif;text-decoration:none}.ui-bar-b{border:1px solid #456f9a;background:#5e87b0;color:#fff;font-weight:bold;text-shadow:0 -1px 1px #254f7a;background-image:-webkit-gradient(linear,left top,left bottom,from(#81a8ce),to(#5e87b0));background-image:-webkit-linear-gradient(#81a8ce,#5e87b0);background-image:-moz-linear-gradient(#81a8ce,#5e87b0);background-image:-ms-linear-gradient(#81a8ce,#5e87b0);background-image:-o-linear-gradient(#81a8ce,#5e87b0);background-image:linear-gradient(#81a8ce,#5e87b0)}.ui-bar-b,.ui-bar-b input,.ui-bar-b select,.ui-bar-b textarea,.ui-bar-b button{font-family:Helvetica,Arial,sans-serif}.ui-bar-b .ui-link-inherit{color:#fff}.ui-bar-b .ui-link{color:#ddf0f8;font-weight:bold}.ui-bar-b .ui-link:hover{color:#ddf0f8}.ui-bar-b .ui-link:active{color:#ddf0f8}.ui-bar-b .ui-link:visited{color:#ddf0f8}.ui-body-b,.ui-dialog.ui-overlay-b{border:1px solid #c6c6c6;background:#ccc;color:#333;text-shadow:0 1px 0 #fff;font-weight:normal;background-image:-webkit-gradient(linear,left top,left bottom,from(#e6e6e6),to(#ccc));background-image:-webkit-linear-gradient(#e6e6e6,#ccc);background-image:-moz-linear-gradient(#e6e6e6,#ccc);background-image:-ms-linear-gradient(#e6e6e6,#ccc);background-image:-o-linear-gradient(#e6e6e6,#ccc);background-image:linear-gradient(#e6e6e6,#ccc)}.ui-body-b,.ui-body-b input,.ui-body-b select,.ui-body-b textarea,.ui-body-b button{font-family:Helvetica,Arial,sans-serif}.ui-body-b .ui-link-inherit{color:#333}.ui-body-b .ui-link{color:#2489ce;font-weight:bold}.ui-body-b .ui-link:hover{color:#2489ce}.ui-body-b .ui-link:active{color:#2489ce}.ui-body-b .ui-link:visited{color:#2489ce}.ui-btn-up-b{border:1px solid #145072;background:#2567ab;font-weight:bold;color:#fff;text-shadow:0 -1px 1px #145072;background-image:-webkit-gradient(linear,left top,left bottom,from(#5f9cc5),to(#396b9e));background-image:-webkit-linear-gradient(#5f9cc5,#396b9e);background-imagLine truncated
|
||||
.ui-bar-a{border:1px solid #2a2a2a;background:#111;color:#fff;font-weight:bold;text-shadow:0 -1px 1px #000;background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#111));background-image:-webkit-linear-gradient(#3c3c3c,#111);background-image:-moz-linear-gradient(#3c3c3c,#111);background-image:-ms-linear-gradient(#3c3c3c,#111);background-image:-o-linear-gradient(#3c3c3c,#111);background-image:linear-gradient(#3c3c3c,#111)}.ui-bar-a,.ui-bar-a input,.ui-bar-a select,.ui-bar-a textarea,.ui-bar-a button{font-family:Helvetica,Arial,sans-serif}.ui-bar-a .ui-link-inherit{color:#fff}.ui-bar-a .ui-link{color:#7cc4e7;font-weight:bold}.ui-bar-a .ui-link:hover{color:#2489ce}.ui-bar-a .ui-link:active{color:#2489ce}.ui-bar-a .ui-link:visited{color:#2489ce}.ui-body-a,.ui-dialog.ui-overlay-a{border:1px solid #2a2a2a;background:#222;color:#fff;text-shadow:0 1px 0 #000;font-weight:normal;background-image:-webkit-gradient(linear,left top,left bottom,from(#666),to(#222));background-image:-webkit-linear-gradient(#666,#222);background-image:-moz-linear-gradient(#666,#222);background-image:-ms-linear-gradient(#666,#222);background-image:-o-linear-gradient(#666,#222);background-image:linear-gradient(#666,#222)}.ui-body-a,.ui-body-a input,.ui-body-a select,.ui-body-a textarea,.ui-body-a button{font-family:Helvetica,Arial,sans-serif}.ui-body-a .ui-link-inherit{color:#fff}.ui-body-a .ui-link{color:#2489ce;font-weight:bold}.ui-body-a .ui-link:hover{color:#2489ce}.ui-body-a .ui-link:active{color:#2489ce}.ui-body-a .ui-link:visited{color:#2489ce}.ui-btn-up-a{border:1px solid #222;background:#333;font-weight:bold;color:#fff;text-shadow:0 -1px 1px #000;background-image:-webkit-gradient(linear,left top,left bottom,from(#555),to(#333));background-image:-webkit-linear-gradient(#555,#333);background-image:-moz-linear-gradient(#555,#333);background-image:-ms-linear-gradient(#555,#333);background-image:-o-linear-gradient(#555,#333);background-image:linear-gradient(#555,#333)}.ui-btn-up-a a.ui-link-inherit{color:#fff}.ui-btn-hover-a{border:1px solid #000;background:#444;font-weight:bold;color:#fff;text-shadow:0 -1px 1px #000;background-image:-webkit-gradient(linear,left top,left bottom,from(#666),to(#444));background-image:-webkit-linear-gradient(#666,#444);background-image:-moz-linear-gradient(#666,#444);background-image:-ms-linear-gradient(#666,#444);background-image:-o-linear-gradient(#666,#444);background-image:linear-gradient(#666,#444)}.ui-btn-hover-a a.ui-link-inherit{color:#fff}.ui-btn-down-a{border:1px solid #000;background:#3d3d3d;font-weight:bold;color:#fff;text-shadow:0 -1px 1px #000;background-image:-webkit-gradient(linear,left top,left bottom,from(#333),to(#5a5a5a));background-image:-webkit-linear-gradient(#333,#5a5a5a);background-image:-moz-linear-gradient(#333,#5a5a5a);background-image:-ms-linear-gradient(#333,#5a5a5a);background-image:-o-linear-gradient(#333,#5a5a5a);background-image:linear-gradient(#333,#5a5a5a)}.ui-btn-down-a a.ui-link-inherit{color:#fff}.ui-btn-up-a,.ui-btn-hover-a,.ui-btn-down-a{font-family:Helvetica,Arial,sans-serif;text-decoration:none}.ui-bar-b{border:1px solid #456f9a;background:#5e87b0;color:#fff;font-weight:bold;text-shadow:0 -1px 1px #254f7a;background-image:-webkit-gradient(linear,left top,left bottom,from(#81a8ce),to(#5e87b0));background-image:-webkit-linear-gradient(#81a8ce,#5e87b0);background-image:-moz-linear-gradient(#81a8ce,#5e87b0);background-image:-ms-linear-gradient(#81a8ce,#5e87b0);background-image:-o-linear-gradient(#81a8ce,#5e87b0);background-image:linear-gradient(#81a8ce,#5e87b0)}.ui-bar-b,.ui-bar-b input,.ui-bar-b select,.ui-bar-b textarea,.ui-bar-b button{font-family:Helvetica,Arial,sans-serif}.ui-bar-b .ui-link-inherit{color:#fff}.ui-bar-b .ui-link{color:#ddf0f8;font-weight:bold}.ui-bar-b .ui-link:hover{color:#ddf0f8}.ui-bar-b .ui-link:active{color:#ddf0f8}.ui-bar-b .ui-link:visited{color:#ddf0f8}.ui-body-b,.ui-dialog.ui-overlay-b{border:1px solid #c6c6c6;background:#ccc;color:#333;text-shadow:0 1px 0 #fff;font-weight:normal;background-image:-webkit-gradient(linear,left top,left bottom,from(#e6e6e6),to(#ccc));background-image:-webkit-linear-gradient(#e6e6e6,#ccc);background-image:-moz-linear-gradient(#e6e6e6,#ccc);background-image:-ms-linear-gradient(#e6e6e6,#ccc);background-image:-o-linear-gradient(#e6e6e6,#ccc);background-image:linear-gradient(#e6e6e6,#ccc)}.ui-body-b,.ui-body-b input,.ui-body-b select,.ui-body-b textarea,.ui-body-b button{font-family:Helvetica,Arial,sans-serif}.ui-body-b .ui-link-inherit{color:#333}.ui-body-b .ui-link{color:#2489ce;font-weight:bold}.ui-body-b .ui-link:hover{color:#2489ce}.ui-body-b .ui-link:active{color:#2489ce}.ui-body-b .ui-link:visited{color:#2489ce}.ui-btn-up-b{border:1px solid #145072;background:#2567ab;font-weight:bold;color:#fff;text-shadow:0 -1px 1px #145072;background-image:-webkit-gradient(linear,left top,left bottom,from(#5f9cc5),to(#396b9e));background-image:-webkit-linear-gradient(#5f9cc5,#396b9e);background-imagLine truncated
|
||||
@@ -170,3 +170,4 @@ b.find(".ui-footer:jqmData(position='fixed')").addClass("ui-footer-fixed ui-fixe
|
||||
a.extend(a.mobile,{showPageLoadingMsg:function(){if(a.mobile.loadingMessage){var b=a("."+a.mobile.activeBtnClass).first();c.find("h1").text(a.mobile.loadingMessage).end().appendTo(a.mobile.pageContainer).css({top:a.support.scrollTop&&f.scrollTop()+f.height()/2||b.length&&b.offset().top||100})}d.addClass("ui-loading")},hidePageLoadingMsg:function(){d.removeClass("ui-loading")},initializePage:function(){var b=a(":jqmData(role='page')");b.length||(b=a("body").wrapInner("<div data-"+a.mobile.ns+"role='page'></div>").children(0));
|
||||
b.add(":jqmData(role='dialog')").each(function(){var b=a(this);b.jqmData("url")||b.attr("data-"+a.mobile.ns+"url",b.attr("id")||location.pathname+location.search)});a.mobile.firstPage=b.first();a.mobile.pageContainer=b.first().parent().addClass("ui-mobile-viewport");f.trigger("pagecontainercreate");a.mobile.showPageLoadingMsg();!a.mobile.hashListeningEnabled||!a.mobile.path.stripHash(location.hash)?a.mobile.changePage(a.mobile.firstPage,{transition:"none",reverse:true,changeHash:false,fromHashChange:true}):
|
||||
f.trigger("hashchange",[true])}});a.support.touchOverflow&&a.mobile.touchOverflowEnabled&&!a.mobile.touchOverflowZoomEnabled&&b();a.mobile._registerInternalEvents();a(function(){e.scrollTo(0,1);a.mobile.defaultHomeScroll=!a.support.scrollTop||a(e).scrollTop()===1?0:1;a.mobile.autoInitializePage&&a.mobile.initializePage();f.load(a.mobile.silentScroll)})}})(jQuery,this);
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
/* Copyright (c) 2007 Paul Bakaus (paul.bakaus@googlemail.com) and Brandon Aaron (brandon.aaron@gmail.com || http://brandonaaron.net)
|
||||
* Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
|
||||
* and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
|
||||
*
|
||||
* $LastChangedDate: 2007-12-20 08:43:48 -0600 (Thu, 20 Dec 2007) $
|
||||
* $Rev: 4257 $
|
||||
*
|
||||
* Version: 1.2
|
||||
*
|
||||
* Requires: jQuery 1.2+
|
||||
*/
|
||||
eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('(5($){$.19={P:\'1.2\'};$.u([\'j\',\'w\'],5(i,d){$.q[\'O\'+d]=5(){p(!3[0])6;g a=d==\'j\'?\'s\':\'m\',e=d==\'j\'?\'D\':\'C\';6 3.B(\':y\')?3[0][\'L\'+d]:4(3,d.x())+4(3,\'n\'+a)+4(3,\'n\'+e)};$.q[\'I\'+d]=5(b){p(!3[0])6;g c=d==\'j\'?\'s\':\'m\',e=d==\'j\'?\'D\':\'C\';b=$.F({t:Z},b||{});g a=3.B(\':y\')?3[0][\'8\'+d]:4(3,d.x())+4(3,\'E\'+c+\'w\')+4(3,\'E\'+e+\'w\')+4(3,\'n\'+c)+4(3,\'n\'+e);6 a+(b.t?(4(3,\'t\'+c)+4(3,\'t\'+e)):0)}});$.u([\'m\',\'s\'],5(i,b){$.q[\'l\'+b]=5(a){p(!3[0])6;6 a!=W?3.u(5(){3==h||3==r?h.V(b==\'m\'?a:$(h)[\'U\'](),b==\'s\'?a:$(h)[\'T\']()):3[\'l\'+b]=a}):3[0]==h||3[0]==r?S[(b==\'m\'?\'R\':\'Q\')]||$.N&&r.M[\'l\'+b]||r.A[\'l\'+b]:3[0][\'l\'+b]}});$.q.F({z:5(){g a=0,f=0,o=3[0],8,9,7,v;p(o){7=3.7();8=3.8();9=7.8();8.f-=4(o,\'K\');8.k-=4(o,\'J\');9.f+=4(7,\'H\');9.k+=4(7,\'Y\');v={f:8.f-9.f,k:8.k-9.k}}6 v},7:5(){g a=3[0].7;G(a&&(!/^A|10$/i.16(a.15)&&$.14(a,\'z\')==\'13\'))a=a.7;6 $(a)}});5 4(a,b){6 12($.11(a.17?a[0]:a,b,18))||0}})(X);',62,72,'|||this|num|function|return|offsetParent|offset|parentOffset|||||borr|top|var|window||Height|left|scroll|Left|padding|elem|if|fn|document|Top|margin|each|results|Width|toLowerCase|visible|position|body|is|Right|Bottom|border|extend|while|borderTopWidth|outer|marginLeft|marginTop|client|documentElement|boxModel|inner|version|pageYOffset|pageXOffset|self|scrollTop|scrollLeft|scrollTo|undefined|jQuery|borderLeftWidth|false|html|curCSS|parseInt|static|css|tagName|test|jquery|true|dimensions'.split('|'),0,{}))
|
||||
/* Copyright (c) 2007 Paul Bakaus (paul.bakaus@googlemail.com) and Brandon Aaron (brandon.aaron@gmail.com || http://brandonaaron.net)
|
||||
* Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
|
||||
* and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
|
||||
*
|
||||
* $LastChangedDate: 2007-12-20 08:43:48 -0600 (Thu, 20 Dec 2007) $
|
||||
* $Rev: 4257 $
|
||||
*
|
||||
* Version: 1.2
|
||||
*
|
||||
* Requires: jQuery 1.2+
|
||||
*/
|
||||
eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('(5($){$.19={P:\'1.2\'};$.u([\'j\',\'w\'],5(i,d){$.q[\'O\'+d]=5(){p(!3[0])6;g a=d==\'j\'?\'s\':\'m\',e=d==\'j\'?\'D\':\'C\';6 3.B(\':y\')?3[0][\'L\'+d]:4(3,d.x())+4(3,\'n\'+a)+4(3,\'n\'+e)};$.q[\'I\'+d]=5(b){p(!3[0])6;g c=d==\'j\'?\'s\':\'m\',e=d==\'j\'?\'D\':\'C\';b=$.F({t:Z},b||{});g a=3.B(\':y\')?3[0][\'8\'+d]:4(3,d.x())+4(3,\'E\'+c+\'w\')+4(3,\'E\'+e+\'w\')+4(3,\'n\'+c)+4(3,\'n\'+e);6 a+(b.t?(4(3,\'t\'+c)+4(3,\'t\'+e)):0)}});$.u([\'m\',\'s\'],5(i,b){$.q[\'l\'+b]=5(a){p(!3[0])6;6 a!=W?3.u(5(){3==h||3==r?h.V(b==\'m\'?a:$(h)[\'U\'](),b==\'s\'?a:$(h)[\'T\']()):3[\'l\'+b]=a}):3[0]==h||3[0]==r?S[(b==\'m\'?\'R\':\'Q\')]||$.N&&r.M[\'l\'+b]||r.A[\'l\'+b]:3[0][\'l\'+b]}});$.q.F({z:5(){g a=0,f=0,o=3[0],8,9,7,v;p(o){7=3.7();8=3.8();9=7.8();8.f-=4(o,\'K\');8.k-=4(o,\'J\');9.f+=4(7,\'H\');9.k+=4(7,\'Y\');v={f:8.f-9.f,k:8.k-9.k}}6 v},7:5(){g a=3[0].7;G(a&&(!/^A|10$/i.16(a.15)&&$.14(a,\'z\')==\'13\'))a=a.7;6 $(a)}});5 4(a,b){6 12($.11(a.17?a[0]:a,b,18))||0}})(X);',62,72,'|||this|num|function|return|offsetParent|offset|parentOffset|||||borr|top|var|window||Height|left|scroll|Left|padding|elem|if|fn|document|Top|margin|each|results|Width|toLowerCase|visible|position|body|is|Right|Bottom|border|extend|while|borderTopWidth|outer|marginLeft|marginTop|client|documentElement|boxModel|inner|version|pageYOffset|pageXOffset|self|scrollTop|scrollLeft|scrollTo|undefined|jQuery|borderLeftWidth|false|html|curCSS|parseInt|static|css|tagName|test|jquery|true|dimensions'.split('|'),0,{}))
|
||||
@@ -23,3 +23,4 @@
|
||||
|
||||
/* shadow effect */
|
||||
.ui-multiselect-shadow { box-shadow:0 0 10px #777; -moz-box-shadow:0 0 10px #777; -webkit-box-shadow:0 0 10px #777; -ms-filter: "progid:DXImageTransform.Microsoft.Glow(color=#666666,strength=3) progid:DXImageTransform.Microsoft.Shadow(color=#777777,direction=135,strength=3)"; filter: progid:DXImageTransform.Microsoft.Glow(color=#666666,strength=3) progid:DXImageTransform.Microsoft.Shadow(color=#777777,direction=135,strength=3); }
|
||||
|
||||
@@ -1,24 +1,25 @@
|
||||
/*
|
||||
* jQuery MultiSelect Plugin 0.6
|
||||
* Copyright (c) 2010 Eric Hynds
|
||||
*
|
||||
* http://www.erichynds.com/jquery/jquery-multiselect-plugin-with-themeroller-support/
|
||||
* Inspired by Cory S.N. LaViska's implementation, A Beautiful Site (http://abeautifulsite.net/) 2009
|
||||
*
|
||||
* Dual licensed under the MIT and GPL licenses:
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
* http://www.gnu.org/licenses/gpl.html
|
||||
*/
|
||||
(function(f){f.fn.multiSelect=function(i){i=f.extend({},f.fn.multiSelect.defaults,i);return this.each(function(){return new w(this,i)})};var x=0,w=function(i,a){var g=$original=f(i),e,l,k,h=[],s=[];l=g.is(":disabled");var t=i.id||"ui-multiselect-"+x++;h.push('<a id="'+t+'" class="ui-multiselect ui-widget ui-state-default ui-corner-all'+(l||a.disabled?" ui-state-disabled":"")+'">');h.push('<input readonly="readonly" type="text" class="ui-state-default" value="'+a.noneSelectedText+'" title="'+i.title+
|
||||
'" /><span class="ui-icon ui-icon-triangle-1-s"></span></a>');h.push('<div class="ui-multiselect-options'+(a.shadow?" ui-multiselect-shadow":"")+' ui-widget ui-widget-content ui-corner-all">');if(a.showHeader){h.push('<div class="ui-widget-header ui-helper-clearfix ui-corner-all ui-multiselect-header">');h.push('<ul class="ui-helper-reset">');h.push('<li><a class="ui-multiselect-all" href=""><span class="ui-icon ui-icon-check"></span>'+a.checkAllText+"</a></li>");h.push('<li><a class="ui-multiselect-none" href=""><span class="ui-icon ui-icon-closethick"></span>'+
|
||||
a.unCheckAllText+"</a></li>");h.push('<li class="ui-multiselect-close"><a href="" class="ui-multiselect-close ui-icon ui-icon-circle-close"></a></li>');h.push("</ul>");h.push("</div>")}h.push('<ul class="ui-multiselect-checkboxes ui-helper-reset">');l&&g.removeAttr("disabled");g.find("option").each(function(b){var c=f(this),d=c.html(),m=this.value;b=this.id||"ui-multiselect-"+t+"-option-"+b;var j=c.parent(),n=j.is("optgroup"),o=c.is(":disabled"),u=["ui-corner-all"];if(n){j=j.attr("label");if(f.inArray(j,
|
||||
s)===-1){h.push('<li class="ui-multiselect-optgroup-label"><a href="#">'+j+"</a></li>");s.push(j)}}if(m.length>0){o&&u.push("ui-state-disabled");h.push('<li class="'+(o?"ui-multiselect-disabled":"")+'">');h.push('<label for="'+b+'" class="'+u.join(" ")+'"><input id="'+b+'" type="'+(a.multiple?"checkbox":"radio")+'" name="'+i.name+'" value="'+m+'" title="'+d+'"');c.is(":selected")&&h.push(' checked="checked"');o&&h.push(' disabled="disabled"');h.push(" />"+d+"</label></li>")}});h.push("</ul></div>");
|
||||
g=g.after(h.join("")).next("a.ui-multiselect");e=g.next("div.ui-multiselect-options");l=e.find("div.ui-multiselect-header");k=e.find("label").not(".ui-state-disabled");var v=g.find("span.ui-icon").outerWidth(),p=$original.outerWidth(),q=p+v;if(/\d/.test(a.minWidth)&&q<a.minWidth){p=a.minWidth-v;q=a.minWidth}g.width(q).find("input").width(p);a.showHeader&&l.find("a").click(function(b){var c=f(this);if(c.hasClass("ui-multiselect-close"))e.trigger("close");else{c=c.hasClass("ui-multiselect-all");e.trigger("toggleChecked",
|
||||
[c?true:false]);a[c?"onCheckAll":"onUncheckAll"].call(this)}b.preventDefault()});var r=function(){var b=k.find("input"),c=b.filter(":checked"),d="";d=c.length;d=d===0?a.noneSelectedText:f.isFunction(a.selectedText)?a.selectedText.call(this,d,b.length,c.get()):/\d/.test(a.selectedList)&&a.selectedList>0&&d<=a.selectedList?c.map(function(){return this.title}).get().join(", "):a.selectedText.replace("#",d).replace("#",b.length);g.find("input").val(d);return d};g.bind({click:function(){e.trigger("toggle")},
|
||||
keypress:function(b){switch(b.keyCode){case 27:case 38:e.trigger("close");break;case 40:case 0:e.trigger("toggle");break}},mouseenter:function(){g.hasClass("ui-state-disabled")||f(this).addClass("ui-state-hover")},mouseleave:function(){f(this).removeClass("ui-state-hover")},focus:function(){g.hasClass("ui-state-disabled")||f(this).addClass("ui-state-focus")},blur:function(){f(this).removeClass("ui-state-focus")}});e.bind({close:function(b,c){c=c||false;if(c===true)f("div.ui-multiselect-options").filter(":visible").fadeOut(a.fadeSpeed).prev("a.ui-multiselect").removeClass("ui-state-active").trigger("mouseout");
|
||||
else{g.removeClass("ui-state-active").trigger("mouseout");e.fadeOut(a.fadeSpeed)}},open:function(b,c){if(!g.hasClass("ui-state-disabled")){var d=g.position(),m=e.find("ul:last"),j,n;g.addClass("ui-state-active");if(c||typeof c==="undefined")e.trigger("close",[true]);j=a.position==="middle"?d.top+g.height()/2-e.outerHeight()/2:a.position==="top"?d.top-e.outerHeight():d.top+g.outerHeight();n=g.width()-parseInt(e.css("padding-left"),10)-parseInt(e.css("padding-right"),10);k.filter("label:first").trigger("mouseenter").trigger("focus");
|
||||
e.css({position:"absolute",top:j+"px",left:d.left+"px",width:n+"px"}).show();m.scrollTop(0);a.maxHeight&&m.css("height",a.maxHeight);a.onOpen.call(e[0])}},toggle:function(){e.trigger(f(this).is(":hidden")?"open":"close")},traverse:function(b,c,d){b=f(c);d=d===38||d===37?true:false;b=b.parent()[d?"prevAll":"nextAll"]("li:not(.ui-multiselect-disabled, .ui-multiselect-optgroup-label)")[d?"last":"first"]();if(b.length)b.find("label").trigger("mouseenter");else{b=e.find("ul:last");e.find("label")[d?"last":
|
||||
"first"]().trigger("mouseover");b.scrollTop(d?b.height():0)}},toggleChecked:function(b,c,d){(d&&d.length?d:k.find("input")).not(":disabled").attr("checked",c?"checked":"");r()}}).find("li.ui-multiselect-optgroup-label a").click(function(b){var c=f(this).parent().nextUntil("li.ui-multiselect-optgroup-label").find("input");e.trigger("toggleChecked",[c.filter(":checked").length===c.length?false:true,c]);a.onOptgroupToggle.call(this,c.get());b.preventDefault()});k.bind({mouseenter:function(){k.removeClass("ui-state-hover");
|
||||
f(this).addClass("ui-state-hover").find("input").focus()},keyup:function(b){switch(b.keyCode){case 27:e.trigger("close");break;case 38:case 40:case 37:case 39:e.trigger("traverse",[this,b.keyCode]);break;case 13:b.preventDefault();f(this).click();break}}}).find("input").bind("click",function(){a.onCheck.call(this);r()});$original.remove();f.fn.bgiframe&&e.bgiframe();a.state==="open"&&e.trigger("open",[false]);g.find("input")[0].defaultValue=r();return g};f(document).bind("click",function(i){i=f(i.target);
|
||||
!i.closest("div.ui-multiselect-options").length&&!i.parent().hasClass("ui-multiselect")&&f("div.ui-multiselect-options").trigger("close",[true])});f.fn.multiSelect.defaults={showHeader:true,maxHeight:175,minWidth:215,checkAllText:"Check all",unCheckAllText:"Uncheck all",noneSelectedText:"Select options",selectedText:"# selected",selectedList:0,position:"bottom",shadow:false,fadeSpeed:200,disabled:false,state:"closed",multiple:true,onCheck:function(){},onOpen:function(){},onCheckAll:function(){},onUncheckAll:function(){},
|
||||
onOptgroupToggle:function(){}}})(jQuery);
|
||||
/*
|
||||
* jQuery MultiSelect Plugin 0.6
|
||||
* Copyright (c) 2010 Eric Hynds
|
||||
*
|
||||
* http://www.erichynds.com/jquery/jquery-multiselect-plugin-with-themeroller-support/
|
||||
* Inspired by Cory S.N. LaViska's implementation, A Beautiful Site (http://abeautifulsite.net/) 2009
|
||||
*
|
||||
* Dual licensed under the MIT and GPL licenses:
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
* http://www.gnu.org/licenses/gpl.html
|
||||
*/
|
||||
(function(f){f.fn.multiSelect=function(i){i=f.extend({},f.fn.multiSelect.defaults,i);return this.each(function(){return new w(this,i)})};var x=0,w=function(i,a){var g=$original=f(i),e,l,k,h=[],s=[];l=g.is(":disabled");var t=i.id||"ui-multiselect-"+x++;h.push('<a id="'+t+'" class="ui-multiselect ui-widget ui-state-default ui-corner-all'+(l||a.disabled?" ui-state-disabled":"")+'">');h.push('<input readonly="readonly" type="text" class="ui-state-default" value="'+a.noneSelectedText+'" title="'+i.title+
|
||||
'" /><span class="ui-icon ui-icon-triangle-1-s"></span></a>');h.push('<div class="ui-multiselect-options'+(a.shadow?" ui-multiselect-shadow":"")+' ui-widget ui-widget-content ui-corner-all">');if(a.showHeader){h.push('<div class="ui-widget-header ui-helper-clearfix ui-corner-all ui-multiselect-header">');h.push('<ul class="ui-helper-reset">');h.push('<li><a class="ui-multiselect-all" href=""><span class="ui-icon ui-icon-check"></span>'+a.checkAllText+"</a></li>");h.push('<li><a class="ui-multiselect-none" href=""><span class="ui-icon ui-icon-closethick"></span>'+
|
||||
a.unCheckAllText+"</a></li>");h.push('<li class="ui-multiselect-close"><a href="" class="ui-multiselect-close ui-icon ui-icon-circle-close"></a></li>');h.push("</ul>");h.push("</div>")}h.push('<ul class="ui-multiselect-checkboxes ui-helper-reset">');l&&g.removeAttr("disabled");g.find("option").each(function(b){var c=f(this),d=c.html(),m=this.value;b=this.id||"ui-multiselect-"+t+"-option-"+b;var j=c.parent(),n=j.is("optgroup"),o=c.is(":disabled"),u=["ui-corner-all"];if(n){j=j.attr("label");if(f.inArray(j,
|
||||
s)===-1){h.push('<li class="ui-multiselect-optgroup-label"><a href="#">'+j+"</a></li>");s.push(j)}}if(m.length>0){o&&u.push("ui-state-disabled");h.push('<li class="'+(o?"ui-multiselect-disabled":"")+'">');h.push('<label for="'+b+'" class="'+u.join(" ")+'"><input id="'+b+'" type="'+(a.multiple?"checkbox":"radio")+'" name="'+i.name+'" value="'+m+'" title="'+d+'"');c.is(":selected")&&h.push(' checked="checked"');o&&h.push(' disabled="disabled"');h.push(" />"+d+"</label></li>")}});h.push("</ul></div>");
|
||||
g=g.after(h.join("")).next("a.ui-multiselect");e=g.next("div.ui-multiselect-options");l=e.find("div.ui-multiselect-header");k=e.find("label").not(".ui-state-disabled");var v=g.find("span.ui-icon").outerWidth(),p=$original.outerWidth(),q=p+v;if(/\d/.test(a.minWidth)&&q<a.minWidth){p=a.minWidth-v;q=a.minWidth}g.width(q).find("input").width(p);a.showHeader&&l.find("a").click(function(b){var c=f(this);if(c.hasClass("ui-multiselect-close"))e.trigger("close");else{c=c.hasClass("ui-multiselect-all");e.trigger("toggleChecked",
|
||||
[c?true:false]);a[c?"onCheckAll":"onUncheckAll"].call(this)}b.preventDefault()});var r=function(){var b=k.find("input"),c=b.filter(":checked"),d="";d=c.length;d=d===0?a.noneSelectedText:f.isFunction(a.selectedText)?a.selectedText.call(this,d,b.length,c.get()):/\d/.test(a.selectedList)&&a.selectedList>0&&d<=a.selectedList?c.map(function(){return this.title}).get().join(", "):a.selectedText.replace("#",d).replace("#",b.length);g.find("input").val(d);return d};g.bind({click:function(){e.trigger("toggle")},
|
||||
keypress:function(b){switch(b.keyCode){case 27:case 38:e.trigger("close");break;case 40:case 0:e.trigger("toggle");break}},mouseenter:function(){g.hasClass("ui-state-disabled")||f(this).addClass("ui-state-hover")},mouseleave:function(){f(this).removeClass("ui-state-hover")},focus:function(){g.hasClass("ui-state-disabled")||f(this).addClass("ui-state-focus")},blur:function(){f(this).removeClass("ui-state-focus")}});e.bind({close:function(b,c){c=c||false;if(c===true)f("div.ui-multiselect-options").filter(":visible").fadeOut(a.fadeSpeed).prev("a.ui-multiselect").removeClass("ui-state-active").trigger("mouseout");
|
||||
else{g.removeClass("ui-state-active").trigger("mouseout");e.fadeOut(a.fadeSpeed)}},open:function(b,c){if(!g.hasClass("ui-state-disabled")){var d=g.position(),m=e.find("ul:last"),j,n;g.addClass("ui-state-active");if(c||typeof c==="undefined")e.trigger("close",[true]);j=a.position==="middle"?d.top+g.height()/2-e.outerHeight()/2:a.position==="top"?d.top-e.outerHeight():d.top+g.outerHeight();n=g.width()-parseInt(e.css("padding-left"),10)-parseInt(e.css("padding-right"),10);k.filter("label:first").trigger("mouseenter").trigger("focus");
|
||||
e.css({position:"absolute",top:j+"px",left:d.left+"px",width:n+"px"}).show();m.scrollTop(0);a.maxHeight&&m.css("height",a.maxHeight);a.onOpen.call(e[0])}},toggle:function(){e.trigger(f(this).is(":hidden")?"open":"close")},traverse:function(b,c,d){b=f(c);d=d===38||d===37?true:false;b=b.parent()[d?"prevAll":"nextAll"]("li:not(.ui-multiselect-disabled, .ui-multiselect-optgroup-label)")[d?"last":"first"]();if(b.length)b.find("label").trigger("mouseenter");else{b=e.find("ul:last");e.find("label")[d?"last":
|
||||
"first"]().trigger("mouseover");b.scrollTop(d?b.height():0)}},toggleChecked:function(b,c,d){(d&&d.length?d:k.find("input")).not(":disabled").attr("checked",c?"checked":"");r()}}).find("li.ui-multiselect-optgroup-label a").click(function(b){var c=f(this).parent().nextUntil("li.ui-multiselect-optgroup-label").find("input");e.trigger("toggleChecked",[c.filter(":checked").length===c.length?false:true,c]);a.onOptgroupToggle.call(this,c.get());b.preventDefault()});k.bind({mouseenter:function(){k.removeClass("ui-state-hover");
|
||||
f(this).addClass("ui-state-hover").find("input").focus()},keyup:function(b){switch(b.keyCode){case 27:e.trigger("close");break;case 38:case 40:case 37:case 39:e.trigger("traverse",[this,b.keyCode]);break;case 13:b.preventDefault();f(this).click();break}}}).find("input").bind("click",function(){a.onCheck.call(this);r()});$original.remove();f.fn.bgiframe&&e.bgiframe();a.state==="open"&&e.trigger("open",[false]);g.find("input")[0].defaultValue=r();return g};f(document).bind("click",function(i){i=f(i.target);
|
||||
!i.closest("div.ui-multiselect-options").length&&!i.parent().hasClass("ui-multiselect")&&f("div.ui-multiselect-options").trigger("close",[true])});f.fn.multiSelect.defaults={showHeader:true,maxHeight:175,minWidth:215,checkAllText:"Check all",unCheckAllText:"Uncheck all",noneSelectedText:"Select options",selectedText:"# selected",selectedList:0,position:"bottom",shadow:false,fadeSpeed:200,disabled:false,state:"closed",multiple:true,onCheck:function(){},onOpen:function(){},onCheckAll:function(){},onUncheckAll:function(){},
|
||||
onOptgroupToggle:function(){}}})(jQuery);
|
||||
|
||||
@@ -1 +1 @@
|
||||
jQuery(document).ready(function(){jQuery('[multiple]').multiSelect({maxHeight:200});});
|
||||
jQuery(document).ready(function(){jQuery('[multiple]').multiSelect({maxHeight:200});});
|
||||
@@ -88,7 +88,7 @@ var bShellScrolling=0
|
||||
jQuery(document).ready(function(){
|
||||
jQuery('#statement').focus();
|
||||
|
||||
jQuery('#statement').keyup(function(event){
|
||||
jQuery('#statement').keyup(function(event){
|
||||
var t=jQuery(this),
|
||||
s=t.val(),
|
||||
o=jQuery('#output'),
|
||||
@@ -157,3 +157,4 @@ jQuery(document).ready(function(){
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -10,3 +10,4 @@
|
||||
<p class="controls">{{=button(URL('edit/%s/LICENSE' % (app)), T('Edit'))}}</p>
|
||||
<div class="license_text legalese">{{=license}}</div>
|
||||
</ul>
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
.acw-chap .sidebar
|
||||
{
|
||||
background-image:url('{{=URL(r=request,c='static',f='eamy')}}/chap-bg-sidebar.gif');
|
||||
line-height:11px;
|
||||
line-height:11px;
|
||||
}
|
||||
.acw-chap .sidebar .row-number
|
||||
{
|
||||
@@ -53,7 +53,7 @@
|
||||
}
|
||||
.acw-chap .void
|
||||
{
|
||||
background-image:url('{{=URL(r=request,c='static',f='eamy')}}/void.gif');
|
||||
background-image:url('{{=URL(r=request,c='static',f='eamy')}}/void.gif');
|
||||
}
|
||||
</style>
|
||||
<script src="{{=URL(r=request,c='static',f='eamy/eamy.js')}}" type="text/javascript"></script>
|
||||
@@ -74,3 +74,4 @@ jQuery(document).bind('keydown', 'alt+f1',function (evt){
|
||||
doClickSave();
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -7,3 +7,4 @@
|
||||
<div class="pwform">
|
||||
{{=form}}
|
||||
</div>
|
||||
|
||||
@@ -6,3 +6,4 @@
|
||||
<h2>{{=T('Are you sure you want to delete file "%s"?', filename)}}</h2>
|
||||
<p>{{=FORM(INPUT(_type='submit',_name='nodelete',_value=T('Abort')),INPUT(_type='hidden',_name='sender',_value=sender), _class="inline")}}{{=FORM(INPUT(_type='submit',_name='delete',_value=T('Delete')),INPUT(_type='hidden',_name='sender',_value=sender), _class="inline")}}</p>
|
||||
</div>
|
||||
|
||||
@@ -7,3 +7,4 @@
|
||||
<p>{{=FORM(INPUT(_type='submit',_name='nodelete',_value=T('NO')))}}</p>
|
||||
<p>{{=FORM(INPUT(_type='submit',_name='delete',_value=T('YES')))}}</p>
|
||||
</div>
|
||||
|
||||
@@ -46,7 +46,7 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
|
||||
<!-- CONTROLLERS -->
|
||||
|
||||
<h3 id="controllers" onclick="collapse('controllers_inner');" class="component">
|
||||
{{=T("Controllers")}}
|
||||
{{=T("Controllers")}}
|
||||
<span class="tooltip">{{=helpicon()}} <span>{{=T("The application logic, each URL path is mapped in one exposed function in the controller")}}</span></span>
|
||||
</h3>
|
||||
<div id="controllers_inner" class="component_contents">
|
||||
@@ -152,7 +152,7 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
|
||||
items=file.split('/')
|
||||
file_path=items[:-1]
|
||||
filename=items[-1]
|
||||
while path!=file_path:
|
||||
while path!=file_path:
|
||||
if len(file_path)>=len(path) and all([v==file_path[k] for k,v in enumerate(path)]):
|
||||
path.append(file_path[len(path)])
|
||||
thispath='static__'+'__'.join(path)
|
||||
@@ -248,7 +248,7 @@ jQuery(document).ready(function(){
|
||||
jQuery('.component_contents li, .formfield, .comptools').hide();
|
||||
files=data['files'];
|
||||
for(var i=0; i<files.length; i++)
|
||||
jQuery('li#'+files[i].replace(/\//g,'__').replace('.','__')).slideDown();
|
||||
jQuery('li#'+files[i].replace(/\//g,'__').replace('.','__')).slideDown();
|
||||
jQuery('.flash').html('{{=T("Searching:")}} '+files.length+' {{=T("files")}}').slideDown();
|
||||
});
|
||||
} else if(code==13) {
|
||||
@@ -258,3 +258,4 @@ jQuery(document).ready(function(){
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -11,3 +11,4 @@
|
||||
{{=FORM(INPUT(_type='submit',_name='nodowngrade',_value=T('Cancel')), _class='inline')}}
|
||||
{{=FORM(INPUT(_type='submit',_name='downgrade',_value=T('Downgrade')), _class='inline')}}
|
||||
</div>
|
||||
|
||||
@@ -52,3 +52,4 @@ jQuery(document).ready(function(){
|
||||
</form>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ function delkey(id) {
|
||||
jQuery('#'+id).hide();
|
||||
jQuery('#'+id+' INPUT').val(String.fromCharCode(127));
|
||||
jQuery('#'+id+' TEXTAREA').val(String.fromCharCode(127));
|
||||
return false;
|
||||
return false;
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -16,3 +16,4 @@ function delkey(id) {
|
||||
{{=form}}
|
||||
</div>
|
||||
|
||||
|
||||
@@ -41,12 +41,12 @@ tr.error_ticket:hover {
|
||||
|
||||
<div class="errorform">
|
||||
<form name="myform" method="post">
|
||||
<input name="CheckAll" value="{{=T('check all')}}"
|
||||
<input name="CheckAll" value="{{=T('check all')}}"
|
||||
onclick="check()" type="button">
|
||||
<input name="CheckAll" value="{{=T('uncheck all')}}"
|
||||
<input name="CheckAll" value="{{=T('uncheck all')}}"
|
||||
onclick="uncheck()" type="button">
|
||||
<input value="{{=T('delete all checked')}}" type="submit"><br><br>
|
||||
|
||||
|
||||
{{ if 'new' in method: }}
|
||||
{{base_url = 'db' in method and 'ticketdb' or 'ticket' }}
|
||||
<h3>{{=T('Click row to expand traceback')}}</h3>
|
||||
@@ -131,3 +131,4 @@ tr.error_ticket:hover {
|
||||
{{ pass }}
|
||||
</form>
|
||||
</div>
|
||||
|
||||
@@ -11,3 +11,4 @@
|
||||
</table>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
@@ -1,59 +1,59 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="{{=T.accepted_language or 'en'}}" class="no-js"><!-- no-js need it for modernzr -->
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta charset="utf-8" />
|
||||
<!-- www.phpied.com/conditional-comments-block-downloads/ -->
|
||||
<!--[if IE]><![endif]-->
|
||||
<!-- Always force latest IE rendering engine
|
||||
(even in intranet) & Chrome Frame
|
||||
<!--[if IE]><![endif]-->
|
||||
<!-- Always force latest IE rendering engine
|
||||
(even in intranet) & Chrome Frame
|
||||
Remove this if you use the .htaccess -->
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
|
||||
|
||||
<title>web2py mobile admin</title>
|
||||
|
||||
|
||||
<!-- http://dev.w3.org/html5/markup/meta.name.html -->
|
||||
<meta name="application-name" content="{{=request.application}}" />
|
||||
|
||||
<!-- Speaking of Google, don't forget to set your site up:
|
||||
<meta name="application-name" content="{{=request.application}}" />
|
||||
|
||||
<!-- Speaking of Google, don't forget to set your site up:
|
||||
http://google.com/webmasters -->
|
||||
<meta name="google-site-verification" content="" />
|
||||
|
||||
|
||||
<!-- Mobile Viewport Fix
|
||||
j.mp/mobileviewport & davidbcalhoun.com/2010/viewport-metatag
|
||||
j.mp/mobileviewport & davidbcalhoun.com/2010/viewport-metatag
|
||||
device-width: Occupy full width of the screen in its current orientation
|
||||
initial-scale = 1.0 retains dimensions instead of zooming out if page height > device height
|
||||
maximum-scale = 1.0 retains dimensions instead of zooming in if page width < device width
|
||||
-->
|
||||
<!--meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0;"-->
|
||||
|
||||
|
||||
<!-- Place favicon.ico and apple-touch-icon.png in the root of your domain and delete these references -->
|
||||
<link rel="shortcut icon" href="{{=URL('static','favicon.ico')}}" type="image/x-icon">
|
||||
<link rel="apple-touch-icon" href="{{=URL('static','favicon.png')}}">
|
||||
|
||||
<!-- For the less-enabled mobile browsers like Opera Mini -->
|
||||
<link rel="stylesheet" href="{{=URL('static','plugin_jqmobile/jquery.mobile-1.0.min.css')}}">
|
||||
|
||||
|
||||
<!-- All JavaScript at the bottom, except for Modernizr which enables HTML5 elements & feature detects -->
|
||||
<script src="{{=URL('static','js/modernizr.custom.js')}}"></script>
|
||||
|
||||
{{include 'web2py_ajax.html'}}
|
||||
|
||||
{{include 'web2py_ajax.html'}}
|
||||
|
||||
<script type="text/javascript">
|
||||
//run this script after jQuery loads, but before jQuery Mobile loads
|
||||
|
||||
//customize jQuery Mobile to let IE7+ in (Mobile IE)
|
||||
//customize jQuery Mobile to let IE7+ in (Mobile IE)
|
||||
$(document).bind("mobileinit", function(){
|
||||
$.extend( $.mobile , {
|
||||
|
||||
|
||||
//extend gradeA qualifier to include IE7+
|
||||
gradeA: function(){
|
||||
gradeA: function(){
|
||||
//IE version check by James Padolsey, modified by jdalton - from http://gist.github.com/527683
|
||||
var ie = (function() {
|
||||
var v = 3, div = document.createElement('div'), a = div.all || [];
|
||||
while (div.innerHTML = '<!--[if gt IE '+(++v)+']><br><![endif]-->', a[0]);
|
||||
while (div.innerHTML = '<!--[if gt IE '+(++v)+']><br><![endif]-->', a[0]);
|
||||
return v > 4 ? v : !v;
|
||||
}());
|
||||
|
||||
|
||||
//must either support media queries or be IE7+
|
||||
return $.support.mediaquery || (ie && ie >= 7);
|
||||
}
|
||||
@@ -62,19 +62,19 @@ $(document).bind("mobileinit", function(){
|
||||
</script>
|
||||
|
||||
<script src="{{=URL('static','plugin_jqmobile/jquery.mobile-1.0.min.js')}}"></script>
|
||||
|
||||
|
||||
<style>
|
||||
.error { color: red; }
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<!-- paulirish.com/2008/conditional-stylesheets-vs-css-hacks-answer-neither/ -->
|
||||
|
||||
<!-- paulirish.com/2008/conditional-stylesheets-vs-css-hacks-answer-neither/ -->
|
||||
<!--[if lt IE 7 ]> <body class="ie6"> <![endif]-->
|
||||
<!--[if IE 7 ]> <body class="ie7"> <![endif]-->
|
||||
<!--[if IE 8 ]> <body class="ie8"> <![endif]-->
|
||||
<!--[if IE 9 ]> <body class="ie9"> <![endif]-->
|
||||
<!--[if (gt IE 9)|!(IE)]><!--> <body> <!--<![endif]-->
|
||||
|
||||
|
||||
<div data-role="page">
|
||||
<div data-role="header" data-fullscreen="true" data-position="fixed">
|
||||
<h1>web2py mobile admin/{{block sectionclass}}{{end}}</h1>
|
||||
@@ -108,11 +108,12 @@ $(document).bind("mobileinit", function(){
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<!--[if lt IE 7 ]>
|
||||
<script src="{{=URL('static','plugin_jqmobile/dd_belatedpng.js')}}"></script>
|
||||
<script> DD_belatedPNG.fix('img, .png_bg'); //fix any <img> or .png_bg background-images </script>
|
||||
<![endif]-->
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -14,3 +14,4 @@ if filename[-3:]=='.py': language='python'
|
||||
else: language='html'
|
||||
}}
|
||||
{{=CODE(data,language=language,link='/examples/global/vars/')}}
|
||||
|
||||
@@ -10,7 +10,7 @@ def editfile(path,file):
|
||||
def testfile(path,file):
|
||||
return A(TAG[''](IMG(_src=URL('static', 'images/test_icon.png'), _alt=T('test')), SPAN(T("Run tests in this file"))), _class='icon test tooltip',_href=URL('test', args=(app, file)))
|
||||
def editlanguagefile(path,file):
|
||||
return A(SPAN(T('Edit')),_class='button editbutton',_href=URL('edit_language', args=(app, path, file)))
|
||||
return A(SPAN(T('Edit')),_class='button editbutton',_href=URL('edit_language', args=(app, path, file)))
|
||||
def file_upload_form(location):
|
||||
form=FORM(T("upload file:")," ",
|
||||
INPUT(_type="file",_name="file")," ",T("and rename it:")," ",
|
||||
@@ -219,3 +219,4 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
@@ -22,3 +22,4 @@ function all() {jQuery('.plus').show(); jQuery('.minus').show(); }
|
||||
<input type="submit" name="merge" value="{{=T('merge')}}" /><br/>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
@@ -5,10 +5,10 @@
|
||||
<h2>{{=T("Installed applications")}}</h2>
|
||||
|
||||
<ul data-role="listview">
|
||||
{{for a in apps:}}
|
||||
{{for a in apps:}}
|
||||
<li>
|
||||
{{if a==request.application:}}
|
||||
<h3>{{=a}} ({{=T('currently running')}})</h3>
|
||||
<h3>{{=a}} ({{=T('currently running')}})</h3>
|
||||
{{else:}}
|
||||
<h3>{{=a}}</h3>
|
||||
{{if MULTI_USER_MODE and db.app(name=a):}}<p>created by {{="%(first_name)s %(last_name)s" % db.auth_user[db.app(name=a).owner]}}</p>{{pass}}
|
||||
@@ -18,7 +18,7 @@
|
||||
{{=LI(A(T('Goto'),_rel="external",_href=URL(a,'default','index')))}}
|
||||
{{if not os.path.exists('applications/%s/compiled' % a):}}
|
||||
{{=LI(A(T('Edit'),_href=URL('design',args=a)))}}
|
||||
{{else:}}
|
||||
{{else:}}
|
||||
{{=LI(A(T('appadmin'),_rel="external",_href=URL(a,'appadmin','index')))}}
|
||||
{{pass}}
|
||||
{{=LI(A(T('About'),_href=URL('about',args=a)))}}
|
||||
@@ -41,3 +41,4 @@
|
||||
</li>
|
||||
{{pass}}
|
||||
</ul>
|
||||
|
||||
@@ -18,3 +18,4 @@ ajax('{{=URL(a=app,c=controller[:-3],f='_TEST')}}',[],'output_{{=controller[:-3]
|
||||
A green title indicates that all tests (if defined) passed. In this case test results are not shown.""")}}</p>
|
||||
<p class="help">{{=T('Functions with no doctests will result in [passed] tests.')}}</p>
|
||||
<p class="help">{{=T('ATTENTION: TESTING IS NOT THREAD SAFE SO DO NOT PERFORM MULTIPLE TESTS CONCURRENTLY.')}}</p>
|
||||
|
||||
@@ -28,14 +28,14 @@
|
||||
{{try:}}
|
||||
|
||||
<!-- ERROR SNAPSHOT -->
|
||||
|
||||
|
||||
<h3>
|
||||
{{=T('Error snapshot')}}
|
||||
{{=T('Error snapshot')}}
|
||||
<span class="tooltip">{{=helpicon()}} <span>{{=T('Detailed traceback description')}}</span></span>
|
||||
</h3>
|
||||
|
||||
|
||||
<!-- SNAPSHOT LIST -->
|
||||
|
||||
|
||||
<div id="snapshot">
|
||||
<!-- Exception details -->
|
||||
<p class="exception_object inspect">
|
||||
@@ -60,7 +60,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- FRAMES -->
|
||||
<div id="frames">
|
||||
<h4>{{=T('Frames')}}</h4>
|
||||
@@ -71,18 +71,18 @@
|
||||
<div class="framefile inspect controls">
|
||||
<p>
|
||||
<strong>File {{="%s in %s at line %s" % (frame['file'], frame['func'], frame['lnum'])}}</strong>
|
||||
<a class="button tbbutton" onclick="collapse('{{="%s_code_inner" % i}}');"><span>{{=T("code")}}</span></a>
|
||||
<a class="button tbbutton" onclick="collapse('{{="%s_args_inner" % i}}');"><span>{{=T("arguments")}}</span></a>
|
||||
<a class="button tbbutton" onclick="collapse('{{="%s_code_inner" % i}}');"><span>{{=T("code")}}</span></a>
|
||||
<a class="button tbbutton" onclick="collapse('{{="%s_args_inner" % i}}');"><span>{{=T("arguments")}}</span></a>
|
||||
<a class="button tbbutton" onclick="collapse('{{="%s_vars_inner" % i}}');"><span>{{=T("variables")}}</span></a>
|
||||
</p>
|
||||
<div id="{{="%s_args_inner" % i}}" class="{{=is_hidden}}">
|
||||
</p>
|
||||
<div id="{{="%s_args_inner" % i}}" class="{{=is_hidden}}">
|
||||
<h5>Function argument list</h5>
|
||||
<p>{{=frame['call']}}</p>
|
||||
</div>
|
||||
<div id="{{="%s_code_inner" % i}}" class="{{=is_hidden}}">
|
||||
<h5>Code listing</h5>
|
||||
{{if frame['lines']:}}
|
||||
<pre>{{=CODE('\n'.join([x[1] for x in sorted(frame['lines'].items(),key=lambda x: x[0])]),
|
||||
<pre>{{=CODE('\n'.join([x[1] for x in sorted(frame['lines'].items(),key=lambda x: x[0])]),
|
||||
language='python', link=None, counter=min(frame['lines'].keys()), highlight_line=frame['lnum'])}}</pre>
|
||||
{{pass}}
|
||||
</div>
|
||||
@@ -123,10 +123,11 @@
|
||||
<!-- this should not happen, just in case... (cannot output normal hmtl as we don't know current open tags) -->
|
||||
{{import traceback;tb=traceback.format_exc().replace("\n","\\n") }}
|
||||
<script language='javascript'>alert("Exception during snapshot rendering: {{=tb}} ");</script>
|
||||
{{pass}}
|
||||
{{pass}}
|
||||
{{pass}}
|
||||
|
||||
<div class="errorsource">
|
||||
<h3>In file: {{=layer}}</h3>
|
||||
{{=CODE(code.replace('\r',''),language='python',link='/examples/global/vars/')}}
|
||||
</div>
|
||||
|
||||
@@ -7,3 +7,4 @@
|
||||
<td>{{=FORM(INPUT(_type='submit',_name='delete',_value=T('Uninstall')))}}</td>
|
||||
</tr></table>
|
||||
</center>
|
||||
|
||||
@@ -11,3 +11,4 @@
|
||||
{{=FORM(INPUT(_type='submit',_name='noupgrade',_value=T('Cancel')), _class='inline')}}
|
||||
{{=FORM(INPUT(_type='submit',_name='upgrade',_value=T('Upgrade')), _class='inline')}}
|
||||
</div>
|
||||
|
||||
@@ -16,4 +16,5 @@
|
||||
<!--
|
||||
jQuery("#web2py_user_form input:visible:enabled:first").focus();
|
||||
//-->
|
||||
</script>
|
||||
</script>
|
||||
|
||||
@@ -10,3 +10,4 @@
|
||||
<p class="controls">{{=button(URL('edit/%s/LICENSE' % (app)), T('Edit'))}}</p>
|
||||
<div class="license_text legalese">{{=license}}</div>
|
||||
</ul>
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
.acw-chap .sidebar
|
||||
{
|
||||
background-image:url('{{=URL(r=request,c='static',f='eamy')}}/chap-bg-sidebar.gif');
|
||||
line-height:11px;
|
||||
line-height:11px;
|
||||
}
|
||||
.acw-chap .sidebar .row-number
|
||||
{
|
||||
@@ -53,7 +53,7 @@
|
||||
}
|
||||
.acw-chap .void
|
||||
{
|
||||
background-image:url('{{=URL(r=request,c='static',f='eamy')}}/void.gif');
|
||||
background-image:url('{{=URL(r=request,c='static',f='eamy')}}/void.gif');
|
||||
}
|
||||
</style>
|
||||
<script src="{{=URL(r=request,c='static',f='eamy/eamy.js')}}" type="text/javascript"></script>
|
||||
@@ -74,3 +74,4 @@ jQuery(document).bind('keydown', 'alt+f1',function (evt){
|
||||
doClickSave();
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -7,3 +7,4 @@
|
||||
<div class="pwform">
|
||||
{{=form}}
|
||||
</div>
|
||||
|
||||
@@ -6,3 +6,4 @@
|
||||
<h2>{{=T('Are you sure you want to delete file "%s"?', filename)}}</h2>
|
||||
<p>{{=FORM(INPUT(_type='submit',_name='nodelete',_value=T('Abort')),INPUT(_type='hidden',_name='sender',_value=sender), _class="inline")}}{{=FORM(INPUT(_type='submit',_name='delete',_value=T('Delete')),INPUT(_type='hidden',_name='sender',_value=sender), _class="inline")}}</p>
|
||||
</div>
|
||||
|
||||
Loaded 100 of 305 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user