forked from openlp/openlp
head
This commit is contained in:
commit
46e2eb155b
24
openlp.pyw
24
openlp.pyw
|
@ -147,6 +147,9 @@ class OpenLP(QtGui.QApplication):
|
||||||
return self.exec_()
|
return self.exec_()
|
||||||
|
|
||||||
def hookException(self, exctype, value, traceback):
|
def hookException(self, exctype, value, traceback):
|
||||||
|
if not hasattr(self, u'mainWindow'):
|
||||||
|
log.exception(''.join(format_exception(exctype, value, traceback)))
|
||||||
|
return
|
||||||
if not hasattr(self, u'exceptionForm'):
|
if not hasattr(self, u'exceptionForm'):
|
||||||
self.exceptionForm = ExceptionForm(self.mainWindow)
|
self.exceptionForm = ExceptionForm(self.mainWindow)
|
||||||
self.exceptionForm.exceptionTextEdit.setPlainText(
|
self.exceptionForm.exceptionTextEdit.setPlainText(
|
||||||
|
@ -161,16 +164,16 @@ def main():
|
||||||
# Set up command line options.
|
# Set up command line options.
|
||||||
usage = u'Usage: %prog [options] [qt-options]'
|
usage = u'Usage: %prog [options] [qt-options]'
|
||||||
parser = OptionParser(usage=usage)
|
parser = OptionParser(usage=usage)
|
||||||
parser.add_option("-l", "--log-level", dest="loglevel",
|
parser.add_option(u'-e', u'--no-error-form', dest=u'no_error_form',
|
||||||
default="warning", metavar="LEVEL",
|
action=u'store_true', help=u'Disable the error notification form.')
|
||||||
help="Set logging to LEVEL level. Valid values are "
|
parser.add_option(u'-l', u'--log-level', dest=u'loglevel',
|
||||||
"\"debug\", \"info\", \"warning\".")
|
default=u'warning', metavar=u'LEVEL', help=u'Set logging to LEVEL '
|
||||||
parser.add_option("-p", "--portable", dest="portable",
|
u'level. Valid values are "debug", "info", "warning".')
|
||||||
action="store_true",
|
parser.add_option(u'-p', u'--portable', dest=u'portable',
|
||||||
help="Specify if this should be run as a portable app, "
|
action=u'store_true', help=u'Specify if this should be run as a '
|
||||||
"off a USB flash drive.")
|
u'portable app, off a USB flash drive (not implemented).')
|
||||||
parser.add_option("-s", "--style", dest="style",
|
parser.add_option(u'-s', u'--style', dest=u'style',
|
||||||
help="Set the Qt4 style (passed directly to Qt4).")
|
help=u'Set the Qt4 style (passed directly to Qt4).')
|
||||||
# Set up logging
|
# Set up logging
|
||||||
log_path = AppLocation.get_directory(AppLocation.CacheDir)
|
log_path = AppLocation.get_directory(AppLocation.CacheDir)
|
||||||
if not os.path.exists(log_path):
|
if not os.path.exists(log_path):
|
||||||
|
@ -203,6 +206,7 @@ def main():
|
||||||
language = LanguageManager.get_language()
|
language = LanguageManager.get_language()
|
||||||
appTranslator = LanguageManager.get_translator(language)
|
appTranslator = LanguageManager.get_translator(language)
|
||||||
app.installTranslator(appTranslator)
|
app.installTranslator(appTranslator)
|
||||||
|
if not options.no_error_form:
|
||||||
sys.excepthook = app.hookException
|
sys.excepthook = app.hookException
|
||||||
sys.exit(app.run())
|
sys.exit(app.run())
|
||||||
|
|
||||||
|
|
|
@ -38,62 +38,47 @@ log = logging.getLogger(__name__)
|
||||||
# TODO make external and configurable in alpha 4 via a settings dialog
|
# TODO make external and configurable in alpha 4 via a settings dialog
|
||||||
html_expands = []
|
html_expands = []
|
||||||
|
|
||||||
html_expands.append({u'desc':u'Red', u'start tag':u'{r}', \
|
html_expands.append({u'desc':u'Red', u'start tag':u'{r}',
|
||||||
u'start html':u'<span style="-webkit-text-fill-color:red">', \
|
u'start html':u'<span style="-webkit-text-fill-color:red">',
|
||||||
u'end tag':u'{/r}', u'end html':u'</span>', \
|
u'end tag':u'{/r}', u'end html':u'</span>', u'protected':False})
|
||||||
u'protected':False})
|
html_expands.append({u'desc':u'Black', u'start tag':u'{b}',
|
||||||
html_expands.append({u'desc':u'Black', u'start tag':u'{b}', \
|
u'start html':u'<span style="-webkit-text-fill-color:black">',
|
||||||
u'start html':u'<span style="-webkit-text-fill-color:black">', \
|
u'end tag':u'{/b}', u'end html':u'</span>', u'protected':False})
|
||||||
u'end tag':u'{/b}', u'end html':u'</span>', \
|
html_expands.append({u'desc':u'Blue', u'start tag':u'{bl}',
|
||||||
u'protected':False})
|
u'start html':u'<span style="-webkit-text-fill-color:blue">',
|
||||||
html_expands.append({u'desc':u'Blue', u'start tag':u'{bl}', \
|
u'end tag':u'{/bl}', u'end html':u'</span>', u'protected':False})
|
||||||
u'start html':u'<span style="-webkit-text-fill-color:blue">', \
|
html_expands.append({u'desc':u'Yellow', u'start tag':u'{y}',
|
||||||
u'end tag':u'{/bl}', u'end html':u'</span>', \
|
u'start html':u'<span style="-webkit-text-fill-color:yellow">',
|
||||||
u'protected':False})
|
u'end tag':u'{/y}', u'end html':u'</span>', u'protected':False})
|
||||||
html_expands.append({u'desc':u'Yellow', u'start tag':u'{y}', \
|
html_expands.append({u'desc':u'Green', u'start tag':u'{g}',
|
||||||
u'start html':u'<span style="-webkit-text-fill-color:yellow">', \
|
u'start html':u'<span style="-webkit-text-fill-color:green">',
|
||||||
u'end tag':u'{/y}', u'end html':u'</span>', \
|
u'end tag':u'{/g}', u'end html':u'</span>', u'protected':False})
|
||||||
u'protected':False})
|
html_expands.append({u'desc':u'Pink', u'start tag':u'{pk}',
|
||||||
html_expands.append({u'desc':u'Green', u'start tag':u'{g}', \
|
u'start html':u'<span style="-webkit-text-fill-color:#CC33CC">',
|
||||||
u'start html':u'<span style="-webkit-text-fill-color:green">', \
|
u'end tag':u'{/pk}', u'end html':u'</span>', u'protected':False})
|
||||||
u'end tag':u'{/g}', u'end html':u'</span>', \
|
html_expands.append({u'desc':u'Orange', u'start tag':u'{o}',
|
||||||
u'protected':False})
|
u'start html':u'<span style="-webkit-text-fill-color:#CC0033">',
|
||||||
html_expands.append({u'desc':u'Pink', u'start tag':u'{pk}', \
|
u'end tag':u'{/o}', u'end html':u'</span>', u'protected':False})
|
||||||
u'start html':u'<span style="-webkit-text-fill-color:#CC33CC">', \
|
html_expands.append({u'desc':u'Purple', u'start tag':u'{pp}',
|
||||||
u'end tag':u'{/pk}', u'end html':u'</span>', \
|
u'start html':u'<span style="-webkit-text-fill-color:#9900FF">',
|
||||||
u'protected':False})
|
u'end tag':u'{/pp}', u'end html':u'</span>', u'protected':False})
|
||||||
html_expands.append({u'desc':u'Orange', u'start tag':u'{o}', \
|
html_expands.append({u'desc':u'White', u'start tag':u'{w}',
|
||||||
u'start html':u'<span style="-webkit-text-fill-color:#CC0033">', \
|
u'start html':u'<span style="-webkit-text-fill-color:white">',
|
||||||
u'end tag':u'{/o}', u'end html':u'</span>', \
|
u'end tag':u'{/w}', u'end html':u'</span>', u'protected':False})
|
||||||
u'protected':False})
|
html_expands.append({u'desc':u'Superscript', u'start tag':u'{su}',
|
||||||
html_expands.append({u'desc':u'Purple', u'start tag':u'{pp}', \
|
u'start html':u'<sup>', u'end tag':u'{/su}', u'end html':u'</sup>',
|
||||||
u'start html':u'<span style="-webkit-text-fill-color:#9900FF">', \
|
|
||||||
u'end tag':u'{/pp}', u'end html':u'</span>', \
|
|
||||||
u'protected':False})
|
|
||||||
html_expands.append({u'desc':u'White', u'start tag':u'{w}', \
|
|
||||||
u'start html':u'<span style="-webkit-text-fill-color:white">', \
|
|
||||||
u'end tag':u'{/w}', u'end html':u'</span>', \
|
|
||||||
u'protected':False})
|
|
||||||
html_expands.append({u'desc':u'Superscript', u'start tag':u'{su}', \
|
|
||||||
u'start html':u'<sup>', \
|
|
||||||
u'end tag':u'{/su}', u'end html':u'</sup>', \
|
|
||||||
u'protected':True})
|
u'protected':True})
|
||||||
html_expands.append({u'desc':u'Subscript', u'start tag':u'{sb}', \
|
html_expands.append({u'desc':u'Subscript', u'start tag':u'{sb}',
|
||||||
u'start html':u'<sub>', \
|
u'start html':u'<sub>', u'end tag':u'{/sb}', u'end html':u'</sub>',
|
||||||
u'end tag':u'{/sb}', u'end html':u'</sub>', \
|
|
||||||
u'protected':True})
|
u'protected':True})
|
||||||
html_expands.append({u'desc':u'Paragraph', u'start tag':u'{p}', \
|
html_expands.append({u'desc':u'Paragraph', u'start tag':u'{p}',
|
||||||
u'start html':u'<p>', \
|
u'start html':u'<p>', u'end tag':u'{/p}', u'end html':u'</p>',
|
||||||
u'end tag':u'{/p}', u'end html':u'</p>', \
|
|
||||||
u'protected':True})
|
u'protected':True})
|
||||||
html_expands.append({u'desc':u'Bold', u'start tag':u'{st}', \
|
html_expands.append({u'desc':u'Bold', u'start tag':u'{st}',
|
||||||
u'start html':u'<strong>', \
|
u'start html':u'<strong>', u'end tag':u'{/st}', u'end html':u'</strong>',
|
||||||
u'end tag':u'{/st}', \
|
|
||||||
u'end html':u'</strong>', \
|
|
||||||
u'protected':True})
|
u'protected':True})
|
||||||
html_expands.append({u'desc':u'Italics', u'start tag':u'{it}', \
|
html_expands.append({u'desc':u'Italics', u'start tag':u'{it}',
|
||||||
u'start html':u'<em>', \
|
u'start html':u'<em>', u'end tag':u'{/it}', u'end html':u'</em>',
|
||||||
u'end tag':u'{/it}', u'end html':u'</em>', \
|
|
||||||
u'protected':True})
|
u'protected':True})
|
||||||
|
|
||||||
def translate(context, text, comment=None):
|
def translate(context, text, comment=None):
|
||||||
|
|
|
@ -81,17 +81,14 @@ body {
|
||||||
</style>
|
</style>
|
||||||
<script language="javascript">
|
<script language="javascript">
|
||||||
var timer = null;
|
var timer = null;
|
||||||
|
var video_timer = null;
|
||||||
var transition = %s;
|
var transition = %s;
|
||||||
|
|
||||||
function show_video(state, path, volume, loop){
|
function show_video(state, path, volume, loop){
|
||||||
var vid = document.getElementById('video');
|
var vid = document.getElementById('video');
|
||||||
if(path != null)
|
if(path != null){
|
||||||
vid.src = path;
|
vid.src = path;
|
||||||
if(loop != null){
|
vid.load();
|
||||||
if(loop)
|
|
||||||
vid.loop = 'loop';
|
|
||||||
else
|
|
||||||
vid.loop = '';
|
|
||||||
}
|
}
|
||||||
if(volume != null){
|
if(volume != null){
|
||||||
vid.volume = volume;
|
vid.volume = volume;
|
||||||
|
@ -100,23 +97,55 @@ body {
|
||||||
case 'play':
|
case 'play':
|
||||||
vid.play();
|
vid.play();
|
||||||
vid.style.display = 'block';
|
vid.style.display = 'block';
|
||||||
|
if(loop)
|
||||||
|
video_timer = setInterval('video_loop()', 200);
|
||||||
break;
|
break;
|
||||||
case 'pause':
|
case 'pause':
|
||||||
|
if(video_timer!=null){
|
||||||
|
clearInterval(video_timer);
|
||||||
|
video_timer = null;
|
||||||
|
}
|
||||||
vid.pause();
|
vid.pause();
|
||||||
vid.style.display = 'block';
|
vid.style.display = 'block';
|
||||||
break;
|
break;
|
||||||
case 'stop':
|
case 'stop':
|
||||||
|
if(video_timer!=null){
|
||||||
|
clearInterval(video_timer);
|
||||||
|
video_timer = null;
|
||||||
|
}
|
||||||
vid.pause();
|
vid.pause();
|
||||||
vid.style.display = 'none';
|
vid.style.display = 'none';
|
||||||
|
vid.load();
|
||||||
break;
|
break;
|
||||||
case 'close':
|
case 'close':
|
||||||
|
if(video_timer!=null){
|
||||||
|
clearInterval(video_timer);
|
||||||
|
video_timer = null;
|
||||||
|
}
|
||||||
vid.pause();
|
vid.pause();
|
||||||
vid.style.display = 'none';
|
vid.style.display = 'none';
|
||||||
vid.src = '';
|
vid.src = '';
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
function video_loop(){
|
||||||
|
// The preferred method would be to use the video tag loop attribute
|
||||||
|
// But QtWebKit doesn't support this. Neither does it support the
|
||||||
|
// onended event, hence the setInterval()
|
||||||
|
// In addition, setting the currentTime attribute to zero to restart
|
||||||
|
// the video raises an INDEX_SIZE_ERROR: DOM Exception 1
|
||||||
|
// To complicate it further, sometimes vid.currentTime stops
|
||||||
|
// slightly short of vid.duration and vid.ended is intermittent!
|
||||||
|
//
|
||||||
|
// Note, currently the background may go black between loops. Not
|
||||||
|
// desirable. Need to investigate using two <video>'s, and hiding/
|
||||||
|
// preloading one, and toggle between the two when looping.
|
||||||
|
var vid = document.getElementById('video');
|
||||||
|
if(vid.ended||vid.currentTime+0.2>=vid.duration){
|
||||||
|
vid.load();
|
||||||
|
vid.play();
|
||||||
|
}
|
||||||
|
}
|
||||||
function show_image(src){
|
function show_image(src){
|
||||||
var img = document.getElementById('image');
|
var img = document.getElementById('image');
|
||||||
img.src = src;
|
img.src = src;
|
||||||
|
|
|
@ -432,7 +432,7 @@ class MediaManagerItem(QtGui.QWidget):
|
||||||
raise NotImplementedError(u'MediaManagerItem.onDeleteClick needs to '
|
raise NotImplementedError(u'MediaManagerItem.onDeleteClick needs to '
|
||||||
u'be defined by the plugin')
|
u'be defined by the plugin')
|
||||||
|
|
||||||
def generateSlideData(self, service_item, item):
|
def generateSlideData(self, service_item, item=None):
|
||||||
raise NotImplementedError(u'MediaManagerItem.generateSlideData needs '
|
raise NotImplementedError(u'MediaManagerItem.generateSlideData needs '
|
||||||
u'to be defined by the plugin')
|
u'to be defined by the plugin')
|
||||||
|
|
||||||
|
|
|
@ -450,7 +450,7 @@ class Ui_AboutDialog(object):
|
||||||
'\n'
|
'\n'
|
||||||
'Each version is given a distinguishing version number. If the '
|
'Each version is given a distinguishing version number. If the '
|
||||||
'Program specifies a version number of this License which applies '
|
'Program specifies a version number of this License which applies '
|
||||||
'to it and \"any later version\', you have the option of '
|
'to it and "any later version", you have the option of '
|
||||||
'following the terms and conditions either of that version or of '
|
'following the terms and conditions either of that version or of '
|
||||||
'any later version published by the Free Software Foundation. If '
|
'any later version published by the Free Software Foundation. If '
|
||||||
'the Program does not specify a version number of this License, '
|
'the Program does not specify a version number of this License, '
|
||||||
|
@ -565,3 +565,4 @@ class Ui_AboutDialog(object):
|
||||||
self.contributeButton.setText(translate('OpenLP.AboutForm',
|
self.contributeButton.setText(translate('OpenLP.AboutForm',
|
||||||
'Contribute'))
|
'Contribute'))
|
||||||
self.closeButton.setText(translate('OpenLP.AboutForm', 'Close'))
|
self.closeButton.setText(translate('OpenLP.AboutForm', 'Close'))
|
||||||
|
|
||||||
|
|
|
@ -120,7 +120,7 @@ class MainDisplay(DisplayWidget):
|
||||||
self.setScene(self.scene)
|
self.setScene(self.scene)
|
||||||
self.webView = QtWebKit.QGraphicsWebView()
|
self.webView = QtWebKit.QGraphicsWebView()
|
||||||
self.scene.addItem(self.webView)
|
self.scene.addItem(self.webView)
|
||||||
self.webView.resize(self.screen[u'size'].width(), \
|
self.webView.resize(self.screen[u'size'].width(),
|
||||||
self.screen[u'size'].height())
|
self.screen[u'size'].height())
|
||||||
self.page = self.webView.page()
|
self.page = self.webView.page()
|
||||||
self.frame = self.page.mainFrame()
|
self.frame = self.page.mainFrame()
|
||||||
|
@ -303,6 +303,9 @@ class MainDisplay(DisplayWidget):
|
||||||
Generates a preview of the image displayed.
|
Generates a preview of the image displayed.
|
||||||
"""
|
"""
|
||||||
log.debug(u'preview for %s', self.isLive)
|
log.debug(u'preview for %s', self.isLive)
|
||||||
|
# We must have a service item to preview
|
||||||
|
if not hasattr(self, u'serviceItem'):
|
||||||
|
return
|
||||||
if self.isLive:
|
if self.isLive:
|
||||||
# Wait for the fade to finish before geting the preview.
|
# Wait for the fade to finish before geting the preview.
|
||||||
# Important otherwise preview will have incorrect text if at all !
|
# Important otherwise preview will have incorrect text if at all !
|
||||||
|
@ -336,7 +339,7 @@ class MainDisplay(DisplayWidget):
|
||||||
self.loaded = False
|
self.loaded = False
|
||||||
self.initialFrame = False
|
self.initialFrame = False
|
||||||
self.serviceItem = serviceItem
|
self.serviceItem = serviceItem
|
||||||
html = build_html(self.serviceItem, self.screen, self.parent.alertTab,\
|
html = build_html(self.serviceItem, self.screen, self.parent.alertTab,
|
||||||
self.isLive)
|
self.isLive)
|
||||||
self.webView.setHtml(html)
|
self.webView.setHtml(html)
|
||||||
if serviceItem.foot_text and serviceItem.foot_text:
|
if serviceItem.foot_text and serviceItem.foot_text:
|
||||||
|
|
|
@ -93,6 +93,7 @@ class Ui_PluginViewDialog(object):
|
||||||
self.pluginListButtonBox.setStandardButtons(QtGui.QDialogButtonBox.Ok)
|
self.pluginListButtonBox.setStandardButtons(QtGui.QDialogButtonBox.Ok)
|
||||||
self.pluginListButtonBox.setObjectName(u'pluginListButtonBox')
|
self.pluginListButtonBox.setObjectName(u'pluginListButtonBox')
|
||||||
self.pluginLayout.addWidget(self.pluginListButtonBox)
|
self.pluginLayout.addWidget(self.pluginListButtonBox)
|
||||||
|
self.versionNumberLabel.setText(u'')
|
||||||
self.retranslateUi(pluginViewDialog)
|
self.retranslateUi(pluginViewDialog)
|
||||||
QtCore.QObject.connect(self.pluginListButtonBox,
|
QtCore.QObject.connect(self.pluginListButtonBox,
|
||||||
QtCore.SIGNAL(u'accepted()'), pluginViewDialog.close)
|
QtCore.SIGNAL(u'accepted()'), pluginViewDialog.close)
|
||||||
|
@ -105,8 +106,6 @@ class Ui_PluginViewDialog(object):
|
||||||
translate('OpenLP.PluginForm', 'Plugin Details'))
|
translate('OpenLP.PluginForm', 'Plugin Details'))
|
||||||
self.versionLabel.setText(
|
self.versionLabel.setText(
|
||||||
translate('OpenLP.PluginForm', 'Version:'))
|
translate('OpenLP.PluginForm', 'Version:'))
|
||||||
self.versionNumberLabel.setText(
|
|
||||||
translate('OpenLP.PluginForm', 'TextLabel'))
|
|
||||||
self.aboutLabel.setText(
|
self.aboutLabel.setText(
|
||||||
translate('OpenLP.PluginForm', 'About:'))
|
translate('OpenLP.PluginForm', 'About:'))
|
||||||
self.statusLabel.setText(
|
self.statusLabel.setText(
|
||||||
|
@ -115,3 +114,4 @@ class Ui_PluginViewDialog(object):
|
||||||
translate('OpenLP.PluginForm', 'Active'))
|
translate('OpenLP.PluginForm', 'Active'))
|
||||||
self.statusComboBox.setItemText(1,
|
self.statusComboBox.setItemText(1,
|
||||||
translate('OpenLP.PluginForm', 'Inactive'))
|
translate('OpenLP.PluginForm', 'Inactive'))
|
||||||
|
|
||||||
|
|
|
@ -58,6 +58,9 @@ class PluginForm(QtGui.QDialog, Ui_PluginViewDialog):
|
||||||
Load the plugin details into the screen
|
Load the plugin details into the screen
|
||||||
"""
|
"""
|
||||||
self.pluginListWidget.clear()
|
self.pluginListWidget.clear()
|
||||||
|
self.programaticChange = True
|
||||||
|
self._clearDetails()
|
||||||
|
self.programaticChange = True
|
||||||
for plugin in self.parent.plugin_manager.plugins:
|
for plugin in self.parent.plugin_manager.plugins:
|
||||||
item = QtGui.QListWidgetItem(self.pluginListWidget)
|
item = QtGui.QListWidgetItem(self.pluginListWidget)
|
||||||
# We do this just to make 100% sure the status is an integer as
|
# We do this just to make 100% sure the status is an integer as
|
||||||
|
@ -134,6 +137,5 @@ class PluginForm(QtGui.QDialog, Ui_PluginViewDialog):
|
||||||
elif self.activePlugin.status == PluginStatus.Disabled:
|
elif self.activePlugin.status == PluginStatus.Disabled:
|
||||||
status_text = unicode(
|
status_text = unicode(
|
||||||
translate('OpenLP.PluginForm', '%s (Disabled)'))
|
translate('OpenLP.PluginForm', '%s (Disabled)'))
|
||||||
if self.pluginListWidget.currentItem():
|
|
||||||
self.pluginListWidget.currentItem().setText(
|
self.pluginListWidget.currentItem().setText(
|
||||||
status_text % self.activePlugin.name)
|
status_text % self.activePlugin.name)
|
||||||
|
|
|
@ -279,7 +279,8 @@ class ServiceManager(QtGui.QWidget):
|
||||||
self.editAction.setVisible(False)
|
self.editAction.setVisible(False)
|
||||||
self.maintainAction.setVisible(False)
|
self.maintainAction.setVisible(False)
|
||||||
self.notesAction.setVisible(False)
|
self.notesAction.setVisible(False)
|
||||||
if serviceItem[u'service_item'].is_capable(ItemCapabilities.AllowsEdit):
|
if serviceItem[u'service_item'].is_capable(ItemCapabilities.AllowsEdit) \
|
||||||
|
and hasattr(serviceItem[u'service_item'], u'editId'):
|
||||||
self.editAction.setVisible(True)
|
self.editAction.setVisible(True)
|
||||||
if serviceItem[u'service_item']\
|
if serviceItem[u'service_item']\
|
||||||
.is_capable(ItemCapabilities.AllowsMaintain):
|
.is_capable(ItemCapabilities.AllowsMaintain):
|
||||||
|
@ -632,6 +633,8 @@ class ServiceManager(QtGui.QWidget):
|
||||||
|
|
||||||
def onLoadService(self, lastService=False):
|
def onLoadService(self, lastService=False):
|
||||||
if lastService:
|
if lastService:
|
||||||
|
if not self.parent.recentFiles:
|
||||||
|
return
|
||||||
filename = self.parent.recentFiles[0]
|
filename = self.parent.recentFiles[0]
|
||||||
else:
|
else:
|
||||||
filename = QtGui.QFileDialog.getOpenFileName(
|
filename = QtGui.QFileDialog.getOpenFileName(
|
||||||
|
|
|
@ -209,7 +209,7 @@ class SlideController(QtGui.QWidget):
|
||||||
self.Toolbar.addToolbarSeparator(u'Close Separator')
|
self.Toolbar.addToolbarSeparator(u'Close Separator')
|
||||||
self.Toolbar.addToolbarButton(
|
self.Toolbar.addToolbarButton(
|
||||||
u'Edit Song', u':/general/general_edit.png',
|
u'Edit Song', u':/general/general_edit.png',
|
||||||
translate('OpenLP.SlideController', 'Edit and re-preview Song'),
|
translate('OpenLP.SlideController', 'Edit and re-preview song'),
|
||||||
self.onEditSong)
|
self.onEditSong)
|
||||||
if isLive:
|
if isLive:
|
||||||
self.Toolbar.addToolbarSeparator(u'Loop Separator')
|
self.Toolbar.addToolbarSeparator(u'Loop Separator')
|
||||||
|
@ -269,11 +269,11 @@ class SlideController(QtGui.QWidget):
|
||||||
if isLive:
|
if isLive:
|
||||||
self.SongMenu = QtGui.QToolButton(self.Toolbar)
|
self.SongMenu = QtGui.QToolButton(self.Toolbar)
|
||||||
self.SongMenu.setText(translate('OpenLP.SlideController',
|
self.SongMenu.setText(translate('OpenLP.SlideController',
|
||||||
'Go to'))
|
'Go To'))
|
||||||
self.SongMenu.setPopupMode(QtGui.QToolButton.InstantPopup)
|
self.SongMenu.setPopupMode(QtGui.QToolButton.InstantPopup)
|
||||||
self.Toolbar.addToolbarWidget(u'Song Menu', self.SongMenu)
|
self.Toolbar.addToolbarWidget(u'Song Menu', self.SongMenu)
|
||||||
self.SongMenu.setMenu(QtGui.QMenu(
|
self.SongMenu.setMenu(QtGui.QMenu(
|
||||||
translate('OpenLP.SlideController', 'Go to'),
|
translate('OpenLP.SlideController', 'Go To'),
|
||||||
self.Toolbar))
|
self.Toolbar))
|
||||||
self.Toolbar.makeWidgetsInvisible([u'Song Menu'])
|
self.Toolbar.makeWidgetsInvisible([u'Song Menu'])
|
||||||
# Screen preview area
|
# Screen preview area
|
||||||
|
|
|
@ -112,7 +112,11 @@ class AppLocation(object):
|
||||||
The directory type you want, for instance the data directory.
|
The directory type you want, for instance the data directory.
|
||||||
"""
|
"""
|
||||||
if dir_type == AppLocation.AppDir:
|
if dir_type == AppLocation.AppDir:
|
||||||
return os.path.abspath(os.path.split(sys.argv[0])[0])
|
if hasattr(sys, u'frozen') and sys.frozen == 1:
|
||||||
|
app_path = os.path.abspath(os.path.split(sys.argv[0])[0])
|
||||||
|
else:
|
||||||
|
app_path = os.path.split(openlp.__file__)[0]
|
||||||
|
return app_path
|
||||||
elif dir_type == AppLocation.ConfigDir:
|
elif dir_type == AppLocation.ConfigDir:
|
||||||
if sys.platform == u'win32':
|
if sys.platform == u'win32':
|
||||||
path = os.path.join(os.getenv(u'APPDATA'), u'openlp')
|
path = os.path.join(os.getenv(u'APPDATA'), u'openlp')
|
||||||
|
|
|
@ -55,7 +55,7 @@ class LanguageManager(object):
|
||||||
if LanguageManager.AutoLanguage:
|
if LanguageManager.AutoLanguage:
|
||||||
language = QtCore.QLocale.system().name()
|
language = QtCore.QLocale.system().name()
|
||||||
lang_path = AppLocation.get_directory(AppLocation.AppDir)
|
lang_path = AppLocation.get_directory(AppLocation.AppDir)
|
||||||
lang_path = os.path.join(lang_path, u'resources', u'i18n')
|
lang_path = os.path.join(lang_path, u'i18n')
|
||||||
app_translator = QtCore.QTranslator()
|
app_translator = QtCore.QTranslator()
|
||||||
if app_translator.load("openlp_" + language, lang_path):
|
if app_translator.load("openlp_" + language, lang_path):
|
||||||
return app_translator
|
return app_translator
|
||||||
|
@ -66,7 +66,7 @@ class LanguageManager(object):
|
||||||
Find all available language files in this OpenLP install
|
Find all available language files in this OpenLP install
|
||||||
"""
|
"""
|
||||||
trans_dir = AppLocation.get_directory(AppLocation.AppDir)
|
trans_dir = AppLocation.get_directory(AppLocation.AppDir)
|
||||||
trans_dir = QtCore.QDir(os.path.join(trans_dir, u'resources', u'i18n'))
|
trans_dir = QtCore.QDir(os.path.join(trans_dir, u'i18n'))
|
||||||
file_names = trans_dir.entryList(QtCore.QStringList("*.qm"),
|
file_names = trans_dir.entryList(QtCore.QStringList("*.qm"),
|
||||||
QtCore.QDir.Files, QtCore.QDir.Name)
|
QtCore.QDir.Files, QtCore.QDir.Name)
|
||||||
for name in file_names:
|
for name in file_names:
|
||||||
|
|
|
@ -678,7 +678,8 @@ class BibleMediaItem(MediaManagerItem):
|
||||||
self.dual_search_results[count].text)
|
self.dual_search_results[count].text)
|
||||||
}
|
}
|
||||||
bible_text = u' %s %d:%d (%s, %s)' % (verse.book.name,
|
bible_text = u' %s %d:%d (%s, %s)' % (verse.book.name,
|
||||||
verse.chapter, verse.verse, version.value, dual_version.value)
|
verse.chapter, verse.verse, version.value,
|
||||||
|
dual_version.value)
|
||||||
else:
|
else:
|
||||||
vdict = {
|
vdict = {
|
||||||
'book': QtCore.QVariant(verse.book.name),
|
'book': QtCore.QVariant(verse.book.name),
|
||||||
|
|
|
@ -89,7 +89,7 @@ class OpenSongBible(BibleDB):
|
||||||
Receiver.send_message(u'openlp_process_events')
|
Receiver.send_message(u'openlp_process_events')
|
||||||
self.wizard.incrementProgressBar(
|
self.wizard.incrementProgressBar(
|
||||||
QtCore.QString('%s %s %s' % (
|
QtCore.QString('%s %s %s' % (
|
||||||
translate('BiblesPlugin.Opensong', 'Importing'), \
|
translate('BiblesPlugin.Opensong', 'Importing'),
|
||||||
db_book.name, chapter.attrib[u'n'])))
|
db_book.name, chapter.attrib[u'n'])))
|
||||||
self.session.commit()
|
self.session.commit()
|
||||||
except IOError:
|
except IOError:
|
||||||
|
|
|
@ -212,7 +212,7 @@ class PresentationMediaItem(MediaManagerItem):
|
||||||
self, translate('PresentationPlugin.MediaItem',
|
self, translate('PresentationPlugin.MediaItem',
|
||||||
'Unsupported File'),
|
'Unsupported File'),
|
||||||
translate('PresentationPlugin.MediaItem',
|
translate('PresentationPlugin.MediaItem',
|
||||||
'This type of presentation is not supported'))
|
'This type of presentation is not supported.'))
|
||||||
continue
|
continue
|
||||||
item_name = QtGui.QListWidgetItem(filename)
|
item_name = QtGui.QListWidgetItem(filename)
|
||||||
item_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(file))
|
item_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(file))
|
||||||
|
|
|
@ -1,119 +1,57 @@
|
||||||
<html>
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||||||
<head>
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
<title>OpenLP Controller</title>
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" dir="ltr">
|
||||||
<script type='text/javascript'>
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
function send_event(eventname, data){
|
<title>OpenLP Remote Controller</title>
|
||||||
var req = new XMLHttpRequest();
|
<script type="text/javascript" src="/files/jquery.js"></script>
|
||||||
req.onreadystatechange = function() {
|
<script type='text/javascript' src="/files/openlp.js"></script>
|
||||||
if(req.readyState==4)
|
<script type='text/javascript' src="/files/init.js"></script>
|
||||||
response(eventname, req);
|
<link rel="stylesheet" href="/files/style.css" type="text/css" />
|
||||||
}
|
|
||||||
var url = '';
|
|
||||||
if(eventname.substr(-8) == '_request')
|
|
||||||
url = 'request';
|
|
||||||
else
|
|
||||||
url = 'send';
|
|
||||||
url += '/' + eventname;
|
|
||||||
if(data!=null)
|
|
||||||
url += '?q=' + escape(data);
|
|
||||||
req.open('GET', url, true);
|
|
||||||
req.send();
|
|
||||||
}
|
|
||||||
function failed_response(eventname, req){
|
|
||||||
switch(eventname){
|
|
||||||
case 'remotes_poll_request':
|
|
||||||
if(req.status==408)
|
|
||||||
send_event("remotes_poll_request");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function response(eventname, req){
|
|
||||||
if(req.status!=200){
|
|
||||||
failed_response(eventname, req);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
text = req.responseText;
|
|
||||||
switch(eventname){
|
|
||||||
case 'servicemanager_list_request':
|
|
||||||
var data = eval('(' + text + ')');
|
|
||||||
var html = '<table>';
|
|
||||||
for(row in data){
|
|
||||||
html += '<tr onclick="send_event('
|
|
||||||
html += "'servicemanager_set_item', " + row + ')"';
|
|
||||||
if(data[row]['selected'])
|
|
||||||
html += ' style="font-weight: bold"';
|
|
||||||
html += '>'
|
|
||||||
html += '<td>' + (parseInt(row)+1) + '</td>'
|
|
||||||
html += '<td>' + data[row]['title'] + '</td>'
|
|
||||||
html += '<td>' + data[row]['plugin'] + '</td>'
|
|
||||||
html += '<td>' + data[row]['notes'] + '</td>'
|
|
||||||
html += '</tr>';
|
|
||||||
}
|
|
||||||
html += '</table>';
|
|
||||||
document.getElementById('service').innerHTML = html;
|
|
||||||
break;
|
|
||||||
case 'slidecontroller_live_text_request':
|
|
||||||
var data = eval('(' + text + ')');
|
|
||||||
var html = '<table>';
|
|
||||||
for(row in data){
|
|
||||||
html += '<tr onclick="send_event('
|
|
||||||
html += "'slidecontroller_live_set', " + row + ')"';
|
|
||||||
if(data[row]['selected'])
|
|
||||||
html += ' style="font-weight: bold"';
|
|
||||||
html += '>';
|
|
||||||
html += '<td>' + data[row]['tag'] + '</td>';
|
|
||||||
html += '<td>' + data[row]['text'].replace(/\n/g, '<br>');
|
|
||||||
html += '</td></tr>';
|
|
||||||
}
|
|
||||||
html += '</table>';
|
|
||||||
document.getElementById('currentitem').innerHTML = html;
|
|
||||||
break;
|
|
||||||
case 'remotes_poll_request':
|
|
||||||
send_event("remotes_poll_request");
|
|
||||||
send_event("servicemanager_list_request");
|
|
||||||
send_event("slidecontroller_live_text_request");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
send_event("servicemanager_list_request");
|
|
||||||
send_event("slidecontroller_live_text_request");
|
|
||||||
send_event("remotes_poll_request");
|
|
||||||
</script>
|
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<h1>OpenLP Controller</h1>
|
<h1>OpenLP Controller</h1>
|
||||||
<input type='button' value='<- Previous Slide'
|
<p>Quick Links: <a href="#service-manager">Service Manager</a> | <a href="#slide-controller">Slide Controller</a> | <a href="#miscellaneous">Miscellaneous</a></p>
|
||||||
onclick='send_event("slidecontroller_live_previous");' />
|
<h2 id="service-manager">Service Manager</h2>
|
||||||
<input type='button' value='Next Slide ->'
|
<div id="service"></div>
|
||||||
onclick='send_event("slidecontroller_live_next");' />
|
<p><em>(Click service item to go live.)</em></p>
|
||||||
<br/>
|
<fieldset>
|
||||||
<input type='button' value='<- Previous Item'
|
<legend>Controls</legend>
|
||||||
onclick='send_event("servicemanager_previous_item");' />
|
<div id="service-buttons">
|
||||||
<input type='button' value='Next Item ->'
|
<input type="button" value="Refresh Service" id="servicemanager_list_request" />
|
||||||
onclick='send_event("servicemanager_next_item");' />
|
</div>
|
||||||
<br/>
|
<div id="item-buttons">
|
||||||
<input type='button' value='Blank'
|
<input type="button" value="<- Previous Item" id="servicemanager_previous_item" />
|
||||||
onclick='send_event("slidecontroller_live_blank");' />
|
<input type="button" value="Next Item ->" id="servicemanager_next_item" />
|
||||||
<input type='button' value='Unblank'
|
</div>
|
||||||
onclick='send_event("slidecontroller_live_unblank");' />
|
</fieldset>
|
||||||
<br/>
|
|
||||||
<label>Alert text</label><input id='alert' type='text' />
|
|
||||||
<input type='button' value='Send'
|
|
||||||
onclick='send_event("alerts_text",
|
|
||||||
document.getElementById("alert").value);' />
|
|
||||||
<hr>
|
<hr>
|
||||||
<input type='button' value='Order of service'
|
<h2 id="slide-controller">Slide Controller</h2>
|
||||||
onclick='send_event("servicemanager_list_request");'>
|
<div id="current-item"></div>
|
||||||
<i>(Click service item to go live.)</i>
|
<p><em>(Click verse to display.)</em></p>
|
||||||
<div id='service'></div>
|
<fieldset>
|
||||||
|
<legend>Controls</legend>
|
||||||
|
<div id="item-buttons">
|
||||||
|
<input type="button" value="Refresh Item" id="slidecontroller_live_text_request" />
|
||||||
|
</div>
|
||||||
|
<div id="slide-buttons">
|
||||||
|
<input type="button" value="<- Previous Slide" id="slidecontroller_live_previous" />
|
||||||
|
<input type="button" value="Next Slide ->" id="slidecontroller_live_next" />
|
||||||
|
</div>
|
||||||
|
</fieldset>
|
||||||
<hr>
|
<hr>
|
||||||
<input type='button' value='Current item'
|
<h2 id="miscellaneous">Miscellaneous</h2>
|
||||||
onclick='send_event("slidecontroller_live_text_request");'>
|
<div id="display-buttons">
|
||||||
<i>(Click verse to display.)</i>
|
<input type="button" value="Blank" id="slidecontroller_live_blank" />
|
||||||
<div id='currentitem'></div>
|
<input type="button" value="Unblank" id="slidecontroller_live_unblank" />
|
||||||
|
</div>
|
||||||
|
<div id="alert-details">
|
||||||
|
<label for="alert-text">Alert text:</label>
|
||||||
|
<input type="text" id="alert-text" />
|
||||||
|
<input type="button" value="Send" id="alert-send" />
|
||||||
|
</div>
|
||||||
<hr>
|
<hr>
|
||||||
<a href="http://www.openlp.org/">OpenLP website</a>
|
<a href="http://openlp.org/">OpenLP website</a>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
* OpenLP - Open Source Lyrics Projection *
|
||||||
|
* ------------------------------------------------------------------------- *
|
||||||
|
* Copyright (c) 2008-2010 Raoul Snyman *
|
||||||
|
* Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael *
|
||||||
|
* Gorven, Scott Guerrieri, Christian Richter, Maikel Stuivenberg, Martin *
|
||||||
|
* Thompson, Jon Tibble, Carsten Tinggaard *
|
||||||
|
* ------------------------------------------------------------------------- *
|
||||||
|
* This program is free software; you can redistribute it and/or modify it *
|
||||||
|
* under the terms of the GNU General Public License as published by the *
|
||||||
|
* Free Software Foundation; version 2 of the License. *
|
||||||
|
* *
|
||||||
|
* This program is distributed in the hope that it will be useful, but *
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General *
|
||||||
|
* Public License for more details. *
|
||||||
|
* *
|
||||||
|
* You should have received a copy of the GNU General Public License along *
|
||||||
|
* with this program; if not, write to the Free Software Foundation, Inc., *
|
||||||
|
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* init.js - In certain browsers (yes, IE, I'm looking at you!), DocumentReady
|
||||||
|
* JavaScript functions can only be run very last on the page. This file is the
|
||||||
|
* last JavaScript file to be included on the page, and provides a work-around
|
||||||
|
* for this bug in certain browsers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
$(document).ready(function () {
|
||||||
|
OpenLP.Events.init();
|
||||||
|
});
|
|
@ -0,0 +1,154 @@
|
||||||
|
/*!
|
||||||
|
* jQuery JavaScript Library v1.4.2
|
||||||
|
* http://jquery.com/
|
||||||
|
*
|
||||||
|
* Copyright 2010, John Resig
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* Includes Sizzle.js
|
||||||
|
* http://sizzlejs.com/
|
||||||
|
* Copyright 2010, The Dojo Foundation
|
||||||
|
* Released under the MIT, BSD, and GPL Licenses.
|
||||||
|
*
|
||||||
|
* Date: Sat Feb 13 22:33:48 2010 -0500
|
||||||
|
*/
|
||||||
|
(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o<i;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,j);return a}return i?
|
||||||
|
e(a[0],b):w}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function na(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function oa(a){var b,d=[],f=[],e=arguments,j,i,o,k,n,r;i=c.data(this,"events");if(!(a.liveFired===this||!i||!i.live||a.button&&a.type==="click")){a.liveFired=this;var u=i.live.slice(0);for(k=0;k<u.length;k++){i=u[k];i.origType.replace(O,"")===a.type?f.push(i.selector):u.splice(k--,1)}j=c(a.target).closest(f,a.currentTarget);n=0;for(r=
|
||||||
|
j.length;n<r;n++)for(k=0;k<u.length;k++){i=u[k];if(j[n].selector===i.selector){o=j[n].elem;f=null;if(i.preType==="mouseenter"||i.preType==="mouseleave")f=c(a.relatedTarget).closest(i.selector)[0];if(!f||f!==o)d.push({elem:o,handleObj:i})}}n=0;for(r=d.length;n<r;n++){j=d[n];a.currentTarget=j.elem;a.data=j.handleObj.data;a.handleObj=j.handleObj;if(j.handleObj.origHandler.apply(j.elem,e)===false){b=false;break}}return b}}function pa(a,b){return"live."+(a&&a!=="*"?a+".":"")+b.replace(/\./g,"`").replace(/ /g,
|
||||||
|
"&")}function qa(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function ra(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var j in f)for(var i in f[j])c.event.add(this,j,f[j][i],f[j][i].data)}}})}function sa(a,b,d){var f,e,j;b=b&&b[0]?b[0].ownerDocument||b[0]:s;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===s&&!ta.test(a[0])&&(c.support.checkClone||!ua.test(a[0]))){e=
|
||||||
|
true;if(j=c.fragments[a[0]])if(j!==1)f=j}if(!f){f=b.createDocumentFragment();c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=j?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(va.concat.apply([],va.slice(0,b)),function(){d[this]=a});return d}function wa(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Ra=A.jQuery,Sa=A.$,s=A.document,T,Ta=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/,
|
||||||
|
Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&&
|
||||||
|
(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this,
|
||||||
|
a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b===
|
||||||
|
"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this,
|
||||||
|
function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(j in e){i=a[j];o=e[j];if(a!==o)if(f&&o&&(c.isPlainObject(o)||c.isArray(o))){i=i&&(c.isPlainObject(i)||
|
||||||
|
c.isArray(i))?i:c.isArray(o)?[]:{};a[j]=c.extend(f,i,o)}else if(o!==w)a[j]=o}return a};c.extend({noConflict:function(a){A.$=Sa;if(a)A.jQuery=Ra;return c},isReady:false,ready:function(){if(!c.isReady){if(!s.body)return setTimeout(c.ready,13);c.isReady=true;if(Q){for(var a,b=0;a=Q[b++];)a.call(s,c);Q=null}c.fn.triggerHandler&&c(s).triggerHandler("ready")}},bindReady:function(){if(!xa){xa=true;if(s.readyState==="complete")return c.ready();if(s.addEventListener){s.addEventListener("DOMContentLoaded",
|
||||||
|
L,false);A.addEventListener("load",c.ready,false)}else if(s.attachEvent){s.attachEvent("onreadystatechange",L);A.attachEvent("onload",c.ready);var a=false;try{a=A.frameElement==null}catch(b){}s.documentElement.doScroll&&a&&ma()}}},isFunction:function(a){return $.call(a)==="[object Function]"},isArray:function(a){return $.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||$.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,"constructor")&&!aa.call(a.constructor.prototype,
|
||||||
|
"isPrototypeOf"))return false;var b;for(b in a);return b===w||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false;return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!=="string"||!a)return null;a=c.trim(a);if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return A.JSON&&A.JSON.parse?A.JSON.parse(a):(new Function("return "+
|
||||||
|
a))();else c.error("Invalid JSON: "+a)},noop:function(){},globalEval:function(a){if(a&&Va.test(a)){var b=s.getElementsByTagName("head")[0]||s.documentElement,d=s.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(s.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,j=a.length,i=j===w||c.isFunction(a);if(d)if(i)for(f in a){if(b.apply(a[f],
|
||||||
|
d)===false)break}else for(;e<j;){if(b.apply(a[e++],d)===false)break}else if(i)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=a[0];e<j&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Wa,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]===
|
||||||
|
a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==w;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,j=a.length;e<j;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,j=0,i=a.length;j<i;j++){e=b(a[j],j,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b==="string"){d=a;a=d[b];b=w}else if(b&&
|
||||||
|
!c.isFunction(b)){d=b;b=w}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}},browser:{}});P=c.uaMatch(P);if(P.browser){c.browser[P.browser]=true;c.browser.version=P.version}if(c.browser.webkit)c.browser.safari=
|
||||||
|
true;if(ya)c.inArray=function(a,b){return ya.call(b,a)};T=c(s);if(s.addEventListener)L=function(){s.removeEventListener("DOMContentLoaded",L,false);c.ready()};else if(s.attachEvent)L=function(){if(s.readyState==="complete"){s.detachEvent("onreadystatechange",L);c.ready()}};(function(){c.support={};var a=s.documentElement,b=s.createElement("script"),d=s.createElement("div"),f="script"+J();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
|
||||||
|
var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected,
|
||||||
|
parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent=
|
||||||
|
false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n=
|
||||||
|
s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true,
|
||||||
|
applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando];
|
||||||
|
else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this,
|
||||||
|
a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===
|
||||||
|
w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i,
|
||||||
|
cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className){for(var j=" "+e.className+" ",
|
||||||
|
i=e.className,o=0,k=b.length;o<k;o++)if(j.indexOf(" "+b[o]+" ")<0)i+=" "+b[o];e.className=c.trim(i)}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(k){var n=c(this);n.removeClass(a.call(this,k,n.attr("class")))});if(a&&typeof a==="string"||a===w)for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var j=(" "+e.className+" ").replace(Aa," "),i=0,o=b.length;i<o;i++)j=j.replace(" "+b[i]+" ",
|
||||||
|
" ");e.className=c.trim(j)}else e.className=""}return this},toggleClass:function(a,b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var j=c(this);j.toggleClass(a.call(this,e,j.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,j=0,i=c(this),o=b,k=a.split(ca);e=k[j++];){o=f?o:!i.hasClass(e);i[o?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className=
|
||||||
|
this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(Aa," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j<d;j++){var i=
|
||||||
|
e[j];if(i.selected){a=c(i).val();if(b)return a;f.push(a)}}return f}if(Ba.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Za,"")}return w}var o=c.isFunction(a);return this.each(function(k){var n=c(this),r=a;if(this.nodeType===1){if(o)r=a.call(this,k,n.val());if(typeof r==="number")r+="";if(c.isArray(r)&&Ba.test(this.type))this.checked=c.inArray(n.val(),r)>=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected=
|
||||||
|
c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");
|
||||||
|
a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g,
|
||||||
|
function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split(".");
|
||||||
|
k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a),
|
||||||
|
C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B<r.length;B++){u=r[B];if(d.guid===u.guid){if(i||k.test(u.namespace)){f==null&&r.splice(B--,1);n.remove&&n.remove.call(a,u)}if(f!=
|
||||||
|
null)break}}if(r.length===0||f!=null&&r.length===1){if(!n.teardown||n.teardown.call(a,o)===false)Ca(a,e,z.handle);delete C[e]}}else for(var B=0;B<r.length;B++){u=r[B];if(i||k.test(u.namespace)){c.event.remove(a,n,u.handler,B);r.splice(B--,1)}}}if(c.isEmptyObject(C)){if(b=z.handle)b.elem=null;delete z.events;delete z.handle;c.isEmptyObject(z)&&c.removeData(a)}}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type=
|
||||||
|
e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&&
|
||||||
|
f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;
|
||||||
|
if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e<j;e++){var i=d[e];if(b||f.test(i.namespace)){a.handler=i.handler;a.data=i.data;a.handleObj=i;i=i.handler.apply(this,arguments);if(i!==w){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
|
||||||
|
fix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||s;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=s.documentElement;d=s.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
|
||||||
|
d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==w)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,a.origType,c.extend({},a,{handler:oa}))},remove:function(a){var b=true,d=a.origType.replace(O,"");c.each(c.data(this,
|
||||||
|
"events").live||[],function(){if(d===this.origType.replace(O,""))return b=false});b&&c.event.remove(this,a.origType,oa)}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};var Ca=s.removeEventListener?function(a,b,d){a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=
|
||||||
|
a;this.type=a.type}else this.type=a;this.timeStamp=J();this[G]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y,
|
||||||
|
isImmediatePropagationStopped:Y};var Da=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},Ea=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ea:Da,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ea:Da)}}});if(!c.support.submitBubbles)c.event.special.submit=
|
||||||
|
{setup:function(){if(this.nodeName.toLowerCase()!=="form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length)return na("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13)return na("submit",this,arguments)})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};
|
||||||
|
if(!c.support.changeBubbles){var da=/textarea|input|select/i,ea,Fa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",
|
||||||
|
e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,
|
||||||
|
"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a,
|
||||||
|
d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j<o;j++)c.event.add(this[j],d,i,f)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&
|
||||||
|
!a.preventDefault)for(var d in a)this.unbind(d,a[d]);else{d=0;for(var f=this.length;d<f;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,f){return this.live(b,d,f,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}},
|
||||||
|
toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Ga={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,f,e,j){var i,o=0,k,n,r=j||this.selector,
|
||||||
|
u=j?this:c(this.context);if(c.isFunction(f)){e=f;f=w}for(d=(d||"").split(" ");(i=d[o++])!=null;){j=O.exec(i);k="";if(j){k=j[0];i=i.replace(O,"")}if(i==="hover")d.push("mouseenter"+k,"mouseleave"+k);else{n=i;if(i==="focus"||i==="blur"){d.push(Ga[i]+k);i+=k}else i=(Ga[i]||i)+k;b==="live"?u.each(function(){c.event.add(this,pa(i,r),{data:f,selector:r,handler:e,origType:i,origHandler:e,preType:n})}):u.unbind(pa(i,r),e)}}return this}});c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),
|
||||||
|
function(a,b){c.fn[b]=function(d){return d?this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});A.attachEvent&&!A.addEventListener&&A.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});(function(){function a(g){for(var h="",l,m=0;g[m];m++){l=g[m];if(l.nodeType===3||l.nodeType===4)h+=l.nodeValue;else if(l.nodeType!==8)h+=a(l.childNodes)}return h}function b(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];
|
||||||
|
if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1&&!p){t.sizcache=l;t.sizset=q}if(t.nodeName.toLowerCase()===h){y=t;break}t=t[g]}m[q]=y}}}function d(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1){if(!p){t.sizcache=l;t.sizset=q}if(typeof h!=="string"){if(t===h){y=true;break}}else if(k.filter(h,[t]).length>0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
|
||||||
|
e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift();
|
||||||
|
t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D||
|
||||||
|
g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};k.matches=function(g,h){return k(g,null,null,h)};k.find=function(g,h,l){var m,q;if(!g)return[];
|
||||||
|
for(var p=0,v=n.order.length;p<v;p++){var t=n.order[p];if(q=n.leftMatch[t].exec(g)){var y=q[1];q.splice(1,1);if(y.substr(y.length-1)!=="\\"){q[1]=(q[1]||"").replace(/\\/g,"");m=n.find[t](q,h,l);if(m!=null){g=g.replace(n.match[t],"");break}}}}m||(m=h.getElementsByTagName("*"));return{set:m,expr:g}};k.filter=function(g,h,l,m){for(var q=g,p=[],v=h,t,y,S=h&&h[0]&&x(h[0]);g&&h.length;){for(var H in n.filter)if((t=n.leftMatch[H].exec(g))!=null&&t[2]){var M=n.filter[H],I,D;D=t[1];y=false;t.splice(1,1);if(D.substr(D.length-
|
||||||
|
1)!=="\\"){if(v===p)p=[];if(n.preFilter[H])if(t=n.preFilter[H](t,v,l,p,m,S)){if(t===true)continue}else y=I=true;if(t)for(var U=0;(D=v[U])!=null;U++)if(D){I=M(D,t,U,v);var Ha=m^!!I;if(l&&I!=null)if(Ha)y=true;else v[U]=false;else if(Ha){p.push(D);y=true}}if(I!==w){l||(v=p);g=g.replace(n.match[H],"");if(!y)return[];break}}}if(g===q)if(y==null)k.error(g);else break;q=g}return v};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var n=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
|
||||||
|
CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},
|
||||||
|
relative:{"+":function(g,h){var l=typeof h==="string",m=l&&!/\W/.test(h);l=l&&!m;if(m)h=h.toLowerCase();m=0;for(var q=g.length,p;m<q;m++)if(p=g[m]){for(;(p=p.previousSibling)&&p.nodeType!==1;);g[m]=l||p&&p.nodeName.toLowerCase()===h?p||false:p===h}l&&k.filter(h,g,true)},">":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m<q;m++){var p=g[m];if(p){l=p.parentNode;g[m]=l.nodeName.toLowerCase()===h?l:false}}}else{m=0;for(q=g.length;m<q;m++)if(p=g[m])g[m]=
|
||||||
|
l?p.parentNode:p.parentNode===h;l&&k.filter(h,g,true)}},"":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("parentNode",h,m,g,p,l)},"~":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("previousSibling",h,m,g,p,l)}},find:{ID:function(g,h,l){if(typeof h.getElementById!=="undefined"&&!l)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var l=[];
|
||||||
|
h=h.getElementsByName(g[1]);for(var m=0,q=h.length;m<q;m++)h[m].getAttribute("name")===g[1]&&l.push(h[m]);return l.length===0?null:l}},TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,l,m,q,p){g=" "+g[1].replace(/\\/g,"")+" ";if(p)return g;p=0;for(var v;(v=h[p])!=null;p++)if(v)if(q^(v.className&&(" "+v.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},
|
||||||
|
CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m,
|
||||||
|
g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},
|
||||||
|
text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},
|
||||||
|
setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return h<l[3]-0},gt:function(g,h,l){return h>l[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h=
|
||||||
|
h[3];l=0;for(m=h.length;l<m;l++)if(h[l]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+q)},CHILD:function(g,h){var l=h[1],m=g;switch(l){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(l==="first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":l=h[2];var q=h[3];if(l===1&&q===0)return true;h=h[0];var p=g.parentNode;if(p&&(p.sizcache!==h||!g.nodeIndex)){var v=0;for(m=p.firstChild;m;m=
|
||||||
|
m.nextSibling)if(m.nodeType===1)m.nodeIndex=++v;p.sizcache=h}g=g.nodeIndex-q;return l===0?g===0:g%l===0&&g/l>=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m===
|
||||||
|
"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g,
|
||||||
|
h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l<m;l++)h.push(g[l]);else for(l=0;g[l];l++)h.push(g[l]);return h}}var B;if(s.documentElement.compareDocumentPosition)B=function(g,h){if(!g.compareDocumentPosition||
|
||||||
|
!h.compareDocumentPosition){if(g==h)i=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===h?0:1;if(g===0)i=true;return g};else if("sourceIndex"in s.documentElement)B=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)i=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)i=true;return g};else if(s.createRange)B=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)i=true;return g.ownerDocument?-1:1}var l=g.ownerDocument.createRange(),m=
|
||||||
|
h.ownerDocument.createRange();l.setStart(g,0);l.setEnd(g,0);m.setStart(h,0);m.setEnd(h,0);g=l.compareBoundaryPoints(Range.START_TO_END,m);if(g===0)i=true;return g};(function(){var g=s.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&&
|
||||||
|
q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML="<a href='#'></a>";
|
||||||
|
if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}();
|
||||||
|
(function(){var g=s.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}:
|
||||||
|
function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q<p;q++)k(g,h[q],l);return k.filter(m,l)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=a;c.isXMLDoc=x;c.contains=E})();var eb=/Until$/,fb=/^(?:parents|prevUntil|prevAll)/,
|
||||||
|
gb=/,/;R=Array.prototype.slice;var Ia=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,j){return!!b.call(e,j,e)===d});else if(b.nodeType)return c.grep(a,function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Ua.test(b))return c.filter(b,f,!d);else b=c.filter(b,f)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length;
|
||||||
|
c.find(a,this[f],b);if(f>0)for(var j=d;j<b.length;j++)for(var i=0;i<d;i++)if(b[i]===b[j]){b.splice(j--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Ia(this,a,false),"not",a)},filter:function(a){return this.pushStack(Ia(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j=
|
||||||
|
{},i;if(f&&a.length){e=0;for(var o=a.length;e<o;e++){i=a[e];j[i]||(j[i]=c.expr.match.POS.test(i)?c(i,b||this.context):i)}for(;f&&f.ownerDocument&&f!==b;){for(i in j){e=j[i];if(e.jquery?e.index(f)>-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a===
|
||||||
|
"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",
|
||||||
|
d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?
|
||||||
|
a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType===
|
||||||
|
1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/<tbody/i,jb=/<|&#?\w+;/,ta=/<script|<object|<embed|<option|<style/i,ua=/checked\s*(?:[^=]|=\s*.checked.)/i,Ma=function(a,b,d){return hb.test(d)?
|
||||||
|
a:b+"></"+d+">"},F={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
|
||||||
|
c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
|
||||||
|
wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
|
||||||
|
prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
|
||||||
|
this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
|
||||||
|
return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja,
|
||||||
|
""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}}else c.isFunction(a)?this.each(function(e){var j=c(this),i=j.html();j.empty().append(function(){return a.call(this,e,i)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&
|
||||||
|
this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),f=d.html();d.replaceWith(a.call(this,b,f))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(u){return c.nodeName(u,"table")?u.getElementsByTagName("tbody")[0]||
|
||||||
|
u.appendChild(u.ownerDocument.createElement("tbody")):u}var e,j,i=a[0],o=[],k;if(!c.support.checkClone&&arguments.length===3&&typeof i==="string"&&ua.test(i))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(i))return this.each(function(u){var z=c(this);a[0]=i.call(this,u,b?z.html():w);z.domManip(a,b,d)});if(this[0]){e=i&&i.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:sa(a,this,o);k=e.fragment;if(j=k.childNodes.length===
|
||||||
|
1?(k=k.firstChild):k.firstChild){b=b&&c.nodeName(j,"tr");for(var n=0,r=this.length;n<r;n++)d.call(b?f(this[n],j):this[n],n>0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]);
|
||||||
|
return this}else{e=0;for(var j=d.length;e<j;e++){var i=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["",
|
||||||
|
""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]==="<table>"&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e=
|
||||||
|
c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]?
|
||||||
|
c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja=
|
||||||
|
function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter=
|
||||||
|
Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a,
|
||||||
|
"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f=
|
||||||
|
a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=
|
||||||
|
a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=/<script(.|\s)*?\/script>/gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!==
|
||||||
|
"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("<div />").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this},
|
||||||
|
serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),
|
||||||
|
function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,
|
||||||
|
global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&&
|
||||||
|
e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)?
|
||||||
|
"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache===
|
||||||
|
false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B=
|
||||||
|
false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since",
|
||||||
|
c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E||
|
||||||
|
d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x);
|
||||||
|
g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===
|
||||||
|
1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b===
|
||||||
|
"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional;
|
||||||
|
if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");
|
||||||
|
this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(la[d])f=la[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a||a===0)return this.animate(K("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a],
|
||||||
|
"olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(K("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)},
|
||||||
|
animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var j=c.extend({},e),i,o=this.nodeType===1&&c(this).is(":hidden"),k=this;for(i in a){var n=i.replace(ia,ja);if(i!==n){a[n]=a[i];delete a[i];i=n}if(a[i]==="hide"&&o||a[i]==="show"&&!o)return j.complete.call(this);if((i==="height"||i==="width")&&this.style){j.display=c.css(this,"display");j.overflow=this.style.overflow}if(c.isArray(a[i])){(j.specialEasing=
|
||||||
|
j.specialEasing||{})[i]=a[i][1];a[i]=a[i][0]}}if(j.overflow!=null)this.style.overflow="hidden";j.curAnim=c.extend({},a);c.each(a,function(r,u){var z=new c.fx(k,j,r);if(Ab.test(u))z[u==="toggle"?o?"show":"hide":u](a);else{var C=Bb.exec(u),B=z.cur(true)||0;if(C){u=parseFloat(C[2]);var E=C[3]||"px";if(E!=="px"){k.style[r]=(u||1)+E;B=(u||1)/z.cur(true)*B;k.style[r]=B+E}if(C[1])u=(C[1]==="-="?-1:1)*u+B;z.custom(B,u,E)}else z.custom(B,u,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);
|
||||||
|
this.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration===
|
||||||
|
"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||
|
||||||
|
c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;
|
||||||
|
this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=
|
||||||
|
this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem,
|
||||||
|
e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||
|
||||||
|
c.fx.stop()},stop:function(){clearInterval(W);W=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in s.documentElement?
|
||||||
|
function(a){var b=this[0];if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b=
|
||||||
|
this[0];if(a)return this.each(function(r){c.offset.setOffset(this,a,r)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=b,e=b.ownerDocument,j,i=e.documentElement,o=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var k=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==o&&b!==i;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;j=e?e.getComputedStyle(b,null):b.currentStyle;
|
||||||
|
k-=b.scrollTop;n-=b.scrollLeft;if(b===d){k+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&j.overflow!=="visible"){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=j}if(f.position==="relative"||f.position==="static"){k+=o.offsetTop;n+=o.offsetLeft}if(c.offset.supportsFixedPosition&&
|
||||||
|
f.position==="fixed"){k+=Math.max(i.scrollTop,o.scrollTop);n+=Math.max(i.scrollLeft,o.scrollLeft)}return{top:k,left:n}};c.offset={initialize:function(){var a=s.body,b=s.createElement("div"),d,f,e,j=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
|
||||||
|
a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b);
|
||||||
|
c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a,
|
||||||
|
d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top-
|
||||||
|
f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset":
|
||||||
|
"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in
|
||||||
|
e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window);
|
|
@ -0,0 +1,239 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
* OpenLP - Open Source Lyrics Projection *
|
||||||
|
* ------------------------------------------------------------------------- *
|
||||||
|
* Copyright (c) 2008-2010 Raoul Snyman *
|
||||||
|
* Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael *
|
||||||
|
* Gorven, Scott Guerrieri, Christian Richter, Maikel Stuivenberg, Martin *
|
||||||
|
* Thompson, Jon Tibble, Carsten Tinggaard *
|
||||||
|
* ------------------------------------------------------------------------- *
|
||||||
|
* This program is free software; you can redistribute it and/or modify it *
|
||||||
|
* under the terms of the GNU General Public License as published by the *
|
||||||
|
* Free Software Foundation; version 2 of the License. *
|
||||||
|
* *
|
||||||
|
* This program is distributed in the hope that it will be useful, but *
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General *
|
||||||
|
* Public License for more details. *
|
||||||
|
* *
|
||||||
|
* You should have received a copy of the GNU General Public License along *
|
||||||
|
* with this program; if not, write to the Free Software Foundation, Inc., *
|
||||||
|
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
window["OpenLP"] = {
|
||||||
|
Namespace: {
|
||||||
|
/**
|
||||||
|
* Create a Javascript namespace.
|
||||||
|
* Based on: http://code.google.com/p/namespacedotjs/
|
||||||
|
* Idea behind this is to created nested namespaces that are not ugly.
|
||||||
|
*/
|
||||||
|
create: function (name, attributes) {
|
||||||
|
var parts = name.split('.'),
|
||||||
|
ns = window,
|
||||||
|
i = 0;
|
||||||
|
// find the deepest part of the namespace
|
||||||
|
// that is already defined
|
||||||
|
for(; i < parts.length && parts[i] in ns; i++)
|
||||||
|
ns = ns[parts[i]];
|
||||||
|
// initialize any remaining parts of the namespace
|
||||||
|
for(; i < parts.length; i++)
|
||||||
|
ns = ns[parts[i]] = {};
|
||||||
|
// copy the attributes into the namespace
|
||||||
|
for (var attr in attributes)
|
||||||
|
ns[attr] = attributes[attr];
|
||||||
|
},
|
||||||
|
exists: function (namespace) {
|
||||||
|
/**
|
||||||
|
* Determine the namespace of a page
|
||||||
|
*/
|
||||||
|
page_namespace = $ScribeEngine.Namespace.get_page_namespace();
|
||||||
|
return (namespace == page_namespace);
|
||||||
|
},
|
||||||
|
get_page_namespace: function () {
|
||||||
|
return $("#content > h2").attr("id");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Array.prototype.append = function (elem) {
|
||||||
|
this[this.length] = elem;
|
||||||
|
}
|
||||||
|
|
||||||
|
OpenLP.Namespace.create("OpenLP.Events", {
|
||||||
|
// Local variables
|
||||||
|
onload_functions: Array(),
|
||||||
|
// Functions
|
||||||
|
bindLoad: function (func) {
|
||||||
|
this.onload_functions.append(func);
|
||||||
|
},
|
||||||
|
bindClick: function (selector, func) {
|
||||||
|
$(selector).bind("click", func);
|
||||||
|
},
|
||||||
|
bindChange: function (selector, func) {
|
||||||
|
$(selector).bind("change", func);
|
||||||
|
},
|
||||||
|
bindSubmit: function (selector, func) {
|
||||||
|
$(selector).bind("submit", func);
|
||||||
|
},
|
||||||
|
bindBlur: function (selector, func) {
|
||||||
|
$(selector).bind("blur", func);
|
||||||
|
},
|
||||||
|
bindPaste: function (selector, func) {
|
||||||
|
$(selector).bind("paste", func);
|
||||||
|
},
|
||||||
|
bindKeyUp: function (selector, func) {
|
||||||
|
$(selector).bind("keyup", func);
|
||||||
|
},
|
||||||
|
bindKeyDown: function (selector, func) {
|
||||||
|
$(selector).bind("keydown", func);
|
||||||
|
},
|
||||||
|
bindKeyPress: function (selector, func) {
|
||||||
|
$(selector).bind("keypress", func);
|
||||||
|
},
|
||||||
|
bindMouseEnter: function (selector, func) {
|
||||||
|
$(selector).bind("mouseenter", func);
|
||||||
|
},
|
||||||
|
bindMouseLeave: function (selector, func) {
|
||||||
|
$(selector).bind("mouseleave", func);
|
||||||
|
},
|
||||||
|
liveClick: function (selector, func) {
|
||||||
|
$(selector).live("click", func);
|
||||||
|
},
|
||||||
|
getElement: function(event) {
|
||||||
|
var targ;
|
||||||
|
if (!event) {
|
||||||
|
var event = window.event;
|
||||||
|
}
|
||||||
|
if (event.target) {
|
||||||
|
targ = event.target;
|
||||||
|
}
|
||||||
|
else if (event.srcElement) {
|
||||||
|
targ = event.srcElement;
|
||||||
|
}
|
||||||
|
if (targ.nodeType == 3) {
|
||||||
|
// defeat Safari bug
|
||||||
|
targ = targ.parentNode;
|
||||||
|
}
|
||||||
|
return $(targ);
|
||||||
|
},
|
||||||
|
init: function () {
|
||||||
|
for (idx in this.onload_functions) {
|
||||||
|
func = this.onload_functions[idx];
|
||||||
|
func();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
OpenLP.Namespace.create("OpenLP.Remote", {
|
||||||
|
sendEvent: function (eventName, eventData)
|
||||||
|
{
|
||||||
|
var url = "/";
|
||||||
|
if (eventName.substr(-8) == "_request")
|
||||||
|
{
|
||||||
|
url += "request";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
url += "send";
|
||||||
|
}
|
||||||
|
url += "/" + eventName;
|
||||||
|
var args = {};
|
||||||
|
if (eventData != null && eventData != "")
|
||||||
|
{
|
||||||
|
args.q = escape(eventData);
|
||||||
|
}
|
||||||
|
$.ajax({
|
||||||
|
url: url,
|
||||||
|
dataType: "json",
|
||||||
|
data: args,
|
||||||
|
success: function (data)
|
||||||
|
{
|
||||||
|
OpenLP.Remote.handleEvent(eventName, data);
|
||||||
|
},
|
||||||
|
error: function (xhr, textStatus, errorThrown)
|
||||||
|
{
|
||||||
|
if (eventName == "remotes_poll_request")
|
||||||
|
{
|
||||||
|
OpenLP.Remote.handleEvent("remotes_poll_request");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
handleEvent: function (eventName, eventData)
|
||||||
|
{
|
||||||
|
switch (eventName)
|
||||||
|
{
|
||||||
|
case "servicemanager_list_request":
|
||||||
|
var table = $("<table>");
|
||||||
|
$.each(eventData, function (row, item) {
|
||||||
|
var trow = $("<tr>")
|
||||||
|
.attr("value", parseInt(row))
|
||||||
|
.click(OpenLP.Remote.sendSetItem);
|
||||||
|
if (item["selected"])
|
||||||
|
{
|
||||||
|
trow.addClass("selected");
|
||||||
|
}
|
||||||
|
trow.append($("<td>").text(parseInt(row) + 1));
|
||||||
|
trow.append($("<td>").text(item["title"]));
|
||||||
|
trow.append($("<td>").text(item["plugin"]));
|
||||||
|
trow.append($("<td>").text("Notes: " + item["notes"]));
|
||||||
|
table.append(trow);
|
||||||
|
});
|
||||||
|
$("#service").html(table);
|
||||||
|
break;
|
||||||
|
case "slidecontroller_live_text_request":
|
||||||
|
var table = $("<table>");
|
||||||
|
$.each(eventData, function (row, item) {
|
||||||
|
var trow = $("<tr>")
|
||||||
|
.attr("value", parseInt(row))
|
||||||
|
.click(OpenLP.Remote.sendLiveSet);
|
||||||
|
if (item["selected"])
|
||||||
|
{
|
||||||
|
trow.addClass("selected");
|
||||||
|
}
|
||||||
|
trow.append($("<td>").text(item["tag"]));
|
||||||
|
trow.append($("<td>").html(item["text"] ? item["text"].replace(/\\n/g, "<br />") : ""));
|
||||||
|
table.append(trow);
|
||||||
|
});
|
||||||
|
$("#current-item").html(table);
|
||||||
|
break;
|
||||||
|
case "remotes_poll_request":
|
||||||
|
OpenLP.Remote.sendEvent("remotes_poll_request");
|
||||||
|
OpenLP.Remote.sendEvent("servicemanager_list_request");
|
||||||
|
OpenLP.Remote.sendEvent("slidecontroller_live_text_request");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
sendLiveSet: function (e)
|
||||||
|
{
|
||||||
|
var id = OpenLP.Events.getElement(e).parent().attr("value");
|
||||||
|
OpenLP.Remote.sendEvent("slidecontroller_live_set", id);
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
sendSetItem: function (e)
|
||||||
|
{
|
||||||
|
var id = OpenLP.Events.getElement(e).parent().attr("value");
|
||||||
|
OpenLP.Remote.sendEvent("servicemanager_set_item", id);
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
sendAlert: function (e)
|
||||||
|
{
|
||||||
|
var alert_text = $("#alert-text").val();
|
||||||
|
OpenLP.Remote.sendEvent("alerts_text", alert_text);
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
buttonClick: function (e)
|
||||||
|
{
|
||||||
|
var id = OpenLP.Events.getElement(e).attr("id");
|
||||||
|
OpenLP.Remote.sendEvent(id);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
OpenLP.Events.bindLoad(function () {
|
||||||
|
OpenLP.Events.bindClick("input[type=button][id!=alert-send]", OpenLP.Remote.buttonClick);
|
||||||
|
OpenLP.Events.bindClick("#alert-send", OpenLP.Remote.sendAlert);
|
||||||
|
OpenLP.Remote.sendEvent("servicemanager_list_request");
|
||||||
|
OpenLP.Remote.sendEvent("slidecontroller_live_text_request");
|
||||||
|
OpenLP.Remote.sendEvent("remotes_poll_request");
|
||||||
|
});
|
|
@ -0,0 +1,44 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
* OpenLP - Open Source Lyrics Projection *
|
||||||
|
* ------------------------------------------------------------------------- *
|
||||||
|
* Copyright (c) 2008-2010 Raoul Snyman *
|
||||||
|
* Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael *
|
||||||
|
* Gorven, Scott Guerrieri, Christian Richter, Maikel Stuivenberg, Martin *
|
||||||
|
* Thompson, Jon Tibble, Carsten Tinggaard *
|
||||||
|
* ------------------------------------------------------------------------- *
|
||||||
|
* This program is free software; you can redistribute it and/or modify it *
|
||||||
|
* under the terms of the GNU General Public License as published by the *
|
||||||
|
* Free Software Foundation; version 2 of the License. *
|
||||||
|
* *
|
||||||
|
* This program is distributed in the hope that it will be useful, but *
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General *
|
||||||
|
* Public License for more details. *
|
||||||
|
* *
|
||||||
|
* You should have received a copy of the GNU General Public License along *
|
||||||
|
* with this program; if not, write to the Free Software Foundation, Inc., *
|
||||||
|
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
OpenLP.Namespace.create("OpenLP.Service", {
|
||||||
|
addServiceItem: function (elem, item)
|
||||||
|
{
|
||||||
|
var trow = $("<tr>")
|
||||||
|
.attr("id", "item-" + item.id)
|
||||||
|
.addClass("item")
|
||||||
|
.append($("<td>").text(item.tag))
|
||||||
|
.append($("<td>").text(item.tag.replace(/\n/g, "<br />")));
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
sendLive: function (e)
|
||||||
|
{
|
||||||
|
var elem = OpenLP.Events.getElement(e);
|
||||||
|
var row = elem.attr("id").substr(5);
|
||||||
|
elem.addStyle("font-weight", "bold");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
OpenLP.Events.load(function (){
|
||||||
|
OpenLP.Events.liveClick(".item", OpenLP.Service.sendLive);
|
||||||
|
});
|
|
@ -0,0 +1,45 @@
|
||||||
|
body
|
||||||
|
{
|
||||||
|
background-color: #fff;
|
||||||
|
font-family: Lucida Grande, Lucida Sans, Arial, Helvetica, sans-serif;
|
||||||
|
font-size: 80%;
|
||||||
|
}
|
||||||
|
|
||||||
|
a
|
||||||
|
{
|
||||||
|
color: #3c60a5;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
a:hover
|
||||||
|
{
|
||||||
|
color: #304d85;
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
fieldset
|
||||||
|
{
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
td
|
||||||
|
{
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 3px 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
tr:hover
|
||||||
|
{
|
||||||
|
background-color: #eee;
|
||||||
|
}
|
||||||
|
|
||||||
|
tr.selected:hover
|
||||||
|
{
|
||||||
|
background-color: #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
.selected
|
||||||
|
{
|
||||||
|
background-color: #ddd;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
|
@ -26,9 +26,13 @@
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
import json
|
|
||||||
import urlparse
|
import urlparse
|
||||||
|
|
||||||
|
try:
|
||||||
|
import json
|
||||||
|
except ImportError:
|
||||||
|
import simplejson as json
|
||||||
|
|
||||||
from PyQt4 import QtCore, QtNetwork
|
from PyQt4 import QtCore, QtNetwork
|
||||||
|
|
||||||
from openlp.core.lib import Receiver
|
from openlp.core.lib import Receiver
|
||||||
|
@ -242,18 +246,24 @@ class HttpConnection(object):
|
||||||
Receiver.send_message(event, params)
|
Receiver.send_message(event, params)
|
||||||
else:
|
else:
|
||||||
Receiver.send_message(event)
|
Receiver.send_message(event)
|
||||||
return u'OK'
|
return json.dumps([u'OK'])
|
||||||
|
|
||||||
def process_request(self, event, params):
|
def process_request(self, event, params):
|
||||||
"""
|
"""
|
||||||
Client has requested data. Send the signal and parameters for openlp
|
Client has requested data. Send the signal and parameters for openlp
|
||||||
to handle, then listen out for a corresponding _request signal
|
to handle, then listen out for a corresponding ``_request`` signal
|
||||||
which will have the data to return.
|
which will have the data to return.
|
||||||
For most event timeout after 10 seconds (i.e. incase the signal
|
|
||||||
recipient isn't listening)
|
For most events, timeout after 10 seconds (i.e. in case the signal
|
||||||
remotes_poll_request is a special case, this is a ajax long poll which
|
recipient isn't listening). ``remotes_poll_request`` is a special case
|
||||||
is just waiting for slide change/song change activity. This can wait
|
however, this is a ajax long poll which is just waiting for slide
|
||||||
longer (one minute)
|
change/song change activity. This can wait longer (one minute).
|
||||||
|
|
||||||
|
``event``
|
||||||
|
The event from the web page.
|
||||||
|
|
||||||
|
``params``
|
||||||
|
Parameters sent with the event.
|
||||||
"""
|
"""
|
||||||
log.debug(u'Processing request %s' % event)
|
log.debug(u'Processing request %s' % event)
|
||||||
if not event.endswith(u'_request'):
|
if not event.endswith(u'_request'):
|
||||||
|
|
|
@ -258,10 +258,11 @@ class Ui_EditSongDialog(object):
|
||||||
self.TopicBookLayout.addWidget(self.TopicGroupBox)
|
self.TopicBookLayout.addWidget(self.TopicGroupBox)
|
||||||
self.SongBookGroup = QtGui.QGroupBox(self.TopicBookWidget)
|
self.SongBookGroup = QtGui.QGroupBox(self.TopicBookWidget)
|
||||||
self.SongBookGroup.setObjectName(u'SongBookGroup')
|
self.SongBookGroup.setObjectName(u'SongBookGroup')
|
||||||
self.SongbookLayout = QtGui.QGridLayout(self.SongBookGroup)
|
self.SongbookLayout = QtGui.QFormLayout(self.SongBookGroup)
|
||||||
self.SongbookLayout.setMargin(8)
|
self.SongbookLayout.setMargin(8)
|
||||||
self.SongbookLayout.setSpacing(8)
|
self.SongbookLayout.setSpacing(8)
|
||||||
self.SongbookLayout.setObjectName(u'SongbookLayout')
|
self.SongbookLayout.setObjectName(u'SongbookLayout')
|
||||||
|
self.SongbookNameLabel = QtGui.QLabel(self.SongBookGroup)
|
||||||
self.SongbookCombo = QtGui.QComboBox(self.SongBookGroup)
|
self.SongbookCombo = QtGui.QComboBox(self.SongBookGroup)
|
||||||
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.MinimumExpanding,
|
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.MinimumExpanding,
|
||||||
QtGui.QSizePolicy.Fixed)
|
QtGui.QSizePolicy.Fixed)
|
||||||
|
@ -272,13 +273,11 @@ class Ui_EditSongDialog(object):
|
||||||
self.SongbookCombo.setEditable(True)
|
self.SongbookCombo.setEditable(True)
|
||||||
self.SongbookCombo.setSizePolicy(sizePolicy)
|
self.SongbookCombo.setSizePolicy(sizePolicy)
|
||||||
self.SongbookCombo.setObjectName(u'SongbookCombo')
|
self.SongbookCombo.setObjectName(u'SongbookCombo')
|
||||||
self.SongbookLayout.addWidget(self.SongbookCombo, 0, 0, 1, 1)
|
self.SongbookLayout.addRow(self.SongbookNameLabel, self.SongbookCombo)
|
||||||
self.songBookNumberLabel = QtGui.QLabel(self.SongBookGroup)
|
self.songBookNumberLabel = QtGui.QLabel(self.SongBookGroup)
|
||||||
self.SongbookLayout.addWidget(self.songBookNumberLabel, 0, 1, 1, 1)
|
|
||||||
self.songBookNumberEdit = QtGui.QLineEdit(self.SongBookGroup)
|
self.songBookNumberEdit = QtGui.QLineEdit(self.SongBookGroup)
|
||||||
self.songBookNumberLabel.setBuddy(self.songBookNumberEdit)
|
self.SongbookLayout.addRow(self.songBookNumberLabel,
|
||||||
self.songBookNumberEdit.setMaximumWidth(35)
|
self.songBookNumberEdit)
|
||||||
self.SongbookLayout.addWidget(self.songBookNumberEdit, 0, 2, 1, 1)
|
|
||||||
self.TopicBookLayout.addWidget(self.SongBookGroup)
|
self.TopicBookLayout.addWidget(self.SongBookGroup)
|
||||||
self.AuthorsTabLayout.addWidget(self.TopicBookWidget)
|
self.AuthorsTabLayout.addWidget(self.TopicBookWidget)
|
||||||
self.SongTabWidget.addTab(self.AuthorsTab, u'')
|
self.SongTabWidget.addTab(self.AuthorsTab, u'')
|
||||||
|
@ -446,8 +445,10 @@ class Ui_EditSongDialog(object):
|
||||||
translate('SongsPlugin.EditSongForm', 'R&emove'))
|
translate('SongsPlugin.EditSongForm', 'R&emove'))
|
||||||
self.SongBookGroup.setTitle(
|
self.SongBookGroup.setTitle(
|
||||||
translate('SongsPlugin.EditSongForm', 'Song Book'))
|
translate('SongsPlugin.EditSongForm', 'Song Book'))
|
||||||
|
self.SongbookNameLabel.setText(translate('SongsPlugin.EditSongForm',
|
||||||
|
'Book:'))
|
||||||
self.songBookNumberLabel.setText(translate('SongsPlugin.EditSongForm',
|
self.songBookNumberLabel.setText(translate('SongsPlugin.EditSongForm',
|
||||||
'Song No.:'))
|
'Number:'))
|
||||||
self.SongTabWidget.setTabText(
|
self.SongTabWidget.setTabText(
|
||||||
self.SongTabWidget.indexOf(self.AuthorsTab),
|
self.SongTabWidget.indexOf(self.AuthorsTab),
|
||||||
translate('SongsPlugin.EditSongForm',
|
translate('SongsPlugin.EditSongForm',
|
||||||
|
|
|
@ -57,6 +57,15 @@ class ImportWizardForm(QtGui.QWizard, Ui_SongImportWizard):
|
||||||
self.registerFields()
|
self.registerFields()
|
||||||
self.finishButton = self.button(QtGui.QWizard.FinishButton)
|
self.finishButton = self.button(QtGui.QWizard.FinishButton)
|
||||||
self.cancelButton = self.button(QtGui.QWizard.CancelButton)
|
self.cancelButton = self.button(QtGui.QWizard.CancelButton)
|
||||||
|
if not SongFormat.get_availability(SongFormat.OpenLP1):
|
||||||
|
self.openLP1DisabledWidget.setVisible(True)
|
||||||
|
self.openLP1ImportWidget.setVisible(False)
|
||||||
|
if not SongFormat.get_availability(SongFormat.SongsOfFellowship):
|
||||||
|
self.songsOfFellowshipDisabledWidget.setVisible(True)
|
||||||
|
self.songsOfFellowshipImportWidget.setVisible(False)
|
||||||
|
if not SongFormat.get_availability(SongFormat.Generic):
|
||||||
|
self.genericDisabledWidget.setVisible(True)
|
||||||
|
self.genericImportWidget.setVisible(False)
|
||||||
self.plugin = plugin
|
self.plugin = plugin
|
||||||
QtCore.QObject.connect(self.openLP2BrowseButton,
|
QtCore.QObject.connect(self.openLP2BrowseButton,
|
||||||
QtCore.SIGNAL(u'clicked()'),
|
QtCore.SIGNAL(u'clicked()'),
|
||||||
|
@ -64,12 +73,12 @@ class ImportWizardForm(QtGui.QWizard, Ui_SongImportWizard):
|
||||||
QtCore.QObject.connect(self.openLP1BrowseButton,
|
QtCore.QObject.connect(self.openLP1BrowseButton,
|
||||||
QtCore.SIGNAL(u'clicked()'),
|
QtCore.SIGNAL(u'clicked()'),
|
||||||
self.onOpenLP1BrowseButtonClicked)
|
self.onOpenLP1BrowseButtonClicked)
|
||||||
QtCore.QObject.connect(self.openLyricsAddButton,
|
#QtCore.QObject.connect(self.openLyricsAddButton,
|
||||||
QtCore.SIGNAL(u'clicked()'),
|
# QtCore.SIGNAL(u'clicked()'),
|
||||||
self.onOpenLyricsAddButtonClicked)
|
# self.onOpenLyricsAddButtonClicked)
|
||||||
QtCore.QObject.connect(self.openLyricsRemoveButton,
|
#QtCore.QObject.connect(self.openLyricsRemoveButton,
|
||||||
QtCore.SIGNAL(u'clicked()'),
|
# QtCore.SIGNAL(u'clicked()'),
|
||||||
self.onOpenLyricsRemoveButtonClicked)
|
# self.onOpenLyricsRemoveButtonClicked)
|
||||||
QtCore.QObject.connect(self.openSongAddButton,
|
QtCore.QObject.connect(self.openSongAddButton,
|
||||||
QtCore.SIGNAL(u'clicked()'),
|
QtCore.SIGNAL(u'clicked()'),
|
||||||
self.onOpenSongAddButtonClicked)
|
self.onOpenSongAddButtonClicked)
|
||||||
|
@ -145,14 +154,15 @@ class ImportWizardForm(QtGui.QWizard, Ui_SongImportWizard):
|
||||||
self.openLP1BrowseButton.setFocus()
|
self.openLP1BrowseButton.setFocus()
|
||||||
return False
|
return False
|
||||||
elif source_format == SongFormat.OpenLyrics:
|
elif source_format == SongFormat.OpenLyrics:
|
||||||
if self.openLyricsFileListWidget.count() == 0:
|
#if self.openLyricsFileListWidget.count() == 0:
|
||||||
QtGui.QMessageBox.critical(self,
|
# QtGui.QMessageBox.critical(self,
|
||||||
translate('SongsPlugin.ImportWizardForm',
|
# translate('SongsPlugin.ImportWizardForm',
|
||||||
'No OpenLyrics Files Selected'),
|
# 'No OpenLyrics Files Selected'),
|
||||||
translate('SongsPlugin.ImportWizardForm',
|
# translate('SongsPlugin.ImportWizardForm',
|
||||||
'You need to add at least one OpenLyrics '
|
# 'You need to add at least one OpenLyrics '
|
||||||
'song file to import from.'))
|
# 'song file to import from.'))
|
||||||
self.openLyricsAddButton.setFocus()
|
# self.openLyricsAddButton.setFocus()
|
||||||
|
# return False
|
||||||
return False
|
return False
|
||||||
elif source_format == SongFormat.OpenSong:
|
elif source_format == SongFormat.OpenSong:
|
||||||
if self.openSongFileListWidget.count() == 0:
|
if self.openSongFileListWidget.count() == 0:
|
||||||
|
@ -252,15 +262,15 @@ class ImportWizardForm(QtGui.QWizard, Ui_SongImportWizard):
|
||||||
self.openLP1FilenameEdit
|
self.openLP1FilenameEdit
|
||||||
)
|
)
|
||||||
|
|
||||||
def onOpenLyricsAddButtonClicked(self):
|
#def onOpenLyricsAddButtonClicked(self):
|
||||||
self.getFiles(
|
# self.getFiles(
|
||||||
translate('SongsPlugin.ImportWizardForm',
|
# translate('SongsPlugin.ImportWizardForm',
|
||||||
'Select OpenLyrics Files'),
|
# 'Select OpenLyrics Files'),
|
||||||
self.openLyricsFileListWidget
|
# self.openLyricsFileListWidget
|
||||||
)
|
# )
|
||||||
|
|
||||||
def onOpenLyricsRemoveButtonClicked(self):
|
#def onOpenLyricsRemoveButtonClicked(self):
|
||||||
self.removeSelectedItems(self.openLyricsFileListWidget)
|
# self.removeSelectedItems(self.openLyricsFileListWidget)
|
||||||
|
|
||||||
def onOpenSongAddButtonClicked(self):
|
def onOpenSongAddButtonClicked(self):
|
||||||
self.getFiles(
|
self.getFiles(
|
||||||
|
@ -334,7 +344,7 @@ class ImportWizardForm(QtGui.QWizard, Ui_SongImportWizard):
|
||||||
self.formatComboBox.setCurrentIndex(0)
|
self.formatComboBox.setCurrentIndex(0)
|
||||||
self.openLP2FilenameEdit.setText(u'')
|
self.openLP2FilenameEdit.setText(u'')
|
||||||
self.openLP1FilenameEdit.setText(u'')
|
self.openLP1FilenameEdit.setText(u'')
|
||||||
self.openLyricsFileListWidget.clear()
|
#self.openLyricsFileListWidget.clear()
|
||||||
self.openSongFileListWidget.clear()
|
self.openSongFileListWidget.clear()
|
||||||
self.wordsOfWorshipFileListWidget.clear()
|
self.wordsOfWorshipFileListWidget.clear()
|
||||||
self.ccliFileListWidget.clear()
|
self.ccliFileListWidget.clear()
|
||||||
|
|
|
@ -131,26 +131,43 @@ class Ui_SongImportWizard(object):
|
||||||
# openlp.org 1.x
|
# openlp.org 1.x
|
||||||
self.openLP1Page = QtGui.QWidget()
|
self.openLP1Page = QtGui.QWidget()
|
||||||
self.openLP1Page.setObjectName(u'openLP1Page')
|
self.openLP1Page.setObjectName(u'openLP1Page')
|
||||||
self.openLP1Layout = QtGui.QFormLayout(self.openLP1Page)
|
self.openLP1Layout = QtGui.QVBoxLayout(self.openLP1Page)
|
||||||
self.openLP1Layout.setMargin(0)
|
self.openLP1Layout.setMargin(0)
|
||||||
self.openLP1Layout.setSpacing(8)
|
self.openLP1Layout.setSpacing(0)
|
||||||
self.openLP1Layout.setObjectName(u'openLP1Layout')
|
self.openLP1Layout.setObjectName(u'openLP1Layout')
|
||||||
self.openLP1FilenameLabel = QtGui.QLabel(self.openLP1Page)
|
self.openLP1DisabledWidget = QtGui.QWidget(self.openLP1Page)
|
||||||
|
self.openLP1DisabledLayout = QtGui.QVBoxLayout(self.openLP1DisabledWidget)
|
||||||
|
self.openLP1DisabledLayout.setMargin(0)
|
||||||
|
self.openLP1DisabledLayout.setSpacing(8)
|
||||||
|
self.openLP1DisabledLayout.setObjectName(u'openLP1DisabledLayout')
|
||||||
|
self.openLP1DisabledLabel = QtGui.QLabel(self.openLP1DisabledWidget)
|
||||||
|
self.openLP1DisabledLabel.setWordWrap(True)
|
||||||
|
self.openLP1DisabledLabel.setObjectName(u'openLP1DisabledLabel')
|
||||||
|
self.openLP1DisabledLayout.addWidget(self.openLP1DisabledLabel)
|
||||||
|
self.openLP1DisabledWidget.setVisible(False)
|
||||||
|
self.openLP1Layout.addWidget(self.openLP1DisabledWidget)
|
||||||
|
self.openLP1ImportWidget = QtGui.QWidget(self.openLP1Page)
|
||||||
|
self.openLP1ImportLayout = QtGui.QFormLayout(self.openLP1ImportWidget)
|
||||||
|
self.openLP1ImportLayout.setMargin(0)
|
||||||
|
self.openLP1ImportLayout.setSpacing(8)
|
||||||
|
self.openLP1ImportLayout.setObjectName(u'openLP1ImportLayout')
|
||||||
|
self.openLP1FilenameLabel = QtGui.QLabel(self.openLP1ImportWidget)
|
||||||
self.openLP1FilenameLabel.setObjectName(u'openLP1FilenameLabel')
|
self.openLP1FilenameLabel.setObjectName(u'openLP1FilenameLabel')
|
||||||
self.openLP1Layout.setWidget(0, QtGui.QFormLayout.LabelRole,
|
self.openLP1ImportLayout.setWidget(0, QtGui.QFormLayout.LabelRole,
|
||||||
self.openLP1FilenameLabel)
|
self.openLP1FilenameLabel)
|
||||||
self.openLP1FileLayout = QtGui.QHBoxLayout()
|
self.openLP1FileLayout = QtGui.QHBoxLayout()
|
||||||
self.openLP1FileLayout.setSpacing(8)
|
self.openLP1FileLayout.setSpacing(8)
|
||||||
self.openLP1FileLayout.setObjectName(u'openLP1FileLayout')
|
self.openLP1FileLayout.setObjectName(u'openLP1FileLayout')
|
||||||
self.openLP1FilenameEdit = QtGui.QLineEdit(self.openLP1Page)
|
self.openLP1FilenameEdit = QtGui.QLineEdit(self.openLP1ImportWidget)
|
||||||
self.openLP1FilenameEdit.setObjectName(u'openLP1FilenameEdit')
|
self.openLP1FilenameEdit.setObjectName(u'openLP1FilenameEdit')
|
||||||
self.openLP1FileLayout.addWidget(self.openLP1FilenameEdit)
|
self.openLP1FileLayout.addWidget(self.openLP1FilenameEdit)
|
||||||
self.openLP1BrowseButton = QtGui.QToolButton(self.openLP1Page)
|
self.openLP1BrowseButton = QtGui.QToolButton(self.openLP1ImportWidget)
|
||||||
self.openLP1BrowseButton.setIcon(openIcon)
|
self.openLP1BrowseButton.setIcon(openIcon)
|
||||||
self.openLP1BrowseButton.setObjectName(u'openLP1BrowseButton')
|
self.openLP1BrowseButton.setObjectName(u'openLP1BrowseButton')
|
||||||
self.openLP1FileLayout.addWidget(self.openLP1BrowseButton)
|
self.openLP1FileLayout.addWidget(self.openLP1BrowseButton)
|
||||||
self.openLP1Layout.setLayout(0, QtGui.QFormLayout.FieldRole,
|
self.openLP1ImportLayout.setLayout(0, QtGui.QFormLayout.FieldRole,
|
||||||
self.openLP1FileLayout)
|
self.openLP1FileLayout)
|
||||||
|
self.openLP1Layout.addWidget(self.openLP1ImportWidget)
|
||||||
self.formatStackedWidget.addWidget(self.openLP1Page)
|
self.formatStackedWidget.addWidget(self.openLP1Page)
|
||||||
# OpenLyrics
|
# OpenLyrics
|
||||||
self.openLyricsPage = QtGui.QWidget()
|
self.openLyricsPage = QtGui.QWidget()
|
||||||
|
@ -159,26 +176,31 @@ class Ui_SongImportWizard(object):
|
||||||
self.openLyricsLayout.setSpacing(8)
|
self.openLyricsLayout.setSpacing(8)
|
||||||
self.openLyricsLayout.setMargin(0)
|
self.openLyricsLayout.setMargin(0)
|
||||||
self.openLyricsLayout.setObjectName(u'OpenLyricsLayout')
|
self.openLyricsLayout.setObjectName(u'OpenLyricsLayout')
|
||||||
self.openLyricsFileListWidget = QtGui.QListWidget(self.openLyricsPage)
|
self.openLyricsDisabledLabel = QtGui.QLabel(self.openLyricsPage)
|
||||||
self.openLyricsFileListWidget.setSelectionMode(
|
self.openLyricsDisabledLabel.setWordWrap(True)
|
||||||
QtGui.QAbstractItemView.ExtendedSelection)
|
self.openLyricsDisabledLabel.setObjectName(u'openLyricsDisabledLabel')
|
||||||
self.openLyricsFileListWidget.setObjectName(u'OpenLyricsFileListWidget')
|
self.openLyricsLayout.addWidget(self.openLyricsDisabledLabel)
|
||||||
self.openLyricsLayout.addWidget(self.openLyricsFileListWidget)
|
# Commented out for future use.
|
||||||
self.openLyricsButtonLayout = QtGui.QHBoxLayout()
|
#self.openLyricsFileListWidget = QtGui.QListWidget(self.openLyricsPage)
|
||||||
self.openLyricsButtonLayout.setSpacing(8)
|
#self.openLyricsFileListWidget.setSelectionMode(
|
||||||
self.openLyricsButtonLayout.setObjectName(u'OpenLyricsButtonLayout')
|
# QtGui.QAbstractItemView.ExtendedSelection)
|
||||||
self.openLyricsAddButton = QtGui.QPushButton(self.openLyricsPage)
|
#self.openLyricsFileListWidget.setObjectName(u'OpenLyricsFileListWidget')
|
||||||
self.openLyricsAddButton.setIcon(openIcon)
|
#self.openLyricsLayout.addWidget(self.openLyricsFileListWidget)
|
||||||
self.openLyricsAddButton.setObjectName(u'OpenLyricsAddButton')
|
#self.openLyricsButtonLayout = QtGui.QHBoxLayout()
|
||||||
self.openLyricsButtonLayout.addWidget(self.openLyricsAddButton)
|
#self.openLyricsButtonLayout.setSpacing(8)
|
||||||
self.openLyricsButtonSpacer = QtGui.QSpacerItem(40, 20,
|
#self.openLyricsButtonLayout.setObjectName(u'OpenLyricsButtonLayout')
|
||||||
QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
|
#self.openLyricsAddButton = QtGui.QPushButton(self.openLyricsPage)
|
||||||
self.openLyricsButtonLayout.addItem(self.openLyricsButtonSpacer)
|
#self.openLyricsAddButton.setIcon(openIcon)
|
||||||
self.openLyricsRemoveButton = QtGui.QPushButton(self.openLyricsPage)
|
#self.openLyricsAddButton.setObjectName(u'OpenLyricsAddButton')
|
||||||
self.openLyricsRemoveButton.setIcon(deleteIcon)
|
#self.openLyricsButtonLayout.addWidget(self.openLyricsAddButton)
|
||||||
self.openLyricsRemoveButton.setObjectName(u'OpenLyricsRemoveButton')
|
#self.openLyricsButtonSpacer = QtGui.QSpacerItem(40, 20,
|
||||||
self.openLyricsButtonLayout.addWidget(self.openLyricsRemoveButton)
|
# QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
|
||||||
self.openLyricsLayout.addLayout(self.openLyricsButtonLayout)
|
#self.openLyricsButtonLayout.addItem(self.openLyricsButtonSpacer)
|
||||||
|
#self.openLyricsRemoveButton = QtGui.QPushButton(self.openLyricsPage)
|
||||||
|
#self.openLyricsRemoveButton.setIcon(deleteIcon)
|
||||||
|
#self.openLyricsRemoveButton.setObjectName(u'OpenLyricsRemoveButton')
|
||||||
|
#self.openLyricsButtonLayout.addWidget(self.openLyricsRemoveButton)
|
||||||
|
#self.openLyricsLayout.addLayout(self.openLyricsButtonLayout)
|
||||||
self.formatStackedWidget.addWidget(self.openLyricsPage)
|
self.formatStackedWidget.addWidget(self.openLyricsPage)
|
||||||
# Open Song
|
# Open Song
|
||||||
self.openSongPage = QtGui.QWidget()
|
self.openSongPage = QtGui.QWidget()
|
||||||
|
@ -277,22 +299,52 @@ class Ui_SongImportWizard(object):
|
||||||
self.songsOfFellowshipLayout = QtGui.QVBoxLayout(
|
self.songsOfFellowshipLayout = QtGui.QVBoxLayout(
|
||||||
self.songsOfFellowshipPage)
|
self.songsOfFellowshipPage)
|
||||||
self.songsOfFellowshipLayout.setMargin(0)
|
self.songsOfFellowshipLayout.setMargin(0)
|
||||||
self.songsOfFellowshipLayout.setSpacing(8)
|
self.songsOfFellowshipLayout.setSpacing(0)
|
||||||
self.songsOfFellowshipLayout.setObjectName(u'songsOfFellowshipLayout')
|
self.songsOfFellowshipLayout.setObjectName(u'songsOfFellowshipLayout')
|
||||||
self.songsOfFellowshipFileListWidget = QtGui.QListWidget(
|
self.songsOfFellowshipDisabledWidget = QtGui.QWidget(
|
||||||
self.songsOfFellowshipPage)
|
self.songsOfFellowshipPage)
|
||||||
|
self.songsOfFellowshipDisabledWidget.setVisible(False)
|
||||||
|
self.songsOfFellowshipDisabledWidget.setObjectName(
|
||||||
|
u'songsOfFellowshipDisabledWidget')
|
||||||
|
self.songsOfFellowshipDisabledLayout = QtGui.QVBoxLayout(
|
||||||
|
self.songsOfFellowshipDisabledWidget)
|
||||||
|
self.songsOfFellowshipDisabledLayout.setMargin(0)
|
||||||
|
self.songsOfFellowshipDisabledLayout.setSpacing(8)
|
||||||
|
self.songsOfFellowshipDisabledLayout.setObjectName(
|
||||||
|
u'songsOfFellowshipDisabledLayout')
|
||||||
|
self.songsOfFellowshipDisabledLabel = QtGui.QLabel(
|
||||||
|
self.songsOfFellowshipDisabledWidget)
|
||||||
|
self.songsOfFellowshipDisabledLabel.setWordWrap(True)
|
||||||
|
self.songsOfFellowshipDisabledLabel.setObjectName(
|
||||||
|
u'songsOfFellowshipDisabledLabel')
|
||||||
|
self.songsOfFellowshipDisabledLayout.addWidget(
|
||||||
|
self.songsOfFellowshipDisabledLabel)
|
||||||
|
self.songsOfFellowshipLayout.addWidget(
|
||||||
|
self.songsOfFellowshipDisabledWidget)
|
||||||
|
self.songsOfFellowshipImportWidget = QtGui.QWidget(
|
||||||
|
self.songsOfFellowshipPage)
|
||||||
|
self.songsOfFellowshipImportWidget.setObjectName(
|
||||||
|
u'songsOfFellowshipImportWidget')
|
||||||
|
self.songsOfFellowshipImportLayout = QtGui.QVBoxLayout(
|
||||||
|
self.songsOfFellowshipImportWidget)
|
||||||
|
self.songsOfFellowshipImportLayout.setMargin(0)
|
||||||
|
self.songsOfFellowshipImportLayout.setSpacing(8)
|
||||||
|
self.songsOfFellowshipImportLayout.setObjectName(
|
||||||
|
u'songsOfFellowshipImportLayout')
|
||||||
|
self.songsOfFellowshipFileListWidget = QtGui.QListWidget(
|
||||||
|
self.songsOfFellowshipImportWidget)
|
||||||
self.songsOfFellowshipFileListWidget.setSelectionMode(
|
self.songsOfFellowshipFileListWidget.setSelectionMode(
|
||||||
QtGui.QAbstractItemView.ExtendedSelection)
|
QtGui.QAbstractItemView.ExtendedSelection)
|
||||||
self.songsOfFellowshipFileListWidget.setObjectName(
|
self.songsOfFellowshipFileListWidget.setObjectName(
|
||||||
u'songsOfFellowshipFileListWidget')
|
u'songsOfFellowshipFileListWidget')
|
||||||
self.songsOfFellowshipLayout.addWidget(
|
self.songsOfFellowshipImportLayout.addWidget(
|
||||||
self.songsOfFellowshipFileListWidget)
|
self.songsOfFellowshipFileListWidget)
|
||||||
self.songsOfFellowshipButtonLayout = QtGui.QHBoxLayout()
|
self.songsOfFellowshipButtonLayout = QtGui.QHBoxLayout()
|
||||||
self.songsOfFellowshipButtonLayout.setSpacing(8)
|
self.songsOfFellowshipButtonLayout.setSpacing(8)
|
||||||
self.songsOfFellowshipButtonLayout.setObjectName(
|
self.songsOfFellowshipButtonLayout.setObjectName(
|
||||||
u'songsOfFellowshipButtonLayout')
|
u'songsOfFellowshipButtonLayout')
|
||||||
self.songsOfFellowshipAddButton = QtGui.QPushButton(
|
self.songsOfFellowshipAddButton = QtGui.QPushButton(
|
||||||
self.songsOfFellowshipPage)
|
self.songsOfFellowshipImportWidget)
|
||||||
self.songsOfFellowshipAddButton.setIcon(openIcon)
|
self.songsOfFellowshipAddButton.setIcon(openIcon)
|
||||||
self.songsOfFellowshipAddButton.setObjectName(
|
self.songsOfFellowshipAddButton.setObjectName(
|
||||||
u'songsOfFellowshipAddButton')
|
u'songsOfFellowshipAddButton')
|
||||||
|
@ -303,42 +355,63 @@ class Ui_SongImportWizard(object):
|
||||||
self.songsOfFellowshipButtonLayout.addItem(
|
self.songsOfFellowshipButtonLayout.addItem(
|
||||||
self.songsOfFellowshipButtonSpacer)
|
self.songsOfFellowshipButtonSpacer)
|
||||||
self.songsOfFellowshipRemoveButton = QtGui.QPushButton(
|
self.songsOfFellowshipRemoveButton = QtGui.QPushButton(
|
||||||
self.songsOfFellowshipPage)
|
self.songsOfFellowshipImportWidget)
|
||||||
self.songsOfFellowshipRemoveButton.setIcon(deleteIcon)
|
self.songsOfFellowshipRemoveButton.setIcon(deleteIcon)
|
||||||
self.songsOfFellowshipRemoveButton.setObjectName(
|
self.songsOfFellowshipRemoveButton.setObjectName(
|
||||||
u'songsOfFellowshipRemoveButton')
|
u'songsOfFellowshipRemoveButton')
|
||||||
self.songsOfFellowshipButtonLayout.addWidget(
|
self.songsOfFellowshipButtonLayout.addWidget(
|
||||||
self.songsOfFellowshipRemoveButton)
|
self.songsOfFellowshipRemoveButton)
|
||||||
self.songsOfFellowshipLayout.addLayout(
|
self.songsOfFellowshipImportLayout.addLayout(
|
||||||
self.songsOfFellowshipButtonLayout)
|
self.songsOfFellowshipButtonLayout)
|
||||||
|
self.songsOfFellowshipLayout.addWidget(
|
||||||
|
self.songsOfFellowshipImportWidget)
|
||||||
self.formatStackedWidget.addWidget(self.songsOfFellowshipPage)
|
self.formatStackedWidget.addWidget(self.songsOfFellowshipPage)
|
||||||
# Generic Document/Presentation import
|
# Generic Document/Presentation import
|
||||||
self.genericPage = QtGui.QWidget()
|
self.genericPage = QtGui.QWidget()
|
||||||
self.genericPage.setObjectName(u'genericPage')
|
self.genericPage.setObjectName(u'genericPage')
|
||||||
self.genericLayout = QtGui.QVBoxLayout(self.genericPage)
|
self.genericLayout = QtGui.QVBoxLayout(self.genericPage)
|
||||||
self.genericLayout.setMargin(0)
|
self.genericLayout.setMargin(0)
|
||||||
self.genericLayout.setSpacing(8)
|
self.genericLayout.setSpacing(0)
|
||||||
self.genericLayout.setObjectName(u'genericLayout')
|
self.genericLayout.setObjectName(u'genericLayout')
|
||||||
self.genericFileListWidget = QtGui.QListWidget(self.genericPage)
|
self.genericDisabledWidget = QtGui.QWidget(self.genericPage)
|
||||||
|
self.genericDisabledWidget.setObjectName(u'genericDisabledWidget')
|
||||||
|
self.genericDisabledLayout = QtGui.QVBoxLayout(self.genericDisabledWidget)
|
||||||
|
self.genericDisabledLayout.setMargin(0)
|
||||||
|
self.genericDisabledLayout.setSpacing(8)
|
||||||
|
self.genericDisabledLayout.setObjectName(u'genericDisabledLayout')
|
||||||
|
self.genericDisabledLabel = QtGui.QLabel(self.genericDisabledWidget)
|
||||||
|
self.genericDisabledLabel.setWordWrap(True)
|
||||||
|
self.genericDisabledLabel.setObjectName(u'genericDisabledLabel')
|
||||||
|
self.genericDisabledWidget.setVisible(False)
|
||||||
|
self.genericDisabledLayout.addWidget(self.genericDisabledLabel)
|
||||||
|
self.genericLayout.addWidget(self.genericDisabledWidget)
|
||||||
|
self.genericImportWidget = QtGui.QWidget(self.genericPage)
|
||||||
|
self.genericImportWidget.setObjectName(u'genericImportWidget')
|
||||||
|
self.genericImportLayout = QtGui.QVBoxLayout(self.genericImportWidget)
|
||||||
|
self.genericImportLayout.setMargin(0)
|
||||||
|
self.genericImportLayout.setSpacing(8)
|
||||||
|
self.genericImportLayout.setObjectName(u'genericImportLayout')
|
||||||
|
self.genericFileListWidget = QtGui.QListWidget(self.genericImportWidget)
|
||||||
self.genericFileListWidget.setSelectionMode(
|
self.genericFileListWidget.setSelectionMode(
|
||||||
QtGui.QAbstractItemView.ExtendedSelection)
|
QtGui.QAbstractItemView.ExtendedSelection)
|
||||||
self.genericFileListWidget.setObjectName(u'genericFileListWidget')
|
self.genericFileListWidget.setObjectName(u'genericFileListWidget')
|
||||||
self.genericLayout.addWidget(self.genericFileListWidget)
|
self.genericImportLayout.addWidget(self.genericFileListWidget)
|
||||||
self.genericButtonLayout = QtGui.QHBoxLayout()
|
self.genericButtonLayout = QtGui.QHBoxLayout()
|
||||||
self.genericButtonLayout.setSpacing(8)
|
self.genericButtonLayout.setSpacing(8)
|
||||||
self.genericButtonLayout.setObjectName(u'genericButtonLayout')
|
self.genericButtonLayout.setObjectName(u'genericButtonLayout')
|
||||||
self.genericAddButton = QtGui.QPushButton(self.genericPage)
|
self.genericAddButton = QtGui.QPushButton(self.genericImportWidget)
|
||||||
self.genericAddButton.setIcon(openIcon)
|
self.genericAddButton.setIcon(openIcon)
|
||||||
self.genericAddButton.setObjectName(u'genericAddButton')
|
self.genericAddButton.setObjectName(u'genericAddButton')
|
||||||
self.genericButtonLayout.addWidget(self.genericAddButton)
|
self.genericButtonLayout.addWidget(self.genericAddButton)
|
||||||
self.genericButtonSpacer = QtGui.QSpacerItem(40, 20,
|
self.genericButtonSpacer = QtGui.QSpacerItem(40, 20,
|
||||||
QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
|
QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
|
||||||
self.genericButtonLayout.addItem(self.genericButtonSpacer)
|
self.genericButtonLayout.addItem(self.genericButtonSpacer)
|
||||||
self.genericRemoveButton = QtGui.QPushButton(self.genericPage)
|
self.genericRemoveButton = QtGui.QPushButton(self.genericImportWidget)
|
||||||
self.genericRemoveButton.setIcon(deleteIcon)
|
self.genericRemoveButton.setIcon(deleteIcon)
|
||||||
self.genericRemoveButton.setObjectName(u'genericRemoveButton')
|
self.genericRemoveButton.setObjectName(u'genericRemoveButton')
|
||||||
self.genericButtonLayout.addWidget(self.genericRemoveButton)
|
self.genericButtonLayout.addWidget(self.genericRemoveButton)
|
||||||
self.genericLayout.addLayout(self.genericButtonLayout)
|
self.genericImportLayout.addLayout(self.genericButtonLayout)
|
||||||
|
self.genericLayout.addWidget(self.genericImportWidget)
|
||||||
self.formatStackedWidget.addWidget(self.genericPage)
|
self.formatStackedWidget.addWidget(self.genericPage)
|
||||||
# Commented out for future use.
|
# Commented out for future use.
|
||||||
# self.csvPage = QtGui.QWidget()
|
# self.csvPage = QtGui.QWidget()
|
||||||
|
@ -434,10 +507,20 @@ class Ui_SongImportWizard(object):
|
||||||
translate('SongsPlugin.ImportWizardForm', 'Filename:'))
|
translate('SongsPlugin.ImportWizardForm', 'Filename:'))
|
||||||
self.openLP1BrowseButton.setText(
|
self.openLP1BrowseButton.setText(
|
||||||
translate('SongsPlugin.ImportWizardForm', 'Browse...'))
|
translate('SongsPlugin.ImportWizardForm', 'Browse...'))
|
||||||
self.openLyricsAddButton.setText(
|
self.openLP1DisabledLabel.setText(
|
||||||
translate('SongsPlugin.ImportWizardForm', 'Add Files...'))
|
translate('SongsPlugin.ImportWizardForm', 'The openlp.org 1.x '
|
||||||
self.openLyricsRemoveButton.setText(
|
'importer has been disabled due to a missing Python module. If '
|
||||||
translate('SongsPlugin.ImportWizardForm', 'Remove File(s)'))
|
'you want to use this importer, you will need to install the '
|
||||||
|
'"python-sqlite" module.'))
|
||||||
|
#self.openLyricsAddButton.setText(
|
||||||
|
# translate('SongsPlugin.ImportWizardForm', 'Add Files...'))
|
||||||
|
#self.openLyricsRemoveButton.setText(
|
||||||
|
# translate('SongsPlugin.ImportWizardForm', 'Remove File(s)'))
|
||||||
|
self.openLyricsDisabledLabel.setText(
|
||||||
|
translate('SongsPlugin.ImportWizardForm', 'The OpenLyrics '
|
||||||
|
'importer has not yet been developed, but as you can see, we are '
|
||||||
|
'still intendeding to do so. Hopefully it will be in the next '
|
||||||
|
'release.'))
|
||||||
self.openSongAddButton.setText(
|
self.openSongAddButton.setText(
|
||||||
translate('SongsPlugin.ImportWizardForm', 'Add Files...'))
|
translate('SongsPlugin.ImportWizardForm', 'Add Files...'))
|
||||||
self.openSongRemoveButton.setText(
|
self.openSongRemoveButton.setText(
|
||||||
|
@ -454,10 +537,18 @@ class Ui_SongImportWizard(object):
|
||||||
translate('SongsPlugin.ImportWizardForm', 'Add Files...'))
|
translate('SongsPlugin.ImportWizardForm', 'Add Files...'))
|
||||||
self.songsOfFellowshipRemoveButton.setText(
|
self.songsOfFellowshipRemoveButton.setText(
|
||||||
translate('SongsPlugin.ImportWizardForm', 'Remove File(s)'))
|
translate('SongsPlugin.ImportWizardForm', 'Remove File(s)'))
|
||||||
|
self.songsOfFellowshipDisabledLabel.setText(
|
||||||
|
translate('SongsPlugin.ImportWizardForm', 'The Songs of '
|
||||||
|
'Fellowship importer has been disabled because OpenLP cannot '
|
||||||
|
'find OpenOffice.org on your computer.'))
|
||||||
self.genericAddButton.setText(
|
self.genericAddButton.setText(
|
||||||
translate('SongsPlugin.ImportWizardForm', 'Add Files...'))
|
translate('SongsPlugin.ImportWizardForm', 'Add Files...'))
|
||||||
self.genericRemoveButton.setText(
|
self.genericRemoveButton.setText(
|
||||||
translate('SongsPlugin.ImportWizardForm', 'Remove File(s)'))
|
translate('SongsPlugin.ImportWizardForm', 'Remove File(s)'))
|
||||||
|
self.genericDisabledLabel.setText(
|
||||||
|
translate('SongsPlugin.ImportWizardForm', 'The generic document/'
|
||||||
|
'presentation importer has been disabled because OpenLP cannot '
|
||||||
|
'find OpenOffice.org on your computer.'))
|
||||||
# self.csvFilenameLabel.setText(
|
# self.csvFilenameLabel.setText(
|
||||||
# translate('SongsPlugin.ImportWizardForm', 'Filename:'))
|
# translate('SongsPlugin.ImportWizardForm', 'Filename:'))
|
||||||
# self.csvBrowseButton.setText(
|
# self.csvBrowseButton.setText(
|
||||||
|
|
|
@ -81,14 +81,15 @@ class CCLIFileImport(SongImport):
|
||||||
lines = infile.readlines()
|
lines = infile.readlines()
|
||||||
ext = os.path.splitext(filename)[1]
|
ext = os.path.splitext(filename)[1]
|
||||||
if ext.lower() == ".usr":
|
if ext.lower() == ".usr":
|
||||||
log.info(u'SongSelect .usr format file found %s: ' , filename)
|
log.info(u'SongSelect .usr format file found %s: ',
|
||||||
|
filename)
|
||||||
self.do_import_usr_file(lines)
|
self.do_import_usr_file(lines)
|
||||||
elif ext.lower() == ".txt":
|
elif ext.lower() == ".txt":
|
||||||
log.info(u'SongSelect .txt format file found %s: ', filename)
|
log.info(u'SongSelect .txt format file found %s: ',
|
||||||
|
filename)
|
||||||
self.do_import_txt_file(lines)
|
self.do_import_txt_file(lines)
|
||||||
else:
|
else:
|
||||||
log.info(u'Extension %s is not valid', filename)
|
log.info(u'Extension %s is not valid', filename)
|
||||||
pass
|
|
||||||
song_count += 1
|
song_count += 1
|
||||||
if self.stop_import_flag:
|
if self.stop_import_flag:
|
||||||
return False
|
return False
|
||||||
|
@ -175,7 +176,7 @@ class CCLIFileImport(SongImport):
|
||||||
verse_text = unicode(words_list[counter])
|
verse_text = unicode(words_list[counter])
|
||||||
verse_text = verse_text.replace("/n", "\n")
|
verse_text = verse_text.replace("/n", "\n")
|
||||||
if len(verse_text) > 0:
|
if len(verse_text) > 0:
|
||||||
self.add_verse(verse_text, verse_type);
|
self.add_verse(verse_text, verse_type)
|
||||||
#Handle multiple authors
|
#Handle multiple authors
|
||||||
author_list = song_author.split(u'/')
|
author_list = song_author.split(u'/')
|
||||||
if len(author_list) < 2:
|
if len(author_list) < 2:
|
||||||
|
@ -238,12 +239,12 @@ class CCLIFileImport(SongImport):
|
||||||
line_number = 0
|
line_number = 0
|
||||||
verse_text = u''
|
verse_text = u''
|
||||||
song_comments = u''
|
song_comments = u''
|
||||||
song_copyright = u'';
|
song_copyright = u''
|
||||||
verse_start = False
|
verse_start = False
|
||||||
for line in textList:
|
for line in textList:
|
||||||
clean_line = line.strip()
|
clean_line = line.strip()
|
||||||
if not clean_line:
|
if not clean_line:
|
||||||
if line_number==0:
|
if line_number == 0:
|
||||||
continue
|
continue
|
||||||
elif verse_start:
|
elif verse_start:
|
||||||
if verse_text:
|
if verse_text:
|
||||||
|
@ -252,11 +253,11 @@ class CCLIFileImport(SongImport):
|
||||||
verse_start = False
|
verse_start = False
|
||||||
else:
|
else:
|
||||||
#line_number=0, song title
|
#line_number=0, song title
|
||||||
if line_number==0:
|
if line_number == 0:
|
||||||
song_name = clean_line
|
song_name = clean_line
|
||||||
line_number += 1
|
line_number += 1
|
||||||
#line_number=1, verses
|
#line_number=1, verses
|
||||||
elif line_number==1:
|
elif line_number == 1:
|
||||||
#line_number=1, ccli number, first line after verses
|
#line_number=1, ccli number, first line after verses
|
||||||
if clean_line.startswith(u'CCLI'):
|
if clean_line.startswith(u'CCLI'):
|
||||||
line_number += 1
|
line_number += 1
|
||||||
|
@ -285,15 +286,16 @@ class CCLIFileImport(SongImport):
|
||||||
verse_text = verse_text + line
|
verse_text = verse_text + line
|
||||||
else:
|
else:
|
||||||
#line_number=2, copyright
|
#line_number=2, copyright
|
||||||
if line_number==2:
|
if line_number == 2:
|
||||||
line_number += 1
|
line_number += 1
|
||||||
song_copyright = clean_line
|
song_copyright = clean_line
|
||||||
#n=3, authors
|
#n=3, authors
|
||||||
elif line_number==3:
|
elif line_number == 3:
|
||||||
line_number += 1
|
line_number += 1
|
||||||
song_author = clean_line
|
song_author = clean_line
|
||||||
#line_number=4, comments lines before last line
|
#line_number=4, comments lines before last line
|
||||||
elif (line_number==4) and (not clean_line.startswith(u'CCL')):
|
elif (line_number == 4) and \
|
||||||
|
(not clean_line.startswith(u'CCL')):
|
||||||
song_comments = song_comments + clean_line
|
song_comments = song_comments + clean_line
|
||||||
# split on known separators
|
# split on known separators
|
||||||
author_list = song_author.split(u'/')
|
author_list = song_author.split(u'/')
|
||||||
|
@ -307,4 +309,3 @@ class CCLIFileImport(SongImport):
|
||||||
self.ccli_number = song_ccli
|
self.ccli_number = song_ccli
|
||||||
self.comments = song_comments
|
self.comments = song_comments
|
||||||
self.finish()
|
self.finish()
|
||||||
|
|
||||||
|
|
|
@ -26,14 +26,24 @@
|
||||||
|
|
||||||
from opensongimport import OpenSongImport
|
from opensongimport import OpenSongImport
|
||||||
from olpimport import OpenLPSongImport
|
from olpimport import OpenLPSongImport
|
||||||
from olp1import import OpenLP1SongImport
|
from wowimport import WowImport
|
||||||
|
from cclifileimport import CCLIFileImport
|
||||||
|
# Imports that might fail
|
||||||
|
try:
|
||||||
|
from olp1import import OpenLP1SongImport
|
||||||
|
has_openlp1 = True
|
||||||
|
except ImportError:
|
||||||
|
has_openlp1 = False
|
||||||
try:
|
try:
|
||||||
from sofimport import SofImport
|
from sofimport import SofImport
|
||||||
from oooimport import OooImport
|
has_sof = True
|
||||||
from cclifileimport import CCLIFileImport
|
|
||||||
from wowimport import WowImport
|
|
||||||
except ImportError:
|
except ImportError:
|
||||||
pass
|
has_sof = False
|
||||||
|
try:
|
||||||
|
from oooimport import OooImport
|
||||||
|
has_ooo = True
|
||||||
|
except ImportError:
|
||||||
|
has_ooo = False
|
||||||
|
|
||||||
class SongFormat(object):
|
class SongFormat(object):
|
||||||
"""
|
"""
|
||||||
|
@ -41,6 +51,7 @@ class SongFormat(object):
|
||||||
plus a few helper functions to facilitate generic handling of song types
|
plus a few helper functions to facilitate generic handling of song types
|
||||||
for importing.
|
for importing.
|
||||||
"""
|
"""
|
||||||
|
_format_availability = {}
|
||||||
Unknown = -1
|
Unknown = -1
|
||||||
OpenLP2 = 0
|
OpenLP2 = 0
|
||||||
OpenLP1 = 1
|
OpenLP1 = 1
|
||||||
|
@ -93,4 +104,16 @@ class SongFormat(object):
|
||||||
SongFormat.Generic
|
SongFormat.Generic
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def set_availability(format, available):
|
||||||
|
SongFormat._format_availability[format] = available
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_availability(format):
|
||||||
|
return SongFormat._format_availability.get(format, True)
|
||||||
|
|
||||||
|
SongFormat.set_availability(SongFormat.OpenLP1, has_openlp1)
|
||||||
|
SongFormat.set_availability(SongFormat.SongsOfFellowship, has_sof)
|
||||||
|
SongFormat.set_availability(SongFormat.Generic, has_ooo)
|
||||||
|
|
||||||
__all__ = [u'SongFormat']
|
__all__ = [u'SongFormat']
|
||||||
|
|
|
@ -28,10 +28,8 @@ The :mod:`olp1import` module provides the functionality for importing
|
||||||
openlp.org 1.x song databases into the current installation database.
|
openlp.org 1.x song databases into the current installation database.
|
||||||
"""
|
"""
|
||||||
import logging
|
import logging
|
||||||
try:
|
import chardet
|
||||||
import sqlite
|
import sqlite
|
||||||
except:
|
|
||||||
pass
|
|
||||||
|
|
||||||
from openlp.core.lib import translate
|
from openlp.core.lib import translate
|
||||||
from songimport import SongImport
|
from songimport import SongImport
|
||||||
|
@ -56,6 +54,21 @@ class OpenLP1SongImport(SongImport):
|
||||||
SongImport.__init__(self, manager)
|
SongImport.__init__(self, manager)
|
||||||
self.import_source = kwargs[u'filename']
|
self.import_source = kwargs[u'filename']
|
||||||
|
|
||||||
|
def decode_string(self, raw):
|
||||||
|
"""
|
||||||
|
Use chardet to detect the encoding of the raw string, and convert it
|
||||||
|
to unicode.
|
||||||
|
|
||||||
|
``raw``
|
||||||
|
The raw bytestring to decode.
|
||||||
|
"""
|
||||||
|
detection = chardet.detect(raw)
|
||||||
|
if detection[u'confidence'] < 0.8:
|
||||||
|
codec = u'windows-1252'
|
||||||
|
else:
|
||||||
|
codec = detection[u'encoding']
|
||||||
|
return unicode(raw, codec)
|
||||||
|
|
||||||
def do_import(self):
|
def do_import(self):
|
||||||
"""
|
"""
|
||||||
Run the import for an openlp.org 1.x song database.
|
Run the import for an openlp.org 1.x song database.
|
||||||
|
@ -63,6 +76,11 @@ class OpenLP1SongImport(SongImport):
|
||||||
# Connect to the database
|
# Connect to the database
|
||||||
connection = sqlite.connect(self.import_source)
|
connection = sqlite.connect(self.import_source)
|
||||||
cursor = connection.cursor()
|
cursor = connection.cursor()
|
||||||
|
# Determine if we're using a new or an old DB
|
||||||
|
cursor.execute(u'SELECT name FROM sqlite_master '
|
||||||
|
u'WHERE type = \'table\' AND name = \'tracks\'')
|
||||||
|
table_list = cursor.fetchall()
|
||||||
|
new_db = len(table_list) > 0
|
||||||
# Count the number of records we need to import, for the progress bar
|
# Count the number of records we need to import, for the progress bar
|
||||||
cursor.execute(u'SELECT COUNT(songid) FROM songs')
|
cursor.execute(u'SELECT COUNT(songid) FROM songs')
|
||||||
count = int(cursor.fetchone()[0])
|
count = int(cursor.fetchone()[0])
|
||||||
|
@ -71,6 +89,7 @@ class OpenLP1SongImport(SongImport):
|
||||||
# "cache" our list of authors
|
# "cache" our list of authors
|
||||||
cursor.execute(u'SELECT authorid, authorname FROM authors')
|
cursor.execute(u'SELECT authorid, authorname FROM authors')
|
||||||
authors = cursor.fetchall()
|
authors = cursor.fetchall()
|
||||||
|
if new_db:
|
||||||
# "cache" our list of tracks
|
# "cache" our list of tracks
|
||||||
cursor.execute(u'SELECT trackid, fulltrackname FROM tracks')
|
cursor.execute(u'SELECT trackid, fulltrackname FROM tracks')
|
||||||
tracks = cursor.fetchall()
|
tracks = cursor.fetchall()
|
||||||
|
@ -84,9 +103,9 @@ class OpenLP1SongImport(SongImport):
|
||||||
success = False
|
success = False
|
||||||
break
|
break
|
||||||
song_id = song[0]
|
song_id = song[0]
|
||||||
title = unicode(song[1], u'cp1252')
|
title = self.decode_string(song[1])
|
||||||
lyrics = unicode(song[2], u'cp1252').replace(u'\r', u'')
|
lyrics = self.decode_string(song[2]).replace(u'\r', u'')
|
||||||
copyright = unicode(song[3], u'cp1252')
|
copyright = self.decode_string(song[3])
|
||||||
self.import_wizard.incrementProgressBar(
|
self.import_wizard.incrementProgressBar(
|
||||||
unicode(translate('SongsPlugin.ImportWizardForm',
|
unicode(translate('SongsPlugin.ImportWizardForm',
|
||||||
'Importing "%s"...')) % title)
|
'Importing "%s"...')) % title)
|
||||||
|
@ -102,15 +121,12 @@ class OpenLP1SongImport(SongImport):
|
||||||
break
|
break
|
||||||
for author in authors:
|
for author in authors:
|
||||||
if author[0] == author_id[0]:
|
if author[0] == author_id[0]:
|
||||||
self.parse_author(unicode(author[1], u'cp1252'))
|
self.parse_author(self.decode_string(author[1]))
|
||||||
break
|
break
|
||||||
if self.stop_import_flag:
|
if self.stop_import_flag:
|
||||||
success = False
|
success = False
|
||||||
break
|
break
|
||||||
cursor.execute(u'SELECT name FROM sqlite_master '
|
if new_db:
|
||||||
u'WHERE type = \'table\' AND name = \'tracks\'')
|
|
||||||
table_list = cursor.fetchall()
|
|
||||||
if len(table_list) > 0:
|
|
||||||
cursor.execute(u'SELECT trackid FROM songtracks '
|
cursor.execute(u'SELECT trackid FROM songtracks '
|
||||||
u'WHERE songid = %s ORDER BY listindex' % song_id)
|
u'WHERE songid = %s ORDER BY listindex' % song_id)
|
||||||
track_ids = cursor.fetchall()
|
track_ids = cursor.fetchall()
|
||||||
|
@ -120,10 +136,11 @@ class OpenLP1SongImport(SongImport):
|
||||||
break
|
break
|
||||||
for track in tracks:
|
for track in tracks:
|
||||||
if track[0] == track_id[0]:
|
if track[0] == track_id[0]:
|
||||||
self.add_media_file(unicode(track[1], u'cp1252'))
|
self.add_media_file(self.decode_string(track[1]))
|
||||||
break
|
break
|
||||||
if self.stop_import_flag:
|
if self.stop_import_flag:
|
||||||
success = False
|
success = False
|
||||||
break
|
break
|
||||||
self.finish()
|
self.finish()
|
||||||
return success
|
return success
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,7 @@ from zipfile import ZipFile
|
||||||
from lxml import objectify
|
from lxml import objectify
|
||||||
from lxml.etree import Error, LxmlError
|
from lxml.etree import Error, LxmlError
|
||||||
|
|
||||||
|
from openlp.core.lib import translate
|
||||||
from openlp.plugins.songs.lib.songimport import SongImport
|
from openlp.plugins.songs.lib.songimport import SongImport
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
@ -170,7 +171,7 @@ class OpenSongImport(SongImport):
|
||||||
self.authors = []
|
self.authors = []
|
||||||
try:
|
try:
|
||||||
tree = objectify.parse(file)
|
tree = objectify.parse(file)
|
||||||
except Error, LxmlError:
|
except (Error, LxmlError):
|
||||||
log.exception(u'Error parsing XML')
|
log.exception(u'Error parsing XML')
|
||||||
return
|
return
|
||||||
root = tree.getroot()
|
root = tree.getroot()
|
||||||
|
@ -276,7 +277,8 @@ class OpenSongImport(SongImport):
|
||||||
if len(our_verse_order) > 0:
|
if len(our_verse_order) > 0:
|
||||||
order = our_verse_order
|
order = our_verse_order
|
||||||
else:
|
else:
|
||||||
log.warn(u'No verse order available for %s, skipping.', self.title)
|
log.warn(u'No verse order available for %s, skipping.',
|
||||||
|
self.title)
|
||||||
for tag in order:
|
for tag in order:
|
||||||
if len(tag) == 1:
|
if len(tag) == 1:
|
||||||
tag = tag + u'1' # Assume it's no.1 if it's not there
|
tag = tag + u'1' # Assume it's no.1 if it's not there
|
||||||
|
|
|
@ -71,8 +71,7 @@ class SongImport(QtCore.QObject):
|
||||||
self.song_book_pub = u''
|
self.song_book_pub = u''
|
||||||
self.verse_order_list = []
|
self.verse_order_list = []
|
||||||
self.verses = []
|
self.verses = []
|
||||||
self.versecount = 0
|
self.versecounts = {}
|
||||||
self.choruscount = 0
|
|
||||||
self.copyright_string = unicode(translate(
|
self.copyright_string = unicode(translate(
|
||||||
'SongsPlugin.SongImport', 'copyright'))
|
'SongsPlugin.SongImport', 'copyright'))
|
||||||
self.copyright_symbol = unicode(translate(
|
self.copyright_symbol = unicode(translate(
|
||||||
|
@ -193,7 +192,7 @@ class SongImport(QtCore.QObject):
|
||||||
return
|
return
|
||||||
self.media_files.append(filename)
|
self.media_files.append(filename)
|
||||||
|
|
||||||
def add_verse(self, verse, versetag=None):
|
def add_verse(self, verse, versetag=u'V'):
|
||||||
"""
|
"""
|
||||||
Add a verse. This is the whole verse, lines split by \n
|
Add a verse. This is the whole verse, lines split by \n
|
||||||
Verse tag can be V1/C1/B etc, or 'V' and 'C' (will count the verses/
|
Verse tag can be V1/C1/B etc, or 'V' and 'C' (will count the verses/
|
||||||
|
@ -205,13 +204,14 @@ class SongImport(QtCore.QObject):
|
||||||
if oldverse.strip() == verse.strip():
|
if oldverse.strip() == verse.strip():
|
||||||
self.verse_order_list.append(oldversetag)
|
self.verse_order_list.append(oldversetag)
|
||||||
return
|
return
|
||||||
if versetag == u'V' or not versetag:
|
if versetag[0] in self.versecounts:
|
||||||
self.versecount += 1
|
self.versecounts[versetag[0]] += 1
|
||||||
versetag = u'V' + unicode(self.versecount)
|
else:
|
||||||
if versetag.startswith(u'C'):
|
self.versecounts[versetag[0]] = 1
|
||||||
self.choruscount += 1
|
if len(versetag) == 1:
|
||||||
if versetag == u'C':
|
versetag += unicode(self.versecounts[versetag[0]])
|
||||||
versetag += unicode(self.choruscount)
|
elif int(versetag[1:]) > self.versecounts[versetag[0]]:
|
||||||
|
self.versecounts[versetag[0]] = int(versetag[1:])
|
||||||
self.verses.append([versetag, verse.rstrip()])
|
self.verses.append([versetag, verse.rstrip()])
|
||||||
self.verse_order_list.append(versetag)
|
self.verse_order_list.append(versetag)
|
||||||
if versetag.startswith(u'V') and self.contains_verse(u'C1'):
|
if versetag.startswith(u'V') and self.contains_verse(u'C1'):
|
||||||
|
|
|
@ -119,7 +119,7 @@ class WowImport(SongImport):
|
||||||
# TODO: check that it is a valid words of worship file (could
|
# TODO: check that it is a valid words of worship file (could
|
||||||
# check header for WoW File Song Word)
|
# check header for WoW File Song Word)
|
||||||
self.author = u''
|
self.author = u''
|
||||||
self.copyright= u''
|
self.copyright = u''
|
||||||
# Get the song title
|
# Get the song title
|
||||||
self.file_name = os.path.split(file)[1]
|
self.file_name = os.path.split(file)[1]
|
||||||
self.import_wizard.incrementProgressBar(
|
self.import_wizard.incrementProgressBar(
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -1,6 +1,6 @@
|
||||||
--- openlp/core/resources.py.old Mon Jun 21 23:16:19 2010
|
--- openlp/core/resources.py.old Mon Jun 21 23:16:19 2010
|
||||||
+++ openlp/core/resources.py Mon Jun 21 23:27:48 2010
|
+++ openlp/core/resources.py Mon Jun 21 23:27:48 2010
|
||||||
@@ -1,10 +1,31 @@
|
@@ -1,10 +1,32 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
+# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
|
+# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
|
||||||
|
|
||||||
|
@ -14,8 +14,9 @@
|
||||||
+# --------------------------------------------------------------------------- #
|
+# --------------------------------------------------------------------------- #
|
||||||
+# Copyright (c) 2008-2010 Raoul Snyman #
|
+# Copyright (c) 2008-2010 Raoul Snyman #
|
||||||
+# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael #
|
+# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael #
|
||||||
+# Gorven, Scott Guerrieri, Christian Richter, Maikel Stuivenberg, Martin #
|
+# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian #
|
||||||
+# Thompson, Jon Tibble, Carsten Tinggaard #
|
+# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, #
|
||||||
|
+# Carsten Tinggaard, Frode Woldsund #
|
||||||
+# --------------------------------------------------------------------------- #
|
+# --------------------------------------------------------------------------- #
|
||||||
+# This program is free software; you can redistribute it and/or modify it #
|
+# This program is free software; you can redistribute it and/or modify it #
|
||||||
+# under the terms of the GNU General Public License as published by the Free #
|
+# under the terms of the GNU General Public License as published by the Free #
|
||||||
|
|
|
@ -24,13 +24,31 @@
|
||||||
# with this program; if not, write to the Free Software Foundation, Inc., 59 #
|
# with this program; if not, write to the Free Software Foundation, Inc., 59 #
|
||||||
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
|
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# Short description
|
|
||||||
# Steps for creating languages:
|
|
||||||
# 1. make sure that the openlp_en.ts file exist
|
|
||||||
# 2. go to scripts folder and start:
|
|
||||||
# python translation_utils.py -a
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
This script is used to maintain the translation files in OpenLP. It downloads
|
||||||
|
the latest translation files from the Pootle translation server, updates the
|
||||||
|
local translation files from both the source code and the files from Pootle,
|
||||||
|
and can also generate the compiled translation files.
|
||||||
|
|
||||||
|
Create New Language
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
To create a new language, simply run this script with the ``-a`` command line
|
||||||
|
option::
|
||||||
|
|
||||||
|
@:~$ ./translation_utils.py -a
|
||||||
|
|
||||||
|
Update Translation Files
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
The best way to update the translations is to download the files from Pootle,
|
||||||
|
and then update the local files using both the downloaded files and the source.
|
||||||
|
This is done easily via the ``-d``, ``-p`` and ``-u`` options::
|
||||||
|
|
||||||
|
@:~$ ./translation_utils.py -dpu
|
||||||
|
|
||||||
|
"""
|
||||||
import os
|
import os
|
||||||
import urllib
|
import urllib
|
||||||
import re
|
import re
|
||||||
|
@ -39,201 +57,277 @@ from optparse import OptionParser
|
||||||
from PyQt4 import QtCore
|
from PyQt4 import QtCore
|
||||||
from BeautifulSoup import BeautifulSoup
|
from BeautifulSoup import BeautifulSoup
|
||||||
|
|
||||||
class TranslationUtils(object):
|
SERVER_URL = u'http://pootle.projecthq.biz/export/openlp/'
|
||||||
|
IGNORED_PATHS = [u'scripts']
|
||||||
|
IGNORED_FILES = [u'setup.py']
|
||||||
|
|
||||||
|
verbose_mode = False
|
||||||
|
|
||||||
|
class Command(object):
|
||||||
|
"""
|
||||||
|
Provide an enumeration of commands.
|
||||||
|
"""
|
||||||
|
Download = 1
|
||||||
|
Create = 2
|
||||||
|
Prepare = 3
|
||||||
|
Update = 4
|
||||||
|
Generate = 5
|
||||||
|
|
||||||
|
class CommandStack(object):
|
||||||
|
"""
|
||||||
|
This class provides an iterable stack.
|
||||||
|
"""
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.ignore_paths = [u'./scripts']
|
self.current_index = 0
|
||||||
self.ignore_files = [u'setup.py']
|
self.data = []
|
||||||
self.server_url = u'http://pootle.projecthq.biz/export/openlp/'
|
|
||||||
self.cmd_stack = []
|
|
||||||
self.stack_count = 0
|
|
||||||
self.verbose = False
|
|
||||||
|
|
||||||
|
def __len__(self):
|
||||||
|
return len(self.data)
|
||||||
|
|
||||||
def process_stack(self):
|
def __getitem__(self, index):
|
||||||
if len(self.cmd_stack) > 0:
|
if self.data[index].get(u'arguments'):
|
||||||
if len(self.cmd_stack) == self.stack_count:
|
return self.data[index][u'command'], self.data[index][u'arguments']
|
||||||
print u'Process %d commands' % self.stack_count
|
|
||||||
print u'%d. ' % (self.stack_count-len(self.cmd_stack)+1),
|
|
||||||
command = self.cmd_stack.pop(0)
|
|
||||||
if len(command) > 1:
|
|
||||||
command[0](command[1])
|
|
||||||
else:
|
else:
|
||||||
command[0]()
|
return self.data[index][u'command']
|
||||||
|
|
||||||
|
def __iter__(self):
|
||||||
|
return self
|
||||||
|
|
||||||
|
def next(self):
|
||||||
|
if self.current_index == len(self.data):
|
||||||
|
raise StopIteration
|
||||||
else:
|
else:
|
||||||
print "Finished all commands"
|
current_item = self.data[self.current_index][u'command']
|
||||||
|
self.current_index += 1
|
||||||
|
return current_item
|
||||||
|
|
||||||
|
def append(self, command, **kwargs):
|
||||||
|
data = {u'command': command}
|
||||||
|
if u'arguments' in kwargs:
|
||||||
|
data[u'arguments'] = kwargs[u'arguments']
|
||||||
|
self.data.append(data)
|
||||||
|
|
||||||
|
def reset(self):
|
||||||
|
self.current_index = 0
|
||||||
|
|
||||||
|
|
||||||
def downloadTranslations(self):
|
def print_verbose(text):
|
||||||
print 'Download Translation files from HQ-Server'
|
"""
|
||||||
page = urllib.urlopen(u'%s' % (self.server_url))
|
This method checks to see if we are in verbose mode, and if so prints
|
||||||
soup = BeautifulSoup(page)
|
``text`` out.
|
||||||
languages = soup.findAll(text=re.compile(".*\.ts"))
|
|
||||||
for language in languages:
|
|
||||||
filename = os.path.join(u'..', u'resources', u'i18n',
|
|
||||||
u'openlp_%s' % language)
|
|
||||||
self.printVerbose(u'Get Translation File: %s' % filename)
|
|
||||||
self.get_and_write_file(language, filename)
|
|
||||||
print u' done'
|
|
||||||
self.process_stack()
|
|
||||||
|
|
||||||
def get_and_write_file(self, language, filename):
|
``text``
|
||||||
page = urllib.urlopen(u'%s%s' % (self.server_url, language))
|
The text to print.
|
||||||
|
"""
|
||||||
|
global verbose_mode
|
||||||
|
if verbose_mode:
|
||||||
|
print u' %s' % text
|
||||||
|
|
||||||
|
def run(command):
|
||||||
|
"""
|
||||||
|
This method runs an external application.
|
||||||
|
|
||||||
|
``command``
|
||||||
|
The command to run.
|
||||||
|
"""
|
||||||
|
print_verbose(command)
|
||||||
|
process = QtCore.QProcess()
|
||||||
|
process.start(command)
|
||||||
|
while (process.waitForReadyRead()):
|
||||||
|
print_verbose(u'ReadyRead: %s' % QtCore.QString(process.readAll()))
|
||||||
|
print_verbose(u'Error(s):\n%s' % process.readAllStandardError())
|
||||||
|
print_verbose(u'Output:\n%s' % process.readAllStandardOutput())
|
||||||
|
print u' Done.'
|
||||||
|
|
||||||
|
def download_file(source_filename, dest_filename):
|
||||||
|
"""
|
||||||
|
Download a file and save it to disk.
|
||||||
|
|
||||||
|
``source_filename``
|
||||||
|
The file to download.
|
||||||
|
|
||||||
|
``dest_filename``
|
||||||
|
The new local file name.
|
||||||
|
"""
|
||||||
|
print_verbose(u'Downloading from: %s' % (SERVER_URL + source_filename))
|
||||||
|
page = urllib.urlopen(SERVER_URL + source_filename)
|
||||||
content = page.read().decode('utf8')
|
content = page.read().decode('utf8')
|
||||||
page.close()
|
page.close()
|
||||||
file = open(filename, u'w')
|
file = open(dest_filename, u'w')
|
||||||
file.write(content.encode('utf8'))
|
file.write(content.encode('utf8'))
|
||||||
file.close()
|
file.close()
|
||||||
|
|
||||||
def creation(self, language):
|
def download_translations():
|
||||||
print "Create new Translation File"
|
|
||||||
"""
|
"""
|
||||||
Use this option to create a new translation file
|
This method downloads the translation files from the Pootle server.
|
||||||
this function:
|
|
||||||
* create the new *.ts file
|
|
||||||
"""
|
"""
|
||||||
filename = os.path.join(u'..', u'resources', u'i18n',
|
print 'Download translation files from Pootle'
|
||||||
u'openlp_%s.ts' % language)
|
page = urllib.urlopen(SERVER_URL)
|
||||||
self.get_and_write_file(u'en.ts', filename)
|
soup = BeautifulSoup(page)
|
||||||
self.printVerbose("""
|
languages = soup.findAll(text=re.compile(r'.*\.ts'))
|
||||||
Please remind: For permanent providing this language:
|
for language in languages:
|
||||||
this language name have to append to the global list
|
filename = os.path.join(os.path.abspath(u'..'), u'resources', u'i18n',
|
||||||
variable "translations" in this file
|
language)
|
||||||
and this file have to be uploaded to the Pootle Server
|
print_verbose(u'Get Translation File: %s' % filename)
|
||||||
Please contact the developers!
|
download_file(language, filename)
|
||||||
""")
|
print u' Done.'
|
||||||
print u' done'
|
|
||||||
self.process_stack()
|
|
||||||
|
|
||||||
|
def prepare_project():
|
||||||
def preparation(self):
|
"""
|
||||||
|
This method creates the project file needed to update the translation files
|
||||||
|
and compile them into .qm files.
|
||||||
|
"""
|
||||||
print u'Generating the openlp.pro file'
|
print u'Generating the openlp.pro file'
|
||||||
stringlist = []
|
lines = []
|
||||||
start_dir = os.path.join(u'..')
|
start_dir = os.path.abspath(u'..')
|
||||||
|
start_dir = start_dir + os.sep
|
||||||
|
print_verbose(u'Starting directory: %s' % start_dir)
|
||||||
for root, dirs, files in os.walk(start_dir):
|
for root, dirs, files in os.walk(start_dir):
|
||||||
for file in files:
|
for file in files:
|
||||||
path = u'%s' % root
|
path = root.replace(start_dir, u'').replace(u'\\', u'/') #.replace(u'..', u'.')
|
||||||
path = path.replace('\\','/')
|
|
||||||
path = path.replace('..','.')
|
|
||||||
|
|
||||||
if file.startswith(u'hook-') or file.startswith(u'test_'):
|
if file.startswith(u'hook-') or file.startswith(u'test_'):
|
||||||
continue
|
continue
|
||||||
|
ignore = False
|
||||||
cond = False
|
for ignored_path in IGNORED_PATHS:
|
||||||
for search in self.ignore_paths:
|
if path.startswith(ignored_path):
|
||||||
if path.startswith(search):
|
ignore = True
|
||||||
cond = True
|
break
|
||||||
if cond:
|
if ignore:
|
||||||
continue
|
continue
|
||||||
cond = False
|
ignore = False
|
||||||
for search in self.ignore_files:
|
for ignored_file in IGNORED_FILES:
|
||||||
if search == file:
|
if file == ignored_file:
|
||||||
cond = True
|
ignore = True
|
||||||
if cond:
|
break
|
||||||
|
if ignore:
|
||||||
continue
|
continue
|
||||||
|
if file.endswith(u'.py') or file.endswith(u'.pyw'):
|
||||||
if file.endswith(u'.py'):
|
if path:
|
||||||
line = u'%s/%s' % (path, file)
|
line = u'%s/%s' % (path, file)
|
||||||
self.printVerbose(u'Parsing "%s"' % line)
|
else:
|
||||||
stringlist.append(u'SOURCES += %s' % line)
|
line = file
|
||||||
elif file.endswith(u'.pyw'):
|
print_verbose(u'Parsing "%s"' % line)
|
||||||
line = u'%s/%s' % (path, file)
|
lines.append(u'SOURCES += %s' % line)
|
||||||
self.printVerbose(u'Parsing "%s"' % line)
|
|
||||||
stringlist.append(u'SOURCES += %s' % line)
|
|
||||||
elif file.endswith(u'.ts'):
|
elif file.endswith(u'.ts'):
|
||||||
line = u'%s/%s' % (path, file)
|
line = u'%s/%s' % (path, file)
|
||||||
self.printVerbose(u'Parsing "%s"' % line)
|
print_verbose(u'Parsing "%s"' % line)
|
||||||
stringlist.append(u'TRANSLATIONS += %s' % line)
|
lines.append(u'TRANSLATIONS += %s' % line)
|
||||||
|
lines.sort()
|
||||||
stringlist.sort()
|
file = open(os.path.join(start_dir, u'openlp.pro'), u'w')
|
||||||
self.write_file(os.path.join(start_dir, u'openlp.pro'), stringlist)
|
file.write(u'\n'.join(lines).encode('utf8'))
|
||||||
print u' done'
|
|
||||||
self.process_stack()
|
|
||||||
|
|
||||||
def update(self):
|
|
||||||
print u'Update the translation files'
|
|
||||||
cmd = u'pylupdate4 -verbose -noobsolete ../openlp.pro'
|
|
||||||
self.start_cmd(cmd)
|
|
||||||
|
|
||||||
def generate(self):
|
|
||||||
print u'Generate the related *.qm files'
|
|
||||||
cmd = u'lrelease ../openlp.pro'
|
|
||||||
self.start_cmd(cmd)
|
|
||||||
|
|
||||||
def write_file(self, filename, stringlist):
|
|
||||||
content = u''
|
|
||||||
for line in stringlist:
|
|
||||||
content = u'%s%s\n' % (content, line)
|
|
||||||
file = open(filename, u'w')
|
|
||||||
file.write(content.encode('utf8'))
|
|
||||||
file.close()
|
file.close()
|
||||||
|
print u' Done.'
|
||||||
|
|
||||||
def printVerbose(self, data):
|
def update_translations():
|
||||||
if self.verbose:
|
print u'Update the translation files'
|
||||||
print u' %s' % data
|
if not os.path.exists(os.path.join(os.path.abspath(u'..'), u'openlp.pro')):
|
||||||
|
print u'You have no generated a project file yet, please run this ' + \
|
||||||
|
u'script with the -p option.'
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
os.chdir(os.path.abspath(u'..'))
|
||||||
|
run(u'pylupdate4 -verbose -noobsolete openlp.pro')
|
||||||
|
|
||||||
def start_cmd(self, command):
|
def generate_binaries():
|
||||||
self.printVerbose(command)
|
print u'Generate the related *.qm files'
|
||||||
self.process = QtCore.QProcess()
|
if not os.path.exists(os.path.join(os.path.abspath(u'..'), u'openlp.pro')):
|
||||||
self.process.start(command)
|
print u'You have no generated a project file yet, please run this ' + \
|
||||||
while (self.process.waitForReadyRead()):
|
u'script with the -p option. It is also recommended that you ' + \
|
||||||
self.printVerbose(u'ReadyRead: %s' % QtCore.QString(self.process.readAll()))
|
u'this script with the -u option to update the translation ' + \
|
||||||
self.printVerbose(self.process.readAllStandardError())
|
u'files as well.'
|
||||||
self.printVerbose(self.process.readAllStandardOutput())
|
return
|
||||||
print u' done'
|
else:
|
||||||
self.process_stack()
|
os.chdir(os.path.abspath(u'..'))
|
||||||
|
run(u'lrelease openlp.pro')
|
||||||
|
|
||||||
|
def create_translation(language):
|
||||||
|
"""
|
||||||
|
This method creates a new translation file.
|
||||||
|
|
||||||
|
``language``
|
||||||
|
The language file to create.
|
||||||
|
"""
|
||||||
|
print "Create new Translation File"
|
||||||
|
filename = os.path.join(os.path.abspath(u'..'), u'resources', u'i18n', language)
|
||||||
|
download_file(u'en.ts', filename)
|
||||||
|
print u'\n** Please Note **\n'
|
||||||
|
print u'In order to get this file into OpenLP and onto the Pootle ' + \
|
||||||
|
u'translation server you will need to subscribe to the OpenLP' + \
|
||||||
|
u'Translators mailing list, and request that your language file ' + \
|
||||||
|
u'be added to the project.\n'
|
||||||
|
print u' Done'
|
||||||
|
|
||||||
|
def process_stack(command_stack):
|
||||||
|
"""
|
||||||
|
This method looks at the commands in the command stack, and processes them
|
||||||
|
in the order they are in the stack.
|
||||||
|
|
||||||
|
``command_stack``
|
||||||
|
The command stack to process.
|
||||||
|
"""
|
||||||
|
if command_stack:
|
||||||
|
print u'Processing %d commands...' % len(command_stack)
|
||||||
|
for command in command_stack:
|
||||||
|
print u'%d.' % (command_stack.current_index),
|
||||||
|
if command == Command.Download:
|
||||||
|
download_translations()
|
||||||
|
elif command == Command.Prepare:
|
||||||
|
prepare_project()
|
||||||
|
elif command == Command.Update:
|
||||||
|
update_translations()
|
||||||
|
elif command == Command.Generate:
|
||||||
|
generate_binaries()
|
||||||
|
elif command == Command.Create:
|
||||||
|
command, arguments = command_stack[command_stack.current_index]
|
||||||
|
create_translation(*arguments)
|
||||||
|
print u'Finished processing commands.'
|
||||||
|
else:
|
||||||
|
print u'No commands to process.'
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
# start Main Class
|
global verbose_mode
|
||||||
Util = TranslationUtils()
|
|
||||||
|
|
||||||
# Set up command line options.
|
# Set up command line options.
|
||||||
usage = u'''
|
usage = u'%prog [options]\nOptions are parsed in the order they are ' + \
|
||||||
This script handle the translation files for OpenLP.
|
u'listed below. If no options are given, "-dpug" will be used.\n\n' + \
|
||||||
Usage: %prog [options]
|
u'This script is used to manage OpenLP\'s translation files.'
|
||||||
If no option will be used, options "-d -p -u -g" will be set automatically
|
|
||||||
'''
|
|
||||||
parser = OptionParser(usage=usage)
|
parser = OptionParser(usage=usage)
|
||||||
parser.add_option('-d', '--download-ts', action='store_true',
|
parser.add_option('-d', '--download-ts', dest='download',
|
||||||
dest='download', help='Load languages from Pootle Server')
|
action='store_true', help='download language files from Pootle')
|
||||||
parser.add_option('-c', '--create', metavar='lang',
|
parser.add_option('-c', '--create', dest=u'create', metavar='LANG',
|
||||||
help='creation of new translation file, Parameter: language (e.g. "en_GB"')
|
help='create a new translation file for language LANG, e.g. "en_GB"')
|
||||||
parser.add_option('-p', '--prepare', action='store_true', dest='prepare',
|
parser.add_option('-p', '--prepare', dest='prepare', action='store_true',
|
||||||
help='preparation (generate pro file)')
|
help='generate a project file, used to update the translations')
|
||||||
parser.add_option('-u', '--update', action='store_true', dest='update',
|
parser.add_option('-u', '--update', action='store_true', dest='update',
|
||||||
help='update translation files')
|
help='update translation files (needs a project file)')
|
||||||
parser.add_option('-g', '--generate', action='store_true', dest='generate',
|
parser.add_option('-g', '--generate', dest='generate', action='store_true',
|
||||||
help='generate qm files')
|
help='compile .ts files into .qm files')
|
||||||
parser.add_option('-v', '--verbose', action='store_true', dest='verbose',
|
parser.add_option('-v', '--verbose', dest='verbose', action='store_true',
|
||||||
help='Give more informations while processing')
|
help='show extra information while processing translations')
|
||||||
|
|
||||||
(options, args) = parser.parse_args()
|
(options, args) = parser.parse_args()
|
||||||
|
# Create and populate the command stack
|
||||||
|
command_stack = CommandStack()
|
||||||
if options.download:
|
if options.download:
|
||||||
Util.cmd_stack.append([Util.downloadTranslations])
|
command_stack.append(Command.Download)
|
||||||
if options.create:
|
if options.create:
|
||||||
Util.cmd_stack.append([Util.creation, u'%s' % options.create])
|
command_stack.append(Command.Create, arguments=[options.create])
|
||||||
if options.prepare:
|
if options.prepare:
|
||||||
Util.cmd_stack.append([Util.preparation])
|
command_stack.append(Command.Prepare)
|
||||||
if options.update:
|
if options.update:
|
||||||
Util.cmd_stack.append([Util.update])
|
command_stack.append(Command.Update)
|
||||||
if options.generate:
|
if options.generate:
|
||||||
Util.cmd_stack.append([Util.generate])
|
command_stack.append(Command.Generate)
|
||||||
if options.verbose:
|
verbose_mode = options.verbose
|
||||||
Util.verbose = True
|
if not command_stack:
|
||||||
|
command_stack.append(Command.Download)
|
||||||
if len(Util.cmd_stack) == 0:
|
command_stack.append(Command.Prepare)
|
||||||
Util.cmd_stack.append([Util.downloadTranslations])
|
command_stack.append(Command.Update)
|
||||||
Util.cmd_stack.append([Util.preparation])
|
command_stack.append(Command.Generate)
|
||||||
Util.cmd_stack.append([Util.update])
|
# Process the commands
|
||||||
Util.cmd_stack.append([Util.generate])
|
process_stack(command_stack)
|
||||||
|
|
||||||
Util.stack_count = len(Util.cmd_stack)
|
|
||||||
Util.process_stack()
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == u'__main__':
|
if __name__ == u'__main__':
|
||||||
if os.path.split(os.path.abspath(u'.'))[1] != u'scripts':
|
if os.path.split(os.path.abspath(u'.'))[1] != u'scripts':
|
||||||
print u'You need to run this script from the scripts directory.'
|
print u'You need to run this script from the scripts directory.'
|
||||||
else:
|
else:
|
||||||
main()
|
main()
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue