New UI changes(tags, categories, authorisations, module index…)
To run: - ruby lib/remove_old_tags.rb DB_NAME - rake new_ui:migrate_tags - rake new_ui:migrate_categories['APP_KEY,''MODEL_NAME'] (check new_ui.rake for more details)
This commit is contained in:
1 parent
07b3857465
commit
856898016b
1495 files changed
+52132
-9876
No files matched your search
@@ -0,0 +1,79 @@
|
||||
$(function() {
|
||||
var bannerEffect,
|
||||
bannerTime,
|
||||
bannerSpeed,
|
||||
bannerW,
|
||||
bannerH;
|
||||
|
||||
$(".ad_banner_ad_fx").change(function () {
|
||||
bannerTime = $("#pageslide #timeout").val()*1000;
|
||||
bannerSpeed = $("#pageslide #speed").val()*1000;
|
||||
|
||||
bannerTime = parseInt(bannerTime) || 300;
|
||||
bannerSpeed = parseInt(bannerSpeed) || 300;
|
||||
slideshow($(this).val(), bannerTime, bannerSpeed);
|
||||
});
|
||||
slideshow = function (bannerEffect, bannerTime, bannerSpeed) {
|
||||
var $preview = $('#pageslide .preview'),
|
||||
$previewImg = $('#pageslide .preview img');
|
||||
$preview.cycle('destroy');
|
||||
$previewImg.removeAttr('style');
|
||||
$preview.cycle({
|
||||
fx: bannerEffect,
|
||||
timeout: bannerTime,
|
||||
speed: bannerSpeed,
|
||||
});
|
||||
}
|
||||
$('.open-slide').on('click', function() {
|
||||
var $preview = $('#pageslide .preview'),
|
||||
$data = $(this).data(),
|
||||
effect = $data.fx,
|
||||
time = $data.time,
|
||||
speed = $data.speed,
|
||||
W = $data.w,
|
||||
H = $data.h;
|
||||
$("#pageslide #timeout").attr("value", time/1000);
|
||||
$("#pageslide #speed").attr("value", speed/1000);
|
||||
$("#pageslide #banner_width").attr("value", W);
|
||||
$("#pageslide #banner_height").attr("value", H);
|
||||
$("#pageslide #ad_banner_ad_fx option").each(function(i) {
|
||||
if($(this).attr("value") == effect) {
|
||||
this.selected = true;
|
||||
}
|
||||
});
|
||||
slideshow(effect, time, speed)
|
||||
})
|
||||
$('.open-modal').on('click', function() {
|
||||
var $data = $(this).data()
|
||||
bannerEffect = $data.fx;
|
||||
bannerTime = $data.time;
|
||||
bannerSpeed = $data.speed;
|
||||
bannerW = $data.w;
|
||||
bannerH = $data.h;
|
||||
$('#preview').modal('show');
|
||||
});
|
||||
$('#preview').on('shown', function() {
|
||||
if(bannerW > 500) {
|
||||
var resize = 500/bannerW
|
||||
bannerW = Math.floor(bannerW*resize);
|
||||
bannerH = Math.floor(bannerH*resize);
|
||||
};
|
||||
if(bannerH > 300) {
|
||||
var resize = 300/bannerH
|
||||
bannerW = Math.floor(bannerW*resize);
|
||||
bannerH = Math.floor(bannerH*resize);
|
||||
}
|
||||
$(this).find('.preview').cycle({
|
||||
fx: bannerEffect,
|
||||
timeout: bannerTime,
|
||||
speed: bannerSpeed,
|
||||
fit: 1,
|
||||
width: bannerW,
|
||||
height: bannerH,
|
||||
});
|
||||
});
|
||||
$('#preview').on('hidden', function() {
|
||||
$(this).find('.preview').cycle('destroy');
|
||||
$(this).find('.preview img').removeAttr('style');
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,3 @@
|
||||
$(function(){
|
||||
$('.main-list').footable();
|
||||
});
|
||||
@@ -0,0 +1,27 @@
|
||||
$(function () {
|
||||
var $fileList = $('.file-list'),
|
||||
$fileType = $('.file-type');
|
||||
$type = ['pdf', 'psd', 'ai', 'fla', 'swf', 'in', 'acc', 'do', 'xl', 'pp', 'zip', 'rar', '7z', 'txt', 'jp', 'gif', 'png', 'mp3', 'wav']
|
||||
|
||||
$fileType.each(function (i) {
|
||||
var $fileTypeHref = $(this).children('a').attr('href');
|
||||
$fileTypeHref = $fileTypeHref.split("/");
|
||||
$fileTypeHref = $fileTypeHref[$fileTypeHref.length-1];
|
||||
$fileTypeHref = $fileTypeHref.split(".");
|
||||
$fileTypeHref = $fileTypeHref[$fileTypeHref.length-1];
|
||||
|
||||
for(var j = 0; j<$type.length; j++) {
|
||||
if($fileTypeHref.indexOf($type[j])!=-1) {
|
||||
if($type[j] == "swf") {
|
||||
$fileType.eq(i).addClass('type-fla');
|
||||
} else if($type[j] == "zip" || $type[j] == "rar" || $type[j] == "7z") {
|
||||
$fileType.eq(i).addClass('type-zip');
|
||||
} else if($type[j] == "mp3" || $type[j] == "wav") {
|
||||
$fileType.eq(i).addClass('type-audio');
|
||||
} else {
|
||||
$fileType.eq(i).addClass('type-'+$type[j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
+170
@@ -0,0 +1,170 @@
|
||||
/* ===========================================================
|
||||
* bootstrap-fileupload.js j2
|
||||
* http://jasny.github.com/bootstrap/javascript.html#fileupload
|
||||
* ===========================================================
|
||||
* Copyright 2012 Jasny BV, Netherlands.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License")
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* ========================================================== */
|
||||
|
||||
!function ($) {
|
||||
|
||||
"use strict"; // jshint ;_
|
||||
|
||||
/* FILEUPLOAD PUBLIC CLASS DEFINITION
|
||||
* ================================= */
|
||||
|
||||
var Fileupload = function (element, options) {
|
||||
this.$element = $(element)
|
||||
this.type = this.$element.data('uploadtype') || (this.$element.find('.thumbnail').length > 0 ? "image" : "file")
|
||||
|
||||
this.$input = this.$element.find(':file')
|
||||
if (this.$input.length === 0) return
|
||||
|
||||
this.name = this.$input.attr('name') || options.name
|
||||
|
||||
this.$hidden = this.$element.find('input[type=hidden][name="'+this.name+'"]')
|
||||
if (this.$hidden.length === 0) {
|
||||
this.$hidden = $('<input type="hidden" />')
|
||||
this.$element.prepend(this.$hidden)
|
||||
}
|
||||
|
||||
this.$preview = this.$element.find('.fileupload-preview')
|
||||
var height = this.$preview.css('height')
|
||||
if (this.$preview.css('display') != 'inline' && height != '0px' && height != 'none') this.$preview.css('line-height', height)
|
||||
|
||||
this.original = {
|
||||
'exists': this.$element.hasClass('fileupload-exists'),
|
||||
'preview': this.$preview.html(),
|
||||
'hiddenVal': this.$hidden.val()
|
||||
}
|
||||
|
||||
this.$remove = this.$element.find('[data-dismiss="fileupload"]')
|
||||
|
||||
this.$element.find('[data-trigger="fileupload"]').on('click.fileupload', $.proxy(this.trigger, this))
|
||||
|
||||
this.listen()
|
||||
}
|
||||
|
||||
Fileupload.prototype = {
|
||||
|
||||
listen: function() {
|
||||
this.$input.on('change.fileupload', $.proxy(this.change, this))
|
||||
$(this.$input[0].form).on('reset.fileupload', $.proxy(this.reset, this))
|
||||
if (this.$remove) this.$remove.on('click.fileupload', $.proxy(this.clear, this))
|
||||
},
|
||||
|
||||
change: function(e, invoked) {
|
||||
if (invoked === 'clear') return
|
||||
|
||||
var file = e.target.files !== undefined ? e.target.files[0] : (e.target.value ? { name: e.target.value.replace(/^.+\\/, '') } : null)
|
||||
|
||||
if (!file) {
|
||||
this.clear()
|
||||
return
|
||||
}
|
||||
|
||||
this.$hidden.val('')
|
||||
this.$hidden.attr('name', '')
|
||||
this.$input.attr('name', this.name)
|
||||
|
||||
if (this.type === "image" && this.$preview.length > 0 && (typeof file.type !== "undefined" ? file.type.match('image.*') : file.name.match('\\.(gif|png|jpe?g)$')) && typeof FileReader !== "undefined") {
|
||||
var reader = new FileReader()
|
||||
var preview = this.$preview
|
||||
var element = this.$element
|
||||
|
||||
reader.onload = function(e) {
|
||||
preview.html('<img src="' + e.target.result + '" ' + (preview.css('max-height') != 'none' ? 'style="max-height: ' + preview.css('max-height') + ';"' : '') + ' />')
|
||||
element.addClass('fileupload-exists').removeClass('fileupload-new');
|
||||
$('.fileupload-remove').removeClass('active').find('input[type="checkbox"]').prop('checked', false);
|
||||
}
|
||||
|
||||
reader.readAsDataURL(file)
|
||||
} else {
|
||||
this.$preview.text(file.name)
|
||||
this.$element.addClass('fileupload-exists').removeClass('fileupload-new')
|
||||
}
|
||||
},
|
||||
|
||||
clear: function(e) {
|
||||
this.$hidden.val('')
|
||||
this.$hidden.attr('name', this.name)
|
||||
this.$input.attr('name', '')
|
||||
|
||||
//ie8+ doesn't support changing the value of input with type=file so clone instead
|
||||
if (navigator.userAgent.match(/msie/i)){
|
||||
var inputClone = this.$input.clone(true);
|
||||
this.$input.after(inputClone);
|
||||
this.$input.remove();
|
||||
this.$input = inputClone;
|
||||
}else{
|
||||
this.$input.val('')
|
||||
}
|
||||
|
||||
this.$preview.html('')
|
||||
this.$element.addClass('fileupload-new').removeClass('fileupload-exists')
|
||||
|
||||
if (e) {
|
||||
this.$input.trigger('change', [ 'clear' ])
|
||||
e.preventDefault()
|
||||
}
|
||||
},
|
||||
|
||||
reset: function(e) {
|
||||
this.clear()
|
||||
|
||||
this.$hidden.val(this.original.hiddenVal)
|
||||
this.$preview.html(this.original.preview)
|
||||
|
||||
if (this.original.exists) this.$element.addClass('fileupload-exists').removeClass('fileupload-new')
|
||||
else this.$element.addClass('fileupload-new').removeClass('fileupload-exists')
|
||||
},
|
||||
|
||||
trigger: function(e) {
|
||||
this.$input.trigger('click')
|
||||
e.preventDefault()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* FILEUPLOAD PLUGIN DEFINITION
|
||||
* =========================== */
|
||||
|
||||
$.fn.fileupload = function (options) {
|
||||
return this.each(function () {
|
||||
var $this = $(this)
|
||||
, data = $this.data('fileupload')
|
||||
if (!data) $this.data('fileupload', (data = new Fileupload(this, options)))
|
||||
if (typeof options == 'string') data[options]()
|
||||
})
|
||||
}
|
||||
|
||||
$.fn.fileupload.Constructor = Fileupload
|
||||
|
||||
|
||||
/* FILEUPLOAD DATA-API
|
||||
* ================== */
|
||||
|
||||
$(document).on('click.fileupload.data-api', '[data-provides="fileupload"]', function (e) {
|
||||
var $this = $(this)
|
||||
if ($this.data('fileupload')) return
|
||||
$this.fileupload($this.data())
|
||||
|
||||
var $target = $(e.target).closest('[data-dismiss="fileupload"],[data-trigger="fileupload"]');
|
||||
if ($target.length > 0) {
|
||||
$target.trigger('click.fileupload')
|
||||
e.preventDefault()
|
||||
}
|
||||
})
|
||||
|
||||
}(window.jQuery);
|
||||
@@ -0,0 +1,65 @@
|
||||
// function cardCheck() {
|
||||
// if($('.tags').length) {
|
||||
// var $card = $('.checkbox-card .card'),
|
||||
// $check = $card.children($('input[type="checkbox"]'));
|
||||
// $check.each(function(){
|
||||
// if($(this).attr('checked')) {
|
||||
// $(this).parent(".check").addClass("active");
|
||||
// }
|
||||
// })
|
||||
// } else {
|
||||
// var $card = $('.checkbox-card>li'),
|
||||
// $check = $('input[type="checkbox"]');
|
||||
// $check.each(function(){
|
||||
// if($(this).attr('checked')) {
|
||||
// $(this).parent("li").addClass("active");
|
||||
// }
|
||||
// })
|
||||
// }
|
||||
// $card.on('click', function() {
|
||||
// $(this).toggleClass('active')
|
||||
// });
|
||||
// }
|
||||
// $(function(){
|
||||
// cardCheck();
|
||||
// });
|
||||
!function ($) {
|
||||
$.fn.cardCheck = function(param) {
|
||||
_defaultSettings = {
|
||||
item: '',
|
||||
};
|
||||
_set = $.extend(_defaultSettings, param);
|
||||
$main = $(this);
|
||||
$check = $main.find('input[type="checkbox"]');
|
||||
$check.each(function(){
|
||||
if($(this).prop('checked')) {
|
||||
$(this).parent(_set.item).addClass("active");
|
||||
}
|
||||
});
|
||||
$main.delegate(_set.item, 'click', function(e) {
|
||||
$(this).toggleClass('active')
|
||||
});
|
||||
}
|
||||
}(window.jQuery);
|
||||
optionHeight = function() {
|
||||
var $H = $(window).height()-parseInt($('.wrap-inner').css('padding-top'))-$('.bottomnav').innerHeight()-$('#orbit-bar').innerHeight()-2;
|
||||
$('.mini-layout-sidebar .nano').height($H);
|
||||
}
|
||||
$(function(){
|
||||
if($('.mini-layout-sidebar .nano').length) {
|
||||
optionHeight();
|
||||
$(window).resize(function() {
|
||||
optionHeight();
|
||||
});
|
||||
$('.mini-layout-sidebar .nano').nanoScroller({ scrollTop: 0, iOSNativeScrolling: true });
|
||||
}
|
||||
if($('.tags').length) {
|
||||
$('.tags-groups').cardCheck({
|
||||
item: '.card',
|
||||
});
|
||||
} else {
|
||||
$('#card-list').cardCheck({
|
||||
item: '.filter-item',
|
||||
});
|
||||
};
|
||||
});
|
||||
@@ -1,56 +0,0 @@
|
||||
<%#= encoding: utf-8 %>
|
||||
$(function() {
|
||||
var content_holder, content;
|
||||
var selector = 'a[contenteditable="true"]';
|
||||
// prevent clicks inside editable area to fire
|
||||
// a click event on the body
|
||||
// and therefor saving our content before we even edit it
|
||||
|
||||
$(".nav-tabs").find(".icons-pencil").click(function(){
|
||||
$(this).css({
|
||||
"display" : "none"
|
||||
})
|
||||
$(this).next().attr("contenteditable",true).addClass("edit");
|
||||
// $(selector).click(function(e) {
|
||||
// e.stopPropagation();
|
||||
// });
|
||||
|
||||
// initialize the "save" function
|
||||
$(selector).focus(function(e) {
|
||||
content_holder = $(this);
|
||||
content = content_holder.html();
|
||||
// one click outside the editable area saves the content
|
||||
$(selector).keypress( function(e) {
|
||||
// but not if the content didn't change
|
||||
//alert('out!!');
|
||||
if(e.keyCode == 13){
|
||||
$(".nav-tabs>li>a").removeClass("edit");
|
||||
$(this).prev(".icons-pencil").css({
|
||||
"display" : "block"
|
||||
})
|
||||
e.preventDefault();
|
||||
// if ($(e.target).is(selector) || content == content_holder.html()) {
|
||||
// return;
|
||||
// }
|
||||
|
||||
$.ajax({
|
||||
url: content_holder.data('edit-url'),
|
||||
type: 'POST',
|
||||
dataType: 'json',
|
||||
data: { body: content_holder.html() },
|
||||
success: function(json) {
|
||||
$(selector).attr("contenteditable",false)
|
||||
alert("<%= I18n.t('update.success_') %>");
|
||||
//content_holder.effect('highlight', {'color': '#0f0'}, 3000);
|
||||
},
|
||||
error: function() {
|
||||
alert("<%= I18n.t('update.fail') %>");
|
||||
//content_holder.effect('highlight', {'color': '#f00'}, 3000);
|
||||
content_holder.html(content);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -1,126 +0,0 @@
|
||||
/*
|
||||
* Date Format 1.2.3
|
||||
* (c) 2007-2009 Steven Levithan <stevenlevithan.com>
|
||||
* MIT license
|
||||
*
|
||||
* Includes enhancements by Scott Trenda <scott.trenda.net>
|
||||
* and Kris Kowal <cixar.com/~kris.kowal/>
|
||||
*
|
||||
* Accepts a date, a mask, or a date and a mask.
|
||||
* Returns a formatted version of the given date.
|
||||
* The date defaults to the current date/time.
|
||||
* The mask defaults to dateFormat.masks.default.
|
||||
*/
|
||||
|
||||
var dateFormat = function () {
|
||||
var token = /d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZ]|"[^"]*"|'[^']*'/g,
|
||||
timezone = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g,
|
||||
timezoneClip = /[^-+\dA-Z]/g,
|
||||
pad = function (val, len) {
|
||||
val = String(val);
|
||||
len = len || 2;
|
||||
while (val.length < len) val = "0" + val;
|
||||
return val;
|
||||
};
|
||||
|
||||
// Regexes and supporting functions are cached through closure
|
||||
return function (date, mask, utc) {
|
||||
var dF = dateFormat;
|
||||
|
||||
// You can't provide utc if you skip other args (use the "UTC:" mask prefix)
|
||||
if (arguments.length == 1 && Object.prototype.toString.call(date) == "[object String]" && !/\d/.test(date)) {
|
||||
mask = date;
|
||||
date = undefined;
|
||||
}
|
||||
|
||||
// Passing date through Date applies Date.parse, if necessary
|
||||
date = date ? new Date(date) : new Date;
|
||||
if (isNaN(date)) throw SyntaxError("invalid date");
|
||||
|
||||
mask = String(dF.masks[mask] || mask || dF.masks["default"]);
|
||||
|
||||
// Allow setting the utc argument via the mask
|
||||
if (mask.slice(0, 4) == "UTC:") {
|
||||
mask = mask.slice(4);
|
||||
utc = true;
|
||||
}
|
||||
|
||||
var _ = utc ? "getUTC" : "get",
|
||||
d = date[_ + "Date"](),
|
||||
D = date[_ + "Day"](),
|
||||
m = date[_ + "Month"](),
|
||||
y = date[_ + "FullYear"](),
|
||||
H = date[_ + "Hours"](),
|
||||
M = date[_ + "Minutes"](),
|
||||
s = date[_ + "Seconds"](),
|
||||
L = date[_ + "Milliseconds"](),
|
||||
o = utc ? 0 : date.getTimezoneOffset(),
|
||||
flags = {
|
||||
d: d,
|
||||
dd: pad(d),
|
||||
ddd: dF.i18n.dayNames[D],
|
||||
dddd: dF.i18n.dayNames[D + 7],
|
||||
m: m + 1,
|
||||
mm: pad(m + 1),
|
||||
mmm: dF.i18n.monthNames[m],
|
||||
mmmm: dF.i18n.monthNames[m + 12],
|
||||
yy: String(y).slice(2),
|
||||
yyyy: y,
|
||||
h: H % 12 || 12,
|
||||
hh: pad(H % 12 || 12),
|
||||
H: H,
|
||||
HH: pad(H),
|
||||
M: M,
|
||||
MM: pad(M),
|
||||
s: s,
|
||||
ss: pad(s),
|
||||
l: pad(L, 3),
|
||||
L: pad(L > 99 ? Math.round(L / 10) : L),
|
||||
t: H < 12 ? "a" : "p",
|
||||
tt: H < 12 ? "am" : "pm",
|
||||
T: H < 12 ? "A" : "P",
|
||||
TT: H < 12 ? "AM" : "PM",
|
||||
Z: utc ? "UTC" : (String(date).match(timezone) || [""]).pop().replace(timezoneClip, ""),
|
||||
o: (o > 0 ? "-" : "+") + pad(Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o) % 60, 4),
|
||||
S: ["th", "st", "nd", "rd"][d % 10 > 3 ? 0 : (d % 100 - d % 10 != 10) * d % 10]
|
||||
};
|
||||
|
||||
return mask.replace(token, function ($0) {
|
||||
return $0 in flags ? flags[$0] : $0.slice(1, $0.length - 1);
|
||||
});
|
||||
};
|
||||
}();
|
||||
|
||||
// Some common format strings
|
||||
dateFormat.masks = {
|
||||
"default": "ddd mmm dd yyyy HH:MM:ss",
|
||||
shortDate: "m/d/yy",
|
||||
mediumDate: "mmm d, yyyy",
|
||||
longDate: "mmmm d, yyyy",
|
||||
fullDate: "dddd, mmmm d, yyyy",
|
||||
shortTime: "h:MM TT",
|
||||
mediumTime: "h:MM:ss TT",
|
||||
longTime: "h:MM:ss TT Z",
|
||||
isoDate: "yyyy / mm / dd",
|
||||
isoTime: "HH:MM:ss",
|
||||
isoDateTime: "yyyy-mm-dd'T'HH:MM:ss",
|
||||
isoUtcDateTime: "UTC:yyyy-mm-dd'T'HH:MM:ss'Z'"
|
||||
};
|
||||
|
||||
// Internationalization strings
|
||||
dateFormat.i18n = {
|
||||
dayNames: [
|
||||
"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat",
|
||||
"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
|
||||
],
|
||||
monthNames: [
|
||||
"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
|
||||
"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
|
||||
]
|
||||
};
|
||||
|
||||
// For convenience...
|
||||
Date.prototype.format = function (mask, utc) {
|
||||
return dateFormat(this, mask, utc);
|
||||
};
|
||||
|
||||
@@ -1,891 +0,0 @@
|
||||
/**
|
||||
*
|
||||
* Date picker
|
||||
* Author: Stefan Petre www.eyecon.ro
|
||||
*
|
||||
* Dual licensed under the MIT and GPL licenses
|
||||
*
|
||||
*/
|
||||
(function ($) {
|
||||
var DatePicker = function () {
|
||||
var ids = {},
|
||||
views = {
|
||||
years: 'datepickerViewYears',
|
||||
moths: 'datepickerViewMonths',
|
||||
days: 'datepickerViewDays'
|
||||
},
|
||||
tpl = {
|
||||
wrapper: '<div class="datepicker"><div class="datepickerContainer"><table cellspacing="0" cellpadding="0"><tbody><tr></tr></tbody></table></div></div>',
|
||||
head: [
|
||||
'<td>',
|
||||
'<table cellspacing="0" cellpadding="0">',
|
||||
'<thead>',
|
||||
'<tr>',
|
||||
'<th class="datepickerGoPrev"><a href="#"><span><%=prev%></span></a></th>',
|
||||
'<th colspan="6" class="datepickerMonth"><a href="#"><span></span></a></th>',
|
||||
'<th class="datepickerGoNext"><a href="#"><span><%=next%></span></a></th>',
|
||||
'</tr>',
|
||||
'<tr class="datepickerDoW">',
|
||||
'<th><span><%=week%></span></th>',
|
||||
'<th><span><%=day1%></span></th>',
|
||||
'<th><span><%=day2%></span></th>',
|
||||
'<th><span><%=day3%></span></th>',
|
||||
'<th><span><%=day4%></span></th>',
|
||||
'<th><span><%=day5%></span></th>',
|
||||
'<th><span><%=day6%></span></th>',
|
||||
'<th><span><%=day7%></span></th>',
|
||||
'</tr>',
|
||||
'</thead>',
|
||||
'</table></td>'
|
||||
],
|
||||
space : '<td class="datepickerSpace"><div></div></td>',
|
||||
days: [
|
||||
'<tbody class="datepickerDays">',
|
||||
'<tr>',
|
||||
'<th class="datepickerWeek"><a href="#"><span><%=weeks[0].week%></span></a></th>',
|
||||
'<td class="<%=weeks[0].days[0].classname%>"><a href="#"><span><%=weeks[0].days[0].text%></span></a></td>',
|
||||
'<td class="<%=weeks[0].days[1].classname%>"><a href="#"><span><%=weeks[0].days[1].text%></span></a></td>',
|
||||
'<td class="<%=weeks[0].days[2].classname%>"><a href="#"><span><%=weeks[0].days[2].text%></span></a></td>',
|
||||
'<td class="<%=weeks[0].days[3].classname%>"><a href="#"><span><%=weeks[0].days[3].text%></span></a></td>',
|
||||
'<td class="<%=weeks[0].days[4].classname%>"><a href="#"><span><%=weeks[0].days[4].text%></span></a></td>',
|
||||
'<td class="<%=weeks[0].days[5].classname%>"><a href="#"><span><%=weeks[0].days[5].text%></span></a></td>',
|
||||
'<td class="<%=weeks[0].days[6].classname%>"><a href="#"><span><%=weeks[0].days[6].text%></span></a></td>',
|
||||
'</tr>',
|
||||
'<tr>',
|
||||
'<th class="datepickerWeek"><a href="#"><span><%=weeks[1].week%></span></a></th>',
|
||||
'<td class="<%=weeks[1].days[0].classname%>"><a href="#"><span><%=weeks[1].days[0].text%></span></a></td>',
|
||||
'<td class="<%=weeks[1].days[1].classname%>"><a href="#"><span><%=weeks[1].days[1].text%></span></a></td>',
|
||||
'<td class="<%=weeks[1].days[2].classname%>"><a href="#"><span><%=weeks[1].days[2].text%></span></a></td>',
|
||||
'<td class="<%=weeks[1].days[3].classname%>"><a href="#"><span><%=weeks[1].days[3].text%></span></a></td>',
|
||||
'<td class="<%=weeks[1].days[4].classname%>"><a href="#"><span><%=weeks[1].days[4].text%></span></a></td>',
|
||||
'<td class="<%=weeks[1].days[5].classname%>"><a href="#"><span><%=weeks[1].days[5].text%></span></a></td>',
|
||||
'<td class="<%=weeks[1].days[6].classname%>"><a href="#"><span><%=weeks[1].days[6].text%></span></a></td>',
|
||||
'</tr>',
|
||||
'<tr>',
|
||||
'<th class="datepickerWeek"><a href="#"><span><%=weeks[2].week%></span></a></th>',
|
||||
'<td class="<%=weeks[2].days[0].classname%>"><a href="#"><span><%=weeks[2].days[0].text%></span></a></td>',
|
||||
'<td class="<%=weeks[2].days[1].classname%>"><a href="#"><span><%=weeks[2].days[1].text%></span></a></td>',
|
||||
'<td class="<%=weeks[2].days[2].classname%>"><a href="#"><span><%=weeks[2].days[2].text%></span></a></td>',
|
||||
'<td class="<%=weeks[2].days[3].classname%>"><a href="#"><span><%=weeks[2].days[3].text%></span></a></td>',
|
||||
'<td class="<%=weeks[2].days[4].classname%>"><a href="#"><span><%=weeks[2].days[4].text%></span></a></td>',
|
||||
'<td class="<%=weeks[2].days[5].classname%>"><a href="#"><span><%=weeks[2].days[5].text%></span></a></td>',
|
||||
'<td class="<%=weeks[2].days[6].classname%>"><a href="#"><span><%=weeks[2].days[6].text%></span></a></td>',
|
||||
'</tr>',
|
||||
'<tr>',
|
||||
'<th class="datepickerWeek"><a href="#"><span><%=weeks[3].week%></span></a></th>',
|
||||
'<td class="<%=weeks[3].days[0].classname%>"><a href="#"><span><%=weeks[3].days[0].text%></span></a></td>',
|
||||
'<td class="<%=weeks[3].days[1].classname%>"><a href="#"><span><%=weeks[3].days[1].text%></span></a></td>',
|
||||
'<td class="<%=weeks[3].days[2].classname%>"><a href="#"><span><%=weeks[3].days[2].text%></span></a></td>',
|
||||
'<td class="<%=weeks[3].days[3].classname%>"><a href="#"><span><%=weeks[3].days[3].text%></span></a></td>',
|
||||
'<td class="<%=weeks[3].days[4].classname%>"><a href="#"><span><%=weeks[3].days[4].text%></span></a></td>',
|
||||
'<td class="<%=weeks[3].days[5].classname%>"><a href="#"><span><%=weeks[3].days[5].text%></span></a></td>',
|
||||
'<td class="<%=weeks[3].days[6].classname%>"><a href="#"><span><%=weeks[3].days[6].text%></span></a></td>',
|
||||
'</tr>',
|
||||
'<tr>',
|
||||
'<th class="datepickerWeek"><a href="#"><span><%=weeks[4].week%></span></a></th>',
|
||||
'<td class="<%=weeks[4].days[0].classname%>"><a href="#"><span><%=weeks[4].days[0].text%></span></a></td>',
|
||||
'<td class="<%=weeks[4].days[1].classname%>"><a href="#"><span><%=weeks[4].days[1].text%></span></a></td>',
|
||||
'<td class="<%=weeks[4].days[2].classname%>"><a href="#"><span><%=weeks[4].days[2].text%></span></a></td>',
|
||||
'<td class="<%=weeks[4].days[3].classname%>"><a href="#"><span><%=weeks[4].days[3].text%></span></a></td>',
|
||||
'<td class="<%=weeks[4].days[4].classname%>"><a href="#"><span><%=weeks[4].days[4].text%></span></a></td>',
|
||||
'<td class="<%=weeks[4].days[5].classname%>"><a href="#"><span><%=weeks[4].days[5].text%></span></a></td>',
|
||||
'<td class="<%=weeks[4].days[6].classname%>"><a href="#"><span><%=weeks[4].days[6].text%></span></a></td>',
|
||||
'</tr>',
|
||||
'<tr>',
|
||||
'<th class="datepickerWeek"><a href="#"><span><%=weeks[5].week%></span></a></th>',
|
||||
'<td class="<%=weeks[5].days[0].classname%>"><a href="#"><span><%=weeks[5].days[0].text%></span></a></td>',
|
||||
'<td class="<%=weeks[5].days[1].classname%>"><a href="#"><span><%=weeks[5].days[1].text%></span></a></td>',
|
||||
'<td class="<%=weeks[5].days[2].classname%>"><a href="#"><span><%=weeks[5].days[2].text%></span></a></td>',
|
||||
'<td class="<%=weeks[5].days[3].classname%>"><a href="#"><span><%=weeks[5].days[3].text%></span></a></td>',
|
||||
'<td class="<%=weeks[5].days[4].classname%>"><a href="#"><span><%=weeks[5].days[4].text%></span></a></td>',
|
||||
'<td class="<%=weeks[5].days[5].classname%>"><a href="#"><span><%=weeks[5].days[5].text%></span></a></td>',
|
||||
'<td class="<%=weeks[5].days[6].classname%>"><a href="#"><span><%=weeks[5].days[6].text%></span></a></td>',
|
||||
'</tr>',
|
||||
'</tbody>'
|
||||
],
|
||||
months: [
|
||||
'<tbody class="<%=className%>">',
|
||||
'<tr>',
|
||||
'<td colspan="2"><a href="#"><span><%=data[0]%></span></a></td>',
|
||||
'<td colspan="2"><a href="#"><span><%=data[1]%></span></a></td>',
|
||||
'<td colspan="2"><a href="#"><span><%=data[2]%></span></a></td>',
|
||||
'<td colspan="2"><a href="#"><span><%=data[3]%></span></a></td>',
|
||||
'</tr>',
|
||||
'<tr>',
|
||||
'<td colspan="2"><a href="#"><span><%=data[4]%></span></a></td>',
|
||||
'<td colspan="2"><a href="#"><span><%=data[5]%></span></a></td>',
|
||||
'<td colspan="2"><a href="#"><span><%=data[6]%></span></a></td>',
|
||||
'<td colspan="2"><a href="#"><span><%=data[7]%></span></a></td>',
|
||||
'</tr>',
|
||||
'<tr>',
|
||||
'<td colspan="2"><a href="#"><span><%=data[8]%></span></a></td>',
|
||||
'<td colspan="2"><a href="#"><span><%=data[9]%></span></a></td>',
|
||||
'<td colspan="2"><a href="#"><span><%=data[10]%></span></a></td>',
|
||||
'<td colspan="2"><a href="#"><span><%=data[11]%></span></a></td>',
|
||||
'</tr>',
|
||||
'</tbody>'
|
||||
]
|
||||
},
|
||||
defaults = {
|
||||
flat: false,
|
||||
starts: 1,
|
||||
prev: '◀',
|
||||
next: '▶',
|
||||
lastSel: false,
|
||||
mode: 'single',
|
||||
view: 'days',
|
||||
calendars: 1,
|
||||
format: 'Y-m-d',
|
||||
position: 'bottom',
|
||||
eventName: 'click',
|
||||
onRender: function(){return {};},
|
||||
onChange: function(){return true;},
|
||||
onShow: function(){return true;},
|
||||
onBeforeShow: function(){return true;},
|
||||
onHide: function(){return true;},
|
||||
locale: {
|
||||
days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"],
|
||||
daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
|
||||
daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"],
|
||||
months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
|
||||
monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
|
||||
weekMin: 'wk'
|
||||
}
|
||||
},
|
||||
fill = function(el) {
|
||||
var options = $(el).data('datepicker');
|
||||
var cal = $(el);
|
||||
var currentCal = Math.floor(options.calendars/2), date, data, dow, month, cnt = 0, week, days, indic, indic2, html, tblCal;
|
||||
cal.find('td>table tbody').remove();
|
||||
for (var i = 0; i < options.calendars; i++) {
|
||||
date = new Date(options.current);
|
||||
date.addMonths(-currentCal + i);
|
||||
tblCal = cal.find('table').eq(i+1);
|
||||
switch (tblCal[0].className) {
|
||||
case 'datepickerViewDays':
|
||||
dow = formatDate(date, 'B, Y');
|
||||
break;
|
||||
case 'datepickerViewMonths':
|
||||
dow = date.getFullYear();
|
||||
break;
|
||||
case 'datepickerViewYears':
|
||||
dow = (date.getFullYear()-6) + ' - ' + (date.getFullYear()+5);
|
||||
break;
|
||||
}
|
||||
tblCal.find('thead tr:first th:eq(1) span').text(dow);
|
||||
dow = date.getFullYear()-6;
|
||||
data = {
|
||||
data: [],
|
||||
className: 'datepickerYears'
|
||||
}
|
||||
for ( var j = 0; j < 12; j++) {
|
||||
data.data.push(dow + j);
|
||||
}
|
||||
html = tmpl(tpl.months.join(''), data);
|
||||
date.setDate(1);
|
||||
data = {weeks:[], test: 10};
|
||||
month = date.getMonth();
|
||||
var dow = (date.getDay() - options.starts) % 7;
|
||||
date.addDays(-(dow + (dow < 0 ? 7 : 0)));
|
||||
week = -1;
|
||||
cnt = 0;
|
||||
while (cnt < 42) {
|
||||
indic = parseInt(cnt/7,10);
|
||||
indic2 = cnt%7;
|
||||
if (!data.weeks[indic]) {
|
||||
week = date.getWeekNumber();
|
||||
data.weeks[indic] = {
|
||||
week: week,
|
||||
days: []
|
||||
};
|
||||
}
|
||||
data.weeks[indic].days[indic2] = {
|
||||
text: date.getDate(),
|
||||
classname: []
|
||||
};
|
||||
if (month != date.getMonth()) {
|
||||
data.weeks[indic].days[indic2].classname.push('datepickerNotInMonth');
|
||||
}
|
||||
if (date.getDay() == 0) {
|
||||
data.weeks[indic].days[indic2].classname.push('datepickerSunday');
|
||||
}
|
||||
if (date.getDay() == 6) {
|
||||
data.weeks[indic].days[indic2].classname.push('datepickerSaturday');
|
||||
}
|
||||
var fromUser = options.onRender(date);
|
||||
var val = date.valueOf();
|
||||
if (fromUser.selected || options.date == val || $.inArray(val, options.date) > -1 || (options.mode == 'range' && val >= options.date[0] && val <= options.date[1])) {
|
||||
data.weeks[indic].days[indic2].classname.push('datepickerSelected');
|
||||
}
|
||||
if (fromUser.disabled) {
|
||||
data.weeks[indic].days[indic2].classname.push('datepickerDisabled');
|
||||
}
|
||||
if (fromUser.className) {
|
||||
data.weeks[indic].days[indic2].classname.push(fromUser.className);
|
||||
}
|
||||
data.weeks[indic].days[indic2].classname = data.weeks[indic].days[indic2].classname.join(' ');
|
||||
cnt++;
|
||||
date.addDays(1);
|
||||
}
|
||||
html = tmpl(tpl.days.join(''), data) + html;
|
||||
data = {
|
||||
data: options.locale.monthsShort,
|
||||
className: 'datepickerMonths'
|
||||
};
|
||||
html = tmpl(tpl.months.join(''), data) + html;
|
||||
tblCal.append(html);
|
||||
}
|
||||
},
|
||||
parseDate = function (date, format) {
|
||||
if (date.constructor == Date) {
|
||||
return new Date(date);
|
||||
}
|
||||
var parts = date.split(/\W+/);
|
||||
var against = format.split(/\W+/), d, m, y, h, min, now = new Date();
|
||||
for (var i = 0; i < parts.length; i++) {
|
||||
switch (against[i]) {
|
||||
case 'd':
|
||||
case 'e':
|
||||
d = parseInt(parts[i],10);
|
||||
break;
|
||||
case 'm':
|
||||
m = parseInt(parts[i], 10)-1;
|
||||
break;
|
||||
case 'Y':
|
||||
case 'y':
|
||||
y = parseInt(parts[i], 10);
|
||||
y += y > 100 ? 0 : (y < 29 ? 2000 : 1900);
|
||||
break;
|
||||
case 'H':
|
||||
case 'I':
|
||||
case 'k':
|
||||
case 'l':
|
||||
h = parseInt(parts[i], 10);
|
||||
break;
|
||||
case 'P':
|
||||
case 'p':
|
||||
if (/pm/i.test(parts[i]) && h < 12) {
|
||||
h += 12;
|
||||
} else if (/am/i.test(parts[i]) && h >= 12) {
|
||||
h -= 12;
|
||||
}
|
||||
break;
|
||||
case 'M':
|
||||
min = parseInt(parts[i], 10);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return new Date(
|
||||
y === undefined ? now.getFullYear() : y,
|
||||
m === undefined ? now.getMonth() : m,
|
||||
d === undefined ? now.getDate() : d,
|
||||
h === undefined ? now.getHours() : h,
|
||||
min === undefined ? now.getMinutes() : min,
|
||||
0
|
||||
);
|
||||
},
|
||||
formatDate = function(date, format) {
|
||||
var m = date.getMonth();
|
||||
var d = date.getDate();
|
||||
var y = date.getFullYear();
|
||||
var wn = date.getWeekNumber();
|
||||
var w = date.getDay();
|
||||
var s = {};
|
||||
var hr = date.getHours();
|
||||
var pm = (hr >= 12);
|
||||
var ir = (pm) ? (hr - 12) : hr;
|
||||
var dy = date.getDayOfYear();
|
||||
if (ir == 0) {
|
||||
ir = 12;
|
||||
}
|
||||
var min = date.getMinutes();
|
||||
var sec = date.getSeconds();
|
||||
var parts = format.split(''), part;
|
||||
for ( var i = 0; i < parts.length; i++ ) {
|
||||
part = parts[i];
|
||||
switch (parts[i]) {
|
||||
case 'a':
|
||||
part = date.getDayName();
|
||||
break;
|
||||
case 'A':
|
||||
part = date.getDayName(true);
|
||||
break;
|
||||
case 'b':
|
||||
part = date.getMonthName();
|
||||
break;
|
||||
case 'B':
|
||||
part = date.getMonthName(true);
|
||||
break;
|
||||
case 'C':
|
||||
part = 1 + Math.floor(y / 100);
|
||||
break;
|
||||
case 'd':
|
||||
part = (d < 10) ? ("0" + d) : d;
|
||||
break;
|
||||
case 'e':
|
||||
part = d;
|
||||
break;
|
||||
case 'H':
|
||||
part = (hr < 10) ? ("0" + hr) : hr;
|
||||
break;
|
||||
case 'I':
|
||||
part = (ir < 10) ? ("0" + ir) : ir;
|
||||
break;
|
||||
case 'j':
|
||||
part = (dy < 100) ? ((dy < 10) ? ("00" + dy) : ("0" + dy)) : dy;
|
||||
break;
|
||||
case 'k':
|
||||
part = hr;
|
||||
break;
|
||||
case 'l':
|
||||
part = ir;
|
||||
break;
|
||||
case 'm':
|
||||
part = (m < 9) ? ("0" + (1+m)) : (1+m);
|
||||
break;
|
||||
case 'M':
|
||||
part = (min < 10) ? ("0" + min) : min;
|
||||
break;
|
||||
case 'p':
|
||||
case 'P':
|
||||
part = pm ? "PM" : "AM";
|
||||
break;
|
||||
case 's':
|
||||
part = Math.floor(date.getTime() / 1000);
|
||||
break;
|
||||
case 'S':
|
||||
part = (sec < 10) ? ("0" + sec) : sec;
|
||||
break;
|
||||
case 'u':
|
||||
part = w + 1;
|
||||
break;
|
||||
case 'w':
|
||||
part = w;
|
||||
break;
|
||||
case 'y':
|
||||
part = ('' + y).substr(2, 2);
|
||||
break;
|
||||
case 'Y':
|
||||
part = y;
|
||||
break;
|
||||
}
|
||||
parts[i] = part;
|
||||
}
|
||||
return parts.join('');
|
||||
},
|
||||
extendDate = function(options) {
|
||||
if (Date.prototype.tempDate) {
|
||||
return;
|
||||
}
|
||||
Date.prototype.tempDate = null;
|
||||
Date.prototype.months = options.months;
|
||||
Date.prototype.monthsShort = options.monthsShort;
|
||||
Date.prototype.days = options.days;
|
||||
Date.prototype.daysShort = options.daysShort;
|
||||
Date.prototype.getMonthName = function(fullName) {
|
||||
return this[fullName ? 'months' : 'monthsShort'][this.getMonth()];
|
||||
};
|
||||
Date.prototype.getDayName = function(fullName) {
|
||||
return this[fullName ? 'days' : 'daysShort'][this.getDay()];
|
||||
};
|
||||
Date.prototype.addDays = function (n) {
|
||||
this.setDate(this.getDate() + n);
|
||||
this.tempDate = this.getDate();
|
||||
};
|
||||
Date.prototype.addMonths = function (n) {
|
||||
if (this.tempDate == null) {
|
||||
this.tempDate = this.getDate();
|
||||
}
|
||||
this.setDate(1);
|
||||
this.setMonth(this.getMonth() + n);
|
||||
this.setDate(Math.min(this.tempDate, this.getMaxDays()));
|
||||
};
|
||||
Date.prototype.addYears = function (n) {
|
||||
if (this.tempDate == null) {
|
||||
this.tempDate = this.getDate();
|
||||
}
|
||||
this.setDate(1);
|
||||
this.setFullYear(this.getFullYear() + n);
|
||||
this.setDate(Math.min(this.tempDate, this.getMaxDays()));
|
||||
};
|
||||
Date.prototype.getMaxDays = function() {
|
||||
var tmpDate = new Date(Date.parse(this)),
|
||||
d = 28, m;
|
||||
m = tmpDate.getMonth();
|
||||
d = 28;
|
||||
while (tmpDate.getMonth() == m) {
|
||||
d ++;
|
||||
tmpDate.setDate(d);
|
||||
}
|
||||
return d - 1;
|
||||
};
|
||||
Date.prototype.getFirstDay = function() {
|
||||
var tmpDate = new Date(Date.parse(this));
|
||||
tmpDate.setDate(1);
|
||||
return tmpDate.getDay();
|
||||
};
|
||||
Date.prototype.getWeekNumber = function() {
|
||||
var tempDate = new Date(this);
|
||||
tempDate.setDate(tempDate.getDate() - (tempDate.getDay() + 6) % 7 + 3);
|
||||
var dms = tempDate.valueOf();
|
||||
tempDate.setMonth(0);
|
||||
tempDate.setDate(4);
|
||||
return Math.round((dms - tempDate.valueOf()) / (604800000)) + 1;
|
||||
};
|
||||
Date.prototype.getDayOfYear = function() {
|
||||
var now = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0);
|
||||
var then = new Date(this.getFullYear(), 0, 0, 0, 0, 0);
|
||||
var time = now - then;
|
||||
return Math.floor(time / 24*60*60*1000);
|
||||
};
|
||||
},
|
||||
layout = function (el) {
|
||||
var options = $(el).data('datepicker');
|
||||
var cal = $('#' + options.id);
|
||||
if (!options.extraHeight) {
|
||||
var divs = $(el).find('div');
|
||||
//options.extraHeight = divs.get(0).offsetHeight + divs.get(1).offsetHeight;
|
||||
//options.extraWidth = divs.get(2).offsetWidth + divs.get(3).offsetWidth;
|
||||
}
|
||||
var tbl = cal.find('table:first').get(0);
|
||||
var width = tbl.offsetWidth;
|
||||
var height = tbl.offsetHeight;
|
||||
cal.css({
|
||||
width: width + options.extraWidth + 'px',
|
||||
height: height + options.extraHeight + 'px'
|
||||
}).find('div.datepickerContainer').css({
|
||||
width: width + 'px',
|
||||
height: height + 'px'
|
||||
});
|
||||
},
|
||||
click = function(ev) {
|
||||
if ($(ev.target).is('span')) {
|
||||
ev.target = ev.target.parentNode;
|
||||
}
|
||||
var el = $(ev.target);
|
||||
if (el.is('a')) {
|
||||
ev.target.blur();
|
||||
if (el.hasClass('datepickerDisabled')) {
|
||||
return false;
|
||||
}
|
||||
var options = $(this).data('datepicker');
|
||||
var parentEl = el.parent();
|
||||
var tblEl = parentEl.parent().parent().parent();
|
||||
var tblIndex = $('table', this).index(tblEl.get(0)) - 1;
|
||||
var tmp = new Date(options.current);
|
||||
var changed = false;
|
||||
var fillIt = false;
|
||||
if (parentEl.is('th')) {
|
||||
if (parentEl.hasClass('datepickerWeek') && options.mode == 'range' && !parentEl.next().hasClass('datepickerDisabled')) {
|
||||
var val = parseInt(parentEl.next().text(), 10);
|
||||
tmp.addMonths(tblIndex - Math.floor(options.calendars/2));
|
||||
if (parentEl.next().hasClass('datepickerNotInMonth')) {
|
||||
tmp.addMonths(val > 15 ? -1 : 1);
|
||||
}
|
||||
tmp.setDate(val);
|
||||
options.date[0] = (tmp.setHours(0,0,0,0)).valueOf();
|
||||
tmp.setHours(23,59,59,0);
|
||||
tmp.addDays(6);
|
||||
options.date[1] = tmp.valueOf();
|
||||
fillIt = true;
|
||||
changed = true;
|
||||
options.lastSel = false;
|
||||
} else if (parentEl.hasClass('datepickerMonth')) {
|
||||
tmp.addMonths(tblIndex - Math.floor(options.calendars/2));
|
||||
switch (tblEl.get(0).className) {
|
||||
case 'datepickerViewDays':
|
||||
tblEl.get(0).className = 'datepickerViewMonths';
|
||||
el.find('span').text(tmp.getFullYear());
|
||||
break;
|
||||
case 'datepickerViewMonths':
|
||||
tblEl.get(0).className = 'datepickerViewYears';
|
||||
el.find('span').text((tmp.getFullYear()-6) + ' - ' + (tmp.getFullYear()+5));
|
||||
break;
|
||||
case 'datepickerViewYears':
|
||||
tblEl.get(0).className = 'datepickerViewDays';
|
||||
el.find('span').text(formatDate(tmp, 'B, Y'));
|
||||
break;
|
||||
}
|
||||
} else if (parentEl.parent().parent().is('thead')) {
|
||||
switch (tblEl.get(0).className) {
|
||||
case 'datepickerViewDays':
|
||||
options.current.addMonths(parentEl.hasClass('datepickerGoPrev') ? -1 : 1);
|
||||
break;
|
||||
case 'datepickerViewMonths':
|
||||
options.current.addYears(parentEl.hasClass('datepickerGoPrev') ? -1 : 1);
|
||||
break;
|
||||
case 'datepickerViewYears':
|
||||
options.current.addYears(parentEl.hasClass('datepickerGoPrev') ? -12 : 12);
|
||||
break;
|
||||
}
|
||||
fillIt = true;
|
||||
}
|
||||
} else if (parentEl.is('td') && !parentEl.hasClass('datepickerDisabled')) {
|
||||
switch (tblEl.get(0).className) {
|
||||
case 'datepickerViewMonths':
|
||||
options.current.setMonth(tblEl.find('tbody.datepickerMonths td').index(parentEl));
|
||||
options.current.setFullYear(parseInt(tblEl.find('thead th.datepickerMonth span').text(), 10));
|
||||
options.current.addMonths(Math.floor(options.calendars/2) - tblIndex);
|
||||
tblEl.get(0).className = 'datepickerViewDays';
|
||||
break;
|
||||
case 'datepickerViewYears':
|
||||
options.current.setFullYear(parseInt(el.text(), 10));
|
||||
tblEl.get(0).className = 'datepickerViewMonths';
|
||||
break;
|
||||
default:
|
||||
var val = parseInt(el.text(), 10);
|
||||
tmp.addMonths(tblIndex - Math.floor(options.calendars/2));
|
||||
if (parentEl.hasClass('datepickerNotInMonth')) {
|
||||
tmp.addMonths(val > 15 ? -1 : 1);
|
||||
}
|
||||
tmp.setDate(val);
|
||||
switch (options.mode) {
|
||||
case 'multiple':
|
||||
val = (tmp.setHours(0,0,0,0)).valueOf();
|
||||
if ($.inArray(val, options.date) > -1) {
|
||||
$.each(options.date, function(nr, dat){
|
||||
if (dat == val) {
|
||||
options.date.splice(nr,1);
|
||||
return false;
|
||||
}
|
||||
});
|
||||
} else {
|
||||
options.date.push(val);
|
||||
}
|
||||
break;
|
||||
case 'range':
|
||||
if (!options.lastSel) {
|
||||
options.date[0] = (tmp.setHours(0,0,0,0)).valueOf();
|
||||
}
|
||||
val = (tmp.setHours(23,59,59,0)).valueOf();
|
||||
if (val < options.date[0]) {
|
||||
options.date[1] = options.date[0] + 86399000;
|
||||
options.date[0] = val - 86399000;
|
||||
} else {
|
||||
options.date[1] = val;
|
||||
}
|
||||
options.lastSel = !options.lastSel;
|
||||
break;
|
||||
default:
|
||||
options.date = tmp.valueOf();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
fillIt = true;
|
||||
changed = true;
|
||||
}
|
||||
if (fillIt) {
|
||||
fill(this);
|
||||
}
|
||||
if (changed) {
|
||||
options.onChange.apply(this, prepareDate(options));
|
||||
}
|
||||
}
|
||||
return false;
|
||||
},
|
||||
prepareDate = function (options) {
|
||||
var tmp;
|
||||
if (options.mode == 'single') {
|
||||
tmp = new Date(options.date);
|
||||
return [formatDate(tmp, options.format), tmp, options.el];
|
||||
} else {
|
||||
tmp = [[],[], options.el];
|
||||
$.each(options.date, function(nr, val){
|
||||
var date = new Date(val);
|
||||
tmp[0].push(formatDate(date, options.format));
|
||||
tmp[1].push(date);
|
||||
});
|
||||
return tmp;
|
||||
}
|
||||
},
|
||||
getViewport = function () {
|
||||
var m = document.compatMode == 'CSS1Compat';
|
||||
return {
|
||||
l : window.pageXOffset || (m ? document.documentElement.scrollLeft : document.body.scrollLeft),
|
||||
t : window.pageYOffset || (m ? document.documentElement.scrollTop : document.body.scrollTop),
|
||||
w : window.innerWidth || (m ? document.documentElement.clientWidth : document.body.clientWidth),
|
||||
h : window.innerHeight || (m ? document.documentElement.clientHeight : document.body.clientHeight)
|
||||
};
|
||||
},
|
||||
isChildOf = function(parentEl, el, container) {
|
||||
if (parentEl == el) {
|
||||
return true;
|
||||
}
|
||||
if (parentEl.contains) {
|
||||
return parentEl.contains(el);
|
||||
}
|
||||
if ( parentEl.compareDocumentPosition ) {
|
||||
return !!(parentEl.compareDocumentPosition(el) & 16);
|
||||
}
|
||||
var prEl = el.parentNode;
|
||||
while(prEl && prEl != container) {
|
||||
if (prEl == parentEl)
|
||||
return true;
|
||||
prEl = prEl.parentNode;
|
||||
}
|
||||
return false;
|
||||
},
|
||||
show = function (ev) {
|
||||
var cal = $('#' + $(this).data('datepickerId'));
|
||||
if (!cal.is(':visible')) {
|
||||
var calEl = cal.get(0);
|
||||
fill(calEl);
|
||||
var options = cal.data('datepicker');
|
||||
options.onBeforeShow.apply(this, [cal.get(0)]);
|
||||
var pos = $(this).offset();
|
||||
var viewPort = getViewport();
|
||||
var top = pos.top;
|
||||
var left = pos.left;
|
||||
var oldDisplay = $.curCSS(calEl, 'display');
|
||||
cal.css({
|
||||
visibility: 'hidden',
|
||||
display: 'block'
|
||||
});
|
||||
layout(calEl);
|
||||
switch (options.position){
|
||||
case 'top':
|
||||
top -= calEl.offsetHeight;
|
||||
break;
|
||||
case 'left':
|
||||
left -= calEl.offsetWidth;
|
||||
break;
|
||||
case 'right':
|
||||
left += this.offsetWidth;
|
||||
break;
|
||||
case 'bottom':
|
||||
top += this.offsetHeight;
|
||||
break;
|
||||
}
|
||||
if (top + calEl.offsetHeight > viewPort.t + viewPort.h) {
|
||||
top = pos.top - calEl.offsetHeight;
|
||||
}
|
||||
if (top < viewPort.t) {
|
||||
top = pos.top + this.offsetHeight + calEl.offsetHeight;
|
||||
}
|
||||
if (left + calEl.offsetWidth > viewPort.l + viewPort.w) {
|
||||
left = pos.left - calEl.offsetWidth;
|
||||
}
|
||||
if (left < viewPort.l) {
|
||||
left = pos.left + this.offsetWidth
|
||||
}
|
||||
cal.css({
|
||||
visibility: 'visible',
|
||||
display: 'block',
|
||||
top: top + 'px',
|
||||
left: left + 'px'
|
||||
});
|
||||
if (options.onShow.apply(this, [cal.get(0)]) != false) {
|
||||
cal.show();
|
||||
}
|
||||
$(document).bind('mousedown', {cal: cal, trigger: this}, hide);
|
||||
}
|
||||
return false;
|
||||
},
|
||||
hide = function (ev) {
|
||||
if (ev.target != ev.data.trigger && !isChildOf(ev.data.cal.get(0), ev.target, ev.data.cal.get(0))) {
|
||||
if (ev.data.cal.data('datepicker').onHide.apply(this, [ev.data.cal.get(0)]) != false) {
|
||||
ev.data.cal.hide();
|
||||
}
|
||||
$(document).unbind('mousedown', hide);
|
||||
}
|
||||
};
|
||||
return {
|
||||
init: function(options){
|
||||
options = $.extend({}, defaults, options||{});
|
||||
extendDate(options.locale);
|
||||
options.calendars = Math.max(1, parseInt(options.calendars,10)||1);
|
||||
options.mode = /single|multiple|range/.test(options.mode) ? options.mode : 'single';
|
||||
return this.each(function(){
|
||||
if (!$(this).data('datepicker')) {
|
||||
options.el = this;
|
||||
if (options.date.constructor == String) {
|
||||
options.date = parseDate(options.date, options.format);
|
||||
options.date.setHours(0,0,0,0);
|
||||
}
|
||||
if (options.mode != 'single') {
|
||||
if (options.date.constructor != Array) {
|
||||
options.date = [options.date.valueOf()];
|
||||
if (options.mode == 'range') {
|
||||
options.date.push(((new Date(options.date[0])).setHours(23,59,59,0)).valueOf());
|
||||
}
|
||||
} else {
|
||||
for (var i = 0; i < options.date.length; i++) {
|
||||
options.date[i] = (parseDate(options.date[i], options.format).setHours(0,0,0,0)).valueOf();
|
||||
}
|
||||
if (options.mode == 'range') {
|
||||
options.date[1] = ((new Date(options.date[1])).setHours(23,59,59,0)).valueOf();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
options.date = options.date.valueOf();
|
||||
}
|
||||
if (!options.current) {
|
||||
options.current = new Date();
|
||||
} else {
|
||||
options.current = parseDate(options.current, options.format);
|
||||
}
|
||||
options.current.setDate(1);
|
||||
options.current.setHours(0,0,0,0);
|
||||
var id = 'datepicker_' + parseInt(Math.random() * 1000), cnt;
|
||||
options.id = id;
|
||||
$(this).data('datepickerId', options.id);
|
||||
var cal = $(tpl.wrapper).attr('id', id).bind('click', click).data('datepicker', options);
|
||||
if (options.className) {
|
||||
cal.addClass(options.className);
|
||||
}
|
||||
var html = '';
|
||||
for (var i = 0; i < options.calendars; i++) {
|
||||
cnt = options.starts;
|
||||
if (i > 0) {
|
||||
html += tpl.space;
|
||||
}
|
||||
html += tmpl(tpl.head.join(''), {
|
||||
week: options.locale.weekMin,
|
||||
prev: options.prev,
|
||||
next: options.next,
|
||||
day1: options.locale.daysMin[(cnt++)%7],
|
||||
day2: options.locale.daysMin[(cnt++)%7],
|
||||
day3: options.locale.daysMin[(cnt++)%7],
|
||||
day4: options.locale.daysMin[(cnt++)%7],
|
||||
day5: options.locale.daysMin[(cnt++)%7],
|
||||
day6: options.locale.daysMin[(cnt++)%7],
|
||||
day7: options.locale.daysMin[(cnt++)%7]
|
||||
});
|
||||
}
|
||||
cal
|
||||
.find('tr:first').append(html)
|
||||
.find('table').addClass(views[options.view]);
|
||||
fill(cal.get(0));
|
||||
if (options.flat) {
|
||||
cal.appendTo(this).show().css('position', 'relative');
|
||||
layout(cal.get(0));
|
||||
} else {
|
||||
cal.appendTo(document.body);
|
||||
$(this).bind(options.eventName, show);
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
showPicker: function() {
|
||||
return this.each( function () {
|
||||
if ($(this).data('datepickerId')) {
|
||||
show.apply(this);
|
||||
}
|
||||
});
|
||||
},
|
||||
hidePicker: function() {
|
||||
return this.each( function () {
|
||||
if ($(this).data('datepickerId')) {
|
||||
$('#' + $(this).data('datepickerId')).hide();
|
||||
}
|
||||
});
|
||||
},
|
||||
setDate: function(date, shiftTo){
|
||||
return this.each(function(){
|
||||
if ($(this).data('datepickerId')) {
|
||||
var cal = $('#' + $(this).data('datepickerId'));
|
||||
var options = cal.data('datepicker');
|
||||
options.date = date;
|
||||
if (options.date.constructor == String) {
|
||||
options.date = parseDate(options.date, options.format);
|
||||
options.date.setHours(0,0,0,0);
|
||||
}
|
||||
if (options.mode != 'single') {
|
||||
if (options.date.constructor != Array) {
|
||||
options.date = [options.date.valueOf()];
|
||||
if (options.mode == 'range') {
|
||||
options.date.push(((new Date(options.date[0])).setHours(23,59,59,0)).valueOf());
|
||||
}
|
||||
} else {
|
||||
for (var i = 0; i < options.date.length; i++) {
|
||||
options.date[i] = (parseDate(options.date[i], options.format).setHours(0,0,0,0)).valueOf();
|
||||
}
|
||||
if (options.mode == 'range') {
|
||||
options.date[1] = ((new Date(options.date[1])).setHours(23,59,59,0)).valueOf();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
options.date = options.date.valueOf();
|
||||
}
|
||||
if (shiftTo) {
|
||||
options.current = new Date (options.mode != 'single' ? options.date[0] : options.date);
|
||||
}
|
||||
fill(cal.get(0));
|
||||
}
|
||||
});
|
||||
},
|
||||
getDate: function(formated) {
|
||||
if (this.size() > 0) {
|
||||
return prepareDate($('#' + $(this).data('datepickerId')).data('datepicker'))[formated ? 0 : 1];
|
||||
}
|
||||
},
|
||||
clear: function(){
|
||||
return this.each(function(){
|
||||
if ($(this).data('datepickerId')) {
|
||||
var cal = $('#' + $(this).data('datepickerId'));
|
||||
var options = cal.data('datepicker');
|
||||
if (options.mode != 'single') {
|
||||
options.date = [];
|
||||
fill(cal.get(0));
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
fixLayout: function(){
|
||||
return this.each(function(){
|
||||
if ($(this).data('datepickerId')) {
|
||||
var cal = $('#' + $(this).data('datepickerId'));
|
||||
var options = cal.data('datepicker');
|
||||
if (options.flat) {
|
||||
layout(cal.get(0));
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
}();
|
||||
$.fn.extend({
|
||||
DatePicker: DatePicker.init,
|
||||
DatePickerHide: DatePicker.hidePicker,
|
||||
DatePickerShow: DatePicker.showPicker,
|
||||
DatePickerSetDate: DatePicker.setDate,
|
||||
DatePickerGetDate: DatePicker.getDate,
|
||||
DatePickerClear: DatePicker.clear,
|
||||
DatePickerLayout: DatePicker.fixLayout
|
||||
});
|
||||
})(jQuery);
|
||||
|
||||
(function(){
|
||||
var cache = {};
|
||||
|
||||
this.tmpl = function tmpl(str, data){
|
||||
// Figure out if we're getting a template, or if we need to
|
||||
// load the template - and be sure to cache the result.
|
||||
var fn = !/\W/.test(str) ?
|
||||
cache[str] = cache[str] ||
|
||||
tmpl(document.getElementById(str).innerHTML) :
|
||||
|
||||
// Generate a reusable function that will serve as a template
|
||||
// generator (and which will be cached).
|
||||
new Function("obj",
|
||||
"var p=[],print=function(){p.push.apply(p,arguments);};" +
|
||||
|
||||
// Introduce the data as local variables using with(){}
|
||||
"with(obj){p.push('" +
|
||||
|
||||
// Convert the template into pure JavaScript
|
||||
str
|
||||
.replace(/[\r\t\n]/g, " ")
|
||||
.split("<%").join("\t")
|
||||
.replace(/((^|%>)[^\t]*)'/g, "$1\r")
|
||||
.replace(/\t=(.*?)%>/g, "',$1,'")
|
||||
.split("\t").join("');")
|
||||
.split("%>").join("p.push('")
|
||||
.split("\r").join("\\'")
|
||||
+ "');}return p.join('');");
|
||||
|
||||
// Provide some basic currying to the user
|
||||
return data ? fn( data ) : fn;
|
||||
};
|
||||
})();
|
||||
@@ -0,0 +1,17 @@
|
||||
!function ($) {
|
||||
$.fn.datetimepick = function() {
|
||||
var $this = this,
|
||||
$format = $this.attr('data-date-format'),
|
||||
$language = $this.attr('data-language'),
|
||||
$pickTime = ("ture" === $this.attr('data-picktime'));
|
||||
$this.datetimepicker({
|
||||
format: $format,
|
||||
pickTime: $pickTime,
|
||||
language: $language,
|
||||
});
|
||||
}
|
||||
}(window.jQuery);
|
||||
|
||||
$(function(){
|
||||
$('.datetimepick').datetimepick();
|
||||
});
|
||||
@@ -0,0 +1,33 @@
|
||||
$(document).ready(function(){
|
||||
|
||||
$('.date_picker').datetimepicker({
|
||||
pickTime: false
|
||||
});
|
||||
|
||||
$('.default_picker').datetimepicker();
|
||||
|
||||
$('.time_picker').datetimepicker({
|
||||
pickDate: false
|
||||
});
|
||||
|
||||
$('.separated_picker div').on("changeDate",function(){
|
||||
if ($(this).hasClass('date_picker'))
|
||||
{
|
||||
if ($(this).find('input').val() && $(this).siblings('div').css('pointer-events'))
|
||||
{
|
||||
$(this).siblings('div').css('pointer-events', '');
|
||||
}
|
||||
else
|
||||
{
|
||||
$(this).siblings('div').find('input').val(null);
|
||||
$(this).siblings('div').css('pointer-events', 'none');
|
||||
}
|
||||
}
|
||||
$(this).siblings('input').val($(this).find('input').val() + ' ' + $(this).siblings('div').find('input').val());
|
||||
});
|
||||
|
||||
// $('.date_picker').on("changeDate",function(){
|
||||
// $(this).find('input').val('');
|
||||
// });
|
||||
|
||||
});
|
||||
@@ -0,0 +1,412 @@
|
||||
/*!
|
||||
* FooTable - Awesome Responsive Tables
|
||||
* http://themergency.com/footable
|
||||
*
|
||||
* Requires jQuery - http://jquery.com/
|
||||
*
|
||||
* Copyright 2012 Steven Usher & Brad Vincent
|
||||
* Released under the MIT license
|
||||
* You are free to use FooTable in commercial projects as long as this copyright header is left intact.
|
||||
*
|
||||
* Date: 18 Nov 2012
|
||||
*/
|
||||
(function ($, w, undefined) {
|
||||
w.footable = {
|
||||
options: {
|
||||
delay: 100, // The number of millseconds to wait before triggering the react event
|
||||
breakpoints: { // The different screen resolution breakpoints
|
||||
phone: 480,
|
||||
tablet: 1024
|
||||
},
|
||||
parsers: { // The default parser to parse the value out of a cell (values are used in building up row detail)
|
||||
alpha: function (cell) {
|
||||
return $(cell).data('value') || $.trim($(cell).text());
|
||||
}
|
||||
},
|
||||
toggleSelector: '.detail-row', //the selector to show/hide the detail row
|
||||
createDetail: function (element, data) { //creates the contents of the detail row
|
||||
for (var i = 0; i < data.length; i++) {
|
||||
element.append('<div><strong>' + data[i].name + '</strong> : ' + data[i].display + '</div>');
|
||||
}
|
||||
},
|
||||
classes: {
|
||||
loading : 'footable-loading',
|
||||
loaded : 'footable-loaded',
|
||||
sorted : 'footable-sorted',
|
||||
descending : 'footable-sorted-desc',
|
||||
indicator : 'footable-sort-indicator'
|
||||
},
|
||||
debug: false // Whether or not to log information to the console.
|
||||
},
|
||||
|
||||
version: {
|
||||
major: 0, minor: 1,
|
||||
toString: function () {
|
||||
return w.footable.version.major + '.' + w.footable.version.minor;
|
||||
},
|
||||
parse: function (str) {
|
||||
version = /(\d+)\.?(\d+)?\.?(\d+)?/.exec(str);
|
||||
return {
|
||||
major: parseInt(version[1]) || 0,
|
||||
minor: parseInt(version[2]) || 0,
|
||||
patch: parseInt(version[3]) || 0
|
||||
};
|
||||
}
|
||||
},
|
||||
|
||||
plugins: {
|
||||
_validate: function (plugin) {
|
||||
///<summary>Simple validation of the <paramref name="plugin"/> to make sure any members called by Foobox actually exist.</summary>
|
||||
///<param name="plugin">The object defining the plugin, this should implement a string property called "name" and a function called "init".</param>
|
||||
|
||||
if (typeof plugin['name'] !== 'string') {
|
||||
if (w.footable.options.debug == true) console.error('Validation failed, plugin does not implement a string property called "name".', plugin);
|
||||
return false;
|
||||
}
|
||||
if (!$.isFunction(plugin['init'])) {
|
||||
if (w.footable.options.debug == true) console.error('Validation failed, plugin "' + plugin['name'] + '" does not implement a function called "init".', plugin);
|
||||
return false;
|
||||
}
|
||||
if (w.footable.options.debug == true) console.log('Validation succeeded for plugin "' + plugin['name'] + '".', plugin);
|
||||
return true;
|
||||
},
|
||||
registered: [], // An array containing all registered plugins.
|
||||
register: function (plugin, options) {
|
||||
///<summary>Registers a <paramref name="plugin"/> and its default <paramref name="options"/> with Foobox.</summary>
|
||||
///<param name="plugin">The plugin that should implement a string property called "name" and a function called "init".</param>
|
||||
///<param name="options">The default options to merge with the Foobox's base options.</param>
|
||||
|
||||
if (w.footable.plugins._validate(plugin)) {
|
||||
w.footable.plugins.registered.push(plugin);
|
||||
if (options != undefined && typeof options === 'object') $.extend(true, w.footable.options, options);
|
||||
if (w.footable.options.debug == true) console.log('Plugin "' + plugin['name'] + '" has been registered with the Foobox.', plugin);
|
||||
}
|
||||
},
|
||||
init: function (instance) {
|
||||
///<summary>Loops through all registered plugins and calls the "init" method supplying the current <paramref name="instance"/> of the Foobox as the first parameter.</summary>
|
||||
///<param name="instance">The current instance of the Foobox that the plugin is being initialized for.</param>
|
||||
|
||||
for(var i = 0; i < w.footable.plugins.registered.length; i++){
|
||||
try {
|
||||
w.footable.plugins.registered[i]['init'](instance);
|
||||
} catch(err) {
|
||||
if (w.footable.options.debug == true) console.error(err);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
var instanceCount = 0;
|
||||
|
||||
$.fn.footable = function(options) {
|
||||
///<summary>The main constructor call to initialize the plugin using the supplied <paramref name="options"/>.</summary>
|
||||
///<param name="options">
|
||||
///<para>A JSON object containing user defined options for the plugin to use. Any options not supplied will have a default value assigned.</para>
|
||||
///<para>Check the documentation or the default options object above for more information on available options.</para>
|
||||
///</param>
|
||||
|
||||
options=options||{};
|
||||
var o=$.extend(true,{},w.footable.options,options); //merge user and default options
|
||||
return this.each(function () {
|
||||
instanceCount++;
|
||||
this.footable = new Footable(this, o, instanceCount);
|
||||
});
|
||||
};
|
||||
|
||||
//helper for using timeouts
|
||||
function Timer() {
|
||||
///<summary>Simple timer object created around a timeout.</summary>
|
||||
var t=this;
|
||||
t.id=null;
|
||||
t.busy=false;
|
||||
t.start=function (code,milliseconds) {
|
||||
///<summary>Starts the timer and waits the specified amount of <paramref name="milliseconds"/> before executing the supplied <paramref name="code"/>.</summary>
|
||||
///<param name="code">The code to execute once the timer runs out.</param>
|
||||
///<param name="milliseconds">The time in milliseconds to wait before executing the supplied <paramref name="code"/>.</param>
|
||||
|
||||
if (t.busy) {return;}
|
||||
t.stop();
|
||||
t.id=setTimeout(function () {
|
||||
code();
|
||||
t.id=null;
|
||||
t.busy=false;
|
||||
},milliseconds);
|
||||
t.busy=true;
|
||||
};
|
||||
t.stop=function () {
|
||||
///<summary>Stops the timer if its runnning and resets it back to its starting state.</summary>
|
||||
|
||||
if(t.id!=null) {
|
||||
clearTimeout(t.id);
|
||||
t.id=null;
|
||||
t.busy=false;
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
function Footable(t, o, id) {
|
||||
///<summary>Inits a new instance of the plugin.</summary>
|
||||
///<param name="t">The main table element to apply this plugin to.</param>
|
||||
///<param name="o">The options supplied to the plugin. Check the defaults object to see all available options.</param>
|
||||
///<param name="id">The id to assign to this instance of the plugin.</param>
|
||||
|
||||
var ft = this;
|
||||
ft.id = id;
|
||||
ft.table = t;
|
||||
ft.options = o;
|
||||
ft.breakpoints = [];
|
||||
ft.breakpointNames = '';
|
||||
ft.columns = { };
|
||||
|
||||
var opt = ft.options;
|
||||
var cls = opt.classes;
|
||||
|
||||
// This object simply houses all the timers used in the footable.
|
||||
ft.timers = {
|
||||
resize: new Timer(),
|
||||
register: function (name) {
|
||||
ft.timers[name] = new Timer();
|
||||
return ft.timers[name];
|
||||
}
|
||||
};
|
||||
|
||||
w.footable.plugins.init(ft);
|
||||
|
||||
ft.init = function() {
|
||||
var $window = $(w), $table = $(ft.table);
|
||||
|
||||
if ($table.hasClass(cls.loaded)) {
|
||||
//already loaded FooTable for the table, so don't init again
|
||||
ft.raise('footable_already_initialized');
|
||||
return;
|
||||
}
|
||||
|
||||
$table.addClass(cls.loading);
|
||||
|
||||
// Get the column data once for the life time of the plugin
|
||||
$table.find('> thead > tr > th, > thead > tr > td').each(function() {
|
||||
var data = ft.getColumnData(this);
|
||||
ft.columns[data.index] = data;
|
||||
|
||||
var count = data.index + 1;
|
||||
//get all the cells in the column
|
||||
var $column = $table.find('> tbody > tr > td:nth-child(' + count + ')');
|
||||
//add the className to the cells specified by data-class="blah"
|
||||
if (data.className != null) $column.not('.footable-cell-detail').addClass(data.className);
|
||||
});
|
||||
|
||||
// Create a nice friendly array to work with out of the breakpoints object.
|
||||
for(var name in opt.breakpoints) {
|
||||
ft.breakpoints.push({ 'name': name, 'width': opt.breakpoints[name] });
|
||||
ft.breakpointNames += (name + ' ');
|
||||
}
|
||||
|
||||
// Sort the breakpoints so the smallest is checked first
|
||||
ft.breakpoints.sort(function(a, b) { return a['width'] - b['width']; });
|
||||
|
||||
//bind the toggle selector click events
|
||||
ft.bindToggleSelectors();
|
||||
|
||||
ft.raise('footable_initializing');
|
||||
|
||||
$table.bind('footable_initialized', function (e) {
|
||||
//resize the footable onload
|
||||
ft.resize();
|
||||
|
||||
//remove the loading class
|
||||
$table.removeClass(cls.loading);
|
||||
|
||||
//hides all elements within the table that have the attribute data-hide="init"
|
||||
$table.find('[data-init="hide"]').hide();
|
||||
$table.find('[data-init="show"]').show();
|
||||
|
||||
//add the loaded class
|
||||
$table.addClass(cls.loaded);
|
||||
});
|
||||
|
||||
$window
|
||||
.bind('resize.footable', function () {
|
||||
ft.timers.resize.stop();
|
||||
ft.timers.resize.start(function() {
|
||||
ft.raise('footable_resizing');
|
||||
ft.resize();
|
||||
ft.raise('footable_resized');
|
||||
}, opt.delay);
|
||||
});
|
||||
|
||||
ft.raise('footable_initialized');
|
||||
};
|
||||
|
||||
//moved this out into it's own function so that it can be called from other add-ons
|
||||
ft.bindToggleSelectors = function() {
|
||||
var $table = $(ft.table);
|
||||
$table.find(opt.toggleSelector).unbind('click.footable').bind('click.footable', function (e) {
|
||||
if ($table.is('.breakpoint')) {
|
||||
var $row = $(this).is('tr') ? $(this) : $(this).parents('tr:first');
|
||||
ft.toggleDetail($row.get(0));
|
||||
}
|
||||
return false;
|
||||
});
|
||||
};
|
||||
|
||||
ft.parse = function(cell, column) {
|
||||
var parser = opt.parsers[column.type] || opt.parsers.alpha;
|
||||
return parser(cell);
|
||||
};
|
||||
|
||||
ft.getColumnData = function(th) {
|
||||
var $th = $(th), hide = $th.data('hide');
|
||||
hide = hide || '';
|
||||
hide = hide.split(',');
|
||||
var data = {
|
||||
'index': $th.index(),
|
||||
'hide': { },
|
||||
'type': $th.data('type') || 'alpha',
|
||||
'name': $th.data('name') || $.trim($th.text()),
|
||||
'ignore': $th.data('ignore') || false,
|
||||
'className': $th.data('class') || null
|
||||
};
|
||||
data.hide['default'] = ($th.data('hide')==="all") || ($.inArray('default', hide) >= 0);
|
||||
|
||||
for(var name in opt.breakpoints) {
|
||||
data.hide[name] = ($th.data('hide')==="all") || ($.inArray(name, hide) >= 0);
|
||||
}
|
||||
var e = ft.raise('footable_column_data', { 'column': { 'data': data, 'th': th } });
|
||||
return e.column.data;
|
||||
};
|
||||
|
||||
ft.getViewportWidth = function() {
|
||||
return window.innerWidth || (document.body ? document.body.offsetWidth : 0);
|
||||
};
|
||||
|
||||
ft.getViewportHeight = function() {
|
||||
return window.innerHeight || (document.body ? document.body.offsetHeight : 0);
|
||||
};
|
||||
|
||||
ft.hasBreakpointColumn = function(breakpoint) {
|
||||
for(var c in ft.columns) {
|
||||
if (ft.columns[c].hide[breakpoint]) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
ft.resize = function() {
|
||||
var $table = $(ft.table);
|
||||
var info = {
|
||||
'width': $table.width(), //the table width
|
||||
'height': $table.height(), //the table height
|
||||
'viewportWidth': ft.getViewportWidth(), //the width of the viewport
|
||||
'viewportHeight': ft.getViewportHeight(), //the width of the viewport
|
||||
'orientation': null
|
||||
};
|
||||
info.orientation = info.viewportWidth > info.viewportHeight ? 'landscape' : 'portrait';
|
||||
|
||||
if (info.viewportWidth < info.width) info.width = info.viewportWidth;
|
||||
if (info.viewportHeight < info.height) info.height = info.viewportHeight;
|
||||
|
||||
var pinfo = $table.data('footable_info');
|
||||
$table.data('footable_info', info);
|
||||
|
||||
// This (if) statement is here purely to make sure events aren't raised twice as mobile safari seems to do
|
||||
if (!pinfo || ((pinfo && pinfo.width && pinfo.width != info.width) || (pinfo && pinfo.height && pinfo.height != info.height))) {
|
||||
var current = null, breakpoint;
|
||||
for (var i = 0; i < ft.breakpoints.length; i++) {
|
||||
breakpoint = ft.breakpoints[i];
|
||||
if (breakpoint && breakpoint.width && info.width <= breakpoint.width) {
|
||||
current = breakpoint;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
var breakpointName = (current == null ? 'default' : current['name']);
|
||||
|
||||
var hasBreakpointFired = ft.hasBreakpointColumn(breakpointName);
|
||||
|
||||
$table
|
||||
.removeClass('default breakpoint').removeClass(ft.breakpointNames)
|
||||
.addClass(breakpointName + (hasBreakpointFired ? ' breakpoint' : ''))
|
||||
.find('> thead > tr > th').each(function() {
|
||||
var data = ft.columns[$(this).index()];
|
||||
var count = data.index + 1;
|
||||
//get all the cells in the column
|
||||
var $column = $table.find('> tbody > tr > td:nth-child(' + count + '), > tfoot > tr > td:nth-child(' + count + '), > colgroup > col:nth-child(' + count + ')').add(this);
|
||||
|
||||
if (data.hide[breakpointName] == false) $column.show();
|
||||
else $column.hide();
|
||||
})
|
||||
.end()
|
||||
.find('> tbody > tr.footable-detail-show').each(function() {
|
||||
ft.createOrUpdateDetailRow(this);
|
||||
});
|
||||
|
||||
$table.find('> tbody > tr.footable-detail-show:visible').each(function() {
|
||||
var $next = $(this).next();
|
||||
if ($next.hasClass('footable-row-detail')) {
|
||||
if (breakpointName == 'default' && !hasBreakpointFired) $next.hide();
|
||||
else $next.show();
|
||||
}
|
||||
});
|
||||
|
||||
// adding .footable-last-column to the last th and td in order to allow for styling if the last column is hidden (which won't work using :last-child)
|
||||
$table.find('> thead > tr > th.footable-last-column,> tbody > tr > td.footable-last-column').removeClass('footable-last-column');
|
||||
$table.find('> thead > tr > th:visible:last,> tbody > tr > td:visible:last').addClass('footable-last-column');
|
||||
|
||||
ft.raise('footable_breakpoint_' + breakpointName, { 'info': info });
|
||||
}
|
||||
};
|
||||
|
||||
ft.toggleDetail = function(actualRow) {
|
||||
var $row = $(actualRow),
|
||||
created = ft.createOrUpdateDetailRow($row.get(0)),
|
||||
$next = $row.next();
|
||||
|
||||
if (!created && $next.is(':visible')) {
|
||||
$row.removeClass('footable-detail-show');
|
||||
//only hide the next row if it's a detail row
|
||||
if($next.hasClass('footable-row-detail'))
|
||||
$next.hide();
|
||||
} else {
|
||||
$row.addClass('footable-detail-show');
|
||||
$next.show();
|
||||
}
|
||||
};
|
||||
|
||||
ft.createOrUpdateDetailRow = function (actualRow) {
|
||||
var $row = $(actualRow), $next = $row.next(), $detail, values = [];
|
||||
if ($row.is(':hidden')) return; //if the row is hidden for some readon (perhaps filtered) then get out of here
|
||||
$row.find('> td:hidden').each(function () {
|
||||
var column = ft.columns[$(this).index()];
|
||||
if (column.ignore == true) return true;
|
||||
values.push({ 'name': column.name, 'value': ft.parse(this, column), 'display': $.trim($(this).html()) });
|
||||
});
|
||||
if(values.length == 0) //return if we don't have any data to show
|
||||
return;
|
||||
var colspan = $row.find('> td:visible').length;
|
||||
var exists = $next.hasClass('footable-row-detail');
|
||||
if (!exists) { // Create
|
||||
$next = $('<tr class="footable-row-detail"><td class="footable-cell-detail"><div class="footable-row-detail-inner"></div></td></tr>');
|
||||
$row.after($next);
|
||||
}
|
||||
$next.find('> td:first').attr('colspan', colspan);
|
||||
$detail = $next.find('.footable-row-detail-inner').empty();
|
||||
opt.createDetail($detail, values);
|
||||
return !exists;
|
||||
};
|
||||
|
||||
ft.raise = function(eventName, args) {
|
||||
args = args || { };
|
||||
var def = { 'ft': ft };
|
||||
$.extend(true, def, args);
|
||||
var e = $.Event(eventName, def);
|
||||
if (!e.ft) { $.extend(true, e, def); } //pre jQuery 1.6 which did not allow data to be passed to event object constructor
|
||||
$(ft.table).trigger(e);
|
||||
return e;
|
||||
};
|
||||
|
||||
ft.init();
|
||||
return ft;
|
||||
};
|
||||
})(jQuery, window);
|
||||
@@ -0,0 +1,59 @@
|
||||
$(function() {
|
||||
var $container = $('.gallery'),
|
||||
$containerData = $container.data();
|
||||
|
||||
$container.imagesLoaded( function(){
|
||||
$container.masonry({
|
||||
itemSelector : '.rgalbum',
|
||||
isAnimated: true,
|
||||
});
|
||||
if($containerData.galleryId == 'gallery') {
|
||||
var $albumname = $('.albumname'),
|
||||
$img = $('.rgalbum img');
|
||||
$albumname.each(function(i) {
|
||||
var $imgH = $(this).prevAll($img).height(),
|
||||
$H = $(this).height()+20,
|
||||
$fontSize = parseInt($(this).css('font-size'));
|
||||
$lineHeight = parseInt($(this).css('line-height'));
|
||||
if($H > $imgH) {
|
||||
$(this).css({
|
||||
'bottom': "auto",
|
||||
'top': 0,
|
||||
});
|
||||
$(this).hover(function() {
|
||||
$(this).stop(true, true).delay(500).animate({
|
||||
'top': '-='+($H-$imgH),
|
||||
},($H-$imgH)*10)
|
||||
},function() {
|
||||
$(this).stop(true, true);
|
||||
$(this).css({
|
||||
'bottom': "auto",
|
||||
'top': 0,
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
$('#orbit_gallery').delegate('.icons-tag','click',function(){
|
||||
$(this).parents('.gallery_info').nextAll('.albumtag').slideToggle(300, function() {
|
||||
$container.masonry({
|
||||
itemSelector : '.rgalbum',
|
||||
isAnimated: true,
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
$('.add-imgs').on({
|
||||
click: function() {
|
||||
$('#fileupload').slideToggle(300, function() {
|
||||
if(!$(this).is(':hidden')) {
|
||||
$('.add-imgs').html('<i class="icons-cross-2"></i> Close panel');
|
||||
} else {
|
||||
$('.add-imgs').html('<i class="icons-plus"></i> Add Image');
|
||||
}
|
||||
});
|
||||
return false;
|
||||
}
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,74 @@
|
||||
// Items Quantity
|
||||
function itemsQuantity() {
|
||||
var $sortable = $('.sortable'),
|
||||
$host = $sortable.children('.navbar').eq(0),
|
||||
$navbar = $('.sortable li').children('.navbar'),
|
||||
$quantity = $sortable.find('li').length;
|
||||
$host.find('.badge').text($quantity);
|
||||
$navbar.each(function(i) {
|
||||
if($navbar.eq(i).next('ol').length>0) {
|
||||
var $amount = $navbar.eq(i).next('ol').find('li').length;
|
||||
$navbar.eq(i).find('.badge').text($amount);
|
||||
}else{
|
||||
$navbar.eq(i).find('.badge').text('0');
|
||||
}
|
||||
$navbar.eq(i).find('.badge').text()>0 ? $navbar.eq(i).find('.badge').addClass('badge-info'):$navbar.eq(i).find('.badge').removeClass('badge-info');
|
||||
})
|
||||
}
|
||||
function tip() {
|
||||
if(!$.support.touch) {
|
||||
$('.tip').tooltip({
|
||||
position: {
|
||||
my: "center bottom-4",
|
||||
at: "center top",
|
||||
}
|
||||
});
|
||||
};
|
||||
}
|
||||
function touchSupport() {
|
||||
if($.support.touch) {
|
||||
$('.item-menu').css({
|
||||
'display': 'inline-block'
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
$(function(){
|
||||
$('.sortable').nestedSortable({
|
||||
handle: '.brand',
|
||||
items: 'li',
|
||||
maxLevels: 3,
|
||||
opacity: .6,
|
||||
toleranceElement: '> div',
|
||||
placeholder: 'placeholder',
|
||||
startCollapsed: true,
|
||||
disableNesting: 'no-nest',
|
||||
stop: function(event, ui) {
|
||||
$.post("<%= Rails.application.routes.url_helpers.admin_update_position_path %>", { id: ui.item.attr('id'), parent_id: (ui.item.parent().closest('li').attr('id') || ui.item.parent().closest('ol').attr('id')), position: ui.item.index() } );
|
||||
}
|
||||
});
|
||||
$(".sortable").delegate(".brand, .delete", clickEvent, function(e){
|
||||
if($(this).hasClass('delete')) {
|
||||
$target = $(this);
|
||||
$('#dialog a.delete-item').attr("href", $(this).attr("rel"));
|
||||
$('#dialog').modal('show');
|
||||
} else {
|
||||
if($(this).closest('li').children('ol').length > 0){
|
||||
$(this).closest('li').toggleClass('collapsed');
|
||||
}
|
||||
}
|
||||
e.preventDefault();
|
||||
});
|
||||
|
||||
tip();
|
||||
touchSupport()
|
||||
itemsQuantity();
|
||||
});
|
||||
|
||||
function reloadStructure(){
|
||||
$.pageslide.close();
|
||||
openSlide();
|
||||
tip();
|
||||
touchSupport()
|
||||
itemsQuantity();
|
||||
};
|
||||
@@ -0,0 +1,38 @@
|
||||
function append_id(){
|
||||
if ($("#object_id").length == 1) {
|
||||
return "&id="+$("#object_id").val();
|
||||
}
|
||||
else{
|
||||
return '';
|
||||
};
|
||||
}
|
||||
|
||||
$("div.editable").live("mouseenter mouseleave", function (event) {
|
||||
$(this).children('.edit_link').toggle();
|
||||
});
|
||||
|
||||
$("#page_design").live('change', function() {
|
||||
$.getScript($(this).attr('rel') + '?design_id=' + $(this).val() + append_id());
|
||||
});
|
||||
|
||||
|
||||
$("#module_app_list select").live('change', function() {
|
||||
$.getScript($(this).attr('rel') + '?module_app_id='+$(this).val() + append_id());
|
||||
});
|
||||
|
||||
$("#widget_list select, #frontend_list select").live('change', function() {
|
||||
$.getScript($(this).attr('rel') +'?frontend=' + $(this).val() + '&module_app_id=' + $("#module_app_list select").val() + append_id() );
|
||||
});
|
||||
|
||||
$("#tag_list select").live('change', function() {
|
||||
$.getScript($(this).attr('rel') + '?type=' + $(this).val() + append_id() );
|
||||
});
|
||||
|
||||
$("select.widget_field_select").live('change', function() {
|
||||
$.getScript($(this).attr('rel') + '?widget_field_value='+ $(this).val()+'&dom_id=' + $(this).attr("id") + '&field_seri=' +$(this).attr('field_seri')+ '&module_app_id=' +$("#page_module_app_id,page_part_module_app_id").val() + append_id() );
|
||||
});
|
||||
|
||||
$('.part_kind').live('click', function() {
|
||||
$('.part_kind_partial').hide();
|
||||
$('#part_' + $(this).attr('value')).show();
|
||||
});
|
||||
@@ -0,0 +1,21 @@
|
||||
function update_cates_and_tags()
|
||||
{
|
||||
$('.select_option,.select_all').removeAttr('disabled');
|
||||
$(".select_all:checked").each(function( obj ) {
|
||||
// $(this).parent().siblings('label').find('.select_option').attr('disabled',"disabled");
|
||||
$(this).parent().siblings('label').find('.select_option').removeAttr('checked');
|
||||
});
|
||||
$(".select_option:checked").each(function( obj ) {
|
||||
// $(this).parent().siblings('label').find('.select_all').attr('disabled',"disabled");
|
||||
$(this).parent().siblings('label').find('.select_all').removeAttr('checked');
|
||||
});
|
||||
}
|
||||
|
||||
function rebind(){
|
||||
$("#widget_data_source_category,#widget_data_source_tag,#app_page_category,#app_page_tag").find('input').change(function(){update_cates_and_tags()});
|
||||
}
|
||||
|
||||
$(document).ready(function(){
|
||||
update_cates_and_tags();
|
||||
rebind();
|
||||
});
|
||||
@@ -0,0 +1,6 @@
|
||||
/*! jQuery UI - v1.10.0 - 2013-01-20
|
||||
* http://jqueryui.com
|
||||
* Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.position.js, jquery.ui.draggable.js, jquery.ui.droppable.js, jquery.ui.resizable.js, jquery.ui.selectable.js, jquery.ui.sortable.js, jquery.ui.accordion.js, jquery.ui.autocomplete.js, jquery.ui.button.js, jquery.ui.datepicker.js, jquery.ui.dialog.js, jquery.ui.menu.js, jquery.ui.progressbar.js, jquery.ui.slider.js, jquery.ui.spinner.js, jquery.ui.tabs.js, jquery.ui.tooltip.js, jquery.ui.effect.js, jquery.ui.effect-blind.js, jquery.ui.effect-bounce.js, jquery.ui.effect-clip.js, jquery.ui.effect-drop.js, jquery.ui.effect-explode.js, jquery.ui.effect-fade.js, jquery.ui.effect-fold.js, jquery.ui.effect-highlight.js, jquery.ui.effect-pulsate.js, jquery.ui.effect-scale.js, jquery.ui.effect-shake.js, jquery.ui.effect-slide.js, jquery.ui.effect-transfer.js
|
||||
* Copyright (c) 2013 jQuery Foundation and other contributors Licensed MIT */
|
||||
|
||||
(function(e,t){function i(t,n){var r,i,o,u=t.nodeName.toLowerCase();return"area"===u?(r=t.parentNode,i=r.name,!t.href||!i||r.nodeName.toLowerCase()!=="map"?!1:(o=e("img[usemap=#"+i+"]")[0],!!o&&s(o))):(/input|select|textarea|button|object/.test(u)?!t.disabled:"a"===u?t.href||n:n)&&s(t)}function s(t){return e.expr.filters.visible(t)&&!e(t).parents().addBack().filter(function(){return e.css(this,"visibility")==="hidden"}).length}var n=0,r=/^ui-id-\d+$/;e.ui=e.ui||{};if(e.ui.version)return;e.extend(e.ui,{version:"1.10.0",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),e.fn.extend({_focus:e.fn.focus,focus:function(t,n){return typeof t=="number"?this.each(function(){var r=this;setTimeout(function(){e(r).focus(),n&&n.call(r)},t)}):this._focus.apply(this,arguments)},scrollParent:function(){var t;return e.ui.ie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?t=this.parents().filter(function(){return/(relative|absolute|fixed)/.test(e.css(this,"position"))&&/(auto|scroll)/.test(e.css(this,"overflow")+e.css(this,"overflow-y")+e.css(this,"overflow-x"))}).eq(0):t=this.parents().filter(function(){return/(auto|scroll)/.test(e.css(this,"overflow")+e.css(this,"overflow-y")+e.css(this,"overflow-x"))}).eq(0),/fixed/.test(this.css("position"))||!t.length?e(document):t},zIndex:function(n){if(n!==t)return this.css("zIndex",n);if(this.length){var r=e(this[0]),i,s;while(r.length&&r[0]!==document){i=r.css("position");if(i==="absolute"||i==="relative"||i==="fixed"){s=parseInt(r.css("zIndex"),10);if(!isNaN(s)&&s!==0)return s}r=r.parent()}}return 0},uniqueId:function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++n)})},removeUniqueId:function(){return this.each(function(){r.test(this.id)&&e(this).removeAttr("id")})}}),e.extend(e.expr[":"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(n){return!!e.data(n,t)}}):function(t,n,r){return!!e.data(t,r[3])},focusable:function(t){return i(t,!isNaN(e.attr(t,"tabindex")))},tabbable:function(t){var n=e.attr(t,"tabindex"),r=isNaN(n);return(r||n>=0)&&i(t,!r)}}),e("<a>").outerWidth(1).jquery||e.each(["Width","Height"],function(n,r){function u(t,n,r,s){return e.each(i,function(){n-=parseFloat(e.css(t,"padding"+this))||0,r&&(n-=parseFloat(e.css(t,"border"+this+"Width"))||0),s&&(n-=parseFloat(e.css(t,"margin"+this))||0)}),n}var i=r==="Width"?["Left","Right"]:["Top","Bottom"],s=r.toLowerCase(),o={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn["inner"+r]=function(n){return n===t?o["inner"+r].call(this):this.each(function(){e(this).css(s,u(this,n)+"px")})},e.fn["outer"+r]=function(t,n){return typeof t!="number"?o["outer"+r].call(this,t):this.each(function(){e(this).css(s,u(this,t,!0,n)+"px")})}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(e==null?this.prevObject:this.prevObject.filter(e))}),e("<a>").data("a-b","a").removeData("a-b").data("a-b")&&(e.fn.removeData=function(t){return function(n){return arguments.length?t.call(this,e.camelCase(n)):t.call(this)}}(e.fn.removeData)),e.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()),e.support.selectstart="onselectstart"in document.createElement("div"),e.fn.extend({disableSelection:function(){return this.bind((e.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),e.extend(e.ui,{plugin:{add:function(t,n,r){var i,s=e.ui[t].prototype;for(i in r)s.plugins[i]=s.plugins[i]||[],s.plugins[i].push([n,r[i]])},call:function(e,t,n){var r,i=e.plugins[t];if(!i||!e.element[0].parentNode||e.element[0].parentNode.nodeType===11)return;for(r=0;r<i.length;r++)e.options[i[r][0]]&&i[r][1].apply(e.element,n)}},hasScroll:function(t,n){if(e(t).css("overflow")==="hidden")return!1;var r=n&&n==="left"?"scrollLeft":"scrollTop",i=!1;return t[r]>0?!0:(t[r]=1,i=t[r]>0,t[r]=0,i)}})})(jQuery);(function(e,t){var n=0,r=Array.prototype.slice,i=e.cleanData;e.cleanData=function(t){for(var n=0,r;(r=t[n])!=null;n++)try{e(r).triggerHandler("remove")}catch(s){}i(t)},e.widget=function(t,n,r){var i,s,o,u,a={},f=t.split(".")[0];t=t.split(".")[1],i=f+"-"+t,r||(r=n,n=e.Widget),e.expr[":"][i.toLowerCase()]=function(t){return!!e.data(t,i)},e[f]=e[f]||{},s=e[f][t],o=e[f][t]=function(e,t){if(!this._createWidget)return new o(e,t);arguments.length&&this._createWidget(e,t)},e.extend(o,s,{version:r.version,_proto:e.extend({},r),_childConstructors:[]}),u=new n,u.options=e.widget.extend({},u.options),e.each(r,function(t,r){if(!e.isFunction(r)){a[t]=r;return}a[t]=function(){var e=function(){return n.prototype[t].apply(this,arguments)},i=function(e){return n.prototype[t].apply(this,e)};return function(){var t=Line truncated
|
||||
@@ -0,0 +1,7 @@
|
||||
/*! jQuery UI - v1.10.2 - 2013-04-01
|
||||
* http://jqueryui.com
|
||||
* Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.position.js, jquery.ui.draggable.js, jquery.ui.droppable.js, jquery.ui.resizable.js, jquery.ui.selectable.js, jquery.ui.sortable.js, jquery.ui.accordion.js, jquery.ui.autocomplete.js, jquery.ui.button.js, jquery.ui.datepicker.js, jquery.ui.dialog.js, jquery.ui.menu.js, jquery.ui.progressbar.js, jquery.ui.slider.js, jquery.ui.spinner.js, jquery.ui.tabs.js, jquery.ui.tooltip.js, jquery.ui.effect.js, jquery.ui.effect-blind.js, jquery.ui.effect-bounce.js, jquery.ui.effect-clip.js, jquery.ui.effect-drop.js, jquery.ui.effect-explode.js, jquery.ui.effect-fade.js, jquery.ui.effect-fold.js, jquery.ui.effect-highlight.js, jquery.ui.effect-pulsate.js, jquery.ui.effect-scale.js, jquery.ui.effect-shake.js, jquery.ui.effect-slide.js, jquery.ui.effect-transfer.js
|
||||
* Copyright 2013 jQuery Foundation and other contributors Licensed MIT */
|
||||
|
||||
(function(e,t){function i(t,i){var a,n,r,o=t.nodeName.toLowerCase();return"area"===o?(a=t.parentNode,n=a.name,t.href&&n&&"map"===a.nodeName.toLowerCase()?(r=e("img[usemap=#"+n+"]")[0],!!r&&s(r)):!1):(/input|select|textarea|button|object/.test(o)?!t.disabled:"a"===o?t.href||i:i)&&s(t)}function s(t){return e.expr.filters.visible(t)&&!e(t).parents().addBack().filter(function(){return"hidden"===e.css(this,"visibility")}).length}var a=0,n=/^ui-id-\d+$/;e.ui=e.ui||{},e.extend(e.ui,{version:"1.10.2",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),e.fn.extend({focus:function(t){return function(i,s){return"number"==typeof i?this.each(function(){var t=this;setTimeout(function(){e(t).focus(),s&&s.call(t)},i)}):t.apply(this,arguments)}}(e.fn.focus),scrollParent:function(){var t;return t=e.ui.ie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(e.css(this,"position"))&&/(auto|scroll)/.test(e.css(this,"overflow")+e.css(this,"overflow-y")+e.css(this,"overflow-x"))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(e.css(this,"overflow")+e.css(this,"overflow-y")+e.css(this,"overflow-x"))}).eq(0),/fixed/.test(this.css("position"))||!t.length?e(document):t},zIndex:function(i){if(i!==t)return this.css("zIndex",i);if(this.length)for(var s,a,n=e(this[0]);n.length&&n[0]!==document;){if(s=n.css("position"),("absolute"===s||"relative"===s||"fixed"===s)&&(a=parseInt(n.css("zIndex"),10),!isNaN(a)&&0!==a))return a;n=n.parent()}return 0},uniqueId:function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++a)})},removeUniqueId:function(){return this.each(function(){n.test(this.id)&&e(this).removeAttr("id")})}}),e.extend(e.expr[":"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(i){return!!e.data(i,t)}}):function(t,i,s){return!!e.data(t,s[3])},focusable:function(t){return i(t,!isNaN(e.attr(t,"tabindex")))},tabbable:function(t){var s=e.attr(t,"tabindex"),a=isNaN(s);return(a||s>=0)&&i(t,!a)}}),e("<a>").outerWidth(1).jquery||e.each(["Width","Height"],function(i,s){function a(t,i,s,a){return e.each(n,function(){i-=parseFloat(e.css(t,"padding"+this))||0,s&&(i-=parseFloat(e.css(t,"border"+this+"Width"))||0),a&&(i-=parseFloat(e.css(t,"margin"+this))||0)}),i}var n="Width"===s?["Left","Right"]:["Top","Bottom"],r=s.toLowerCase(),o={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn["inner"+s]=function(i){return i===t?o["inner"+s].call(this):this.each(function(){e(this).css(r,a(this,i)+"px")})},e.fn["outer"+s]=function(t,i){return"number"!=typeof t?o["outer"+s].call(this,t):this.each(function(){e(this).css(r,a(this,t,!0,i)+"px")})}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e("<a>").data("a-b","a").removeData("a-b").data("a-b")&&(e.fn.removeData=function(t){return function(i){return arguments.length?t.call(this,e.camelCase(i)):t.call(this)}}(e.fn.removeData)),e.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()),e.support.selectstart="onselectstart"in document.createElement("div"),e.fn.extend({disableSelection:function(){return this.bind((e.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),e.extend(e.ui,{plugin:{add:function(t,i,s){var a,n=e.ui[t].prototype;for(a in s)n.plugins[a]=n.plugins[a]||[],n.plugins[a].push([i,s[a]])},call:function(e,t,i){var s,a=e.plugins[t];if(a&&e.element[0].parentNode&&11!==e.element[0].parentNode.nodeType)for(s=0;a.length>s;s++)e.options[a[s][0]]&&a[s][1].apply(e.element,i)}},hasScroll:function(t,i){if("hidden"===e(t).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",a=!1;return t[s]>0?!0:(t[s]=1,a=t[s]>0,t[s]=0,a)}})})(jQuery);(function(e,t){var i=0,s=Array.prototype.slice,n=e.cleanData;e.cleanData=function(t){for(var i,s=0;null!=(i=t[s]);s++)try{e(i).triggerHandler("remove")}catch(a){}n(t)},e.widget=function(i,s,n){var a,r,o,h,l={},u=i.split(".")[0];i=i.split(".")[1],a=u+"-"+i,n||(n=s,s=e.Widget),e.expr[":"][a.toLowerCase()]=function(t){return!!e.data(t,a)},e[u]=e[u]||{},r=e[u][i],o=e[u][i]=function(e,i){return this._createWidget?(arguments.length&&this._createWidget(e,i),t):new o(e,i)},e.extend(o,r,{version:n.version,_proto:e.extend({},n),_childConstructors:[]}),h=new s,h.options=e.widget.extend({},h.options),e.each(n,function(i,n){return e.isFunction(n)?(l[i]=function(){var e=function(){return s.prototype[i].apply(this,arguments)},t=function(e){return s.prototype[i].apply(this,e)};return function(){var i,s=this._super,a=this._superApply;return this._suLine truncated
|
||||
y+="</select>"}if(_||(b+=y+(!a&&g&&v?"":" ")),!t.yearshtml)if(t.yearshtml="",a||!v)b+="<span class='ui-datepicker-year'>"+i+"</span>";else{for(u=this._get(t,"yearRange").split(":"),d=(new Date).getFullYear(),p=function(t){var e=t.match(/c[+\-].*/)?i+parseInt(t.substring(1),10):t.match(/[+\-].*/)?d+parseInt(t,10):parseInt(t,10);return isNaN(e)?d:e},f=p(u[0]),m=Math.max(f,p(u[1]||"")),f=s?Math.max(f,s.getFullYear()):f,m=n?Math.min(m,n.getFullYear()):m,t.yearshtml+="<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>";m>=f;f++)t.yearshtml+="<option value='"+f+"'"+(f===i?" selected='selected'":"")+">"+f+"</option>";t.yearshtml+="</select>",b+=t.yearshtml,t.yearshtml=null}return b+=this._get(t,"yearSuffix"),_&&(b+=(!a&&g&&v?"":" ")+y),b+="</div>"},_adjustInstDate:function(t,e,i){var s=t.drawYear+("Y"===i?e:0),n=t.drawMonth+("M"===i?e:0),a=Math.min(t.selectedDay,this._getDaysInMonth(s,n))+("D"===i?e:0),r=this._restrictMinMax(t,this._daylightSavingAdjust(new Date(s,n,a)));t.selectedDay=r.getDate(),t.drawMonth=t.selectedMonth=r.getMonth(),t.drawYear=t.selectedYear=r.getFullYear(),("M"===i||"Y"===i)&&this._notifyChange(t)},_restrictMinMax:function(t,e){var i=this._getMinMaxDate(t,"min"),s=this._getMinMaxDate(t,"max"),n=i&&i>e?i:e;return s&&n>s?s:n},_notifyChange:function(t){var e=this._get(t,"onChangeMonthYear");e&&e.apply(t.input?t.input[0]:null,[t.selectedYear,t.selectedMonth+1,t])},_getNumberOfMonths:function(t){var e=this._get(t,"numberOfMonths");return null==e?[1,1]:"number"==typeof e?[1,e]:e},_getMinMaxDate:function(t,e){return this._determineDate(t,this._get(t,e+"Date"),null)},_getDaysInMonth:function(t,e){return 32-this._daylightSavingAdjust(new Date(t,e,32)).getDate()},_getFirstDayOfMonth:function(t,e){return new Date(t,e,1).getDay()},_canAdjustMonth:function(t,e,i,s){var n=this._getNumberOfMonths(t),a=this._daylightSavingAdjust(new Date(i,s+(0>e?e:n[0]*n[1]),1));return 0>e&&a.setDate(this._getDaysInMonth(a.getFullYear(),a.getMonth())),this._isInRange(t,a)},_isInRange:function(t,e){var i,s,n=this._getMinMaxDate(t,"min"),a=this._getMinMaxDate(t,"max"),r=null,o=null,h=this._get(t,"yearRange");return h&&(i=h.split(":"),s=(new Date).getFullYear(),r=parseInt(i[0],10),o=parseInt(i[1],10),i[0].match(/[+\-].*/)&&(r+=s),i[1].match(/[+\-].*/)&&(o+=s)),(!n||e.getTime()>=n.getTime())&&(!a||e.getTime()<=a.getTime())&&(!r||e.getFullYear()>=r)&&(!o||o>=e.getFullYear())},_getFormatConfig:function(t){var e=this._get(t,"shortYearCutoff");return e="string"!=typeof e?e:(new Date).getFullYear()%100+parseInt(e,10),{shortYearCutoff:e,dayNamesShort:this._get(t,"dayNamesShort"),dayNames:this._get(t,"dayNames"),monthNamesShort:this._get(t,"monthNamesShort"),monthNames:this._get(t,"monthNames")}},_formatDate:function(t,e,i,s){e||(t.currentDay=t.selectedDay,t.currentMonth=t.selectedMonth,t.currentYear=t.selectedYear);var n=e?"object"==typeof e?e:this._daylightSavingAdjust(new Date(s,i,e)):this._daylightSavingAdjust(new Date(t.currentYear,t.currentMonth,t.currentDay));return this.formatDate(this._get(t,"dateFormat"),n,this._getFormatConfig(t))}}),t.fn.datepicker=function(e){if(!this.length)return this;t.datepicker.initialized||(t(document).mousedown(t.datepicker._checkExternalClick),t.datepicker.initialized=!0),0===t("#"+t.datepicker._mainDivId).length&&t("body").append(t.datepicker.dpDiv);var i=Array.prototype.slice.call(arguments,1);return"string"!=typeof e||"isDisabled"!==e&&"getDate"!==e&&"widget"!==e?"option"===e&&2===arguments.length&&"string"==typeof arguments[1]?t.datepicker["_"+e+"Datepicker"].apply(t.datepicker,[this[0]].concat(i)):this.each(function(){"string"==typeof e?t.datepicker["_"+e+"Datepicker"].apply(t.datepicker,[this].concat(i)):t.datepicker._attachDatepicker(this,e)}):t.datepicker["_"+e+"Datepicker"].apply(t.datepicker,[this[0]].concat(i))},t.datepicker=new i,t.datepicker.initialized=!1,t.datepicker.uuid=(new Date).getTime(),t.datepicker.version="1.10.2",window["DP_jQuery_"+o]=t})(jQuery);(function(t){var e={buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},i={maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0};t.widget("ui.dialog",{version:"1.10.2",options:{appendTo:"body",autoOpen:!0,buttons:[],closeOnEscape:!0,closeText:"close",dialogClass:"",draggable:!0,hide:null,height:"auto",maxHeight:null,maxWidth:null,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",of:window,collision:"fit",using:function(e){var i=t(this).css(e).offset().top;0>i&&t(this).css("top",e.top-i)}},resizable:!0,show:null,title:null,width:300,beforeClose:null,close:null,drag:null,dragStart:null,dragStop:null,focus:null,open:null,resize:null,resizeStart:null,resizeStop:null},_create:function(){this.originalCss={display:this.element[0].style.display,width:this.element[0].style.width,minHeight:this.element[0].style.minHeight,maxHeight:this.element[0].style.maxHeight,height:this.element[0].style.height},this.originalPosition={parent:this.element.parent(),indeLine truncated
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,84 @@
|
||||
/**
|
||||
* fastLiveFilter jQuery plugin 1.0.3
|
||||
*
|
||||
* Copyright (c) 2011, Anthony Bush
|
||||
* License: <http://www.opensource.org/licenses/bsd-license.php>
|
||||
* Project Website: http://anthonybush.com/projects/jquery_fast_live_filter/
|
||||
**/
|
||||
!function ($) {
|
||||
$.fn.fastLiveFilter = function(list, item, tar, options) {
|
||||
// Options: input, list, timeout, callback
|
||||
options = options || {};
|
||||
list = $(list);
|
||||
var input = this;
|
||||
var target = $(tar);
|
||||
var timeout = options.timeout || 0;
|
||||
var callback = options.callback || function() {};
|
||||
|
||||
var keyTimeout;
|
||||
|
||||
// NOTE: because we cache lis & len here, users would need to re-init the plugin
|
||||
// if they modify the list in the DOM later. This doesn't give us that much speed
|
||||
// boost, so perhaps it's not worth putting it here.
|
||||
var lis = list.find(item);
|
||||
var len = lis.length;
|
||||
var oldDisplay = len > 0 ? lis[0].style.display : "block";
|
||||
callback(len); // do a one-time callback on initialization to make sure everything's in sync
|
||||
|
||||
input.change(function() {
|
||||
// var startTime = new Date().getTime();
|
||||
var filter = input.val().toLowerCase();
|
||||
var li;
|
||||
var numShown = 0;
|
||||
for (var i = 0; i < len; i++) {
|
||||
li = lis.eq(i);
|
||||
if ((li.find(target).text()).toLowerCase().indexOf(filter) >= 0) {
|
||||
if (li.hasClass("mark")) {
|
||||
li.removeClass('mark');
|
||||
|
||||
// for Orbit
|
||||
// var showTags = lis.not('.mark').find('input[type="checkbox"]:checked').length;
|
||||
// if(lis.showTags) {
|
||||
// $('#deselect, #deleteTags').removeClass('hide')
|
||||
// }
|
||||
}
|
||||
numShown++;
|
||||
} else {
|
||||
if (!li.hasClass("mark")) {
|
||||
li.addClass('mark');
|
||||
|
||||
// for Orbit
|
||||
// var showTags = lis.not('.mark').find('input[type="checkbox"]:checked').length;
|
||||
// if(showTags == 0) {
|
||||
// $('#deselect, #deleteTags').addClass('hide')
|
||||
// }
|
||||
|
||||
|
||||
// li.children('.card').removeClass('active').children('input').attr('checked', false);
|
||||
// if($('.tags input[type="checkbox"]:checked').length == 0) {
|
||||
// $('#deselect, #deleteTags, #addDefault').addClass('hide')
|
||||
// }
|
||||
}
|
||||
}
|
||||
}
|
||||
callback(numShown);
|
||||
// var endTime = new Date().getTime();
|
||||
// console.log('Search for ' + filter + ' took: ' + (endTime - startTime) + ' (' + numShown + ' results)');
|
||||
return false;
|
||||
}).keydown(function(e) {
|
||||
// TODO: one point of improvement could be in here: currently the change event is
|
||||
// invoked even if a change does not occur (e.g. by pressing a modifier key or
|
||||
// something)
|
||||
clearTimeout(keyTimeout);
|
||||
keyTimeout = setTimeout(function() { input.change(); }, timeout);
|
||||
if(e.which == '13') {
|
||||
e.preventDefault();
|
||||
}
|
||||
// } else if(e.which == '8') {
|
||||
// clearTimeout(keyTimeout);
|
||||
// keyTimeout = setTimeout(function() { input.change(); }, timeout);
|
||||
// }
|
||||
});
|
||||
return this; // maintain jQuery chainability
|
||||
}
|
||||
}(window.jQuery);
|
||||
@@ -0,0 +1,980 @@
|
||||
/*!
|
||||
* jQuery Form Plugin
|
||||
* version: 2.94 (13-DEC-2011)
|
||||
* @requires jQuery v1.3.2 or later
|
||||
*
|
||||
* Examples and documentation at: http://malsup.com/jquery/form/
|
||||
* Dual licensed under the MIT and GPL licenses:
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
* http://www.gnu.org/licenses/gpl.html
|
||||
*/
|
||||
;(function($) {
|
||||
|
||||
/*
|
||||
Usage Note:
|
||||
-----------
|
||||
Do not use both ajaxSubmit and ajaxForm on the same form. These
|
||||
functions are intended to be exclusive. Use ajaxSubmit if you want
|
||||
to bind your own submit handler to the form. For example,
|
||||
|
||||
$(document).ready(function() {
|
||||
$('#myForm').bind('submit', function(e) {
|
||||
e.preventDefault(); // <-- important
|
||||
$(this).ajaxSubmit({
|
||||
target: '#output'
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Use ajaxForm when you want the plugin to manage all the event binding
|
||||
for you. For example,
|
||||
|
||||
$(document).ready(function() {
|
||||
$('#myForm').ajaxForm({
|
||||
target: '#output'
|
||||
});
|
||||
});
|
||||
|
||||
When using ajaxForm, the ajaxSubmit function will be invoked for you
|
||||
at the appropriate time.
|
||||
*/
|
||||
|
||||
/**
|
||||
* ajaxSubmit() provides a mechanism for immediately submitting
|
||||
* an HTML form using AJAX.
|
||||
*/
|
||||
$.fn.ajaxSubmit = function(options) {
|
||||
// fast fail if nothing selected (http://dev.jquery.com/ticket/2752)
|
||||
if (!this.length) {
|
||||
log('ajaxSubmit: skipping submit process - no element selected');
|
||||
return this;
|
||||
}
|
||||
|
||||
var method, action, url, $form = this;
|
||||
|
||||
if (typeof options == 'function') {
|
||||
options = { success: options };
|
||||
}
|
||||
|
||||
method = this.attr('method');
|
||||
action = this.attr('action');
|
||||
url = (typeof action === 'string') ? $.trim(action) : '';
|
||||
url = url || window.location.href || '';
|
||||
if (url) {
|
||||
// clean url (don't include hash vaue)
|
||||
url = (url.match(/^([^#]+)/)||[])[1];
|
||||
}
|
||||
|
||||
options = $.extend(true, {
|
||||
url: url,
|
||||
success: $.ajaxSettings.success,
|
||||
type: method || 'GET',
|
||||
iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank'
|
||||
}, options);
|
||||
|
||||
// hook for manipulating the form data before it is extracted;
|
||||
// convenient for use with rich editors like tinyMCE or FCKEditor
|
||||
var veto = {};
|
||||
this.trigger('form-pre-serialize', [this, options, veto]);
|
||||
if (veto.veto) {
|
||||
log('ajaxSubmit: submit vetoed via form-pre-serialize trigger');
|
||||
return this;
|
||||
}
|
||||
|
||||
// provide opportunity to alter form data before it is serialized
|
||||
if (options.beforeSerialize && options.beforeSerialize(this, options) === false) {
|
||||
log('ajaxSubmit: submit aborted via beforeSerialize callback');
|
||||
return this;
|
||||
}
|
||||
|
||||
var traditional = options.traditional;
|
||||
if ( traditional === undefined ) {
|
||||
traditional = $.ajaxSettings.traditional;
|
||||
}
|
||||
|
||||
var qx,n,v,a = this.formToArray(options.semantic);
|
||||
if (options.data) {
|
||||
options.extraData = options.data;
|
||||
qx = $.param(options.data, traditional);
|
||||
}
|
||||
|
||||
// give pre-submit callback an opportunity to abort the submit
|
||||
if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) {
|
||||
log('ajaxSubmit: submit aborted via beforeSubmit callback');
|
||||
return this;
|
||||
}
|
||||
|
||||
// fire vetoable 'validate' event
|
||||
this.trigger('form-submit-validate', [a, this, options, veto]);
|
||||
if (veto.veto) {
|
||||
log('ajaxSubmit: submit vetoed via form-submit-validate trigger');
|
||||
return this;
|
||||
}
|
||||
|
||||
var q = $.param(a, traditional);
|
||||
if (qx) {
|
||||
q = ( q ? (q + '&' + qx) : qx );
|
||||
}
|
||||
if (options.type.toUpperCase() == 'GET') {
|
||||
options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;
|
||||
options.data = null; // data is null for 'get'
|
||||
}
|
||||
else {
|
||||
options.data = q; // data is the query string for 'post'
|
||||
}
|
||||
|
||||
var callbacks = [];
|
||||
if (options.resetForm) {
|
||||
callbacks.push(function() { $form.resetForm(); });
|
||||
}
|
||||
if (options.clearForm) {
|
||||
callbacks.push(function() { $form.clearForm(options.includeHidden); });
|
||||
}
|
||||
|
||||
// perform a load on the target only if dataType is not provided
|
||||
if (!options.dataType && options.target) {
|
||||
var oldSuccess = options.success || function(){};
|
||||
callbacks.push(function(data) {
|
||||
var fn = options.replaceTarget ? 'replaceWith' : 'html';
|
||||
$(options.target)[fn](data).each(oldSuccess, arguments);
|
||||
});
|
||||
}
|
||||
else if (options.success) {
|
||||
callbacks.push(options.success);
|
||||
}
|
||||
|
||||
options.success = function(data, status, xhr) { // jQuery 1.4+ passes xhr as 3rd arg
|
||||
var context = options.context || options; // jQuery 1.4+ supports scope context
|
||||
for (var i=0, max=callbacks.length; i < max; i++) {
|
||||
callbacks[i].apply(context, [data, status, xhr || $form, $form]);
|
||||
}
|
||||
};
|
||||
|
||||
// are there files to upload?
|
||||
var fileInputs = $('input:file:enabled[value]', this); // [value] (issue #113)
|
||||
var hasFileInputs = fileInputs.length > 0;
|
||||
var mp = 'multipart/form-data';
|
||||
var multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp);
|
||||
|
||||
var fileAPI = !!(hasFileInputs && fileInputs.get(0).files && window.FormData);
|
||||
log("fileAPI :" + fileAPI);
|
||||
var shouldUseFrame = (hasFileInputs || multipart) && !fileAPI;
|
||||
|
||||
// options.iframe allows user to force iframe mode
|
||||
// 06-NOV-09: now defaulting to iframe mode if file input is detected
|
||||
if (options.iframe !== false && (options.iframe || shouldUseFrame)) {
|
||||
// hack to fix Safari hang (thanks to Tim Molendijk for this)
|
||||
// see: http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d
|
||||
if (options.closeKeepAlive) {
|
||||
$.get(options.closeKeepAlive, function() {
|
||||
fileUploadIframe(a);
|
||||
});
|
||||
}
|
||||
else {
|
||||
fileUploadIframe(a);
|
||||
}
|
||||
}
|
||||
else if ((hasFileInputs || multipart) && fileAPI) {
|
||||
options.progress = options.progress || $.noop;
|
||||
fileUploadXhr(a);
|
||||
}
|
||||
else {
|
||||
$.ajax(options);
|
||||
}
|
||||
|
||||
// fire 'notify' event
|
||||
this.trigger('form-submit-notify', [this, options]);
|
||||
return this;
|
||||
|
||||
// XMLHttpRequest Level 2 file uploads (big hat tip to francois2metz)
|
||||
function fileUploadXhr(a) {
|
||||
var formdata = new FormData();
|
||||
|
||||
for (var i=0; i < a.length; i++) {
|
||||
if (a[i].type == 'file')
|
||||
continue;
|
||||
formdata.append(a[i].name, a[i].value);
|
||||
}
|
||||
|
||||
$form.find('input:file:enabled').each(function(){
|
||||
var name = $(this).attr('name'), files = this.files;
|
||||
if (name) {
|
||||
for (var i=0; i < files.length; i++)
|
||||
formdata.append(name, files[i]);
|
||||
}
|
||||
});
|
||||
|
||||
if (options.extraData) {
|
||||
for (var k in options.extraData)
|
||||
formdata.append(k, options.extraData[k])
|
||||
}
|
||||
|
||||
options.data = null;
|
||||
|
||||
var s = $.extend(true, {}, $.ajaxSettings, options, {
|
||||
contentType: false,
|
||||
processData: false,
|
||||
cache: false,
|
||||
type: 'POST'
|
||||
});
|
||||
|
||||
s.context = s.context || s;
|
||||
|
||||
s.data = null;
|
||||
var beforeSend = s.beforeSend;
|
||||
s.beforeSend = function(xhr, o) {
|
||||
o.data = formdata;
|
||||
if(xhr.upload) { // unfortunately, jQuery doesn't expose this prop (http://bugs.jquery.com/ticket/10190)
|
||||
xhr.upload.onprogress = function(event) {
|
||||
o.progress(event.position, event.total);
|
||||
};
|
||||
}
|
||||
if(beforeSend)
|
||||
beforeSend.call(o, xhr, options);
|
||||
};
|
||||
$.ajax(s);
|
||||
}
|
||||
|
||||
// private function for handling file uploads (hat tip to YAHOO!)
|
||||
function fileUploadIframe(a) {
|
||||
var form = $form[0], el, i, s, g, id, $io, io, xhr, sub, n, timedOut, timeoutHandle;
|
||||
var useProp = !!$.fn.prop;
|
||||
|
||||
if (a) {
|
||||
if ( useProp ) {
|
||||
// ensure that every serialized input is still enabled
|
||||
for (i=0; i < a.length; i++) {
|
||||
el = $(form[a[i].name]);
|
||||
el.prop('disabled', false);
|
||||
}
|
||||
} else {
|
||||
for (i=0; i < a.length; i++) {
|
||||
el = $(form[a[i].name]);
|
||||
el.removeAttr('disabled');
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
if ($(':input[name=submit],:input[id=submit]', form).length) {
|
||||
// if there is an input with a name or id of 'submit' then we won't be
|
||||
// able to invoke the submit fn on the form (at least not x-browser)
|
||||
alert('Error: Form elements must not have name or id of "submit".');
|
||||
return;
|
||||
}
|
||||
|
||||
s = $.extend(true, {}, $.ajaxSettings, options);
|
||||
s.context = s.context || s;
|
||||
id = 'jqFormIO' + (new Date().getTime());
|
||||
if (s.iframeTarget) {
|
||||
$io = $(s.iframeTarget);
|
||||
n = $io.attr('name');
|
||||
if (n == null)
|
||||
$io.attr('name', id);
|
||||
else
|
||||
id = n;
|
||||
}
|
||||
else {
|
||||
$io = $('<iframe name="' + id + '" src="'+ s.iframeSrc +'" />');
|
||||
$io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });
|
||||
}
|
||||
io = $io[0];
|
||||
|
||||
|
||||
xhr = { // mock object
|
||||
aborted: 0,
|
||||
responseText: null,
|
||||
responseXML: null,
|
||||
status: 0,
|
||||
statusText: 'n/a',
|
||||
getAllResponseHeaders: function() {},
|
||||
getResponseHeader: function() {},
|
||||
setRequestHeader: function() {},
|
||||
abort: function(status) {
|
||||
var e = (status === 'timeout' ? 'timeout' : 'aborted');
|
||||
log('aborting upload... ' + e);
|
||||
this.aborted = 1;
|
||||
$io.attr('src', s.iframeSrc); // abort op in progress
|
||||
xhr.error = e;
|
||||
s.error && s.error.call(s.context, xhr, e, status);
|
||||
g && $.event.trigger("ajaxError", [xhr, s, e]);
|
||||
s.complete && s.complete.call(s.context, xhr, e);
|
||||
}
|
||||
};
|
||||
|
||||
g = s.global;
|
||||
// trigger ajax global events so that activity/block indicators work like normal
|
||||
if (g && ! $.active++) {
|
||||
$.event.trigger("ajaxStart");
|
||||
}
|
||||
if (g) {
|
||||
$.event.trigger("ajaxSend", [xhr, s]);
|
||||
}
|
||||
|
||||
if (s.beforeSend && s.beforeSend.call(s.context, xhr, s) === false) {
|
||||
if (s.global) {
|
||||
$.active--;
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (xhr.aborted) {
|
||||
return;
|
||||
}
|
||||
|
||||
// add submitting element to data if we know it
|
||||
sub = form.clk;
|
||||
if (sub) {
|
||||
n = sub.name;
|
||||
if (n && !sub.disabled) {
|
||||
s.extraData = s.extraData || {};
|
||||
s.extraData[n] = sub.value;
|
||||
if (sub.type == "image") {
|
||||
s.extraData[n+'.x'] = form.clk_x;
|
||||
s.extraData[n+'.y'] = form.clk_y;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var CLIENT_TIMEOUT_ABORT = 1;
|
||||
var SERVER_ABORT = 2;
|
||||
|
||||
function getDoc(frame) {
|
||||
var doc = frame.contentWindow ? frame.contentWindow.document : frame.contentDocument ? frame.contentDocument : frame.document;
|
||||
return doc;
|
||||
}
|
||||
|
||||
// Rails CSRF hack (thanks to Yvan Barthelemy)
|
||||
var csrf_token = $('meta[name=csrf-token]').attr('content');
|
||||
var csrf_param = $('meta[name=csrf-param]').attr('content');
|
||||
if (csrf_param && csrf_token) {
|
||||
s.extraData = s.extraData || {};
|
||||
s.extraData[csrf_param] = csrf_token;
|
||||
}
|
||||
|
||||
// take a breath so that pending repaints get some cpu time before the upload starts
|
||||
function doSubmit() {
|
||||
// make sure form attrs are set
|
||||
var t = $form.attr('target'), a = $form.attr('action');
|
||||
|
||||
// update form attrs in IE friendly way
|
||||
form.setAttribute('target',id);
|
||||
if (!method) {
|
||||
form.setAttribute('method', 'POST');
|
||||
}
|
||||
if (a != s.url) {
|
||||
form.setAttribute('action', s.url);
|
||||
}
|
||||
|
||||
// ie borks in some cases when setting encoding
|
||||
if (! s.skipEncodingOverride && (!method || /post/i.test(method))) {
|
||||
$form.attr({
|
||||
encoding: 'multipart/form-data',
|
||||
enctype: 'multipart/form-data'
|
||||
});
|
||||
}
|
||||
|
||||
// support timout
|
||||
if (s.timeout) {
|
||||
timeoutHandle = setTimeout(function() { timedOut = true; cb(CLIENT_TIMEOUT_ABORT); }, s.timeout);
|
||||
}
|
||||
|
||||
// look for server aborts
|
||||
function checkState() {
|
||||
try {
|
||||
var state = getDoc(io).readyState;
|
||||
log('state = ' + state);
|
||||
if (state.toLowerCase() == 'uninitialized')
|
||||
setTimeout(checkState,50);
|
||||
}
|
||||
catch(e) {
|
||||
log('Server abort: ' , e, ' (', e.name, ')');
|
||||
cb(SERVER_ABORT);
|
||||
timeoutHandle && clearTimeout(timeoutHandle);
|
||||
timeoutHandle = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
// add "extra" data to form if provided in options
|
||||
var extraInputs = [];
|
||||
try {
|
||||
if (s.extraData) {
|
||||
for (var n in s.extraData) {
|
||||
extraInputs.push(
|
||||
$('<input type="hidden" name="'+n+'">').attr('value',s.extraData[n])
|
||||
.appendTo(form)[0]);
|
||||
}
|
||||
}
|
||||
|
||||
if (!s.iframeTarget) {
|
||||
// add iframe to doc and submit the form
|
||||
$io.appendTo('body');
|
||||
io.attachEvent ? io.attachEvent('onload', cb) : io.addEventListener('load', cb, false);
|
||||
}
|
||||
setTimeout(checkState,15);
|
||||
form.submit();
|
||||
}
|
||||
finally {
|
||||
// reset attrs and remove "extra" input elements
|
||||
form.setAttribute('action',a);
|
||||
if(t) {
|
||||
form.setAttribute('target', t);
|
||||
} else {
|
||||
$form.removeAttr('target');
|
||||
}
|
||||
$(extraInputs).remove();
|
||||
}
|
||||
}
|
||||
|
||||
if (s.forceSync) {
|
||||
doSubmit();
|
||||
}
|
||||
else {
|
||||
setTimeout(doSubmit, 10); // this lets dom updates render
|
||||
}
|
||||
|
||||
var data, doc, domCheckCount = 50, callbackProcessed;
|
||||
|
||||
function cb(e) {
|
||||
if (xhr.aborted || callbackProcessed) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
doc = getDoc(io);
|
||||
}
|
||||
catch(ex) {
|
||||
log('cannot access response document: ', ex);
|
||||
e = SERVER_ABORT;
|
||||
}
|
||||
if (e === CLIENT_TIMEOUT_ABORT && xhr) {
|
||||
xhr.abort('timeout');
|
||||
return;
|
||||
}
|
||||
else if (e == SERVER_ABORT && xhr) {
|
||||
xhr.abort('server abort');
|
||||
return;
|
||||
}
|
||||
|
||||
if (!doc || doc.location.href == s.iframeSrc) {
|
||||
// response not received yet
|
||||
if (!timedOut)
|
||||
return;
|
||||
}
|
||||
io.detachEvent ? io.detachEvent('onload', cb) : io.removeEventListener('load', cb, false);
|
||||
|
||||
var status = 'success', errMsg;
|
||||
try {
|
||||
if (timedOut) {
|
||||
throw 'timeout';
|
||||
}
|
||||
|
||||
var isXml = s.dataType == 'xml' || doc.XMLDocument || $.isXMLDoc(doc);
|
||||
log('isXml='+isXml);
|
||||
if (!isXml && window.opera && (doc.body == null || doc.body.innerHTML == '')) {
|
||||
if (--domCheckCount) {
|
||||
// in some browsers (Opera) the iframe DOM is not always traversable when
|
||||
// the onload callback fires, so we loop a bit to accommodate
|
||||
log('requeing onLoad callback, DOM not available');
|
||||
setTimeout(cb, 250);
|
||||
return;
|
||||
}
|
||||
// let this fall through because server response could be an empty document
|
||||
//log('Could not access iframe DOM after mutiple tries.');
|
||||
//throw 'DOMException: not available';
|
||||
}
|
||||
|
||||
//log('response detected');
|
||||
var docRoot = doc.body ? doc.body : doc.documentElement;
|
||||
xhr.responseText = docRoot ? docRoot.innerHTML : null;
|
||||
xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;
|
||||
if (isXml)
|
||||
s.dataType = 'xml';
|
||||
xhr.getResponseHeader = function(header){
|
||||
var headers = {'content-type': s.dataType};
|
||||
return headers[header];
|
||||
};
|
||||
// support for XHR 'status' & 'statusText' emulation :
|
||||
if (docRoot) {
|
||||
xhr.status = Number( docRoot.getAttribute('status') ) || xhr.status;
|
||||
xhr.statusText = docRoot.getAttribute('statusText') || xhr.statusText;
|
||||
}
|
||||
|
||||
var dt = (s.dataType || '').toLowerCase();
|
||||
var scr = /(json|script|text)/.test(dt);
|
||||
if (scr || s.textarea) {
|
||||
// see if user embedded response in textarea
|
||||
var ta = doc.getElementsByTagName('textarea')[0];
|
||||
if (ta) {
|
||||
xhr.responseText = ta.value;
|
||||
// support for XHR 'status' & 'statusText' emulation :
|
||||
xhr.status = Number( ta.getAttribute('status') ) || xhr.status;
|
||||
xhr.statusText = ta.getAttribute('statusText') || xhr.statusText;
|
||||
}
|
||||
else if (scr) {
|
||||
// account for browsers injecting pre around json response
|
||||
var pre = doc.getElementsByTagName('pre')[0];
|
||||
var b = doc.getElementsByTagName('body')[0];
|
||||
if (pre) {
|
||||
xhr.responseText = pre.textContent ? pre.textContent : pre.innerText;
|
||||
}
|
||||
else if (b) {
|
||||
xhr.responseText = b.textContent ? b.textContent : b.innerText;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (dt == 'xml' && !xhr.responseXML && xhr.responseText != null) {
|
||||
xhr.responseXML = toXml(xhr.responseText);
|
||||
}
|
||||
|
||||
try {
|
||||
data = httpData(xhr, dt, s);
|
||||
}
|
||||
catch (e) {
|
||||
status = 'parsererror';
|
||||
xhr.error = errMsg = (e || status);
|
||||
}
|
||||
}
|
||||
catch (e) {
|
||||
log('error caught: ',e);
|
||||
status = 'error';
|
||||
xhr.error = errMsg = (e || status);
|
||||
}
|
||||
|
||||
if (xhr.aborted) {
|
||||
log('upload aborted');
|
||||
status = null;
|
||||
}
|
||||
|
||||
if (xhr.status) { // we've set xhr.status
|
||||
status = (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) ? 'success' : 'error';
|
||||
}
|
||||
|
||||
// ordering of these callbacks/triggers is odd, but that's how $.ajax does it
|
||||
if (status === 'success') {
|
||||
s.success && s.success.call(s.context, data, 'success', xhr);
|
||||
g && $.event.trigger("ajaxSuccess", [xhr, s]);
|
||||
}
|
||||
else if (status) {
|
||||
if (errMsg == undefined)
|
||||
errMsg = xhr.statusText;
|
||||
s.error && s.error.call(s.context, xhr, status, errMsg);
|
||||
g && $.event.trigger("ajaxError", [xhr, s, errMsg]);
|
||||
}
|
||||
|
||||
g && $.event.trigger("ajaxComplete", [xhr, s]);
|
||||
|
||||
if (g && ! --$.active) {
|
||||
$.event.trigger("ajaxStop");
|
||||
}
|
||||
|
||||
s.complete && s.complete.call(s.context, xhr, status);
|
||||
|
||||
callbackProcessed = true;
|
||||
if (s.timeout)
|
||||
clearTimeout(timeoutHandle);
|
||||
|
||||
// clean up
|
||||
setTimeout(function() {
|
||||
if (!s.iframeTarget)
|
||||
$io.remove();
|
||||
xhr.responseXML = null;
|
||||
}, 100);
|
||||
}
|
||||
|
||||
var toXml = $.parseXML || function(s, doc) { // use parseXML if available (jQuery 1.5+)
|
||||
if (window.ActiveXObject) {
|
||||
doc = new ActiveXObject('Microsoft.XMLDOM');
|
||||
doc.async = 'false';
|
||||
doc.loadXML(s);
|
||||
}
|
||||
else {
|
||||
doc = (new DOMParser()).parseFromString(s, 'text/xml');
|
||||
}
|
||||
return (doc && doc.documentElement && doc.documentElement.nodeName != 'parsererror') ? doc : null;
|
||||
};
|
||||
var parseJSON = $.parseJSON || function(s) {
|
||||
return window['eval']('(' + s + ')');
|
||||
};
|
||||
|
||||
var httpData = function( xhr, type, s ) { // mostly lifted from jq1.4.4
|
||||
|
||||
var ct = xhr.getResponseHeader('content-type') || '',
|
||||
xml = type === 'xml' || !type && ct.indexOf('xml') >= 0,
|
||||
data = xml ? xhr.responseXML : xhr.responseText;
|
||||
|
||||
if (xml && data.documentElement.nodeName === 'parsererror') {
|
||||
$.error && $.error('parsererror');
|
||||
}
|
||||
if (s && s.dataFilter) {
|
||||
data = s.dataFilter(data, type);
|
||||
}
|
||||
if (typeof data === 'string') {
|
||||
if (type === 'json' || !type && ct.indexOf('json') >= 0) {
|
||||
data = parseJSON(data);
|
||||
} else if (type === "script" || !type && ct.indexOf("javascript") >= 0) {
|
||||
$.globalEval(data);
|
||||
}
|
||||
}
|
||||
return data;
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* ajaxForm() provides a mechanism for fully automating form submission.
|
||||
*
|
||||
* The advantages of using this method instead of ajaxSubmit() are:
|
||||
*
|
||||
* 1: This method will include coordinates for <input type="image" /> elements (if the element
|
||||
* is used to submit the form).
|
||||
* 2. This method will include the submit element's name/value data (for the element that was
|
||||
* used to submit the form).
|
||||
* 3. This method binds the submit() method to the form for you.
|
||||
*
|
||||
* The options argument for ajaxForm works exactly as it does for ajaxSubmit. ajaxForm merely
|
||||
* passes the options argument along after properly binding events for submit elements and
|
||||
* the form itself.
|
||||
*/
|
||||
$.fn.ajaxForm = function(options) {
|
||||
// in jQuery 1.3+ we can fix mistakes with the ready state
|
||||
if (this.length === 0) {
|
||||
var o = { s: this.selector, c: this.context };
|
||||
if (!$.isReady && o.s) {
|
||||
log('DOM not ready, queuing ajaxForm');
|
||||
$(function() {
|
||||
$(o.s,o.c).ajaxForm(options);
|
||||
});
|
||||
return this;
|
||||
}
|
||||
// is your DOM ready? http://docs.jquery.com/Tutorials:Introducing_$(document).ready()
|
||||
log('terminating; zero elements found by selector' + ($.isReady ? '' : ' (DOM not ready)'));
|
||||
return this;
|
||||
}
|
||||
|
||||
return this.ajaxFormUnbind().bind('submit.form-plugin', function(e) {
|
||||
if (!e.isDefaultPrevented()) { // if event has been canceled, don't proceed
|
||||
e.preventDefault();
|
||||
$(this).ajaxSubmit(options);
|
||||
}
|
||||
}).bind('click.form-plugin', function(e) {
|
||||
var target = e.target;
|
||||
var $el = $(target);
|
||||
if (!($el.is(":submit,input:image"))) {
|
||||
// is this a child element of the submit el? (ex: a span within a button)
|
||||
var t = $el.closest(':submit');
|
||||
if (t.length == 0) {
|
||||
return;
|
||||
}
|
||||
target = t[0];
|
||||
}
|
||||
var form = this;
|
||||
form.clk = target;
|
||||
if (target.type == 'image') {
|
||||
if (e.offsetX != undefined) {
|
||||
form.clk_x = e.offsetX;
|
||||
form.clk_y = e.offsetY;
|
||||
} else if (typeof $.fn.offset == 'function') { // try to use dimensions plugin
|
||||
var offset = $el.offset();
|
||||
form.clk_x = e.pageX - offset.left;
|
||||
form.clk_y = e.pageY - offset.top;
|
||||
} else {
|
||||
form.clk_x = e.pageX - target.offsetLeft;
|
||||
form.clk_y = e.pageY - target.offsetTop;
|
||||
}
|
||||
}
|
||||
// clear form vars
|
||||
setTimeout(function() { form.clk = form.clk_x = form.clk_y = null; }, 100);
|
||||
});
|
||||
};
|
||||
|
||||
// ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm
|
||||
$.fn.ajaxFormUnbind = function() {
|
||||
return this.unbind('submit.form-plugin click.form-plugin');
|
||||
};
|
||||
|
||||
/**
|
||||
* formToArray() gathers form element data into an array of objects that can
|
||||
* be passed to any of the following ajax functions: $.get, $.post, or load.
|
||||
* Each object in the array has both a 'name' and 'value' property. An example of
|
||||
* an array for a simple login form might be:
|
||||
*
|
||||
* [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]
|
||||
*
|
||||
* It is this array that is passed to pre-submit callback functions provided to the
|
||||
* ajaxSubmit() and ajaxForm() methods.
|
||||
*/
|
||||
$.fn.formToArray = function(semantic) {
|
||||
var a = [];
|
||||
if (this.length === 0) {
|
||||
return a;
|
||||
}
|
||||
|
||||
var form = this[0];
|
||||
var els = semantic ? form.getElementsByTagName('*') : form.elements;
|
||||
if (!els) {
|
||||
return a;
|
||||
}
|
||||
|
||||
var i,j,n,v,el,max,jmax;
|
||||
for(i=0, max=els.length; i < max; i++) {
|
||||
el = els[i];
|
||||
n = el.name;
|
||||
if (!n) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (semantic && form.clk && el.type == "image") {
|
||||
// handle image inputs on the fly when semantic == true
|
||||
if(!el.disabled && form.clk == el) {
|
||||
a.push({name: n, value: $(el).val(), type: el.type });
|
||||
a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
v = $.fieldValue(el, true);
|
||||
if (v && v.constructor == Array) {
|
||||
for(j=0, jmax=v.length; j < jmax; j++) {
|
||||
a.push({name: n, value: v[j]});
|
||||
}
|
||||
}
|
||||
else if (v !== null && typeof v != 'undefined') {
|
||||
a.push({name: n, value: v, type: el.type});
|
||||
}
|
||||
}
|
||||
|
||||
if (!semantic && form.clk) {
|
||||
// input type=='image' are not found in elements array! handle it here
|
||||
var $input = $(form.clk), input = $input[0];
|
||||
n = input.name;
|
||||
if (n && !input.disabled && input.type == 'image') {
|
||||
a.push({name: n, value: $input.val()});
|
||||
a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
|
||||
}
|
||||
}
|
||||
return a;
|
||||
};
|
||||
|
||||
/**
|
||||
* Serializes form data into a 'submittable' string. This method will return a string
|
||||
* in the format: name1=value1&name2=value2
|
||||
*/
|
||||
$.fn.formSerialize = function(semantic) {
|
||||
//hand off to jQuery.param for proper encoding
|
||||
return $.param(this.formToArray(semantic));
|
||||
};
|
||||
|
||||
/**
|
||||
* Serializes all field elements in the jQuery object into a query string.
|
||||
* This method will return a string in the format: name1=value1&name2=value2
|
||||
*/
|
||||
$.fn.fieldSerialize = function(successful) {
|
||||
var a = [];
|
||||
this.each(function() {
|
||||
var n = this.name;
|
||||
if (!n) {
|
||||
return;
|
||||
}
|
||||
var v = $.fieldValue(this, successful);
|
||||
if (v && v.constructor == Array) {
|
||||
for (var i=0,max=v.length; i < max; i++) {
|
||||
a.push({name: n, value: v[i]});
|
||||
}
|
||||
}
|
||||
else if (v !== null && typeof v != 'undefined') {
|
||||
a.push({name: this.name, value: v});
|
||||
}
|
||||
});
|
||||
//hand off to jQuery.param for proper encoding
|
||||
return $.param(a);
|
||||
};
|
||||
|
||||
/**
|
||||
* Returns the value(s) of the element in the matched set. For example, consider the following form:
|
||||
*
|
||||
* <form><fieldset>
|
||||
* <input name="A" type="text" />
|
||||
* <input name="A" type="text" />
|
||||
* <input name="B" type="checkbox" value="B1" />
|
||||
* <input name="B" type="checkbox" value="B2"/>
|
||||
* <input name="C" type="radio" value="C1" />
|
||||
* <input name="C" type="radio" value="C2" />
|
||||
* </fieldset></form>
|
||||
*
|
||||
* var v = $(':text').fieldValue();
|
||||
* // if no values are entered into the text inputs
|
||||
* v == ['','']
|
||||
* // if values entered into the text inputs are 'foo' and 'bar'
|
||||
* v == ['foo','bar']
|
||||
*
|
||||
* var v = $(':checkbox').fieldValue();
|
||||
* // if neither checkbox is checked
|
||||
* v === undefined
|
||||
* // if both checkboxes are checked
|
||||
* v == ['B1', 'B2']
|
||||
*
|
||||
* var v = $(':radio').fieldValue();
|
||||
* // if neither radio is checked
|
||||
* v === undefined
|
||||
* // if first radio is checked
|
||||
* v == ['C1']
|
||||
*
|
||||
* The successful argument controls whether or not the field element must be 'successful'
|
||||
* (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
|
||||
* The default value of the successful argument is true. If this value is false the value(s)
|
||||
* for each element is returned.
|
||||
*
|
||||
* Note: This method *always* returns an array. If no valid value can be determined the
|
||||
* array will be empty, otherwise it will contain one or more values.
|
||||
*/
|
||||
$.fn.fieldValue = function(successful) {
|
||||
for (var val=[], i=0, max=this.length; i < max; i++) {
|
||||
var el = this[i];
|
||||
var v = $.fieldValue(el, successful);
|
||||
if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length)) {
|
||||
continue;
|
||||
}
|
||||
v.constructor == Array ? $.merge(val, v) : val.push(v);
|
||||
}
|
||||
return val;
|
||||
};
|
||||
|
||||
/**
|
||||
* Returns the value of the field element.
|
||||
*/
|
||||
$.fieldValue = function(el, successful) {
|
||||
var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
|
||||
if (successful === undefined) {
|
||||
successful = true;
|
||||
}
|
||||
|
||||
if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||
|
||||
(t == 'checkbox' || t == 'radio') && !el.checked ||
|
||||
(t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
|
||||
tag == 'select' && el.selectedIndex == -1)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (tag == 'select') {
|
||||
var index = el.selectedIndex;
|
||||
if (index < 0) {
|
||||
return null;
|
||||
}
|
||||
var a = [], ops = el.options;
|
||||
var one = (t == 'select-one');
|
||||
var max = (one ? index+1 : ops.length);
|
||||
for(var i=(one ? index : 0); i < max; i++) {
|
||||
var op = ops[i];
|
||||
if (op.selected) {
|
||||
var v = op.value;
|
||||
if (!v) { // extra pain for IE...
|
||||
v = (op.attributes && op.attributes['value'] && !(op.attributes['value'].specified)) ? op.text : op.value;
|
||||
}
|
||||
if (one) {
|
||||
return v;
|
||||
}
|
||||
a.push(v);
|
||||
}
|
||||
}
|
||||
return a;
|
||||
}
|
||||
return $(el).val();
|
||||
};
|
||||
|
||||
/**
|
||||
* Clears the form data. Takes the following actions on the form's input fields:
|
||||
* - input text fields will have their 'value' property set to the empty string
|
||||
* - select elements will have their 'selectedIndex' property set to -1
|
||||
* - checkbox and radio inputs will have their 'checked' property set to false
|
||||
* - inputs of type submit, button, reset, and hidden will *not* be effected
|
||||
* - button elements will *not* be effected
|
||||
*/
|
||||
$.fn.clearForm = function(includeHidden) {
|
||||
return this.each(function() {
|
||||
$('input,select,textarea', this).clearFields(includeHidden);
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Clears the selected form elements.
|
||||
*/
|
||||
$.fn.clearFields = $.fn.clearInputs = function(includeHidden) {
|
||||
var re = /^(?:color|date|datetime|email|month|number|password|range|search|tel|text|time|url|week)$/i; // 'hidden' is not in this list
|
||||
return this.each(function() {
|
||||
var t = this.type, tag = this.tagName.toLowerCase();
|
||||
if (re.test(t) || tag == 'textarea' || (includeHidden && /hidden/.test(t)) ) {
|
||||
this.value = '';
|
||||
}
|
||||
else if (t == 'checkbox' || t == 'radio') {
|
||||
this.checked = false;
|
||||
}
|
||||
else if (tag == 'select') {
|
||||
this.selectedIndex = -1;
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Resets the form data. Causes all form elements to be reset to their original value.
|
||||
*/
|
||||
$.fn.resetForm = function() {
|
||||
return this.each(function() {
|
||||
// guard against an input with the name of 'reset'
|
||||
// note that IE reports the reset function as an 'object'
|
||||
if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType)) {
|
||||
this.reset();
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Enables or disables any matching elements.
|
||||
*/
|
||||
$.fn.enable = function(b) {
|
||||
if (b === undefined) {
|
||||
b = true;
|
||||
}
|
||||
return this.each(function() {
|
||||
this.disabled = !b;
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Checks/unchecks any matching checkboxes or radio buttons and
|
||||
* selects/deselects and matching option elements.
|
||||
*/
|
||||
$.fn.selected = function(select) {
|
||||
if (select === undefined) {
|
||||
select = true;
|
||||
}
|
||||
return this.each(function() {
|
||||
var t = this.type;
|
||||
if (t == 'checkbox' || t == 'radio') {
|
||||
this.checked = select;
|
||||
}
|
||||
else if (this.tagName.toLowerCase() == 'option') {
|
||||
var $sel = $(this).parent('select');
|
||||
if (select && $sel[0] && $sel[0].type == 'select-one') {
|
||||
// deselect all other options
|
||||
$sel.find('option').selected(false);
|
||||
}
|
||||
this.selected = select;
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
// expose debug var
|
||||
$.fn.ajaxSubmit.debug = false;
|
||||
|
||||
// helper fn for console logging
|
||||
function log() {
|
||||
if (!$.fn.ajaxSubmit.debug)
|
||||
return;
|
||||
var msg = '[jquery.form] ' + Array.prototype.join.call(arguments,'');
|
||||
if (window.console && window.console.log) {
|
||||
window.console.log(msg);
|
||||
}
|
||||
else if (window.opera && window.opera.postError) {
|
||||
window.opera.postError(msg);
|
||||
}
|
||||
};
|
||||
|
||||
})(jQuery);
|
||||
+2
-2
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* jQuery Masonry v2.1.05
|
||||
* jQuery Masonry v2.1.08
|
||||
* A dynamic layout plugin for jQuery
|
||||
* The flip-side of CSS Floats
|
||||
* http://masonry.desandro.com
|
||||
@@ -7,4 +7,4 @@
|
||||
* Licensed under the MIT license.
|
||||
* Copyright 2012 David DeSandro
|
||||
*/
|
||||
(function(a,b,c){"use strict";var d=b.event,e;d.special.smartresize={setup:function(){b(this).bind("resize",d.special.smartresize.handler)},teardown:function(){b(this).unbind("resize",d.special.smartresize.handler)},handler:function(a,c){var d=this,f=arguments;a.type="smartresize",e&&clearTimeout(e),e=setTimeout(function(){b.event.handle.apply(d,f)},c==="execAsap"?0:100)}},b.fn.smartresize=function(a){return a?this.bind("smartresize",a):this.trigger("smartresize",["execAsap"])},b.Mason=function(a,c){this.element=b(c),this._create(a),this._init()},b.Mason.settings={isResizable:!0,isAnimated:!1,animationOptions:{queue:!1,duration:500},gutterWidth:0,isRTL:!1,isFitWidth:!1,containerStyle:{position:"relative"}},b.Mason.prototype={_filterFindBricks:function(a){var b=this.options.itemSelector;return b?a.filter(b).add(a.find(b)):a},_getBricks:function(a){var b=this._filterFindBricks(a).css({position:"absolute"}).addClass("masonry-brick");return b},_create:function(c){this.options=b.extend(!0,{},b.Mason.settings,c),this.styleQueue=[];var d=this.element[0].style;this.originalStyle={height:d.height||""};var e=this.options.containerStyle;for(var f in e)this.originalStyle[f]=d[f]||"";this.element.css(e),this.horizontalDirection=this.options.isRTL?"right":"left",this.offset={x:parseInt(this.element.css("padding-"+this.horizontalDirection),10),y:parseInt(this.element.css("padding-top"),10)},this.isFluid=this.options.columnWidth&&typeof this.options.columnWidth=="function";var g=this;setTimeout(function(){g.element.addClass("masonry")},0),this.options.isResizable&&b(a).bind("smartresize.masonry",function(){g.resize()}),this.reloadItems()},_init:function(a){this._getColumns(),this._reLayout(a)},option:function(a,c){b.isPlainObject(a)&&(this.options=b.extend(!0,this.options,a))},layout:function(a,b){for(var c=0,d=a.length;c<d;c++)this._placeBrick(a[c]);var e={};e.height=Math.max.apply(Math,this.colYs);if(this.options.isFitWidth){var f=0;c=this.cols;while(--c){if(this.colYs[c]!==0)break;f++}e.width=(this.cols-f)*this.columnWidth-this.options.gutterWidth}this.styleQueue.push({$el:this.element,style:e});var g=this.isLaidOut?this.options.isAnimated?"animate":"css":"css",h=this.options.animationOptions,i;for(c=0,d=this.styleQueue.length;c<d;c++)i=this.styleQueue[c],i.$el[g](i.style,h);this.styleQueue=[],b&&b.call(a),this.isLaidOut=!0},_getColumns:function(){var a=this.options.isFitWidth?this.element.parent():this.element,b=a.width();this.columnWidth=this.isFluid?this.options.columnWidth(b):this.options.columnWidth||this.$bricks.outerWidth(!0)||b,this.columnWidth+=this.options.gutterWidth,this.cols=Math.floor((b+this.options.gutterWidth)/this.columnWidth),this.cols=Math.max(this.cols,1)},_placeBrick:function(a){var c=b(a),d,e,f,g,h;d=Math.ceil(c.outerWidth(!0)/this.columnWidth),d=Math.min(d,this.cols);if(d===1)f=this.colYs;else{e=this.cols+1-d,f=[];for(h=0;h<e;h++)g=this.colYs.slice(h,h+d),f[h]=Math.max.apply(Math,g)}var i=Math.min.apply(Math,f),j=0;for(var k=0,l=f.length;k<l;k++)if(f[k]===i){j=k;break}var m={top:i+this.offset.y};m[this.horizontalDirection]=this.columnWidth*j+this.offset.x,this.styleQueue.push({$el:c,style:m});var n=i+c.outerHeight(!0),o=this.cols+1-l;for(k=0;k<o;k++)this.colYs[j+k]=n},resize:function(){var a=this.cols;this._getColumns(),(this.isFluid||this.cols!==a)&&this._reLayout()},_reLayout:function(a){var b=this.cols;this.colYs=[];while(b--)this.colYs.push(0);this.layout(this.$bricks,a)},reloadItems:function(){this.$bricks=this._getBricks(this.element.children())},reload:function(a){this.reloadItems(),this._init(a)},appended:function(a,b,c){if(b){this._filterFindBricks(a).css({top:this.element.height()});var d=this;setTimeout(function(){d._appended(a,c)},1)}else this._appended(a,c)},_appended:function(a,b){var c=this._getBricks(a);this.$bricks=this.$bricks.add(c),this.layout(c,b)},remove:function(a){this.$bricks=this.$bricks.not(a),a.remove()},destroy:function(){this.$bricks.removeClass("masonry-brick").each(function(){this.style.position="",this.style.top="",this.style.left=""});var c=this.element[0].style;for(var d in this.originalStyle)c[d]=this.originalStyle[d];this.element.unbind(".masonry").removeClass("masonry").removeData("masonry"),b(a).unbind(".masonry")}},b.fn.imagesLoaded=function(a){function h(){a.call(c,d)}function i(a){var c=a.target;c.src!==f&&b.inArray(c,g)===-1&&(g.push(c),--e<=0&&(setTimeout(h),d.unbind(".imagesLoaded",i)))}var c=this,d=c.find("img").add(c.filter("img")),e=d.length,f="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==",g=[];return e||h(),d.bind("load.imagesLoaded error.imagesLoaded",i).each(function(){var a=this.src;this.src=f,this.src=a}),c};var f=function(b){a.console&&a.console.error(b)};b.fn.masonry=function(a){if(typeof a=="string"){var c=Array.prototype.slice.call(arguments,1);this.each(function(){var d=b.data(this,"masonry");if(!d){f("cannot call methods on masonry prior to initialization; attempted to call method '"+a+"'");return}if(!b.isFunctiLine truncated
|
||||
(function(e,t,n){"use strict";var r=t.event,i;r.special.smartresize={setup:function(){t(this).bind("resize",r.special.smartresize.handler)},teardown:function(){t(this).unbind("resize",r.special.smartresize.handler)},handler:function(e,t){var n=this,s=arguments;e.type="smartresize",i&&clearTimeout(i),i=setTimeout(function(){r.dispatch.apply(n,s)},t==="execAsap"?0:100)}},t.fn.smartresize=function(e){return e?this.bind("smartresize",e):this.trigger("smartresize",["execAsap"])},t.Mason=function(e,n){this.element=t(n),this._create(e),this._init()},t.Mason.settings={isResizable:!0,isAnimated:!1,animationOptions:{queue:!1,duration:500},gutterWidth:0,isRTL:!1,isFitWidth:!1,containerStyle:{position:"relative"}},t.Mason.prototype={_filterFindBricks:function(e){var t=this.options.itemSelector;return t?e.filter(t).add(e.find(t)):e},_getBricks:function(e){var t=this._filterFindBricks(e).css({position:"absolute"}).addClass("masonry-brick");return t},_create:function(n){this.options=t.extend(!0,{},t.Mason.settings,n),this.styleQueue=[];var r=this.element[0].style;this.originalStyle={height:r.height||""};var i=this.options.containerStyle;for(var s in i)this.originalStyle[s]=r[s]||"";this.element.css(i),this.horizontalDirection=this.options.isRTL?"right":"left";var o=this.element.css("padding-"+this.horizontalDirection),u=this.element.css("padding-top");this.offset={x:o?parseInt(o,10):0,y:u?parseInt(u,10):0},this.isFluid=this.options.columnWidth&&typeof this.options.columnWidth=="function";var a=this;setTimeout(function(){a.element.addClass("masonry")},0),this.options.isResizable&&t(e).bind("smartresize.masonry",function(){a.resize()}),this.reloadItems()},_init:function(e){this._getColumns(),this._reLayout(e)},option:function(e,n){t.isPlainObject(e)&&(this.options=t.extend(!0,this.options,e))},layout:function(e,t){for(var n=0,r=e.length;n<r;n++)this._placeBrick(e[n]);var i={};i.height=Math.max.apply(Math,this.colYs);if(this.options.isFitWidth){var s=0;n=this.cols;while(--n){if(this.colYs[n]!==0)break;s++}i.width=(this.cols-s)*this.columnWidth-this.options.gutterWidth}this.styleQueue.push({$el:this.element,style:i});var o=this.isLaidOut?this.options.isAnimated?"animate":"css":"css",u=this.options.animationOptions,a;for(n=0,r=this.styleQueue.length;n<r;n++)a=this.styleQueue[n],a.$el[o](a.style,u);this.styleQueue=[],t&&t.call(e),this.isLaidOut=!0},_getColumns:function(){var e=this.options.isFitWidth?this.element.parent():this.element,t=e.width();this.columnWidth=this.isFluid?this.options.columnWidth(t):this.options.columnWidth||this.$bricks.outerWidth(!0)||t,this.columnWidth+=this.options.gutterWidth,this.cols=Math.floor((t+this.options.gutterWidth)/this.columnWidth),this.cols=Math.max(this.cols,1)},_placeBrick:function(e){var n=t(e),r,i,s,o,u;r=Math.ceil(n.outerWidth(!0)/this.columnWidth),r=Math.min(r,this.cols);if(r===1)s=this.colYs;else{i=this.cols+1-r,s=[];for(u=0;u<i;u++)o=this.colYs.slice(u,u+r),s[u]=Math.max.apply(Math,o)}var a=Math.min.apply(Math,s),f=0;for(var l=0,c=s.length;l<c;l++)if(s[l]===a){f=l;break}var h={top:a+this.offset.y};h[this.horizontalDirection]=this.columnWidth*f+this.offset.x,this.styleQueue.push({$el:n,style:h});var p=a+n.outerHeight(!0),d=this.cols+1-c;for(l=0;l<d;l++)this.colYs[f+l]=p},resize:function(){var e=this.cols;this._getColumns(),(this.isFluid||this.cols!==e)&&this._reLayout()},_reLayout:function(e){var t=this.cols;this.colYs=[];while(t--)this.colYs.push(0);this.layout(this.$bricks,e)},reloadItems:function(){this.$bricks=this._getBricks(this.element.children())},reload:function(e){this.reloadItems(),this._init(e)},appended:function(e,t,n){if(t){this._filterFindBricks(e).css({top:this.element.height()});var r=this;setTimeout(function(){r._appended(e,n)},1)}else this._appended(e,n)},_appended:function(e,t){var n=this._getBricks(e);this.$bricks=this.$bricks.add(n),this.layout(n,t)},remove:function(e){this.$bricks=this.$bricks.not(e),e.remove()},destroy:function(){this.$bricks.removeClass("masonry-brick").each(function(){this.style.position="",this.style.top="",this.style.left=""});var n=this.element[0].style;for(var r in this.originalStyle)n[r]=this.originalStyle[r];this.element.unbind(".masonry").removeClass("masonry").removeData("masonry"),t(e).unbind(".masonry")}},t.fn.imagesLoaded=function(e){function u(){e.call(n,r)}function a(e){var n=e.target;n.src!==s&&t.inArray(n,o)===-1&&(o.push(n),--i<=0&&(setTimeout(u),r.unbind(".imagesLoaded",a)))}var n=this,r=n.find("img").add(n.filter("img")),i=r.length,s="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==",o=[];return i||u(),r.bind("load.imagesLoaded error.imagesLoaded",a).each(function(){var e=this.src;this.src=s,this.src=e}),n};var s=function(t){e.console&&e.console.error(t)};t.fn.masonry=function(e){if(typeof e=="string"){var n=Array.prototype.slice.call(arguments,1);this.each(function(){var r=t.data(this,"masonry");if(!r){s("cannot call methods on masonry prior to initialization; attempted to call method '"+e+"'");returLine truncated
|
||||
Executable → Regular
+149
-89
@@ -1,30 +1,39 @@
|
||||
/*
|
||||
* jQuery UI Nested Sortable
|
||||
* v 1.3.4 / 28 apr 2011
|
||||
* http://mjsarfatti.com/sandbox/nestedSortable
|
||||
* v 1.3.5 / 21 jun 2012
|
||||
* http://mjsarfatti.com/code/nestedSortable
|
||||
*
|
||||
* Depends:
|
||||
* Depends on:
|
||||
* jquery.ui.sortable.js 1.8+
|
||||
*
|
||||
* License CC BY-SA 3.0
|
||||
* Copyright 2010-2011, Manuele J Sarfatti
|
||||
* Copyright (c) 2010-2012 Manuele J Sarfatti
|
||||
* Licensed under the MIT License
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
*/
|
||||
|
||||
(function($) {
|
||||
|
||||
$.widget("ui.nestedSortable", $.extend({}, $.ui.sortable.prototype, {
|
||||
$.widget("mjs.nestedSortable", $.extend({}, $.ui.sortable.prototype, {
|
||||
|
||||
options: {
|
||||
tabSize: 20,
|
||||
disableNesting: 'ui-nestedSortable-no-nesting',
|
||||
errorClass: 'ui-nestedSortable-error',
|
||||
disableNesting: 'mjs-nestedSortable-no-nesting',
|
||||
errorClass: 'mjs-nestedSortable-error',
|
||||
doNotClear: false,
|
||||
listType: 'ol',
|
||||
maxLevels: 0,
|
||||
revertOnError: 1
|
||||
protectRoot: false,
|
||||
rootID: null,
|
||||
rtl: false,
|
||||
isAllowed: function(item, parent) { return true; }
|
||||
},
|
||||
|
||||
_create: function() {
|
||||
this.element.data('sortable', this.element.data('nestedSortable'));
|
||||
|
||||
if (!this.element.is(this.options.listType))
|
||||
throw new Error('nestedSortable: Please check the listType option is set to your actual list type');
|
||||
|
||||
return $.ui.sortable.prototype._create.apply(this, arguments);
|
||||
},
|
||||
|
||||
@@ -45,9 +54,11 @@
|
||||
this.lastPositionAbs = this.positionAbs;
|
||||
}
|
||||
|
||||
var o = this.options;
|
||||
|
||||
//Do scrolling
|
||||
if(this.options.scroll) {
|
||||
var o = this.options, scrolled = false;
|
||||
var scrolled = false;
|
||||
if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML') {
|
||||
|
||||
if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
|
||||
@@ -81,6 +92,9 @@
|
||||
//Regenerate the absolute position used for position checks
|
||||
this.positionAbs = this._convertPositionTo("absolute");
|
||||
|
||||
// Find the top offset before rearrangement,
|
||||
var previousTopOffset = this.placeholder.offset().top;
|
||||
|
||||
//Set the helper position
|
||||
if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
|
||||
if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';
|
||||
@@ -118,16 +132,17 @@
|
||||
}
|
||||
}
|
||||
|
||||
var parentItem = (this.placeholder[0].parentNode.parentNode
|
||||
&& $(this.placeholder[0].parentNode.parentNode).closest('.ui-sortable').length)
|
||||
? $(this.placeholder[0].parentNode.parentNode)
|
||||
: null,
|
||||
var parentItem = (this.placeholder[0].parentNode.parentNode &&
|
||||
$(this.placeholder[0].parentNode.parentNode).closest('.ui-sortable').length)
|
||||
? $(this.placeholder[0].parentNode.parentNode)
|
||||
: null,
|
||||
level = this._getLevel(this.placeholder),
|
||||
childLevels = this._getChildLevels(this.helper),
|
||||
previousItem = this.placeholder[0].previousSibling ? $(this.placeholder[0].previousSibling) : null;
|
||||
childLevels = this._getChildLevels(this.helper);
|
||||
|
||||
// To find the previous sibling in the list, keep backtracking until we hit a valid list item.
|
||||
var previousItem = this.placeholder[0].previousSibling ? $(this.placeholder[0].previousSibling) : null;
|
||||
if (previousItem != null) {
|
||||
while (previousItem[0].nodeName.toLowerCase() != 'li' || previousItem[0] == this.currentItem[0]) {
|
||||
while (previousItem[0].nodeName.toLowerCase() != 'li' || previousItem[0] == this.currentItem[0] || previousItem[0] == this.helper[0]) {
|
||||
if (previousItem[0].previousSibling) {
|
||||
previousItem = $(previousItem[0].previousSibling);
|
||||
} else {
|
||||
@@ -137,27 +152,51 @@
|
||||
}
|
||||
}
|
||||
|
||||
newList = document.createElement(o.listType);
|
||||
// To find the next sibling in the list, keep stepping forward until we hit a valid list item.
|
||||
var nextItem = this.placeholder[0].nextSibling ? $(this.placeholder[0].nextSibling) : null;
|
||||
if (nextItem != null) {
|
||||
while (nextItem[0].nodeName.toLowerCase() != 'li' || nextItem[0] == this.currentItem[0] || nextItem[0] == this.helper[0]) {
|
||||
if (nextItem[0].nextSibling) {
|
||||
nextItem = $(nextItem[0].nextSibling);
|
||||
} else {
|
||||
nextItem = null;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var newList = document.createElement(o.listType);
|
||||
|
||||
this.beyondMaxLevels = 0;
|
||||
|
||||
// If the item is moved to the left, send it to its parent level
|
||||
if (parentItem != null && this.positionAbs.left < parentItem.offset().left) {
|
||||
|
||||
// If the item is moved to the left, send it to its parent's level unless there are siblings below it.
|
||||
if (parentItem != null && nextItem == null &&
|
||||
(o.rtl && (this.positionAbs.left + this.helper.outerWidth() > parentItem.offset().left + parentItem.outerWidth()) ||
|
||||
!o.rtl && (this.positionAbs.left < parentItem.offset().left))) {
|
||||
parentItem.after(this.placeholder[0]);
|
||||
this._clearEmpty(parentItem[0]);
|
||||
this._trigger("change", event, this._uiHash());
|
||||
}
|
||||
// If the item is below another one and is moved to the right, make it a children of it
|
||||
else if (previousItem != null && this.positionAbs.left > previousItem.offset().left + o.tabSize) {
|
||||
this._isAllowed(previousItem, level+childLevels+1);
|
||||
// If the item is below a sibling and is moved to the right, make it a child of that sibling.
|
||||
else if (previousItem != null &&
|
||||
(o.rtl && (this.positionAbs.left + this.helper.outerWidth() < previousItem.offset().left + previousItem.outerWidth() - o.tabSize) ||
|
||||
!o.rtl && (this.positionAbs.left > previousItem.offset().left + o.tabSize))) {
|
||||
this._isAllowed(previousItem, level, level+childLevels+1);
|
||||
if (!previousItem.children(o.listType).length) {
|
||||
previousItem[0].appendChild(newList);
|
||||
}
|
||||
previousItem.children(o.listType)[0].appendChild(this.placeholder[0]);
|
||||
// If this item is being moved from the top, add it to the top of the list.
|
||||
if (previousTopOffset && (previousTopOffset <= previousItem.offset().top)) {
|
||||
previousItem.children(o.listType).prepend(this.placeholder);
|
||||
}
|
||||
// Otherwise, add it to the bottom of the list.
|
||||
else {
|
||||
previousItem.children(o.listType)[0].appendChild(this.placeholder[0]);
|
||||
}
|
||||
this._trigger("change", event, this._uiHash());
|
||||
}
|
||||
else {
|
||||
this._isAllowed(parentItem, level+childLevels);
|
||||
this._isAllowed(parentItem, level, level+childLevels);
|
||||
}
|
||||
|
||||
//Post events to containers
|
||||
@@ -181,24 +220,14 @@
|
||||
|
||||
this.placeholder.removeClass(this.options.errorClass);
|
||||
|
||||
if (this.options.revertOnError) {
|
||||
if (this.domPosition.prev) {
|
||||
$(this.domPosition.prev).after(this.placeholder);
|
||||
} else {
|
||||
$(this.domPosition.parent).prepend(this.placeholder);
|
||||
}
|
||||
this._trigger("revert", event, this._uiHash());
|
||||
if (this.domPosition.prev) {
|
||||
$(this.domPosition.prev).after(this.placeholder);
|
||||
} else {
|
||||
var parent = this.placeholder.parent().closest(this.options.items);
|
||||
|
||||
for (var i = this.beyondMaxLevels - 1; i > 0; i--) {
|
||||
parent = parent.parent().closest(this.options.items);
|
||||
}
|
||||
|
||||
parent.after(this.placeholder);
|
||||
this._trigger("change", event, this._uiHash());
|
||||
$(this.domPosition.parent).prepend(this.placeholder);
|
||||
}
|
||||
|
||||
this._trigger("revert", event, this._uiHash());
|
||||
|
||||
}
|
||||
|
||||
// Clean last empty ul/ol
|
||||
@@ -209,25 +238,48 @@
|
||||
|
||||
$.ui.sortable.prototype._mouseStop.apply(this, arguments);
|
||||
|
||||
|
||||
// for Orbit ----> Check the number of pages in each page
|
||||
if($('#items').length) {
|
||||
var $sortable = $('.sortable'),
|
||||
$host = $sortable.children('.navbar').eq(0),
|
||||
$navbar = $('.sortable li').children('.navbar'),
|
||||
$quantity = $sortable.find('li').length;
|
||||
$host.find('.badge').text($quantity);
|
||||
$navbar.each(function(i) {
|
||||
if($navbar.eq(i).next('ol').length>0) {
|
||||
var $amount = $navbar.eq(i).next('ol').find('li').length;
|
||||
$navbar.eq(i).find('.badge').text($amount);
|
||||
}else{
|
||||
$navbar.eq(i).find('.badge').text('0');
|
||||
}
|
||||
if($navbar.eq(i).next('ol').length==1 && $navbar.eq(i).next('ol').children('li').length==0){
|
||||
$navbar.eq(i).next('ol').remove();
|
||||
}
|
||||
$navbar.eq(i).find('.badge').text()>0 ? $navbar.eq(i).find('.badge').addClass('badge-info'):$navbar.eq(i).find('.badge').removeClass('badge-info');
|
||||
});
|
||||
}
|
||||
//
|
||||
},
|
||||
|
||||
serialize: function(o) {
|
||||
serialize: function(options) {
|
||||
|
||||
var items = this._getItemsAsjQuery(o && o.connected),
|
||||
str = []; o = o || {};
|
||||
var o = $.extend({}, this.options, options),
|
||||
items = this._getItemsAsjQuery(o && o.connected),
|
||||
str = [];
|
||||
|
||||
$(items).each(function() {
|
||||
var res = ($(o.item || this).attr(o.attribute || 'id') || '')
|
||||
.match(o.expression || (/(.+)[-=_](.+)/)),
|
||||
pid = ($(o.item || this).parent(o.listType)
|
||||
.parent('li')
|
||||
.parent(o.items)
|
||||
.attr(o.attribute || 'id') || '')
|
||||
.match(o.expression || (/(.+)[-=_](.+)/));
|
||||
|
||||
if (res) {
|
||||
str.push(((o.key || res[1]) + '[' + (o.key && o.expression ? res[1] : res[2]) + ']')
|
||||
+ '='
|
||||
+ (pid ? (o.key && o.expression ? pid[1] : pid[2]) : 'root'));
|
||||
+ (pid ? (o.key && o.expression ? pid[1] : pid[2]) : o.rootID));
|
||||
}
|
||||
});
|
||||
|
||||
@@ -239,51 +291,51 @@
|
||||
|
||||
},
|
||||
|
||||
toHierarchy: function(o) {
|
||||
toHierarchy: function(options) {
|
||||
|
||||
o = o || {};
|
||||
var sDepth = o.startDepthCount || 0,
|
||||
var o = $.extend({}, this.options, options),
|
||||
sDepth = o.startDepthCount || 0,
|
||||
ret = [];
|
||||
|
||||
$(this.element).children('li').each(function () {
|
||||
var level = _recursiveItems($(this));
|
||||
$(this.element).children(o.items).each(function () {
|
||||
var level = _recursiveItems(this);
|
||||
ret.push(level);
|
||||
});
|
||||
|
||||
return ret;
|
||||
|
||||
function _recursiveItems(li) {
|
||||
var id = ($(li).attr(o.attribute || 'id') || '').match(o.expression || (/(.+)[-=_](.+)/));
|
||||
function _recursiveItems(item) {
|
||||
var id = ($(item).attr(o.attribute || 'id') || '').match(o.expression || (/(.+)[-=_](.+)/));
|
||||
if (id) {
|
||||
var item = {"id" : id[2]};
|
||||
if ($(li).children(o.listType).children('li').length > 0) {
|
||||
item.children = [];
|
||||
$(li).children(o.listType).children('li').each(function() {
|
||||
var level = _recursiveItems($(this));
|
||||
item.children.push(level);
|
||||
var currentItem = {"id" : id[2]};
|
||||
if ($(item).children(o.listType).children(o.items).length > 0) {
|
||||
currentItem.children = [];
|
||||
$(item).children(o.listType).children(o.items).each(function() {
|
||||
var level = _recursiveItems(this);
|
||||
currentItem.children.push(level);
|
||||
});
|
||||
}
|
||||
return item;
|
||||
return currentItem;
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
toArray: function(o) {
|
||||
toArray: function(options) {
|
||||
|
||||
o = o || {};
|
||||
var sDepth = o.startDepthCount || 0,
|
||||
var o = $.extend({}, this.options, options),
|
||||
sDepth = o.startDepthCount || 0,
|
||||
ret = [],
|
||||
left = 2;
|
||||
|
||||
ret.push({
|
||||
"item_id": 'root',
|
||||
"item_id": o.rootID,
|
||||
"parent_id": 'none',
|
||||
"depth": sDepth,
|
||||
"left": '1',
|
||||
"right": ($('li', this.element).length + 1) * 2
|
||||
"right": ($(o.items, this.element).length + 1) * 2
|
||||
});
|
||||
|
||||
$(this.element).children('li').each(function () {
|
||||
$(this.element).children(o.items).each(function () {
|
||||
left = _recursiveArray(this, sDepth + 1, left);
|
||||
});
|
||||
|
||||
@@ -297,9 +349,9 @@
|
||||
id,
|
||||
pid;
|
||||
|
||||
if ($(item).children(o.listType).children('li').length > 0) {
|
||||
if ($(item).children(o.listType).children(o.items).length > 0) {
|
||||
depth ++;
|
||||
$(item).children(o.listType).children('li').each(function () {
|
||||
$(item).children(o.listType).children(o.items).each(function () {
|
||||
right = _recursiveArray($(this), depth, right);
|
||||
});
|
||||
depth --;
|
||||
@@ -308,12 +360,12 @@
|
||||
id = ($(item).attr(o.attribute || 'id')).match(o.expression || (/(.+)[-=_](.+)/));
|
||||
|
||||
if (depth === sDepth + 1) {
|
||||
pid = 'root';
|
||||
pid = o.rootID;
|
||||
} else {
|
||||
var parentItem = ($(item).parent(o.listType)
|
||||
.parent('li')
|
||||
.attr(o.attribute || 'id'))
|
||||
.match(o.expression || (/(.+)[-=_](.+)/));
|
||||
.parent(o.items)
|
||||
.attr(o.attribute || 'id'))
|
||||
.match(o.expression || (/(.+)[-=_](.+)/));
|
||||
pid = parentItem[2];
|
||||
}
|
||||
|
||||
@@ -330,7 +382,7 @@
|
||||
_clearEmpty: function(item) {
|
||||
|
||||
var emptyList = $(item).children(this.options.listType);
|
||||
if (emptyList.length && !emptyList.children().length) {
|
||||
if (emptyList.length && !emptyList.children().length && !this.options.doNotClear) {
|
||||
emptyList.remove();
|
||||
}
|
||||
|
||||
@@ -342,7 +394,8 @@
|
||||
|
||||
if (this.options.listType) {
|
||||
var list = item.closest(this.options.listType);
|
||||
while (!list.is('.ui-sortable')) {
|
||||
while (list && list.length > 0 &&
|
||||
!list.is('.ui-sortable')) {
|
||||
level++;
|
||||
list = list.parent().closest(this.options.listType);
|
||||
}
|
||||
@@ -364,28 +417,35 @@
|
||||
return depth ? result + 1 : result;
|
||||
},
|
||||
|
||||
_isAllowed: function(parentItem, levels) {
|
||||
var o = this.options;
|
||||
// Are we trying to nest under a no-nest or are we nesting too deep?
|
||||
if (parentItem == null || !(parentItem.hasClass(o.disableNesting))) {
|
||||
if (o.maxLevels < levels && o.maxLevels != 0) {
|
||||
_isAllowed: function(parentItem, level, levels) {
|
||||
var o = this.options,
|
||||
isRoot = $(this.domPosition.parent).hasClass('ui-sortable') ? true : false,
|
||||
maxLevels = this.placeholder.closest('.ui-sortable').nestedSortable('option', 'maxLevels'); // this takes into account the maxLevels set to the recipient list
|
||||
|
||||
// Is the root protected?
|
||||
// Are we trying to nest under a no-nest?
|
||||
// Are we nesting too deep?
|
||||
if (!o.isAllowed(this.currentItem, parentItem) ||
|
||||
parentItem && parentItem.hasClass(o.disableNesting) ||
|
||||
o.protectRoot && (parentItem == null && !isRoot || isRoot && level > 1)) {
|
||||
this.placeholder.addClass(o.errorClass);
|
||||
this.beyondMaxLevels = levels - o.maxLevels;
|
||||
if (maxLevels < levels && maxLevels != 0) {
|
||||
this.beyondMaxLevels = levels - maxLevels;
|
||||
} else {
|
||||
this.beyondMaxLevels = 1;
|
||||
}
|
||||
} else {
|
||||
if (maxLevels < levels && maxLevels != 0) {
|
||||
this.placeholder.addClass(o.errorClass);
|
||||
this.beyondMaxLevels = levels - maxLevels;
|
||||
} else {
|
||||
this.placeholder.removeClass(o.errorClass);
|
||||
this.beyondMaxLevels = 0;
|
||||
}
|
||||
} else {
|
||||
this.placeholder.addClass(o.errorClass);
|
||||
if (o.maxLevels < levels && o.maxLevels != 0) {
|
||||
this.beyondMaxLevels = levels - o.maxLevels;
|
||||
} else {
|
||||
this.beyondMaxLevels = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}));
|
||||
|
||||
$.ui.nestedSortable.prototype.options = $.extend({}, $.ui.sortable.prototype.options, $.ui.nestedSortable.prototype.options);
|
||||
})(jQuery);
|
||||
$.mjs.nestedSortable.prototype.options = $.extend({}, $.ui.sortable.prototype.options, $.mjs.nestedSortable.prototype.options);
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,752 @@
|
||||
/*! nanoScrollerJS - v0.7.2
|
||||
* http://jamesflorentino.github.com/nanoScrollerJS/
|
||||
* Copyright (c) 2013 James Florentino; Licensed MIT */
|
||||
|
||||
|
||||
(function($, window, document) {
|
||||
"use strict";
|
||||
|
||||
var BROWSER_IS_IE7, BROWSER_SCROLLBAR_WIDTH, DOMSCROLL, DOWN, DRAG, KEYDOWN, KEYUP, MOUSEDOWN, MOUSEMOVE, MOUSEUP, MOUSEWHEEL, NanoScroll, PANEDOWN, RESIZE, SCROLL, SCROLLBAR, TOUCHMOVE, UP, WHEEL, defaults, getBrowserScrollbarWidth;
|
||||
defaults = {
|
||||
/**
|
||||
a classname for the pane element.
|
||||
@property paneClass
|
||||
@type String
|
||||
@default 'pane'
|
||||
*/
|
||||
|
||||
paneClass: 'pane',
|
||||
/**
|
||||
a classname for the slider element.
|
||||
@property sliderClass
|
||||
@type String
|
||||
@default 'slider'
|
||||
*/
|
||||
|
||||
sliderClass: 'slider',
|
||||
/**
|
||||
a classname for the content element.
|
||||
@property contentClass
|
||||
@type String
|
||||
@default 'content'
|
||||
*/
|
||||
|
||||
contentClass: 'content',
|
||||
/**
|
||||
a setting to enable native scrolling in iOS devices.
|
||||
@property iOSNativeScrolling
|
||||
@type Boolean
|
||||
@default false
|
||||
*/
|
||||
|
||||
iOSNativeScrolling: false,
|
||||
/**
|
||||
a setting to prevent the rest of the page being
|
||||
scrolled when user scrolls the `.content` element.
|
||||
@property preventPageScrolling
|
||||
@type Boolean
|
||||
@default false
|
||||
*/
|
||||
|
||||
preventPageScrolling: false,
|
||||
/**
|
||||
a setting to disable binding to the resize event.
|
||||
@property disableResize
|
||||
@type Boolean
|
||||
@default false
|
||||
*/
|
||||
|
||||
disableResize: false,
|
||||
/**
|
||||
a setting to make the scrollbar always visible.
|
||||
@property alwaysVisible
|
||||
@type Boolean
|
||||
@default false
|
||||
*/
|
||||
|
||||
alwaysVisible: false,
|
||||
/**
|
||||
a default timeout for the `flash()` method.
|
||||
@property flashDelay
|
||||
@type Number
|
||||
@default 1500
|
||||
*/
|
||||
|
||||
flashDelay: 1500,
|
||||
/**
|
||||
a minimum height for the `.slider` element.
|
||||
@property sliderMinHeight
|
||||
@type Number
|
||||
@default 20
|
||||
*/
|
||||
|
||||
sliderMinHeight: 20,
|
||||
/**
|
||||
a maximum height for the `.slider` element.
|
||||
@property sliderMaxHeight
|
||||
@type Number
|
||||
@default null
|
||||
*/
|
||||
|
||||
sliderMaxHeight: null
|
||||
};
|
||||
/**
|
||||
@property SCROLLBAR
|
||||
@type String
|
||||
@static
|
||||
@final
|
||||
@private
|
||||
*/
|
||||
|
||||
SCROLLBAR = 'scrollbar';
|
||||
/**
|
||||
@property SCROLL
|
||||
@type String
|
||||
@static
|
||||
@final
|
||||
@private
|
||||
*/
|
||||
|
||||
SCROLL = 'scroll';
|
||||
/**
|
||||
@property MOUSEDOWN
|
||||
@type String
|
||||
@final
|
||||
@private
|
||||
*/
|
||||
|
||||
MOUSEDOWN = 'mousedown';
|
||||
/**
|
||||
@property MOUSEMOVE
|
||||
@type String
|
||||
@static
|
||||
@final
|
||||
@private
|
||||
*/
|
||||
|
||||
MOUSEMOVE = 'mousemove';
|
||||
/**
|
||||
@property MOUSEWHEEL
|
||||
@type String
|
||||
@final
|
||||
@private
|
||||
*/
|
||||
|
||||
MOUSEWHEEL = 'mousewheel';
|
||||
/**
|
||||
@property MOUSEUP
|
||||
@type String
|
||||
@static
|
||||
@final
|
||||
@private
|
||||
*/
|
||||
|
||||
MOUSEUP = 'mouseup';
|
||||
/**
|
||||
@property RESIZE
|
||||
@type String
|
||||
@final
|
||||
@private
|
||||
*/
|
||||
|
||||
RESIZE = 'resize';
|
||||
/**
|
||||
@property DRAG
|
||||
@type String
|
||||
@static
|
||||
@final
|
||||
@private
|
||||
*/
|
||||
|
||||
DRAG = 'drag';
|
||||
/**
|
||||
@property UP
|
||||
@type String
|
||||
@static
|
||||
@final
|
||||
@private
|
||||
*/
|
||||
|
||||
UP = 'up';
|
||||
/**
|
||||
@property PANEDOWN
|
||||
@type String
|
||||
@static
|
||||
@final
|
||||
@private
|
||||
*/
|
||||
|
||||
PANEDOWN = 'panedown';
|
||||
/**
|
||||
@property DOMSCROLL
|
||||
@type String
|
||||
@static
|
||||
@final
|
||||
@private
|
||||
*/
|
||||
|
||||
DOMSCROLL = 'DOMMouseScroll';
|
||||
/**
|
||||
@property DOWN
|
||||
@type String
|
||||
@static
|
||||
@final
|
||||
@private
|
||||
*/
|
||||
|
||||
DOWN = 'down';
|
||||
/**
|
||||
@property WHEEL
|
||||
@type String
|
||||
@static
|
||||
@final
|
||||
@private
|
||||
*/
|
||||
|
||||
WHEEL = 'wheel';
|
||||
/**
|
||||
@property KEYDOWN
|
||||
@type String
|
||||
@static
|
||||
@final
|
||||
@private
|
||||
*/
|
||||
|
||||
KEYDOWN = 'keydown';
|
||||
/**
|
||||
@property KEYUP
|
||||
@type String
|
||||
@static
|
||||
@final
|
||||
@private
|
||||
*/
|
||||
|
||||
KEYUP = 'keyup';
|
||||
/**
|
||||
@property TOUCHMOVE
|
||||
@type String
|
||||
@static
|
||||
@final
|
||||
@private
|
||||
*/
|
||||
|
||||
TOUCHMOVE = 'touchmove';
|
||||
/**
|
||||
@property BROWSER_IS_IE7
|
||||
@type Boolean
|
||||
@static
|
||||
@final
|
||||
@private
|
||||
*/
|
||||
|
||||
BROWSER_IS_IE7 = window.navigator.appName === 'Microsoft Internet Explorer' && /msie 7./i.test(window.navigator.appVersion) && window.ActiveXObject;
|
||||
/**
|
||||
@property BROWSER_SCROLLBAR_WIDTH
|
||||
@type Number
|
||||
@static
|
||||
@default null
|
||||
@private
|
||||
*/
|
||||
|
||||
BROWSER_SCROLLBAR_WIDTH = null;
|
||||
/**
|
||||
Returns browser's native scrollbar width
|
||||
@method getBrowserScrollbarWidth
|
||||
@return {Number} the scrollbar width in pixels
|
||||
@static
|
||||
@private
|
||||
*/
|
||||
|
||||
getBrowserScrollbarWidth = function() {
|
||||
var outer, outerStyle, scrollbarWidth;
|
||||
outer = document.createElement('div');
|
||||
outerStyle = outer.style;
|
||||
outerStyle.position = 'absolute';
|
||||
outerStyle.width = '100px';
|
||||
outerStyle.height = '100px';
|
||||
outerStyle.overflow = SCROLL;
|
||||
outerStyle.top = '-9999px';
|
||||
document.body.appendChild(outer);
|
||||
scrollbarWidth = outer.offsetWidth - outer.clientWidth;
|
||||
document.body.removeChild(outer);
|
||||
return scrollbarWidth;
|
||||
};
|
||||
/**
|
||||
@class NanoScroll
|
||||
@param element {HTMLElement|Node} the main element
|
||||
@param options {Object} nanoScroller's options
|
||||
@constructor
|
||||
*/
|
||||
|
||||
NanoScroll = (function() {
|
||||
|
||||
function NanoScroll(el, options) {
|
||||
this.el = el;
|
||||
this.options = options;
|
||||
BROWSER_SCROLLBAR_WIDTH || (BROWSER_SCROLLBAR_WIDTH = getBrowserScrollbarWidth());
|
||||
this.$el = $(this.el);
|
||||
this.doc = $(document);
|
||||
this.win = $(window);
|
||||
this.$content = this.$el.children("." + options.contentClass);
|
||||
this.$content.attr('tabindex', 0);
|
||||
this.content = this.$content[0];
|
||||
if (this.options.iOSNativeScrolling && (this.el.style.WebkitOverflowScrolling != null)) {
|
||||
this.nativeScrolling();
|
||||
} else {
|
||||
this.generate();
|
||||
}
|
||||
this.createEvents();
|
||||
this.addEvents();
|
||||
this.reset();
|
||||
}
|
||||
|
||||
/**
|
||||
Prevents the rest of the page being scrolled
|
||||
when user scrolls the `.content` element.
|
||||
@method preventScrolling
|
||||
@param event {Event}
|
||||
@param direction {String} Scroll direction (up or down)
|
||||
@private
|
||||
*/
|
||||
|
||||
|
||||
NanoScroll.prototype.preventScrolling = function(e, direction) {
|
||||
if (!this.isActive) {
|
||||
return;
|
||||
}
|
||||
if (e.type === DOMSCROLL) {
|
||||
if (direction === DOWN && e.originalEvent.detail > 0 || direction === UP && e.originalEvent.detail < 0) {
|
||||
e.preventDefault();
|
||||
}
|
||||
} else if (e.type === MOUSEWHEEL) {
|
||||
if (!e.originalEvent || !e.originalEvent.wheelDelta) {
|
||||
return;
|
||||
}
|
||||
if (direction === DOWN && e.originalEvent.wheelDelta < 0 || direction === UP && e.originalEvent.wheelDelta > 0) {
|
||||
e.preventDefault();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
Enable iOS native scrolling
|
||||
*/
|
||||
|
||||
|
||||
NanoScroll.prototype.nativeScrolling = function() {
|
||||
this.$content.css({
|
||||
WebkitOverflowScrolling: 'touch'
|
||||
});
|
||||
this.iOSNativeScrolling = true;
|
||||
this.isActive = true;
|
||||
};
|
||||
|
||||
/**
|
||||
Updates those nanoScroller properties that
|
||||
are related to current scrollbar position.
|
||||
@method updateScrollValues
|
||||
@private
|
||||
*/
|
||||
|
||||
|
||||
NanoScroll.prototype.updateScrollValues = function() {
|
||||
var content;
|
||||
content = this.content;
|
||||
this.maxScrollTop = content.scrollHeight - content.clientHeight;
|
||||
this.contentScrollTop = content.scrollTop;
|
||||
if (!this.iOSNativeScrolling) {
|
||||
this.maxSliderTop = this.paneHeight - this.sliderHeight;
|
||||
this.sliderTop = this.contentScrollTop * this.maxSliderTop / this.maxScrollTop;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
Creates event related methods
|
||||
@method createEvents
|
||||
@private
|
||||
*/
|
||||
|
||||
|
||||
NanoScroll.prototype.createEvents = function() {
|
||||
var _this = this;
|
||||
this.events = {
|
||||
down: function(e) {
|
||||
_this.isBeingDragged = true;
|
||||
_this.offsetY = e.pageY - _this.slider.offset().top;
|
||||
_this.pane.addClass('active');
|
||||
_this.doc.bind(MOUSEMOVE, _this.events[DRAG]).bind(MOUSEUP, _this.events[UP]);
|
||||
return false;
|
||||
},
|
||||
drag: function(e) {
|
||||
_this.sliderY = e.pageY - _this.$el.offset().top - _this.offsetY;
|
||||
_this.scroll();
|
||||
_this.updateScrollValues();
|
||||
if (_this.contentScrollTop >= _this.maxScrollTop) {
|
||||
_this.$el.trigger('scrollend');
|
||||
} else if (_this.contentScrollTop === 0) {
|
||||
_this.$el.trigger('scrolltop');
|
||||
}
|
||||
return false;
|
||||
},
|
||||
up: function(e) {
|
||||
_this.isBeingDragged = false;
|
||||
_this.pane.removeClass('active');
|
||||
_this.doc.unbind(MOUSEMOVE, _this.events[DRAG]).unbind(MOUSEUP, _this.events[UP]);
|
||||
return false;
|
||||
},
|
||||
resize: function(e) {
|
||||
_this.reset();
|
||||
},
|
||||
panedown: function(e) {
|
||||
_this.sliderY = (e.offsetY || e.originalEvent.layerY) - (_this.sliderHeight * 0.5);
|
||||
_this.scroll();
|
||||
_this.events.down(e);
|
||||
return false;
|
||||
},
|
||||
scroll: function(e) {
|
||||
if (_this.isBeingDragged) {
|
||||
return;
|
||||
}
|
||||
_this.updateScrollValues();
|
||||
if (!_this.iOSNativeScrolling) {
|
||||
_this.sliderY = _this.sliderTop;
|
||||
_this.slider.css({
|
||||
top: _this.sliderTop
|
||||
});
|
||||
}
|
||||
if (e == null) {
|
||||
return;
|
||||
}
|
||||
if (_this.contentScrollTop >= _this.maxScrollTop) {
|
||||
if (_this.options.preventPageScrolling) {
|
||||
_this.preventScrolling(e, DOWN);
|
||||
}
|
||||
_this.$el.trigger('scrollend');
|
||||
} else if (_this.contentScrollTop === 0) {
|
||||
if (_this.options.preventPageScrolling) {
|
||||
_this.preventScrolling(e, UP);
|
||||
}
|
||||
_this.$el.trigger('scrolltop');
|
||||
}
|
||||
},
|
||||
wheel: function(e) {
|
||||
if (e == null) {
|
||||
return;
|
||||
}
|
||||
_this.sliderY += -e.wheelDeltaY || -e.delta;
|
||||
_this.scroll();
|
||||
return false;
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
Adds event listeners with jQuery.
|
||||
@method addEvents
|
||||
@private
|
||||
*/
|
||||
|
||||
|
||||
NanoScroll.prototype.addEvents = function() {
|
||||
var events;
|
||||
this.removeEvents();
|
||||
events = this.events;
|
||||
if (!this.options.disableResize) {
|
||||
this.win.bind(RESIZE, events[RESIZE]);
|
||||
}
|
||||
if (!this.iOSNativeScrolling) {
|
||||
this.slider.bind(MOUSEDOWN, events[DOWN]);
|
||||
this.pane.bind(MOUSEDOWN, events[PANEDOWN]).bind("" + MOUSEWHEEL + " " + DOMSCROLL, events[WHEEL]);
|
||||
}
|
||||
this.$content.bind("" + SCROLL + " " + MOUSEWHEEL + " " + DOMSCROLL + " " + TOUCHMOVE, events[SCROLL]);
|
||||
};
|
||||
|
||||
/**
|
||||
Removes event listeners with jQuery.
|
||||
@method removeEvents
|
||||
@private
|
||||
*/
|
||||
|
||||
|
||||
NanoScroll.prototype.removeEvents = function() {
|
||||
var events;
|
||||
events = this.events;
|
||||
this.win.unbind(RESIZE, events[RESIZE]);
|
||||
if (!this.iOSNativeScrolling) {
|
||||
this.slider.unbind();
|
||||
this.pane.unbind();
|
||||
}
|
||||
this.$content.unbind("" + SCROLL + " " + MOUSEWHEEL + " " + DOMSCROLL + " " + TOUCHMOVE, events[SCROLL]);
|
||||
};
|
||||
|
||||
/**
|
||||
Generates nanoScroller's scrollbar and elements for it.
|
||||
@method generate
|
||||
@chainable
|
||||
@private
|
||||
*/
|
||||
|
||||
|
||||
NanoScroll.prototype.generate = function() {
|
||||
var contentClass, cssRule, options, paneClass, sliderClass;
|
||||
options = this.options;
|
||||
paneClass = options.paneClass, sliderClass = options.sliderClass, contentClass = options.contentClass;
|
||||
if (!this.$el.find("" + paneClass).length && !this.$el.find("" + sliderClass).length) {
|
||||
this.$el.append("<div class=\"" + paneClass + "\"><div class=\"" + sliderClass + "\" /></div>");
|
||||
}
|
||||
this.pane = this.$el.children("." + paneClass);
|
||||
this.slider = this.pane.find("." + sliderClass);
|
||||
if (BROWSER_SCROLLBAR_WIDTH) {
|
||||
cssRule = this.$el.css('direction') === 'rtl' ? {
|
||||
left: -BROWSER_SCROLLBAR_WIDTH
|
||||
} : {
|
||||
right: -BROWSER_SCROLLBAR_WIDTH
|
||||
};
|
||||
this.$el.addClass('has-scrollbar');
|
||||
}
|
||||
if (cssRule != null) {
|
||||
this.$content.css(cssRule);
|
||||
}
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
@method restore
|
||||
@private
|
||||
*/
|
||||
|
||||
|
||||
NanoScroll.prototype.restore = function() {
|
||||
this.stopped = false;
|
||||
this.pane.show();
|
||||
this.addEvents();
|
||||
};
|
||||
|
||||
/**
|
||||
Resets nanoScroller's scrollbar.
|
||||
@method reset
|
||||
@chainable
|
||||
@example
|
||||
$(".nano").nanoScroller();
|
||||
*/
|
||||
|
||||
|
||||
NanoScroll.prototype.reset = function() {
|
||||
var content, contentHeight, contentStyle, contentStyleOverflowY, paneBottom, paneHeight, paneOuterHeight, paneTop, sliderHeight;
|
||||
if (this.iOSNativeScrolling) {
|
||||
this.contentHeight = this.content.scrollHeight;
|
||||
return;
|
||||
}
|
||||
if (!this.$el.find("." + this.options.paneClass).length) {
|
||||
this.generate().stop();
|
||||
}
|
||||
if (this.stopped) {
|
||||
this.restore();
|
||||
}
|
||||
content = this.content;
|
||||
contentStyle = content.style;
|
||||
contentStyleOverflowY = contentStyle.overflowY;
|
||||
if (BROWSER_IS_IE7) {
|
||||
this.$content.css({
|
||||
height: this.$content.height()
|
||||
});
|
||||
}
|
||||
contentHeight = content.scrollHeight + BROWSER_SCROLLBAR_WIDTH;
|
||||
paneHeight = this.pane.outerHeight();
|
||||
paneTop = parseInt(this.pane.css('top'), 10);
|
||||
paneBottom = parseInt(this.pane.css('bottom'), 10);
|
||||
paneOuterHeight = paneHeight + paneTop + paneBottom;
|
||||
sliderHeight = Math.round(paneOuterHeight / contentHeight * paneOuterHeight);
|
||||
if (sliderHeight < this.options.sliderMinHeight) {
|
||||
sliderHeight = this.options.sliderMinHeight;
|
||||
} else if ((this.options.sliderMaxHeight != null) && sliderHeight > this.options.sliderMaxHeight) {
|
||||
sliderHeight = this.options.sliderMaxHeight;
|
||||
}
|
||||
if (contentStyleOverflowY === SCROLL && contentStyle.overflowX !== SCROLL) {
|
||||
sliderHeight += BROWSER_SCROLLBAR_WIDTH;
|
||||
}
|
||||
this.maxSliderTop = paneOuterHeight - sliderHeight;
|
||||
this.contentHeight = contentHeight;
|
||||
this.paneHeight = paneHeight;
|
||||
this.paneOuterHeight = paneOuterHeight;
|
||||
this.sliderHeight = sliderHeight;
|
||||
this.slider.height(sliderHeight);
|
||||
this.events.scroll();
|
||||
this.pane.show();
|
||||
this.isActive = true;
|
||||
if ((content.scrollHeight === content.clientHeight) || (this.pane.outerHeight(true) >= content.scrollHeight && contentStyleOverflowY !== SCROLL)) {
|
||||
this.pane.hide();
|
||||
this.isActive = false;
|
||||
} else if (this.el.clientHeight === content.scrollHeight && contentStyleOverflowY === SCROLL) {
|
||||
this.slider.hide();
|
||||
} else {
|
||||
this.slider.show();
|
||||
}
|
||||
this.pane.css({
|
||||
opacity: (this.options.alwaysVisible ? 1 : ''),
|
||||
visibility: (this.options.alwaysVisible ? 'visible' : '')
|
||||
});
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
@method scroll
|
||||
@private
|
||||
@example
|
||||
$(".nano").nanoScroller({ scroll: 'top' });
|
||||
*/
|
||||
|
||||
|
||||
NanoScroll.prototype.scroll = function() {
|
||||
if (!this.isActive) {
|
||||
return;
|
||||
}
|
||||
this.sliderY = Math.max(0, this.sliderY);
|
||||
this.sliderY = Math.min(this.maxSliderTop, this.sliderY);
|
||||
this.$content.scrollTop((this.paneHeight - this.contentHeight + BROWSER_SCROLLBAR_WIDTH) * this.sliderY / this.maxSliderTop * -1);
|
||||
if (!this.iOSNativeScrolling) {
|
||||
this.slider.css({
|
||||
top: this.sliderY
|
||||
});
|
||||
}
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
Scroll at the bottom with an offset value
|
||||
@method scrollBottom
|
||||
@param offsetY {Number}
|
||||
@chainable
|
||||
@example
|
||||
$(".nano").nanoScroller({ scrollBottom: value });
|
||||
*/
|
||||
|
||||
|
||||
NanoScroll.prototype.scrollBottom = function(offsetY) {
|
||||
if (!this.isActive) {
|
||||
return;
|
||||
}
|
||||
this.reset();
|
||||
this.$content.scrollTop(this.contentHeight - this.$content.height() - offsetY).trigger(MOUSEWHEEL);
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
Scroll at the top with an offset value
|
||||
@method scrollTop
|
||||
@param offsetY {Number}
|
||||
@chainable
|
||||
@example
|
||||
$(".nano").nanoScroller({ scrollTop: value });
|
||||
*/
|
||||
|
||||
|
||||
NanoScroll.prototype.scrollTop = function(offsetY) {
|
||||
if (!this.isActive) {
|
||||
return;
|
||||
}
|
||||
this.reset();
|
||||
this.$content.scrollTop(+offsetY).trigger(MOUSEWHEEL);
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
Scroll to an element
|
||||
@method scrollTo
|
||||
@param node {Node} A node to scroll to.
|
||||
@chainable
|
||||
@example
|
||||
$(".nano").nanoScroller({ scrollTo: $('#a_node') });
|
||||
*/
|
||||
|
||||
|
||||
NanoScroll.prototype.scrollTo = function(node) {
|
||||
if (!this.isActive) {
|
||||
return;
|
||||
}
|
||||
this.reset();
|
||||
this.scrollTop($(node).get(0).offsetTop);
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
To stop the operation.
|
||||
This option will tell the plugin to disable all event bindings and hide the gadget scrollbar from the UI.
|
||||
@method stop
|
||||
@chainable
|
||||
@example
|
||||
$(".nano").nanoScroller({ stop: true });
|
||||
*/
|
||||
|
||||
|
||||
NanoScroll.prototype.stop = function() {
|
||||
this.stopped = true;
|
||||
this.removeEvents();
|
||||
this.pane.hide();
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
To flash the scrollbar gadget for an amount of time defined in plugin settings (defaults to 1,5s).
|
||||
Useful if you want to show the user (e.g. on pageload) that there is more content waiting for him.
|
||||
@method flash
|
||||
@chainable
|
||||
@example
|
||||
$(".nano").nanoScroller({ flash: true });
|
||||
*/
|
||||
|
||||
|
||||
NanoScroll.prototype.flash = function() {
|
||||
var _this = this;
|
||||
if (!this.isActive) {
|
||||
return;
|
||||
}
|
||||
this.reset();
|
||||
this.pane.addClass('flashed');
|
||||
setTimeout(function() {
|
||||
_this.pane.removeClass('flashed');
|
||||
}, this.options.flashDelay);
|
||||
return this;
|
||||
};
|
||||
|
||||
return NanoScroll;
|
||||
|
||||
})();
|
||||
$.fn.nanoScroller = function(settings) {
|
||||
return this.each(function() {
|
||||
var options, scrollbar;
|
||||
if (!(scrollbar = this.nanoscroller)) {
|
||||
options = $.extend({}, defaults, settings);
|
||||
this.nanoscroller = scrollbar = new NanoScroll(this, options);
|
||||
}
|
||||
if (settings && typeof settings === "object") {
|
||||
$.extend(scrollbar.options, settings);
|
||||
if (settings.scrollBottom) {
|
||||
return scrollbar.scrollBottom(settings.scrollBottom);
|
||||
}
|
||||
if (settings.scrollTop) {
|
||||
return scrollbar.scrollTop(settings.scrollTop);
|
||||
}
|
||||
if (settings.scrollTo) {
|
||||
return scrollbar.scrollTo(settings.scrollTo);
|
||||
}
|
||||
if (settings.scroll === 'bottom') {
|
||||
return scrollbar.scrollBottom(0);
|
||||
}
|
||||
if (settings.scroll === 'top') {
|
||||
return scrollbar.scrollTop(0);
|
||||
}
|
||||
if (settings.scroll && settings.scroll instanceof $) {
|
||||
return scrollbar.scrollTo(settings.scroll);
|
||||
}
|
||||
if (settings.stop) {
|
||||
return scrollbar.stop();
|
||||
}
|
||||
if (settings.flash) {
|
||||
return scrollbar.flash();
|
||||
}
|
||||
}
|
||||
return scrollbar.reset();
|
||||
});
|
||||
};
|
||||
})(jQuery, window, document);
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,279 @@
|
||||
/*
|
||||
* jQuery pageSlide
|
||||
* Version 2.0
|
||||
* http://srobbin.com/jquery-pageslide/
|
||||
*
|
||||
* jQuery Javascript plugin which slides a webpage over to reveal an additional interaction pane.
|
||||
*
|
||||
* Copyright (c) 2011 Scott Robbin (srobbin.com)
|
||||
* Dual licensed under the MIT and GPL licenses.
|
||||
*/
|
||||
|
||||
!(function($){
|
||||
// Convenience vars for accessing elements
|
||||
var $body = $('#main-wrap'),
|
||||
$pageslide = $('#pageslide'),
|
||||
$viewPage = $('#view-page');
|
||||
|
||||
var _sliding = false, // Mutex to assist closing only once
|
||||
_lastCaller; // Used to keep track of last element to trigger pageslide
|
||||
|
||||
// If the pageslide element doesn't exist, create it
|
||||
if( $pageslide.length == 0 ) {
|
||||
$pageslide = $('<div />').attr( 'id', 'pageslide' )
|
||||
.css( 'display', 'none' )
|
||||
.appendTo( $body );
|
||||
}
|
||||
|
||||
/*
|
||||
* Private methods
|
||||
*/
|
||||
function _load( url, useIframe ) {
|
||||
// Are we loading an element from the page or a URL?
|
||||
if ( url.indexOf("#") === 0 ) {
|
||||
// Load a page element
|
||||
$(url).clone(true).appendTo( $pageslide.empty() ).show();
|
||||
} else {
|
||||
// Load a URL. Into an iframe?
|
||||
if( useIframe ) {
|
||||
var iframe = $("<iframe />").attr({
|
||||
id: "page_iframe",
|
||||
src: url,
|
||||
frameborder: 0,
|
||||
hspace: 0
|
||||
})
|
||||
.css({
|
||||
width: "100%",
|
||||
height: "100%"
|
||||
});
|
||||
|
||||
$viewPage.find('.content').html( iframe );
|
||||
$viewPage.clone(true).appendTo( $pageslide.empty() ).show();
|
||||
$viewPage.find('.content').empty();
|
||||
} else {
|
||||
$viewPage.find('.content').load(url, function(){
|
||||
$viewPage.clone(true).appendTo( $pageslide.empty() ).show();
|
||||
if($('#filter-default-tag').length) {
|
||||
$('#filter-default-tag').fastLiveFilter('.add-default-tags-list', '.filter-item', '.tag');
|
||||
addTagsTab();
|
||||
$('#view-page .card').cardCheck({
|
||||
check: $('#view-page input[type="checkbox"]'),
|
||||
});
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
$pageslide.data( 'localEl', false );
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// Function that controls opening of the pageslide
|
||||
function _start( direction, speed ) {
|
||||
var slideWidth = $pageslide.outerWidth( true ),
|
||||
bodyAnimateIn = {},
|
||||
slideAnimateIn = {};
|
||||
|
||||
// If the slide is open or opening, just ignore the call
|
||||
if( $pageslide.is(':visible') || _sliding ) return;
|
||||
_sliding = true;
|
||||
|
||||
switch( direction ) {
|
||||
case 'left':
|
||||
$pageslide.css({ left: 'auto', right: '-' + slideWidth + 'px' });
|
||||
bodyAnimateIn['width'] = '-=' + slideWidth;
|
||||
slideAnimateIn['right'] = '+=' + slideWidth;
|
||||
break;
|
||||
default:
|
||||
if($sidebarState && !$('#items').length) {
|
||||
$pageslide.css({ left: '-' + (slideWidth-241) + 'px', right: 'auto' });
|
||||
}else{
|
||||
$pageslide.css({ left: '-' + (slideWidth-61) + 'px', right: 'auto' });
|
||||
};
|
||||
bodyAnimateIn['margin-left'] = '+=' + slideWidth;
|
||||
if($(window).width() < 1440 && slideWidth > 963 ) {
|
||||
bodyAnimateIn['width'] = $body.width();
|
||||
}
|
||||
slideAnimateIn['left'] = '+=' + slideWidth;
|
||||
break;
|
||||
}
|
||||
|
||||
// Animate the slide, and attach this slide's settings to the element
|
||||
$body.animate(bodyAnimateIn, speed);
|
||||
$pageslide.show()
|
||||
.animate(slideAnimateIn, speed, function() {
|
||||
_sliding = false;
|
||||
$pageslide.children('.nano').nanoScroller({ scrollTop: 0, iOSNativeScrolling: true });
|
||||
});
|
||||
}
|
||||
|
||||
/*
|
||||
* Declaration
|
||||
*/
|
||||
$.fn.pageslide = function(options) {
|
||||
var $elements = this;
|
||||
|
||||
// On click
|
||||
$elements.on(clickEvent, function(e) {
|
||||
var $self = $(this),
|
||||
settings = $.extend({ href: $self.attr('href') }, options);
|
||||
|
||||
// Prevent the default behavior and stop propagation
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
|
||||
if ( $pageslide.is(':visible') && $self[0] == _lastCaller ) {
|
||||
// If we clicked the same element twice, toggle closed
|
||||
// $.pageslide.close();
|
||||
} else {
|
||||
// Open
|
||||
$.pageslide( settings );
|
||||
|
||||
if($('#items').length) {
|
||||
$('.item-menu > a, .navbar-inner').removeClass("active");
|
||||
$(this).parents('.navbar-inner').addClass('active').end().addClass('active');
|
||||
if(!$.support.touch) {
|
||||
if($('.item-menu > a').hasClass('active')) {
|
||||
$('.item-menu').css({
|
||||
'display': 'none',
|
||||
});
|
||||
$(this).parents('.item-menu').css({
|
||||
'display': 'inline-block',
|
||||
});
|
||||
}
|
||||
}
|
||||
} else if($('.tags-groups').length) {
|
||||
$(this).parents('li').addClass("active").siblings().removeClass("active").parent('ul').siblings().children('li').removeClass("active");
|
||||
} else {
|
||||
$(this).parents("tr").addClass("active").siblings().removeClass("active");;
|
||||
}
|
||||
$pageslide.focusFirstField(); // focus first form
|
||||
setTimeout(setScroll, 300);
|
||||
// Record the last element to trigger pageslide
|
||||
_lastCaller = $self[0];
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
/*
|
||||
* Default settings
|
||||
*/
|
||||
$.fn.pageslide.defaults = {
|
||||
speed: 300, // Accepts standard jQuery effects speeds (i.e. fast, normal or milliseconds)
|
||||
direction: 'right', // Accepts 'left' or 'right'
|
||||
modal: false, // If set to true, you must explicitly close pageslide using $.pageslide.close();
|
||||
iframe: false, // By default, linked pages are loaded into an iframe. Set this to false if you don't want an iframe.
|
||||
href: null, // Override the source of the content. Optional in most cases, but required when opening pageslide programmatically.
|
||||
W: 264
|
||||
};
|
||||
|
||||
/*
|
||||
* Public methods
|
||||
*/
|
||||
|
||||
// Open the pageslide
|
||||
$.pageslide = function( options ) {
|
||||
// Extend the settings with those the user has provided
|
||||
var settings = $.extend({}, $.fn.pageslide.defaults, options);
|
||||
|
||||
// Are we trying to open in different direction?
|
||||
if( ($pageslide.is(':visible') && $pageslide.data( 'W' ) != settings.W) || ($pageslide.is(':visible') && $pageslide.data( 'direction' ) != settings.direction) ) {
|
||||
$.pageslide.close(function(){
|
||||
$pageslide.css({'width': settings.W});
|
||||
_load( settings.href, settings.iframe );
|
||||
_start( settings.direction, settings.speed );
|
||||
});
|
||||
} else {
|
||||
_load( settings.href, settings.iframe );
|
||||
if( $pageslide.is(':hidden') ) {
|
||||
$pageslide.css({'width': settings.W});
|
||||
_start( settings.direction, settings.speed );
|
||||
}
|
||||
}
|
||||
|
||||
$pageslide.data( settings );
|
||||
|
||||
|
||||
|
||||
// if($('#add-tags').length) {
|
||||
// $('.set_new').addClass('active in').siblings().removeClass('active in');
|
||||
// $('#pageslide .select_default .search-query').attr('id','filter-default-tag')
|
||||
// $('#filter-default-tag').fastLiveFilter('.add-default-tags-list', '.filter-item', '.tag');
|
||||
// $('.add-default-tags-list .filter-item').removeClass('mark');
|
||||
// }
|
||||
}
|
||||
|
||||
// Close the pageslide
|
||||
$.pageslide.close = function( callback ) {
|
||||
var $pageslide = $('#pageslide'),
|
||||
slideWidth = $pageslide.outerWidth( true ),
|
||||
speed = $pageslide.data( 'speed' ),
|
||||
bodyAnimateIn = {},
|
||||
slideAnimateIn = {}
|
||||
|
||||
// If the slide isn't open, just ignore the call
|
||||
if( $pageslide.is(':hidden') || _sliding ) return;
|
||||
_sliding = true;
|
||||
|
||||
switch( $pageslide.data( 'direction' ) ) {
|
||||
case 'left':
|
||||
bodyAnimateIn['width'] = '+=' + slideWidth;
|
||||
slideAnimateIn['right'] = '-=' + slideWidth;
|
||||
break;
|
||||
default:
|
||||
bodyAnimateIn['margin-left'] = '-=' + slideWidth;
|
||||
slideAnimateIn['left'] = '-=' + slideWidth;
|
||||
if($pageslide.find('.preview').length) {
|
||||
$pageslide.find('.preview').cycle('destroy');
|
||||
$pageslide.find('.preview img').removeAttr('style');
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if($('#items').length) {
|
||||
$(".navbar-inner").removeClass("active");
|
||||
$('.item-menu > a, .navbar-inner').removeClass("active");
|
||||
if(!$.support.touch) {
|
||||
$('.item-menu').css({
|
||||
'display': 'none',
|
||||
});
|
||||
}
|
||||
} else if($('.tags-groups').length) {
|
||||
$('.tags-groups').children('li').removeClass("active");
|
||||
} else {
|
||||
$("tr").removeClass("active");
|
||||
};
|
||||
|
||||
$pageslide.animate(slideAnimateIn, speed);
|
||||
$body.animate(bodyAnimateIn, speed, function() {
|
||||
$pageslide.hide();
|
||||
_sliding = false;
|
||||
if( typeof callback != 'undefined' ) callback();
|
||||
$body.css({'width': 'auto'});
|
||||
$('#view-page .content').empty();
|
||||
$('#view-page .pane').remove();
|
||||
});
|
||||
}
|
||||
|
||||
/* Events */
|
||||
|
||||
// Don't let clicks to the pageslide close the window
|
||||
$pageslide.click(function(e) {
|
||||
e.stopPropagation();
|
||||
});
|
||||
|
||||
// Close the pageslide if the document is clicked or the users presses the ESC key, unless the pageslide is modal
|
||||
$(document).bind('click keyup', function(e) {
|
||||
// If this is a keyup event, let's see if it's an ESC key
|
||||
if( e.type == "keyup" && e.keyCode != 27) return;
|
||||
|
||||
// Make sure it's visible, and we're not modal
|
||||
if( $pageslide.is( ':visible' ) && !$pageslide.data( 'modal' ) ) {
|
||||
$.pageslide.close();
|
||||
}
|
||||
});
|
||||
function setScroll(){
|
||||
$pageslide.children('.nano').nanoScroller({ scrollTop: 0, iOSNativeScrolling: true }); // set nano scroll
|
||||
};
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,347 @@
|
||||
/*
|
||||
* jQuery pageSlide
|
||||
* Version 2.0
|
||||
* http://srobbin.com/jquery-pageslide/
|
||||
*
|
||||
* jQuery Javascript plugin which slides a webpage over to reveal an additional interaction pane.
|
||||
*
|
||||
* Copyright (c) 2011 Scott Robbin (srobbin.com)
|
||||
* Dual licensed under the MIT and GPL licenses.
|
||||
*/
|
||||
|
||||
(function($){
|
||||
// Convenience vars for accessing elements
|
||||
var $body = $('#main-wrap'),
|
||||
$pageslide = $('#pageslide'),
|
||||
$viewPage = $('#view-page');
|
||||
|
||||
var _sliding = false, // Mutex to assist closing only once
|
||||
_lastCaller; // Used to keep track of last element to trigger pageslide
|
||||
|
||||
// If the pageslide element doesn't exist, create it
|
||||
if( $pageslide.length == 0 ) {
|
||||
$pageslide = $('<div />').attr( 'id', 'pageslide' )
|
||||
.css( 'display', 'none' )
|
||||
.appendTo( $('#main-wrap') );
|
||||
}
|
||||
|
||||
/*
|
||||
* Private methods
|
||||
*/
|
||||
function _load( url, useIframe ) {
|
||||
// Are we loading an element from the page or a URL?
|
||||
|
||||
if ( url.indexOf("#") === 0 ) {
|
||||
// Load a page element
|
||||
$(url).clone(true).appendTo( $pageslide.empty() ).show();
|
||||
if($('#items').length) {
|
||||
$pageslide.css({'width': '324px'});
|
||||
} else {
|
||||
$pageslide.css({'width': '264px'});
|
||||
}
|
||||
} else {
|
||||
// Load a URL. Into an iframe?
|
||||
if( useIframe ) {
|
||||
var iframe = $("<iframe />").attr({
|
||||
src: url,
|
||||
frameborder: 0,
|
||||
hspace: 0
|
||||
})
|
||||
.css({
|
||||
width: "100%",
|
||||
height: "100%"
|
||||
});
|
||||
|
||||
$pageslide.html( iframe );
|
||||
} else {
|
||||
$viewPage.find('.content').load(url, function(){
|
||||
$viewPage.clone(true).appendTo( $pageslide.empty() ).show();
|
||||
});
|
||||
$(window).width() > 1600 ? $pageslide.css({'width': '1024px'}) : $pageslide.css({'width': '953px'});
|
||||
// $pageslide.load( url );
|
||||
}
|
||||
|
||||
$pageslide.data( 'localEl', false );
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// Function that controls opening of the pageslide
|
||||
function _start( direction, speed ) {
|
||||
var slideWidth,
|
||||
bodyAnimateIn = {},
|
||||
slideAnimateIn = {};
|
||||
// If the slide is open or opening, just ignore the call
|
||||
if( $pageslide.is(':visible') || _sliding ) return;
|
||||
_sliding = true;
|
||||
|
||||
switch( direction ) {
|
||||
case 'left':
|
||||
if($(window).width() > 1600) {
|
||||
$pageslide.css({'width': '1024px'});
|
||||
slideWidth = $pageslide.outerWidth( true );
|
||||
bodyAnimateIn['width'] = '-=' + slideWidth;
|
||||
} else {
|
||||
$pageslide.css({'width': '953px'});
|
||||
slideWidth = $pageslide.outerWidth( true );
|
||||
}
|
||||
|
||||
$pageslide.css({ left: 'auto', right: '-' + slideWidth + 'px' });
|
||||
slideAnimateIn['right'] = '+=' + slideWidth;
|
||||
|
||||
|
||||
|
||||
// bodyAnimateIn['margin-left'] = '-=' + slideWidth;
|
||||
|
||||
// for Orbit ---> Fixed page does not move to the left
|
||||
if($('#items').length) {
|
||||
// bodyAnimateIn['padding-left'] = '+=' + slideWidth;
|
||||
}
|
||||
//
|
||||
|
||||
break;
|
||||
default:
|
||||
// Original
|
||||
// $pageslide.css({ left: '-' + slideWidth + 'px', right: 'auto' });
|
||||
// bodyAnimateIn['margin-left'] = '+=' + slideWidth;
|
||||
|
||||
// for Orbit
|
||||
// if($('#items').length) {
|
||||
// $pageslide.css({'width': '324px'});
|
||||
// slideWidth = $pageslide.outerWidth( true );
|
||||
// } else {
|
||||
// $pageslide.css({'width': '264px'});
|
||||
// }
|
||||
slideWidth = $pageslide.outerWidth( true );
|
||||
if($sidebarState && !$('#items').length) {
|
||||
$pageslide.css({ left: '-' + (slideWidth-241) + 'px', right: 'auto' });
|
||||
}else{
|
||||
$pageslide.css({ left: '-' + (slideWidth-61) + 'px', right: 'auto' });
|
||||
};
|
||||
|
||||
|
||||
bodyAnimateIn['margin-left'] = '+=' + slideWidth;
|
||||
// bodyAnimateIn['width'] = '-=' + slideWidth;
|
||||
//
|
||||
|
||||
slideAnimateIn['left'] = '+=' + slideWidth;
|
||||
break;
|
||||
}
|
||||
|
||||
// Animate the slide, and attach this slide's settings to the element
|
||||
console.log("d")
|
||||
$body.animate(bodyAnimateIn, speed);
|
||||
$pageslide.show()
|
||||
.animate(slideAnimateIn, speed, function() {
|
||||
_sliding = false;
|
||||
});
|
||||
}
|
||||
|
||||
/*
|
||||
* Declaration
|
||||
*/
|
||||
$.fn.pageslide = function(options) {
|
||||
var $elements = this,
|
||||
$ua = navigator.userAgent,
|
||||
event = ($ua.match(/iPad/i)||$ua.match(/iPhone/i)||$ua.match(/iPod/i)||$ua.match(/Android/)) ? "touchstart" : "click";
|
||||
// On click
|
||||
$elements.on(event, function(e) {
|
||||
var $self = $(this),
|
||||
settings = $.extend({ href: $self.attr('href') }, options);
|
||||
|
||||
// Prevent the default behavior and stop propagation
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
|
||||
if ( $pageslide.is(':visible') && $self[0] == _lastCaller ) {
|
||||
// If we clicked the same element twice, toggle closed
|
||||
$.pageslide.close();
|
||||
} else {
|
||||
// Open
|
||||
$.pageslide( settings );
|
||||
|
||||
// for Orbit
|
||||
|
||||
if($('#items').length) {
|
||||
$('.item-menu > a, .navbar-inner').removeClass("active");
|
||||
$(this).parents('.navbar-inner').addClass('active').end().addClass('active');
|
||||
if(!$.support.touch) {
|
||||
if($('.item-menu > a').hasClass('active')) {
|
||||
$('.item-menu').css({
|
||||
'display': 'none',
|
||||
});
|
||||
$(this).parents('.item-menu').css({
|
||||
'display': 'inline-block',
|
||||
});
|
||||
}
|
||||
}
|
||||
if($(this).hasClass('view-page')) {
|
||||
pageID = $(this).data('pageId');
|
||||
}
|
||||
} else if($('.tags-groups').length) {
|
||||
$(this).parents('li').addClass("active").siblings().removeClass("active").parent('ul').siblings().children('li').removeClass("active");
|
||||
} else {
|
||||
$(this).parents("tr").addClass("active").siblings().removeClass("active");;
|
||||
}
|
||||
$pageslide.focusFirstField(); // focus first form
|
||||
|
||||
setTimeout(setScroll, 300);
|
||||
//
|
||||
|
||||
// Record the last element to trigger pageslide
|
||||
_lastCaller = $self[0];
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
/*
|
||||
* Default settings
|
||||
*/
|
||||
$.fn.pageslide.defaults = {
|
||||
speed: 300, // Accepts standard jQuery effects speeds (i.e. fast, normal or milliseconds)
|
||||
direction: 'right', // Accepts 'left' or 'right'
|
||||
modal: false, // If set to true, you must explicitly close pageslide using $.pageslide.close();
|
||||
iframe: false, // By default, linked pages are loaded into an iframe. Set this to false if you don't want an iframe.
|
||||
href: null // Override the source of the content. Optional in most cases, but required when opening pageslide programmatically.
|
||||
};
|
||||
|
||||
/*
|
||||
* Public methods
|
||||
*/
|
||||
|
||||
// Open the pageslide
|
||||
$.pageslide = function( options ) {
|
||||
// Extend the settings with those the user has provided
|
||||
var settings = $.extend({}, $.fn.pageslide.defaults, options);
|
||||
|
||||
// Are we trying to open in different direction?
|
||||
// if( $pageslide.is(':visible') && $pageslide.data( 'direction' ) != settings.direction) {
|
||||
if( $pageslide.is(':visible')) {
|
||||
$.pageslide.close(function(){
|
||||
_load( settings.href, settings.iframe );
|
||||
_start( settings.direction, settings.speed );
|
||||
});
|
||||
} else {
|
||||
_load( settings.href, settings.iframe );
|
||||
if( $pageslide.is(':hidden') ) {
|
||||
_start( settings.direction, settings.speed );
|
||||
}
|
||||
}
|
||||
$pageslide.data( settings );
|
||||
|
||||
|
||||
// for Orbit
|
||||
if($('#add-tags').length) {
|
||||
$('.set_new').addClass('active in').siblings().removeClass('active in');
|
||||
$('#pageslide .select_default .search-query').attr('id','filter-default-tag')
|
||||
$('#filter-default-tag').fastLiveFilter('.add-default-tags-list', '.filter-item', '.tag');
|
||||
$('.add-default-tags-list .filter-item').removeClass('mark');
|
||||
}
|
||||
//
|
||||
}
|
||||
|
||||
// Close the pageslide
|
||||
$.pageslide.close = function( callback ) {
|
||||
var $pageslide = $('#pageslide'),
|
||||
slideWidth,
|
||||
speed = $pageslide.data( 'speed' ),
|
||||
bodyAnimateIn = {},
|
||||
slideAnimateIn = {}
|
||||
|
||||
// If the slide isn't open, just ignore the call
|
||||
if( $pageslide.is(':hidden') || _sliding ) return;
|
||||
_sliding = true;
|
||||
|
||||
switch( $pageslide.data( 'direction' ) ) {
|
||||
case 'left':
|
||||
if($(window).width() > 1600) {
|
||||
$pageslide.css({'width': '1024px'});
|
||||
} else {
|
||||
$pageslide.css({'width': '953px'});
|
||||
}
|
||||
slideWidth = $pageslide.outerWidth( true );
|
||||
// bodyAnimateIn['margin-left'] = '+=' + slideWidth;
|
||||
if($(window).width() > 1600) {
|
||||
bodyAnimateIn['width'] = '+=' + slideWidth;
|
||||
}
|
||||
|
||||
// for Orbit ---> Fixed page does not move to the left
|
||||
if($('#items').length) {
|
||||
bodyAnimateIn['padding-left'] = '-=' + slideWidth;
|
||||
}
|
||||
//
|
||||
|
||||
slideAnimateIn['right'] = '-=' + slideWidth;
|
||||
break;
|
||||
default:
|
||||
// Original
|
||||
// bodyAnimateIn['margin-left'] = '-=' + slideWidth;
|
||||
// bodyAnimateIn['width'] = '+=' + slideWidth;
|
||||
|
||||
// for Orbit
|
||||
// if($('#items').length) {
|
||||
// $pageslide.css({'width': '324px'});
|
||||
// slideWidth = $pageslide.outerWidth( true );
|
||||
// } else {
|
||||
// $pageslide.css({'width': '264px'});
|
||||
// }
|
||||
slideWidth = $pageslide.outerWidth( true );
|
||||
bodyAnimateIn['margin-left'] = '-=' + slideWidth;
|
||||
// bodyAnimateIn['width'] = '+=' + slideWidth;
|
||||
if($pageslide.find('.preview').length) {
|
||||
$pageslide.find('.preview').cycle('destroy');
|
||||
$pageslide.find('.preview img').removeAttr('style');
|
||||
}
|
||||
//
|
||||
|
||||
slideAnimateIn['left'] = '-=' + slideWidth;
|
||||
break;
|
||||
}
|
||||
|
||||
// for Orbit
|
||||
if($('#items').length) {
|
||||
$(".navbar-inner").removeClass("active");
|
||||
$('.item-menu > a, .navbar-inner').removeClass("active");
|
||||
if(!$.support.touch) {
|
||||
$('.item-menu').css({
|
||||
'display': 'none',
|
||||
});
|
||||
}
|
||||
} else if($('.tags-groups').length) {
|
||||
$('.tags-groups').children('li').removeClass("active");
|
||||
} else {
|
||||
$("tr").removeClass("active");
|
||||
};
|
||||
//
|
||||
|
||||
$pageslide.animate(slideAnimateIn, speed);
|
||||
$body.animate(bodyAnimateIn, speed, function() {
|
||||
$pageslide.hide();
|
||||
_sliding = false;
|
||||
if( typeof callback != 'undefined' ) callback();
|
||||
$body.css({'width': 'auto'});
|
||||
});
|
||||
}
|
||||
|
||||
/* Events */
|
||||
|
||||
// Don't let clicks to the pageslide close the window
|
||||
$pageslide.click(function(e) {
|
||||
e.stopPropagation();
|
||||
});
|
||||
|
||||
// Close the pageslide if the document is clicked or the users presses the ESC key, unless the pageslide is modal
|
||||
$(document).bind('click keyup', function(e) {
|
||||
// If this is a keyup event, let's see if it's an ESC key
|
||||
if( e.type == "keyup" && e.keyCode != 27) return;
|
||||
|
||||
// Make sure it's visible, and we're not modal
|
||||
if( $pageslide.is( ':visible' ) && !$pageslide.data( 'modal' ) ) {
|
||||
$.pageslide.close();
|
||||
}
|
||||
});
|
||||
function setScroll(){
|
||||
$pageslide.children('.nano').nanoScroller({ scrollTop: 0, iOSNativeScrolling: true }); // set nano scroll
|
||||
};
|
||||
|
||||
})(jQuery);
|
||||
@@ -1,42 +0,0 @@
|
||||
// (function($) {
|
||||
// var cache = [];
|
||||
// // Arguments are image paths relative to the current page.
|
||||
// $.preLoadImages = function() {
|
||||
// var args_len = arguments.length;
|
||||
// for (var i = args_len; i--;) {
|
||||
// var cacheImage = document.createElement('img');
|
||||
// cacheImage.src = arguments[i];
|
||||
// cache.push(cacheImage);
|
||||
// }
|
||||
// }
|
||||
// })(jQuery)
|
||||
|
||||
|
||||
(function($) {
|
||||
$.preloadimages = function (arr){
|
||||
var newimages=[], loadedimages=0
|
||||
var postaction=function(){}
|
||||
var arr=(typeof arr!="object")? [arr] : arr
|
||||
function imageloadpost(){
|
||||
loadedimages++
|
||||
if (loadedimages==arr.length){
|
||||
postaction(newimages) //call postaction and pass in newimages array as parameter
|
||||
}
|
||||
}
|
||||
for (var i=0; i<arr.length; i++){
|
||||
newimages[i]=new Image()
|
||||
newimages[i].src=arr[i]
|
||||
newimages[i].onload=function(){
|
||||
imageloadpost()
|
||||
}
|
||||
newimages[i].onerror=function(){
|
||||
imageloadpost()
|
||||
}
|
||||
}
|
||||
return { //return blank object with done() method
|
||||
done:function(f){
|
||||
postaction=f || postaction //remember user defined callback functions to be called when images load
|
||||
}
|
||||
}
|
||||
}
|
||||
})(jQuery)
|
||||
@@ -0,0 +1,11 @@
|
||||
/*
|
||||
* jQuery UI Touch Punch 0.2.2
|
||||
*
|
||||
* Copyright 2011, Dave Furfero
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
*
|
||||
* Depends:
|
||||
* jquery.ui.widget.js
|
||||
* jquery.ui.mouse.js
|
||||
*/
|
||||
(function(b){b.support.touch="ontouchend" in document;if(!b.support.touch){return;}var c=b.ui.mouse.prototype,e=c._mouseInit,a;function d(g,h){if(g.originalEvent.touches.length>1){return;}g.preventDefault();var i=g.originalEvent.changedTouches[0],f=document.createEvent("MouseEvents");f.initMouseEvent(h,true,true,window,1,i.screenX,i.screenY,i.clientX,i.clientY,false,false,false,false,0,null);g.target.dispatchEvent(f);}c._touchStart=function(g){var f=this;if(a||!f._mouseCapture(g.originalEvent.changedTouches[0])){return;}a=true;f._touchMoved=false;d(g,"mouseover");d(g,"mousemove");d(g,"mousedown");};c._touchMove=function(f){if(!a){return;}this._touchMoved=true;d(f,"mousemove");};c._touchEnd=function(f){if(!a){return;}d(f,"mouseup");d(f,"mouseout");if(!this._touchMoved){d(f,"click");}a=false;};c._mouseInit=function(){var f=this;f.element.bind("touchstart",b.proxy(f,"_touchStart")).bind("touchmove",b.proxy(f,"_touchMove")).bind("touchend",b.proxy(f,"_touchEnd"));e.call(f);};})(jQuery);
|
||||
@@ -0,0 +1,24 @@
|
||||
function loadViewPage(url) {
|
||||
var $listView = $('#list-view');
|
||||
|
||||
$listView.empty().removeClass('in active');
|
||||
$listView.load(url, function(response, status, xhr) {
|
||||
$(this).addClass('in active');
|
||||
})
|
||||
}
|
||||
|
||||
$(function() {
|
||||
$viewType = window.localStorage.getItem('viewType') || '#member-list';
|
||||
$viewSwitchNo = window.localStorage.getItem('viewSwitchNo') || 0;
|
||||
loadViewPage('member-list.html ' + $viewType);
|
||||
$('.view-switch').children('.btn').eq($viewSwitchNo).addClass('active');
|
||||
$('.view-switch').delegate(".btn", clickEvent, function(e){
|
||||
var url = $(this).attr('href'),
|
||||
ID = url.split("#"),
|
||||
ID = '#' + ID[ID.length-1];
|
||||
window.localStorage.setItem('viewType', ID);
|
||||
window.localStorage.setItem('viewSwitchNo', $(this).index());
|
||||
loadViewPage(url);
|
||||
e.preventDefault();
|
||||
});
|
||||
})
|
||||
@@ -0,0 +1,72 @@
|
||||
//Preview need a link in form as Ex and a corresponding PUT action in controller
|
||||
//Ex preview trigger:
|
||||
// <%= link_to "NewPreview", realtime_preview_admin_ad_banner_path(ad_banner_tab) , :class=>'preview_trigger'%>
|
||||
|
||||
$(document).ready(function() {
|
||||
// $(".post_preview").click(function(e){
|
||||
// $("#main-wrap").after("<span id='show_preview'></span>");
|
||||
// e.preventDefault();
|
||||
// var form = $(this).parents("form").first()
|
||||
// //var cont = form["content"].value;
|
||||
// // $.ajax({
|
||||
// // type: 'POST',
|
||||
// // url: $(this).attr("href")+'?preview=true',
|
||||
// // data: form.serialize(),
|
||||
// // dataType: "script",
|
||||
// // success: function (msg) {
|
||||
// // $("#"+start_modal_with_id).modal('show'); },
|
||||
// // error: function(){
|
||||
// // alert("ERROR");
|
||||
// // }
|
||||
// // });
|
||||
// url = "/panel/news/back_end/news_bulletins/preview?preview=true"
|
||||
// // alert(url)
|
||||
// form.attr("action",url);
|
||||
// form.submit();
|
||||
// //return false;
|
||||
// });
|
||||
$("button.post_preview").click(function(){
|
||||
var btn = document.getElementById("button_for_preview");
|
||||
var attrs = btn.attributes;
|
||||
var url = attrs['url'];
|
||||
// url = url.replace("url=","");
|
||||
$("form.previewable").ajaxSubmit({
|
||||
beforeSubmit: function(a,f,o){
|
||||
$("#main-wrap").after("<span id='show_preview'></span>");
|
||||
o.dataType = 'script';
|
||||
o.url = url.nodeValue;
|
||||
o.type = 'post';
|
||||
},success: function(msg) { }
|
||||
|
||||
});
|
||||
})
|
||||
// $("form.nccu_ajax_form").ajaxForm({
|
||||
// beforeSubmit: function(a,f,o) {
|
||||
// // if(clicked_what.hasClass("post_preview")){
|
||||
// // $("#main-wrap").after("<span id='show_preview'></span>");
|
||||
// // o.dataType = 'script';
|
||||
// // o.url = clicked_what.attr("url");
|
||||
// // }
|
||||
// },
|
||||
// success: function(data) {
|
||||
// // if(!clicked_what.hasClass("post_preview")){
|
||||
// // window.location = data.redirect_url;
|
||||
// // }
|
||||
// }
|
||||
// })
|
||||
|
||||
$("a.preview_trigger").on('click',function(){
|
||||
$("#main-wrap").after("<span id='show_preview'></span>");
|
||||
$.ajax({
|
||||
type: 'PUT',
|
||||
url:$(this).attr("href"),
|
||||
data:$(this).parents("form").serialize(),
|
||||
success: function (msg) {
|
||||
$("#"+start_modal_with_id).modal('show'); },
|
||||
error: function(){
|
||||
alert("ERROR");
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,60 @@
|
||||
// Search Clear
|
||||
!function ($) {
|
||||
$.fn.searchClear = function (param){
|
||||
_defaultSettings = {
|
||||
inputName: ':input',
|
||||
inputIcon: 'inputIcon',
|
||||
clearBtnIcon: 'clearBtnIcon',
|
||||
};
|
||||
_set = $.extend(_defaultSettings, param);
|
||||
$this = this;
|
||||
$input = this.find(_set.inputName);
|
||||
$tmp = '<i class="'+_set.inputIcon+'"></i><i class="'+_set.clearBtnIcon+' search-clear"></i>';
|
||||
$input.wrap('<div class="sc-field" />');
|
||||
$this.find('.sc-field').prepend($tmp);
|
||||
$searchClear = $this.find(".search-clear");
|
||||
function run(e) {
|
||||
$searchClear.hide();
|
||||
if($input.val().length > 0) {
|
||||
$searchClear.show();
|
||||
}else {
|
||||
$searchClear.hide();
|
||||
}
|
||||
$input.on("blur keyup", function(){
|
||||
if($(this).val().length > 0) {
|
||||
$searchClear.show();
|
||||
}else {
|
||||
$searchClear.hide();
|
||||
}
|
||||
});
|
||||
$searchClear.on({
|
||||
click: function(){
|
||||
$(this).hide();
|
||||
$input.val("")
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
// Checking IE10
|
||||
// if Windows 8 and IE is ture. remove search clear buttom and fix text input padding-right
|
||||
if(/Windows NT 6.2/g.test(navigator.userAgent)){
|
||||
if(/MSIE/g.test(navigator.userAgent)){
|
||||
$searchClear.remove();
|
||||
$input.css({
|
||||
'padding-right': '5px',
|
||||
});
|
||||
}else{run()}
|
||||
}else{run()}
|
||||
}
|
||||
}(window.jQuery);
|
||||
|
||||
|
||||
|
||||
var $moduleWidth = 0,
|
||||
$moduleNav = $('.module-nav');
|
||||
|
||||
var navMenu = new iScroll(document.getElementsByClassName('nav-scroll')[0], {
|
||||
snap: true,
|
||||
momentum: false,
|
||||
hScrollbar: false,
|
||||
});
|
||||
@@ -0,0 +1,3 @@
|
||||
$(function() {
|
||||
$('#filter-input').fastLiveFilter('#tags-list', '.tags');
|
||||
});
|
||||
@@ -1,33 +0,0 @@
|
||||
window.SocialShareButton =
|
||||
openUrl : (url) ->
|
||||
window.open(url)
|
||||
false
|
||||
|
||||
share : (el) ->
|
||||
site = $(el).data('site')
|
||||
title = encodeURIComponent($(el).parent().data('title'))
|
||||
img = encodeURIComponent($(el).parent().data("img"))
|
||||
fb_url = encodeURIComponent($(el).parent().data("fb_url"))
|
||||
url = encodeURIComponent(location.href)
|
||||
switch site
|
||||
when "weibo"
|
||||
SocialShareButton.openUrl("http://v.t.sina.com.cn/share/share.php?url=#{url}&pic=#{img}&title=#{title}&content=utf-8")
|
||||
when "twitter"
|
||||
SocialShareButton.openUrl("https://twitter.com/home?status=#{title}: #{url}")
|
||||
when "douban"
|
||||
SocialShareButton.openUrl("http://www.douban.com/recommend/?url=#{url}&title=#{title}&image=#{img}")
|
||||
when "facebook"
|
||||
SocialShareButton.openUrl("http://www.facebook.com/sharer.php?t=#{title}&u=#{fb_url}")
|
||||
when "qq"
|
||||
SocialShareButton.openUrl("http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url=#{url}&title=#{title}&pics=#{img}")
|
||||
when "tqq"
|
||||
SocialShareButton.openUrl("http://share.v.t.qq.com/index.php?c=share&a=index&url=#{url}&title=#{title}&pic=#{img}")
|
||||
when "baidu"
|
||||
SocialShareButton.openUrl("http://apps.hi.baidu.com/share/?url=#{url}&title=#{title}&content=")
|
||||
when "kaixin001"
|
||||
SocialShareButton.openUrl("http://www.kaixin001.com/rest/records.php?url=#{url}&content=#{title}&style=11&pic=#{img}")
|
||||
when "renren"
|
||||
SocialShareButton.openUrl("http://widget.renren.com/dialog/share?resourceUrl=#{url}&title=#{title}&description=")
|
||||
when "google_plus"
|
||||
SocialShareButton.openUrl("https://plus.google.com/share?url=#{url}&t=#{title}")
|
||||
false
|
||||
@@ -0,0 +1,209 @@
|
||||
function checkTagsQuantity() {
|
||||
var $tagLead = $('.tag-lead'),
|
||||
$tagsGroups = $('.tags-groups');
|
||||
|
||||
$tagsGroups.each(function(i) {
|
||||
var $children = $(this).children().length;
|
||||
$tagLead.eq(i).children('.badge').text($children);
|
||||
})
|
||||
}
|
||||
|
||||
function checkedLength() {
|
||||
var $card = $('.card'),
|
||||
$moduleTags,
|
||||
$defaultTags,
|
||||
$toDefault;
|
||||
function reload_links() {
|
||||
if($('.default-tags').length) {
|
||||
$moduleTags = $('.module-tags input[type="checkbox"]:checked');
|
||||
$defaultTags = $('.default-tags input[type="checkbox"]:checked');
|
||||
|
||||
if($moduleTags.length > 1 || $moduleTags.length+$defaultTags.length > 1) {
|
||||
$('#mergerTags').removeClass('hide');
|
||||
} else {
|
||||
$('#mergerTags').addClass('hide');
|
||||
};
|
||||
|
||||
if ($moduleTags.length > 0 || $defaultTags.length > 0) {
|
||||
$('#deselect').removeClass('hide');
|
||||
var ids = new Array();
|
||||
$defaultTags.each(function(i) {
|
||||
ids.push($defaultTags.eq(i).parent().siblings('.tag_id').val());
|
||||
});
|
||||
$moduleTags.each(function(i) {
|
||||
ids.push($moduleTags.eq(i).parent().siblings('.tag_id').val());
|
||||
});
|
||||
$('#deleteTags').attr('rel', "<%= Rails.application.routes.url_helpers.delete_tags_admin_tags_path %>" + "?ids=" + ids);
|
||||
$('#deleteTags').removeClass('hide');
|
||||
$('#deselect').on('click', deselect);
|
||||
} else {
|
||||
$('#deselect').addClass('hide');
|
||||
$('#deleteTags').attr('rel', "");
|
||||
$('#deleteTags').addClass('hide');
|
||||
$('#deselect').off('click', deselect);
|
||||
};
|
||||
|
||||
if ($moduleTags.length > 0 && $defaultTags.length == 0) {
|
||||
var ids = new Array();
|
||||
$moduleTags.each(function(i) {
|
||||
ids.push($moduleTags.eq(i).parent().siblings('.tag_id').val());
|
||||
});
|
||||
$('#addDefault').attr('href', "<%= Rails.application.routes.url_helpers.add_to_default_admin_tags_path %>" + "?ids=" + ids);
|
||||
$('#addDefault').removeClass('hide');
|
||||
} else {
|
||||
$('#addDefault').attr('href', "");
|
||||
$('#addDefault').addClass('hide');
|
||||
};
|
||||
} else {
|
||||
$moduleTags = $('.module-tags li.module input[type="checkbox"]:checked');
|
||||
$defaultTags = $('.module-tags li.default input[type="checkbox"]:checked');
|
||||
if($defaultTags.length > 0 || $moduleTags.length > 0) {
|
||||
$('#deselect').removeClass('hide');
|
||||
$('#deselect').on('click', deselect);
|
||||
if($defaultTags.length > 0 && $moduleTags.length > 0) {
|
||||
$('#deleteTags').attr('rel', "");
|
||||
$('#deleteTags').addClass('hide');
|
||||
$('#removeDefaults').attr('rel', "");
|
||||
$('#removeDefaults').addClass('hide');
|
||||
$('#mergerTags').addClass('hide');
|
||||
} else if ($defaultTags.length > 0) {
|
||||
var ids = new Array();
|
||||
$defaultTags.each(function(i) {
|
||||
ids.push($defaultTags.eq(i).parent().siblings('.tag_id').val());
|
||||
});
|
||||
$('#removeDefaults').attr('rel', "<%= Rails.application.routes.url_helpers.remove_default_admin_module_tags_path %>" + "?module_app_id=" + $('#module_app_id').val() + "&ids=" + ids);
|
||||
$('#removeDefaults').removeClass('hide');
|
||||
} else {
|
||||
var ids = new Array();
|
||||
$moduleTags.each(function(i) {
|
||||
ids.push($moduleTags.eq(i).parent().siblings('.tag_id').val());
|
||||
});
|
||||
$('#deleteTags').attr('rel', "<%= Rails.application.routes.url_helpers.delete_tags_admin_module_tags_path %>" + "?module_app_id=" + $('#module_app_id').val() + "&ids=" + ids);
|
||||
$('#deleteTags').removeClass('hide');
|
||||
if($moduleTags.length > 1) {
|
||||
$('#mergerTags').removeClass('hide');
|
||||
} else {
|
||||
$('#mergerTags').addClass('hide');
|
||||
};
|
||||
};
|
||||
} else {
|
||||
$('#deselect').addClass('hide');
|
||||
$('#deleteTags').attr('rel', "");
|
||||
$('#deleteTags').addClass('hide');
|
||||
$('#removeDefaults').attr('rel', "");
|
||||
$('#removeDefaults').addClass('hide');
|
||||
$('#mergerTags').addClass('hide');
|
||||
$('#deselect').off('click', deselect);
|
||||
};
|
||||
};
|
||||
}
|
||||
$card.on('click', function() {
|
||||
reload_links();
|
||||
});
|
||||
$('#selectAllTags').on('click', function() {
|
||||
$('.filter-item:not(".mark") input[type="checkbox"]').attr('checked', true);
|
||||
$('.filter-item:not(".mark") .card').addClass('active');
|
||||
reload_links();
|
||||
});
|
||||
$('#deleteTags').on('click', function() {
|
||||
$('#delete_tags .tags-groups').empty();
|
||||
$('#delete_tags a.delete-tags').attr("href", $(this).attr("rel"));
|
||||
if($defaultTags) {
|
||||
$defaultTags.each(function(i) {
|
||||
$defaultTags.eq(i).parents('.filter-item').clone().appendTo('#delete_tags .tags-groups');
|
||||
$('#delete_tags .tags-groups .filter-item').addClass('def');
|
||||
});
|
||||
}
|
||||
$moduleTags.each(function(i) {
|
||||
$moduleTags.eq(i).parents('.filter-item').clone().appendTo('#delete_tags .tags-groups');
|
||||
});
|
||||
$('#delete_tags').modal('show', cleanTagInputs());
|
||||
function cleanTagInputs(){
|
||||
var $tagsDelete = $('#delete_tags'),
|
||||
$filterItem = $tagsDelete.find('.filter-item');
|
||||
$filterItem.find('.card, .amount').remove();
|
||||
$filterItem.find('a').removeAttr('class');
|
||||
$filterItem.find('a').removeAttr('href');
|
||||
}
|
||||
});
|
||||
$('#mergerTags').on('click', function() {
|
||||
if($moduleTags || $defaultTags) {
|
||||
if($moduleTags.length > 1 || $moduleTags.length+$defaultTags.length > 1) {
|
||||
$('#tags-merger form').attr("action", $(this).attr("rel"));
|
||||
mergerTags()
|
||||
}
|
||||
}
|
||||
});
|
||||
$('#removeDefaults').on('click', function() {
|
||||
$('#remove_defaults .tags-groups').empty();
|
||||
$('#remove_defaults a.remove-defaults').attr("href", $(this).attr("rel"));
|
||||
$defaultTags.each(function(i) {
|
||||
$defaultTags.eq(i).parents('.filter-item').clone().appendTo('#remove_defaults .tags-groups');
|
||||
});
|
||||
$('#remove_defaults').modal('show', cleanTagInputs());
|
||||
function cleanTagInputs(){
|
||||
var $removeDefaults = $('#remove_defaults'),
|
||||
$filterItem = $removeDefaults.find('.filter-item');
|
||||
$filterItem.find('.card, .amount').remove();
|
||||
$filterItem.find('a').removeAttr('class');
|
||||
$filterItem.find('a').removeAttr('href');
|
||||
}
|
||||
});
|
||||
|
||||
function deselect() {
|
||||
$('.tags input[type="checkbox"]').attr('checked', false);
|
||||
$('.card').removeClass('active');
|
||||
$('.bottomnav .toggable').not('.open-slide').addClass('hide');
|
||||
$('#deleteTags').attr('rel', "<%= Rails.application.routes.url_helpers.delete_tags_admin_tags_path %>");
|
||||
$('#addDefault').attr('href', "<%= Rails.application.routes.url_helpers.add_to_default_admin_tags_path %>");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function addTagsTab() {
|
||||
$('a[data-toggle="tab"]').click(function (e) {
|
||||
e.preventDefault();
|
||||
$(this).tab('show');
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
function mergerTags() {
|
||||
var $moduleTags = $('.module-tags input[type="checkbox"]:checked'),
|
||||
$defaultTags = $('.default-tags input[type="checkbox"]:checked');
|
||||
|
||||
$defaultTags.each(function(i) {
|
||||
$defaultTags.eq(i).parents('.filter-item').clone().appendTo('#tags-merger .tags-groups');
|
||||
$('#tags-merger .tags-groups .filter-item').addClass('def');
|
||||
});
|
||||
$moduleTags.each(function(i) {
|
||||
$moduleTags.eq(i).parents('.filter-item').clone().appendTo('#tags-merger .tags-groups');
|
||||
});
|
||||
|
||||
$('#tags-merger').modal('show', changeTagName());
|
||||
function changeTagName() {
|
||||
var $tagsMerger = $('#tags-merger'),
|
||||
$newTagsName = $('.new-tags-name'),
|
||||
$filterItem = $tagsMerger.find('.filter-item');
|
||||
$filterItem.find('.card, .amount').remove();
|
||||
$filterItem.find('a').removeAttr('class');
|
||||
$filterItem.find('a').removeAttr('href');
|
||||
$filterItem.on('click', function() {
|
||||
$(this).find('.tag').each(function(i) {
|
||||
$newTagsName.eq(i).val($(this).text())
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
$(function() {
|
||||
if($('.default-tags').length) {
|
||||
// checkTagsQuantity();
|
||||
checkedLength();
|
||||
$('#tags-merger').on('hidden', function () {
|
||||
$(this).find('.filter-item').remove();
|
||||
});
|
||||
} else {
|
||||
checkedLength();
|
||||
};
|
||||
// addTagsTab();
|
||||
});
|
||||
Reference in new issue
Block a user