First commit
401
assets/js/SpryTabbedPanels.js
Executable file
@ -0,0 +1,401 @@
|
||||
// SpryTabbedPanels.js - version 0.7 - Spry Pre-Release 1.6.1
|
||||
//
|
||||
// Copyright (c) 2006. Adobe Systems Incorporated.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither the name of Adobe Systems Incorporated nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from this
|
||||
// software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
(function() { // BeginSpryComponent
|
||||
|
||||
if (typeof Spry == "undefined") window.Spry = {}; if (!Spry.Widget) Spry.Widget = {};
|
||||
|
||||
Spry.Widget.TabbedPanels = function(element, opts)
|
||||
{
|
||||
this.element = this.getElement(element);
|
||||
this.defaultTab = 0; // Show the first panel by default.
|
||||
this.tabSelectedClass = "TabbedPanelsTabSelected";
|
||||
this.tabHoverClass = "TabbedPanelsTabHover";
|
||||
this.tabFocusedClass = "TabbedPanelsTabFocused";
|
||||
this.panelVisibleClass = "TabbedPanelsContentVisible";
|
||||
this.focusElement = null;
|
||||
this.hasFocus = false;
|
||||
this.currentTabIndex = 0;
|
||||
this.enableKeyboardNavigation = true;
|
||||
this.nextPanelKeyCode = Spry.Widget.TabbedPanels.KEY_RIGHT;
|
||||
this.previousPanelKeyCode = Spry.Widget.TabbedPanels.KEY_LEFT;
|
||||
|
||||
Spry.Widget.TabbedPanels.setOptions(this, opts);
|
||||
|
||||
// If the defaultTab is expressed as a number/index, convert
|
||||
// it to an element.
|
||||
|
||||
if (typeof (this.defaultTab) == "number")
|
||||
{
|
||||
if (this.defaultTab < 0)
|
||||
this.defaultTab = 0;
|
||||
else
|
||||
{
|
||||
var count = this.getTabbedPanelCount();
|
||||
if (this.defaultTab >= count)
|
||||
this.defaultTab = (count > 1) ? (count - 1) : 0;
|
||||
}
|
||||
|
||||
this.defaultTab = this.getTabs()[this.defaultTab];
|
||||
}
|
||||
|
||||
// The defaultTab property is supposed to be the tab element for the tab content
|
||||
// to show by default. The caller is allowed to pass in the element itself or the
|
||||
// element's id, so we need to convert the current value to an element if necessary.
|
||||
|
||||
if (this.defaultTab)
|
||||
this.defaultTab = this.getElement(this.defaultTab);
|
||||
|
||||
this.attachBehaviors();
|
||||
};
|
||||
|
||||
Spry.Widget.TabbedPanels.prototype.getElement = function(ele)
|
||||
{
|
||||
if (ele && typeof ele == "string")
|
||||
return document.getElementById(ele);
|
||||
return ele;
|
||||
};
|
||||
|
||||
Spry.Widget.TabbedPanels.prototype.getElementChildren = function(element)
|
||||
{
|
||||
var children = [];
|
||||
var child = element.firstChild;
|
||||
while (child)
|
||||
{
|
||||
if (child.nodeType == 1 /* Node.ELEMENT_NODE */)
|
||||
children.push(child);
|
||||
child = child.nextSibling;
|
||||
}
|
||||
return children;
|
||||
};
|
||||
|
||||
Spry.Widget.TabbedPanels.prototype.addClassName = function(ele, className)
|
||||
{
|
||||
if (!ele || !className || (ele.className && ele.className.search(new RegExp("\\b" + className + "\\b")) != -1))
|
||||
return;
|
||||
ele.className += (ele.className ? " " : "") + className;
|
||||
};
|
||||
|
||||
Spry.Widget.TabbedPanels.prototype.removeClassName = function(ele, className)
|
||||
{
|
||||
if (!ele || !className || (ele.className && ele.className.search(new RegExp("\\b" + className + "\\b")) == -1))
|
||||
return;
|
||||
ele.className = ele.className.replace(new RegExp("\\s*\\b" + className + "\\b", "g"), "");
|
||||
};
|
||||
|
||||
Spry.Widget.TabbedPanels.setOptions = function(obj, optionsObj, ignoreUndefinedProps)
|
||||
{
|
||||
if (!optionsObj)
|
||||
return;
|
||||
for (var optionName in optionsObj)
|
||||
{
|
||||
if (ignoreUndefinedProps && optionsObj[optionName] == undefined)
|
||||
continue;
|
||||
obj[optionName] = optionsObj[optionName];
|
||||
}
|
||||
};
|
||||
|
||||
Spry.Widget.TabbedPanels.prototype.getTabGroup = function()
|
||||
{
|
||||
if (this.element)
|
||||
{
|
||||
var children = this.getElementChildren(this.element);
|
||||
if (children.length)
|
||||
return children[0];
|
||||
}
|
||||
return null;
|
||||
};
|
||||
|
||||
Spry.Widget.TabbedPanels.prototype.getTabs = function()
|
||||
{
|
||||
var tabs = [];
|
||||
var tg = this.getTabGroup();
|
||||
if (tg)
|
||||
tabs = this.getElementChildren(tg);
|
||||
return tabs;
|
||||
};
|
||||
|
||||
Spry.Widget.TabbedPanels.prototype.getContentPanelGroup = function()
|
||||
{
|
||||
if (this.element)
|
||||
{
|
||||
var children = this.getElementChildren(this.element);
|
||||
if (children.length > 1)
|
||||
return children[1];
|
||||
}
|
||||
return null;
|
||||
};
|
||||
|
||||
Spry.Widget.TabbedPanels.prototype.getContentPanels = function()
|
||||
{
|
||||
var panels = [];
|
||||
var pg = this.getContentPanelGroup();
|
||||
if (pg)
|
||||
panels = this.getElementChildren(pg);
|
||||
return panels;
|
||||
};
|
||||
|
||||
Spry.Widget.TabbedPanels.prototype.getIndex = function(ele, arr)
|
||||
{
|
||||
ele = this.getElement(ele);
|
||||
if (ele && arr && arr.length)
|
||||
{
|
||||
for (var i = 0; i < arr.length; i++)
|
||||
{
|
||||
if (ele == arr[i])
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
};
|
||||
|
||||
Spry.Widget.TabbedPanels.prototype.getTabIndex = function(ele)
|
||||
{
|
||||
var i = this.getIndex(ele, this.getTabs());
|
||||
if (i < 0)
|
||||
i = this.getIndex(ele, this.getContentPanels());
|
||||
return i;
|
||||
};
|
||||
|
||||
Spry.Widget.TabbedPanels.prototype.getCurrentTabIndex = function()
|
||||
{
|
||||
return this.currentTabIndex;
|
||||
};
|
||||
|
||||
Spry.Widget.TabbedPanels.prototype.getTabbedPanelCount = function(ele)
|
||||
{
|
||||
return Math.min(this.getTabs().length, this.getContentPanels().length);
|
||||
};
|
||||
|
||||
Spry.Widget.TabbedPanels.addEventListener = function(element, eventType, handler, capture)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (element.addEventListener)
|
||||
element.addEventListener(eventType, handler, capture);
|
||||
else if (element.attachEvent)
|
||||
element.attachEvent("on" + eventType, handler);
|
||||
}
|
||||
catch (e) {}
|
||||
};
|
||||
|
||||
Spry.Widget.TabbedPanels.prototype.cancelEvent = function(e)
|
||||
{
|
||||
if (e.preventDefault) e.preventDefault();
|
||||
else e.returnValue = false;
|
||||
if (e.stopPropagation) e.stopPropagation();
|
||||
else e.cancelBubble = true;
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
Spry.Widget.TabbedPanels.prototype.onTabClick = function(e, tab)
|
||||
{
|
||||
this.showPanel(tab);
|
||||
return this.cancelEvent(e);
|
||||
};
|
||||
|
||||
Spry.Widget.TabbedPanels.prototype.onTabMouseOver = function(e, tab)
|
||||
{
|
||||
this.addClassName(tab, this.tabHoverClass);
|
||||
return false;
|
||||
};
|
||||
|
||||
Spry.Widget.TabbedPanels.prototype.onTabMouseOut = function(e, tab)
|
||||
{
|
||||
this.removeClassName(tab, this.tabHoverClass);
|
||||
return false;
|
||||
};
|
||||
|
||||
Spry.Widget.TabbedPanels.prototype.onTabFocus = function(e, tab)
|
||||
{
|
||||
this.hasFocus = true;
|
||||
this.addClassName(tab, this.tabFocusedClass);
|
||||
return false;
|
||||
};
|
||||
|
||||
Spry.Widget.TabbedPanels.prototype.onTabBlur = function(e, tab)
|
||||
{
|
||||
this.hasFocus = false;
|
||||
this.removeClassName(tab, this.tabFocusedClass);
|
||||
return false;
|
||||
};
|
||||
|
||||
Spry.Widget.TabbedPanels.KEY_UP = 38;
|
||||
Spry.Widget.TabbedPanels.KEY_DOWN = 40;
|
||||
Spry.Widget.TabbedPanels.KEY_LEFT = 37;
|
||||
Spry.Widget.TabbedPanels.KEY_RIGHT = 39;
|
||||
|
||||
|
||||
|
||||
Spry.Widget.TabbedPanels.prototype.onTabKeyDown = function(e, tab)
|
||||
{
|
||||
var key = e.keyCode;
|
||||
if (!this.hasFocus || (key != this.previousPanelKeyCode && key != this.nextPanelKeyCode))
|
||||
return true;
|
||||
|
||||
var tabs = this.getTabs();
|
||||
for (var i =0; i < tabs.length; i++)
|
||||
if (tabs[i] == tab)
|
||||
{
|
||||
var el = false;
|
||||
if (key == this.previousPanelKeyCode && i > 0)
|
||||
el = tabs[i-1];
|
||||
else if (key == this.nextPanelKeyCode && i < tabs.length-1)
|
||||
el = tabs[i+1];
|
||||
|
||||
if (el)
|
||||
{
|
||||
this.showPanel(el);
|
||||
el.focus();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return this.cancelEvent(e);
|
||||
};
|
||||
|
||||
Spry.Widget.TabbedPanels.prototype.preorderTraversal = function(root, func)
|
||||
{
|
||||
var stopTraversal = false;
|
||||
if (root)
|
||||
{
|
||||
stopTraversal = func(root);
|
||||
if (root.hasChildNodes())
|
||||
{
|
||||
var child = root.firstChild;
|
||||
while (!stopTraversal && child)
|
||||
{
|
||||
stopTraversal = this.preorderTraversal(child, func);
|
||||
try { child = child.nextSibling; } catch (e) { child = null; }
|
||||
}
|
||||
}
|
||||
}
|
||||
return stopTraversal;
|
||||
};
|
||||
|
||||
Spry.Widget.TabbedPanels.prototype.addPanelEventListeners = function(tab, panel)
|
||||
{
|
||||
var self = this;
|
||||
Spry.Widget.TabbedPanels.addEventListener(tab, "click", function(e) { return self.onTabClick(e, tab); }, false);
|
||||
Spry.Widget.TabbedPanels.addEventListener(tab, "mouseover", function(e) { return self.onTabMouseOver(e, tab); }, false);
|
||||
Spry.Widget.TabbedPanels.addEventListener(tab, "mouseout", function(e) { return self.onTabMouseOut(e, tab); }, false);
|
||||
|
||||
if (this.enableKeyboardNavigation)
|
||||
{
|
||||
// XXX: IE doesn't allow the setting of tabindex dynamically. This means we can't
|
||||
// rely on adding the tabindex attribute if it is missing to enable keyboard navigation
|
||||
// by default.
|
||||
|
||||
// Find the first element within the tab container that has a tabindex or the first
|
||||
// anchor tag.
|
||||
|
||||
var tabIndexEle = null;
|
||||
var tabAnchorEle = null;
|
||||
|
||||
this.preorderTraversal(tab, function(node) {
|
||||
if (node.nodeType == 1 /* NODE.ELEMENT_NODE */)
|
||||
{
|
||||
var tabIndexAttr = tab.attributes.getNamedItem("tabindex");
|
||||
if (tabIndexAttr)
|
||||
{
|
||||
tabIndexEle = node;
|
||||
return true;
|
||||
}
|
||||
if (!tabAnchorEle && node.nodeName.toLowerCase() == "a")
|
||||
tabAnchorEle = node;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
|
||||
if (tabIndexEle)
|
||||
this.focusElement = tabIndexEle;
|
||||
else if (tabAnchorEle)
|
||||
this.focusElement = tabAnchorEle;
|
||||
|
||||
if (this.focusElement)
|
||||
{
|
||||
Spry.Widget.TabbedPanels.addEventListener(this.focusElement, "focus", function(e) { return self.onTabFocus(e, tab); }, false);
|
||||
Spry.Widget.TabbedPanels.addEventListener(this.focusElement, "blur", function(e) { return self.onTabBlur(e, tab); }, false);
|
||||
Spry.Widget.TabbedPanels.addEventListener(this.focusElement, "keydown", function(e) { return self.onTabKeyDown(e, tab); }, false);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Spry.Widget.TabbedPanels.prototype.showPanel = function(elementOrIndex)
|
||||
{
|
||||
var tpIndex = -1;
|
||||
|
||||
if (typeof elementOrIndex == "number")
|
||||
tpIndex = elementOrIndex;
|
||||
else // Must be the element for the tab or content panel.
|
||||
tpIndex = this.getTabIndex(elementOrIndex);
|
||||
|
||||
if (!tpIndex < 0 || tpIndex >= this.getTabbedPanelCount())
|
||||
return;
|
||||
|
||||
var tabs = this.getTabs();
|
||||
var panels = this.getContentPanels();
|
||||
|
||||
var numTabbedPanels = Math.max(tabs.length, panels.length);
|
||||
|
||||
for (var i = 0; i < numTabbedPanels; i++)
|
||||
{
|
||||
if (i != tpIndex)
|
||||
{
|
||||
if (tabs[i])
|
||||
this.removeClassName(tabs[i], this.tabSelectedClass);
|
||||
if (panels[i])
|
||||
{
|
||||
this.removeClassName(panels[i], this.panelVisibleClass);
|
||||
panels[i].style.display = "none";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this.addClassName(tabs[tpIndex], this.tabSelectedClass);
|
||||
this.addClassName(panels[tpIndex], this.panelVisibleClass);
|
||||
panels[tpIndex].style.display = "block";
|
||||
|
||||
this.currentTabIndex = tpIndex;
|
||||
};
|
||||
|
||||
Spry.Widget.TabbedPanels.prototype.attachBehaviors = function(element)
|
||||
{
|
||||
var tabs = this.getTabs();
|
||||
var panels = this.getContentPanels();
|
||||
var panelCount = this.getTabbedPanelCount();
|
||||
|
||||
for (var i = 0; i < panelCount; i++)
|
||||
this.addPanelEventListeners(tabs[i], panels[i]);
|
||||
|
||||
this.showPanel(this.defaultTab);
|
||||
};
|
||||
|
||||
})(); // EndSpryComponent
|
1065
assets/js/SpryTooltip.js
Executable file
2358
assets/js/SpryValidationTextField.js
Executable file
15
assets/js/aide_smiley.js
Executable file
@ -0,0 +1,15 @@
|
||||
//Affiche la liste des smiley pour l'aide
|
||||
function affiche_liste_smile_aide(destination, liste = liste_smile)
|
||||
{
|
||||
var source = "";
|
||||
|
||||
//On parcours la liste
|
||||
for (var i = 0; i < liste.length; i++) {
|
||||
|
||||
source = source + "<tr><td><img src='" + liste[i][1] + "' title='" + liste[i][2] + "' /></td><td>" + liste[i][2] + "</td></tr>";
|
||||
}
|
||||
|
||||
|
||||
//Enregistrement de la source générée
|
||||
document.getElementById(destination).innerHTML = source;
|
||||
}
|
26
assets/js/ajoutevolue.js
Executable file
@ -0,0 +1,26 @@
|
||||
// O2k7 skin (silver)
|
||||
tinyMCE.init({
|
||||
// General options
|
||||
mode : "exact",
|
||||
elements : "ajoutevolue",
|
||||
theme : "advanced",
|
||||
skin : "o2k7",
|
||||
skin_variant : "silver",
|
||||
plugins : "lists,pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,iespell,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template,inlinepopups",
|
||||
|
||||
// Theme options
|
||||
theme_advanced_buttons1 : "save,newdocument,print,|,bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,fontselect,fontsizeselect",
|
||||
theme_advanced_buttons2 : "pasteword,|,search,replace,|,bullist,numlist,|,outdent,indent,blockquote,|,undo,redo,|,link,unlink,removeformat,image,help,|,insertdate,inserttime,preview,|,forecolor,backcolor",
|
||||
theme_advanced_buttons3 : "tablecontrols,|,hr,visualaid,|,sub,sup,|,charmap,emotions,iespell,media,advhr,|,fullscreen",
|
||||
theme_advanced_toolbar_location : "top",
|
||||
theme_advanced_toolbar_align : "left",
|
||||
theme_advanced_statusbar_location : "bottom",
|
||||
theme_advanced_resizing : true,
|
||||
|
||||
// Drop lists for link/image/media/template dialogs
|
||||
template_external_list_url : "lists/template_list.js",
|
||||
external_link_list_url : "lists/link_list.js",
|
||||
external_image_list_url : "lists/image_list.js",
|
||||
media_external_list_url : "lists/media_list.js",
|
||||
|
||||
});
|
16
assets/js/ajoutsimple.js
Executable file
@ -0,0 +1,16 @@
|
||||
// O2k7 skin (silver)
|
||||
tinyMCE.init({
|
||||
// General options
|
||||
mode : "exact",
|
||||
elements : "ajoutsimple",
|
||||
theme : "advanced",
|
||||
skin : "o2k7",
|
||||
skin_variant : "silver",
|
||||
plugins : "lists,layer,advhr,table,advimage,advlink,emotions,iespell,searchreplace,print,contextmenu,directionality,visualchars,nonbreaking,xhtmlxtras,template,inlinepopups",
|
||||
|
||||
// Theme options
|
||||
theme_advanced_buttons1 : "bold,italic,underline,strikethrough|,search,|,bullist,numlist,|,undo,redo,|,link,unlink,image,|,forecolor,backcolor|,sub,sup,|,charmap,emotions,iespell,table",
|
||||
theme_advanced_toolbar_location : "bottom",
|
||||
theme_advanced_toolbar_align : "center",
|
||||
theme_advanced_resizing : false,
|
||||
});
|
81
assets/js/amisajax.js
Executable file
@ -0,0 +1,81 @@
|
||||
function loadAmis(file) {
|
||||
|
||||
//On v<>rifie si le flux est bien autoris<69>
|
||||
if(autoriser_flux_streaming_live == false)
|
||||
{
|
||||
console.log("La requete d'actualisation de la liste d'amis a ete bloquee en raison de la configuration de la page l'ayant demande.");
|
||||
return false;
|
||||
}
|
||||
|
||||
var xhr = new XMLHttpRequest();
|
||||
|
||||
// R<>cup<75>ration du contenu du fichier
|
||||
xhr.open('GET', file);
|
||||
|
||||
//Lorsque l'on est pret...
|
||||
xhr.onreadystatechange = function() {
|
||||
|
||||
//Compteur du nombre d'erreur de login
|
||||
compteur = document.getElementById('internet_error');
|
||||
|
||||
if (xhr.readyState == 4 && xhr.status == 200) {
|
||||
|
||||
document.getElementById('fileAmis').innerHTML = xhr.responseText;
|
||||
|
||||
if(compteur.innerHTML != 0)
|
||||
{
|
||||
var not = $.Notify({style: {background: 'green', color: 'white'}, content: "C'est bon. La connexion Internet est de retour ! :)"});
|
||||
//not.closeAll();
|
||||
}
|
||||
|
||||
//On remet le compteur des erreurs <20> 0
|
||||
compteur.innerHTML = 0;
|
||||
|
||||
} else if (xhr.readyState == 4 && xhr.status != 200) {
|
||||
|
||||
//document.getElementById('fileAmis').innerHTML = "<?php echo $lang[60]; ?>";
|
||||
|
||||
//Message d'erreur
|
||||
console.log("Il semblerait qu'il y a un probl<62>me de connexion Internet. V<>rifiez que tous les cables r<>seau sont branch<63>s ou que le Wi-Fi est activ<69>.");
|
||||
|
||||
if(compteur.innerHTML < 3)
|
||||
compteur.innerHTML = compteur.innerHTML + 1;
|
||||
else
|
||||
{
|
||||
var not = $.Notify({
|
||||
style: {background: 'red', color: 'white'},
|
||||
content: "Erreur de connexion Internet. Comunic ne parvient plus à se connecter à Internet. Veuillez vérifier la connexion Internet de votre ordinateur ou essayer de recharger la page.",
|
||||
timeout: 10000 // 10 seconds
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
xhr.send(null);
|
||||
|
||||
}
|
||||
|
||||
if(beaucoup_amis == true)
|
||||
{
|
||||
var complement = "&grandavatar";
|
||||
}
|
||||
else
|
||||
{
|
||||
var complement = "";
|
||||
}
|
||||
|
||||
if(debut_URL_liste_amis != "undefined")
|
||||
{
|
||||
var debut_URL = debut_URL_liste_amis;
|
||||
}
|
||||
else
|
||||
{
|
||||
var debut_URL = "";
|
||||
}
|
||||
|
||||
//Ex<45>cution de la requete
|
||||
loadAmis(debut_URL + 'amis.php?ajax' + complement);
|
||||
|
||||
//Timer pour actualiser toute les 10 secondes
|
||||
var last_activity=setInterval("loadAmis('" + debut_URL + "amis.php?ajax" + complement + "')", 10000); // r<>p<EFBFBD>te toutes les 10s
|
8
assets/js/avertissement_console.js
Executable file
@ -0,0 +1,8 @@
|
||||
console.log(" /\\ Attention : Si vous avez ouvert cette");
|
||||
console.log(" /||\\ console de developpement, c'est que quelqu'un");
|
||||
console.log(" / || \\ vous a demande de le faire ou que vous");
|
||||
console.log(" / || \\ souhaitez analyser et copier le code source de");
|
||||
console.log(" /___()___\\ Comunic. Sachez que la copie ou la reproduction");
|
||||
console.log("du code source de Comunic est formellement interdite, que le code");
|
||||
console.log("est place sous copyright. De plus, en utilisant cette console vous");
|
||||
console.log("risquez de placer votre compte dans un etat d'insecurite.");
|
53
assets/js/chat.js
Executable file
@ -0,0 +1,53 @@
|
||||
function getXMLHttpRequest() {
|
||||
var xhr = null;
|
||||
|
||||
if (window.XMLHttpRequest || window.ActiveXObject) {
|
||||
if (window.ActiveXObject) {
|
||||
try {
|
||||
xhr = new ActiveXObject("Msxml2.XMLHTTP");
|
||||
} catch(e) {
|
||||
xhr = new ActiveXObject("Microsoft.XMLHTTP");
|
||||
}
|
||||
} else {
|
||||
xhr = new XMLHttpRequest();
|
||||
}
|
||||
} else {
|
||||
alert("Votre navigateur ne supporte pas l'objet XMLHTTPRequest...");
|
||||
return null;
|
||||
}
|
||||
|
||||
return xhr;
|
||||
}
|
||||
|
||||
|
||||
function refreshChat()
|
||||
{
|
||||
var xhr = getXMLHttpRequest();
|
||||
xhr.onreadystatechange = function() {
|
||||
if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) {
|
||||
document.getElementById('contenuchat').innerHTML = xhr.responseText; // Donn<6E>es textuelles r<>cup<75>r<EFBFBD>es
|
||||
}
|
||||
};
|
||||
|
||||
xhr.open("GET", "chat.php?ajax=1", true);
|
||||
xhr.send(null);
|
||||
}
|
||||
|
||||
function submitChat()
|
||||
{
|
||||
var xhr = getXMLHttpRequest();
|
||||
var message = encodeURIComponent(document.getElementById('message').value);
|
||||
document.getElementById('message').value = ""; // on vide le message sur la page
|
||||
|
||||
xhr.onreadystatechange = function() {
|
||||
if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) {
|
||||
document.getElementById('contenuchat').innerHTML = xhr.responseText; // Donn<6E>es textuelles r<>cup<75>r<EFBFBD>es
|
||||
}
|
||||
};
|
||||
|
||||
xhr.open("POST", "chat.php?ajax=1", true);
|
||||
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
|
||||
xhr.send("message="+message);
|
||||
|
||||
}
|
||||
var timer=setInterval("refreshChat()", 5000); // r<>p<EFBFBD>te toutes les 5s
|
32
assets/js/commentairesmobile.js
Executable file
@ -0,0 +1,32 @@
|
||||
//Script d'affichage des commentaires mobile avec une requete ajax
|
||||
function requeteajaxcommentairesmobiles(file, balisescommentaires) {
|
||||
|
||||
var xhr = new XMLHttpRequest();
|
||||
|
||||
// R<>cup<75>ration du contenu du fichier
|
||||
xhr.open('GET', file);
|
||||
|
||||
xhr.onreadystatechange = function() {
|
||||
|
||||
if (xhr.readyState == 4 && xhr.status == 200) {
|
||||
|
||||
document.getElementById(balisescommentaires).innerHTML = xhr.responseText;
|
||||
|
||||
} else if (xhr.readyState == 4 && xhr.status != 200) {
|
||||
|
||||
document.getElementById(balisescommentaires).innerHTML = 'Une erreur est survenue. Merci de r<>essayer ult<6C>rieurment. ';
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
xhr.send(null);
|
||||
|
||||
}
|
||||
|
||||
function affichecommentaire(file, id)
|
||||
{
|
||||
var pathfile = file + '?id=' + id;
|
||||
var balisescommentaires = 'commentaires' + id;
|
||||
var commentaires = requeteajaxcommentairesmobiles(pathfile, balisescommentaires);
|
||||
}
|
1
assets/js/confirmdeleteaccount.js
Executable file
@ -0,0 +1 @@
|
||||
/*Service Pierre 2014*/
|
67
assets/js/countdown.js
Executable file
@ -0,0 +1,67 @@
|
||||
//Countdown for Comunic (c) all rights reserved
|
||||
//Made in 2015
|
||||
|
||||
//Fonction de lancement du compteur
|
||||
function launch_countdown(timestamp_end, id)
|
||||
{
|
||||
setInterval("count_down(" + timestamp_end + ", '" + id + "');", 1000);
|
||||
}
|
||||
|
||||
//Fonction de correction de l'affichage en cas d'un seul chiffre (ajout d'un 0)
|
||||
function fix_countd(nb)
|
||||
{
|
||||
if(nb < 10)
|
||||
return "0" + nb;
|
||||
else
|
||||
return nb;
|
||||
}
|
||||
|
||||
//Fonction d'exécution du compteur
|
||||
function count_down(timestamp_end, id)
|
||||
{
|
||||
var days = 24*60*60,
|
||||
hours = 60*60,
|
||||
minutes = 60;
|
||||
|
||||
//On détermine le temps restant
|
||||
//Définition des variables
|
||||
var now, left, d, h, m, s;
|
||||
|
||||
//Temps actuel
|
||||
now = new Date() / 1000;
|
||||
|
||||
//Temps restant
|
||||
left = Math.floor(timestamp_end - now);
|
||||
|
||||
//On passe le temps restant à 0 si nécessaire
|
||||
if(left < 0){
|
||||
left = left*(-1);
|
||||
}
|
||||
|
||||
// Number of days left
|
||||
d = Math.floor(left / days);
|
||||
left -= d*days;
|
||||
|
||||
// Number of hours left
|
||||
h = Math.floor(left / hours);
|
||||
left -= h*hours;
|
||||
|
||||
// Number of minutes left
|
||||
m = Math.floor(left / minutes);
|
||||
left -= m*minutes;
|
||||
|
||||
// Number of seconds left
|
||||
s = left;
|
||||
|
||||
//Correction des nombres
|
||||
d = fix_countd(d);
|
||||
h = fix_countd(h);
|
||||
m = fix_countd(m);
|
||||
s = fix_countd(s);
|
||||
|
||||
//Détermination de l'affichage du compteur
|
||||
var afficher = d + ":" + h + ":" + m + ":" + s;
|
||||
|
||||
//Affichage du compteur à rebours
|
||||
document.getElementById(id).innerHTML = afficher;
|
||||
}
|
19
assets/js/countdown_countdown.js.js
Executable file
@ -0,0 +1,19 @@
|
||||
/*
|
||||
countdown.js v2.5.2 http://countdownjs.org
|
||||
Copyright (c)2006-2014 Stephen M. McKamey.
|
||||
Licensed under The MIT License.
|
||||
*/
|
||||
var module,countdown=function(y){function C(a,b){var c=a.getTime();a.setMonth(a.getMonth()+b);return Math.round((a.getTime()-c)/864E5)}function z(a){var b=a.getTime(),c=new Date(b);c.setMonth(a.getMonth()+1);return Math.round((c.getTime()-b)/864E5)}function A(a,b){b=b instanceof Date||null!==b&&isFinite(b)?new Date(+b):new Date;if(!a)return b;var c=+a.value||0;if(c)return b.setTime(b.getTime()+c),b;(c=+a.milliseconds||0)&&b.setMilliseconds(b.getMilliseconds()+c);(c=+a.seconds||0)&&b.setSeconds(b.getSeconds()+
|
||||
c);(c=+a.minutes||0)&&b.setMinutes(b.getMinutes()+c);(c=+a.hours||0)&&b.setHours(b.getHours()+c);(c=+a.weeks||0)&&(c*=7);(c+=+a.days||0)&&b.setDate(b.getDate()+c);(c=+a.months||0)&&b.setMonth(b.getMonth()+c);(c=+a.millennia||0)&&(c*=10);(c+=+a.centuries||0)&&(c*=10);(c+=+a.decades||0)&&(c*=10);(c+=+a.years||0)&&b.setFullYear(b.getFullYear()+c);return b}function l(a,b){return v(a)+(1===a?w[b]:x[b])}function q(){}function n(a,b,c,d,f,m){0<=a[c]&&(b+=a[c],delete a[c]);b/=f;if(1>=b+1)return 0;if(0<=a[d]){a[d]=
|
||||
+(a[d]+b).toFixed(m);switch(d){case "seconds":if(60!==a.seconds||isNaN(a.minutes))break;a.minutes++;a.seconds=0;case "minutes":if(60!==a.minutes||isNaN(a.hours))break;a.hours++;a.minutes=0;case "hours":if(24!==a.hours||isNaN(a.days))break;a.days++;a.hours=0;case "days":if(7!==a.days||isNaN(a.weeks))break;a.weeks++;a.days=0;case "weeks":if(a.weeks!==z(a.refMonth)/7||isNaN(a.months))break;a.months++;a.weeks=0;case "months":if(12!==a.months||isNaN(a.years))break;a.years++;a.months=0;case "years":if(10!==
|
||||
a.years||isNaN(a.decades))break;a.decades++;a.years=0;case "decades":if(10!==a.decades||isNaN(a.centuries))break;a.centuries++;a.decades=0;case "centuries":if(10!==a.centuries||isNaN(a.millennia))break;a.millennia++;a.centuries=0}return 0}return b}function D(a,b,c,d,f,m){var k=new Date;a.start=b=b||k;a.end=c=c||k;a.units=d;a.value=c.getTime()-b.getTime();0>a.value&&(k=c,c=b,b=k);a.refMonth=new Date(b.getFullYear(),b.getMonth(),15,12,0,0);try{a.millennia=0;a.centuries=0;a.decades=0;a.years=c.getFullYear()-
|
||||
b.getFullYear();a.months=c.getMonth()-b.getMonth();a.weeks=0;a.days=c.getDate()-b.getDate();a.hours=c.getHours()-b.getHours();a.minutes=c.getMinutes()-b.getMinutes();a.seconds=c.getSeconds()-b.getSeconds();a.milliseconds=c.getMilliseconds()-b.getMilliseconds();var g;0>a.milliseconds?(g=s(-a.milliseconds/1E3),a.seconds-=g,a.milliseconds+=1E3*g):1E3<=a.milliseconds&&(a.seconds+=p(a.milliseconds/1E3),a.milliseconds%=1E3);0>a.seconds?(g=s(-a.seconds/60),a.minutes-=g,a.seconds+=60*g):60<=a.seconds&&(a.minutes+=
|
||||
p(a.seconds/60),a.seconds%=60);0>a.minutes?(g=s(-a.minutes/60),a.hours-=g,a.minutes+=60*g):60<=a.minutes&&(a.hours+=p(a.minutes/60),a.minutes%=60);0>a.hours?(g=s(-a.hours/24),a.days-=g,a.hours+=24*g):24<=a.hours&&(a.days+=p(a.hours/24),a.hours%=24);for(;0>a.days;)a.months--,a.days+=C(a.refMonth,1);7<=a.days&&(a.weeks+=p(a.days/7),a.days%=7);0>a.months?(g=s(-a.months/12),a.years-=g,a.months+=12*g):12<=a.months&&(a.years+=p(a.months/12),a.months%=12);10<=a.years&&(a.decades+=p(a.years/10),a.years%=
|
||||
10,10<=a.decades&&(a.centuries+=p(a.decades/10),a.decades%=10,10<=a.centuries&&(a.millennia+=p(a.centuries/10),a.centuries%=10)));b=0;!(d&1024)||b>=f?(a.centuries+=10*a.millennia,delete a.millennia):a.millennia&&b++;!(d&512)||b>=f?(a.decades+=10*a.centuries,delete a.centuries):a.centuries&&b++;!(d&256)||b>=f?(a.years+=10*a.decades,delete a.decades):a.decades&&b++;!(d&128)||b>=f?(a.months+=12*a.years,delete a.years):a.years&&b++;!(d&64)||b>=f?(a.months&&(a.days+=C(a.refMonth,a.months)),delete a.months,
|
||||
7<=a.days&&(a.weeks+=p(a.days/7),a.days%=7)):a.months&&b++;!(d&32)||b>=f?(a.days+=7*a.weeks,delete a.weeks):a.weeks&&b++;!(d&16)||b>=f?(a.hours+=24*a.days,delete a.days):a.days&&b++;!(d&8)||b>=f?(a.minutes+=60*a.hours,delete a.hours):a.hours&&b++;!(d&4)||b>=f?(a.seconds+=60*a.minutes,delete a.minutes):a.minutes&&b++;!(d&2)||b>=f?(a.milliseconds+=1E3*a.seconds,delete a.seconds):a.seconds&&b++;if(!(d&1)||b>=f){var h=n(a,0,"milliseconds","seconds",1E3,m);if(h&&(h=n(a,h,"seconds","minutes",60,m))&&(h=
|
||||
n(a,h,"minutes","hours",60,m))&&(h=n(a,h,"hours","days",24,m))&&(h=n(a,h,"days","weeks",7,m))&&(h=n(a,h,"weeks","months",z(a.refMonth)/7,m))){d=h;var e,l=a.refMonth,q=l.getTime(),r=new Date(q);r.setFullYear(l.getFullYear()+1);e=Math.round((r.getTime()-q)/864E5);if(h=n(a,d,"months","years",e/z(a.refMonth),m))if(h=n(a,h,"years","decades",10,m))if(h=n(a,h,"decades","centuries",10,m))if(h=n(a,h,"centuries","millennia",10,m))throw Error("Fractional unit overflow");}}}finally{delete a.refMonth}return a}
|
||||
function e(a,b,c,d,f){var e;c=+c||222;d=0<d?d:NaN;f=0<f?20>f?Math.round(f):20:0;var k=null;"function"===typeof a?(e=a,a=null):a instanceof Date||(null!==a&&isFinite(a)?a=new Date(+a):("object"===typeof k&&(k=a),a=null));var g=null;"function"===typeof b?(e=b,b=null):b instanceof Date||(null!==b&&isFinite(b)?b=new Date(+b):("object"===typeof b&&(g=b),b=null));k&&(a=A(k,b));g&&(b=A(g,a));if(!a&&!b)return new q;if(!e)return D(new q,a,b,c,d,f);var k=c&1?1E3/30:c&2?1E3:c&4?6E4:c&8?36E5:c&16?864E5:6048E5,
|
||||
h,g=function(){e(D(new q,a,b,c,d,f),h)};g();return h=setInterval(g,k)}var s=Math.ceil,p=Math.floor,w,x,r,t,u,v,B;q.prototype.toString=function(a){var b=B(this),c=b.length;if(!c)return a?""+a:u;if(1===c)return b[0];a=r+b.pop();return b.join(t)+a};q.prototype.toHTML=function(a,b){a=a||"span";var c=B(this),d=c.length;if(!d)return(b=b||u)?"\x3c"+a+"\x3e"+b+"\x3c/"+a+"\x3e":b;for(var f=0;f<d;f++)c[f]="\x3c"+a+"\x3e"+c[f]+"\x3c/"+a+"\x3e";if(1===d)return c[0];d=r+c.pop();return c.join(t)+d};q.prototype.addTo=
|
||||
function(a){return A(this,a)};B=function(a){var b=[],c=a.millennia;c&&b.push(l(c,10));(c=a.centuries)&&b.push(l(c,9));(c=a.decades)&&b.push(l(c,8));(c=a.years)&&b.push(l(c,7));(c=a.months)&&b.push(l(c,6));(c=a.weeks)&&b.push(l(c,5));(c=a.days)&&b.push(l(c,4));(c=a.hours)&&b.push(l(c,3));(c=a.minutes)&&b.push(l(c,2));(c=a.seconds)&&b.push(l(c,1));(c=a.milliseconds)&&b.push(l(c,0));return b};e.MILLISECONDS=1;e.SECONDS=2;e.MINUTES=4;e.HOURS=8;e.DAYS=16;e.WEEKS=32;e.MONTHS=64;e.YEARS=128;e.DECADES=256;
|
||||
e.CENTURIES=512;e.MILLENNIA=1024;e.DEFAULTS=222;e.ALL=2047;e.setLabels=function(a,b,c,d,f,e){a=a||[];a.split&&(a=a.split("|"));b=b||[];b.split&&(b=b.split("|"));for(var k=0;10>=k;k++)w[k]=a[k]||w[k],x[k]=b[k]||x[k];r="string"===typeof c?c:r;t="string"===typeof d?d:t;u="string"===typeof f?f:u;v="function"===typeof e?e:v};(e.resetLabels=function(){w=" millisecond; second; minute; hour; day; week; month; year; decade; century; millennium".split(";");x=" milliseconds; seconds; minutes; hours; days; weeks; months; years; decades; centuries; millennia".split(";");
|
||||
r=" and ";t=", ";u="";v=function(a){return a}})();y&&y.exports?y.exports=e:"function"===typeof window.define&&"undefined"!==typeof window.define.amd&&window.define("countdown",[],function(){return e});return e}(module);
|
1549
assets/js/global.js
Executable file
22
assets/js/global.php
Executable file
@ -0,0 +1,22 @@
|
||||
<?php
|
||||
//Envoi des en-têtes
|
||||
header('Pragma: ');
|
||||
header('Connection: Keep-Alive');
|
||||
header('Cache-Control: max-age=1800');
|
||||
header('Content-Type: application/x-javascript');
|
||||
header('Keep-Alive: timeout=5, max=100');
|
||||
header('Last-Modified: '.gmdate('D, d M Y H:i:s \G\M\T', time()));
|
||||
header('Date: '.gmdate('D, d M Y H:i:s \G\M\T', time()));
|
||||
header('Expires: '.gmdate('D, d M Y H:i:s \G\M\T', strtotime('+ 1 year')));
|
||||
header('Expires: '.gmdate('D, d M Y H:i:s \G\M\T', strtotime('+ 1 year')));
|
||||
|
||||
//Récupération du contenu du fichier
|
||||
//if(preg_match('<ie>', $_SERVER['REQUEST_URI']))
|
||||
// $source = file_get_contents('global_ie.js');
|
||||
//else
|
||||
$source = file_get_contents('header_global.js');
|
||||
$source = $source.file_get_contents('global.js');
|
||||
|
||||
//Affichage de la source
|
||||
echo $source;
|
||||
?>
|
1500
assets/js/global_ie.js
Executable file
21
assets/js/grand_dialogue_smiley.js
Executable file
@ -0,0 +1,21 @@
|
||||
//Fichier de gestion de l'affichage de la liste de propostions de smiley pour le chat privé entre autre...
|
||||
//Tous droits réservés à Pierre HUBERT, créateur de Comunic. Ce fichier a été créé en avril 2015
|
||||
|
||||
//Ouverture de la boîte de dialogues
|
||||
function ouvre_grande_liste_smiley(id)
|
||||
{
|
||||
dialogue = document.createElement("div");
|
||||
dialogue.id = "grande_boite_dialogues_smiley";
|
||||
dialogue.innerHTML = "";
|
||||
|
||||
//On parcours la liste
|
||||
var source = "<input type='button' value='Fermer' class='close_grand_dialogue_smiley' onClick='this.parentNode.id=\"none\"; this.parentNode.style.display=\"none\"; this.parentNode.style.position=\"absolute\";' />";
|
||||
for (var i = 0; i < liste_smile.length; i++) {
|
||||
|
||||
source = source + "<div><img onClick='" + 'document.getElementById("' + id + '").innerHTML = document.getElementById("' + id + '").innerHTML + "'+liste_smile[i][0]+'"' + "' src='" + liste_smile[i][1] + "' title='" + liste_smile[i][2] + "' /></div>";
|
||||
}
|
||||
|
||||
dialogue.innerHTML = dialogue.innerHTML + source;
|
||||
|
||||
document.body.appendChild(dialogue);
|
||||
}
|
33
assets/js/groupes.js
Executable file
@ -0,0 +1,33 @@
|
||||
//Fonctions des groupes
|
||||
// (c) Comunic 2015
|
||||
|
||||
//Fonction d'affichage du menu de choix de groupe
|
||||
function affiche_formulaire_groupes(input_choice)
|
||||
{
|
||||
parent = input_choice.parentNode.parentNode.parentNode.parentNode;
|
||||
|
||||
//On vérifie si un formulaire de changement de groupe a déjà été proposé
|
||||
if(parent.innerHTML.indexOf('choix_groupe') != -1)
|
||||
{
|
||||
//
|
||||
}
|
||||
else
|
||||
{
|
||||
//Ajout du formulaire
|
||||
var formulaire = document.createElement('div');
|
||||
formulaire.innerHTML = "<div class='choix_groupe'>Choix des groupes : <a href='parametres.php?c=groupe_personnes'><img src='img/edit.png' class='img_change_groupes' /></a>";
|
||||
|
||||
//Parcous de la liste
|
||||
//Parcours du tableau
|
||||
for (var i = 0, div ; i < liste_groupes.length ; i++) {
|
||||
//On vérifie que le résultat est correct
|
||||
if(liste_groupes[i].length == 2)
|
||||
{
|
||||
formulaire.innerHTML = formulaire.innerHTML + "<label><input type='checkbox' name='liste_groupes[" + liste_groupes[i][0] + "]' />" + liste_groupes[i][1] + "</label>";
|
||||
}
|
||||
}
|
||||
formulaire.innerHMTL =+ "</div>";
|
||||
parent.appendChild(formulaire);
|
||||
|
||||
}
|
||||
}
|
206
assets/js/header_global.js
Executable file
419
assets/js/holder/holder.js
Executable file
@ -0,0 +1,419 @@
|
||||
/*
|
||||
|
||||
Holder - 2.0 - client side image placeholders
|
||||
(c) 2012-2013 Ivan Malopinsky / http://imsky.co
|
||||
|
||||
Provided under the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0
|
||||
Commercial use requires attribution.
|
||||
|
||||
*/
|
||||
|
||||
var Holder = Holder || {};
|
||||
(function (app, win) {
|
||||
|
||||
var preempted = false,
|
||||
fallback = false,
|
||||
canvas = document.createElement('canvas');
|
||||
|
||||
//getElementsByClassName polyfill
|
||||
document.getElementsByClassName||(document.getElementsByClassName=function(e){var t=document,n,r,i,s=[];if(t.querySelectorAll)return t.querySelectorAll("."+e);if(t.evaluate){r=".//*[contains(concat(' ', @class, ' '), ' "+e+" ')]",n=t.evaluate(r,t,null,0,null);while(i=n.iterateNext())s.push(i)}else{n=t.getElementsByTagName("*"),r=new RegExp("(^|\\s)"+e+"(\\s|$)");for(i=0;i<n.length;i++)r.test(n[i].className)&&s.push(n[i])}return s})
|
||||
|
||||
//getComputedStyle polyfill
|
||||
window.getComputedStyle||(window.getComputedStyle=function(e,t){return this.el=e,this.getPropertyValue=function(t){var n=/(\-([a-z]){1})/g;return t=="float"&&(t="styleFloat"),n.test(t)&&(t=t.replace(n,function(){return arguments[2].toUpperCase()})),e.currentStyle[t]?e.currentStyle[t]:null},this})
|
||||
|
||||
//http://javascript.nwbox.com/ContentLoaded by Diego Perini with modifications
|
||||
function contentLoaded(n,t){var l="complete",s="readystatechange",u=!1,h=u,c=!0,i=n.document,a=i.documentElement,e=i.addEventListener?"addEventListener":"attachEvent",v=i.addEventListener?"removeEventListener":"detachEvent",f=i.addEventListener?"":"on",r=function(e){(e.type!=s||i.readyState==l)&&((e.type=="load"?n:i)[v](f+e.type,r,u),!h&&(h=!0)&&t.call(n,null))},o=function(){try{a.doScroll("left")}catch(n){setTimeout(o,50);return}r("poll")};if(i.readyState==l)t.call(n,"lazy");else{if(i.createEventObject&&a.doScroll){try{c=!n.frameElement}catch(y){}c&&o()}i[e](f+"DOMContentLoaded",r,u),i[e](f+s,r,u),n[e](f+"load",r,u)}};
|
||||
|
||||
//https://gist.github.com/991057 by Jed Schmidt with modifications
|
||||
function selector(a){
|
||||
a=a.match(/^(\W)?(.*)/);var b=document["getElement"+(a[1]?a[1]=="#"?"ById":"sByClassName":"sByTagName")](a[2]);
|
||||
var ret=[]; b!=null&&(b.length?ret=b:b.length==0?ret=b:ret=[b]); return ret;
|
||||
}
|
||||
|
||||
//shallow object property extend
|
||||
function extend(a,b){var c={};for(var d in a)c[d]=a[d];for(var e in b)c[e]=b[e];return c}
|
||||
|
||||
//hasOwnProperty polyfill
|
||||
if (!Object.prototype.hasOwnProperty)
|
||||
Object.prototype.hasOwnProperty = function(prop) {
|
||||
var proto = this.__proto__ || this.constructor.prototype;
|
||||
return (prop in this) && (!(prop in proto) || proto[prop] !== this[prop]);
|
||||
}
|
||||
|
||||
function text_size(width, height, template) {
|
||||
height = parseInt(height,10);
|
||||
width = parseInt(width,10);
|
||||
var bigSide = Math.max(height, width)
|
||||
var smallSide = Math.min(height, width)
|
||||
var scale = 1 / 12;
|
||||
var newHeight = Math.min(smallSide * 0.75, 0.75 * bigSide * scale);
|
||||
return {
|
||||
height: Math.round(Math.max(template.size, newHeight))
|
||||
}
|
||||
}
|
||||
|
||||
function draw(ctx, dimensions, template, ratio) {
|
||||
var ts = text_size(dimensions.width, dimensions.height, template);
|
||||
var text_height = ts.height;
|
||||
var width = dimensions.width * ratio,
|
||||
height = dimensions.height * ratio;
|
||||
var font = template.font ? template.font : "sans-serif";
|
||||
canvas.width = width;
|
||||
canvas.height = height;
|
||||
ctx.textAlign = "center";
|
||||
ctx.textBaseline = "middle";
|
||||
ctx.fillStyle = template.background;
|
||||
ctx.fillRect(0, 0, width, height);
|
||||
ctx.fillStyle = template.foreground;
|
||||
ctx.font = "bold " + text_height + "px " + font;
|
||||
var text = template.text ? template.text : (Math.floor(dimensions.width) + "x" + Math.floor(dimensions.height));
|
||||
var text_width = ctx.measureText(text).width;
|
||||
if (text_width / width >= 0.75) {
|
||||
text_height = Math.floor(text_height * 0.75 * (width/text_width));
|
||||
}
|
||||
//Resetting font size if necessary
|
||||
ctx.font = "bold " + (text_height * ratio) + "px " + font;
|
||||
ctx.fillText(text, (width / 2), (height / 2), width);
|
||||
return canvas.toDataURL("image/png");
|
||||
}
|
||||
|
||||
function render(mode, el, holder, src) {
|
||||
var dimensions = holder.dimensions,
|
||||
theme = holder.theme,
|
||||
text = holder.text ? decodeURIComponent(holder.text) : holder.text;
|
||||
var dimensions_caption = dimensions.width + "x" + dimensions.height;
|
||||
theme = (text ? extend(theme, {
|
||||
text: text
|
||||
}) : theme);
|
||||
theme = (holder.font ? extend(theme, {
|
||||
font: holder.font
|
||||
}) : theme);
|
||||
if (mode == "image") {
|
||||
el.setAttribute("data-src", src);
|
||||
el.setAttribute("alt", text ? text : theme.text ? theme.text + " [" + dimensions_caption + "]" : dimensions_caption);
|
||||
if (fallback || !holder.auto) {
|
||||
el.style.width = dimensions.width + "px";
|
||||
el.style.height = dimensions.height + "px";
|
||||
}
|
||||
if (fallback) {
|
||||
el.style.backgroundColor = theme.background;
|
||||
} else {
|
||||
el.setAttribute("src", draw(ctx, dimensions, theme, ratio));
|
||||
}
|
||||
} else if (mode == "background") {
|
||||
if (!fallback) {
|
||||
el.style.backgroundImage = "url(" + draw(ctx, dimensions, theme, ratio) + ")";
|
||||
el.style.backgroundSize = dimensions.width + "px " + dimensions.height + "px";
|
||||
}
|
||||
} else if (mode == "fluid") {
|
||||
el.setAttribute("data-src", src);
|
||||
el.setAttribute("alt", text ? text : theme.text ? theme.text + " [" + dimensions_caption + "]" : dimensions_caption);
|
||||
if (dimensions.height.substr(-1) == "%") {
|
||||
el.style.height = dimensions.height
|
||||
} else {
|
||||
el.style.height = dimensions.height + "px"
|
||||
}
|
||||
if (dimensions.width.substr(-1) == "%") {
|
||||
el.style.width = dimensions.width
|
||||
} else {
|
||||
el.style.width = dimensions.width + "px"
|
||||
}
|
||||
if (el.style.display == "inline" || el.style.display == "") {
|
||||
el.style.display = "block";
|
||||
}
|
||||
if (fallback) {
|
||||
el.style.backgroundColor = theme.background;
|
||||
} else {
|
||||
el.holderData = holder;
|
||||
fluid_images.push(el);
|
||||
fluid_update(el);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function fluid_update(element) {
|
||||
var images;
|
||||
if (element.nodeType == null) {
|
||||
images = fluid_images;
|
||||
} else {
|
||||
images = [element]
|
||||
}
|
||||
for (i in images) {
|
||||
var el = images[i]
|
||||
if (el.holderData) {
|
||||
var holder = el.holderData;
|
||||
el.setAttribute("src", draw(ctx, {
|
||||
height: el.clientHeight,
|
||||
width: el.clientWidth
|
||||
}, holder.theme, ratio));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function parse_flags(flags, options) {
|
||||
|
||||
var ret = {
|
||||
theme: settings.themes.gray
|
||||
}, render = false;
|
||||
|
||||
for (sl = flags.length, j = 0; j < sl; j++) {
|
||||
var flag = flags[j];
|
||||
if (app.flags.dimensions.match(flag)) {
|
||||
render = true;
|
||||
ret.dimensions = app.flags.dimensions.output(flag);
|
||||
} else if (app.flags.fluid.match(flag)) {
|
||||
render = true;
|
||||
ret.dimensions = app.flags.fluid.output(flag);
|
||||
ret.fluid = true;
|
||||
} else if (app.flags.colors.match(flag)) {
|
||||
ret.theme = app.flags.colors.output(flag);
|
||||
} else if (options.themes[flag]) {
|
||||
//If a theme is specified, it will override custom colors
|
||||
ret.theme = options.themes[flag];
|
||||
} else if (app.flags.text.match(flag)) {
|
||||
ret.text = app.flags.text.output(flag);
|
||||
} else if (app.flags.font.match(flag)) {
|
||||
ret.font = app.flags.font.output(flag);
|
||||
} else if (app.flags.auto.match(flag)) {
|
||||
ret.auto = true;
|
||||
}
|
||||
}
|
||||
|
||||
return render ? ret : false;
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
if (!canvas.getContext) {
|
||||
fallback = true;
|
||||
} else {
|
||||
if (canvas.toDataURL("image/png")
|
||||
.indexOf("data:image/png") < 0) {
|
||||
//Android doesn't support data URI
|
||||
fallback = true;
|
||||
} else {
|
||||
var ctx = canvas.getContext("2d");
|
||||
}
|
||||
}
|
||||
|
||||
var dpr = 1, bsr = 1;
|
||||
|
||||
if(!fallback){
|
||||
dpr = window.devicePixelRatio || 1,
|
||||
bsr = ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.msBackingStorePixelRatio || ctx.oBackingStorePixelRatio || ctx.backingStorePixelRatio || 1;
|
||||
}
|
||||
|
||||
var ratio = dpr / bsr;
|
||||
|
||||
var fluid_images = [];
|
||||
|
||||
var settings = {
|
||||
domain: "holder.js",
|
||||
images: "img",
|
||||
bgnodes: ".holderjs",
|
||||
themes: {
|
||||
"gray": {
|
||||
background: "#eee",
|
||||
foreground: "#aaa",
|
||||
size: 12
|
||||
},
|
||||
"social": {
|
||||
background: "#3a5a97",
|
||||
foreground: "#fff",
|
||||
size: 12
|
||||
},
|
||||
"industrial": {
|
||||
background: "#434A52",
|
||||
foreground: "#C2F200",
|
||||
size: 12
|
||||
}
|
||||
},
|
||||
stylesheet: ""
|
||||
};
|
||||
|
||||
|
||||
app.flags = {
|
||||
dimensions: {
|
||||
regex: /^(\d+)x(\d+)$/,
|
||||
output: function (val) {
|
||||
var exec = this.regex.exec(val);
|
||||
return {
|
||||
width: +exec[1],
|
||||
height: +exec[2]
|
||||
}
|
||||
}
|
||||
},
|
||||
fluid: {
|
||||
regex: /^([0-9%]+)x([0-9%]+)$/,
|
||||
output: function (val) {
|
||||
var exec = this.regex.exec(val);
|
||||
return {
|
||||
width: exec[1],
|
||||
height: exec[2]
|
||||
}
|
||||
}
|
||||
},
|
||||
colors: {
|
||||
regex: /#([0-9a-f]{3,})\:#([0-9a-f]{3,})/i,
|
||||
output: function (val) {
|
||||
var exec = this.regex.exec(val);
|
||||
return {
|
||||
size: settings.themes.gray.size,
|
||||
foreground: "#" + exec[2],
|
||||
background: "#" + exec[1]
|
||||
}
|
||||
}
|
||||
},
|
||||
text: {
|
||||
regex: /text\:(.*)/,
|
||||
output: function (val) {
|
||||
return this.regex.exec(val)[1];
|
||||
}
|
||||
},
|
||||
font: {
|
||||
regex: /font\:(.*)/,
|
||||
output: function (val) {
|
||||
return this.regex.exec(val)[1];
|
||||
}
|
||||
},
|
||||
auto: {
|
||||
regex: /^auto$/
|
||||
}
|
||||
}
|
||||
|
||||
for (var flag in app.flags) {
|
||||
if (!app.flags.hasOwnProperty(flag)) continue;
|
||||
app.flags[flag].match = function (val) {
|
||||
return val.match(this.regex)
|
||||
}
|
||||
}
|
||||
|
||||
app.add_theme = function (name, theme) {
|
||||
name != null && theme != null && (settings.themes[name] = theme);
|
||||
return app;
|
||||
};
|
||||
|
||||
app.add_image = function (src, el) {
|
||||
var node = selector(el);
|
||||
if (node.length) {
|
||||
for (var i = 0, l = node.length; i < l; i++) {
|
||||
var img = document.createElement("img")
|
||||
img.setAttribute("data-src", src);
|
||||
node[i].appendChild(img);
|
||||
}
|
||||
}
|
||||
return app;
|
||||
};
|
||||
|
||||
app.run = function (o) {
|
||||
var options = extend(settings, o),
|
||||
images = [], imageNodes = [], bgnodes = [];
|
||||
|
||||
if(typeof(options.images) == "string"){
|
||||
imageNodes = selector(options.images);
|
||||
}
|
||||
else if (window.NodeList && options.images instanceof window.NodeList) {
|
||||
imageNodes = options.images;
|
||||
} else if (window.Node && options.images instanceof window.Node) {
|
||||
imageNodes = [options.images];
|
||||
}
|
||||
|
||||
if(typeof(options.bgnodes) == "string"){
|
||||
bgnodes = selector(options.bgnodes);
|
||||
} else if (window.NodeList && options.elements instanceof window.NodeList) {
|
||||
bgnodes = options.bgnodes;
|
||||
} else if (window.Node && options.bgnodes instanceof window.Node) {
|
||||
bgnodes = [options.bgnodes];
|
||||
}
|
||||
|
||||
preempted = true;
|
||||
|
||||
for (i = 0, l = imageNodes.length; i < l; i++) images.push(imageNodes[i]);
|
||||
|
||||
var holdercss = document.getElementById("holderjs-style");
|
||||
if (!holdercss) {
|
||||
holdercss = document.createElement("style");
|
||||
holdercss.setAttribute("id", "holderjs-style");
|
||||
holdercss.type = "text/css";
|
||||
document.getElementsByTagName("head")[0].appendChild(holdercss);
|
||||
}
|
||||
|
||||
if (!options.nocss) {
|
||||
if (holdercss.styleSheet) {
|
||||
holdercss.styleSheet.cssText += options.stylesheet;
|
||||
} else {
|
||||
holdercss.appendChild(document.createTextNode(options.stylesheet));
|
||||
}
|
||||
}
|
||||
|
||||
var cssregex = new RegExp(options.domain + "\/(.*?)\"?\\)");
|
||||
|
||||
for (var l = bgnodes.length, i = 0; i < l; i++) {
|
||||
var src = window.getComputedStyle(bgnodes[i], null)
|
||||
.getPropertyValue("background-image");
|
||||
var flags = src.match(cssregex);
|
||||
var bgsrc = bgnodes[i].getAttribute("data-background-src");
|
||||
|
||||
if (flags) {
|
||||
var holder = parse_flags(flags[1].split("/"), options);
|
||||
if (holder) {
|
||||
render("background", bgnodes[i], holder, src);
|
||||
}
|
||||
}
|
||||
else if(bgsrc != null){
|
||||
var holder = parse_flags(bgsrc.substr(bgsrc.lastIndexOf(options.domain) + options.domain.length + 1)
|
||||
.split("/"), options);
|
||||
if(holder){
|
||||
render("background", bgnodes[i], holder, src);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (l = images.length, i = 0; i < l; i++) {
|
||||
|
||||
var attr_src = attr_data_src = src = null;
|
||||
|
||||
try{
|
||||
attr_src = images[i].getAttribute("src");
|
||||
attr_datasrc = images[i].getAttribute("data-src");
|
||||
}catch(e){}
|
||||
|
||||
if (attr_datasrc == null && !! attr_src && attr_src.indexOf(options.domain) >= 0) {
|
||||
src = attr_src;
|
||||
} else if ( !! attr_datasrc && attr_datasrc.indexOf(options.domain) >= 0) {
|
||||
src = attr_datasrc;
|
||||
}
|
||||
|
||||
if (src) {
|
||||
var holder = parse_flags(src.substr(src.lastIndexOf(options.domain) + options.domain.length + 1)
|
||||
.split("/"), options);
|
||||
if (holder) {
|
||||
if (holder.fluid) {
|
||||
render("fluid", images[i], holder, src)
|
||||
} else {
|
||||
render("image", images[i], holder, src);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return app;
|
||||
};
|
||||
|
||||
contentLoaded(win, function () {
|
||||
if (window.addEventListener) {
|
||||
window.addEventListener("resize", fluid_update, false);
|
||||
window.addEventListener("orientationchange", fluid_update, false);
|
||||
} else {
|
||||
window.attachEvent("onresize", fluid_update)
|
||||
}
|
||||
preempted || app.run();
|
||||
});
|
||||
|
||||
if (typeof define === "function" && define.amd) {
|
||||
define("Holder", [], function () {
|
||||
return app;
|
||||
});
|
||||
}
|
||||
|
||||
})(Holder, window);
|
730
assets/js/imgareaselect/jquery.imgareaselect.js
Executable file
@ -0,0 +1,730 @@
|
||||
/*
|
||||
* imgAreaSelect jQuery plugin
|
||||
* version 0.9.10
|
||||
*
|
||||
* Copyright (c) 2008-2013 Michal Wojciechowski (odyniec.net)
|
||||
*
|
||||
* Dual licensed under the MIT (MIT-LICENSE.txt)
|
||||
* and GPL (GPL-LICENSE.txt) licenses.
|
||||
*
|
||||
* http://odyniec.net/projects/imgareaselect/
|
||||
*
|
||||
*/
|
||||
|
||||
(function($) {
|
||||
|
||||
var abs = Math.abs,
|
||||
max = Math.max,
|
||||
min = Math.min,
|
||||
round = Math.round;
|
||||
|
||||
function div() {
|
||||
return $('<div/>');
|
||||
}
|
||||
|
||||
$.imgAreaSelect = function (img, options) {
|
||||
var
|
||||
|
||||
$img = $(img),
|
||||
|
||||
imgLoaded,
|
||||
|
||||
$box = div(),
|
||||
$area = div(),
|
||||
$border = div().add(div()).add(div()).add(div()),
|
||||
$outer = div().add(div()).add(div()).add(div()),
|
||||
$handles = $([]),
|
||||
|
||||
$areaOpera,
|
||||
|
||||
left, top,
|
||||
|
||||
imgOfs = { left: 0, top: 0 },
|
||||
|
||||
imgWidth, imgHeight,
|
||||
|
||||
$parent,
|
||||
|
||||
parOfs = { left: 0, top: 0 },
|
||||
|
||||
zIndex = 0,
|
||||
|
||||
position = 'absolute',
|
||||
|
||||
startX, startY,
|
||||
|
||||
scaleX, scaleY,
|
||||
|
||||
resize,
|
||||
|
||||
minWidth, minHeight, maxWidth, maxHeight,
|
||||
|
||||
aspectRatio,
|
||||
|
||||
shown,
|
||||
|
||||
x1, y1, x2, y2,
|
||||
|
||||
selection = { x1: 0, y1: 0, x2: 0, y2: 0, width: 0, height: 0 },
|
||||
|
||||
docElem = document.documentElement,
|
||||
|
||||
ua = navigator.userAgent,
|
||||
|
||||
$p, d, i, o, w, h, adjusted;
|
||||
|
||||
function viewX(x) {
|
||||
return x + imgOfs.left - parOfs.left;
|
||||
}
|
||||
|
||||
function viewY(y) {
|
||||
return y + imgOfs.top - parOfs.top;
|
||||
}
|
||||
|
||||
function selX(x) {
|
||||
return x - imgOfs.left + parOfs.left;
|
||||
}
|
||||
|
||||
function selY(y) {
|
||||
return y - imgOfs.top + parOfs.top;
|
||||
}
|
||||
|
||||
function evX(event) {
|
||||
return event.pageX - parOfs.left;
|
||||
}
|
||||
|
||||
function evY(event) {
|
||||
return event.pageY - parOfs.top;
|
||||
}
|
||||
|
||||
function getSelection(noScale) {
|
||||
var sx = noScale || scaleX, sy = noScale || scaleY;
|
||||
|
||||
return { x1: round(selection.x1 * sx),
|
||||
y1: round(selection.y1 * sy),
|
||||
x2: round(selection.x2 * sx),
|
||||
y2: round(selection.y2 * sy),
|
||||
width: round(selection.x2 * sx) - round(selection.x1 * sx),
|
||||
height: round(selection.y2 * sy) - round(selection.y1 * sy) };
|
||||
}
|
||||
|
||||
function setSelection(x1, y1, x2, y2, noScale) {
|
||||
var sx = noScale || scaleX, sy = noScale || scaleY;
|
||||
|
||||
selection = {
|
||||
x1: round(x1 / sx || 0),
|
||||
y1: round(y1 / sy || 0),
|
||||
x2: round(x2 / sx || 0),
|
||||
y2: round(y2 / sy || 0)
|
||||
};
|
||||
|
||||
selection.width = selection.x2 - selection.x1;
|
||||
selection.height = selection.y2 - selection.y1;
|
||||
}
|
||||
|
||||
function adjust() {
|
||||
if (!imgLoaded || !$img.width())
|
||||
return;
|
||||
|
||||
imgOfs = { left: round($img.offset().left), top: round($img.offset().top) };
|
||||
|
||||
imgWidth = $img.innerWidth();
|
||||
imgHeight = $img.innerHeight();
|
||||
|
||||
imgOfs.top += ($img.outerHeight() - imgHeight) >> 1;
|
||||
imgOfs.left += ($img.outerWidth() - imgWidth) >> 1;
|
||||
|
||||
minWidth = round(options.minWidth / scaleX) || 0;
|
||||
minHeight = round(options.minHeight / scaleY) || 0;
|
||||
maxWidth = round(min(options.maxWidth / scaleX || 1<<24, imgWidth));
|
||||
maxHeight = round(min(options.maxHeight / scaleY || 1<<24, imgHeight));
|
||||
|
||||
if ($().jquery == '1.3.2' && position == 'fixed' &&
|
||||
!docElem['getBoundingClientRect'])
|
||||
{
|
||||
imgOfs.top += max(document.body.scrollTop, docElem.scrollTop);
|
||||
imgOfs.left += max(document.body.scrollLeft, docElem.scrollLeft);
|
||||
}
|
||||
|
||||
parOfs = /absolute|relative/.test($parent.css('position')) ?
|
||||
{ left: round($parent.offset().left) - $parent.scrollLeft(),
|
||||
top: round($parent.offset().top) - $parent.scrollTop() } :
|
||||
position == 'fixed' ?
|
||||
{ left: $(document).scrollLeft(), top: $(document).scrollTop() } :
|
||||
{ left: 0, top: 0 };
|
||||
|
||||
left = viewX(0);
|
||||
top = viewY(0);
|
||||
|
||||
if (selection.x2 > imgWidth || selection.y2 > imgHeight)
|
||||
doResize();
|
||||
}
|
||||
|
||||
function update(resetKeyPress) {
|
||||
if (!shown) return;
|
||||
|
||||
$box.css({ left: viewX(selection.x1), top: viewY(selection.y1) })
|
||||
.add($area).width(w = selection.width).height(h = selection.height);
|
||||
|
||||
$area.add($border).add($handles).css({ left: 0, top: 0 });
|
||||
|
||||
$border
|
||||
.width(max(w - $border.outerWidth() + $border.innerWidth(), 0))
|
||||
.height(max(h - $border.outerHeight() + $border.innerHeight(), 0));
|
||||
|
||||
$($outer[0]).css({ left: left, top: top,
|
||||
width: selection.x1, height: imgHeight });
|
||||
$($outer[1]).css({ left: left + selection.x1, top: top,
|
||||
width: w, height: selection.y1 });
|
||||
$($outer[2]).css({ left: left + selection.x2, top: top,
|
||||
width: imgWidth - selection.x2, height: imgHeight });
|
||||
$($outer[3]).css({ left: left + selection.x1, top: top + selection.y2,
|
||||
width: w, height: imgHeight - selection.y2 });
|
||||
|
||||
w -= $handles.outerWidth();
|
||||
h -= $handles.outerHeight();
|
||||
|
||||
switch ($handles.length) {
|
||||
case 8:
|
||||
$($handles[4]).css({ left: w >> 1 });
|
||||
$($handles[5]).css({ left: w, top: h >> 1 });
|
||||
$($handles[6]).css({ left: w >> 1, top: h });
|
||||
$($handles[7]).css({ top: h >> 1 });
|
||||
case 4:
|
||||
$handles.slice(1,3).css({ left: w });
|
||||
$handles.slice(2,4).css({ top: h });
|
||||
}
|
||||
|
||||
if (resetKeyPress !== false) {
|
||||
if ($.imgAreaSelect.onKeyPress != docKeyPress)
|
||||
$(document).unbind($.imgAreaSelect.keyPress,
|
||||
$.imgAreaSelect.onKeyPress);
|
||||
|
||||
if (options.keys)
|
||||
$(document)[$.imgAreaSelect.keyPress](
|
||||
$.imgAreaSelect.onKeyPress = docKeyPress);
|
||||
}
|
||||
|
||||
if (msie && $border.outerWidth() - $border.innerWidth() == 2) {
|
||||
$border.css('margin', 0);
|
||||
setTimeout(function () { $border.css('margin', 'auto'); }, 0);
|
||||
}
|
||||
}
|
||||
|
||||
function doUpdate(resetKeyPress) {
|
||||
adjust();
|
||||
update(resetKeyPress);
|
||||
x1 = viewX(selection.x1); y1 = viewY(selection.y1);
|
||||
x2 = viewX(selection.x2); y2 = viewY(selection.y2);
|
||||
}
|
||||
|
||||
function hide($elem, fn) {
|
||||
options.fadeSpeed ? $elem.fadeOut(options.fadeSpeed, fn) : $elem.hide();
|
||||
|
||||
}
|
||||
|
||||
function areaMouseMove(event) {
|
||||
var x = selX(evX(event)) - selection.x1,
|
||||
y = selY(evY(event)) - selection.y1;
|
||||
|
||||
if (!adjusted) {
|
||||
adjust();
|
||||
adjusted = true;
|
||||
|
||||
$box.one('mouseout', function () { adjusted = false; });
|
||||
}
|
||||
|
||||
resize = '';
|
||||
|
||||
if (options.resizable) {
|
||||
if (y <= options.resizeMargin)
|
||||
resize = 'n';
|
||||
else if (y >= selection.height - options.resizeMargin)
|
||||
resize = 's';
|
||||
if (x <= options.resizeMargin)
|
||||
resize += 'w';
|
||||
else if (x >= selection.width - options.resizeMargin)
|
||||
resize += 'e';
|
||||
}
|
||||
|
||||
$box.css('cursor', resize ? resize + '-resize' :
|
||||
options.movable ? 'move' : '');
|
||||
if ($areaOpera)
|
||||
$areaOpera.toggle();
|
||||
}
|
||||
|
||||
function docMouseUp(event) {
|
||||
$('body').css('cursor', '');
|
||||
if (options.autoHide || selection.width * selection.height == 0)
|
||||
hide($box.add($outer), function () { $(this).hide(); });
|
||||
|
||||
$(document).unbind('mousemove', selectingMouseMove);
|
||||
$box.mousemove(areaMouseMove);
|
||||
|
||||
options.onSelectEnd(img, getSelection());
|
||||
}
|
||||
|
||||
function areaMouseDown(event) {
|
||||
if (event.which != 1) return false;
|
||||
|
||||
adjust();
|
||||
|
||||
if (resize) {
|
||||
$('body').css('cursor', resize + '-resize');
|
||||
|
||||
x1 = viewX(selection[/w/.test(resize) ? 'x2' : 'x1']);
|
||||
y1 = viewY(selection[/n/.test(resize) ? 'y2' : 'y1']);
|
||||
|
||||
$(document).mousemove(selectingMouseMove)
|
||||
.one('mouseup', docMouseUp);
|
||||
$box.unbind('mousemove', areaMouseMove);
|
||||
}
|
||||
else if (options.movable) {
|
||||
startX = left + selection.x1 - evX(event);
|
||||
startY = top + selection.y1 - evY(event);
|
||||
|
||||
$box.unbind('mousemove', areaMouseMove);
|
||||
|
||||
$(document).mousemove(movingMouseMove)
|
||||
.one('mouseup', function () {
|
||||
options.onSelectEnd(img, getSelection());
|
||||
|
||||
$(document).unbind('mousemove', movingMouseMove);
|
||||
$box.mousemove(areaMouseMove);
|
||||
});
|
||||
}
|
||||
else
|
||||
$img.mousedown(event);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function fixAspectRatio(xFirst) {
|
||||
if (aspectRatio)
|
||||
if (xFirst) {
|
||||
x2 = max(left, min(left + imgWidth,
|
||||
x1 + abs(y2 - y1) * aspectRatio * (x2 > x1 || -1)));
|
||||
|
||||
y2 = round(max(top, min(top + imgHeight,
|
||||
y1 + abs(x2 - x1) / aspectRatio * (y2 > y1 || -1))));
|
||||
x2 = round(x2);
|
||||
}
|
||||
else {
|
||||
y2 = max(top, min(top + imgHeight,
|
||||
y1 + abs(x2 - x1) / aspectRatio * (y2 > y1 || -1)));
|
||||
x2 = round(max(left, min(left + imgWidth,
|
||||
x1 + abs(y2 - y1) * aspectRatio * (x2 > x1 || -1))));
|
||||
y2 = round(y2);
|
||||
}
|
||||
}
|
||||
|
||||
function doResize() {
|
||||
x1 = min(x1, left + imgWidth);
|
||||
y1 = min(y1, top + imgHeight);
|
||||
|
||||
if (abs(x2 - x1) < minWidth) {
|
||||
x2 = x1 - minWidth * (x2 < x1 || -1);
|
||||
|
||||
if (x2 < left)
|
||||
x1 = left + minWidth;
|
||||
else if (x2 > left + imgWidth)
|
||||
x1 = left + imgWidth - minWidth;
|
||||
}
|
||||
|
||||
if (abs(y2 - y1) < minHeight) {
|
||||
y2 = y1 - minHeight * (y2 < y1 || -1);
|
||||
|
||||
if (y2 < top)
|
||||
y1 = top + minHeight;
|
||||
else if (y2 > top + imgHeight)
|
||||
y1 = top + imgHeight - minHeight;
|
||||
}
|
||||
|
||||
x2 = max(left, min(x2, left + imgWidth));
|
||||
y2 = max(top, min(y2, top + imgHeight));
|
||||
|
||||
fixAspectRatio(abs(x2 - x1) < abs(y2 - y1) * aspectRatio);
|
||||
|
||||
if (abs(x2 - x1) > maxWidth) {
|
||||
x2 = x1 - maxWidth * (x2 < x1 || -1);
|
||||
fixAspectRatio();
|
||||
}
|
||||
|
||||
if (abs(y2 - y1) > maxHeight) {
|
||||
y2 = y1 - maxHeight * (y2 < y1 || -1);
|
||||
fixAspectRatio(true);
|
||||
}
|
||||
|
||||
selection = { x1: selX(min(x1, x2)), x2: selX(max(x1, x2)),
|
||||
y1: selY(min(y1, y2)), y2: selY(max(y1, y2)),
|
||||
width: abs(x2 - x1), height: abs(y2 - y1) };
|
||||
|
||||
update();
|
||||
|
||||
options.onSelectChange(img, getSelection());
|
||||
}
|
||||
|
||||
function selectingMouseMove(event) {
|
||||
x2 = /w|e|^$/.test(resize) || aspectRatio ? evX(event) : viewX(selection.x2);
|
||||
y2 = /n|s|^$/.test(resize) || aspectRatio ? evY(event) : viewY(selection.y2);
|
||||
|
||||
doResize();
|
||||
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
function doMove(newX1, newY1) {
|
||||
x2 = (x1 = newX1) + selection.width;
|
||||
y2 = (y1 = newY1) + selection.height;
|
||||
|
||||
$.extend(selection, { x1: selX(x1), y1: selY(y1), x2: selX(x2),
|
||||
y2: selY(y2) });
|
||||
|
||||
update();
|
||||
|
||||
options.onSelectChange(img, getSelection());
|
||||
}
|
||||
|
||||
function movingMouseMove(event) {
|
||||
x1 = max(left, min(startX + evX(event), left + imgWidth - selection.width));
|
||||
y1 = max(top, min(startY + evY(event), top + imgHeight - selection.height));
|
||||
|
||||
doMove(x1, y1);
|
||||
|
||||
event.preventDefault();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function startSelection() {
|
||||
$(document).unbind('mousemove', startSelection);
|
||||
adjust();
|
||||
|
||||
x2 = x1;
|
||||
y2 = y1;
|
||||
|
||||
doResize();
|
||||
|
||||
resize = '';
|
||||
|
||||
if (!$outer.is(':visible'))
|
||||
$box.add($outer).hide().fadeIn(options.fadeSpeed||0);
|
||||
|
||||
shown = true;
|
||||
|
||||
$(document).unbind('mouseup', cancelSelection)
|
||||
.mousemove(selectingMouseMove).one('mouseup', docMouseUp);
|
||||
$box.unbind('mousemove', areaMouseMove);
|
||||
|
||||
options.onSelectStart(img, getSelection());
|
||||
}
|
||||
|
||||
function cancelSelection() {
|
||||
$(document).unbind('mousemove', startSelection)
|
||||
.unbind('mouseup', cancelSelection);
|
||||
hide($box.add($outer));
|
||||
|
||||
setSelection(selX(x1), selY(y1), selX(x1), selY(y1));
|
||||
|
||||
if (!(this instanceof $.imgAreaSelect)) {
|
||||
options.onSelectChange(img, getSelection());
|
||||
options.onSelectEnd(img, getSelection());
|
||||
}
|
||||
}
|
||||
|
||||
function imgMouseDown(event) {
|
||||
if (event.which != 1 || $outer.is(':animated')) return false;
|
||||
|
||||
adjust();
|
||||
startX = x1 = evX(event);
|
||||
startY = y1 = evY(event);
|
||||
|
||||
$(document).mousemove(startSelection).mouseup(cancelSelection);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function windowResize() {
|
||||
doUpdate(false);
|
||||
}
|
||||
|
||||
function imgLoad() {
|
||||
imgLoaded = true;
|
||||
|
||||
setOptions(options = $.extend({
|
||||
classPrefix: 'imgareaselect',
|
||||
movable: true,
|
||||
parent: 'body',
|
||||
resizable: true,
|
||||
resizeMargin: 10,
|
||||
onInit: function () {},
|
||||
onSelectStart: function () {},
|
||||
onSelectChange: function () {},
|
||||
onSelectEnd: function () {}
|
||||
}, options));
|
||||
|
||||
$box.add($outer).css({ visibility: '' });
|
||||
|
||||
if (options.show) {
|
||||
shown = true;
|
||||
adjust();
|
||||
update();
|
||||
$box.add($outer).hide().fadeIn(options.fadeSpeed||0);
|
||||
}
|
||||
|
||||
setTimeout(function () { options.onInit(img, getSelection()); }, 0);
|
||||
}
|
||||
|
||||
var docKeyPress = function(event) {
|
||||
var k = options.keys, d, t, key = event.keyCode;
|
||||
|
||||
d = !isNaN(k.alt) && (event.altKey || event.originalEvent.altKey) ? k.alt :
|
||||
!isNaN(k.ctrl) && event.ctrlKey ? k.ctrl :
|
||||
!isNaN(k.shift) && event.shiftKey ? k.shift :
|
||||
!isNaN(k.arrows) ? k.arrows : 10;
|
||||
|
||||
if (k.arrows == 'resize' || (k.shift == 'resize' && event.shiftKey) ||
|
||||
(k.ctrl == 'resize' && event.ctrlKey) ||
|
||||
(k.alt == 'resize' && (event.altKey || event.originalEvent.altKey)))
|
||||
{
|
||||
switch (key) {
|
||||
case 37:
|
||||
d = -d;
|
||||
case 39:
|
||||
t = max(x1, x2);
|
||||
x1 = min(x1, x2);
|
||||
x2 = max(t + d, x1);
|
||||
fixAspectRatio();
|
||||
break;
|
||||
case 38:
|
||||
d = -d;
|
||||
case 40:
|
||||
t = max(y1, y2);
|
||||
y1 = min(y1, y2);
|
||||
y2 = max(t + d, y1);
|
||||
fixAspectRatio(true);
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
doResize();
|
||||
}
|
||||
else {
|
||||
x1 = min(x1, x2);
|
||||
y1 = min(y1, y2);
|
||||
|
||||
switch (key) {
|
||||
case 37:
|
||||
doMove(max(x1 - d, left), y1);
|
||||
break;
|
||||
case 38:
|
||||
doMove(x1, max(y1 - d, top));
|
||||
break;
|
||||
case 39:
|
||||
doMove(x1 + min(d, imgWidth - selX(x2)), y1);
|
||||
break;
|
||||
case 40:
|
||||
doMove(x1, y1 + min(d, imgHeight - selY(y2)));
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
function styleOptions($elem, props) {
|
||||
for (var option in props)
|
||||
if (options[option] !== undefined)
|
||||
$elem.css(props[option], options[option]);
|
||||
}
|
||||
|
||||
function setOptions(newOptions) {
|
||||
if (newOptions.parent)
|
||||
($parent = $(newOptions.parent)).append($box.add($outer));
|
||||
|
||||
$.extend(options, newOptions);
|
||||
|
||||
adjust();
|
||||
|
||||
if (newOptions.handles != null) {
|
||||
$handles.remove();
|
||||
$handles = $([]);
|
||||
|
||||
i = newOptions.handles ? newOptions.handles == 'corners' ? 4 : 8 : 0;
|
||||
|
||||
while (i--)
|
||||
$handles = $handles.add(div());
|
||||
|
||||
$handles.addClass(options.classPrefix + '-handle').css({
|
||||
position: 'absolute',
|
||||
fontSize: 0,
|
||||
zIndex: zIndex + 1 || 1
|
||||
});
|
||||
|
||||
if (!parseInt($handles.css('width')) >= 0)
|
||||
$handles.width(5).height(5);
|
||||
|
||||
if (o = options.borderWidth)
|
||||
$handles.css({ borderWidth: o, borderStyle: 'solid' });
|
||||
|
||||
styleOptions($handles, { borderColor1: 'border-color',
|
||||
borderColor2: 'background-color',
|
||||
borderOpacity: 'opacity' });
|
||||
}
|
||||
|
||||
scaleX = options.imageWidth / imgWidth || 1;
|
||||
scaleY = options.imageHeight / imgHeight || 1;
|
||||
|
||||
if (newOptions.x1 != null) {
|
||||
setSelection(newOptions.x1, newOptions.y1, newOptions.x2,
|
||||
newOptions.y2);
|
||||
newOptions.show = !newOptions.hide;
|
||||
}
|
||||
|
||||
if (newOptions.keys)
|
||||
options.keys = $.extend({ shift: 1, ctrl: 'resize' },
|
||||
newOptions.keys);
|
||||
|
||||
$outer.addClass(options.classPrefix + '-outer');
|
||||
$area.addClass(options.classPrefix + '-selection');
|
||||
for (i = 0; i++ < 4;)
|
||||
$($border[i-1]).addClass(options.classPrefix + '-border' + i);
|
||||
|
||||
styleOptions($area, { selectionColor: 'background-color',
|
||||
selectionOpacity: 'opacity' });
|
||||
styleOptions($border, { borderOpacity: 'opacity',
|
||||
borderWidth: 'border-width' });
|
||||
styleOptions($outer, { outerColor: 'background-color',
|
||||
outerOpacity: 'opacity' });
|
||||
if (o = options.borderColor1)
|
||||
$($border[0]).css({ borderStyle: 'solid', borderColor: o });
|
||||
if (o = options.borderColor2)
|
||||
$($border[1]).css({ borderStyle: 'dashed', borderColor: o });
|
||||
|
||||
$box.append($area.add($border).add($areaOpera)).append($handles);
|
||||
|
||||
if (msie) {
|
||||
if (o = ($outer.css('filter')||'').match(/opacity=(\d+)/))
|
||||
$outer.css('opacity', o[1]/100);
|
||||
if (o = ($border.css('filter')||'').match(/opacity=(\d+)/))
|
||||
$border.css('opacity', o[1]/100);
|
||||
}
|
||||
|
||||
if (newOptions.hide)
|
||||
hide($box.add($outer));
|
||||
else if (newOptions.show && imgLoaded) {
|
||||
shown = true;
|
||||
$box.add($outer).fadeIn(options.fadeSpeed||0);
|
||||
doUpdate();
|
||||
}
|
||||
|
||||
aspectRatio = (d = (options.aspectRatio || '').split(/:/))[0] / d[1];
|
||||
|
||||
$img.add($outer).unbind('mousedown', imgMouseDown);
|
||||
|
||||
if (options.disable || options.enable === false) {
|
||||
$box.unbind('mousemove', areaMouseMove).unbind('mousedown', areaMouseDown);
|
||||
$(window).unbind('resize', windowResize);
|
||||
}
|
||||
else {
|
||||
if (options.enable || options.disable === false) {
|
||||
if (options.resizable || options.movable)
|
||||
$box.mousemove(areaMouseMove).mousedown(areaMouseDown);
|
||||
|
||||
$(window).resize(windowResize);
|
||||
}
|
||||
|
||||
if (!options.persistent)
|
||||
$img.add($outer).mousedown(imgMouseDown);
|
||||
}
|
||||
|
||||
options.enable = options.disable = undefined;
|
||||
}
|
||||
|
||||
this.remove = function () {
|
||||
setOptions({ disable: true });
|
||||
$box.add($outer).remove();
|
||||
};
|
||||
|
||||
this.getOptions = function () { return options; };
|
||||
|
||||
this.setOptions = setOptions;
|
||||
|
||||
this.getSelection = getSelection;
|
||||
|
||||
this.setSelection = setSelection;
|
||||
|
||||
this.cancelSelection = cancelSelection;
|
||||
|
||||
this.update = doUpdate;
|
||||
|
||||
var msie = (/msie ([\w.]+)/i.exec(ua)||[])[1],
|
||||
opera = /opera/i.test(ua),
|
||||
safari = /webkit/i.test(ua) && !/chrome/i.test(ua);
|
||||
|
||||
$p = $img;
|
||||
|
||||
while ($p.length) {
|
||||
zIndex = max(zIndex,
|
||||
!isNaN($p.css('z-index')) ? $p.css('z-index') : zIndex);
|
||||
if ($p.css('position') == 'fixed')
|
||||
position = 'fixed';
|
||||
|
||||
$p = $p.parent(':not(body)');
|
||||
}
|
||||
|
||||
zIndex = options.zIndex || zIndex;
|
||||
|
||||
if (msie)
|
||||
$img.attr('unselectable', 'on');
|
||||
|
||||
$.imgAreaSelect.keyPress = msie || safari ? 'keydown' : 'keypress';
|
||||
|
||||
if (opera)
|
||||
|
||||
$areaOpera = div().css({ width: '100%', height: '100%',
|
||||
position: 'absolute', zIndex: zIndex + 2 || 2 });
|
||||
|
||||
$box.add($outer).css({ visibility: 'hidden', position: position,
|
||||
overflow: 'hidden', zIndex: zIndex || '0' });
|
||||
$box.css({ zIndex: zIndex + 2 || 2 });
|
||||
$area.add($border).css({ position: 'absolute', fontSize: 0 });
|
||||
|
||||
img.complete || img.readyState == 'complete' || !$img.is('img') ?
|
||||
imgLoad() : $img.one('load', imgLoad);
|
||||
|
||||
if (!imgLoaded && msie && msie >= 7)
|
||||
img.src = img.src;
|
||||
};
|
||||
|
||||
$.fn.imgAreaSelect = function (options) {
|
||||
options = options || {};
|
||||
|
||||
this.each(function () {
|
||||
if ($(this).data('imgAreaSelect')) {
|
||||
if (options.remove) {
|
||||
$(this).data('imgAreaSelect').remove();
|
||||
$(this).removeData('imgAreaSelect');
|
||||
}
|
||||
else
|
||||
$(this).data('imgAreaSelect').setOptions(options);
|
||||
}
|
||||
else if (!options.remove) {
|
||||
if (options.enable === undefined && options.disable === undefined)
|
||||
options.enable = true;
|
||||
|
||||
$(this).data('imgAreaSelect', new $.imgAreaSelect(this, options));
|
||||
}
|
||||
});
|
||||
|
||||
if (options.instance)
|
||||
return $(this).data('imgAreaSelect');
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
})(jQuery);
|
1
assets/js/imgareaselect/jquery.imgareaselect.min.js
vendored
Executable file
1
assets/js/imgareaselect/jquery.imgareaselect.pack.js
Executable file
4
assets/js/imgareaselect/jquery.min.js
vendored
Executable file
5
assets/js/index.php
Executable file
@ -0,0 +1,5 @@
|
||||
<?php
|
||||
//Script de s<>curit<69>.
|
||||
//Ne pas supprimer
|
||||
header('location: ../index.php');
|
||||
?>
|
15
assets/js/initialise_fancybox.js
Executable file
@ -0,0 +1,15 @@
|
||||
//Préparation de FancyBox (images des posts)
|
||||
$(document).ready(function() {
|
||||
$(".fancybox").fancybox({
|
||||
openEffect : 'none',
|
||||
closeEffect : 'none',
|
||||
prevEffect : 'none',
|
||||
nextEffect : 'none',
|
||||
|
||||
helpers : {
|
||||
title : {
|
||||
type : 'inside'
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
5
assets/js/ipwEditor/fckeditor/editor/images/index.php
Executable file
@ -0,0 +1,5 @@
|
||||
<?php
|
||||
//Script de s<>curit<69>.
|
||||
//Ne pas supprimer
|
||||
header('location: ../index.php');
|
||||
?>
|
5
assets/js/ipwEditor/fckeditor/editor/images/smiley/index.php
Executable file
@ -0,0 +1,5 @@
|
||||
<?php
|
||||
//Script de s<>curit<69>.
|
||||
//Ne pas supprimer
|
||||
header('location: ../index.php');
|
||||
?>
|
BIN
assets/js/ipwEditor/fckeditor/editor/images/smiley/msn/angel_smile.gif
Executable file
After Width: | Height: | Size: 445 B |
BIN
assets/js/ipwEditor/fckeditor/editor/images/smiley/msn/angry_smile.gif
Executable file
After Width: | Height: | Size: 453 B |
BIN
assets/js/ipwEditor/fckeditor/editor/images/smiley/msn/broken_heart.gif
Executable file
After Width: | Height: | Size: 423 B |
BIN
assets/js/ipwEditor/fckeditor/editor/images/smiley/msn/cake.gif
Executable file
After Width: | Height: | Size: 453 B |
BIN
assets/js/ipwEditor/fckeditor/editor/images/smiley/msn/confused_smile.gif
Executable file
After Width: | Height: | Size: 322 B |
BIN
assets/js/ipwEditor/fckeditor/editor/images/smiley/msn/cry_smile.gif
Executable file
After Width: | Height: | Size: 473 B |
BIN
assets/js/ipwEditor/fckeditor/editor/images/smiley/msn/devil_smile.gif
Executable file
After Width: | Height: | Size: 444 B |
BIN
assets/js/ipwEditor/fckeditor/editor/images/smiley/msn/embaressed_smile.gif
Executable file
After Width: | Height: | Size: 1.1 KiB |
BIN
assets/js/ipwEditor/fckeditor/editor/images/smiley/msn/envelope.gif
Executable file
After Width: | Height: | Size: 1.0 KiB |
BIN
assets/js/ipwEditor/fckeditor/editor/images/smiley/msn/heart.gif
Executable file
After Width: | Height: | Size: 1012 B |
5
assets/js/ipwEditor/fckeditor/editor/images/smiley/msn/index.php
Executable file
@ -0,0 +1,5 @@
|
||||
<?php
|
||||
//Script de s<>curit<69>.
|
||||
//Ne pas supprimer
|
||||
header('location: ../index.php');
|
||||
?>
|
BIN
assets/js/ipwEditor/fckeditor/editor/images/smiley/msn/kiss.gif
Executable file
After Width: | Height: | Size: 978 B |
BIN
assets/js/ipwEditor/fckeditor/editor/images/smiley/msn/lightbulb.gif
Executable file
After Width: | Height: | Size: 303 B |
BIN
assets/js/ipwEditor/fckeditor/editor/images/smiley/msn/omg_smile.gif
Executable file
After Width: | Height: | Size: 342 B |
BIN
assets/js/ipwEditor/fckeditor/editor/images/smiley/msn/regular_smile.gif
Executable file
After Width: | Height: | Size: 1.0 KiB |
BIN
assets/js/ipwEditor/fckeditor/editor/images/smiley/msn/sad_smile.gif
Executable file
After Width: | Height: | Size: 1.0 KiB |
BIN
assets/js/ipwEditor/fckeditor/editor/images/smiley/msn/shades_smile.gif
Executable file
After Width: | Height: | Size: 1.0 KiB |
BIN
assets/js/ipwEditor/fckeditor/editor/images/smiley/msn/teeth_smile.gif
Executable file
After Width: | Height: | Size: 1.0 KiB |
BIN
assets/js/ipwEditor/fckeditor/editor/images/smiley/msn/thumbs_down.gif
Executable file
After Width: | Height: | Size: 992 B |
BIN
assets/js/ipwEditor/fckeditor/editor/images/smiley/msn/thumbs_up.gif
Executable file
After Width: | Height: | Size: 989 B |
BIN
assets/js/ipwEditor/fckeditor/editor/images/smiley/msn/tounge_smile.gif
Executable file
After Width: | Height: | Size: 1.0 KiB |
After Width: | Height: | Size: 1.0 KiB |
BIN
assets/js/ipwEditor/fckeditor/editor/images/smiley/msn/wink_smile.gif
Executable file
After Width: | Height: | Size: 1.0 KiB |
5
assets/js/ipwEditor/fckeditor/editor/index.php
Executable file
@ -0,0 +1,5 @@
|
||||
<?php
|
||||
//Script de s<>curit<69>.
|
||||
//Ne pas supprimer
|
||||
header('location: ../index.php');
|
||||
?>
|
5
assets/js/ipwEditor/fckeditor/index.php
Executable file
@ -0,0 +1,5 @@
|
||||
<?php
|
||||
//Script de s<>curit<69>.
|
||||
//Ne pas supprimer
|
||||
header('location: ../index.php');
|
||||
?>
|
5
assets/js/ipwEditor/index.php
Executable file
@ -0,0 +1,5 @@
|
||||
<?php
|
||||
//Script de s<>curit<69>.
|
||||
//Ne pas supprimer
|
||||
header('location: ../index.php');
|
||||
?>
|
9472
assets/js/jquery-1.8.3.js
vendored
Executable file
2
assets/js/jquery-1.8.3.min.js
vendored
Executable file
9597
assets/js/jquery-1.9.1.js
vendored
Executable file
14879
assets/js/jquery-ui-1.9.2.custom.js
vendored
Executable file
602
assets/js/jquery.ui.autocomplete.js
vendored
Executable file
@ -0,0 +1,602 @@
|
||||
/*!
|
||||
* jQuery UI Autocomplete 1.9.2
|
||||
* http://jqueryui.com
|
||||
*
|
||||
* Copyright 2012 jQuery Foundation and other contributors
|
||||
* Released under the MIT license.
|
||||
* http://jquery.org/license
|
||||
*
|
||||
* http://api.jqueryui.com/autocomplete/
|
||||
*
|
||||
* Depends:
|
||||
* jquery.ui.core.js
|
||||
* jquery.ui.widget.js
|
||||
* jquery.ui.position.js
|
||||
* jquery.ui.menu.js
|
||||
*/
|
||||
(function( $, undefined ) {
|
||||
|
||||
// used to prevent race conditions with remote data sources
|
||||
var requestIndex = 0;
|
||||
|
||||
$.widget( "ui.autocomplete", {
|
||||
version: "1.9.2",
|
||||
defaultElement: "<input>",
|
||||
options: {
|
||||
appendTo: "body",
|
||||
autoFocus: false,
|
||||
delay: 300,
|
||||
minLength: 1,
|
||||
position: {
|
||||
my: "left top",
|
||||
at: "left bottom",
|
||||
collision: "none"
|
||||
},
|
||||
source: null,
|
||||
|
||||
// callbacks
|
||||
change: null,
|
||||
close: null,
|
||||
focus: null,
|
||||
open: null,
|
||||
response: null,
|
||||
search: null,
|
||||
select: null
|
||||
},
|
||||
|
||||
pending: 0,
|
||||
|
||||
_create: function() {
|
||||
// Some browsers only repeat keydown events, not keypress events,
|
||||
// so we use the suppressKeyPress flag to determine if we've already
|
||||
// handled the keydown event. #7269
|
||||
// Unfortunately the code for & in keypress is the same as the up arrow,
|
||||
// so we use the suppressKeyPressRepeat flag to avoid handling keypress
|
||||
// events when we know the keydown event was used to modify the
|
||||
// search term. #7799
|
||||
var suppressKeyPress, suppressKeyPressRepeat, suppressInput;
|
||||
|
||||
this.isMultiLine = this._isMultiLine();
|
||||
this.valueMethod = this.element[ this.element.is( "input,textarea" ) ? "val" : "text" ];
|
||||
this.isNewMenu = true;
|
||||
|
||||
this.element
|
||||
.addClass( "ui-autocomplete-input" )
|
||||
.attr( "autocomplete", "off" );
|
||||
|
||||
this._on( this.element, {
|
||||
keydown: function( event ) {
|
||||
if ( this.element.prop( "readOnly" ) ) {
|
||||
suppressKeyPress = true;
|
||||
suppressInput = true;
|
||||
suppressKeyPressRepeat = true;
|
||||
return;
|
||||
}
|
||||
|
||||
suppressKeyPress = false;
|
||||
suppressInput = false;
|
||||
suppressKeyPressRepeat = false;
|
||||
var keyCode = $.ui.keyCode;
|
||||
switch( event.keyCode ) {
|
||||
case keyCode.PAGE_UP:
|
||||
suppressKeyPress = true;
|
||||
this._move( "previousPage", event );
|
||||
break;
|
||||
case keyCode.PAGE_DOWN:
|
||||
suppressKeyPress = true;
|
||||
this._move( "nextPage", event );
|
||||
break;
|
||||
case keyCode.UP:
|
||||
suppressKeyPress = true;
|
||||
this._keyEvent( "previous", event );
|
||||
break;
|
||||
case keyCode.DOWN:
|
||||
suppressKeyPress = true;
|
||||
this._keyEvent( "next", event );
|
||||
break;
|
||||
case keyCode.ENTER:
|
||||
case keyCode.NUMPAD_ENTER:
|
||||
// when menu is open and has focus
|
||||
if ( this.menu.active ) {
|
||||
// #6055 - Opera still allows the keypress to occur
|
||||
// which causes forms to submit
|
||||
suppressKeyPress = true;
|
||||
event.preventDefault();
|
||||
this.menu.select( event );
|
||||
}
|
||||
break;
|
||||
case keyCode.TAB:
|
||||
if ( this.menu.active ) {
|
||||
this.menu.select( event );
|
||||
}
|
||||
break;
|
||||
case keyCode.ESCAPE:
|
||||
if ( this.menu.element.is( ":visible" ) ) {
|
||||
this._value( this.term );
|
||||
this.close( event );
|
||||
// Different browsers have different default behavior for escape
|
||||
// Single press can mean undo or clear
|
||||
// Double press in IE means clear the whole form
|
||||
event.preventDefault();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
suppressKeyPressRepeat = true;
|
||||
// search timeout should be triggered before the input value is changed
|
||||
this._searchTimeout( event );
|
||||
break;
|
||||
}
|
||||
},
|
||||
keypress: function( event ) {
|
||||
if ( suppressKeyPress ) {
|
||||
suppressKeyPress = false;
|
||||
event.preventDefault();
|
||||
return;
|
||||
}
|
||||
if ( suppressKeyPressRepeat ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// replicate some key handlers to allow them to repeat in Firefox and Opera
|
||||
var keyCode = $.ui.keyCode;
|
||||
switch( event.keyCode ) {
|
||||
case keyCode.PAGE_UP:
|
||||
this._move( "previousPage", event );
|
||||
break;
|
||||
case keyCode.PAGE_DOWN:
|
||||
this._move( "nextPage", event );
|
||||
break;
|
||||
case keyCode.UP:
|
||||
this._keyEvent( "previous", event );
|
||||
break;
|
||||
case keyCode.DOWN:
|
||||
this._keyEvent( "next", event );
|
||||
break;
|
||||
}
|
||||
},
|
||||
input: function( event ) {
|
||||
if ( suppressInput ) {
|
||||
suppressInput = false;
|
||||
event.preventDefault();
|
||||
return;
|
||||
}
|
||||
this._searchTimeout( event );
|
||||
},
|
||||
focus: function() {
|
||||
this.selectedItem = null;
|
||||
this.previous = this._value();
|
||||
},
|
||||
blur: function( event ) {
|
||||
if ( this.cancelBlur ) {
|
||||
delete this.cancelBlur;
|
||||
return;
|
||||
}
|
||||
|
||||
clearTimeout( this.searching );
|
||||
this.close( event );
|
||||
this._change( event );
|
||||
}
|
||||
});
|
||||
|
||||
this._initSource();
|
||||
this.menu = $( "<ul>" )
|
||||
.addClass( "ui-autocomplete" )
|
||||
.appendTo( this.document.find( this.options.appendTo || "body" )[ 0 ] )
|
||||
.menu({
|
||||
// custom key handling for now
|
||||
input: $(),
|
||||
// disable ARIA support, the live region takes care of that
|
||||
role: null
|
||||
})
|
||||
.zIndex( this.element.zIndex() + 1 )
|
||||
.hide()
|
||||
.data( "menu" );
|
||||
|
||||
this._on( this.menu.element, {
|
||||
mousedown: function( event ) {
|
||||
// prevent moving focus out of the text field
|
||||
event.preventDefault();
|
||||
|
||||
// IE doesn't prevent moving focus even with event.preventDefault()
|
||||
// so we set a flag to know when we should ignore the blur event
|
||||
this.cancelBlur = true;
|
||||
this._delay(function() {
|
||||
delete this.cancelBlur;
|
||||
});
|
||||
|
||||
// clicking on the scrollbar causes focus to shift to the body
|
||||
// but we can't detect a mouseup or a click immediately afterward
|
||||
// so we have to track the next mousedown and close the menu if
|
||||
// the user clicks somewhere outside of the autocomplete
|
||||
var menuElement = this.menu.element[ 0 ];
|
||||
if ( !$( event.target ).closest( ".ui-menu-item" ).length ) {
|
||||
this._delay(function() {
|
||||
var that = this;
|
||||
this.document.one( "mousedown", function( event ) {
|
||||
if ( event.target !== that.element[ 0 ] &&
|
||||
event.target !== menuElement &&
|
||||
!$.contains( menuElement, event.target ) ) {
|
||||
that.close();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
},
|
||||
menufocus: function( event, ui ) {
|
||||
// #7024 - Prevent accidental activation of menu items in Firefox
|
||||
if ( this.isNewMenu ) {
|
||||
this.isNewMenu = false;
|
||||
if ( event.originalEvent && /^mouse/.test( event.originalEvent.type ) ) {
|
||||
this.menu.blur();
|
||||
|
||||
this.document.one( "mousemove", function() {
|
||||
$( event.target ).trigger( event.originalEvent );
|
||||
});
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// back compat for _renderItem using item.autocomplete, via #7810
|
||||
// TODO remove the fallback, see #8156
|
||||
var item = ui.item.data( "ui-autocomplete-item" ) || ui.item.data( "item.autocomplete" );
|
||||
if ( false !== this._trigger( "focus", event, { item: item } ) ) {
|
||||
// use value to match what will end up in the input, if it was a key event
|
||||
if ( event.originalEvent && /^key/.test( event.originalEvent.type ) ) {
|
||||
this._value( item.value );
|
||||
}
|
||||
} else {
|
||||
// Normally the input is populated with the item's value as the
|
||||
// menu is navigated, causing screen readers to notice a change and
|
||||
// announce the item. Since the focus event was canceled, this doesn't
|
||||
// happen, so we update the live region so that screen readers can
|
||||
// still notice the change and announce it.
|
||||
this.liveRegion.text( item.value );
|
||||
}
|
||||
},
|
||||
menuselect: function( event, ui ) {
|
||||
// back compat for _renderItem using item.autocomplete, via #7810
|
||||
// TODO remove the fallback, see #8156
|
||||
var item = ui.item.data( "ui-autocomplete-item" ) || ui.item.data( "item.autocomplete" ),
|
||||
previous = this.previous;
|
||||
|
||||
// only trigger when focus was lost (click on menu)
|
||||
if ( this.element[0] !== this.document[0].activeElement ) {
|
||||
this.element.focus();
|
||||
this.previous = previous;
|
||||
// #6109 - IE triggers two focus events and the second
|
||||
// is asynchronous, so we need to reset the previous
|
||||
// term synchronously and asynchronously :-(
|
||||
this._delay(function() {
|
||||
this.previous = previous;
|
||||
this.selectedItem = item;
|
||||
});
|
||||
}
|
||||
|
||||
if ( false !== this._trigger( "select", event, { item: item } ) ) {
|
||||
this._value( item.value );
|
||||
}
|
||||
// reset the term after the select event
|
||||
// this allows custom select handling to work properly
|
||||
this.term = this._value();
|
||||
|
||||
this.close( event );
|
||||
this.selectedItem = item;
|
||||
}
|
||||
});
|
||||
|
||||
this.liveRegion = $( "<span>", {
|
||||
role: "status",
|
||||
"aria-live": "polite"
|
||||
})
|
||||
.addClass( "ui-helper-hidden-accessible" )
|
||||
.insertAfter( this.element );
|
||||
|
||||
if ( $.fn.bgiframe ) {
|
||||
this.menu.element.bgiframe();
|
||||
}
|
||||
|
||||
// turning off autocomplete prevents the browser from remembering the
|
||||
// value when navigating through history, so we re-enable autocomplete
|
||||
// if the page is unloaded before the widget is destroyed. #7790
|
||||
this._on( this.window, {
|
||||
beforeunload: function() {
|
||||
this.element.removeAttr( "autocomplete" );
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
_destroy: function() {
|
||||
clearTimeout( this.searching );
|
||||
this.element
|
||||
.removeClass( "ui-autocomplete-input" )
|
||||
.removeAttr( "autocomplete" );
|
||||
this.menu.element.remove();
|
||||
this.liveRegion.remove();
|
||||
},
|
||||
|
||||
_setOption: function( key, value ) {
|
||||
this._super( key, value );
|
||||
if ( key === "source" ) {
|
||||
this._initSource();
|
||||
}
|
||||
if ( key === "appendTo" ) {
|
||||
this.menu.element.appendTo( this.document.find( value || "body" )[0] );
|
||||
}
|
||||
if ( key === "disabled" && value && this.xhr ) {
|
||||
this.xhr.abort();
|
||||
}
|
||||
},
|
||||
|
||||
_isMultiLine: function() {
|
||||
// Textareas are always multi-line
|
||||
if ( this.element.is( "textarea" ) ) {
|
||||
return true;
|
||||
}
|
||||
// Inputs are always single-line, even if inside a contentEditable element
|
||||
// IE also treats inputs as contentEditable
|
||||
if ( this.element.is( "input" ) ) {
|
||||
return false;
|
||||
}
|
||||
// All other element types are determined by whether or not they're contentEditable
|
||||
return this.element.prop( "isContentEditable" );
|
||||
},
|
||||
|
||||
_initSource: function() {
|
||||
var array, url,
|
||||
that = this;
|
||||
if ( $.isArray(this.options.source) ) {
|
||||
array = this.options.source;
|
||||
this.source = function( request, response ) {
|
||||
response( $.ui.autocomplete.filter( array, request.term ) );
|
||||
};
|
||||
} else if ( typeof this.options.source === "string" ) {
|
||||
url = this.options.source;
|
||||
this.source = function( request, response ) {
|
||||
if ( that.xhr ) {
|
||||
that.xhr.abort();
|
||||
}
|
||||
that.xhr = $.ajax({
|
||||
url: url,
|
||||
data: request,
|
||||
dataType: "json",
|
||||
success: function( data ) {
|
||||
response( data );
|
||||
},
|
||||
error: function() {
|
||||
response( [] );
|
||||
}
|
||||
});
|
||||
};
|
||||
} else {
|
||||
this.source = this.options.source;
|
||||
}
|
||||
},
|
||||
|
||||
_searchTimeout: function( event ) {
|
||||
clearTimeout( this.searching );
|
||||
this.searching = this._delay(function() {
|
||||
// only search if the value has changed
|
||||
if ( this.term !== this._value() ) {
|
||||
this.selectedItem = null;
|
||||
this.search( null, event );
|
||||
}
|
||||
}, this.options.delay );
|
||||
},
|
||||
|
||||
search: function( value, event ) {
|
||||
value = value != null ? value : this._value();
|
||||
|
||||
// always save the actual value, not the one passed as an argument
|
||||
this.term = this._value();
|
||||
|
||||
if ( value.length < this.options.minLength ) {
|
||||
return this.close( event );
|
||||
}
|
||||
|
||||
if ( this._trigger( "search", event ) === false ) {
|
||||
return;
|
||||
}
|
||||
|
||||
return this._search( value );
|
||||
},
|
||||
|
||||
_search: function( value ) {
|
||||
this.pending++;
|
||||
this.element.addClass( "ui-autocomplete-loading" );
|
||||
this.cancelSearch = false;
|
||||
|
||||
this.source( { term: value }, this._response() );
|
||||
},
|
||||
|
||||
_response: function() {
|
||||
var that = this,
|
||||
index = ++requestIndex;
|
||||
|
||||
return function( content ) {
|
||||
if ( index === requestIndex ) {
|
||||
that.__response( content );
|
||||
}
|
||||
|
||||
that.pending--;
|
||||
if ( !that.pending ) {
|
||||
that.element.removeClass( "ui-autocomplete-loading" );
|
||||
}
|
||||
};
|
||||
},
|
||||
|
||||
__response: function( content ) {
|
||||
if ( content ) {
|
||||
content = this._normalize( content );
|
||||
}
|
||||
this._trigger( "response", null, { content: content } );
|
||||
if ( !this.options.disabled && content && content.length && !this.cancelSearch ) {
|
||||
this._suggest( content );
|
||||
this._trigger( "open" );
|
||||
} else {
|
||||
// use ._close() instead of .close() so we don't cancel future searches
|
||||
this._close();
|
||||
}
|
||||
},
|
||||
|
||||
close: function( event ) {
|
||||
this.cancelSearch = true;
|
||||
this._close( event );
|
||||
},
|
||||
|
||||
_close: function( event ) {
|
||||
if ( this.menu.element.is( ":visible" ) ) {
|
||||
this.menu.element.hide();
|
||||
this.menu.blur();
|
||||
this.isNewMenu = true;
|
||||
this._trigger( "close", event );
|
||||
}
|
||||
},
|
||||
|
||||
_change: function( event ) {
|
||||
if ( this.previous !== this._value() ) {
|
||||
this._trigger( "change", event, { item: this.selectedItem } );
|
||||
}
|
||||
},
|
||||
|
||||
_normalize: function( items ) {
|
||||
// assume all items have the right format when the first item is complete
|
||||
if ( items.length && items[0].label && items[0].value ) {
|
||||
return items;
|
||||
}
|
||||
return $.map( items, function( item ) {
|
||||
if ( typeof item === "string" ) {
|
||||
return {
|
||||
label: item,
|
||||
value: item
|
||||
};
|
||||
}
|
||||
return $.extend({
|
||||
label: item.label || item.value,
|
||||
value: item.value || item.label
|
||||
}, item );
|
||||
});
|
||||
},
|
||||
|
||||
_suggest: function( items ) {
|
||||
var ul = this.menu.element
|
||||
.empty()
|
||||
.zIndex( this.element.zIndex() + 1 );
|
||||
this._renderMenu( ul, items );
|
||||
this.menu.refresh();
|
||||
|
||||
// size and position menu
|
||||
ul.show();
|
||||
this._resizeMenu();
|
||||
ul.position( $.extend({
|
||||
of: this.element
|
||||
}, this.options.position ));
|
||||
|
||||
if ( this.options.autoFocus ) {
|
||||
this.menu.next();
|
||||
}
|
||||
},
|
||||
|
||||
_resizeMenu: function() {
|
||||
var ul = this.menu.element;
|
||||
ul.outerWidth( Math.max(
|
||||
// Firefox wraps long text (possibly a rounding bug)
|
||||
// so we add 1px to avoid the wrapping (#7513)
|
||||
ul.width( "" ).outerWidth() + 1,
|
||||
this.element.outerWidth()
|
||||
) );
|
||||
},
|
||||
|
||||
_renderMenu: function( ul, items ) {
|
||||
var that = this;
|
||||
$.each( items, function( index, item ) {
|
||||
that._renderItemData( ul, item );
|
||||
});
|
||||
},
|
||||
|
||||
_renderItemData: function( ul, item ) {
|
||||
return this._renderItem( ul, item ).data( "ui-autocomplete-item", item );
|
||||
},
|
||||
|
||||
_renderItem: function( ul, item ) {
|
||||
return $( "<li>" )
|
||||
.append( $( "<a>" ).text( item.label ) )
|
||||
.appendTo( ul );
|
||||
},
|
||||
|
||||
_move: function( direction, event ) {
|
||||
if ( !this.menu.element.is( ":visible" ) ) {
|
||||
this.search( null, event );
|
||||
return;
|
||||
}
|
||||
if ( this.menu.isFirstItem() && /^previous/.test( direction ) ||
|
||||
this.menu.isLastItem() && /^next/.test( direction ) ) {
|
||||
this._value( this.term );
|
||||
this.menu.blur();
|
||||
return;
|
||||
}
|
||||
this.menu[ direction ]( event );
|
||||
},
|
||||
|
||||
widget: function() {
|
||||
return this.menu.element;
|
||||
},
|
||||
|
||||
_value: function() {
|
||||
return this.valueMethod.apply( this.element, arguments );
|
||||
},
|
||||
|
||||
_keyEvent: function( keyEvent, event ) {
|
||||
if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
|
||||
this._move( keyEvent, event );
|
||||
|
||||
// prevents moving cursor to beginning/end of the text field in some browsers
|
||||
event.preventDefault();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
$.extend( $.ui.autocomplete, {
|
||||
escapeRegex: function( value ) {
|
||||
return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&");
|
||||
},
|
||||
filter: function(array, term) {
|
||||
var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" );
|
||||
return $.grep( array, function(value) {
|
||||
return matcher.test( value.label || value.value || value );
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
// live region extension, adding a `messages` option
|
||||
// NOTE: This is an experimental API. We are still investigating
|
||||
// a full solution for string manipulation and internationalization.
|
||||
$.widget( "ui.autocomplete", $.ui.autocomplete, {
|
||||
options: {
|
||||
messages: {
|
||||
noResults: "No search results.",
|
||||
results: function( amount ) {
|
||||
return amount + ( amount > 1 ? " results are" : " result is" ) +
|
||||
" available, use up and down arrow keys to navigate.";
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
__response: function( content ) {
|
||||
var message;
|
||||
this._superApply( arguments );
|
||||
if ( this.options.disabled || this.cancelSearch ) {
|
||||
return;
|
||||
}
|
||||
if ( content && content.length ) {
|
||||
message = this.options.messages.results( content.length );
|
||||
} else {
|
||||
message = this.options.messages.noResults;
|
||||
}
|
||||
this.liveRegion.text( message );
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
}( jQuery ));
|
356
assets/js/jquery.ui.core.js
vendored
Executable file
@ -0,0 +1,356 @@
|
||||
/*!
|
||||
* jQuery UI Core 1.9.2
|
||||
* http://jqueryui.com
|
||||
*
|
||||
* Copyright 2012 jQuery Foundation and other contributors
|
||||
* Released under the MIT license.
|
||||
* http://jquery.org/license
|
||||
*
|
||||
* http://api.jqueryui.com/category/ui-core/
|
||||
*/
|
||||
(function( $, undefined ) {
|
||||
|
||||
var uuid = 0,
|
||||
runiqueId = /^ui-id-\d+$/;
|
||||
|
||||
// prevent duplicate loading
|
||||
// this is only a problem because we proxy existing functions
|
||||
// and we don't want to double proxy them
|
||||
$.ui = $.ui || {};
|
||||
if ( $.ui.version ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$.extend( $.ui, {
|
||||
version: "1.9.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
|
||||
}
|
||||
});
|
||||
|
||||
// plugins
|
||||
$.fn.extend({
|
||||
_focus: $.fn.focus,
|
||||
focus: function( delay, fn ) {
|
||||
return typeof delay === "number" ?
|
||||
this.each(function() {
|
||||
var elem = this;
|
||||
setTimeout(function() {
|
||||
$( elem ).focus();
|
||||
if ( fn ) {
|
||||
fn.call( elem );
|
||||
}
|
||||
}, delay );
|
||||
}) :
|
||||
this._focus.apply( this, arguments );
|
||||
},
|
||||
|
||||
scrollParent: function() {
|
||||
var scrollParent;
|
||||
if (($.ui.ie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) {
|
||||
scrollParent = this.parents().filter(function() {
|
||||
return (/(relative|absolute|fixed)/).test($.css(this,'position')) && (/(auto|scroll)/).test($.css(this,'overflow')+$.css(this,'overflow-y')+$.css(this,'overflow-x'));
|
||||
}).eq(0);
|
||||
} else {
|
||||
scrollParent = this.parents().filter(function() {
|
||||
return (/(auto|scroll)/).test($.css(this,'overflow')+$.css(this,'overflow-y')+$.css(this,'overflow-x'));
|
||||
}).eq(0);
|
||||
}
|
||||
|
||||
return (/fixed/).test(this.css('position')) || !scrollParent.length ? $(document) : scrollParent;
|
||||
},
|
||||
|
||||
zIndex: function( zIndex ) {
|
||||
if ( zIndex !== undefined ) {
|
||||
return this.css( "zIndex", zIndex );
|
||||
}
|
||||
|
||||
if ( this.length ) {
|
||||
var elem = $( this[ 0 ] ), position, value;
|
||||
while ( elem.length && elem[ 0 ] !== document ) {
|
||||
// Ignore z-index if position is set to a value where z-index is ignored by the browser
|
||||
// This makes behavior of this function consistent across browsers
|
||||
// WebKit always returns auto if the element is positioned
|
||||
position = elem.css( "position" );
|
||||
if ( position === "absolute" || position === "relative" || position === "fixed" ) {
|
||||
// IE returns 0 when zIndex is not specified
|
||||
// other browsers return a string
|
||||
// we ignore the case of nested elements with an explicit value of 0
|
||||
// <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
|
||||
value = parseInt( elem.css( "zIndex" ), 10 );
|
||||
if ( !isNaN( value ) && value !== 0 ) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
elem = elem.parent();
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
},
|
||||
|
||||
uniqueId: function() {
|
||||
return this.each(function() {
|
||||
if ( !this.id ) {
|
||||
this.id = "ui-id-" + (++uuid);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
removeUniqueId: function() {
|
||||
return this.each(function() {
|
||||
if ( runiqueId.test( this.id ) ) {
|
||||
$( this ).removeAttr( "id" );
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// selectors
|
||||
function focusable( element, isTabIndexNotNaN ) {
|
||||
var map, mapName, img,
|
||||
nodeName = element.nodeName.toLowerCase();
|
||||
if ( "area" === nodeName ) {
|
||||
map = element.parentNode;
|
||||
mapName = map.name;
|
||||
if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
|
||||
return false;
|
||||
}
|
||||
img = $( "img[usemap=#" + mapName + "]" )[0];
|
||||
return !!img && visible( img );
|
||||
}
|
||||
return ( /input|select|textarea|button|object/.test( nodeName ) ?
|
||||
!element.disabled :
|
||||
"a" === nodeName ?
|
||||
element.href || isTabIndexNotNaN :
|
||||
isTabIndexNotNaN) &&
|
||||
// the element and all of its ancestors must be visible
|
||||
visible( element );
|
||||
}
|
||||
|
||||
function visible( element ) {
|
||||
return $.expr.filters.visible( element ) &&
|
||||
!$( element ).parents().andSelf().filter(function() {
|
||||
return $.css( this, "visibility" ) === "hidden";
|
||||
}).length;
|
||||
}
|
||||
|
||||
$.extend( $.expr[ ":" ], {
|
||||
data: $.expr.createPseudo ?
|
||||
$.expr.createPseudo(function( dataName ) {
|
||||
return function( elem ) {
|
||||
return !!$.data( elem, dataName );
|
||||
};
|
||||
}) :
|
||||
// support: jQuery <1.8
|
||||
function( elem, i, match ) {
|
||||
return !!$.data( elem, match[ 3 ] );
|
||||
},
|
||||
|
||||
focusable: function( element ) {
|
||||
return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) );
|
||||
},
|
||||
|
||||
tabbable: function( element ) {
|
||||
var tabIndex = $.attr( element, "tabindex" ),
|
||||
isTabIndexNaN = isNaN( tabIndex );
|
||||
return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );
|
||||
}
|
||||
});
|
||||
|
||||
// support
|
||||
$(function() {
|
||||
var body = document.body,
|
||||
div = body.appendChild( div = document.createElement( "div" ) );
|
||||
|
||||
// access offsetHeight before setting the style to prevent a layout bug
|
||||
// in IE 9 which causes the element to continue to take up space even
|
||||
// after it is removed from the DOM (#8026)
|
||||
div.offsetHeight;
|
||||
|
||||
$.extend( div.style, {
|
||||
minHeight: "100px",
|
||||
height: "auto",
|
||||
padding: 0,
|
||||
borderWidth: 0
|
||||
});
|
||||
|
||||
$.support.minHeight = div.offsetHeight === 100;
|
||||
$.support.selectstart = "onselectstart" in div;
|
||||
|
||||
// set display to none to avoid a layout bug in IE
|
||||
// http://dev.jquery.com/ticket/4014
|
||||
body.removeChild( div ).style.display = "none";
|
||||
});
|
||||
|
||||
// support: jQuery <1.8
|
||||
if ( !$( "<a>" ).outerWidth( 1 ).jquery ) {
|
||||
$.each( [ "Width", "Height" ], function( i, name ) {
|
||||
var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
|
||||
type = name.toLowerCase(),
|
||||
orig = {
|
||||
innerWidth: $.fn.innerWidth,
|
||||
innerHeight: $.fn.innerHeight,
|
||||
outerWidth: $.fn.outerWidth,
|
||||
outerHeight: $.fn.outerHeight
|
||||
};
|
||||
|
||||
function reduce( elem, size, border, margin ) {
|
||||
$.each( side, function() {
|
||||
size -= parseFloat( $.css( elem, "padding" + this ) ) || 0;
|
||||
if ( border ) {
|
||||
size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0;
|
||||
}
|
||||
if ( margin ) {
|
||||
size -= parseFloat( $.css( elem, "margin" + this ) ) || 0;
|
||||
}
|
||||
});
|
||||
return size;
|
||||
}
|
||||
|
||||
$.fn[ "inner" + name ] = function( size ) {
|
||||
if ( size === undefined ) {
|
||||
return orig[ "inner" + name ].call( this );
|
||||
}
|
||||
|
||||
return this.each(function() {
|
||||
$( this ).css( type, reduce( this, size ) + "px" );
|
||||
});
|
||||
};
|
||||
|
||||
$.fn[ "outer" + name] = function( size, margin ) {
|
||||
if ( typeof size !== "number" ) {
|
||||
return orig[ "outer" + name ].call( this, size );
|
||||
}
|
||||
|
||||
return this.each(function() {
|
||||
$( this).css( type, reduce( this, size, true, margin ) + "px" );
|
||||
});
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
// support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413)
|
||||
if ( $( "<a>" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) {
|
||||
$.fn.removeData = (function( removeData ) {
|
||||
return function( key ) {
|
||||
if ( arguments.length ) {
|
||||
return removeData.call( this, $.camelCase( key ) );
|
||||
} else {
|
||||
return removeData.call( this );
|
||||
}
|
||||
};
|
||||
})( $.fn.removeData );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// deprecated
|
||||
|
||||
(function() {
|
||||
var uaMatch = /msie ([\w.]+)/.exec( navigator.userAgent.toLowerCase() ) || [];
|
||||
$.ui.ie = uaMatch.length ? true : false;
|
||||
$.ui.ie6 = parseFloat( uaMatch[ 1 ], 10 ) === 6;
|
||||
})();
|
||||
|
||||
$.fn.extend({
|
||||
disableSelection: function() {
|
||||
return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) +
|
||||
".ui-disableSelection", function( event ) {
|
||||
event.preventDefault();
|
||||
});
|
||||
},
|
||||
|
||||
enableSelection: function() {
|
||||
return this.unbind( ".ui-disableSelection" );
|
||||
}
|
||||
});
|
||||
|
||||
$.extend( $.ui, {
|
||||
// $.ui.plugin is deprecated. Use the proxy pattern instead.
|
||||
plugin: {
|
||||
add: function( module, option, set ) {
|
||||
var i,
|
||||
proto = $.ui[ module ].prototype;
|
||||
for ( i in set ) {
|
||||
proto.plugins[ i ] = proto.plugins[ i ] || [];
|
||||
proto.plugins[ i ].push( [ option, set[ i ] ] );
|
||||
}
|
||||
},
|
||||
call: function( instance, name, args ) {
|
||||
var i,
|
||||
set = instance.plugins[ name ];
|
||||
if ( !set || !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) {
|
||||
return;
|
||||
}
|
||||
|
||||
for ( i = 0; i < set.length; i++ ) {
|
||||
if ( instance.options[ set[ i ][ 0 ] ] ) {
|
||||
set[ i ][ 1 ].apply( instance.element, args );
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
contains: $.contains,
|
||||
|
||||
// only used by resizable
|
||||
hasScroll: function( el, a ) {
|
||||
|
||||
//If overflow is hidden, the element might have extra content, but the user wants to hide it
|
||||
if ( $( el ).css( "overflow" ) === "hidden") {
|
||||
return false;
|
||||
}
|
||||
|
||||
var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
|
||||
has = false;
|
||||
|
||||
if ( el[ scroll ] > 0 ) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// TODO: determine which cases actually cause this to happen
|
||||
// if the element doesn't have the scroll set, see if it's possible to
|
||||
// set the scroll
|
||||
el[ scroll ] = 1;
|
||||
has = ( el[ scroll ] > 0 );
|
||||
el[ scroll ] = 0;
|
||||
return has;
|
||||
},
|
||||
|
||||
// these are odd functions, fix the API or move into individual plugins
|
||||
isOverAxis: function( x, reference, size ) {
|
||||
//Determines when x coordinate is over "b" element axis
|
||||
return ( x > reference ) && ( x < ( reference + size ) );
|
||||
},
|
||||
isOver: function( y, x, top, left, height, width ) {
|
||||
//Determines when x, y coordinates is over "b" element
|
||||
return $.ui.isOverAxis( y, top, height ) && $.ui.isOverAxis( x, left, width );
|
||||
}
|
||||
});
|
||||
|
||||
})( jQuery );
|
858
assets/js/jquery.ui.dialog.js
vendored
Executable file
@ -0,0 +1,858 @@
|
||||
/*!
|
||||
* jQuery UI Dialog 1.9.2
|
||||
* http://jqueryui.com
|
||||
*
|
||||
* Copyright 2012 jQuery Foundation and other contributors
|
||||
* Released under the MIT license.
|
||||
* http://jquery.org/license
|
||||
*
|
||||
* http://api.jqueryui.com/dialog/
|
||||
*
|
||||
* Depends:
|
||||
* jquery.ui.core.js
|
||||
* jquery.ui.widget.js
|
||||
* jquery.ui.button.js
|
||||
* jquery.ui.draggable.js
|
||||
* jquery.ui.mouse.js
|
||||
* jquery.ui.position.js
|
||||
* jquery.ui.resizable.js
|
||||
*/
|
||||
(function( $, undefined ) {
|
||||
|
||||
var uiDialogClasses = "ui-dialog ui-widget ui-widget-content ui-corner-all ",
|
||||
sizeRelatedOptions = {
|
||||
buttons: true,
|
||||
height: true,
|
||||
maxHeight: true,
|
||||
maxWidth: true,
|
||||
minHeight: true,
|
||||
minWidth: true,
|
||||
width: true
|
||||
},
|
||||
resizableRelatedOptions = {
|
||||
maxHeight: true,
|
||||
maxWidth: true,
|
||||
minHeight: true,
|
||||
minWidth: true
|
||||
};
|
||||
|
||||
$.widget("ui.dialog", {
|
||||
version: "1.9.2",
|
||||
options: {
|
||||
autoOpen: true,
|
||||
buttons: {},
|
||||
closeOnEscape: true,
|
||||
closeText: "close",
|
||||
dialogClass: "",
|
||||
draggable: true,
|
||||
hide: null,
|
||||
height: "auto",
|
||||
maxHeight: false,
|
||||
maxWidth: false,
|
||||
minHeight: 150,
|
||||
minWidth: 150,
|
||||
modal: false,
|
||||
position: {
|
||||
my: "center",
|
||||
at: "center",
|
||||
of: window,
|
||||
collision: "fit",
|
||||
// ensure that the titlebar is never outside the document
|
||||
using: function( pos ) {
|
||||
var topOffset = $( this ).css( pos ).offset().top;
|
||||
if ( topOffset < 0 ) {
|
||||
$( this ).css( "top", pos.top - topOffset );
|
||||
}
|
||||
}
|
||||
},
|
||||
resizable: true,
|
||||
show: null,
|
||||
stack: true,
|
||||
title: "",
|
||||
width: 300,
|
||||
zIndex: 1000
|
||||
},
|
||||
|
||||
_create: function() {
|
||||
this.originalTitle = this.element.attr( "title" );
|
||||
// #5742 - .attr() might return a DOMElement
|
||||
if ( typeof this.originalTitle !== "string" ) {
|
||||
this.originalTitle = "";
|
||||
}
|
||||
this.oldPosition = {
|
||||
parent: this.element.parent(),
|
||||
index: this.element.parent().children().index( this.element )
|
||||
};
|
||||
this.options.title = this.options.title || this.originalTitle;
|
||||
var that = this,
|
||||
options = this.options,
|
||||
|
||||
title = options.title || " ",
|
||||
uiDialog,
|
||||
uiDialogTitlebar,
|
||||
uiDialogTitlebarClose,
|
||||
uiDialogTitle,
|
||||
uiDialogButtonPane;
|
||||
|
||||
uiDialog = ( this.uiDialog = $( "<div>" ) )
|
||||
.addClass( uiDialogClasses + options.dialogClass )
|
||||
.css({
|
||||
display: "none",
|
||||
outline: 0, // TODO: move to stylesheet
|
||||
zIndex: options.zIndex
|
||||
})
|
||||
// setting tabIndex makes the div focusable
|
||||
.attr( "tabIndex", -1)
|
||||
.keydown(function( event ) {
|
||||
if ( options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
|
||||
event.keyCode === $.ui.keyCode.ESCAPE ) {
|
||||
that.close( event );
|
||||
event.preventDefault();
|
||||
}
|
||||
})
|
||||
.mousedown(function( event ) {
|
||||
that.moveToTop( false, event );
|
||||
})
|
||||
.appendTo( "body" );
|
||||
|
||||
this.element
|
||||
.show()
|
||||
.removeAttr( "title" )
|
||||
.addClass( "ui-dialog-content ui-widget-content" )
|
||||
.appendTo( uiDialog );
|
||||
|
||||
uiDialogTitlebar = ( this.uiDialogTitlebar = $( "<div>" ) )
|
||||
.addClass( "ui-dialog-titlebar ui-widget-header " +
|
||||
"ui-corner-all ui-helper-clearfix" )
|
||||
.bind( "mousedown", function() {
|
||||
// Dialog isn't getting focus when dragging (#8063)
|
||||
uiDialog.focus();
|
||||
})
|
||||
.prependTo( uiDialog );
|
||||
|
||||
uiDialogTitlebarClose = $( "<a href='#'></a>" )
|
||||
.addClass( "ui-dialog-titlebar-close ui-corner-all" )
|
||||
.attr( "role", "button" )
|
||||
.click(function( event ) {
|
||||
event.preventDefault();
|
||||
that.close( event );
|
||||
})
|
||||
.appendTo( uiDialogTitlebar );
|
||||
|
||||
( this.uiDialogTitlebarCloseText = $( "<span>" ) )
|
||||
.addClass( "ui-icon ui-icon-closethick" )
|
||||
.text( options.closeText )
|
||||
.appendTo( uiDialogTitlebarClose );
|
||||
|
||||
uiDialogTitle = $( "<span>" )
|
||||
.uniqueId()
|
||||
.addClass( "ui-dialog-title" )
|
||||
.html( title )
|
||||
.prependTo( uiDialogTitlebar );
|
||||
|
||||
uiDialogButtonPane = ( this.uiDialogButtonPane = $( "<div>" ) )
|
||||
.addClass( "ui-dialog-buttonpane ui-widget-content ui-helper-clearfix" );
|
||||
|
||||
( this.uiButtonSet = $( "<div>" ) )
|
||||
.addClass( "ui-dialog-buttonset" )
|
||||
.appendTo( uiDialogButtonPane );
|
||||
|
||||
uiDialog.attr({
|
||||
role: "dialog",
|
||||
"aria-labelledby": uiDialogTitle.attr( "id" )
|
||||
});
|
||||
|
||||
uiDialogTitlebar.find( "*" ).add( uiDialogTitlebar ).disableSelection();
|
||||
this._hoverable( uiDialogTitlebarClose );
|
||||
this._focusable( uiDialogTitlebarClose );
|
||||
|
||||
if ( options.draggable && $.fn.draggable ) {
|
||||
this._makeDraggable();
|
||||
}
|
||||
if ( options.resizable && $.fn.resizable ) {
|
||||
this._makeResizable();
|
||||
}
|
||||
|
||||
this._createButtons( options.buttons );
|
||||
this._isOpen = false;
|
||||
|
||||
if ( $.fn.bgiframe ) {
|
||||
uiDialog.bgiframe();
|
||||
}
|
||||
|
||||
// prevent tabbing out of modal dialogs
|
||||
this._on( uiDialog, { keydown: function( event ) {
|
||||
if ( !options.modal || event.keyCode !== $.ui.keyCode.TAB ) {
|
||||
return;
|
||||
}
|
||||
|
||||
var tabbables = $( ":tabbable", uiDialog ),
|
||||
first = tabbables.filter( ":first" ),
|
||||
last = tabbables.filter( ":last" );
|
||||
|
||||
if ( event.target === last[0] && !event.shiftKey ) {
|
||||
first.focus( 1 );
|
||||
return false;
|
||||
} else if ( event.target === first[0] && event.shiftKey ) {
|
||||
last.focus( 1 );
|
||||
return false;
|
||||
}
|
||||
}});
|
||||
},
|
||||
|
||||
_init: function() {
|
||||
if ( this.options.autoOpen ) {
|
||||
this.open();
|
||||
}
|
||||
},
|
||||
|
||||
_destroy: function() {
|
||||
var next,
|
||||
oldPosition = this.oldPosition;
|
||||
|
||||
if ( this.overlay ) {
|
||||
this.overlay.destroy();
|
||||
}
|
||||
this.uiDialog.hide();
|
||||
this.element
|
||||
.removeClass( "ui-dialog-content ui-widget-content" )
|
||||
.hide()
|
||||
.appendTo( "body" );
|
||||
this.uiDialog.remove();
|
||||
|
||||
if ( this.originalTitle ) {
|
||||
this.element.attr( "title", this.originalTitle );
|
||||
}
|
||||
|
||||
next = oldPosition.parent.children().eq( oldPosition.index );
|
||||
// Don't try to place the dialog next to itself (#8613)
|
||||
if ( next.length && next[ 0 ] !== this.element[ 0 ] ) {
|
||||
next.before( this.element );
|
||||
} else {
|
||||
oldPosition.parent.append( this.element );
|
||||
}
|
||||
},
|
||||
|
||||
widget: function() {
|
||||
return this.uiDialog;
|
||||
},
|
||||
|
||||
close: function( event ) {
|
||||
var that = this,
|
||||
maxZ, thisZ;
|
||||
|
||||
if ( !this._isOpen ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( false === this._trigger( "beforeClose", event ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
this._isOpen = false;
|
||||
|
||||
if ( this.overlay ) {
|
||||
this.overlay.destroy();
|
||||
}
|
||||
|
||||
if ( this.options.hide ) {
|
||||
this._hide( this.uiDialog, this.options.hide, function() {
|
||||
that._trigger( "close", event );
|
||||
});
|
||||
} else {
|
||||
this.uiDialog.hide();
|
||||
this._trigger( "close", event );
|
||||
}
|
||||
|
||||
$.ui.dialog.overlay.resize();
|
||||
|
||||
// adjust the maxZ to allow other modal dialogs to continue to work (see #4309)
|
||||
if ( this.options.modal ) {
|
||||
maxZ = 0;
|
||||
$( ".ui-dialog" ).each(function() {
|
||||
if ( this !== that.uiDialog[0] ) {
|
||||
thisZ = $( this ).css( "z-index" );
|
||||
if ( !isNaN( thisZ ) ) {
|
||||
maxZ = Math.max( maxZ, thisZ );
|
||||
}
|
||||
}
|
||||
});
|
||||
$.ui.dialog.maxZ = maxZ;
|
||||
}
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
isOpen: function() {
|
||||
return this._isOpen;
|
||||
},
|
||||
|
||||
// the force parameter allows us to move modal dialogs to their correct
|
||||
// position on open
|
||||
moveToTop: function( force, event ) {
|
||||
var options = this.options,
|
||||
saveScroll;
|
||||
|
||||
if ( ( options.modal && !force ) ||
|
||||
( !options.stack && !options.modal ) ) {
|
||||
return this._trigger( "focus", event );
|
||||
}
|
||||
|
||||
if ( options.zIndex > $.ui.dialog.maxZ ) {
|
||||
$.ui.dialog.maxZ = options.zIndex;
|
||||
}
|
||||
if ( this.overlay ) {
|
||||
$.ui.dialog.maxZ += 1;
|
||||
$.ui.dialog.overlay.maxZ = $.ui.dialog.maxZ;
|
||||
this.overlay.$el.css( "z-index", $.ui.dialog.overlay.maxZ );
|
||||
}
|
||||
|
||||
// Save and then restore scroll
|
||||
// Opera 9.5+ resets when parent z-index is changed.
|
||||
// http://bugs.jqueryui.com/ticket/3193
|
||||
saveScroll = {
|
||||
scrollTop: this.element.scrollTop(),
|
||||
scrollLeft: this.element.scrollLeft()
|
||||
};
|
||||
$.ui.dialog.maxZ += 1;
|
||||
this.uiDialog.css( "z-index", $.ui.dialog.maxZ );
|
||||
this.element.attr( saveScroll );
|
||||
this._trigger( "focus", event );
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
open: function() {
|
||||
if ( this._isOpen ) {
|
||||
return;
|
||||
}
|
||||
|
||||
var hasFocus,
|
||||
options = this.options,
|
||||
uiDialog = this.uiDialog;
|
||||
|
||||
this._size();
|
||||
this._position( options.position );
|
||||
uiDialog.show( options.show );
|
||||
this.overlay = options.modal ? new $.ui.dialog.overlay( this ) : null;
|
||||
this.moveToTop( true );
|
||||
|
||||
// set focus to the first tabbable element in the content area or the first button
|
||||
// if there are no tabbable elements, set focus on the dialog itself
|
||||
hasFocus = this.element.find( ":tabbable" );
|
||||
if ( !hasFocus.length ) {
|
||||
hasFocus = this.uiDialogButtonPane.find( ":tabbable" );
|
||||
if ( !hasFocus.length ) {
|
||||
hasFocus = uiDialog;
|
||||
}
|
||||
}
|
||||
hasFocus.eq( 0 ).focus();
|
||||
|
||||
this._isOpen = true;
|
||||
this._trigger( "open" );
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
_createButtons: function( buttons ) {
|
||||
var that = this,
|
||||
hasButtons = false;
|
||||
|
||||
// if we already have a button pane, remove it
|
||||
this.uiDialogButtonPane.remove();
|
||||
this.uiButtonSet.empty();
|
||||
|
||||
if ( typeof buttons === "object" && buttons !== null ) {
|
||||
$.each( buttons, function() {
|
||||
return !(hasButtons = true);
|
||||
});
|
||||
}
|
||||
if ( hasButtons ) {
|
||||
$.each( buttons, function( name, props ) {
|
||||
var button, click;
|
||||
props = $.isFunction( props ) ?
|
||||
{ click: props, text: name } :
|
||||
props;
|
||||
// Default to a non-submitting button
|
||||
props = $.extend( { type: "button" }, props );
|
||||
// Change the context for the click callback to be the main element
|
||||
click = props.click;
|
||||
props.click = function() {
|
||||
click.apply( that.element[0], arguments );
|
||||
};
|
||||
button = $( "<button></button>", props )
|
||||
.appendTo( that.uiButtonSet );
|
||||
if ( $.fn.button ) {
|
||||
button.button();
|
||||
}
|
||||
});
|
||||
this.uiDialog.addClass( "ui-dialog-buttons" );
|
||||
this.uiDialogButtonPane.appendTo( this.uiDialog );
|
||||
} else {
|
||||
this.uiDialog.removeClass( "ui-dialog-buttons" );
|
||||
}
|
||||
},
|
||||
|
||||
_makeDraggable: function() {
|
||||
var that = this,
|
||||
options = this.options;
|
||||
|
||||
function filteredUi( ui ) {
|
||||
return {
|
||||
position: ui.position,
|
||||
offset: ui.offset
|
||||
};
|
||||
}
|
||||
|
||||
this.uiDialog.draggable({
|
||||
cancel: ".ui-dialog-content, .ui-dialog-titlebar-close",
|
||||
handle: ".ui-dialog-titlebar",
|
||||
containment: "document",
|
||||
start: function( event, ui ) {
|
||||
$( this )
|
||||
.addClass( "ui-dialog-dragging" );
|
||||
that._trigger( "dragStart", event, filteredUi( ui ) );
|
||||
},
|
||||
drag: function( event, ui ) {
|
||||
that._trigger( "drag", event, filteredUi( ui ) );
|
||||
},
|
||||
stop: function( event, ui ) {
|
||||
options.position = [
|
||||
ui.position.left - that.document.scrollLeft(),
|
||||
ui.position.top - that.document.scrollTop()
|
||||
];
|
||||
$( this )
|
||||
.removeClass( "ui-dialog-dragging" );
|
||||
that._trigger( "dragStop", event, filteredUi( ui ) );
|
||||
$.ui.dialog.overlay.resize();
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
_makeResizable: function( handles ) {
|
||||
handles = (handles === undefined ? this.options.resizable : handles);
|
||||
var that = this,
|
||||
options = this.options,
|
||||
// .ui-resizable has position: relative defined in the stylesheet
|
||||
// but dialogs have to use absolute or fixed positioning
|
||||
position = this.uiDialog.css( "position" ),
|
||||
resizeHandles = typeof handles === 'string' ?
|
||||
handles :
|
||||
"n,e,s,w,se,sw,ne,nw";
|
||||
|
||||
function filteredUi( ui ) {
|
||||
return {
|
||||
originalPosition: ui.originalPosition,
|
||||
originalSize: ui.originalSize,
|
||||
position: ui.position,
|
||||
size: ui.size
|
||||
};
|
||||
}
|
||||
|
||||
this.uiDialog.resizable({
|
||||
cancel: ".ui-dialog-content",
|
||||
containment: "document",
|
||||
alsoResize: this.element,
|
||||
maxWidth: options.maxWidth,
|
||||
maxHeight: options.maxHeight,
|
||||
minWidth: options.minWidth,
|
||||
minHeight: this._minHeight(),
|
||||
handles: resizeHandles,
|
||||
start: function( event, ui ) {
|
||||
$( this ).addClass( "ui-dialog-resizing" );
|
||||
that._trigger( "resizeStart", event, filteredUi( ui ) );
|
||||
},
|
||||
resize: function( event, ui ) {
|
||||
that._trigger( "resize", event, filteredUi( ui ) );
|
||||
},
|
||||
stop: function( event, ui ) {
|
||||
$( this ).removeClass( "ui-dialog-resizing" );
|
||||
options.height = $( this ).height();
|
||||
options.width = $( this ).width();
|
||||
that._trigger( "resizeStop", event, filteredUi( ui ) );
|
||||
$.ui.dialog.overlay.resize();
|
||||
}
|
||||
})
|
||||
.css( "position", position )
|
||||
.find( ".ui-resizable-se" )
|
||||
.addClass( "ui-icon ui-icon-grip-diagonal-se" );
|
||||
},
|
||||
|
||||
_minHeight: function() {
|
||||
var options = this.options;
|
||||
|
||||
if ( options.height === "auto" ) {
|
||||
return options.minHeight;
|
||||
} else {
|
||||
return Math.min( options.minHeight, options.height );
|
||||
}
|
||||
},
|
||||
|
||||
_position: function( position ) {
|
||||
var myAt = [],
|
||||
offset = [ 0, 0 ],
|
||||
isVisible;
|
||||
|
||||
if ( position ) {
|
||||
// deep extending converts arrays to objects in jQuery <= 1.3.2 :-(
|
||||
// if (typeof position == 'string' || $.isArray(position)) {
|
||||
// myAt = $.isArray(position) ? position : position.split(' ');
|
||||
|
||||
if ( typeof position === "string" || (typeof position === "object" && "0" in position ) ) {
|
||||
myAt = position.split ? position.split( " " ) : [ position[ 0 ], position[ 1 ] ];
|
||||
if ( myAt.length === 1 ) {
|
||||
myAt[ 1 ] = myAt[ 0 ];
|
||||
}
|
||||
|
||||
$.each( [ "left", "top" ], function( i, offsetPosition ) {
|
||||
if ( +myAt[ i ] === myAt[ i ] ) {
|
||||
offset[ i ] = myAt[ i ];
|
||||
myAt[ i ] = offsetPosition;
|
||||
}
|
||||
});
|
||||
|
||||
position = {
|
||||
my: myAt[0] + (offset[0] < 0 ? offset[0] : "+" + offset[0]) + " " +
|
||||
myAt[1] + (offset[1] < 0 ? offset[1] : "+" + offset[1]),
|
||||
at: myAt.join( " " )
|
||||
};
|
||||
}
|
||||
|
||||
position = $.extend( {}, $.ui.dialog.prototype.options.position, position );
|
||||
} else {
|
||||
position = $.ui.dialog.prototype.options.position;
|
||||
}
|
||||
|
||||
// need to show the dialog to get the actual offset in the position plugin
|
||||
isVisible = this.uiDialog.is( ":visible" );
|
||||
if ( !isVisible ) {
|
||||
this.uiDialog.show();
|
||||
}
|
||||
this.uiDialog.position( position );
|
||||
if ( !isVisible ) {
|
||||
this.uiDialog.hide();
|
||||
}
|
||||
},
|
||||
|
||||
_setOptions: function( options ) {
|
||||
var that = this,
|
||||
resizableOptions = {},
|
||||
resize = false;
|
||||
|
||||
$.each( options, function( key, value ) {
|
||||
that._setOption( key, value );
|
||||
|
||||
if ( key in sizeRelatedOptions ) {
|
||||
resize = true;
|
||||
}
|
||||
if ( key in resizableRelatedOptions ) {
|
||||
resizableOptions[ key ] = value;
|
||||
}
|
||||
});
|
||||
|
||||
if ( resize ) {
|
||||
this._size();
|
||||
}
|
||||
if ( this.uiDialog.is( ":data(resizable)" ) ) {
|
||||
this.uiDialog.resizable( "option", resizableOptions );
|
||||
}
|
||||
},
|
||||
|
||||
_setOption: function( key, value ) {
|
||||
var isDraggable, isResizable,
|
||||
uiDialog = this.uiDialog;
|
||||
|
||||
switch ( key ) {
|
||||
case "buttons":
|
||||
this._createButtons( value );
|
||||
break;
|
||||
case "closeText":
|
||||
// ensure that we always pass a string
|
||||
this.uiDialogTitlebarCloseText.text( "" + value );
|
||||
break;
|
||||
case "dialogClass":
|
||||
uiDialog
|
||||
.removeClass( this.options.dialogClass )
|
||||
.addClass( uiDialogClasses + value );
|
||||
break;
|
||||
case "disabled":
|
||||
if ( value ) {
|
||||
uiDialog.addClass( "ui-dialog-disabled" );
|
||||
} else {
|
||||
uiDialog.removeClass( "ui-dialog-disabled" );
|
||||
}
|
||||
break;
|
||||
case "draggable":
|
||||
isDraggable = uiDialog.is( ":data(draggable)" );
|
||||
if ( isDraggable && !value ) {
|
||||
uiDialog.draggable( "destroy" );
|
||||
}
|
||||
|
||||
if ( !isDraggable && value ) {
|
||||
this._makeDraggable();
|
||||
}
|
||||
break;
|
||||
case "position":
|
||||
this._position( value );
|
||||
break;
|
||||
case "resizable":
|
||||
// currently resizable, becoming non-resizable
|
||||
isResizable = uiDialog.is( ":data(resizable)" );
|
||||
if ( isResizable && !value ) {
|
||||
uiDialog.resizable( "destroy" );
|
||||
}
|
||||
|
||||
// currently resizable, changing handles
|
||||
if ( isResizable && typeof value === "string" ) {
|
||||
uiDialog.resizable( "option", "handles", value );
|
||||
}
|
||||
|
||||
// currently non-resizable, becoming resizable
|
||||
if ( !isResizable && value !== false ) {
|
||||
this._makeResizable( value );
|
||||
}
|
||||
break;
|
||||
case "title":
|
||||
// convert whatever was passed in o a string, for html() to not throw up
|
||||
$( ".ui-dialog-title", this.uiDialogTitlebar )
|
||||
.html( "" + ( value || " " ) );
|
||||
break;
|
||||
}
|
||||
|
||||
this._super( key, value );
|
||||
},
|
||||
|
||||
_size: function() {
|
||||
/* If the user has resized the dialog, the .ui-dialog and .ui-dialog-content
|
||||
* divs will both have width and height set, so we need to reset them
|
||||
*/
|
||||
var nonContentHeight, minContentHeight, autoHeight,
|
||||
options = this.options,
|
||||
isVisible = this.uiDialog.is( ":visible" );
|
||||
|
||||
// reset content sizing
|
||||
this.element.show().css({
|
||||
width: "auto",
|
||||
minHeight: 0,
|
||||
height: 0
|
||||
});
|
||||
|
||||
if ( options.minWidth > options.width ) {
|
||||
options.width = options.minWidth;
|
||||
}
|
||||
|
||||
// reset wrapper sizing
|
||||
// determine the height of all the non-content elements
|
||||
nonContentHeight = this.uiDialog.css({
|
||||
height: "auto",
|
||||
width: options.width
|
||||
})
|
||||
.outerHeight();
|
||||
minContentHeight = Math.max( 0, options.minHeight - nonContentHeight );
|
||||
|
||||
if ( options.height === "auto" ) {
|
||||
// only needed for IE6 support
|
||||
if ( $.support.minHeight ) {
|
||||
this.element.css({
|
||||
minHeight: minContentHeight,
|
||||
height: "auto"
|
||||
});
|
||||
} else {
|
||||
this.uiDialog.show();
|
||||
autoHeight = this.element.css( "height", "auto" ).height();
|
||||
if ( !isVisible ) {
|
||||
this.uiDialog.hide();
|
||||
}
|
||||
this.element.height( Math.max( autoHeight, minContentHeight ) );
|
||||
}
|
||||
} else {
|
||||
this.element.height( Math.max( options.height - nonContentHeight, 0 ) );
|
||||
}
|
||||
|
||||
if (this.uiDialog.is( ":data(resizable)" ) ) {
|
||||
this.uiDialog.resizable( "option", "minHeight", this._minHeight() );
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
$.extend($.ui.dialog, {
|
||||
uuid: 0,
|
||||
maxZ: 0,
|
||||
|
||||
getTitleId: function($el) {
|
||||
var id = $el.attr( "id" );
|
||||
if ( !id ) {
|
||||
this.uuid += 1;
|
||||
id = this.uuid;
|
||||
}
|
||||
return "ui-dialog-title-" + id;
|
||||
},
|
||||
|
||||
overlay: function( dialog ) {
|
||||
this.$el = $.ui.dialog.overlay.create( dialog );
|
||||
}
|
||||
});
|
||||
|
||||
$.extend( $.ui.dialog.overlay, {
|
||||
instances: [],
|
||||
// reuse old instances due to IE memory leak with alpha transparency (see #5185)
|
||||
oldInstances: [],
|
||||
maxZ: 0,
|
||||
events: $.map(
|
||||
"focus,mousedown,mouseup,keydown,keypress,click".split( "," ),
|
||||
function( event ) {
|
||||
return event + ".dialog-overlay";
|
||||
}
|
||||
).join( " " ),
|
||||
create: function( dialog ) {
|
||||
if ( this.instances.length === 0 ) {
|
||||
// prevent use of anchors and inputs
|
||||
// we use a setTimeout in case the overlay is created from an
|
||||
// event that we're going to be cancelling (see #2804)
|
||||
setTimeout(function() {
|
||||
// handle $(el).dialog().dialog('close') (see #4065)
|
||||
if ( $.ui.dialog.overlay.instances.length ) {
|
||||
$( document ).bind( $.ui.dialog.overlay.events, function( event ) {
|
||||
// stop events if the z-index of the target is < the z-index of the overlay
|
||||
// we cannot return true when we don't want to cancel the event (#3523)
|
||||
if ( $( event.target ).zIndex() < $.ui.dialog.overlay.maxZ ) {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
}
|
||||
}, 1 );
|
||||
|
||||
// handle window resize
|
||||
$( window ).bind( "resize.dialog-overlay", $.ui.dialog.overlay.resize );
|
||||
}
|
||||
|
||||
var $el = ( this.oldInstances.pop() || $( "<div>" ).addClass( "ui-widget-overlay" ) );
|
||||
|
||||
// allow closing by pressing the escape key
|
||||
$( document ).bind( "keydown.dialog-overlay", function( event ) {
|
||||
var instances = $.ui.dialog.overlay.instances;
|
||||
// only react to the event if we're the top overlay
|
||||
if ( instances.length !== 0 && instances[ instances.length - 1 ] === $el &&
|
||||
dialog.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
|
||||
event.keyCode === $.ui.keyCode.ESCAPE ) {
|
||||
|
||||
dialog.close( event );
|
||||
event.preventDefault();
|
||||
}
|
||||
});
|
||||
|
||||
$el.appendTo( document.body ).css({
|
||||
width: this.width(),
|
||||
height: this.height()
|
||||
});
|
||||
|
||||
if ( $.fn.bgiframe ) {
|
||||
$el.bgiframe();
|
||||
}
|
||||
|
||||
this.instances.push( $el );
|
||||
return $el;
|
||||
},
|
||||
|
||||
destroy: function( $el ) {
|
||||
var indexOf = $.inArray( $el, this.instances ),
|
||||
maxZ = 0;
|
||||
|
||||
if ( indexOf !== -1 ) {
|
||||
this.oldInstances.push( this.instances.splice( indexOf, 1 )[ 0 ] );
|
||||
}
|
||||
|
||||
if ( this.instances.length === 0 ) {
|
||||
$( [ document, window ] ).unbind( ".dialog-overlay" );
|
||||
}
|
||||
|
||||
$el.height( 0 ).width( 0 ).remove();
|
||||
|
||||
// adjust the maxZ to allow other modal dialogs to continue to work (see #4309)
|
||||
$.each( this.instances, function() {
|
||||
maxZ = Math.max( maxZ, this.css( "z-index" ) );
|
||||
});
|
||||
this.maxZ = maxZ;
|
||||
},
|
||||
|
||||
height: function() {
|
||||
var scrollHeight,
|
||||
offsetHeight;
|
||||
// handle IE
|
||||
if ( $.ui.ie ) {
|
||||
scrollHeight = Math.max(
|
||||
document.documentElement.scrollHeight,
|
||||
document.body.scrollHeight
|
||||
);
|
||||
offsetHeight = Math.max(
|
||||
document.documentElement.offsetHeight,
|
||||
document.body.offsetHeight
|
||||
);
|
||||
|
||||
if ( scrollHeight < offsetHeight ) {
|
||||
return $( window ).height() + "px";
|
||||
} else {
|
||||
return scrollHeight + "px";
|
||||
}
|
||||
// handle "good" browsers
|
||||
} else {
|
||||
return $( document ).height() + "px";
|
||||
}
|
||||
},
|
||||
|
||||
width: function() {
|
||||
var scrollWidth,
|
||||
offsetWidth;
|
||||
// handle IE
|
||||
if ( $.ui.ie ) {
|
||||
scrollWidth = Math.max(
|
||||
document.documentElement.scrollWidth,
|
||||
document.body.scrollWidth
|
||||
);
|
||||
offsetWidth = Math.max(
|
||||
document.documentElement.offsetWidth,
|
||||
document.body.offsetWidth
|
||||
);
|
||||
|
||||
if ( scrollWidth < offsetWidth ) {
|
||||
return $( window ).width() + "px";
|
||||
} else {
|
||||
return scrollWidth + "px";
|
||||
}
|
||||
// handle "good" browsers
|
||||
} else {
|
||||
return $( document ).width() + "px";
|
||||
}
|
||||
},
|
||||
|
||||
resize: function() {
|
||||
/* If the dialog is draggable and the user drags it past the
|
||||
* right edge of the window, the document becomes wider so we
|
||||
* need to stretch the overlay. If the user then drags the
|
||||
* dialog back to the left, the document will become narrower,
|
||||
* so we need to shrink the overlay to the appropriate size.
|
||||
* This is handled by shrinking the overlay before setting it
|
||||
* to the full document size.
|
||||
*/
|
||||
var $overlays = $( [] );
|
||||
$.each( $.ui.dialog.overlay.instances, function() {
|
||||
$overlays = $overlays.add( this );
|
||||
});
|
||||
|
||||
$overlays.css({
|
||||
width: 0,
|
||||
height: 0
|
||||
}).css({
|
||||
width: $.ui.dialog.overlay.width(),
|
||||
height: $.ui.dialog.overlay.height()
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
$.extend( $.ui.dialog.overlay.prototype, {
|
||||
destroy: function() {
|
||||
$.ui.dialog.overlay.destroy( this.$el );
|
||||
}
|
||||
});
|
||||
|
||||
}( jQuery ) );
|
958
assets/js/jquery.ui.draggable.js
vendored
Executable file
@ -0,0 +1,958 @@
|
||||
/*!
|
||||
* jQuery UI Draggable 1.10.3
|
||||
* http://jqueryui.com
|
||||
*
|
||||
* Copyright 2013 jQuery Foundation and other contributors
|
||||
* Released under the MIT license.
|
||||
* http://jquery.org/license
|
||||
*
|
||||
* http://api.jqueryui.com/draggable/
|
||||
*
|
||||
* Depends:
|
||||
* jquery.ui.core.js
|
||||
* jquery.ui.mouse.js
|
||||
* jquery.ui.widget.js
|
||||
*/
|
||||
(function( $, undefined ) {
|
||||
|
||||
$.widget("ui.draggable", $.ui.mouse, {
|
||||
version: "1.10.3",
|
||||
widgetEventPrefix: "drag",
|
||||
options: {
|
||||
addClasses: true,
|
||||
appendTo: "parent",
|
||||
axis: false,
|
||||
connectToSortable: false,
|
||||
containment: false,
|
||||
cursor: "auto",
|
||||
cursorAt: false,
|
||||
grid: false,
|
||||
handle: false,
|
||||
helper: "original",
|
||||
iframeFix: false,
|
||||
opacity: false,
|
||||
refreshPositions: false,
|
||||
revert: false,
|
||||
revertDuration: 500,
|
||||
scope: "default",
|
||||
scroll: true,
|
||||
scrollSensitivity: 20,
|
||||
scrollSpeed: 20,
|
||||
snap: false,
|
||||
snapMode: "both",
|
||||
snapTolerance: 20,
|
||||
stack: false,
|
||||
zIndex: false,
|
||||
|
||||
// callbacks
|
||||
drag: null,
|
||||
start: null,
|
||||
stop: null
|
||||
},
|
||||
_create: function() {
|
||||
|
||||
if (this.options.helper === "original" && !(/^(?:r|a|f)/).test(this.element.css("position"))) {
|
||||
this.element[0].style.position = "relative";
|
||||
}
|
||||
if (this.options.addClasses){
|
||||
this.element.addClass("ui-draggable");
|
||||
}
|
||||
if (this.options.disabled){
|
||||
this.element.addClass("ui-draggable-disabled");
|
||||
}
|
||||
|
||||
this._mouseInit();
|
||||
|
||||
},
|
||||
|
||||
_destroy: function() {
|
||||
this.element.removeClass( "ui-draggable ui-draggable-dragging ui-draggable-disabled" );
|
||||
this._mouseDestroy();
|
||||
},
|
||||
|
||||
_mouseCapture: function(event) {
|
||||
|
||||
var o = this.options;
|
||||
|
||||
// among others, prevent a drag on a resizable-handle
|
||||
if (this.helper || o.disabled || $(event.target).closest(".ui-resizable-handle").length > 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
//Quit if we're not on a valid handle
|
||||
this.handle = this._getHandle(event);
|
||||
if (!this.handle) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$(o.iframeFix === true ? "iframe" : o.iframeFix).each(function() {
|
||||
$("<div class='ui-draggable-iframeFix' style='background: #fff;'></div>")
|
||||
.css({
|
||||
width: this.offsetWidth+"px", height: this.offsetHeight+"px",
|
||||
position: "absolute", opacity: "0.001", zIndex: 1000
|
||||
})
|
||||
.css($(this).offset())
|
||||
.appendTo("body");
|
||||
});
|
||||
|
||||
return true;
|
||||
|
||||
},
|
||||
|
||||
_mouseStart: function(event) {
|
||||
|
||||
var o = this.options;
|
||||
|
||||
//Create and append the visible helper
|
||||
this.helper = this._createHelper(event);
|
||||
|
||||
this.helper.addClass("ui-draggable-dragging");
|
||||
|
||||
//Cache the helper size
|
||||
this._cacheHelperProportions();
|
||||
|
||||
//If ddmanager is used for droppables, set the global draggable
|
||||
if($.ui.ddmanager) {
|
||||
$.ui.ddmanager.current = this;
|
||||
}
|
||||
|
||||
/*
|
||||
* - Position generation -
|
||||
* This block generates everything position related - it's the core of draggables.
|
||||
*/
|
||||
|
||||
//Cache the margins of the original element
|
||||
this._cacheMargins();
|
||||
|
||||
//Store the helper's css position
|
||||
this.cssPosition = this.helper.css( "position" );
|
||||
this.scrollParent = this.helper.scrollParent();
|
||||
this.offsetParent = this.helper.offsetParent();
|
||||
this.offsetParentCssPosition = this.offsetParent.css( "position" );
|
||||
|
||||
//The element's absolute position on the page minus margins
|
||||
this.offset = this.positionAbs = this.element.offset();
|
||||
this.offset = {
|
||||
top: this.offset.top - this.margins.top,
|
||||
left: this.offset.left - this.margins.left
|
||||
};
|
||||
|
||||
//Reset scroll cache
|
||||
this.offset.scroll = false;
|
||||
|
||||
$.extend(this.offset, {
|
||||
click: { //Where the click happened, relative to the element
|
||||
left: event.pageX - this.offset.left,
|
||||
top: event.pageY - this.offset.top
|
||||
},
|
||||
parent: this._getParentOffset(),
|
||||
relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
|
||||
});
|
||||
|
||||
//Generate the original position
|
||||
this.originalPosition = this.position = this._generatePosition(event);
|
||||
this.originalPageX = event.pageX;
|
||||
this.originalPageY = event.pageY;
|
||||
|
||||
//Adjust the mouse offset relative to the helper if "cursorAt" is supplied
|
||||
(o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
|
||||
|
||||
//Set a containment if given in the options
|
||||
this._setContainment();
|
||||
|
||||
//Trigger event + callbacks
|
||||
if(this._trigger("start", event) === false) {
|
||||
this._clear();
|
||||
return false;
|
||||
}
|
||||
|
||||
//Recache the helper size
|
||||
this._cacheHelperProportions();
|
||||
|
||||
//Prepare the droppable offsets
|
||||
if ($.ui.ddmanager && !o.dropBehaviour) {
|
||||
$.ui.ddmanager.prepareOffsets(this, event);
|
||||
}
|
||||
|
||||
|
||||
this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position
|
||||
|
||||
//If the ddmanager is used for droppables, inform the manager that dragging has started (see #5003)
|
||||
if ( $.ui.ddmanager ) {
|
||||
$.ui.ddmanager.dragStart(this, event);
|
||||
}
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
_mouseDrag: function(event, noPropagation) {
|
||||
// reset any necessary cached properties (see #5009)
|
||||
if ( this.offsetParentCssPosition === "fixed" ) {
|
||||
this.offset.parent = this._getParentOffset();
|
||||
}
|
||||
|
||||
//Compute the helpers position
|
||||
this.position = this._generatePosition(event);
|
||||
this.positionAbs = this._convertPositionTo("absolute");
|
||||
|
||||
//Call plugins and callbacks and use the resulting position if something is returned
|
||||
if (!noPropagation) {
|
||||
var ui = this._uiHash();
|
||||
if(this._trigger("drag", event, ui) === false) {
|
||||
this._mouseUp({});
|
||||
return false;
|
||||
}
|
||||
this.position = ui.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";
|
||||
}
|
||||
if($.ui.ddmanager) {
|
||||
$.ui.ddmanager.drag(this, event);
|
||||
}
|
||||
|
||||
return false;
|
||||
},
|
||||
|
||||
_mouseStop: function(event) {
|
||||
|
||||
//If we are using droppables, inform the manager about the drop
|
||||
var that = this,
|
||||
dropped = false;
|
||||
if ($.ui.ddmanager && !this.options.dropBehaviour) {
|
||||
dropped = $.ui.ddmanager.drop(this, event);
|
||||
}
|
||||
|
||||
//if a drop comes from outside (a sortable)
|
||||
if(this.dropped) {
|
||||
dropped = this.dropped;
|
||||
this.dropped = false;
|
||||
}
|
||||
|
||||
//if the original element is no longer in the DOM don't bother to continue (see #8269)
|
||||
if ( this.options.helper === "original" && !$.contains( this.element[ 0 ].ownerDocument, this.element[ 0 ] ) ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if((this.options.revert === "invalid" && !dropped) || (this.options.revert === "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) {
|
||||
$(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() {
|
||||
if(that._trigger("stop", event) !== false) {
|
||||
that._clear();
|
||||
}
|
||||
});
|
||||
} else {
|
||||
if(this._trigger("stop", event) !== false) {
|
||||
this._clear();
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
},
|
||||
|
||||
_mouseUp: function(event) {
|
||||
//Remove frame helpers
|
||||
$("div.ui-draggable-iframeFix").each(function() {
|
||||
this.parentNode.removeChild(this);
|
||||
});
|
||||
|
||||
//If the ddmanager is used for droppables, inform the manager that dragging has stopped (see #5003)
|
||||
if( $.ui.ddmanager ) {
|
||||
$.ui.ddmanager.dragStop(this, event);
|
||||
}
|
||||
|
||||
return $.ui.mouse.prototype._mouseUp.call(this, event);
|
||||
},
|
||||
|
||||
cancel: function() {
|
||||
|
||||
if(this.helper.is(".ui-draggable-dragging")) {
|
||||
this._mouseUp({});
|
||||
} else {
|
||||
this._clear();
|
||||
}
|
||||
|
||||
return this;
|
||||
|
||||
},
|
||||
|
||||
_getHandle: function(event) {
|
||||
return this.options.handle ?
|
||||
!!$( event.target ).closest( this.element.find( this.options.handle ) ).length :
|
||||
true;
|
||||
},
|
||||
|
||||
_createHelper: function(event) {
|
||||
|
||||
var o = this.options,
|
||||
helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event])) : (o.helper === "clone" ? this.element.clone().removeAttr("id") : this.element);
|
||||
|
||||
if(!helper.parents("body").length) {
|
||||
helper.appendTo((o.appendTo === "parent" ? this.element[0].parentNode : o.appendTo));
|
||||
}
|
||||
|
||||
if(helper[0] !== this.element[0] && !(/(fixed|absolute)/).test(helper.css("position"))) {
|
||||
helper.css("position", "absolute");
|
||||
}
|
||||
|
||||
return helper;
|
||||
|
||||
},
|
||||
|
||||
_adjustOffsetFromHelper: function(obj) {
|
||||
if (typeof obj === "string") {
|
||||
obj = obj.split(" ");
|
||||
}
|
||||
if ($.isArray(obj)) {
|
||||
obj = {left: +obj[0], top: +obj[1] || 0};
|
||||
}
|
||||
if ("left" in obj) {
|
||||
this.offset.click.left = obj.left + this.margins.left;
|
||||
}
|
||||
if ("right" in obj) {
|
||||
this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
|
||||
}
|
||||
if ("top" in obj) {
|
||||
this.offset.click.top = obj.top + this.margins.top;
|
||||
}
|
||||
if ("bottom" in obj) {
|
||||
this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
|
||||
}
|
||||
},
|
||||
|
||||
_getParentOffset: function() {
|
||||
|
||||
//Get the offsetParent and cache its position
|
||||
var po = this.offsetParent.offset();
|
||||
|
||||
// This is a special case where we need to modify a offset calculated on start, since the following happened:
|
||||
// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
|
||||
// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
|
||||
// the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
|
||||
if(this.cssPosition === "absolute" && this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) {
|
||||
po.left += this.scrollParent.scrollLeft();
|
||||
po.top += this.scrollParent.scrollTop();
|
||||
}
|
||||
|
||||
//This needs to be actually done for all browsers, since pageX/pageY includes this information
|
||||
//Ugly IE fix
|
||||
if((this.offsetParent[0] === document.body) ||
|
||||
(this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() === "html" && $.ui.ie)) {
|
||||
po = { top: 0, left: 0 };
|
||||
}
|
||||
|
||||
return {
|
||||
top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
|
||||
left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
|
||||
};
|
||||
|
||||
},
|
||||
|
||||
_getRelativeOffset: function() {
|
||||
|
||||
if(this.cssPosition === "relative") {
|
||||
var p = this.element.position();
|
||||
return {
|
||||
top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
|
||||
left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
|
||||
};
|
||||
} else {
|
||||
return { top: 0, left: 0 };
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
_cacheMargins: function() {
|
||||
this.margins = {
|
||||
left: (parseInt(this.element.css("marginLeft"),10) || 0),
|
||||
top: (parseInt(this.element.css("marginTop"),10) || 0),
|
||||
right: (parseInt(this.element.css("marginRight"),10) || 0),
|
||||
bottom: (parseInt(this.element.css("marginBottom"),10) || 0)
|
||||
};
|
||||
},
|
||||
|
||||
_cacheHelperProportions: function() {
|
||||
this.helperProportions = {
|
||||
width: this.helper.outerWidth(),
|
||||
height: this.helper.outerHeight()
|
||||
};
|
||||
},
|
||||
|
||||
_setContainment: function() {
|
||||
|
||||
var over, c, ce,
|
||||
o = this.options;
|
||||
|
||||
if ( !o.containment ) {
|
||||
this.containment = null;
|
||||
return;
|
||||
}
|
||||
|
||||
if ( o.containment === "window" ) {
|
||||
this.containment = [
|
||||
$( window ).scrollLeft() - this.offset.relative.left - this.offset.parent.left,
|
||||
$( window ).scrollTop() - this.offset.relative.top - this.offset.parent.top,
|
||||
$( window ).scrollLeft() + $( window ).width() - this.helperProportions.width - this.margins.left,
|
||||
$( window ).scrollTop() + ( $( window ).height() || document.body.parentNode.scrollHeight ) - this.helperProportions.height - this.margins.top
|
||||
];
|
||||
return;
|
||||
}
|
||||
|
||||
if ( o.containment === "document") {
|
||||
this.containment = [
|
||||
0,
|
||||
0,
|
||||
$( document ).width() - this.helperProportions.width - this.margins.left,
|
||||
( $( document ).height() || document.body.parentNode.scrollHeight ) - this.helperProportions.height - this.margins.top
|
||||
];
|
||||
return;
|
||||
}
|
||||
|
||||
if ( o.containment.constructor === Array ) {
|
||||
this.containment = o.containment;
|
||||
return;
|
||||
}
|
||||
|
||||
if ( o.containment === "parent" ) {
|
||||
o.containment = this.helper[ 0 ].parentNode;
|
||||
}
|
||||
|
||||
c = $( o.containment );
|
||||
ce = c[ 0 ];
|
||||
|
||||
if( !ce ) {
|
||||
return;
|
||||
}
|
||||
|
||||
over = c.css( "overflow" ) !== "hidden";
|
||||
|
||||
this.containment = [
|
||||
( parseInt( c.css( "borderLeftWidth" ), 10 ) || 0 ) + ( parseInt( c.css( "paddingLeft" ), 10 ) || 0 ),
|
||||
( parseInt( c.css( "borderTopWidth" ), 10 ) || 0 ) + ( parseInt( c.css( "paddingTop" ), 10 ) || 0 ) ,
|
||||
( over ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) - ( parseInt( c.css( "borderRightWidth" ), 10 ) || 0 ) - ( parseInt( c.css( "paddingRight" ), 10 ) || 0 ) - this.helperProportions.width - this.margins.left - this.margins.right,
|
||||
( over ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) - ( parseInt( c.css( "borderBottomWidth" ), 10 ) || 0 ) - ( parseInt( c.css( "paddingBottom" ), 10 ) || 0 ) - this.helperProportions.height - this.margins.top - this.margins.bottom
|
||||
];
|
||||
this.relative_container = c;
|
||||
},
|
||||
|
||||
_convertPositionTo: function(d, pos) {
|
||||
|
||||
if(!pos) {
|
||||
pos = this.position;
|
||||
}
|
||||
|
||||
var mod = d === "absolute" ? 1 : -1,
|
||||
scroll = this.cssPosition === "absolute" && !( this.scrollParent[ 0 ] !== document && $.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ? this.offsetParent : this.scrollParent;
|
||||
|
||||
//Cache the scroll
|
||||
if (!this.offset.scroll) {
|
||||
this.offset.scroll = {top : scroll.scrollTop(), left : scroll.scrollLeft()};
|
||||
}
|
||||
|
||||
return {
|
||||
top: (
|
||||
pos.top + // The absolute mouse position
|
||||
this.offset.relative.top * mod + // Only for relative positioned nodes: Relative offset from element to offset parent
|
||||
this.offset.parent.top * mod - // The offsetParent's offset without borders (offset + border)
|
||||
( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : this.offset.scroll.top ) * mod )
|
||||
),
|
||||
left: (
|
||||
pos.left + // The absolute mouse position
|
||||
this.offset.relative.left * mod + // Only for relative positioned nodes: Relative offset from element to offset parent
|
||||
this.offset.parent.left * mod - // The offsetParent's offset without borders (offset + border)
|
||||
( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : this.offset.scroll.left ) * mod )
|
||||
)
|
||||
};
|
||||
|
||||
},
|
||||
|
||||
_generatePosition: function(event) {
|
||||
|
||||
var containment, co, top, left,
|
||||
o = this.options,
|
||||
scroll = this.cssPosition === "absolute" && !( this.scrollParent[ 0 ] !== document && $.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ? this.offsetParent : this.scrollParent,
|
||||
pageX = event.pageX,
|
||||
pageY = event.pageY;
|
||||
|
||||
//Cache the scroll
|
||||
if (!this.offset.scroll) {
|
||||
this.offset.scroll = {top : scroll.scrollTop(), left : scroll.scrollLeft()};
|
||||
}
|
||||
|
||||
/*
|
||||
* - Position constraining -
|
||||
* Constrain the position to a mix of grid, containment.
|
||||
*/
|
||||
|
||||
// If we are not dragging yet, we won't check for options
|
||||
if ( this.originalPosition ) {
|
||||
if ( this.containment ) {
|
||||
if ( this.relative_container ){
|
||||
co = this.relative_container.offset();
|
||||
containment = [
|
||||
this.containment[ 0 ] + co.left,
|
||||
this.containment[ 1 ] + co.top,
|
||||
this.containment[ 2 ] + co.left,
|
||||
this.containment[ 3 ] + co.top
|
||||
];
|
||||
}
|
||||
else {
|
||||
containment = this.containment;
|
||||
}
|
||||
|
||||
if(event.pageX - this.offset.click.left < containment[0]) {
|
||||
pageX = containment[0] + this.offset.click.left;
|
||||
}
|
||||
if(event.pageY - this.offset.click.top < containment[1]) {
|
||||
pageY = containment[1] + this.offset.click.top;
|
||||
}
|
||||
if(event.pageX - this.offset.click.left > containment[2]) {
|
||||
pageX = containment[2] + this.offset.click.left;
|
||||
}
|
||||
if(event.pageY - this.offset.click.top > containment[3]) {
|
||||
pageY = containment[3] + this.offset.click.top;
|
||||
}
|
||||
}
|
||||
|
||||
if(o.grid) {
|
||||
//Check for grid elements set to 0 to prevent divide by 0 error causing invalid argument errors in IE (see ticket #6950)
|
||||
top = o.grid[1] ? this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1] : this.originalPageY;
|
||||
pageY = containment ? ((top - this.offset.click.top >= containment[1] || top - this.offset.click.top > containment[3]) ? top : ((top - this.offset.click.top >= containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
|
||||
|
||||
left = o.grid[0] ? this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0] : this.originalPageX;
|
||||
pageX = containment ? ((left - this.offset.click.left >= containment[0] || left - this.offset.click.left > containment[2]) ? left : ((left - this.offset.click.left >= containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return {
|
||||
top: (
|
||||
pageY - // The absolute mouse position
|
||||
this.offset.click.top - // Click offset (relative to the element)
|
||||
this.offset.relative.top - // Only for relative positioned nodes: Relative offset from element to offset parent
|
||||
this.offset.parent.top + // The offsetParent's offset without borders (offset + border)
|
||||
( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : this.offset.scroll.top )
|
||||
),
|
||||
left: (
|
||||
pageX - // The absolute mouse position
|
||||
this.offset.click.left - // Click offset (relative to the element)
|
||||
this.offset.relative.left - // Only for relative positioned nodes: Relative offset from element to offset parent
|
||||
this.offset.parent.left + // The offsetParent's offset without borders (offset + border)
|
||||
( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : this.offset.scroll.left )
|
||||
)
|
||||
};
|
||||
|
||||
},
|
||||
|
||||
_clear: function() {
|
||||
this.helper.removeClass("ui-draggable-dragging");
|
||||
if(this.helper[0] !== this.element[0] && !this.cancelHelperRemoval) {
|
||||
this.helper.remove();
|
||||
}
|
||||
this.helper = null;
|
||||
this.cancelHelperRemoval = false;
|
||||
},
|
||||
|
||||
// From now on bulk stuff - mainly helpers
|
||||
|
||||
_trigger: function(type, event, ui) {
|
||||
ui = ui || this._uiHash();
|
||||
$.ui.plugin.call(this, type, [event, ui]);
|
||||
//The absolute position has to be recalculated after plugins
|
||||
if(type === "drag") {
|
||||
this.positionAbs = this._convertPositionTo("absolute");
|
||||
}
|
||||
return $.Widget.prototype._trigger.call(this, type, event, ui);
|
||||
},
|
||||
|
||||
plugins: {},
|
||||
|
||||
_uiHash: function() {
|
||||
return {
|
||||
helper: this.helper,
|
||||
position: this.position,
|
||||
originalPosition: this.originalPosition,
|
||||
offset: this.positionAbs
|
||||
};
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
$.ui.plugin.add("draggable", "connectToSortable", {
|
||||
start: function(event, ui) {
|
||||
|
||||
var inst = $(this).data("ui-draggable"), o = inst.options,
|
||||
uiSortable = $.extend({}, ui, { item: inst.element });
|
||||
inst.sortables = [];
|
||||
$(o.connectToSortable).each(function() {
|
||||
var sortable = $.data(this, "ui-sortable");
|
||||
if (sortable && !sortable.options.disabled) {
|
||||
inst.sortables.push({
|
||||
instance: sortable,
|
||||
shouldRevert: sortable.options.revert
|
||||
});
|
||||
sortable.refreshPositions(); // Call the sortable's refreshPositions at drag start to refresh the containerCache since the sortable container cache is used in drag and needs to be up to date (this will ensure it's initialised as well as being kept in step with any changes that might have happened on the page).
|
||||
sortable._trigger("activate", event, uiSortable);
|
||||
}
|
||||
});
|
||||
|
||||
},
|
||||
stop: function(event, ui) {
|
||||
|
||||
//If we are still over the sortable, we fake the stop event of the sortable, but also remove helper
|
||||
var inst = $(this).data("ui-draggable"),
|
||||
uiSortable = $.extend({}, ui, { item: inst.element });
|
||||
|
||||
$.each(inst.sortables, function() {
|
||||
if(this.instance.isOver) {
|
||||
|
||||
this.instance.isOver = 0;
|
||||
|
||||
inst.cancelHelperRemoval = true; //Don't remove the helper in the draggable instance
|
||||
this.instance.cancelHelperRemoval = false; //Remove it in the sortable instance (so sortable plugins like revert still work)
|
||||
|
||||
//The sortable revert is supported, and we have to set a temporary dropped variable on the draggable to support revert: "valid/invalid"
|
||||
if(this.shouldRevert) {
|
||||
this.instance.options.revert = this.shouldRevert;
|
||||
}
|
||||
|
||||
//Trigger the stop of the sortable
|
||||
this.instance._mouseStop(event);
|
||||
|
||||
this.instance.options.helper = this.instance.options._helper;
|
||||
|
||||
//If the helper has been the original item, restore properties in the sortable
|
||||
if(inst.options.helper === "original") {
|
||||
this.instance.currentItem.css({ top: "auto", left: "auto" });
|
||||
}
|
||||
|
||||
} else {
|
||||
this.instance.cancelHelperRemoval = false; //Remove the helper in the sortable instance
|
||||
this.instance._trigger("deactivate", event, uiSortable);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
},
|
||||
drag: function(event, ui) {
|
||||
|
||||
var inst = $(this).data("ui-draggable"), that = this;
|
||||
|
||||
$.each(inst.sortables, function() {
|
||||
|
||||
var innermostIntersecting = false,
|
||||
thisSortable = this;
|
||||
|
||||
//Copy over some variables to allow calling the sortable's native _intersectsWith
|
||||
this.instance.positionAbs = inst.positionAbs;
|
||||
this.instance.helperProportions = inst.helperProportions;
|
||||
this.instance.offset.click = inst.offset.click;
|
||||
|
||||
if(this.instance._intersectsWith(this.instance.containerCache)) {
|
||||
innermostIntersecting = true;
|
||||
$.each(inst.sortables, function () {
|
||||
this.instance.positionAbs = inst.positionAbs;
|
||||
this.instance.helperProportions = inst.helperProportions;
|
||||
this.instance.offset.click = inst.offset.click;
|
||||
if (this !== thisSortable &&
|
||||
this.instance._intersectsWith(this.instance.containerCache) &&
|
||||
$.contains(thisSortable.instance.element[0], this.instance.element[0])
|
||||
) {
|
||||
innermostIntersecting = false;
|
||||
}
|
||||
return innermostIntersecting;
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
if(innermostIntersecting) {
|
||||
//If it intersects, we use a little isOver variable and set it once, so our move-in stuff gets fired only once
|
||||
if(!this.instance.isOver) {
|
||||
|
||||
this.instance.isOver = 1;
|
||||
//Now we fake the start of dragging for the sortable instance,
|
||||
//by cloning the list group item, appending it to the sortable and using it as inst.currentItem
|
||||
//We can then fire the start event of the sortable with our passed browser event, and our own helper (so it doesn't create a new one)
|
||||
this.instance.currentItem = $(that).clone().removeAttr("id").appendTo(this.instance.element).data("ui-sortable-item", true);
|
||||
this.instance.options._helper = this.instance.options.helper; //Store helper option to later restore it
|
||||
this.instance.options.helper = function() { return ui.helper[0]; };
|
||||
|
||||
event.target = this.instance.currentItem[0];
|
||||
this.instance._mouseCapture(event, true);
|
||||
this.instance._mouseStart(event, true, true);
|
||||
|
||||
//Because the browser event is way off the new appended portlet, we modify a couple of variables to reflect the changes
|
||||
this.instance.offset.click.top = inst.offset.click.top;
|
||||
this.instance.offset.click.left = inst.offset.click.left;
|
||||
this.instance.offset.parent.left -= inst.offset.parent.left - this.instance.offset.parent.left;
|
||||
this.instance.offset.parent.top -= inst.offset.parent.top - this.instance.offset.parent.top;
|
||||
|
||||
inst._trigger("toSortable", event);
|
||||
inst.dropped = this.instance.element; //draggable revert needs that
|
||||
//hack so receive/update callbacks work (mostly)
|
||||
inst.currentItem = inst.element;
|
||||
this.instance.fromOutside = inst;
|
||||
|
||||
}
|
||||
|
||||
//Provided we did all the previous steps, we can fire the drag event of the sortable on every draggable drag, when it intersects with the sortable
|
||||
if(this.instance.currentItem) {
|
||||
this.instance._mouseDrag(event);
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
//If it doesn't intersect with the sortable, and it intersected before,
|
||||
//we fake the drag stop of the sortable, but make sure it doesn't remove the helper by using cancelHelperRemoval
|
||||
if(this.instance.isOver) {
|
||||
|
||||
this.instance.isOver = 0;
|
||||
this.instance.cancelHelperRemoval = true;
|
||||
|
||||
//Prevent reverting on this forced stop
|
||||
this.instance.options.revert = false;
|
||||
|
||||
// The out event needs to be triggered independently
|
||||
this.instance._trigger("out", event, this.instance._uiHash(this.instance));
|
||||
|
||||
this.instance._mouseStop(event, true);
|
||||
this.instance.options.helper = this.instance.options._helper;
|
||||
|
||||
//Now we remove our currentItem, the list group clone again, and the placeholder, and animate the helper back to it's original size
|
||||
this.instance.currentItem.remove();
|
||||
if(this.instance.placeholder) {
|
||||
this.instance.placeholder.remove();
|
||||
}
|
||||
|
||||
inst._trigger("fromSortable", event);
|
||||
inst.dropped = false; //draggable revert needs that
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
$.ui.plugin.add("draggable", "cursor", {
|
||||
start: function() {
|
||||
var t = $("body"), o = $(this).data("ui-draggable").options;
|
||||
if (t.css("cursor")) {
|
||||
o._cursor = t.css("cursor");
|
||||
}
|
||||
t.css("cursor", o.cursor);
|
||||
},
|
||||
stop: function() {
|
||||
var o = $(this).data("ui-draggable").options;
|
||||
if (o._cursor) {
|
||||
$("body").css("cursor", o._cursor);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
$.ui.plugin.add("draggable", "opacity", {
|
||||
start: function(event, ui) {
|
||||
var t = $(ui.helper), o = $(this).data("ui-draggable").options;
|
||||
if(t.css("opacity")) {
|
||||
o._opacity = t.css("opacity");
|
||||
}
|
||||
t.css("opacity", o.opacity);
|
||||
},
|
||||
stop: function(event, ui) {
|
||||
var o = $(this).data("ui-draggable").options;
|
||||
if(o._opacity) {
|
||||
$(ui.helper).css("opacity", o._opacity);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
$.ui.plugin.add("draggable", "scroll", {
|
||||
start: function() {
|
||||
var i = $(this).data("ui-draggable");
|
||||
if(i.scrollParent[0] !== document && i.scrollParent[0].tagName !== "HTML") {
|
||||
i.overflowOffset = i.scrollParent.offset();
|
||||
}
|
||||
},
|
||||
drag: function( event ) {
|
||||
|
||||
var i = $(this).data("ui-draggable"), o = i.options, scrolled = false;
|
||||
|
||||
if(i.scrollParent[0] !== document && i.scrollParent[0].tagName !== "HTML") {
|
||||
|
||||
if(!o.axis || o.axis !== "x") {
|
||||
if((i.overflowOffset.top + i.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) {
|
||||
i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop + o.scrollSpeed;
|
||||
} else if(event.pageY - i.overflowOffset.top < o.scrollSensitivity) {
|
||||
i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop - o.scrollSpeed;
|
||||
}
|
||||
}
|
||||
|
||||
if(!o.axis || o.axis !== "y") {
|
||||
if((i.overflowOffset.left + i.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) {
|
||||
i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft + o.scrollSpeed;
|
||||
} else if(event.pageX - i.overflowOffset.left < o.scrollSensitivity) {
|
||||
i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft - o.scrollSpeed;
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
if(!o.axis || o.axis !== "x") {
|
||||
if(event.pageY - $(document).scrollTop() < o.scrollSensitivity) {
|
||||
scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
|
||||
} else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) {
|
||||
scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
|
||||
}
|
||||
}
|
||||
|
||||
if(!o.axis || o.axis !== "y") {
|
||||
if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity) {
|
||||
scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
|
||||
} else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) {
|
||||
scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {
|
||||
$.ui.ddmanager.prepareOffsets(i, event);
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
$.ui.plugin.add("draggable", "snap", {
|
||||
start: function() {
|
||||
|
||||
var i = $(this).data("ui-draggable"),
|
||||
o = i.options;
|
||||
|
||||
i.snapElements = [];
|
||||
|
||||
$(o.snap.constructor !== String ? ( o.snap.items || ":data(ui-draggable)" ) : o.snap).each(function() {
|
||||
var $t = $(this),
|
||||
$o = $t.offset();
|
||||
if(this !== i.element[0]) {
|
||||
i.snapElements.push({
|
||||
item: this,
|
||||
width: $t.outerWidth(), height: $t.outerHeight(),
|
||||
top: $o.top, left: $o.left
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
},
|
||||
drag: function(event, ui) {
|
||||
|
||||
var ts, bs, ls, rs, l, r, t, b, i, first,
|
||||
inst = $(this).data("ui-draggable"),
|
||||
o = inst.options,
|
||||
d = o.snapTolerance,
|
||||
x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
|
||||
y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
|
||||
|
||||
for (i = inst.snapElements.length - 1; i >= 0; i--){
|
||||
|
||||
l = inst.snapElements[i].left;
|
||||
r = l + inst.snapElements[i].width;
|
||||
t = inst.snapElements[i].top;
|
||||
b = t + inst.snapElements[i].height;
|
||||
|
||||
if ( x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d || !$.contains( inst.snapElements[ i ].item.ownerDocument, inst.snapElements[ i ].item ) ) {
|
||||
if(inst.snapElements[i].snapping) {
|
||||
(inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
|
||||
}
|
||||
inst.snapElements[i].snapping = false;
|
||||
continue;
|
||||
}
|
||||
|
||||
if(o.snapMode !== "inner") {
|
||||
ts = Math.abs(t - y2) <= d;
|
||||
bs = Math.abs(b - y1) <= d;
|
||||
ls = Math.abs(l - x2) <= d;
|
||||
rs = Math.abs(r - x1) <= d;
|
||||
if(ts) {
|
||||
ui.position.top = inst._convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
|
||||
}
|
||||
if(bs) {
|
||||
ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0 }).top - inst.margins.top;
|
||||
}
|
||||
if(ls) {
|
||||
ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left - inst.margins.left;
|
||||
}
|
||||
if(rs) {
|
||||
ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r }).left - inst.margins.left;
|
||||
}
|
||||
}
|
||||
|
||||
first = (ts || bs || ls || rs);
|
||||
|
||||
if(o.snapMode !== "outer") {
|
||||
ts = Math.abs(t - y1) <= d;
|
||||
bs = Math.abs(b - y2) <= d;
|
||||
ls = Math.abs(l - x1) <= d;
|
||||
rs = Math.abs(r - x2) <= d;
|
||||
if(ts) {
|
||||
ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0 }).top - inst.margins.top;
|
||||
}
|
||||
if(bs) {
|
||||
ui.position.top = inst._convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
|
||||
}
|
||||
if(ls) {
|
||||
ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l }).left - inst.margins.left;
|
||||
}
|
||||
if(rs) {
|
||||
ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left - inst.margins.left;
|
||||
}
|
||||
}
|
||||
|
||||
if(!inst.snapElements[i].snapping && (ts || bs || ls || rs || first)) {
|
||||
(inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
|
||||
}
|
||||
inst.snapElements[i].snapping = (ts || bs || ls || rs || first);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
$.ui.plugin.add("draggable", "stack", {
|
||||
start: function() {
|
||||
var min,
|
||||
o = this.data("ui-draggable").options,
|
||||
group = $.makeArray($(o.stack)).sort(function(a,b) {
|
||||
return (parseInt($(a).css("zIndex"),10) || 0) - (parseInt($(b).css("zIndex"),10) || 0);
|
||||
});
|
||||
|
||||
if (!group.length) { return; }
|
||||
|
||||
min = parseInt($(group[0]).css("zIndex"), 10) || 0;
|
||||
$(group).each(function(i) {
|
||||
$(this).css("zIndex", min + i);
|
||||
});
|
||||
this.css("zIndex", (min + group.length));
|
||||
}
|
||||
});
|
||||
|
||||
$.ui.plugin.add("draggable", "zIndex", {
|
||||
start: function(event, ui) {
|
||||
var t = $(ui.helper), o = $(this).data("ui-draggable").options;
|
||||
if(t.css("zIndex")) {
|
||||
o._zIndex = t.css("zIndex");
|
||||
}
|
||||
t.css("zIndex", o.zIndex);
|
||||
},
|
||||
stop: function(event, ui) {
|
||||
var o = $(this).data("ui-draggable").options;
|
||||
if(o._zIndex) {
|
||||
$(ui.helper).css("zIndex", o._zIndex);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
})(jQuery);
|
610
assets/js/jquery.ui.menu.js
vendored
Executable file
@ -0,0 +1,610 @@
|
||||
/*!
|
||||
* jQuery UI Menu 1.9.2
|
||||
* http://jqueryui.com
|
||||
*
|
||||
* Copyright 2012 jQuery Foundation and other contributors
|
||||
* Released under the MIT license.
|
||||
* http://jquery.org/license
|
||||
*
|
||||
* http://api.jqueryui.com/menu/
|
||||
*
|
||||
* Depends:
|
||||
* jquery.ui.core.js
|
||||
* jquery.ui.widget.js
|
||||
* jquery.ui.position.js
|
||||
*/
|
||||
(function( $, undefined ) {
|
||||
|
||||
var mouseHandled = false;
|
||||
|
||||
$.widget( "ui.menu", {
|
||||
version: "1.9.2",
|
||||
defaultElement: "<ul>",
|
||||
delay: 300,
|
||||
options: {
|
||||
icons: {
|
||||
submenu: "ui-icon-carat-1-e"
|
||||
},
|
||||
menus: "ul",
|
||||
position: {
|
||||
my: "left top",
|
||||
at: "right top"
|
||||
},
|
||||
role: "menu",
|
||||
|
||||
// callbacks
|
||||
blur: null,
|
||||
focus: null,
|
||||
select: null
|
||||
},
|
||||
|
||||
_create: function() {
|
||||
this.activeMenu = this.element;
|
||||
this.element
|
||||
.uniqueId()
|
||||
.addClass( "ui-menu ui-widget ui-widget-content ui-corner-all" )
|
||||
.toggleClass( "ui-menu-icons", !!this.element.find( ".ui-icon" ).length )
|
||||
.attr({
|
||||
role: this.options.role,
|
||||
tabIndex: 0
|
||||
})
|
||||
// need to catch all clicks on disabled menu
|
||||
// not possible through _on
|
||||
.bind( "click" + this.eventNamespace, $.proxy(function( event ) {
|
||||
if ( this.options.disabled ) {
|
||||
event.preventDefault();
|
||||
}
|
||||
}, this ));
|
||||
|
||||
if ( this.options.disabled ) {
|
||||
this.element
|
||||
.addClass( "ui-state-disabled" )
|
||||
.attr( "aria-disabled", "true" );
|
||||
}
|
||||
|
||||
this._on({
|
||||
// Prevent focus from sticking to links inside menu after clicking
|
||||
// them (focus should always stay on UL during navigation).
|
||||
"mousedown .ui-menu-item > a": function( event ) {
|
||||
event.preventDefault();
|
||||
},
|
||||
"click .ui-state-disabled > a": function( event ) {
|
||||
event.preventDefault();
|
||||
},
|
||||
"click .ui-menu-item:has(a)": function( event ) {
|
||||
var target = $( event.target ).closest( ".ui-menu-item" );
|
||||
if ( !mouseHandled && target.not( ".ui-state-disabled" ).length ) {
|
||||
mouseHandled = true;
|
||||
|
||||
this.select( event );
|
||||
// Open submenu on click
|
||||
if ( target.has( ".ui-menu" ).length ) {
|
||||
this.expand( event );
|
||||
} else if ( !this.element.is( ":focus" ) ) {
|
||||
// Redirect focus to the menu
|
||||
this.element.trigger( "focus", [ true ] );
|
||||
|
||||
// If the active item is on the top level, let it stay active.
|
||||
// Otherwise, blur the active item since it is no longer visible.
|
||||
if ( this.active && this.active.parents( ".ui-menu" ).length === 1 ) {
|
||||
clearTimeout( this.timer );
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"mouseenter .ui-menu-item": function( event ) {
|
||||
var target = $( event.currentTarget );
|
||||
// Remove ui-state-active class from siblings of the newly focused menu item
|
||||
// to avoid a jump caused by adjacent elements both having a class with a border
|
||||
target.siblings().children( ".ui-state-active" ).removeClass( "ui-state-active" );
|
||||
this.focus( event, target );
|
||||
},
|
||||
mouseleave: "collapseAll",
|
||||
"mouseleave .ui-menu": "collapseAll",
|
||||
focus: function( event, keepActiveItem ) {
|
||||
// If there's already an active item, keep it active
|
||||
// If not, activate the first item
|
||||
var item = this.active || this.element.children( ".ui-menu-item" ).eq( 0 );
|
||||
|
||||
if ( !keepActiveItem ) {
|
||||
this.focus( event, item );
|
||||
}
|
||||
},
|
||||
blur: function( event ) {
|
||||
this._delay(function() {
|
||||
if ( !$.contains( this.element[0], this.document[0].activeElement ) ) {
|
||||
this.collapseAll( event );
|
||||
}
|
||||
});
|
||||
},
|
||||
keydown: "_keydown"
|
||||
});
|
||||
|
||||
this.refresh();
|
||||
|
||||
// Clicks outside of a menu collapse any open menus
|
||||
this._on( this.document, {
|
||||
click: function( event ) {
|
||||
if ( !$( event.target ).closest( ".ui-menu" ).length ) {
|
||||
this.collapseAll( event );
|
||||
}
|
||||
|
||||
// Reset the mouseHandled flag
|
||||
mouseHandled = false;
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
_destroy: function() {
|
||||
// Destroy (sub)menus
|
||||
this.element
|
||||
.removeAttr( "aria-activedescendant" )
|
||||
.find( ".ui-menu" ).andSelf()
|
||||
.removeClass( "ui-menu ui-widget ui-widget-content ui-corner-all ui-menu-icons" )
|
||||
.removeAttr( "role" )
|
||||
.removeAttr( "tabIndex" )
|
||||
.removeAttr( "aria-labelledby" )
|
||||
.removeAttr( "aria-expanded" )
|
||||
.removeAttr( "aria-hidden" )
|
||||
.removeAttr( "aria-disabled" )
|
||||
.removeUniqueId()
|
||||
.show();
|
||||
|
||||
// Destroy menu items
|
||||
this.element.find( ".ui-menu-item" )
|
||||
.removeClass( "ui-menu-item" )
|
||||
.removeAttr( "role" )
|
||||
.removeAttr( "aria-disabled" )
|
||||
.children( "a" )
|
||||
.removeUniqueId()
|
||||
.removeClass( "ui-corner-all ui-state-hover" )
|
||||
.removeAttr( "tabIndex" )
|
||||
.removeAttr( "role" )
|
||||
.removeAttr( "aria-haspopup" )
|
||||
.children().each( function() {
|
||||
var elem = $( this );
|
||||
if ( elem.data( "ui-menu-submenu-carat" ) ) {
|
||||
elem.remove();
|
||||
}
|
||||
});
|
||||
|
||||
// Destroy menu dividers
|
||||
this.element.find( ".ui-menu-divider" ).removeClass( "ui-menu-divider ui-widget-content" );
|
||||
},
|
||||
|
||||
_keydown: function( event ) {
|
||||
var match, prev, character, skip, regex,
|
||||
preventDefault = true;
|
||||
|
||||
function escape( value ) {
|
||||
return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" );
|
||||
}
|
||||
|
||||
switch ( event.keyCode ) {
|
||||
case $.ui.keyCode.PAGE_UP:
|
||||
this.previousPage( event );
|
||||
break;
|
||||
case $.ui.keyCode.PAGE_DOWN:
|
||||
this.nextPage( event );
|
||||
break;
|
||||
case $.ui.keyCode.HOME:
|
||||
this._move( "first", "first", event );
|
||||
break;
|
||||
case $.ui.keyCode.END:
|
||||
this._move( "last", "last", event );
|
||||
break;
|
||||
case $.ui.keyCode.UP:
|
||||
this.previous( event );
|
||||
break;
|
||||
case $.ui.keyCode.DOWN:
|
||||
this.next( event );
|
||||
break;
|
||||
case $.ui.keyCode.LEFT:
|
||||
this.collapse( event );
|
||||
break;
|
||||
case $.ui.keyCode.RIGHT:
|
||||
if ( this.active && !this.active.is( ".ui-state-disabled" ) ) {
|
||||
this.expand( event );
|
||||
}
|
||||
break;
|
||||
case $.ui.keyCode.ENTER:
|
||||
case $.ui.keyCode.SPACE:
|
||||
this._activate( event );
|
||||
break;
|
||||
case $.ui.keyCode.ESCAPE:
|
||||
this.collapse( event );
|
||||
break;
|
||||
default:
|
||||
preventDefault = false;
|
||||
prev = this.previousFilter || "";
|
||||
character = String.fromCharCode( event.keyCode );
|
||||
skip = false;
|
||||
|
||||
clearTimeout( this.filterTimer );
|
||||
|
||||
if ( character === prev ) {
|
||||
skip = true;
|
||||
} else {
|
||||
character = prev + character;
|
||||
}
|
||||
|
||||
regex = new RegExp( "^" + escape( character ), "i" );
|
||||
match = this.activeMenu.children( ".ui-menu-item" ).filter(function() {
|
||||
return regex.test( $( this ).children( "a" ).text() );
|
||||
});
|
||||
match = skip && match.index( this.active.next() ) !== -1 ?
|
||||
this.active.nextAll( ".ui-menu-item" ) :
|
||||
match;
|
||||
|
||||
// If no matches on the current filter, reset to the last character pressed
|
||||
// to move down the menu to the first item that starts with that character
|
||||
if ( !match.length ) {
|
||||
character = String.fromCharCode( event.keyCode );
|
||||
regex = new RegExp( "^" + escape( character ), "i" );
|
||||
match = this.activeMenu.children( ".ui-menu-item" ).filter(function() {
|
||||
return regex.test( $( this ).children( "a" ).text() );
|
||||
});
|
||||
}
|
||||
|
||||
if ( match.length ) {
|
||||
this.focus( event, match );
|
||||
if ( match.length > 1 ) {
|
||||
this.previousFilter = character;
|
||||
this.filterTimer = this._delay(function() {
|
||||
delete this.previousFilter;
|
||||
}, 1000 );
|
||||
} else {
|
||||
delete this.previousFilter;
|
||||
}
|
||||
} else {
|
||||
delete this.previousFilter;
|
||||
}
|
||||
}
|
||||
|
||||
if ( preventDefault ) {
|
||||
event.preventDefault();
|
||||
}
|
||||
},
|
||||
|
||||
_activate: function( event ) {
|
||||
if ( !this.active.is( ".ui-state-disabled" ) ) {
|
||||
if ( this.active.children( "a[aria-haspopup='true']" ).length ) {
|
||||
this.expand( event );
|
||||
} else {
|
||||
this.select( event );
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
refresh: function() {
|
||||
var menus,
|
||||
icon = this.options.icons.submenu,
|
||||
submenus = this.element.find( this.options.menus );
|
||||
|
||||
// Initialize nested menus
|
||||
submenus.filter( ":not(.ui-menu)" )
|
||||
.addClass( "ui-menu ui-widget ui-widget-content ui-corner-all" )
|
||||
.hide()
|
||||
.attr({
|
||||
role: this.options.role,
|
||||
"aria-hidden": "true",
|
||||
"aria-expanded": "false"
|
||||
})
|
||||
.each(function() {
|
||||
var menu = $( this ),
|
||||
item = menu.prev( "a" ),
|
||||
submenuCarat = $( "<span>" )
|
||||
.addClass( "ui-menu-icon ui-icon " + icon )
|
||||
.data( "ui-menu-submenu-carat", true );
|
||||
|
||||
item
|
||||
.attr( "aria-haspopup", "true" )
|
||||
.prepend( submenuCarat );
|
||||
menu.attr( "aria-labelledby", item.attr( "id" ) );
|
||||
});
|
||||
|
||||
menus = submenus.add( this.element );
|
||||
|
||||
// Don't refresh list items that are already adapted
|
||||
menus.children( ":not(.ui-menu-item):has(a)" )
|
||||
.addClass( "ui-menu-item" )
|
||||
.attr( "role", "presentation" )
|
||||
.children( "a" )
|
||||
.uniqueId()
|
||||
.addClass( "ui-corner-all" )
|
||||
.attr({
|
||||
tabIndex: -1,
|
||||
role: this._itemRole()
|
||||
});
|
||||
|
||||
// Initialize unlinked menu-items containing spaces and/or dashes only as dividers
|
||||
menus.children( ":not(.ui-menu-item)" ).each(function() {
|
||||
var item = $( this );
|
||||
// hyphen, em dash, en dash
|
||||
if ( !/[^\-—–\s]/.test( item.text() ) ) {
|
||||
item.addClass( "ui-widget-content ui-menu-divider" );
|
||||
}
|
||||
});
|
||||
|
||||
// Add aria-disabled attribute to any disabled menu item
|
||||
menus.children( ".ui-state-disabled" ).attr( "aria-disabled", "true" );
|
||||
|
||||
// If the active item has been removed, blur the menu
|
||||
if ( this.active && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
|
||||
this.blur();
|
||||
}
|
||||
},
|
||||
|
||||
_itemRole: function() {
|
||||
return {
|
||||
menu: "menuitem",
|
||||
listbox: "option"
|
||||
}[ this.options.role ];
|
||||
},
|
||||
|
||||
focus: function( event, item ) {
|
||||
var nested, focused;
|
||||
this.blur( event, event && event.type === "focus" );
|
||||
|
||||
this._scrollIntoView( item );
|
||||
|
||||
this.active = item.first();
|
||||
focused = this.active.children( "a" ).addClass( "ui-state-focus" );
|
||||
// Only update aria-activedescendant if there's a role
|
||||
// otherwise we assume focus is managed elsewhere
|
||||
if ( this.options.role ) {
|
||||
this.element.attr( "aria-activedescendant", focused.attr( "id" ) );
|
||||
}
|
||||
|
||||
// Highlight active parent menu item, if any
|
||||
this.active
|
||||
.parent()
|
||||
.closest( ".ui-menu-item" )
|
||||
.children( "a:first" )
|
||||
.addClass( "ui-state-active" );
|
||||
|
||||
if ( event && event.type === "keydown" ) {
|
||||
this._close();
|
||||
} else {
|
||||
this.timer = this._delay(function() {
|
||||
this._close();
|
||||
}, this.delay );
|
||||
}
|
||||
|
||||
nested = item.children( ".ui-menu" );
|
||||
if ( nested.length && ( /^mouse/.test( event.type ) ) ) {
|
||||
this._startOpening(nested);
|
||||
}
|
||||
this.activeMenu = item.parent();
|
||||
|
||||
this._trigger( "focus", event, { item: item } );
|
||||
},
|
||||
|
||||
_scrollIntoView: function( item ) {
|
||||
var borderTop, paddingTop, offset, scroll, elementHeight, itemHeight;
|
||||
if ( this._hasScroll() ) {
|
||||
borderTop = parseFloat( $.css( this.activeMenu[0], "borderTopWidth" ) ) || 0;
|
||||
paddingTop = parseFloat( $.css( this.activeMenu[0], "paddingTop" ) ) || 0;
|
||||
offset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop;
|
||||
scroll = this.activeMenu.scrollTop();
|
||||
elementHeight = this.activeMenu.height();
|
||||
itemHeight = item.height();
|
||||
|
||||
if ( offset < 0 ) {
|
||||
this.activeMenu.scrollTop( scroll + offset );
|
||||
} else if ( offset + itemHeight > elementHeight ) {
|
||||
this.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight );
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
blur: function( event, fromFocus ) {
|
||||
if ( !fromFocus ) {
|
||||
clearTimeout( this.timer );
|
||||
}
|
||||
|
||||
if ( !this.active ) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.active.children( "a" ).removeClass( "ui-state-focus" );
|
||||
this.active = null;
|
||||
|
||||
this._trigger( "blur", event, { item: this.active } );
|
||||
},
|
||||
|
||||
_startOpening: function( submenu ) {
|
||||
clearTimeout( this.timer );
|
||||
|
||||
// Don't open if already open fixes a Firefox bug that caused a .5 pixel
|
||||
// shift in the submenu position when mousing over the carat icon
|
||||
if ( submenu.attr( "aria-hidden" ) !== "true" ) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.timer = this._delay(function() {
|
||||
this._close();
|
||||
this._open( submenu );
|
||||
}, this.delay );
|
||||
},
|
||||
|
||||
_open: function( submenu ) {
|
||||
var position = $.extend({
|
||||
of: this.active
|
||||
}, this.options.position );
|
||||
|
||||
clearTimeout( this.timer );
|
||||
this.element.find( ".ui-menu" ).not( submenu.parents( ".ui-menu" ) )
|
||||
.hide()
|
||||
.attr( "aria-hidden", "true" );
|
||||
|
||||
submenu
|
||||
.show()
|
||||
.removeAttr( "aria-hidden" )
|
||||
.attr( "aria-expanded", "true" )
|
||||
.position( position );
|
||||
},
|
||||
|
||||
collapseAll: function( event, all ) {
|
||||
clearTimeout( this.timer );
|
||||
this.timer = this._delay(function() {
|
||||
// If we were passed an event, look for the submenu that contains the event
|
||||
var currentMenu = all ? this.element :
|
||||
$( event && event.target ).closest( this.element.find( ".ui-menu" ) );
|
||||
|
||||
// If we found no valid submenu ancestor, use the main menu to close all sub menus anyway
|
||||
if ( !currentMenu.length ) {
|
||||
currentMenu = this.element;
|
||||
}
|
||||
|
||||
this._close( currentMenu );
|
||||
|
||||
this.blur( event );
|
||||
this.activeMenu = currentMenu;
|
||||
}, this.delay );
|
||||
},
|
||||
|
||||
// With no arguments, closes the currently active menu - if nothing is active
|
||||
// it closes all menus. If passed an argument, it will search for menus BELOW
|
||||
_close: function( startMenu ) {
|
||||
if ( !startMenu ) {
|
||||
startMenu = this.active ? this.active.parent() : this.element;
|
||||
}
|
||||
|
||||
startMenu
|
||||
.find( ".ui-menu" )
|
||||
.hide()
|
||||
.attr( "aria-hidden", "true" )
|
||||
.attr( "aria-expanded", "false" )
|
||||
.end()
|
||||
.find( "a.ui-state-active" )
|
||||
.removeClass( "ui-state-active" );
|
||||
},
|
||||
|
||||
collapse: function( event ) {
|
||||
var newItem = this.active &&
|
||||
this.active.parent().closest( ".ui-menu-item", this.element );
|
||||
if ( newItem && newItem.length ) {
|
||||
this._close();
|
||||
this.focus( event, newItem );
|
||||
}
|
||||
},
|
||||
|
||||
expand: function( event ) {
|
||||
var newItem = this.active &&
|
||||
this.active
|
||||
.children( ".ui-menu " )
|
||||
.children( ".ui-menu-item" )
|
||||
.first();
|
||||
|
||||
if ( newItem && newItem.length ) {
|
||||
this._open( newItem.parent() );
|
||||
|
||||
// Delay so Firefox will not hide activedescendant change in expanding submenu from AT
|
||||
this._delay(function() {
|
||||
this.focus( event, newItem );
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
next: function( event ) {
|
||||
this._move( "next", "first", event );
|
||||
},
|
||||
|
||||
previous: function( event ) {
|
||||
this._move( "prev", "last", event );
|
||||
},
|
||||
|
||||
isFirstItem: function() {
|
||||
return this.active && !this.active.prevAll( ".ui-menu-item" ).length;
|
||||
},
|
||||
|
||||
isLastItem: function() {
|
||||
return this.active && !this.active.nextAll( ".ui-menu-item" ).length;
|
||||
},
|
||||
|
||||
_move: function( direction, filter, event ) {
|
||||
var next;
|
||||
if ( this.active ) {
|
||||
if ( direction === "first" || direction === "last" ) {
|
||||
next = this.active
|
||||
[ direction === "first" ? "prevAll" : "nextAll" ]( ".ui-menu-item" )
|
||||
.eq( -1 );
|
||||
} else {
|
||||
next = this.active
|
||||
[ direction + "All" ]( ".ui-menu-item" )
|
||||
.eq( 0 );
|
||||
}
|
||||
}
|
||||
if ( !next || !next.length || !this.active ) {
|
||||
next = this.activeMenu.children( ".ui-menu-item" )[ filter ]();
|
||||
}
|
||||
|
||||
this.focus( event, next );
|
||||
},
|
||||
|
||||
nextPage: function( event ) {
|
||||
var item, base, height;
|
||||
|
||||
if ( !this.active ) {
|
||||
this.next( event );
|
||||
return;
|
||||
}
|
||||
if ( this.isLastItem() ) {
|
||||
return;
|
||||
}
|
||||
if ( this._hasScroll() ) {
|
||||
base = this.active.offset().top;
|
||||
height = this.element.height();
|
||||
this.active.nextAll( ".ui-menu-item" ).each(function() {
|
||||
item = $( this );
|
||||
return item.offset().top - base - height < 0;
|
||||
});
|
||||
|
||||
this.focus( event, item );
|
||||
} else {
|
||||
this.focus( event, this.activeMenu.children( ".ui-menu-item" )
|
||||
[ !this.active ? "first" : "last" ]() );
|
||||
}
|
||||
},
|
||||
|
||||
previousPage: function( event ) {
|
||||
var item, base, height;
|
||||
if ( !this.active ) {
|
||||
this.next( event );
|
||||
return;
|
||||
}
|
||||
if ( this.isFirstItem() ) {
|
||||
return;
|
||||
}
|
||||
if ( this._hasScroll() ) {
|
||||
base = this.active.offset().top;
|
||||
height = this.element.height();
|
||||
this.active.prevAll( ".ui-menu-item" ).each(function() {
|
||||
item = $( this );
|
||||
return item.offset().top - base + height > 0;
|
||||
});
|
||||
|
||||
this.focus( event, item );
|
||||
} else {
|
||||
this.focus( event, this.activeMenu.children( ".ui-menu-item" ).first() );
|
||||
}
|
||||
},
|
||||
|
||||
_hasScroll: function() {
|
||||
return this.element.outerHeight() < this.element.prop( "scrollHeight" );
|
||||
},
|
||||
|
||||
select: function( event ) {
|
||||
// TODO: It should never be possible to not have an active item at this
|
||||
// point, but the tests don't trigger mouseenter before click.
|
||||
this.active = this.active || $( event.target ).closest( ".ui-menu-item" );
|
||||
var ui = { item: this.active };
|
||||
if ( !this.active.has( ".ui-menu" ).length ) {
|
||||
this.collapseAll( event, true );
|
||||
}
|
||||
this._trigger( "select", event, ui );
|
||||
}
|
||||
});
|
||||
|
||||
}( jQuery ));
|
169
assets/js/jquery.ui.mouse.js
vendored
Executable file
@ -0,0 +1,169 @@
|
||||
/*!
|
||||
* jQuery UI Mouse 1.10.3
|
||||
* http://jqueryui.com
|
||||
*
|
||||
* Copyright 2013 jQuery Foundation and other contributors
|
||||
* Released under the MIT license.
|
||||
* http://jquery.org/license
|
||||
*
|
||||
* http://api.jqueryui.com/mouse/
|
||||
*
|
||||
* Depends:
|
||||
* jquery.ui.widget.js
|
||||
*/
|
||||
(function( $, undefined ) {
|
||||
|
||||
var mouseHandled = false;
|
||||
$( document ).mouseup( function() {
|
||||
mouseHandled = false;
|
||||
});
|
||||
|
||||
$.widget("ui.mouse", {
|
||||
version: "1.10.3",
|
||||
options: {
|
||||
cancel: "input,textarea,button,select,option",
|
||||
distance: 1,
|
||||
delay: 0
|
||||
},
|
||||
_mouseInit: function() {
|
||||
var that = this;
|
||||
|
||||
this.element
|
||||
.bind("mousedown."+this.widgetName, function(event) {
|
||||
return that._mouseDown(event);
|
||||
})
|
||||
.bind("click."+this.widgetName, function(event) {
|
||||
if (true === $.data(event.target, that.widgetName + ".preventClickEvent")) {
|
||||
$.removeData(event.target, that.widgetName + ".preventClickEvent");
|
||||
event.stopImmediatePropagation();
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
this.started = false;
|
||||
},
|
||||
|
||||
// TODO: make sure destroying one instance of mouse doesn't mess with
|
||||
// other instances of mouse
|
||||
_mouseDestroy: function() {
|
||||
this.element.unbind("."+this.widgetName);
|
||||
if ( this._mouseMoveDelegate ) {
|
||||
$(document)
|
||||
.unbind("mousemove."+this.widgetName, this._mouseMoveDelegate)
|
||||
.unbind("mouseup."+this.widgetName, this._mouseUpDelegate);
|
||||
}
|
||||
},
|
||||
|
||||
_mouseDown: function(event) {
|
||||
// don't let more than one widget handle mouseStart
|
||||
if( mouseHandled ) { return; }
|
||||
|
||||
// we may have missed mouseup (out of window)
|
||||
(this._mouseStarted && this._mouseUp(event));
|
||||
|
||||
this._mouseDownEvent = event;
|
||||
|
||||
var that = this,
|
||||
btnIsLeft = (event.which === 1),
|
||||
// event.target.nodeName works around a bug in IE 8 with
|
||||
// disabled inputs (#7620)
|
||||
elIsCancel = (typeof this.options.cancel === "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);
|
||||
if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
this.mouseDelayMet = !this.options.delay;
|
||||
if (!this.mouseDelayMet) {
|
||||
this._mouseDelayTimer = setTimeout(function() {
|
||||
that.mouseDelayMet = true;
|
||||
}, this.options.delay);
|
||||
}
|
||||
|
||||
if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
|
||||
this._mouseStarted = (this._mouseStart(event) !== false);
|
||||
if (!this._mouseStarted) {
|
||||
event.preventDefault();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// Click event may never have fired (Gecko & Opera)
|
||||
if (true === $.data(event.target, this.widgetName + ".preventClickEvent")) {
|
||||
$.removeData(event.target, this.widgetName + ".preventClickEvent");
|
||||
}
|
||||
|
||||
// these delegates are required to keep context
|
||||
this._mouseMoveDelegate = function(event) {
|
||||
return that._mouseMove(event);
|
||||
};
|
||||
this._mouseUpDelegate = function(event) {
|
||||
return that._mouseUp(event);
|
||||
};
|
||||
$(document)
|
||||
.bind("mousemove."+this.widgetName, this._mouseMoveDelegate)
|
||||
.bind("mouseup."+this.widgetName, this._mouseUpDelegate);
|
||||
|
||||
event.preventDefault();
|
||||
|
||||
mouseHandled = true;
|
||||
return true;
|
||||
},
|
||||
|
||||
_mouseMove: function(event) {
|
||||
// IE mouseup check - mouseup happened when mouse was out of window
|
||||
if ($.ui.ie && ( !document.documentMode || document.documentMode < 9 ) && !event.button) {
|
||||
return this._mouseUp(event);
|
||||
}
|
||||
|
||||
if (this._mouseStarted) {
|
||||
this._mouseDrag(event);
|
||||
return event.preventDefault();
|
||||
}
|
||||
|
||||
if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
|
||||
this._mouseStarted =
|
||||
(this._mouseStart(this._mouseDownEvent, event) !== false);
|
||||
(this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
|
||||
}
|
||||
|
||||
return !this._mouseStarted;
|
||||
},
|
||||
|
||||
_mouseUp: function(event) {
|
||||
$(document)
|
||||
.unbind("mousemove."+this.widgetName, this._mouseMoveDelegate)
|
||||
.unbind("mouseup."+this.widgetName, this._mouseUpDelegate);
|
||||
|
||||
if (this._mouseStarted) {
|
||||
this._mouseStarted = false;
|
||||
|
||||
if (event.target === this._mouseDownEvent.target) {
|
||||
$.data(event.target, this.widgetName + ".preventClickEvent", true);
|
||||
}
|
||||
|
||||
this._mouseStop(event);
|
||||
}
|
||||
|
||||
return false;
|
||||
},
|
||||
|
||||
_mouseDistanceMet: function(event) {
|
||||
return (Math.max(
|
||||
Math.abs(this._mouseDownEvent.pageX - event.pageX),
|
||||
Math.abs(this._mouseDownEvent.pageY - event.pageY)
|
||||
) >= this.options.distance
|
||||
);
|
||||
},
|
||||
|
||||
_mouseDelayMet: function(/* event */) {
|
||||
return this.mouseDelayMet;
|
||||
},
|
||||
|
||||
// These are placeholder methods, to be overriden by extending plugin
|
||||
_mouseStart: function(/* event */) {},
|
||||
_mouseDrag: function(/* event */) {},
|
||||
_mouseStop: function(/* event */) {},
|
||||
_mouseCapture: function(/* event */) { return true; }
|
||||
});
|
||||
|
||||
})(jQuery);
|
517
assets/js/jquery.ui.position.js
vendored
Executable file
@ -0,0 +1,517 @@
|
||||
/*!
|
||||
* jQuery UI Position 1.9.2
|
||||
* http://jqueryui.com
|
||||
*
|
||||
* Copyright 2012 jQuery Foundation and other contributors
|
||||
* Released under the MIT license.
|
||||
* http://jquery.org/license
|
||||
*
|
||||
* http://api.jqueryui.com/position/
|
||||
*/
|
||||
(function( $, undefined ) {
|
||||
|
||||
$.ui = $.ui || {};
|
||||
|
||||
var cachedScrollbarWidth,
|
||||
max = Math.max,
|
||||
abs = Math.abs,
|
||||
round = Math.round,
|
||||
rhorizontal = /left|center|right/,
|
||||
rvertical = /top|center|bottom/,
|
||||
roffset = /[\+\-]\d+%?/,
|
||||
rposition = /^\w+/,
|
||||
rpercent = /%$/,
|
||||
_position = $.fn.position;
|
||||
|
||||
function getOffsets( offsets, width, height ) {
|
||||
return [
|
||||
parseInt( offsets[ 0 ], 10 ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),
|
||||
parseInt( offsets[ 1 ], 10 ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )
|
||||
];
|
||||
}
|
||||
function parseCss( element, property ) {
|
||||
return parseInt( $.css( element, property ), 10 ) || 0;
|
||||
}
|
||||
|
||||
$.position = {
|
||||
scrollbarWidth: function() {
|
||||
if ( cachedScrollbarWidth !== undefined ) {
|
||||
return cachedScrollbarWidth;
|
||||
}
|
||||
var w1, w2,
|
||||
div = $( "<div style='display:block;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>" ),
|
||||
innerDiv = div.children()[0];
|
||||
|
||||
$( "body" ).append( div );
|
||||
w1 = innerDiv.offsetWidth;
|
||||
div.css( "overflow", "scroll" );
|
||||
|
||||
w2 = innerDiv.offsetWidth;
|
||||
|
||||
if ( w1 === w2 ) {
|
||||
w2 = div[0].clientWidth;
|
||||
}
|
||||
|
||||
div.remove();
|
||||
|
||||
return (cachedScrollbarWidth = w1 - w2);
|
||||
},
|
||||
getScrollInfo: function( within ) {
|
||||
var overflowX = within.isWindow ? "" : within.element.css( "overflow-x" ),
|
||||
overflowY = within.isWindow ? "" : within.element.css( "overflow-y" ),
|
||||
hasOverflowX = overflowX === "scroll" ||
|
||||
( overflowX === "auto" && within.width < within.element[0].scrollWidth ),
|
||||
hasOverflowY = overflowY === "scroll" ||
|
||||
( overflowY === "auto" && within.height < within.element[0].scrollHeight );
|
||||
return {
|
||||
width: hasOverflowX ? $.position.scrollbarWidth() : 0,
|
||||
height: hasOverflowY ? $.position.scrollbarWidth() : 0
|
||||
};
|
||||
},
|
||||
getWithinInfo: function( element ) {
|
||||
var withinElement = $( element || window ),
|
||||
isWindow = $.isWindow( withinElement[0] );
|
||||
return {
|
||||
element: withinElement,
|
||||
isWindow: isWindow,
|
||||
offset: withinElement.offset() || { left: 0, top: 0 },
|
||||
scrollLeft: withinElement.scrollLeft(),
|
||||
scrollTop: withinElement.scrollTop(),
|
||||
width: isWindow ? withinElement.width() : withinElement.outerWidth(),
|
||||
height: isWindow ? withinElement.height() : withinElement.outerHeight()
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
$.fn.position = function( options ) {
|
||||
if ( !options || !options.of ) {
|
||||
return _position.apply( this, arguments );
|
||||
}
|
||||
|
||||
// make a copy, we don't want to modify arguments
|
||||
options = $.extend( {}, options );
|
||||
|
||||
var atOffset, targetWidth, targetHeight, targetOffset, basePosition,
|
||||
target = $( options.of ),
|
||||
within = $.position.getWithinInfo( options.within ),
|
||||
scrollInfo = $.position.getScrollInfo( within ),
|
||||
targetElem = target[0],
|
||||
collision = ( options.collision || "flip" ).split( " " ),
|
||||
offsets = {};
|
||||
|
||||
if ( targetElem.nodeType === 9 ) {
|
||||
targetWidth = target.width();
|
||||
targetHeight = target.height();
|
||||
targetOffset = { top: 0, left: 0 };
|
||||
} else if ( $.isWindow( targetElem ) ) {
|
||||
targetWidth = target.width();
|
||||
targetHeight = target.height();
|
||||
targetOffset = { top: target.scrollTop(), left: target.scrollLeft() };
|
||||
} else if ( targetElem.preventDefault ) {
|
||||
// force left top to allow flipping
|
||||
options.at = "left top";
|
||||
targetWidth = targetHeight = 0;
|
||||
targetOffset = { top: targetElem.pageY, left: targetElem.pageX };
|
||||
} else {
|
||||
targetWidth = target.outerWidth();
|
||||
targetHeight = target.outerHeight();
|
||||
targetOffset = target.offset();
|
||||
}
|
||||
// clone to reuse original targetOffset later
|
||||
basePosition = $.extend( {}, targetOffset );
|
||||
|
||||
// force my and at to have valid horizontal and vertical positions
|
||||
// if a value is missing or invalid, it will be converted to center
|
||||
$.each( [ "my", "at" ], function() {
|
||||
var pos = ( options[ this ] || "" ).split( " " ),
|
||||
horizontalOffset,
|
||||
verticalOffset;
|
||||
|
||||
if ( pos.length === 1) {
|
||||
pos = rhorizontal.test( pos[ 0 ] ) ?
|
||||
pos.concat( [ "center" ] ) :
|
||||
rvertical.test( pos[ 0 ] ) ?
|
||||
[ "center" ].concat( pos ) :
|
||||
[ "center", "center" ];
|
||||
}
|
||||
pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center";
|
||||
pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center";
|
||||
|
||||
// calculate offsets
|
||||
horizontalOffset = roffset.exec( pos[ 0 ] );
|
||||
verticalOffset = roffset.exec( pos[ 1 ] );
|
||||
offsets[ this ] = [
|
||||
horizontalOffset ? horizontalOffset[ 0 ] : 0,
|
||||
verticalOffset ? verticalOffset[ 0 ] : 0
|
||||
];
|
||||
|
||||
// reduce to just the positions without the offsets
|
||||
options[ this ] = [
|
||||
rposition.exec( pos[ 0 ] )[ 0 ],
|
||||
rposition.exec( pos[ 1 ] )[ 0 ]
|
||||
];
|
||||
});
|
||||
|
||||
// normalize collision option
|
||||
if ( collision.length === 1 ) {
|
||||
collision[ 1 ] = collision[ 0 ];
|
||||
}
|
||||
|
||||
if ( options.at[ 0 ] === "right" ) {
|
||||
basePosition.left += targetWidth;
|
||||
} else if ( options.at[ 0 ] === "center" ) {
|
||||
basePosition.left += targetWidth / 2;
|
||||
}
|
||||
|
||||
if ( options.at[ 1 ] === "bottom" ) {
|
||||
basePosition.top += targetHeight;
|
||||
} else if ( options.at[ 1 ] === "center" ) {
|
||||
basePosition.top += targetHeight / 2;
|
||||
}
|
||||
|
||||
atOffset = getOffsets( offsets.at, targetWidth, targetHeight );
|
||||
basePosition.left += atOffset[ 0 ];
|
||||
basePosition.top += atOffset[ 1 ];
|
||||
|
||||
return this.each(function() {
|
||||
var collisionPosition, using,
|
||||
elem = $( this ),
|
||||
elemWidth = elem.outerWidth(),
|
||||
elemHeight = elem.outerHeight(),
|
||||
marginLeft = parseCss( this, "marginLeft" ),
|
||||
marginTop = parseCss( this, "marginTop" ),
|
||||
collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) + scrollInfo.width,
|
||||
collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) + scrollInfo.height,
|
||||
position = $.extend( {}, basePosition ),
|
||||
myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );
|
||||
|
||||
if ( options.my[ 0 ] === "right" ) {
|
||||
position.left -= elemWidth;
|
||||
} else if ( options.my[ 0 ] === "center" ) {
|
||||
position.left -= elemWidth / 2;
|
||||
}
|
||||
|
||||
if ( options.my[ 1 ] === "bottom" ) {
|
||||
position.top -= elemHeight;
|
||||
} else if ( options.my[ 1 ] === "center" ) {
|
||||
position.top -= elemHeight / 2;
|
||||
}
|
||||
|
||||
position.left += myOffset[ 0 ];
|
||||
position.top += myOffset[ 1 ];
|
||||
|
||||
// if the browser doesn't support fractions, then round for consistent results
|
||||
if ( !$.support.offsetFractions ) {
|
||||
position.left = round( position.left );
|
||||
position.top = round( position.top );
|
||||
}
|
||||
|
||||
collisionPosition = {
|
||||
marginLeft: marginLeft,
|
||||
marginTop: marginTop
|
||||
};
|
||||
|
||||
$.each( [ "left", "top" ], function( i, dir ) {
|
||||
if ( $.ui.position[ collision[ i ] ] ) {
|
||||
$.ui.position[ collision[ i ] ][ dir ]( position, {
|
||||
targetWidth: targetWidth,
|
||||
targetHeight: targetHeight,
|
||||
elemWidth: elemWidth,
|
||||
elemHeight: elemHeight,
|
||||
collisionPosition: collisionPosition,
|
||||
collisionWidth: collisionWidth,
|
||||
collisionHeight: collisionHeight,
|
||||
offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],
|
||||
my: options.my,
|
||||
at: options.at,
|
||||
within: within,
|
||||
elem : elem
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
if ( $.fn.bgiframe ) {
|
||||
elem.bgiframe();
|
||||
}
|
||||
|
||||
if ( options.using ) {
|
||||
// adds feedback as second argument to using callback, if present
|
||||
using = function( props ) {
|
||||
var left = targetOffset.left - position.left,
|
||||
right = left + targetWidth - elemWidth,
|
||||
top = targetOffset.top - position.top,
|
||||
bottom = top + targetHeight - elemHeight,
|
||||
feedback = {
|
||||
target: {
|
||||
element: target,
|
||||
left: targetOffset.left,
|
||||
top: targetOffset.top,
|
||||
width: targetWidth,
|
||||
height: targetHeight
|
||||
},
|
||||
element: {
|
||||
element: elem,
|
||||
left: position.left,
|
||||
top: position.top,
|
||||
width: elemWidth,
|
||||
height: elemHeight
|
||||
},
|
||||
horizontal: right < 0 ? "left" : left > 0 ? "right" : "center",
|
||||
vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle"
|
||||
};
|
||||
if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {
|
||||
feedback.horizontal = "center";
|
||||
}
|
||||
if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {
|
||||
feedback.vertical = "middle";
|
||||
}
|
||||
if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {
|
||||
feedback.important = "horizontal";
|
||||
} else {
|
||||
feedback.important = "vertical";
|
||||
}
|
||||
options.using.call( this, props, feedback );
|
||||
};
|
||||
}
|
||||
|
||||
elem.offset( $.extend( position, { using: using } ) );
|
||||
});
|
||||
};
|
||||
|
||||
$.ui.position = {
|
||||
fit: {
|
||||
left: function( position, data ) {
|
||||
var within = data.within,
|
||||
withinOffset = within.isWindow ? within.scrollLeft : within.offset.left,
|
||||
outerWidth = within.width,
|
||||
collisionPosLeft = position.left - data.collisionPosition.marginLeft,
|
||||
overLeft = withinOffset - collisionPosLeft,
|
||||
overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,
|
||||
newOverRight;
|
||||
|
||||
// element is wider than within
|
||||
if ( data.collisionWidth > outerWidth ) {
|
||||
// element is initially over the left side of within
|
||||
if ( overLeft > 0 && overRight <= 0 ) {
|
||||
newOverRight = position.left + overLeft + data.collisionWidth - outerWidth - withinOffset;
|
||||
position.left += overLeft - newOverRight;
|
||||
// element is initially over right side of within
|
||||
} else if ( overRight > 0 && overLeft <= 0 ) {
|
||||
position.left = withinOffset;
|
||||
// element is initially over both left and right sides of within
|
||||
} else {
|
||||
if ( overLeft > overRight ) {
|
||||
position.left = withinOffset + outerWidth - data.collisionWidth;
|
||||
} else {
|
||||
position.left = withinOffset;
|
||||
}
|
||||
}
|
||||
// too far left -> align with left edge
|
||||
} else if ( overLeft > 0 ) {
|
||||
position.left += overLeft;
|
||||
// too far right -> align with right edge
|
||||
} else if ( overRight > 0 ) {
|
||||
position.left -= overRight;
|
||||
// adjust based on position and margin
|
||||
} else {
|
||||
position.left = max( position.left - collisionPosLeft, position.left );
|
||||
}
|
||||
},
|
||||
top: function( position, data ) {
|
||||
var within = data.within,
|
||||
withinOffset = within.isWindow ? within.scrollTop : within.offset.top,
|
||||
outerHeight = data.within.height,
|
||||
collisionPosTop = position.top - data.collisionPosition.marginTop,
|
||||
overTop = withinOffset - collisionPosTop,
|
||||
overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,
|
||||
newOverBottom;
|
||||
|
||||
// element is taller than within
|
||||
if ( data.collisionHeight > outerHeight ) {
|
||||
// element is initially over the top of within
|
||||
if ( overTop > 0 && overBottom <= 0 ) {
|
||||
newOverBottom = position.top + overTop + data.collisionHeight - outerHeight - withinOffset;
|
||||
position.top += overTop - newOverBottom;
|
||||
// element is initially over bottom of within
|
||||
} else if ( overBottom > 0 && overTop <= 0 ) {
|
||||
position.top = withinOffset;
|
||||
// element is initially over both top and bottom of within
|
||||
} else {
|
||||
if ( overTop > overBottom ) {
|
||||
position.top = withinOffset + outerHeight - data.collisionHeight;
|
||||
} else {
|
||||
position.top = withinOffset;
|
||||
}
|
||||
}
|
||||
// too far up -> align with top
|
||||
} else if ( overTop > 0 ) {
|
||||
position.top += overTop;
|
||||
// too far down -> align with bottom edge
|
||||
} else if ( overBottom > 0 ) {
|
||||
position.top -= overBottom;
|
||||
// adjust based on position and margin
|
||||
} else {
|
||||
position.top = max( position.top - collisionPosTop, position.top );
|
||||
}
|
||||
}
|
||||
},
|
||||
flip: {
|
||||
left: function( position, data ) {
|
||||
var within = data.within,
|
||||
withinOffset = within.offset.left + within.scrollLeft,
|
||||
outerWidth = within.width,
|
||||
offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,
|
||||
collisionPosLeft = position.left - data.collisionPosition.marginLeft,
|
||||
overLeft = collisionPosLeft - offsetLeft,
|
||||
overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,
|
||||
myOffset = data.my[ 0 ] === "left" ?
|
||||
-data.elemWidth :
|
||||
data.my[ 0 ] === "right" ?
|
||||
data.elemWidth :
|
||||
0,
|
||||
atOffset = data.at[ 0 ] === "left" ?
|
||||
data.targetWidth :
|
||||
data.at[ 0 ] === "right" ?
|
||||
-data.targetWidth :
|
||||
0,
|
||||
offset = -2 * data.offset[ 0 ],
|
||||
newOverRight,
|
||||
newOverLeft;
|
||||
|
||||
if ( overLeft < 0 ) {
|
||||
newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - outerWidth - withinOffset;
|
||||
if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {
|
||||
position.left += myOffset + atOffset + offset;
|
||||
}
|
||||
}
|
||||
else if ( overRight > 0 ) {
|
||||
newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - offsetLeft;
|
||||
if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {
|
||||
position.left += myOffset + atOffset + offset;
|
||||
}
|
||||
}
|
||||
},
|
||||
top: function( position, data ) {
|
||||
var within = data.within,
|
||||
withinOffset = within.offset.top + within.scrollTop,
|
||||
outerHeight = within.height,
|
||||
offsetTop = within.isWindow ? within.scrollTop : within.offset.top,
|
||||
collisionPosTop = position.top - data.collisionPosition.marginTop,
|
||||
overTop = collisionPosTop - offsetTop,
|
||||
overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,
|
||||
top = data.my[ 1 ] === "top",
|
||||
myOffset = top ?
|
||||
-data.elemHeight :
|
||||
data.my[ 1 ] === "bottom" ?
|
||||
data.elemHeight :
|
||||
0,
|
||||
atOffset = data.at[ 1 ] === "top" ?
|
||||
data.targetHeight :
|
||||
data.at[ 1 ] === "bottom" ?
|
||||
-data.targetHeight :
|
||||
0,
|
||||
offset = -2 * data.offset[ 1 ],
|
||||
newOverTop,
|
||||
newOverBottom;
|
||||
if ( overTop < 0 ) {
|
||||
newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - outerHeight - withinOffset;
|
||||
if ( ( position.top + myOffset + atOffset + offset) > overTop && ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) ) {
|
||||
position.top += myOffset + atOffset + offset;
|
||||
}
|
||||
}
|
||||
else if ( overBottom > 0 ) {
|
||||
newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop;
|
||||
if ( ( position.top + myOffset + atOffset + offset) > overBottom && ( newOverTop > 0 || abs( newOverTop ) < overBottom ) ) {
|
||||
position.top += myOffset + atOffset + offset;
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
flipfit: {
|
||||
left: function() {
|
||||
$.ui.position.flip.left.apply( this, arguments );
|
||||
$.ui.position.fit.left.apply( this, arguments );
|
||||
},
|
||||
top: function() {
|
||||
$.ui.position.flip.top.apply( this, arguments );
|
||||
$.ui.position.fit.top.apply( this, arguments );
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// fraction support test
|
||||
(function () {
|
||||
var testElement, testElementParent, testElementStyle, offsetLeft, i,
|
||||
body = document.getElementsByTagName( "body" )[ 0 ],
|
||||
div = document.createElement( "div" );
|
||||
|
||||
//Create a "fake body" for testing based on method used in jQuery.support
|
||||
testElement = document.createElement( body ? "div" : "body" );
|
||||
testElementStyle = {
|
||||
visibility: "hidden",
|
||||
width: 0,
|
||||
height: 0,
|
||||
border: 0,
|
||||
margin: 0,
|
||||
background: "none"
|
||||
};
|
||||
if ( body ) {
|
||||
$.extend( testElementStyle, {
|
||||
position: "absolute",
|
||||
left: "-1000px",
|
||||
top: "-1000px"
|
||||
});
|
||||
}
|
||||
for ( i in testElementStyle ) {
|
||||
testElement.style[ i ] = testElementStyle[ i ];
|
||||
}
|
||||
testElement.appendChild( div );
|
||||
testElementParent = body || document.documentElement;
|
||||
testElementParent.insertBefore( testElement, testElementParent.firstChild );
|
||||
|
||||
div.style.cssText = "position: absolute; left: 10.7432222px;";
|
||||
|
||||
offsetLeft = $( div ).offset().left;
|
||||
$.support.offsetFractions = offsetLeft > 10 && offsetLeft < 11;
|
||||
|
||||
testElement.innerHTML = "";
|
||||
testElementParent.removeChild( testElement );
|
||||
})();
|
||||
|
||||
// DEPRECATED
|
||||
if ( $.uiBackCompat !== false ) {
|
||||
// offset option
|
||||
(function( $ ) {
|
||||
var _position = $.fn.position;
|
||||
$.fn.position = function( options ) {
|
||||
if ( !options || !options.offset ) {
|
||||
return _position.call( this, options );
|
||||
}
|
||||
var offset = options.offset.split( " " ),
|
||||
at = options.at.split( " " );
|
||||
if ( offset.length === 1 ) {
|
||||
offset[ 1 ] = offset[ 0 ];
|
||||
}
|
||||
if ( /^\d/.test( offset[ 0 ] ) ) {
|
||||
offset[ 0 ] = "+" + offset[ 0 ];
|
||||
}
|
||||
if ( /^\d/.test( offset[ 1 ] ) ) {
|
||||
offset[ 1 ] = "+" + offset[ 1 ];
|
||||
}
|
||||
if ( at.length === 1 ) {
|
||||
if ( /left|center|right/.test( at[ 0 ] ) ) {
|
||||
at[ 1 ] = "center";
|
||||
} else {
|
||||
at[ 1 ] = at[ 0 ];
|
||||
at[ 0 ] = "center";
|
||||
}
|
||||
}
|
||||
return _position.call( this, $.extend( options, {
|
||||
at: at[ 0 ] + offset[ 0 ] + " " + at[ 1 ] + offset[ 1 ],
|
||||
offset: undefined
|
||||
} ) );
|
||||
};
|
||||
}( jQuery ) );
|
||||
}
|
||||
|
||||
}( jQuery ) );
|
846
assets/js/jquery.ui.tabs.js
vendored
Executable file
@ -0,0 +1,846 @@
|
||||
/*!
|
||||
* jQuery UI Tabs 1.10.3
|
||||
* http://jqueryui.com
|
||||
*
|
||||
* Copyright 2013 jQuery Foundation and other contributors
|
||||
* Released under the MIT license.
|
||||
* http://jquery.org/license
|
||||
*
|
||||
* http://api.jqueryui.com/tabs/
|
||||
*
|
||||
* Depends:
|
||||
* jquery.ui.core.js
|
||||
* jquery.ui.widget.js
|
||||
*/
|
||||
(function( $, undefined ) {
|
||||
|
||||
var tabId = 0,
|
||||
rhash = /#.*$/;
|
||||
|
||||
function getNextTabId() {
|
||||
return ++tabId;
|
||||
}
|
||||
|
||||
function isLocal( anchor ) {
|
||||
return anchor.hash.length > 1 &&
|
||||
decodeURIComponent( anchor.href.replace( rhash, "" ) ) ===
|
||||
decodeURIComponent( location.href.replace( rhash, "" ) );
|
||||
}
|
||||
|
||||
$.widget( "ui.tabs", {
|
||||
version: "1.10.3",
|
||||
delay: 300,
|
||||
options: {
|
||||
active: null,
|
||||
collapsible: false,
|
||||
event: "click",
|
||||
heightStyle: "content",
|
||||
hide: null,
|
||||
show: null,
|
||||
|
||||
// callbacks
|
||||
activate: null,
|
||||
beforeActivate: null,
|
||||
beforeLoad: null,
|
||||
load: null
|
||||
},
|
||||
|
||||
_create: function() {
|
||||
var that = this,
|
||||
options = this.options;
|
||||
|
||||
this.running = false;
|
||||
|
||||
this.element
|
||||
.addClass( "ui-tabs ui-widget ui-widget-content ui-corner-all" )
|
||||
.toggleClass( "ui-tabs-collapsible", options.collapsible )
|
||||
// Prevent users from focusing disabled tabs via click
|
||||
.delegate( ".ui-tabs-nav > li", "mousedown" + this.eventNamespace, function( event ) {
|
||||
if ( $( this ).is( ".ui-state-disabled" ) ) {
|
||||
event.preventDefault();
|
||||
}
|
||||
})
|
||||
// support: IE <9
|
||||
// Preventing the default action in mousedown doesn't prevent IE
|
||||
// from focusing the element, so if the anchor gets focused, blur.
|
||||
// We don't have to worry about focusing the previously focused
|
||||
// element since clicking on a non-focusable element should focus
|
||||
// the body anyway.
|
||||
.delegate( ".ui-tabs-anchor", "focus" + this.eventNamespace, function() {
|
||||
if ( $( this ).closest( "li" ).is( ".ui-state-disabled" ) ) {
|
||||
this.blur();
|
||||
}
|
||||
});
|
||||
|
||||
this._processTabs();
|
||||
options.active = this._initialActive();
|
||||
|
||||
// Take disabling tabs via class attribute from HTML
|
||||
// into account and update option properly.
|
||||
if ( $.isArray( options.disabled ) ) {
|
||||
options.disabled = $.unique( options.disabled.concat(
|
||||
$.map( this.tabs.filter( ".ui-state-disabled" ), function( li ) {
|
||||
return that.tabs.index( li );
|
||||
})
|
||||
) ).sort();
|
||||
}
|
||||
|
||||
// check for length avoids error when initializing empty list
|
||||
if ( this.options.active !== false && this.anchors.length ) {
|
||||
this.active = this._findActive( options.active );
|
||||
} else {
|
||||
this.active = $();
|
||||
}
|
||||
|
||||
this._refresh();
|
||||
|
||||
if ( this.active.length ) {
|
||||
this.load( options.active );
|
||||
}
|
||||
},
|
||||
|
||||
_initialActive: function() {
|
||||
var active = this.options.active,
|
||||
collapsible = this.options.collapsible,
|
||||
locationHash = location.hash.substring( 1 );
|
||||
|
||||
if ( active === null ) {
|
||||
// check the fragment identifier in the URL
|
||||
if ( locationHash ) {
|
||||
this.tabs.each(function( i, tab ) {
|
||||
if ( $( tab ).attr( "aria-controls" ) === locationHash ) {
|
||||
active = i;
|
||||
return false;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// check for a tab marked active via a class
|
||||
if ( active === null ) {
|
||||
active = this.tabs.index( this.tabs.filter( ".ui-tabs-active" ) );
|
||||
}
|
||||
|
||||
// no active tab, set to false
|
||||
if ( active === null || active === -1 ) {
|
||||
active = this.tabs.length ? 0 : false;
|
||||
}
|
||||
}
|
||||
|
||||
// handle numbers: negative, out of range
|
||||
if ( active !== false ) {
|
||||
active = this.tabs.index( this.tabs.eq( active ) );
|
||||
if ( active === -1 ) {
|
||||
active = collapsible ? false : 0;
|
||||
}
|
||||
}
|
||||
|
||||
// don't allow collapsible: false and active: false
|
||||
if ( !collapsible && active === false && this.anchors.length ) {
|
||||
active = 0;
|
||||
}
|
||||
|
||||
return active;
|
||||
},
|
||||
|
||||
_getCreateEventData: function() {
|
||||
return {
|
||||
tab: this.active,
|
||||
panel: !this.active.length ? $() : this._getPanelForTab( this.active )
|
||||
};
|
||||
},
|
||||
|
||||
_tabKeydown: function( event ) {
|
||||
/*jshint maxcomplexity:15*/
|
||||
var focusedTab = $( this.document[0].activeElement ).closest( "li" ),
|
||||
selectedIndex = this.tabs.index( focusedTab ),
|
||||
goingForward = true;
|
||||
|
||||
if ( this._handlePageNav( event ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
switch ( event.keyCode ) {
|
||||
case $.ui.keyCode.RIGHT:
|
||||
case $.ui.keyCode.DOWN:
|
||||
selectedIndex++;
|
||||
break;
|
||||
case $.ui.keyCode.UP:
|
||||
case $.ui.keyCode.LEFT:
|
||||
goingForward = false;
|
||||
selectedIndex--;
|
||||
break;
|
||||
case $.ui.keyCode.END:
|
||||
selectedIndex = this.anchors.length - 1;
|
||||
break;
|
||||
case $.ui.keyCode.HOME:
|
||||
selectedIndex = 0;
|
||||
break;
|
||||
case $.ui.keyCode.SPACE:
|
||||
// Activate only, no collapsing
|
||||
event.preventDefault();
|
||||
clearTimeout( this.activating );
|
||||
this._activate( selectedIndex );
|
||||
return;
|
||||
case $.ui.keyCode.ENTER:
|
||||
// Toggle (cancel delayed activation, allow collapsing)
|
||||
event.preventDefault();
|
||||
clearTimeout( this.activating );
|
||||
// Determine if we should collapse or activate
|
||||
this._activate( selectedIndex === this.options.active ? false : selectedIndex );
|
||||
return;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
// Focus the appropriate tab, based on which key was pressed
|
||||
event.preventDefault();
|
||||
clearTimeout( this.activating );
|
||||
selectedIndex = this._focusNextTab( selectedIndex, goingForward );
|
||||
|
||||
// Navigating with control key will prevent automatic activation
|
||||
if ( !event.ctrlKey ) {
|
||||
// Update aria-selected immediately so that AT think the tab is already selected.
|
||||
// Otherwise AT may confuse the user by stating that they need to activate the tab,
|
||||
// but the tab will already be activated by the time the announcement finishes.
|
||||
focusedTab.attr( "aria-selected", "false" );
|
||||
this.tabs.eq( selectedIndex ).attr( "aria-selected", "true" );
|
||||
|
||||
this.activating = this._delay(function() {
|
||||
this.option( "active", selectedIndex );
|
||||
}, this.delay );
|
||||
}
|
||||
},
|
||||
|
||||
_panelKeydown: function( event ) {
|
||||
if ( this._handlePageNav( event ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Ctrl+up moves focus to the current tab
|
||||
if ( event.ctrlKey && event.keyCode === $.ui.keyCode.UP ) {
|
||||
event.preventDefault();
|
||||
this.active.focus();
|
||||
}
|
||||
},
|
||||
|
||||
// Alt+page up/down moves focus to the previous/next tab (and activates)
|
||||
_handlePageNav: function( event ) {
|
||||
if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP ) {
|
||||
this._activate( this._focusNextTab( this.options.active - 1, false ) );
|
||||
return true;
|
||||
}
|
||||
if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN ) {
|
||||
this._activate( this._focusNextTab( this.options.active + 1, true ) );
|
||||
return true;
|
||||
}
|
||||
},
|
||||
|
||||
_findNextTab: function( index, goingForward ) {
|
||||
var lastTabIndex = this.tabs.length - 1;
|
||||
|
||||
function constrain() {
|
||||
if ( index > lastTabIndex ) {
|
||||
index = 0;
|
||||
}
|
||||
if ( index < 0 ) {
|
||||
index = lastTabIndex;
|
||||
}
|
||||
return index;
|
||||
}
|
||||
|
||||
while ( $.inArray( constrain(), this.options.disabled ) !== -1 ) {
|
||||
index = goingForward ? index + 1 : index - 1;
|
||||
}
|
||||
|
||||
return index;
|
||||
},
|
||||
|
||||
_focusNextTab: function( index, goingForward ) {
|
||||
index = this._findNextTab( index, goingForward );
|
||||
this.tabs.eq( index ).focus();
|
||||
return index;
|
||||
},
|
||||
|
||||
_setOption: function( key, value ) {
|
||||
if ( key === "active" ) {
|
||||
// _activate() will handle invalid values and update this.options
|
||||
this._activate( value );
|
||||
return;
|
||||
}
|
||||
|
||||
if ( key === "disabled" ) {
|
||||
// don't use the widget factory's disabled handling
|
||||
this._setupDisabled( value );
|
||||
return;
|
||||
}
|
||||
|
||||
this._super( key, value);
|
||||
|
||||
if ( key === "collapsible" ) {
|
||||
this.element.toggleClass( "ui-tabs-collapsible", value );
|
||||
// Setting collapsible: false while collapsed; open first panel
|
||||
if ( !value && this.options.active === false ) {
|
||||
this._activate( 0 );
|
||||
}
|
||||
}
|
||||
|
||||
if ( key === "event" ) {
|
||||
this._setupEvents( value );
|
||||
}
|
||||
|
||||
if ( key === "heightStyle" ) {
|
||||
this._setupHeightStyle( value );
|
||||
}
|
||||
},
|
||||
|
||||
_tabId: function( tab ) {
|
||||
return tab.attr( "aria-controls" ) || "ui-tabs-" + getNextTabId();
|
||||
},
|
||||
|
||||
_sanitizeSelector: function( hash ) {
|
||||
return hash ? hash.replace( /[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g, "\\$&" ) : "";
|
||||
},
|
||||
|
||||
refresh: function() {
|
||||
var options = this.options,
|
||||
lis = this.tablist.children( ":has(a[href])" );
|
||||
|
||||
// get disabled tabs from class attribute from HTML
|
||||
// this will get converted to a boolean if needed in _refresh()
|
||||
options.disabled = $.map( lis.filter( ".ui-state-disabled" ), function( tab ) {
|
||||
return lis.index( tab );
|
||||
});
|
||||
|
||||
this._processTabs();
|
||||
|
||||
// was collapsed or no tabs
|
||||
if ( options.active === false || !this.anchors.length ) {
|
||||
options.active = false;
|
||||
this.active = $();
|
||||
// was active, but active tab is gone
|
||||
} else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[ 0 ] ) ) {
|
||||
// all remaining tabs are disabled
|
||||
if ( this.tabs.length === options.disabled.length ) {
|
||||
options.active = false;
|
||||
this.active = $();
|
||||
// activate previous tab
|
||||
} else {
|
||||
this._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) );
|
||||
}
|
||||
// was active, active tab still exists
|
||||
} else {
|
||||
// make sure active index is correct
|
||||
options.active = this.tabs.index( this.active );
|
||||
}
|
||||
|
||||
this._refresh();
|
||||
},
|
||||
|
||||
_refresh: function() {
|
||||
this._setupDisabled( this.options.disabled );
|
||||
this._setupEvents( this.options.event );
|
||||
this._setupHeightStyle( this.options.heightStyle );
|
||||
|
||||
this.tabs.not( this.active ).attr({
|
||||
"aria-selected": "false",
|
||||
tabIndex: -1
|
||||
});
|
||||
this.panels.not( this._getPanelForTab( this.active ) )
|
||||
.hide()
|
||||
.attr({
|
||||
"aria-expanded": "false",
|
||||
"aria-hidden": "true"
|
||||
});
|
||||
|
||||
// Make sure one tab is in the tab order
|
||||
if ( !this.active.length ) {
|
||||
this.tabs.eq( 0 ).attr( "tabIndex", 0 );
|
||||
} else {
|
||||
this.active
|
||||
.addClass( "ui-tabs-active ui-state-active" )
|
||||
.attr({
|
||||
"aria-selected": "true",
|
||||
tabIndex: 0
|
||||
});
|
||||
this._getPanelForTab( this.active )
|
||||
.show()
|
||||
.attr({
|
||||
"aria-expanded": "true",
|
||||
"aria-hidden": "false"
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
_processTabs: function() {
|
||||
var that = this;
|
||||
|
||||
this.tablist = this._getList()
|
||||
.addClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" )
|
||||
.attr( "role", "tablist" );
|
||||
|
||||
this.tabs = this.tablist.find( "> li:has(a[href])" )
|
||||
.addClass( "ui-state-default ui-corner-top" )
|
||||
.attr({
|
||||
role: "tab",
|
||||
tabIndex: -1
|
||||
});
|
||||
|
||||
this.anchors = this.tabs.map(function() {
|
||||
return $( "a", this )[ 0 ];
|
||||
})
|
||||
.addClass( "ui-tabs-anchor" )
|
||||
.attr({
|
||||
role: "presentation",
|
||||
tabIndex: -1
|
||||
});
|
||||
|
||||
this.panels = $();
|
||||
|
||||
this.anchors.each(function( i, anchor ) {
|
||||
var selector, panel, panelId,
|
||||
anchorId = $( anchor ).uniqueId().attr( "id" ),
|
||||
tab = $( anchor ).closest( "li" ),
|
||||
originalAriaControls = tab.attr( "aria-controls" );
|
||||
|
||||
// inline tab
|
||||
if ( isLocal( anchor ) ) {
|
||||
selector = anchor.hash;
|
||||
panel = that.element.find( that._sanitizeSelector( selector ) );
|
||||
// remote tab
|
||||
} else {
|
||||
panelId = that._tabId( tab );
|
||||
selector = "#" + panelId;
|
||||
panel = that.element.find( selector );
|
||||
if ( !panel.length ) {
|
||||
panel = that._createPanel( panelId );
|
||||
panel.insertAfter( that.panels[ i - 1 ] || that.tablist );
|
||||
}
|
||||
panel.attr( "aria-live", "polite" );
|
||||
}
|
||||
|
||||
if ( panel.length) {
|
||||
that.panels = that.panels.add( panel );
|
||||
}
|
||||
if ( originalAriaControls ) {
|
||||
tab.data( "ui-tabs-aria-controls", originalAriaControls );
|
||||
}
|
||||
tab.attr({
|
||||
"aria-controls": selector.substring( 1 ),
|
||||
"aria-labelledby": anchorId
|
||||
});
|
||||
panel.attr( "aria-labelledby", anchorId );
|
||||
});
|
||||
|
||||
this.panels
|
||||
.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
|
||||
.attr( "role", "tabpanel" );
|
||||
},
|
||||
|
||||
// allow overriding how to find the list for rare usage scenarios (#7715)
|
||||
_getList: function() {
|
||||
return this.element.find( "ol,ul" ).eq( 0 );
|
||||
},
|
||||
|
||||
_createPanel: function( id ) {
|
||||
return $( "<div>" )
|
||||
.attr( "id", id )
|
||||
.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
|
||||
.data( "ui-tabs-destroy", true );
|
||||
},
|
||||
|
||||
_setupDisabled: function( disabled ) {
|
||||
if ( $.isArray( disabled ) ) {
|
||||
if ( !disabled.length ) {
|
||||
disabled = false;
|
||||
} else if ( disabled.length === this.anchors.length ) {
|
||||
disabled = true;
|
||||
}
|
||||
}
|
||||
|
||||
// disable tabs
|
||||
for ( var i = 0, li; ( li = this.tabs[ i ] ); i++ ) {
|
||||
if ( disabled === true || $.inArray( i, disabled ) !== -1 ) {
|
||||
$( li )
|
||||
.addClass( "ui-state-disabled" )
|
||||
.attr( "aria-disabled", "true" );
|
||||
} else {
|
||||
$( li )
|
||||
.removeClass( "ui-state-disabled" )
|
||||
.removeAttr( "aria-disabled" );
|
||||
}
|
||||
}
|
||||
|
||||
this.options.disabled = disabled;
|
||||
},
|
||||
|
||||
_setupEvents: function( event ) {
|
||||
var events = {
|
||||
click: function( event ) {
|
||||
event.preventDefault();
|
||||
}
|
||||
};
|
||||
if ( event ) {
|
||||
$.each( event.split(" "), function( index, eventName ) {
|
||||
events[ eventName ] = "_eventHandler";
|
||||
});
|
||||
}
|
||||
|
||||
this._off( this.anchors.add( this.tabs ).add( this.panels ) );
|
||||
this._on( this.anchors, events );
|
||||
this._on( this.tabs, { keydown: "_tabKeydown" } );
|
||||
this._on( this.panels, { keydown: "_panelKeydown" } );
|
||||
|
||||
this._focusable( this.tabs );
|
||||
this._hoverable( this.tabs );
|
||||
},
|
||||
|
||||
_setupHeightStyle: function( heightStyle ) {
|
||||
var maxHeight,
|
||||
parent = this.element.parent();
|
||||
|
||||
if ( heightStyle === "fill" ) {
|
||||
maxHeight = parent.height();
|
||||
maxHeight -= this.element.outerHeight() - this.element.height();
|
||||
|
||||
this.element.siblings( ":visible" ).each(function() {
|
||||
var elem = $( this ),
|
||||
position = elem.css( "position" );
|
||||
|
||||
if ( position === "absolute" || position === "fixed" ) {
|
||||
return;
|
||||
}
|
||||
maxHeight -= elem.outerHeight( true );
|
||||
});
|
||||
|
||||
this.element.children().not( this.panels ).each(function() {
|
||||
maxHeight -= $( this ).outerHeight( true );
|
||||
});
|
||||
|
||||
this.panels.each(function() {
|
||||
$( this ).height( Math.max( 0, maxHeight -
|
||||
$( this ).innerHeight() + $( this ).height() ) );
|
||||
})
|
||||
.css( "overflow", "auto" );
|
||||
} else if ( heightStyle === "auto" ) {
|
||||
maxHeight = 0;
|
||||
this.panels.each(function() {
|
||||
maxHeight = Math.max( maxHeight, $( this ).height( "" ).height() );
|
||||
}).height( maxHeight );
|
||||
}
|
||||
},
|
||||
|
||||
_eventHandler: function( event ) {
|
||||
var options = this.options,
|
||||
active = this.active,
|
||||
anchor = $( event.currentTarget ),
|
||||
tab = anchor.closest( "li" ),
|
||||
clickedIsActive = tab[ 0 ] === active[ 0 ],
|
||||
collapsing = clickedIsActive && options.collapsible,
|
||||
toShow = collapsing ? $() : this._getPanelForTab( tab ),
|
||||
toHide = !active.length ? $() : this._getPanelForTab( active ),
|
||||
eventData = {
|
||||
oldTab: active,
|
||||
oldPanel: toHide,
|
||||
newTab: collapsing ? $() : tab,
|
||||
newPanel: toShow
|
||||
};
|
||||
|
||||
event.preventDefault();
|
||||
|
||||
if ( tab.hasClass( "ui-state-disabled" ) ||
|
||||
// tab is already loading
|
||||
tab.hasClass( "ui-tabs-loading" ) ||
|
||||
// can't switch durning an animation
|
||||
this.running ||
|
||||
// click on active header, but not collapsible
|
||||
( clickedIsActive && !options.collapsible ) ||
|
||||
// allow canceling activation
|
||||
( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
options.active = collapsing ? false : this.tabs.index( tab );
|
||||
|
||||
this.active = clickedIsActive ? $() : tab;
|
||||
if ( this.xhr ) {
|
||||
this.xhr.abort();
|
||||
}
|
||||
|
||||
if ( !toHide.length && !toShow.length ) {
|
||||
$.error( "jQuery UI Tabs: Mismatching fragment identifier." );
|
||||
}
|
||||
|
||||
if ( toShow.length ) {
|
||||
this.load( this.tabs.index( tab ), event );
|
||||
}
|
||||
this._toggle( event, eventData );
|
||||
},
|
||||
|
||||
// handles show/hide for selecting tabs
|
||||
_toggle: function( event, eventData ) {
|
||||
var that = this,
|
||||
toShow = eventData.newPanel,
|
||||
toHide = eventData.oldPanel;
|
||||
|
||||
this.running = true;
|
||||
|
||||
function complete() {
|
||||
that.running = false;
|
||||
that._trigger( "activate", event, eventData );
|
||||
}
|
||||
|
||||
function show() {
|
||||
eventData.newTab.closest( "li" ).addClass( "ui-tabs-active ui-state-active" );
|
||||
|
||||
if ( toShow.length && that.options.show ) {
|
||||
that._show( toShow, that.options.show, complete );
|
||||
} else {
|
||||
toShow.show();
|
||||
complete();
|
||||
}
|
||||
}
|
||||
|
||||
// start out by hiding, then showing, then completing
|
||||
if ( toHide.length && this.options.hide ) {
|
||||
this._hide( toHide, this.options.hide, function() {
|
||||
eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );
|
||||
show();
|
||||
});
|
||||
} else {
|
||||
eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );
|
||||
toHide.hide();
|
||||
show();
|
||||
}
|
||||
|
||||
toHide.attr({
|
||||
"aria-expanded": "false",
|
||||
"aria-hidden": "true"
|
||||
});
|
||||
eventData.oldTab.attr( "aria-selected", "false" );
|
||||
// If we're switching tabs, remove the old tab from the tab order.
|
||||
// If we're opening from collapsed state, remove the previous tab from the tab order.
|
||||
// If we're collapsing, then keep the collapsing tab in the tab order.
|
||||
if ( toShow.length && toHide.length ) {
|
||||
eventData.oldTab.attr( "tabIndex", -1 );
|
||||
} else if ( toShow.length ) {
|
||||
this.tabs.filter(function() {
|
||||
return $( this ).attr( "tabIndex" ) === 0;
|
||||
})
|
||||
.attr( "tabIndex", -1 );
|
||||
}
|
||||
|
||||
toShow.attr({
|
||||
"aria-expanded": "true",
|
||||
"aria-hidden": "false"
|
||||
});
|
||||
eventData.newTab.attr({
|
||||
"aria-selected": "true",
|
||||
tabIndex: 0
|
||||
});
|
||||
},
|
||||
|
||||
_activate: function( index ) {
|
||||
var anchor,
|
||||
active = this._findActive( index );
|
||||
|
||||
// trying to activate the already active panel
|
||||
if ( active[ 0 ] === this.active[ 0 ] ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// trying to collapse, simulate a click on the current active header
|
||||
if ( !active.length ) {
|
||||
active = this.active;
|
||||
}
|
||||
|
||||
anchor = active.find( ".ui-tabs-anchor" )[ 0 ];
|
||||
this._eventHandler({
|
||||
target: anchor,
|
||||
currentTarget: anchor,
|
||||
preventDefault: $.noop
|
||||
});
|
||||
},
|
||||
|
||||
_findActive: function( index ) {
|
||||
return index === false ? $() : this.tabs.eq( index );
|
||||
},
|
||||
|
||||
_getIndex: function( index ) {
|
||||
// meta-function to give users option to provide a href string instead of a numerical index.
|
||||
if ( typeof index === "string" ) {
|
||||
index = this.anchors.index( this.anchors.filter( "[href$='" + index + "']" ) );
|
||||
}
|
||||
|
||||
return index;
|
||||
},
|
||||
|
||||
_destroy: function() {
|
||||
if ( this.xhr ) {
|
||||
this.xhr.abort();
|
||||
}
|
||||
|
||||
this.element.removeClass( "ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible" );
|
||||
|
||||
this.tablist
|
||||
.removeClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" )
|
||||
.removeAttr( "role" );
|
||||
|
||||
this.anchors
|
||||
.removeClass( "ui-tabs-anchor" )
|
||||
.removeAttr( "role" )
|
||||
.removeAttr( "tabIndex" )
|
||||
.removeUniqueId();
|
||||
|
||||
this.tabs.add( this.panels ).each(function() {
|
||||
if ( $.data( this, "ui-tabs-destroy" ) ) {
|
||||
$( this ).remove();
|
||||
} else {
|
||||
$( this )
|
||||
.removeClass( "ui-state-default ui-state-active ui-state-disabled " +
|
||||
"ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel" )
|
||||
.removeAttr( "tabIndex" )
|
||||
.removeAttr( "aria-live" )
|
||||
.removeAttr( "aria-busy" )
|
||||
.removeAttr( "aria-selected" )
|
||||
.removeAttr( "aria-labelledby" )
|
||||
.removeAttr( "aria-hidden" )
|
||||
.removeAttr( "aria-expanded" )
|
||||
.removeAttr( "role" );
|
||||
}
|
||||
});
|
||||
|
||||
this.tabs.each(function() {
|
||||
var li = $( this ),
|
||||
prev = li.data( "ui-tabs-aria-controls" );
|
||||
if ( prev ) {
|
||||
li
|
||||
.attr( "aria-controls", prev )
|
||||
.removeData( "ui-tabs-aria-controls" );
|
||||
} else {
|
||||
li.removeAttr( "aria-controls" );
|
||||
}
|
||||
});
|
||||
|
||||
this.panels.show();
|
||||
|
||||
if ( this.options.heightStyle !== "content" ) {
|
||||
this.panels.css( "height", "" );
|
||||
}
|
||||
},
|
||||
|
||||
enable: function( index ) {
|
||||
var disabled = this.options.disabled;
|
||||
if ( disabled === false ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( index === undefined ) {
|
||||
disabled = false;
|
||||
} else {
|
||||
index = this._getIndex( index );
|
||||
if ( $.isArray( disabled ) ) {
|
||||
disabled = $.map( disabled, function( num ) {
|
||||
return num !== index ? num : null;
|
||||
});
|
||||
} else {
|
||||
disabled = $.map( this.tabs, function( li, num ) {
|
||||
return num !== index ? num : null;
|
||||
});
|
||||
}
|
||||
}
|
||||
this._setupDisabled( disabled );
|
||||
},
|
||||
|
||||
disable: function( index ) {
|
||||
var disabled = this.options.disabled;
|
||||
if ( disabled === true ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( index === undefined ) {
|
||||
disabled = true;
|
||||
} else {
|
||||
index = this._getIndex( index );
|
||||
if ( $.inArray( index, disabled ) !== -1 ) {
|
||||
return;
|
||||
}
|
||||
if ( $.isArray( disabled ) ) {
|
||||
disabled = $.merge( [ index ], disabled ).sort();
|
||||
} else {
|
||||
disabled = [ index ];
|
||||
}
|
||||
}
|
||||
this._setupDisabled( disabled );
|
||||
},
|
||||
|
||||
load: function( index, event ) {
|
||||
index = this._getIndex( index );
|
||||
var that = this,
|
||||
tab = this.tabs.eq( index ),
|
||||
anchor = tab.find( ".ui-tabs-anchor" ),
|
||||
panel = this._getPanelForTab( tab ),
|
||||
eventData = {
|
||||
tab: tab,
|
||||
panel: panel
|
||||
};
|
||||
|
||||
// not remote
|
||||
if ( isLocal( anchor[ 0 ] ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.xhr = $.ajax( this._ajaxSettings( anchor, event, eventData ) );
|
||||
|
||||
// support: jQuery <1.8
|
||||
// jQuery <1.8 returns false if the request is canceled in beforeSend,
|
||||
// but as of 1.8, $.ajax() always returns a jqXHR object.
|
||||
if ( this.xhr && this.xhr.statusText !== "canceled" ) {
|
||||
tab.addClass( "ui-tabs-loading" );
|
||||
panel.attr( "aria-busy", "true" );
|
||||
|
||||
this.xhr
|
||||
.success(function( response ) {
|
||||
// support: jQuery <1.8
|
||||
// http://bugs.jquery.com/ticket/11778
|
||||
setTimeout(function() {
|
||||
panel.html( response );
|
||||
that._trigger( "load", event, eventData );
|
||||
}, 1 );
|
||||
})
|
||||
.complete(function( jqXHR, status ) {
|
||||
// support: jQuery <1.8
|
||||
// http://bugs.jquery.com/ticket/11778
|
||||
setTimeout(function() {
|
||||
if ( status === "abort" ) {
|
||||
that.panels.stop( false, true );
|
||||
}
|
||||
|
||||
tab.removeClass( "ui-tabs-loading" );
|
||||
panel.removeAttr( "aria-busy" );
|
||||
|
||||
if ( jqXHR === that.xhr ) {
|
||||
delete that.xhr;
|
||||
}
|
||||
}, 1 );
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
_ajaxSettings: function( anchor, event, eventData ) {
|
||||
var that = this;
|
||||
return {
|
||||
url: anchor.attr( "href" ),
|
||||
beforeSend: function( jqXHR, settings ) {
|
||||
return that._trigger( "beforeLoad", event,
|
||||
$.extend( { jqXHR : jqXHR, ajaxSettings: settings }, eventData ) );
|
||||
}
|
||||
};
|
||||
},
|
||||
|
||||
_getPanelForTab: function( tab ) {
|
||||
var id = $( tab ).attr( "aria-controls" );
|
||||
return this.element.find( this._sanitizeSelector( "#" + id ) );
|
||||
}
|
||||
});
|
||||
|
||||
})( jQuery );
|
528
assets/js/jquery.ui.widget.js
vendored
Executable file
@ -0,0 +1,528 @@
|
||||
/*!
|
||||
* jQuery UI Widget 1.9.2
|
||||
* http://jqueryui.com
|
||||
*
|
||||
* Copyright 2012 jQuery Foundation and other contributors
|
||||
* Released under the MIT license.
|
||||
* http://jquery.org/license
|
||||
*
|
||||
* http://api.jqueryui.com/jQuery.widget/
|
||||
*/
|
||||
(function( $, undefined ) {
|
||||
|
||||
var uuid = 0,
|
||||
slice = Array.prototype.slice,
|
||||
_cleanData = $.cleanData;
|
||||
$.cleanData = function( elems ) {
|
||||
for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
|
||||
try {
|
||||
$( elem ).triggerHandler( "remove" );
|
||||
// http://bugs.jquery.com/ticket/8235
|
||||
} catch( e ) {}
|
||||
}
|
||||
_cleanData( elems );
|
||||
};
|
||||
|
||||
$.widget = function( name, base, prototype ) {
|
||||
var fullName, existingConstructor, constructor, basePrototype,
|
||||
namespace = name.split( "." )[ 0 ];
|
||||
|
||||
name = name.split( "." )[ 1 ];
|
||||
fullName = namespace + "-" + name;
|
||||
|
||||
if ( !prototype ) {
|
||||
prototype = base;
|
||||
base = $.Widget;
|
||||
}
|
||||
|
||||
// create selector for plugin
|
||||
$.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
|
||||
return !!$.data( elem, fullName );
|
||||
};
|
||||
|
||||
$[ namespace ] = $[ namespace ] || {};
|
||||
existingConstructor = $[ namespace ][ name ];
|
||||
constructor = $[ namespace ][ name ] = function( options, element ) {
|
||||
// allow instantiation without "new" keyword
|
||||
if ( !this._createWidget ) {
|
||||
return new constructor( options, element );
|
||||
}
|
||||
|
||||
// allow instantiation without initializing for simple inheritance
|
||||
// must use "new" keyword (the code above always passes args)
|
||||
if ( arguments.length ) {
|
||||
this._createWidget( options, element );
|
||||
}
|
||||
};
|
||||
// extend with the existing constructor to carry over any static properties
|
||||
$.extend( constructor, existingConstructor, {
|
||||
version: prototype.version,
|
||||
// copy the object used to create the prototype in case we need to
|
||||
// redefine the widget later
|
||||
_proto: $.extend( {}, prototype ),
|
||||
// track widgets that inherit from this widget in case this widget is
|
||||
// redefined after a widget inherits from it
|
||||
_childConstructors: []
|
||||
});
|
||||
|
||||
basePrototype = new base();
|
||||
// we need to make the options hash a property directly on the new instance
|
||||
// otherwise we'll modify the options hash on the prototype that we're
|
||||
// inheriting from
|
||||
basePrototype.options = $.widget.extend( {}, basePrototype.options );
|
||||
$.each( prototype, function( prop, value ) {
|
||||
if ( $.isFunction( value ) ) {
|
||||
prototype[ prop ] = (function() {
|
||||
var _super = function() {
|
||||
return base.prototype[ prop ].apply( this, arguments );
|
||||
},
|
||||
_superApply = function( args ) {
|
||||
return base.prototype[ prop ].apply( this, args );
|
||||
};
|
||||
return function() {
|
||||
var __super = this._super,
|
||||
__superApply = this._superApply,
|
||||
returnValue;
|
||||
|
||||
this._super = _super;
|
||||
this._superApply = _superApply;
|
||||
|
||||
returnValue = value.apply( this, arguments );
|
||||
|
||||
this._super = __super;
|
||||
this._superApply = __superApply;
|
||||
|
||||
return returnValue;
|
||||
};
|
||||
})();
|
||||
}
|
||||
});
|
||||
constructor.prototype = $.widget.extend( basePrototype, {
|
||||
// TODO: remove support for widgetEventPrefix
|
||||
// always use the name + a colon as the prefix, e.g., draggable:start
|
||||
// don't prefix for widgets that aren't DOM-based
|
||||
widgetEventPrefix: existingConstructor ? basePrototype.widgetEventPrefix : name
|
||||
}, prototype, {
|
||||
constructor: constructor,
|
||||
namespace: namespace,
|
||||
widgetName: name,
|
||||
// TODO remove widgetBaseClass, see #8155
|
||||
widgetBaseClass: fullName,
|
||||
widgetFullName: fullName
|
||||
});
|
||||
|
||||
// If this widget is being redefined then we need to find all widgets that
|
||||
// are inheriting from it and redefine all of them so that they inherit from
|
||||
// the new version of this widget. We're essentially trying to replace one
|
||||
// level in the prototype chain.
|
||||
if ( existingConstructor ) {
|
||||
$.each( existingConstructor._childConstructors, function( i, child ) {
|
||||
var childPrototype = child.prototype;
|
||||
|
||||
// redefine the child widget using the same prototype that was
|
||||
// originally used, but inherit from the new version of the base
|
||||
$.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto );
|
||||
});
|
||||
// remove the list of existing child constructors from the old constructor
|
||||
// so the old child constructors can be garbage collected
|
||||
delete existingConstructor._childConstructors;
|
||||
} else {
|
||||
base._childConstructors.push( constructor );
|
||||
}
|
||||
|
||||
$.widget.bridge( name, constructor );
|
||||
};
|
||||
|
||||
$.widget.extend = function( target ) {
|
||||
var input = slice.call( arguments, 1 ),
|
||||
inputIndex = 0,
|
||||
inputLength = input.length,
|
||||
key,
|
||||
value;
|
||||
for ( ; inputIndex < inputLength; inputIndex++ ) {
|
||||
for ( key in input[ inputIndex ] ) {
|
||||
value = input[ inputIndex ][ key ];
|
||||
if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
|
||||
// Clone objects
|
||||
if ( $.isPlainObject( value ) ) {
|
||||
target[ key ] = $.isPlainObject( target[ key ] ) ?
|
||||
$.widget.extend( {}, target[ key ], value ) :
|
||||
// Don't extend strings, arrays, etc. with objects
|
||||
$.widget.extend( {}, value );
|
||||
// Copy everything else by reference
|
||||
} else {
|
||||
target[ key ] = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return target;
|
||||
};
|
||||
|
||||
$.widget.bridge = function( name, object ) {
|
||||
var fullName = object.prototype.widgetFullName || name;
|
||||
$.fn[ name ] = function( options ) {
|
||||
var isMethodCall = typeof options === "string",
|
||||
args = slice.call( arguments, 1 ),
|
||||
returnValue = this;
|
||||
|
||||
// allow multiple hashes to be passed on init
|
||||
options = !isMethodCall && args.length ?
|
||||
$.widget.extend.apply( null, [ options ].concat(args) ) :
|
||||
options;
|
||||
|
||||
if ( isMethodCall ) {
|
||||
this.each(function() {
|
||||
var methodValue,
|
||||
instance = $.data( this, fullName );
|
||||
if ( !instance ) {
|
||||
return $.error( "cannot call methods on " + name + " prior to initialization; " +
|
||||
"attempted to call method '" + options + "'" );
|
||||
}
|
||||
if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) {
|
||||
return $.error( "no such method '" + options + "' for " + name + " widget instance" );
|
||||
}
|
||||
methodValue = instance[ options ].apply( instance, args );
|
||||
if ( methodValue !== instance && methodValue !== undefined ) {
|
||||
returnValue = methodValue && methodValue.jquery ?
|
||||
returnValue.pushStack( methodValue.get() ) :
|
||||
methodValue;
|
||||
return false;
|
||||
}
|
||||
});
|
||||
} else {
|
||||
this.each(function() {
|
||||
var instance = $.data( this, fullName );
|
||||
if ( instance ) {
|
||||
instance.option( options || {} )._init();
|
||||
} else {
|
||||
$.data( this, fullName, new object( options, this ) );
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
};
|
||||
};
|
||||
|
||||
$.Widget = function( /* options, element */ ) {};
|
||||
$.Widget._childConstructors = [];
|
||||
|
||||
$.Widget.prototype = {
|
||||
widgetName: "widget",
|
||||
widgetEventPrefix: "",
|
||||
defaultElement: "<div>",
|
||||
options: {
|
||||
disabled: false,
|
||||
|
||||
// callbacks
|
||||
create: null
|
||||
},
|
||||
_createWidget: function( options, element ) {
|
||||
element = $( element || this.defaultElement || this )[ 0 ];
|
||||
this.element = $( element );
|
||||
this.uuid = uuid++;
|
||||
this.eventNamespace = "." + this.widgetName + this.uuid;
|
||||
this.options = $.widget.extend( {},
|
||||
this.options,
|
||||
this._getCreateOptions(),
|
||||
options );
|
||||
|
||||
this.bindings = $();
|
||||
this.hoverable = $();
|
||||
this.focusable = $();
|
||||
|
||||
if ( element !== this ) {
|
||||
// 1.9 BC for #7810
|
||||
// TODO remove dual storage
|
||||
$.data( element, this.widgetName, this );
|
||||
$.data( element, this.widgetFullName, this );
|
||||
this._on( true, this.element, {
|
||||
remove: function( event ) {
|
||||
if ( event.target === element ) {
|
||||
this.destroy();
|
||||
}
|
||||
}
|
||||
});
|
||||
this.document = $( element.style ?
|
||||
// element within the document
|
||||
element.ownerDocument :
|
||||
// element is window or document
|
||||
element.document || element );
|
||||
this.window = $( this.document[0].defaultView || this.document[0].parentWindow );
|
||||
}
|
||||
|
||||
this._create();
|
||||
this._trigger( "create", null, this._getCreateEventData() );
|
||||
this._init();
|
||||
},
|
||||
_getCreateOptions: $.noop,
|
||||
_getCreateEventData: $.noop,
|
||||
_create: $.noop,
|
||||
_init: $.noop,
|
||||
|
||||
destroy: function() {
|
||||
this._destroy();
|
||||
// we can probably remove the unbind calls in 2.0
|
||||
// all event bindings should go through this._on()
|
||||
this.element
|
||||
.unbind( this.eventNamespace )
|
||||
// 1.9 BC for #7810
|
||||
// TODO remove dual storage
|
||||
.removeData( this.widgetName )
|
||||
.removeData( this.widgetFullName )
|
||||
// support: jquery <1.6.3
|
||||
// http://bugs.jquery.com/ticket/9413
|
||||
.removeData( $.camelCase( this.widgetFullName ) );
|
||||
this.widget()
|
||||
.unbind( this.eventNamespace )
|
||||
.removeAttr( "aria-disabled" )
|
||||
.removeClass(
|
||||
this.widgetFullName + "-disabled " +
|
||||
"ui-state-disabled" );
|
||||
|
||||
// clean up events and states
|
||||
this.bindings.unbind( this.eventNamespace );
|
||||
this.hoverable.removeClass( "ui-state-hover" );
|
||||
this.focusable.removeClass( "ui-state-focus" );
|
||||
},
|
||||
_destroy: $.noop,
|
||||
|
||||
widget: function() {
|
||||
return this.element;
|
||||
},
|
||||
|
||||
option: function( key, value ) {
|
||||
var options = key,
|
||||
parts,
|
||||
curOption,
|
||||
i;
|
||||
|
||||
if ( arguments.length === 0 ) {
|
||||
// don't return a reference to the internal hash
|
||||
return $.widget.extend( {}, this.options );
|
||||
}
|
||||
|
||||
if ( typeof key === "string" ) {
|
||||
// handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
|
||||
options = {};
|
||||
parts = key.split( "." );
|
||||
key = parts.shift();
|
||||
if ( parts.length ) {
|
||||
curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
|
||||
for ( i = 0; i < parts.length - 1; i++ ) {
|
||||
curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
|
||||
curOption = curOption[ parts[ i ] ];
|
||||
}
|
||||
key = parts.pop();
|
||||
if ( value === undefined ) {
|
||||
return curOption[ key ] === undefined ? null : curOption[ key ];
|
||||
}
|
||||
curOption[ key ] = value;
|
||||
} else {
|
||||
if ( value === undefined ) {
|
||||
return this.options[ key ] === undefined ? null : this.options[ key ];
|
||||
}
|
||||
options[ key ] = value;
|
||||
}
|
||||
}
|
||||
|
||||
this._setOptions( options );
|
||||
|
||||
return this;
|
||||
},
|
||||
_setOptions: function( options ) {
|
||||
var key;
|
||||
|
||||
for ( key in options ) {
|
||||
this._setOption( key, options[ key ] );
|
||||
}
|
||||
|
||||
return this;
|
||||
},
|
||||
_setOption: function( key, value ) {
|
||||
this.options[ key ] = value;
|
||||
|
||||
if ( key === "disabled" ) {
|
||||
this.widget()
|
||||
.toggleClass( this.widgetFullName + "-disabled ui-state-disabled", !!value )
|
||||
.attr( "aria-disabled", value );
|
||||
this.hoverable.removeClass( "ui-state-hover" );
|
||||
this.focusable.removeClass( "ui-state-focus" );
|
||||
}
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
enable: function() {
|
||||
return this._setOption( "disabled", false );
|
||||
},
|
||||
disable: function() {
|
||||
return this._setOption( "disabled", true );
|
||||
},
|
||||
|
||||
_on: function( suppressDisabledCheck, element, handlers ) {
|
||||
var delegateElement,
|
||||
instance = this;
|
||||
|
||||
// no suppressDisabledCheck flag, shuffle arguments
|
||||
if ( typeof suppressDisabledCheck !== "boolean" ) {
|
||||
handlers = element;
|
||||
element = suppressDisabledCheck;
|
||||
suppressDisabledCheck = false;
|
||||
}
|
||||
|
||||
// no element argument, shuffle and use this.element
|
||||
if ( !handlers ) {
|
||||
handlers = element;
|
||||
element = this.element;
|
||||
delegateElement = this.widget();
|
||||
} else {
|
||||
// accept selectors, DOM elements
|
||||
element = delegateElement = $( element );
|
||||
this.bindings = this.bindings.add( element );
|
||||
}
|
||||
|
||||
$.each( handlers, function( event, handler ) {
|
||||
function handlerProxy() {
|
||||
// allow widgets to customize the disabled handling
|
||||
// - disabled as an array instead of boolean
|
||||
// - disabled class as method for disabling individual parts
|
||||
if ( !suppressDisabledCheck &&
|
||||
( instance.options.disabled === true ||
|
||||
$( this ).hasClass( "ui-state-disabled" ) ) ) {
|
||||
return;
|
||||
}
|
||||
return ( typeof handler === "string" ? instance[ handler ] : handler )
|
||||
.apply( instance, arguments );
|
||||
}
|
||||
|
||||
// copy the guid so direct unbinding works
|
||||
if ( typeof handler !== "string" ) {
|
||||
handlerProxy.guid = handler.guid =
|
||||
handler.guid || handlerProxy.guid || $.guid++;
|
||||
}
|
||||
|
||||
var match = event.match( /^(\w+)\s*(.*)$/ ),
|
||||
eventName = match[1] + instance.eventNamespace,
|
||||
selector = match[2];
|
||||
if ( selector ) {
|
||||
delegateElement.delegate( selector, eventName, handlerProxy );
|
||||
} else {
|
||||
element.bind( eventName, handlerProxy );
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
_off: function( element, eventName ) {
|
||||
eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + this.eventNamespace;
|
||||
element.unbind( eventName ).undelegate( eventName );
|
||||
},
|
||||
|
||||
_delay: function( handler, delay ) {
|
||||
function handlerProxy() {
|
||||
return ( typeof handler === "string" ? instance[ handler ] : handler )
|
||||
.apply( instance, arguments );
|
||||
}
|
||||
var instance = this;
|
||||
return setTimeout( handlerProxy, delay || 0 );
|
||||
},
|
||||
|
||||
_hoverable: function( element ) {
|
||||
this.hoverable = this.hoverable.add( element );
|
||||
this._on( element, {
|
||||
mouseenter: function( event ) {
|
||||
$( event.currentTarget ).addClass( "ui-state-hover" );
|
||||
},
|
||||
mouseleave: function( event ) {
|
||||
$( event.currentTarget ).removeClass( "ui-state-hover" );
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
_focusable: function( element ) {
|
||||
this.focusable = this.focusable.add( element );
|
||||
this._on( element, {
|
||||
focusin: function( event ) {
|
||||
$( event.currentTarget ).addClass( "ui-state-focus" );
|
||||
},
|
||||
focusout: function( event ) {
|
||||
$( event.currentTarget ).removeClass( "ui-state-focus" );
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
_trigger: function( type, event, data ) {
|
||||
var prop, orig,
|
||||
callback = this.options[ type ];
|
||||
|
||||
data = data || {};
|
||||
event = $.Event( event );
|
||||
event.type = ( type === this.widgetEventPrefix ?
|
||||
type :
|
||||
this.widgetEventPrefix + type ).toLowerCase();
|
||||
// the original event may come from any element
|
||||
// so we need to reset the target on the new event
|
||||
event.target = this.element[ 0 ];
|
||||
|
||||
// copy original event properties over to the new event
|
||||
orig = event.originalEvent;
|
||||
if ( orig ) {
|
||||
for ( prop in orig ) {
|
||||
if ( !( prop in event ) ) {
|
||||
event[ prop ] = orig[ prop ];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this.element.trigger( event, data );
|
||||
return !( $.isFunction( callback ) &&
|
||||
callback.apply( this.element[0], [ event ].concat( data ) ) === false ||
|
||||
event.isDefaultPrevented() );
|
||||
}
|
||||
};
|
||||
|
||||
$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
|
||||
$.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
|
||||
if ( typeof options === "string" ) {
|
||||
options = { effect: options };
|
||||
}
|
||||
var hasOptions,
|
||||
effectName = !options ?
|
||||
method :
|
||||
options === true || typeof options === "number" ?
|
||||
defaultEffect :
|
||||
options.effect || defaultEffect;
|
||||
options = options || {};
|
||||
if ( typeof options === "number" ) {
|
||||
options = { duration: options };
|
||||
}
|
||||
hasOptions = !$.isEmptyObject( options );
|
||||
options.complete = callback;
|
||||
if ( options.delay ) {
|
||||
element.delay( options.delay );
|
||||
}
|
||||
if ( hasOptions && $.effects && ( $.effects.effect[ effectName ] || $.uiBackCompat !== false && $.effects[ effectName ] ) ) {
|
||||
element[ method ]( options );
|
||||
} else if ( effectName !== method && element[ effectName ] ) {
|
||||
element[ effectName ]( options.duration, options.easing, callback );
|
||||
} else {
|
||||
element.queue(function( next ) {
|
||||
$( this )[ method ]();
|
||||
if ( callback ) {
|
||||
callback.call( element[ 0 ] );
|
||||
}
|
||||
next();
|
||||
});
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
// DEPRECATED
|
||||
if ( $.uiBackCompat !== false ) {
|
||||
$.Widget.prototype._getCreateOptions = function() {
|
||||
return $.metadata && $.metadata.get( this.element[0] )[ this.widgetName ];
|
||||
};
|
||||
}
|
||||
|
||||
})( jQuery );
|
14032
assets/js/jquery/jquery.dataTables.js
vendored
Executable file
69
assets/js/jquery/jquery.easing.1.3.min.js
vendored
Executable file
@ -0,0 +1,69 @@
|
||||
/*
|
||||
* jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/
|
||||
*
|
||||
* Uses the built in easing capabilities added In jQuery 1.1
|
||||
* to offer multiple easing options
|
||||
*
|
||||
* TERMS OF USE - jQuery Easing
|
||||
*
|
||||
* Open source under the BSD License.
|
||||
*
|
||||
* Copyright © 2008 George McGinley Smith
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright notice, this list of
|
||||
* conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||
* provided with the distribution.
|
||||
*
|
||||
* Neither the name of the author nor the names of contributors may be used to endorse
|
||||
* or promote products derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
jQuery.easing["jswing"]=jQuery.easing["swing"];jQuery.extend(jQuery.easing,{def:"easeOutQuad",swing:function(a,b,c,d,e){return jQuery.easing[jQuery.easing.def](a,b,c,d,e)},easeInQuad:function(a,b,c,d,e){return d*(b/=e)*b+c},easeOutQuad:function(a,b,c,d,e){return-d*(b/=e)*(b-2)+c},easeInOutQuad:function(a,b,c,d,e){if((b/=e/2)<1)return d/2*b*b+c;return-d/2*(--b*(b-2)-1)+c},easeInCubic:function(a,b,c,d,e){return d*(b/=e)*b*b+c},easeOutCubic:function(a,b,c,d,e){return d*((b=b/e-1)*b*b+1)+c},easeInOutCubic:function(a,b,c,d,e){if((b/=e/2)<1)return d/2*b*b*b+c;return d/2*((b-=2)*b*b+2)+c},easeInQuart:function(a,b,c,d,e){return d*(b/=e)*b*b*b+c},easeOutQuart:function(a,b,c,d,e){return-d*((b=b/e-1)*b*b*b-1)+c},easeInOutQuart:function(a,b,c,d,e){if((b/=e/2)<1)return d/2*b*b*b*b+c;return-d/2*((b-=2)*b*b*b-2)+c},easeInQuint:function(a,b,c,d,e){return d*(b/=e)*b*b*b*b+c},easeOutQuint:function(a,b,c,d,e){return d*((b=b/e-1)*b*b*b*b+1)+c},easeInOutQuint:function(a,b,c,d,e){if((b/=e/2)<1)return d/2*b*b*b*b*b+c;return d/2*((b-=2)*b*b*b*b+2)+c},easeInSine:function(a,b,c,d,e){return-d*Math.cos(b/e*(Math.PI/2))+d+c},easeOutSine:function(a,b,c,d,e){return d*Math.sin(b/e*(Math.PI/2))+c},easeInOutSine:function(a,b,c,d,e){return-d/2*(Math.cos(Math.PI*b/e)-1)+c},easeInExpo:function(a,b,c,d,e){return b==0?c:d*Math.pow(2,10*(b/e-1))+c},easeOutExpo:function(a,b,c,d,e){return b==e?c+d:d*(-Math.pow(2,-10*b/e)+1)+c},easeInOutExpo:function(a,b,c,d,e){if(b==0)return c;if(b==e)return c+d;if((b/=e/2)<1)return d/2*Math.pow(2,10*(b-1))+c;return d/2*(-Math.pow(2,-10*--b)+2)+c},easeInCirc:function(a,b,c,d,e){return-d*(Math.sqrt(1-(b/=e)*b)-1)+c},easeOutCirc:function(a,b,c,d,e){return d*Math.sqrt(1-(b=b/e-1)*b)+c},easeInOutCirc:function(a,b,c,d,e){if((b/=e/2)<1)return-d/2*(Math.sqrt(1-b*b)-1)+c;return d/2*(Math.sqrt(1-(b-=2)*b)+1)+c},easeInElastic:function(a,b,c,d,e){var f=1.70158;var g=0;var h=d;if(b==0)return c;if((b/=e)==1)return c+d;if(!g)g=e*.3;if(h<Math.abs(d)){h=d;var f=g/4}else var f=g/(2*Math.PI)*Math.asin(d/h);return-(h*Math.pow(2,10*(b-=1))*Math.sin((b*e-f)*2*Math.PI/g))+c},easeOutElastic:function(a,b,c,d,e){var f=1.70158;var g=0;var h=d;if(b==0)return c;if((b/=e)==1)return c+d;if(!g)g=e*.3;if(h<Math.abs(d)){h=d;var f=g/4}else var f=g/(2*Math.PI)*Math.asin(d/h);return h*Math.pow(2,-10*b)*Math.sin((b*e-f)*2*Math.PI/g)+d+c},easeInOutElastic:function(a,b,c,d,e){var f=1.70158;var g=0;var h=d;if(b==0)return c;if((b/=e/2)==2)return c+d;if(!g)g=e*.3*1.5;if(h<Math.abs(d)){h=d;var f=g/4}else var f=g/(2*Math.PI)*Math.asin(d/h);if(b<1)return-.5*h*Math.pow(2,10*(b-=1))*Math.sin((b*e-f)*2*Math.PI/g)+c;return h*Math.pow(2,-10*(b-=1))*Math.sin((b*e-f)*2*Math.PI/g)*.5+d+c},easeInBack:function(a,b,c,d,e,f){if(f==undefined)f=1.70158;return d*(b/=e)*b*((f+1)*b-f)+c},easeOutBack:function(a,b,c,d,e,f){if(f==undefined)f=1.70158;return d*((b=b/e-1)*b*((f+1)*b+f)+1)+c},easeInOutBack:function(a,b,c,d,e,f){if(f==undefined)f=1.70158;if((b/=e/2)<1)return d/2*b*b*(((f*=1.525)+1)*b-f)+c;return d/2*((b-=2)*b*(((f*=1.525)+1)*b+f)+2)+c},easeInBounce:function(a,b,c,d,e){return d-jQuery.easing.easeOutBounce(a,e-b,0,d,e)+c},easeOutBounce:function(a,b,c,d,e){if((b/=e)<1/2.75){return d*7.5625*b*b+c}else if(b<2/2.75){return d*(7.5625*(b-=1.5/2.75)*b+.75)+c}else if(b<2.5/2.75){return d*(7.5625*(b-=2.25/2.75)*b+.9375)+c}else{return d*(7.5625*(b-=2.625/2.75)*b+.984375)+c}},easeInOutBounce:function(a,b,c,d,e){if(b<e/2)return jQuery.easing.easeInBounce(a,b*2,0,d,e)*.5+c;return jQuery.easing.easeOutBounce(a,b*2-e,0,d,e)*.5+d*.5+c}})
|
||||
/*
|
||||
*
|
||||
* TERMS OF USE - EASING EQUATIONS
|
||||
*
|
||||
* Open source under the BSD License.
|
||||
*
|
||||
* Copyright © 2001 Robert Penner
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright notice, this list of
|
||||
* conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||
* provided with the distribution.
|
||||
*
|
||||
* Neither the name of the author nor the names of contributors may be used to endorse
|
||||
* or promote products derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
5
assets/js/jquery/jquery.min.js
vendored
Executable file
117
assets/js/jquery/jquery.mousewheel.js
Executable file
@ -0,0 +1,117 @@
|
||||
/*! Copyright (c) 2013 Brandon Aaron (http://brandonaaron.net)
|
||||
* Licensed under the MIT License (LICENSE.txt).
|
||||
*
|
||||
* Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers.
|
||||
* Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix.
|
||||
* Thanks to: Seamus Leahy for adding deltaX and deltaY
|
||||
*
|
||||
* Version: 3.1.3
|
||||
*
|
||||
* Requires: 1.2.2+
|
||||
*/
|
||||
|
||||
(function (factory) {
|
||||
if ( typeof define === 'function' && define.amd ) {
|
||||
// AMD. Register as an anonymous module.
|
||||
define(['jquery'], factory);
|
||||
} else if (typeof exports === 'object') {
|
||||
// Node/CommonJS style for Browserify
|
||||
module.exports = factory;
|
||||
} else {
|
||||
// Browser globals
|
||||
factory(jQuery);
|
||||
}
|
||||
}(function ($) {
|
||||
|
||||
var toFix = ['wheel', 'mousewheel', 'DOMMouseScroll', 'MozMousePixelScroll'];
|
||||
var toBind = 'onwheel' in document || document.documentMode >= 9 ? ['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll'];
|
||||
var lowestDelta, lowestDeltaXY;
|
||||
|
||||
if ( $.event.fixHooks ) {
|
||||
for ( var i = toFix.length; i; ) {
|
||||
$.event.fixHooks[ toFix[--i] ] = $.event.mouseHooks;
|
||||
}
|
||||
}
|
||||
|
||||
$.event.special.mousewheel = {
|
||||
setup: function() {
|
||||
if ( this.addEventListener ) {
|
||||
for ( var i = toBind.length; i; ) {
|
||||
this.addEventListener( toBind[--i], handler, false );
|
||||
}
|
||||
} else {
|
||||
this.onmousewheel = handler;
|
||||
}
|
||||
},
|
||||
|
||||
teardown: function() {
|
||||
if ( this.removeEventListener ) {
|
||||
for ( var i = toBind.length; i; ) {
|
||||
this.removeEventListener( toBind[--i], handler, false );
|
||||
}
|
||||
} else {
|
||||
this.onmousewheel = null;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
$.fn.extend({
|
||||
mousewheel: function(fn) {
|
||||
return fn ? this.bind("mousewheel", fn) : this.trigger("mousewheel");
|
||||
},
|
||||
|
||||
unmousewheel: function(fn) {
|
||||
return this.unbind("mousewheel", fn);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
function handler(event) {
|
||||
var orgEvent = event || window.event,
|
||||
args = [].slice.call(arguments, 1),
|
||||
delta = 0,
|
||||
deltaX = 0,
|
||||
deltaY = 0,
|
||||
absDelta = 0,
|
||||
absDeltaXY = 0,
|
||||
fn;
|
||||
event = $.event.fix(orgEvent);
|
||||
event.type = "mousewheel";
|
||||
|
||||
// Old school scrollwheel delta
|
||||
if ( orgEvent.wheelDelta ) { delta = orgEvent.wheelDelta; }
|
||||
if ( orgEvent.detail ) { delta = orgEvent.detail * -1; }
|
||||
|
||||
// New school wheel delta (wheel event)
|
||||
if ( orgEvent.deltaY ) {
|
||||
deltaY = orgEvent.deltaY * -1;
|
||||
delta = deltaY;
|
||||
}
|
||||
if ( orgEvent.deltaX ) {
|
||||
deltaX = orgEvent.deltaX;
|
||||
delta = deltaX * -1;
|
||||
}
|
||||
|
||||
// Webkit
|
||||
if ( orgEvent.wheelDeltaY !== undefined ) { deltaY = orgEvent.wheelDeltaY; }
|
||||
if ( orgEvent.wheelDeltaX !== undefined ) { deltaX = orgEvent.wheelDeltaX * -1; }
|
||||
|
||||
// Look for lowest delta to normalize the delta values
|
||||
absDelta = Math.abs(delta);
|
||||
if ( !lowestDelta || absDelta < lowestDelta ) { lowestDelta = absDelta; }
|
||||
absDeltaXY = Math.max(Math.abs(deltaY), Math.abs(deltaX));
|
||||
if ( !lowestDeltaXY || absDeltaXY < lowestDeltaXY ) { lowestDeltaXY = absDeltaXY; }
|
||||
|
||||
// Get a whole value for the deltas
|
||||
fn = delta > 0 ? 'floor' : 'ceil';
|
||||
delta = Math[fn](delta / lowestDelta);
|
||||
deltaX = Math[fn](deltaX / lowestDeltaXY);
|
||||
deltaY = Math[fn](deltaY / lowestDeltaXY);
|
||||
|
||||
// Add event and delta to the front of the arguments
|
||||
args.unshift(event, delta, deltaX, deltaY);
|
||||
|
||||
return ($.event.dispatch || $.event.handle).apply(this, args);
|
||||
}
|
||||
|
||||
}));
|
6
assets/js/jquery/jquery.widget.min.js
vendored
Executable file
1
assets/js/liste_smile.js
Normal file
7
assets/js/load-metro_2.js
Executable file
@ -0,0 +1,7 @@
|
||||
$(function(){
|
||||
if ((document.location.host.indexOf('.dev') > -1) || (document.location.host.indexOf('modernui') > -1) ) {
|
||||
$("<script/>").attr('src', 'js/metro/metro-loader.js').appendTo($('head'));
|
||||
} else {
|
||||
$("<script/>").attr('src', 'js/metro.min.js').appendTo($('head'));
|
||||
}
|
||||
})
|
0
assets/js/metro/README.md
Executable file
70
assets/js/metro/metro-accordion.js
Executable file
@ -0,0 +1,70 @@
|
||||
(function( $ ) {
|
||||
$.widget("metro.accordion", {
|
||||
|
||||
version: "1.0.0",
|
||||
|
||||
options: {
|
||||
closeAny: true,
|
||||
open: function(frame){},
|
||||
action: function(frame){}
|
||||
},
|
||||
|
||||
_frames: {},
|
||||
|
||||
_create: function(){
|
||||
var element = this.element;
|
||||
|
||||
if (element.data('closeany') != undefined) this.options.closeAny = element.data('closeany');
|
||||
|
||||
this._frames = element.children(".accordion-frame");
|
||||
|
||||
this.init();
|
||||
},
|
||||
|
||||
init: function(){
|
||||
var that = this;
|
||||
|
||||
this._frames.each(function(){
|
||||
var frame = this,
|
||||
a = $(this).children(".heading"),
|
||||
content = $(this).children(".content");
|
||||
|
||||
if ($(a).hasClass("active") && !$(a).attr('disabled') && $(a).data('action') != 'none') {
|
||||
$(content).show();
|
||||
$(a).removeClass("collapsed");
|
||||
} else {
|
||||
$(a).addClass("collapsed");
|
||||
}
|
||||
|
||||
a.on('click', function(e){
|
||||
e.preventDefault();
|
||||
if ($(this).attr('disabled') || $(this).data('action') == 'none') return;
|
||||
|
||||
if (that.options.closeAny) that._closeFrames();
|
||||
|
||||
if ($(content).is(":hidden")) {
|
||||
$(content).slideDown();
|
||||
$(this).removeClass("collapsed");
|
||||
that._trigger("frame", e, {frame: frame});
|
||||
that.options.open(frame);
|
||||
} else {
|
||||
$(content).slideUp();
|
||||
$(this).addClass("collapsed");
|
||||
}
|
||||
that.options.action(frame);
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
_closeFrames: function(){
|
||||
this._frames.children(".content").slideUp().parent().children('.heading').addClass("collapsed");
|
||||
},
|
||||
|
||||
_destroy: function(){},
|
||||
|
||||
_setOption: function(key, value){
|
||||
this._super('_setOption', key, value);
|
||||
}
|
||||
})
|
||||
})( jQuery );
|
||||
|
88
assets/js/metro/metro-button-set.js
Executable file
@ -0,0 +1,88 @@
|
||||
(function( $ ) {
|
||||
$.widget("metro.buttonset", {
|
||||
|
||||
version: "1.0.0",
|
||||
|
||||
options: {
|
||||
click: function(btn, on){}
|
||||
},
|
||||
|
||||
_buttons: {},
|
||||
|
||||
_create: function(){
|
||||
var element = this.element;
|
||||
|
||||
this._buttons = element.find("button, .button");
|
||||
|
||||
this.init();
|
||||
},
|
||||
|
||||
init: function(){
|
||||
var that = this;
|
||||
|
||||
this._buttons.each(function(){
|
||||
var btn = $(this);
|
||||
|
||||
btn.on('click', function(e){
|
||||
e.preventDefault();
|
||||
btn.toggleClass("active");
|
||||
|
||||
that.options.click(btn, btn.hasClass("active"));
|
||||
that._trigger("click", null, {button: btn, on: (btn.hasClass("active"))});
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
_destroy: function(){},
|
||||
|
||||
_setOption: function(key, value){
|
||||
this._super('_setOption', key, value);
|
||||
}
|
||||
})
|
||||
})( jQuery );
|
||||
|
||||
(function( $ ) {
|
||||
$.widget("metro.buttongroup", {
|
||||
|
||||
version: "1.0.0",
|
||||
|
||||
options: {
|
||||
click: function(btn, on){}
|
||||
},
|
||||
|
||||
_buttons: {},
|
||||
|
||||
_create: function(){
|
||||
var element = this.element;
|
||||
|
||||
this._buttons = element.find("button, .button");
|
||||
|
||||
this.init();
|
||||
},
|
||||
|
||||
init: function(){
|
||||
var that = this;
|
||||
|
||||
this._buttons.each(function(){
|
||||
var btn = $(this);
|
||||
|
||||
btn.on('click', function(e){
|
||||
e.preventDefault();
|
||||
that._buttons.removeClass("active");
|
||||
btn.addClass("active");
|
||||
|
||||
that.options.click(btn, btn.hasClass("active"));
|
||||
that._trigger("click", null, {button: btn, on: (btn.hasClass("active"))});
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
_destroy: function(){},
|
||||
|
||||
_setOption: function(key, value){
|
||||
this._super('_setOption', key, value);
|
||||
}
|
||||
})
|
||||
})( jQuery );
|
||||
|
||||
|
437
assets/js/metro/metro-calendar.js
Executable file
@ -0,0 +1,437 @@
|
||||
// Calendar
|
||||
|
||||
(function( $ ) {
|
||||
$.widget("metro.calendar", {
|
||||
|
||||
version: "1.0.0",
|
||||
|
||||
options: {
|
||||
format: "yyyy-mm-dd",
|
||||
multiSelect: false,
|
||||
startMode: 'day', //year, month, day
|
||||
weekStart: (METRO_WEEK_START != undefined ? METRO_WEEK_START : 0), // 0 - Sunday, 1 - Monday
|
||||
otherDays: false,
|
||||
date: new Date(),
|
||||
buttons: true,
|
||||
locale: $.Metro.currentLocale,
|
||||
getDates: function(d){},
|
||||
click: function(d, d0){},
|
||||
_storage: []
|
||||
},
|
||||
|
||||
_year: 0,
|
||||
_month: 0,
|
||||
_day: 0,
|
||||
_today: new Date(),
|
||||
_event: '',
|
||||
|
||||
_mode: 'day', // day, month, year
|
||||
_distance: 0,
|
||||
|
||||
_events: [],
|
||||
|
||||
_create: function(){
|
||||
var element = this.element;
|
||||
|
||||
if (element.data('multiSelect') != undefined) this.options.multiSelect = element.data("multiSelect");
|
||||
if (element.data('format') != undefined) this.options.format = element.data("format");
|
||||
if (element.data('date') != undefined) this.options.date = new Date(element.data("date"));
|
||||
if (element.data('locale') != undefined) this.options.locale = element.data("locale");
|
||||
if (element.data('startMode') != undefined) this.options.startMode = element.data('startMode');
|
||||
if (element.data('weekStart') != undefined) this.options.weekStart = element.data('weekStart');
|
||||
if (element.data('otherDays') != undefined) this.options.otherDays = element.data('otherDays');
|
||||
|
||||
this._year = this.options.date.getFullYear();
|
||||
this._distance = parseInt(this.options.date.getFullYear())-4;
|
||||
this._month = this.options.date.getMonth();
|
||||
this._day = this.options.date.getDate();
|
||||
this._mode = this.options.startMode;
|
||||
|
||||
element.data("_storage", []);
|
||||
|
||||
this._renderCalendar();
|
||||
},
|
||||
|
||||
_renderMonth: function(){
|
||||
var year = this._year,
|
||||
month = this._month,
|
||||
day = this._day,
|
||||
event = this._event,
|
||||
feb = 28;
|
||||
|
||||
if (month == 1) {
|
||||
if ((year%100!=0) && (year%4==0) || (year%400==0)) {
|
||||
feb = 29;
|
||||
}
|
||||
}
|
||||
|
||||
var totalDays = ["31", ""+feb+"","31","30","31","30","31","31","30","31","30","31"];
|
||||
var daysInMonth = totalDays[month];
|
||||
var first_week_day = new Date(year, month, 1).getDay();
|
||||
|
||||
var table, tr, td, i;
|
||||
|
||||
this.element.html("");
|
||||
|
||||
table = $("<table/>").addClass("bordered");
|
||||
|
||||
// Add calendar header
|
||||
tr = $("<tr/>");
|
||||
|
||||
$("<td/>").addClass("text-center").html("<a class='btn-previous-year' href='#'><i class='icon-previous'></i></a>").appendTo(tr);
|
||||
$("<td/>").addClass("text-center").html("<a class='btn-previous-month' href='#'><i class='icon-arrow-left-4'></i></a>").appendTo(tr);
|
||||
|
||||
$("<td/>").attr("colspan", 3).addClass("text-center").html("<a class='btn-select-month' href='#'>"+ $.Metro.Locale[this.options.locale].months[month]+' '+year+"</a>").appendTo(tr);
|
||||
|
||||
$("<td/>").addClass("text-center").html("<a class='btn-next-month' href='#'><i class='icon-arrow-right-4'></i></a>").appendTo(tr);
|
||||
$("<td/>").addClass("text-center").html("<a class='btn-next-year' href='#'><i class='icon-next'></i></a>").appendTo(tr);
|
||||
|
||||
tr.addClass("calendar-header").appendTo(table);
|
||||
|
||||
// Add day names
|
||||
var j;
|
||||
tr = $("<tr/>");
|
||||
for(i = 0; i < 7; i++) {
|
||||
if (!this.options.weekStart)
|
||||
td = $("<td/>").addClass("text-center day-of-week").html($.Metro.Locale[this.options.locale].days[i+7]).appendTo(tr);
|
||||
else {
|
||||
j = i + 1;
|
||||
if (j == 7) j = 0;
|
||||
td = $("<td/>").addClass("text-center day-of-week").html($.Metro.Locale[this.options.locale].days[j+7]).appendTo(tr);
|
||||
|
||||
}
|
||||
}
|
||||
tr.addClass("calendar-subheader").appendTo(table);
|
||||
|
||||
// Add empty days for previos month
|
||||
var prevMonth = this._month - 1; if (prevMonth < 0) prevMonth = 11; var daysInPrevMonth = totalDays[prevMonth];
|
||||
var _first_week_day = ((this.options.weekStart) ? first_week_day + 6 : first_week_day)%7;
|
||||
var htmlPrevDay = "";
|
||||
tr = $("<tr/>");
|
||||
for(i = 0; i < _first_week_day; i++) {
|
||||
if (this.options.otherDays) htmlPrevDay = daysInPrevMonth - (_first_week_day - i - 1);
|
||||
td = $("<td/>").addClass("empty").html("<small class='other-day'>"+htmlPrevDay+"</small>").appendTo(tr);
|
||||
}
|
||||
|
||||
var week_day = ((this.options.weekStart) ? first_week_day + 6 : first_week_day)%7;
|
||||
//console.log(week_day, week_day%7);
|
||||
|
||||
for (i = 1; i <= daysInMonth; i++) {
|
||||
//console.log(week_day, week_day%7);
|
||||
|
||||
week_day %= 7;
|
||||
|
||||
if (week_day == 0) {
|
||||
tr.appendTo(table);
|
||||
tr = $("<tr/>");
|
||||
}
|
||||
|
||||
td = $("<td/>").addClass("text-center day").html("<a href='#'>"+i+"</a>");
|
||||
if (year == this._today.getFullYear() && month == this._today.getMonth() && this._today.getDate() == i) {
|
||||
td.addClass("today");
|
||||
}
|
||||
|
||||
var d = (new Date(this._year, this._month, i)).format('yyyy-mm-dd');
|
||||
if (this.element.data('_storage').indexOf(d)>=0) {
|
||||
td.find("a").addClass("selected");
|
||||
}
|
||||
|
||||
td.appendTo(tr);
|
||||
week_day++;
|
||||
}
|
||||
|
||||
// next month other days
|
||||
var htmlOtherDays = "";
|
||||
for (i = week_day+1; i<=7; i++){
|
||||
if (this.options.otherDays) htmlOtherDays = i - week_day;
|
||||
td = $("<td/>").addClass("empty").html("<small class='other-day'>"+htmlOtherDays+"</small>").appendTo(tr);
|
||||
}
|
||||
|
||||
tr.appendTo(table);
|
||||
|
||||
if (this.options.buttons) {
|
||||
tr = $("<tr/>").addClass("calendar-actions");
|
||||
td = $("<td/>").attr('colspan', 7).addClass("text-left").html("" +
|
||||
"<button class='button calendar-btn-today small success'>"+$.Metro.Locale[this.options.locale].buttons[0]+
|
||||
"</button> <button class='button calendar-btn-clear small warning'>"+$.Metro.Locale[this.options.locale].buttons[1]+"</button>");
|
||||
td.appendTo(tr);
|
||||
tr.appendTo(table);
|
||||
}
|
||||
|
||||
table.appendTo(this.element);
|
||||
|
||||
this.options.getDates(this.element.data('_storage'));
|
||||
},
|
||||
|
||||
_renderMonths: function(){
|
||||
var table, tr, td, i, j;
|
||||
|
||||
this.element.html("");
|
||||
|
||||
table = $("<table/>").addClass("bordered");
|
||||
|
||||
// Add calendar header
|
||||
tr = $("<tr/>");
|
||||
|
||||
$("<td/>").addClass("text-center").html("<a class='btn-previous-year' href='#'><i class='icon-arrow-left-4'></i></a>").appendTo(tr);
|
||||
$("<td/>").attr("colspan", 2).addClass("text-center").html("<a class='btn-select-year' href='#'>"+this._year+"</a>").appendTo(tr);
|
||||
$("<td/>").addClass("text-center").html("<a class='btn-next-year' href='#'><i class='icon-arrow-right-4'></i></a>").appendTo(tr);
|
||||
|
||||
tr.addClass("calendar-header").appendTo(table);
|
||||
|
||||
tr = $("<tr/>");
|
||||
j = 0;
|
||||
for (i=0;i<12;i++) {
|
||||
|
||||
//td = $("<td/>").addClass("text-center month").html("<a href='#' data-month='"+i+"'>"+this.options.monthsShort[i]+"</a>");
|
||||
td = $("<td/>").addClass("text-center month").html("<a href='#' data-month='"+i+"'>"+$.Metro.Locale[this.options.locale].months[i+12]+"</a>");
|
||||
|
||||
if (this._month == i && (new Date()).getFullYear() == this._year) {
|
||||
td.addClass("today");
|
||||
}
|
||||
|
||||
td.appendTo(tr);
|
||||
if ((j+1) % 4 == 0) {
|
||||
tr.appendTo(table);
|
||||
tr = $("<tr/>");
|
||||
}
|
||||
j+=1;
|
||||
}
|
||||
|
||||
table.appendTo(this.element);
|
||||
},
|
||||
|
||||
_renderYears: function(){
|
||||
var table, tr, td, i, j;
|
||||
|
||||
this.element.html("");
|
||||
|
||||
table = $("<table/>").addClass("bordered");
|
||||
|
||||
// Add calendar header
|
||||
tr = $("<tr/>");
|
||||
|
||||
$("<td/>").addClass("text-center").html("<a class='btn-previous-year' href='#'><i class='icon-arrow-left-4'></i></a>").appendTo(tr);
|
||||
$("<td/>").attr("colspan", 2).addClass("text-center").html( (this._distance)+"-"+(this._distance+11) ).appendTo(tr);
|
||||
$("<td/>").addClass("text-center").html("<a class='btn-next-year' href='#'><i class='icon-arrow-right-4'></i></a>").appendTo(tr);
|
||||
|
||||
tr.addClass("calendar-header").appendTo(table);
|
||||
|
||||
tr = $("<tr/>");
|
||||
|
||||
j = 0;
|
||||
for (i=this._distance;i<this._distance+12;i++) {
|
||||
td = $("<td/>").addClass("text-center year").html("<a href='#' data-year='"+i+"'>"+i+"</a>");
|
||||
if ((new Date()).getFullYear() == i) {
|
||||
td.addClass("today");
|
||||
}
|
||||
td.appendTo(tr);
|
||||
if ((j+1) % 4 == 0) {
|
||||
tr.appendTo(table);
|
||||
tr = $("<tr/>");
|
||||
}
|
||||
j+=1;
|
||||
}
|
||||
|
||||
table.appendTo(this.element);
|
||||
},
|
||||
|
||||
_renderCalendar: function(){
|
||||
switch (this._mode) {
|
||||
case 'year': this._renderYears(); break;
|
||||
case 'month': this._renderMonths(); break;
|
||||
default: this._renderMonth();
|
||||
}
|
||||
this._initButtons();
|
||||
},
|
||||
|
||||
_initButtons: function(){
|
||||
// Add actions
|
||||
var that = this, table = this.element.find('table');
|
||||
|
||||
if (this._mode == 'day') {
|
||||
table.find('.btn-select-month').on('click', function(e){
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
that._mode = 'month';
|
||||
that._renderCalendar();
|
||||
});
|
||||
table.find('.btn-previous-month').on('click', function(e){
|
||||
that._event = 'eventPrevious';
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
that._month -= 1;
|
||||
if (that._month < 0) {
|
||||
that._year -= 1;
|
||||
that._month = 11;
|
||||
}
|
||||
that._renderCalendar();
|
||||
});
|
||||
table.find('.btn-next-month').on('click', function(e){
|
||||
that._event = 'eventNext';
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
that._month += 1;
|
||||
if (that._month == 12) {
|
||||
that._year += 1;
|
||||
that._month = 0;
|
||||
}
|
||||
that._renderCalendar();
|
||||
});
|
||||
table.find('.btn-previous-year').on('click', function(e){
|
||||
that._event = 'eventPrevious';
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
that._year -= 1;
|
||||
that._renderCalendar();
|
||||
});
|
||||
table.find('.btn-next-year').on('click', function(e){
|
||||
that._event = 'eventNext';
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
that._year += 1;
|
||||
that._renderCalendar();
|
||||
});
|
||||
table.find('.calendar-btn-today').on('click', function(e){
|
||||
that._event = 'eventNext';
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
that.options.date = new Date();
|
||||
that._year = that.options.date.getFullYear();
|
||||
that._month = that.options.date.getMonth();
|
||||
that._day = that.options.date.getDate();
|
||||
that._renderCalendar();
|
||||
});
|
||||
table.find('.calendar-btn-clear').on('click', function(e){
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
that.options.date = new Date();
|
||||
that._year = that.options.date.getFullYear();
|
||||
that._month = that.options.date.getMonth();
|
||||
that._day = that.options.date.getDate();
|
||||
that.element.data('_storage', []);
|
||||
that._renderCalendar();
|
||||
});
|
||||
table.find('.day a').on('click', function(e){
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
var d = (new Date(that._year, that._month, parseInt($(this).html()))).format(that.options.format,null);
|
||||
var d0 = (new Date(that._year, that._month, parseInt($(this).html())));
|
||||
|
||||
if (that.options.multiSelect) {
|
||||
$(this).toggleClass("selected");
|
||||
|
||||
if ($(this).hasClass("selected")) {
|
||||
that._addDate(d);
|
||||
} else {
|
||||
that._removeDate(d);
|
||||
}
|
||||
} else {
|
||||
table.find('.day a').removeClass('selected');
|
||||
$(this).addClass("selected");
|
||||
that.element.data('_storage', []);
|
||||
that._addDate(d);
|
||||
}
|
||||
that.options.getDates(that.element.data('_storage'));
|
||||
that.options.click(d, d0);
|
||||
});
|
||||
} else if (this._mode == 'month') {
|
||||
table.find('.month a').on('click', function(e){
|
||||
that._event = 'eventNext';
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
that._month = parseInt($(this).data('month'));
|
||||
that._mode = 'day';
|
||||
that._renderCalendar();
|
||||
});
|
||||
table.find('.btn-previous-year').on('click', function(e){
|
||||
that._event = 'eventPrevious';
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
that._year -= 1;
|
||||
that._renderCalendar();
|
||||
});
|
||||
table.find('.btn-next-year').on('click', function(e){
|
||||
that._event = 'eventNext';
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
that._year += 1;
|
||||
that._renderCalendar();
|
||||
});
|
||||
table.find('.btn-select-year').on('click', function(e){
|
||||
that._event = 'eventNext';
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
that._mode = 'year';
|
||||
that._renderCalendar();
|
||||
});
|
||||
} else {
|
||||
table.find('.year a').on('click', function(e){
|
||||
that._event = 'eventNext';
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
that._year = parseInt($(this).data('year'));
|
||||
that._mode = 'month';
|
||||
that._renderCalendar();
|
||||
});
|
||||
table.find('.btn-previous-year').on('click', function(e){
|
||||
that._event = 'eventPrevious';
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
that._distance -= 10;
|
||||
that._renderCalendar();
|
||||
});
|
||||
table.find('.btn-next-year').on('click', function(e){
|
||||
that._event = 'eventNext';
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
that._distance += 10;
|
||||
that._renderCalendar();
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
_addDate: function(d){
|
||||
var index = this.element.data('_storage').indexOf(d);
|
||||
if (index < 0) this.element.data('_storage').push(d);
|
||||
},
|
||||
|
||||
_removeDate: function(d){
|
||||
var index = this.element.data('_storage').indexOf(d);
|
||||
this.element.data('_storage').splice(index, 1);
|
||||
},
|
||||
|
||||
setDate: function(d){
|
||||
var r;
|
||||
d = new Date(d);
|
||||
r = (new Date(d.getFullYear()+"/"+ (d.getMonth()+1)+"/"+ d.getDate())).format('yyyy-mm-dd');
|
||||
this._addDate(r);
|
||||
this._renderCalendar();
|
||||
},
|
||||
|
||||
getDate: function(index){
|
||||
return new Date(index != undefined ? this.element.data('_storage')[index] : this.element.data('_storage')[0]).format(this.options.format);
|
||||
},
|
||||
|
||||
getDates: function(){
|
||||
return this.element.data('_storage');
|
||||
},
|
||||
|
||||
unsetDate: function(d){
|
||||
var r;
|
||||
d = new Date(d);
|
||||
r = (new Date(d.getFullYear()+"-"+ (d.getMonth()+1)+"-"+ d.getDate())).format('yyyy-mm-dd');
|
||||
this._removeDate(r);
|
||||
this._renderCalendar();
|
||||
},
|
||||
|
||||
_destroy: function(){},
|
||||
|
||||
_setOption: function(key, value){
|
||||
this._super('_setOption', key, value);
|
||||
}
|
||||
})
|
||||
})( jQuery );
|
||||
|
||||
|
||||
|
304
assets/js/metro/metro-carousel.js
Executable file
@ -0,0 +1,304 @@
|
||||
(function( $ ) {
|
||||
$.widget("metro.carousel", {
|
||||
|
||||
version: "1.0.0",
|
||||
|
||||
options: {
|
||||
auto: true,
|
||||
period: 2000,
|
||||
duration: 500,
|
||||
effect: 'slowdown', // slide, fade, switch, slowdown
|
||||
direction: 'left',
|
||||
markers: {
|
||||
show: true,
|
||||
type: 'default',
|
||||
position: 'left' //bottom-left, bottom-right, bottom-center, top-left, top-right, top-center
|
||||
},
|
||||
controls: true,
|
||||
stop: true,
|
||||
width: '100%',
|
||||
height: 300
|
||||
},
|
||||
|
||||
_slides: {},
|
||||
_currentIndex: 0,
|
||||
_interval: 0,
|
||||
_outPosition: 0,
|
||||
|
||||
_create: function(){
|
||||
var that = this, o = this.options,
|
||||
element = carousel = this.element,
|
||||
controls = carousel.find('.controls');
|
||||
|
||||
if (element.data('auto') != undefined) o.auto = element.data('auto');
|
||||
if (element.data('period') != undefined) o.period = element.data('period');
|
||||
if (element.data('duration') != undefined) o.duration = element.data('duration');
|
||||
if (element.data('effect') != undefined) o.effect = element.data('effect');
|
||||
if (element.data('direction') != undefined) o.direction = element.data('direction');
|
||||
if (element.data('width') != undefined) o.width = element.data('width');
|
||||
if (element.data('height') != undefined) o.height = element.data('height');
|
||||
if (element.data('stop') != undefined) o.stop = element.data('stop');
|
||||
if (element.data('controls') != undefined) o.controls = element.data('controls');
|
||||
if (element.data('markersShow') != undefined) o.markers.show = element.data('markersShow');
|
||||
if (element.data('markersType') != undefined) o.markers.type = element.data('markersType');
|
||||
if (element.data('markersPosition') != undefined) o.markers.position = element.data('markersPosition');
|
||||
|
||||
carousel.css({
|
||||
'width': this.options.width,
|
||||
'height': this.options.height
|
||||
});
|
||||
|
||||
this._slides = carousel.find('.slide');
|
||||
|
||||
if (this._slides.length <= 1) return;
|
||||
|
||||
if (this.options.markers !== false && this.options.markers.show && this._slides.length > 1) {
|
||||
this._markers(that);
|
||||
}
|
||||
|
||||
if (this.options.controls && this._slides.length > 1) {
|
||||
carousel.find('.controls.left').on('click', function(){
|
||||
that._slideTo('prior');
|
||||
});
|
||||
carousel.find('.controls.right').on('click', function(){
|
||||
that._slideTo('next');
|
||||
});
|
||||
} else {
|
||||
controls.hide();
|
||||
}
|
||||
|
||||
if (this.options.stop) {
|
||||
carousel
|
||||
.on('mouseenter', function(){
|
||||
clearInterval(that._interval);
|
||||
})
|
||||
.on('mouseleave', function(){
|
||||
if (that.options.auto) that._autoStart(), that.options.period;
|
||||
})
|
||||
}
|
||||
|
||||
if (this.options.auto) {
|
||||
this._autoStart();
|
||||
}
|
||||
},
|
||||
|
||||
_autoStart: function(){
|
||||
var that = this;
|
||||
this._interval = setInterval(function(){
|
||||
if (that.options.direction == 'left') {
|
||||
that._slideTo('next')
|
||||
} else {
|
||||
that._slideTo('prior')
|
||||
}
|
||||
}, this.options.period);
|
||||
},
|
||||
|
||||
_slideTo: function(direction){
|
||||
var
|
||||
currentSlide = this._slides[this._currentIndex],
|
||||
nextSlide;
|
||||
|
||||
if (direction == undefined) direction = 'next';
|
||||
|
||||
if (direction === 'prior') {
|
||||
this._currentIndex -= 1;
|
||||
if (this._currentIndex < 0) this._currentIndex = this._slides.length - 1;
|
||||
|
||||
this._outPosition = this.element.width();
|
||||
|
||||
} else if (direction === 'next') {
|
||||
this._currentIndex += 1;
|
||||
if (this._currentIndex >= this._slides.length) this._currentIndex = 0;
|
||||
|
||||
this._outPosition = -this.element.width();
|
||||
|
||||
}
|
||||
|
||||
nextSlide = this._slides[this._currentIndex];
|
||||
|
||||
switch (this.options.effect) {
|
||||
case 'switch': this._effectSwitch(currentSlide, nextSlide); break;
|
||||
case 'slowdown': this._effectSlowdown(currentSlide, nextSlide, this.options.duration); break;
|
||||
case 'fade': this._effectFade(currentSlide, nextSlide, this.options.duration); break;
|
||||
default: this._effectSlide(currentSlide, nextSlide, this.options.duration);
|
||||
}
|
||||
|
||||
var carousel = this.element, that = this;
|
||||
carousel.find('.markers ul li a').each(function(){
|
||||
var index = $(this).data('num');
|
||||
if (index === that._currentIndex) {
|
||||
$(this).parent().addClass('active');
|
||||
} else {
|
||||
$(this).parent().removeClass('active');
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
_slideToSlide: function(slideIndex){
|
||||
var
|
||||
currentSlide = this._slides[this._currentIndex],
|
||||
nextSlide = this._slides[slideIndex];
|
||||
|
||||
if (slideIndex > this._currentIndex) {
|
||||
this._outPosition = -this.element.width();
|
||||
} else {
|
||||
this._outPosition = this.element.width();
|
||||
}
|
||||
|
||||
switch (this.options.effect) {
|
||||
case 'switch' : this._effectSwitch(currentSlide, nextSlide); break;
|
||||
case 'slowdown': this._effectSlowdown(currentSlide, nextSlide, this.options.duration); break;
|
||||
case 'fade': this._effectFade(currentSlide, nextSlide, this.options.duration); break;
|
||||
default : this._effectSlide(currentSlide, nextSlide, this.options.duration);
|
||||
}
|
||||
|
||||
this._currentIndex = slideIndex;
|
||||
},
|
||||
|
||||
_markers: function (that) {
|
||||
var div, ul, li, i, markers;
|
||||
|
||||
div = $('<div class="markers '+this.options.markers.type+'" />');
|
||||
ul = $('<ul></ul>').appendTo(div);
|
||||
|
||||
for (i = 0; i < this._slides.length; i++) {
|
||||
li = $('<li><a href="javascript:void(0)" data-num="' + i + '"></a></li>');
|
||||
if (i === 0) {
|
||||
li.addClass('active');
|
||||
}
|
||||
li.appendTo(ul);
|
||||
}
|
||||
|
||||
|
||||
ul.find('li a').removeClass('active').on('click', function () {
|
||||
var $this = $(this),
|
||||
index = $this.data('num');
|
||||
|
||||
ul.find('li').removeClass('active');
|
||||
$this.parent().addClass('active');
|
||||
|
||||
if (index == that._currentIndex) {
|
||||
return true;
|
||||
}
|
||||
|
||||
that._slideToSlide(index);
|
||||
return true;
|
||||
});
|
||||
|
||||
div.appendTo(this.element);
|
||||
|
||||
switch (this.options.markers.position) {
|
||||
case 'top-left' : {
|
||||
div.css({
|
||||
left: '10px',
|
||||
right: 'auto',
|
||||
bottom: 'auto',
|
||||
top: '10px'
|
||||
});
|
||||
break;
|
||||
}
|
||||
case 'top-right' : {
|
||||
div.css({
|
||||
left: 'auto',
|
||||
right: '10px',
|
||||
bottom: 'auto',
|
||||
top: '0px'
|
||||
});
|
||||
break;
|
||||
}
|
||||
case 'top-center' : {
|
||||
div.css({
|
||||
left: this.element.width()/2 - div.width()/2,
|
||||
right: 'auto',
|
||||
bottom: 'auto',
|
||||
top: '0px'
|
||||
});
|
||||
break;
|
||||
}
|
||||
case 'bottom-left' : {
|
||||
div.css({
|
||||
left: '10px',
|
||||
right: 'auto'
|
||||
});
|
||||
break;
|
||||
}
|
||||
case 'bottom-right' : {
|
||||
div.css({
|
||||
right: '10px',
|
||||
left: 'auto'
|
||||
});
|
||||
break;
|
||||
}
|
||||
case 'bottom-center' : {
|
||||
div.css({
|
||||
left: this.element.width()/2 - div.width()/2,
|
||||
right: 'auto'
|
||||
});
|
||||
break;
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
_effectSwitch: function(currentSlide, nextSlide){
|
||||
$(currentSlide)
|
||||
.hide();
|
||||
$(nextSlide)
|
||||
.css({left: 0})
|
||||
.show();
|
||||
},
|
||||
|
||||
_effectSlide: function(currentSlide, nextSlide, duration){
|
||||
$(currentSlide)
|
||||
.animate({left: this._outPosition}, duration);
|
||||
$(nextSlide)
|
||||
.css('left', this._outPosition * -1)
|
||||
.show()
|
||||
.animate({left: 0}, duration);
|
||||
},
|
||||
|
||||
_effectSlowdown: function(currentSlide, nextSlide, duration){
|
||||
var options = {
|
||||
'duration': duration,
|
||||
'easing': 'doubleSqrt'
|
||||
};
|
||||
$.easing.doubleSqrt = function(t) {
|
||||
return Math.sqrt(Math.sqrt(t));
|
||||
};
|
||||
|
||||
$(currentSlide)
|
||||
.animate({left: this._outPosition}, options);
|
||||
|
||||
|
||||
//$(nextSlide).find('.subslide').hide();
|
||||
$(nextSlide)
|
||||
.css('left', this._outPosition * -1)
|
||||
.show()
|
||||
.animate({left: 0}, options);
|
||||
|
||||
//setTimeout(function(){
|
||||
// $(nextSlide).find('.subslide').fadeIn();
|
||||
//}, 500);
|
||||
|
||||
},
|
||||
|
||||
_effectFade: function(currentSlide, nextSlide, duration){
|
||||
$(currentSlide)
|
||||
.fadeOut(duration);
|
||||
$(nextSlide)
|
||||
.css({left: 0})
|
||||
.fadeIn(duration);
|
||||
},
|
||||
|
||||
|
||||
_destroy: function(){
|
||||
|
||||
},
|
||||
|
||||
_setOption: function(key, value){
|
||||
this._super('_setOption', key, value);
|
||||
}
|
||||
});
|
||||
})( jQuery );
|
||||
|
||||
|
39
assets/js/metro/metro-core.js
Executable file
@ -0,0 +1,39 @@
|
||||
|
||||
(function($){
|
||||
$.Metro = function(params){
|
||||
params = $.extend({
|
||||
}, params);
|
||||
};
|
||||
|
||||
$.Metro.getDeviceSize = function(){
|
||||
var device_width = (window.innerWidth > 0) ? window.innerWidth : screen.width;
|
||||
var device_height = (window.innerHeight > 0) ? window.innerHeight : screen.height;
|
||||
return {
|
||||
width: device_width,
|
||||
height: device_height
|
||||
}
|
||||
}
|
||||
|
||||
})(jQuery);
|
||||
|
||||
$(function(){
|
||||
$('html').on('click', function(e){
|
||||
$('.dropdown-menu').each(function(i, el){
|
||||
if (!$(el).hasClass('keep-open') && $(el).css('display')=='block') {
|
||||
$(el).hide();
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
$(function(){
|
||||
$(window).on('resize', function(){
|
||||
if (METRO_DIALOG) {
|
||||
var top = ($(window).height() - METRO_DIALOG.outerHeight()) / 2;
|
||||
var left = ($(window).width() - METRO_DIALOG.outerWidth()) / 2;
|
||||
METRO_DIALOG.css({
|
||||
top: top, left: left
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
200
assets/js/metro/metro-countdown.js
Executable file
@ -0,0 +1,200 @@
|
||||
(function( $ ) {
|
||||
$.widget("metro.countdown", {
|
||||
|
||||
version: "1.0.0",
|
||||
|
||||
options: {
|
||||
style: {
|
||||
background: "bg-dark",
|
||||
foreground: "fg-white",
|
||||
divider: "fg-dark"
|
||||
},
|
||||
blink: true,
|
||||
days: 1,
|
||||
stoptimer: 0,
|
||||
ontick: function(d, h, m, s){},
|
||||
onstop: function(){}
|
||||
},
|
||||
|
||||
wrappers: {},
|
||||
|
||||
_interval: 0,
|
||||
|
||||
_create: function(){
|
||||
var that = this, countdown = this.element;
|
||||
|
||||
$.each(['Days','Hours','Minutes','Seconds'],function(){
|
||||
$('<span class="count'+this+'">').html(
|
||||
'<span class="digit-wrapper">\
|
||||
<span class="digit">0</span>\
|
||||
</span>\
|
||||
<span class="digit-wrapper">\
|
||||
<span class="digit">0</span>\
|
||||
</span>'
|
||||
).appendTo(countdown);
|
||||
|
||||
if(this!="Seconds"){
|
||||
countdown.append('<span class="divider"></span>');
|
||||
}
|
||||
});
|
||||
|
||||
this.wrappers = this.element.find('.digit-wrapper');
|
||||
|
||||
if (countdown.data('blink') != undefined) {
|
||||
this.options.blink = countdown.data('blick');
|
||||
}
|
||||
|
||||
if (countdown.data('styleBackground') != undefined) {
|
||||
this.options.style.background = countdown.data('styleBackground');
|
||||
}
|
||||
|
||||
if (countdown.data('styleForeground') != undefined) {
|
||||
this.options.style.foreground = countdown.data('styleForeground');
|
||||
}
|
||||
|
||||
if (countdown.data('styleDivider') != undefined) {
|
||||
this.options.style.divider = countdown.data('styleDivider');
|
||||
}
|
||||
|
||||
if (this.options.style.background != "default") {
|
||||
this.element.find(".digit").addClass(this.options.style.background);
|
||||
}
|
||||
|
||||
if (this.options.style.foreground != "default") {
|
||||
this.element.find(".digit").addClass(this.options.style.foreground);
|
||||
}
|
||||
|
||||
if (this.options.style.divider != "default") {
|
||||
this.element.find(".divider").addClass(this.options.style.divider);
|
||||
}
|
||||
|
||||
if (countdown.data('stoptimer') != undefined) {
|
||||
this.options.stoptimer = new Date(countdown.data('stoptimer'));
|
||||
}
|
||||
|
||||
if (this.options.stoptimer == 0) {
|
||||
this.options.stoptimer = (new Date()).getTime() + this.options.days*24*60*60*1000;
|
||||
}
|
||||
|
||||
setTimeout( function(){
|
||||
that.tick()
|
||||
}, 1000);
|
||||
},
|
||||
|
||||
_destroy: function(){
|
||||
|
||||
},
|
||||
|
||||
_setOption: function(key, value){
|
||||
this._super('_setOption', key, value);
|
||||
},
|
||||
|
||||
tick: function(){
|
||||
var that = this;
|
||||
|
||||
this._interval = setInterval(function(){
|
||||
var days = 24*60*60,
|
||||
hours = 60*60,
|
||||
minutes = 60;
|
||||
|
||||
var left, d, h, m, s;
|
||||
|
||||
left = Math.floor((that.options.stoptimer - (new Date())) / 1000);
|
||||
|
||||
if(left < 0){
|
||||
left = 0;
|
||||
}
|
||||
|
||||
// Number of days left
|
||||
d = Math.floor(left / days);
|
||||
that.updateDuo(0, 1, d);
|
||||
left -= d*days;
|
||||
|
||||
// Number of hours left
|
||||
h = Math.floor(left / hours);
|
||||
that.updateDuo(2, 3, h);
|
||||
left -= h*hours;
|
||||
|
||||
// Number of minutes left
|
||||
m = Math.floor(left / minutes);
|
||||
that.updateDuo(4, 5, m);
|
||||
left -= m*minutes;
|
||||
|
||||
// Number of seconds left
|
||||
s = left;
|
||||
that.updateDuo(6, 7, s);
|
||||
|
||||
// Calling an optional user supplied ontick
|
||||
that.options.ontick(d, h, m, s);
|
||||
|
||||
that.blinkDivider();
|
||||
|
||||
// Scheduling another call of this function in 1s
|
||||
if (d === 0 && h === 0 && m === 0 && s === 0) {
|
||||
that.options.onstop();
|
||||
that.stopDigit();
|
||||
that._trigger('alarm');
|
||||
clearInterval(that._interval);
|
||||
}
|
||||
}, 1000);
|
||||
},
|
||||
|
||||
blinkDivider: function(){
|
||||
if (this.options.blink)
|
||||
this.element.find(".divider").toggleClass("no-visible");
|
||||
},
|
||||
|
||||
stopDigit: function(){
|
||||
this.wrappers.each(function(){
|
||||
$(this).children(".digit").addClass("stop");
|
||||
})
|
||||
},
|
||||
|
||||
updateDuo: function(minor, major, value){
|
||||
this.switchDigit(this.wrappers.eq(minor),Math.floor(value/10)%10);
|
||||
this.switchDigit(this.wrappers.eq(major),value%10);
|
||||
},
|
||||
|
||||
switchDigit: function(wrapper, number){
|
||||
var digit = wrapper.find('.digit');
|
||||
|
||||
if(digit.is(':animated')){
|
||||
return false;
|
||||
}
|
||||
|
||||
if(wrapper.data('digit') == number){
|
||||
// We are already showing this number
|
||||
return false;
|
||||
}
|
||||
|
||||
wrapper.data('digit', number);
|
||||
|
||||
var replacement = $('<span>',{
|
||||
'class':'digit',
|
||||
css:{
|
||||
top:'-2.1em',
|
||||
opacity:0
|
||||
},
|
||||
html:number
|
||||
});
|
||||
|
||||
replacement.addClass(this.options.style.background);
|
||||
replacement.addClass(this.options.style.foreground);
|
||||
|
||||
digit
|
||||
.before(replacement)
|
||||
.removeClass('static')
|
||||
.animate({top:'2.5em'},'fast',function(){
|
||||
digit.remove();
|
||||
});
|
||||
|
||||
replacement
|
||||
.delay(100)
|
||||
.animate({top:0,opacity:1},'fast');
|
||||
|
||||
return true;
|
||||
}
|
||||
});
|
||||
})( jQuery );
|
||||
|
||||
|
137
assets/js/metro/metro-date-format.js
Executable file
@ -0,0 +1,137 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
// this is a temporary solution
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
//console.log(arguments);
|
||||
|
||||
// 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;
|
||||
}
|
||||
|
||||
//console.log(locale);
|
||||
|
||||
locale = $.Metro.currentLocale;
|
||||
|
||||
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: $.Metro.Locale[locale].days[D],
|
||||
dddd: $.Metro.Locale[locale].days[D + 7],
|
||||
m: m + 1,
|
||||
mm: pad(m + 1),
|
||||
mmm: $.Metro.Locale[locale].months[m],
|
||||
mmmm: $.Metro.Locale[locale].months[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);
|
||||
};
|
||||
|
||||
/*
|
||||
* End date format
|
||||
*/
|
||||
|
138
assets/js/metro/metro-datepicker.js
Executable file
@ -0,0 +1,138 @@
|
||||
// DatePicker
|
||||
|
||||
(function( $ ) {
|
||||
$.widget("metro.datepicker", {
|
||||
|
||||
version: "1.0.0",
|
||||
|
||||
options: {
|
||||
format: "dd.mm.yyyy",
|
||||
date: undefined,
|
||||
effect: 'none',
|
||||
position: 'bottom',
|
||||
locale: $.Metro.currentLocale,
|
||||
weekStart: (METRO_WEEK_START != undefined ? METRO_WEEK_START : 0), // 0 - Sunday, 1 - Monday
|
||||
otherDays: false,
|
||||
selected: function(d, d0){},
|
||||
_calendar: undefined
|
||||
},
|
||||
|
||||
|
||||
_create: function(){
|
||||
var that = this,
|
||||
element = this.element,
|
||||
input = element.children("input"),
|
||||
button = element.children("button.btn-date");
|
||||
|
||||
if (element.data('date') != undefined) this.options.date = element.data('date');
|
||||
if (element.data('format') != undefined) this.options.format = element.data('format');
|
||||
if (element.data('effect') != undefined) this.options.effect = element.data('effect');
|
||||
if (element.data('position') != undefined) this.options.position = element.data('position');
|
||||
if (element.data('locale') != undefined) this.options.locale = element.data('locale');
|
||||
if (element.data('weekStart') != undefined) this.options.weekStart = element.data('weekStart');
|
||||
if (element.data('otherDays') != undefined) this.options.otherDays = element.data('otherDays');
|
||||
|
||||
this._createCalendar(element, this.options.date);
|
||||
|
||||
input.attr('readonly', true);
|
||||
|
||||
button.on('click', function(e){
|
||||
e.stopPropagation();
|
||||
if (that.options._calendar.css('display') == 'none') {
|
||||
that._show();
|
||||
} else {
|
||||
that._hide();
|
||||
}
|
||||
});
|
||||
|
||||
element.on('click', function(e){
|
||||
e.stopPropagation();
|
||||
if (that.options._calendar.css('display') == 'none') {
|
||||
that._show();
|
||||
} else {
|
||||
that._hide();
|
||||
}
|
||||
});
|
||||
|
||||
$('html').on('click', function(e){
|
||||
$(".calendar-dropdown").hide();
|
||||
})
|
||||
},
|
||||
|
||||
_createCalendar: function(to, curDate){
|
||||
var _calendar, that = this;
|
||||
|
||||
_calendar = $("<div/>").css({
|
||||
position: 'absolute'
|
||||
, display: 'none'
|
||||
, 'max-width': 260
|
||||
, 'z-index': 1000
|
||||
|
||||
}).addClass('calendar calendar-dropdown').appendTo(to);
|
||||
|
||||
if (that.options.date != undefined) {
|
||||
_calendar.data('date', that.options.date);
|
||||
}
|
||||
|
||||
_calendar.calendar({
|
||||
multiSelect: false,
|
||||
format: that.options.format,
|
||||
buttons: false,
|
||||
locale: that.options.locale,
|
||||
otherDays: that.options.otherDays,
|
||||
weekStart: that.options.weekStart,
|
||||
click: function(d, d0){
|
||||
//console.log(d, d0);
|
||||
_calendar.calendar('setDate', d0);
|
||||
to.children("input[type=text]").val(d);
|
||||
that.options.selected(d, d0);
|
||||
that._hide();
|
||||
}
|
||||
});
|
||||
|
||||
if (curDate != undefined) {
|
||||
_calendar.calendar('setDate', curDate);
|
||||
to.children("input[type=text]").val(_calendar.calendar('getDate'));
|
||||
}
|
||||
|
||||
// Set position
|
||||
switch (this.options.position) {
|
||||
case 'top': _calendar.css({top: (0-_calendar.height()), left: 0}); break;
|
||||
default: _calendar.css({top: '100%', left: 0});
|
||||
}
|
||||
|
||||
this.options._calendar = _calendar;
|
||||
},
|
||||
|
||||
_show: function(){
|
||||
if (this.options.effect == 'slide') {
|
||||
$(".calendar-dropdown").slideUp('fast');
|
||||
this.options._calendar.slideDown('fast');
|
||||
} else if (this.options.effect == 'fade') {
|
||||
$(".calendar-dropdown").fadeOut('fast');
|
||||
this.options._calendar.fadeIn('fast');
|
||||
} else {
|
||||
$(".calendar-dropdown").hide();
|
||||
this.options._calendar.show();
|
||||
}
|
||||
},
|
||||
_hide: function(){
|
||||
if (this.options.effect == 'slide') {
|
||||
this.options._calendar.slideUp('fast');
|
||||
} else if (this.options.effect == 'fade') {
|
||||
this.options._calendar.fadeOut('fast');
|
||||
} else {
|
||||
this.options._calendar.hide();
|
||||
}
|
||||
},
|
||||
|
||||
_destroy: function(){
|
||||
},
|
||||
|
||||
_setOption: function(key, value){
|
||||
this._super('_setOption', key, value);
|
||||
}
|
||||
})
|
||||
})( jQuery );
|
||||
|
||||
|
221
assets/js/metro/metro-dialog.js
Executable file
@ -0,0 +1,221 @@
|
||||
(function($) {
|
||||
if (METRO_DIALOG == undefined) {
|
||||
//var METRO_DIALOG = false;
|
||||
}
|
||||
|
||||
$.Dialog = function(params) {
|
||||
if(!$.Dialog.opened) {
|
||||
$.Dialog.opened = true;
|
||||
} else {
|
||||
return METRO_DIALOG;
|
||||
}
|
||||
|
||||
$.Dialog.settings = params;
|
||||
|
||||
params = $.extend({
|
||||
icon: false,
|
||||
title: '',
|
||||
content: '',
|
||||
flat: false,
|
||||
shadow: false,
|
||||
overlay: false,
|
||||
width: 'auto',
|
||||
height: 'auto',
|
||||
position: 'default',
|
||||
padding: false,
|
||||
overlayClickClose: true,
|
||||
sysButtons: {
|
||||
btnClose: true
|
||||
},
|
||||
onShow: function(_dialog){},
|
||||
sysBtnCloseClick: function(event){},
|
||||
sysBtnMinClick: function(event){},
|
||||
sysBtnMaxClick: function(event){}
|
||||
}, params);
|
||||
|
||||
var _overlay, _window, _caption, _content;
|
||||
|
||||
_overlay = $("<div/>").addClass("metro window-overlay");
|
||||
|
||||
if (params.overlay) {
|
||||
_overlay.css({
|
||||
backgroundColor: 'rgba(0,0,0,.7)'
|
||||
});
|
||||
}
|
||||
|
||||
_window = $("<div/>").addClass("window");
|
||||
if (params.flat) _window.addClass("flat");
|
||||
if (params.shadow) _window.addClass("shadow").css('overflow', 'hidden');
|
||||
_caption = $("<div/>").addClass("caption");
|
||||
_content = $("<div/>").addClass("content");
|
||||
_content.css({
|
||||
paddingTop: 32 + params.padding,
|
||||
paddingLeft: params.padding,
|
||||
paddingRight: params.padding,
|
||||
paddingBottom: params.padding
|
||||
});
|
||||
|
||||
if (params.sysButtons) {
|
||||
if (params.sysButtons.btnClose) {
|
||||
$("<button/>").addClass("btn-close").on('click', function(e){
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
$.Dialog.close();
|
||||
params.sysBtnCloseClick(e);
|
||||
}).appendTo(_caption);
|
||||
}
|
||||
if (params.sysButtons.btnMax) {
|
||||
$("<button/>").addClass("btn-max").on('click', function(e){
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
params.sysBtnMaxClick(e);
|
||||
}).appendTo(_caption);
|
||||
}
|
||||
if (params.sysButtons.btnMin) {
|
||||
$("<button/>").addClass("btn-min").on('click', function(e){
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
params.sysBtnMinClick(e);
|
||||
}).appendTo(_caption);
|
||||
}
|
||||
}
|
||||
|
||||
if (params.icon) $(params.icon).addClass("icon").appendTo(_caption);
|
||||
$("<div/>").addClass("title").html(params.title).appendTo(_caption);
|
||||
|
||||
_content.html(params.content);
|
||||
|
||||
_caption.appendTo(_window);
|
||||
_content.appendTo(_window);
|
||||
_window.appendTo(_overlay);
|
||||
|
||||
if (params.width != 'auto') _window.css('min-width', params.width);
|
||||
if (params.height != 'auto') _window.css('min-height', params.height);
|
||||
|
||||
_overlay.hide().appendTo('body').fadeIn('fast');
|
||||
|
||||
METRO_DIALOG = _window;
|
||||
|
||||
_window
|
||||
.css("position", "fixed")
|
||||
.css("z-index", parseInt(_overlay.css('z-index'))+1)
|
||||
.css("top", ($(window).height() - METRO_DIALOG.outerHeight()) / 2 )
|
||||
.css("left", ($(window).width() - _window.outerWidth()) / 2)
|
||||
;
|
||||
|
||||
addTouchEvents(_window[0]);
|
||||
|
||||
if(params.draggable) {
|
||||
_caption.on("mousedown", function(e) {
|
||||
$.Dialog.drag = true;
|
||||
_caption.css('cursor', 'move');
|
||||
|
||||
var z_idx = _window.css('z-index'),
|
||||
drg_h = _window.outerHeight(),
|
||||
drg_w = _window.outerWidth(),
|
||||
pos_y = _window.offset().top + drg_h - e.pageY,
|
||||
pos_x = _window.offset().left + drg_w - e.pageX;
|
||||
|
||||
_window.css('z-index', 99999).parents().on("mousemove", function(e) {
|
||||
var t = (e.pageY > 0)?(e.pageY + pos_y - drg_h):(0);
|
||||
var l = (e.pageX > 0)?(e.pageX + pos_x - drg_w):(0);
|
||||
|
||||
if ($.Dialog.drag) {
|
||||
if(t >= 0 && t <= window.innerHeight - _window.outerHeight()) {
|
||||
_window.offset({top: t});
|
||||
}
|
||||
if(l >= 0 && l <= window.innerWidth - _window.outerWidth()) {
|
||||
_window.offset({left: l});
|
||||
}
|
||||
}
|
||||
});
|
||||
e.preventDefault();
|
||||
}).on("mouseup", function() {
|
||||
_window.removeClass('draggable');
|
||||
$.Dialog.drag = false;
|
||||
_caption.css('cursor', 'default');
|
||||
});
|
||||
}
|
||||
|
||||
_window.on('click', function(e){
|
||||
e.stopPropagation();
|
||||
});
|
||||
|
||||
if (params.overlayClickClose) {
|
||||
_overlay.on('click', function(e){
|
||||
e.preventDefault();
|
||||
$.Dialog.close();
|
||||
});
|
||||
}
|
||||
|
||||
params.onShow(METRO_DIALOG);
|
||||
|
||||
$.Dialog.autoResize();
|
||||
|
||||
return METRO_DIALOG;
|
||||
}
|
||||
|
||||
$.Dialog.content = function(newContent) {
|
||||
if(!$.Dialog.opened || METRO_DIALOG == undefined) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if(newContent) {
|
||||
METRO_DIALOG.children(".content").html(newContent);
|
||||
$.Dialog.autoResize();
|
||||
return true;
|
||||
} else {
|
||||
return METRO_DIALOG.children(".content").html();
|
||||
}
|
||||
}
|
||||
|
||||
$.Dialog.title = function(newTitle) {
|
||||
if(!$.Dialog.opened || METRO_DIALOG == undefined) {
|
||||
return false;
|
||||
}
|
||||
|
||||
var _title = METRO_DIALOG.children('.caption').children('.title');
|
||||
|
||||
if(newTitle) {
|
||||
_title.html(newTitle);
|
||||
} else {
|
||||
_title.html();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
$.Dialog.autoResize = function(){
|
||||
if(!$.Dialog.opened || METRO_DIALOG == undefined) {
|
||||
return false;
|
||||
}
|
||||
|
||||
var _content = METRO_DIALOG.children(".content");
|
||||
|
||||
var top = ($(window).height() - METRO_DIALOG.outerHeight()) / 2;
|
||||
var left = ($(window).width() - METRO_DIALOG.outerWidth()) / 2;
|
||||
|
||||
METRO_DIALOG.css({
|
||||
width: _content.outerWidth(),
|
||||
height: _content.outerHeight(),
|
||||
top: top,
|
||||
left: left
|
||||
});
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
$.Dialog.close = function() {
|
||||
if(!$.Dialog.opened || METRO_DIALOG == undefined) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$.Dialog.opened = false;
|
||||
var _overlay = METRO_DIALOG.parent(".window-overlay");
|
||||
_overlay.fadeOut(function(){
|
||||
$(this).remove();
|
||||
});
|
||||
|
||||
return false;
|
||||
}
|
||||
})(jQuery);
|
46
assets/js/metro/metro-drag-tile.js
Executable file
@ -0,0 +1,46 @@
|
||||
(function( $ ) {
|
||||
$.widget("metro.dragtile", {
|
||||
|
||||
version: "1.0.0",
|
||||
|
||||
options: {
|
||||
},
|
||||
|
||||
_create: function(){
|
||||
var that = this, element = tile = this.element,
|
||||
area = element.parents('.tile-area'),
|
||||
tiles = area.find(".tile"),
|
||||
groups = area.find(".tile-group");
|
||||
|
||||
tile.attr("draggable", "true");
|
||||
|
||||
addTouchEvents(tile[0]);
|
||||
|
||||
tile[0].addEventListener('dragstart', this._dragStart, false);
|
||||
tile[0].addEventListener('dragend', this._dragEnd, false);
|
||||
|
||||
tile.on('mousedown', function(e){
|
||||
});
|
||||
|
||||
tile.on('mouseup', function(e){
|
||||
});
|
||||
},
|
||||
|
||||
_dragStart: function(e){
|
||||
$(this).css('opacity',.4);
|
||||
},
|
||||
|
||||
_dragEnd: function(e){
|
||||
$(this).css('opacity',1);
|
||||
},
|
||||
|
||||
_destroy: function(){
|
||||
|
||||
},
|
||||
|
||||
_setOption: function(key, value){
|
||||
this._super('_setOption', key, value);
|
||||
}
|
||||
})
|
||||
})( jQuery );
|
||||
|
112
assets/js/metro/metro-dropdown.js
Executable file
@ -0,0 +1,112 @@
|
||||
(function( $ ) {
|
||||
$.widget("metro.dropdown", {
|
||||
|
||||
version: "1.0.1",
|
||||
|
||||
options: {
|
||||
effect: 'slide',
|
||||
toggleElement: false
|
||||
},
|
||||
|
||||
_create: function(){
|
||||
var that = this,
|
||||
menu = this.element,
|
||||
name = this.name,
|
||||
parent = this.element.parent(),
|
||||
toggle = this.options.toggleElement || parent.children('.dropdown-toggle');
|
||||
|
||||
if (menu.data('effect') != undefined) {
|
||||
this.options.effect = menu.data('effect');
|
||||
}
|
||||
|
||||
toggle.on('click.'+name, function(e){
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
|
||||
if (menu.css('display') == 'block' && !menu.hasClass('keep-open')) {
|
||||
that._close(menu);
|
||||
} else {
|
||||
$('.dropdown-menu').each(function(i, el){
|
||||
if (!menu.parents('.dropdown-menu').is(el) && !$(el).hasClass('keep-open') && $(el).css('display')=='block') {
|
||||
that._close(el);
|
||||
}
|
||||
});
|
||||
that._open(menu);
|
||||
}
|
||||
});
|
||||
|
||||
$(menu).find('li.disabled a').on('click', function(e){
|
||||
e.preventDefault();
|
||||
});
|
||||
|
||||
},
|
||||
|
||||
_open: function(el){
|
||||
switch (this.options.effect) {
|
||||
case 'fade': $(el).fadeIn('fast'); break;
|
||||
case 'slide': $(el).slideDown('fast'); break;
|
||||
default: $(el).hide();
|
||||
}
|
||||
this._trigger("onOpen", null, el);
|
||||
},
|
||||
|
||||
_close: function(el){
|
||||
switch (this.options.effect) {
|
||||
case 'fade': $(el).fadeOut('fast'); break;
|
||||
case 'slide': $(el).slideUp('fast'); break;
|
||||
default: $(el).hide();
|
||||
}
|
||||
this._trigger("onClose", null, el);
|
||||
},
|
||||
|
||||
_destroy: function(){
|
||||
},
|
||||
|
||||
_setOption: function(key, value){
|
||||
this._super('_setOption', key, value);
|
||||
}
|
||||
});
|
||||
})( jQuery );
|
||||
|
||||
/*
|
||||
(function($){
|
||||
$.fn.PullDown = function( options ){
|
||||
var defaults = {
|
||||
};
|
||||
|
||||
var $this = $(this)
|
||||
;
|
||||
|
||||
var initSelectors = function(selectors){
|
||||
|
||||
addTouchEvents(selectors[0]);
|
||||
|
||||
selectors.on('click', function(e){
|
||||
var $m = $this.parent().children(".element-menu");
|
||||
console.log($m);
|
||||
if ($m.css('display') == "block") {
|
||||
$m.slideUp('fast');
|
||||
} else {
|
||||
$m.slideDown('fast');
|
||||
}
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
});
|
||||
};
|
||||
|
||||
return this.each(function(){
|
||||
if ( options ) {
|
||||
$.extend(defaults, options);
|
||||
}
|
||||
|
||||
initSelectors($this);
|
||||
});
|
||||
};
|
||||
|
||||
$(function () {
|
||||
$('.pull-menu, .menu-pull').each(function () {
|
||||
$(this).PullDown();
|
||||
});
|
||||
});
|
||||
})(window.jQuery);
|
||||
*/
|
57
assets/js/metro/metro-fluentmenu.js
Executable file
@ -0,0 +1,57 @@
|
||||
(function( $ ) {
|
||||
$.widget("metro.fluentmenu", {
|
||||
|
||||
version: "1.0.0",
|
||||
|
||||
options: {
|
||||
onSpecialClick: function(e, el){},
|
||||
onTabClick: function(e, el){}
|
||||
},
|
||||
|
||||
_create: function(){
|
||||
var that = this, element = this.element, o = this.options,
|
||||
tabs = element.find('.tabs-holder > li > a');
|
||||
|
||||
this._hidePanels();
|
||||
this._showPanel();
|
||||
|
||||
tabs.on('click', function(e){
|
||||
if ($(this).parent('li').hasClass('special')) {
|
||||
o.onSpecialClick(e, $(this));
|
||||
} else {
|
||||
var panel = $($(this).attr('href'));
|
||||
|
||||
that._hidePanels();
|
||||
that._showPanel(panel);
|
||||
element.find('.tabs-holder > li').removeClass('active');
|
||||
$(this).parent('li').addClass('active');
|
||||
|
||||
o.onTabClick(e, $(this));
|
||||
}
|
||||
e.preventDefault();
|
||||
});
|
||||
},
|
||||
|
||||
_hidePanels: function(){
|
||||
this.element.find('.tab-panel').hide();
|
||||
},
|
||||
|
||||
_showPanel: function(panel){
|
||||
if (panel == undefined) {
|
||||
panel = this.element.find('.tabs-holder li.active a').attr('href');
|
||||
}
|
||||
$(panel).show();
|
||||
},
|
||||
|
||||
_destroy: function(){
|
||||
|
||||
},
|
||||
|
||||
_setOption: function(key, value){
|
||||
this._super('_setOption', key, value);
|
||||
}
|
||||
})
|
||||
})( jQuery );
|
||||
|
||||
|
||||
|
4
assets/js/metro/metro-global.js
Executable file
@ -0,0 +1,4 @@
|
||||
var METRO_AUTO_REINIT;
|
||||
var METRO_LOCALE;
|
||||
var METRO_WEEK_START;
|
||||
var METRO_DIALOG = false;
|
104
assets/js/metro/metro-hint.js
Executable file
@ -0,0 +1,104 @@
|
||||
(function( $ ) {
|
||||
$.widget("metro.hint", {
|
||||
|
||||
version: "1.0.0",
|
||||
|
||||
options: {
|
||||
position: "bottom",
|
||||
background: '#FFFCC0',
|
||||
shadow: false,
|
||||
border: false,
|
||||
_hint: undefined
|
||||
},
|
||||
|
||||
_create: function(){
|
||||
var that = this;
|
||||
var o = this.options;
|
||||
|
||||
|
||||
this.element.on('mouseenter', function(e){
|
||||
that.createHint();
|
||||
o._hint.stop().fadeIn();
|
||||
e.preventDefault();
|
||||
});
|
||||
|
||||
this.element.on('mouseleave', function(e){
|
||||
o._hint.stop().fadeOut(function(){
|
||||
o._hint.remove();
|
||||
});
|
||||
e.preventDefault();
|
||||
});
|
||||
},
|
||||
|
||||
createHint: function(){
|
||||
var that = this, element = this.element,
|
||||
hint = element.data('hint').split("|"),
|
||||
o = this.options;
|
||||
|
||||
var _hint;
|
||||
|
||||
if (element.data('hintPosition') != undefined) o.position = element.data('hintPosition');
|
||||
if (element.data('hintBackground') != undefined) o.background = element.data('hintBackground');
|
||||
if (element.data('hintShadow') != undefined) o.shadow = element.data('hintShadow');
|
||||
if (element.data('hintBorder') != undefined) o.border = element.data('hintBorder');
|
||||
|
||||
if (element[0].tagName == 'TD' || element[0].tagName == 'TH') {
|
||||
var wrp = $("<div/>").css("display", "inline-block").html(element.html());
|
||||
element.html(wrp);
|
||||
element = wrp;
|
||||
}
|
||||
|
||||
var hint_title = hint.length > 1 ? hint[0] : false;
|
||||
var hint_text = hint.length > 1 ? hint[1] : hint[0];
|
||||
|
||||
//_hint = $("<div/>").addClass("hint").appendTo(element.parent());
|
||||
_hint = $("<div/>").addClass("hint").appendTo('body');
|
||||
if (hint_title) {
|
||||
$("<div/>").addClass("hint-title").html(hint_title).appendTo(_hint);
|
||||
}
|
||||
$("<div/>").addClass("hint-text").html(hint_text).appendTo(_hint);
|
||||
|
||||
_hint.addClass(o.position);
|
||||
|
||||
if (o.shadow) _hint.addClass("shadow");
|
||||
if (o.background) {_hint.css("background-color", o.background);}
|
||||
if (o.border) _hint.css("border-color", o.border);
|
||||
|
||||
//console.log(_hint);
|
||||
|
||||
if (o.position == 'top') {
|
||||
_hint.css({
|
||||
top: element.offset().top - $(window).scrollTop() - _hint.outerHeight() - 20,
|
||||
left: element.offset().left - $(window).scrollLeft()
|
||||
});
|
||||
} else if (o.position == 'bottom') {
|
||||
_hint.css({
|
||||
top: element.offset().top - $(window).scrollTop() + element.outerHeight(),
|
||||
left: element.offset().left - $(window).scrollLeft()
|
||||
});
|
||||
} else if (o.position == 'right') {
|
||||
_hint.css({
|
||||
top: element.offset().top - 10 - $(window).scrollTop(),
|
||||
left: element.offset().left + element.outerWidth() + 10 - $(window).scrollLeft()
|
||||
});
|
||||
} else if (o.position == 'left') {
|
||||
_hint.css({
|
||||
top: element.offset().top - 10 - $(window).scrollTop(),
|
||||
left: element.offset().left - _hint.outerWidth() - 10 - $(window).scrollLeft()
|
||||
});
|
||||
}
|
||||
|
||||
o._hint = _hint;
|
||||
},
|
||||
|
||||
_destroy: function(){
|
||||
},
|
||||
|
||||
_setOption: function(key, value){
|
||||
this._super('_setOption', key, value);
|
||||
}
|
||||
})
|
||||
})( jQuery );
|
||||
|
||||
|
||||
|
271
assets/js/metro/metro-initiator.js
Executable file
@ -0,0 +1,271 @@
|
||||
(function($){
|
||||
/*
|
||||
* Init or ReInit components
|
||||
* */
|
||||
|
||||
$.Metro.initAccordions = function(area){
|
||||
if (area != undefined) {
|
||||
$(area).find('[data-role=accordion]').accordion();
|
||||
} else {
|
||||
$('[data-role=accordion]').accordion();
|
||||
}
|
||||
};
|
||||
|
||||
$.Metro.initButtonSets = function(area){
|
||||
if (area != undefined) {
|
||||
$(area).find('[data-role=button-set]').buttonset();
|
||||
$(area).find('[data-role=button-group]').buttongroup();
|
||||
} else {
|
||||
$('[data-role=button-set]').buttonset();
|
||||
$('[data-role=button-group]').buttongroup();
|
||||
}
|
||||
};
|
||||
|
||||
$.Metro.initCalendars = function(area){
|
||||
if (area != undefined) {
|
||||
$(area).find('[data-role=calendar]').calendar();
|
||||
} else {
|
||||
$('[data-role=calendar]').calendar();
|
||||
}
|
||||
};
|
||||
|
||||
$.Metro.initCarousels = function(area){
|
||||
if (area != undefined) {
|
||||
$(area).find('[data-role=carousel]').carousel();
|
||||
} else {
|
||||
$('[data-role=carousel]').carousel();
|
||||
}
|
||||
};
|
||||
|
||||
$.Metro.initCountdowns = function(area){
|
||||
if (area != undefined) {
|
||||
$(area).find('[data-role=countdown]').countdown();
|
||||
} else {
|
||||
$('[data-role=countdown]').countdown();
|
||||
}
|
||||
};
|
||||
|
||||
$.Metro.initDatepickers = function(area){
|
||||
if (area != undefined) {
|
||||
$(area).find('[data-role=datepicker]').datepicker();
|
||||
} else {
|
||||
$('[data-role=datepicker]').datepicker();
|
||||
}
|
||||
};
|
||||
|
||||
$.Metro.initDropdowns = function(area){
|
||||
if (area != undefined) {
|
||||
$(area).find('[data-role=dropdown]').dropdown();
|
||||
} else {
|
||||
$('[data-role=dropdown]').dropdown();
|
||||
}
|
||||
};
|
||||
|
||||
$.Metro.initFluentMenus = function(area){
|
||||
if (area != undefined) {
|
||||
$(area).find('[data-role=fluentmenu]').fluentmenu();
|
||||
} else {
|
||||
$('[data-role=fluentmenu]').fluentmenu();
|
||||
}
|
||||
};
|
||||
|
||||
$.Metro.initHints = function(area){
|
||||
if (area != undefined) {
|
||||
$(area).find('[data-hint]').hint();
|
||||
} else {
|
||||
$('[data-hint]').hint();
|
||||
}
|
||||
};
|
||||
|
||||
$.Metro.initInputs = function(area){
|
||||
if (area != undefined) {
|
||||
$(area).find('[data-role=input-control], .input-control').inputControl();
|
||||
} else {
|
||||
$('[data-role=input-control], .input-control').inputControl();
|
||||
}
|
||||
};
|
||||
|
||||
$.Metro.transformInputs = function(area){
|
||||
if (area != undefined) {
|
||||
$(area).find('[data-transform=input-control]').inputTransform();
|
||||
} else {
|
||||
$('[data-transform=input-control]').inputTransform();
|
||||
}
|
||||
};
|
||||
|
||||
$.Metro.initListViews = function(area){
|
||||
if (area != undefined) {
|
||||
$(area).find('[data-role=listview]').listview();
|
||||
} else {
|
||||
$('[data-role=listview]').listview();
|
||||
}
|
||||
};
|
||||
|
||||
$.Metro.initLives = function(area){
|
||||
if (area != undefined) {
|
||||
$(area).find('[data-role=live-tile], [data-role=live]').livetile();
|
||||
} else {
|
||||
$('[data-role=live-tile], [data-role=live]').livetile();
|
||||
}
|
||||
};
|
||||
|
||||
$.Metro.initProgreeBars = function(area){
|
||||
if (area != undefined) {
|
||||
$(area).find('[data-role=progress-bar]').progressbar();
|
||||
} else {
|
||||
$('[data-role=progress-bar]').progressbar();
|
||||
}
|
||||
};
|
||||
|
||||
$.Metro.initRatings = function(area){
|
||||
if (area != undefined) {
|
||||
$(area).find('[data-role=rating]').rating();
|
||||
} else {
|
||||
$('[data-role=rating]').rating();
|
||||
}
|
||||
};
|
||||
|
||||
$.Metro.initScrolls = function(area){
|
||||
if (area != undefined) {
|
||||
$(area).find('[data-role=scrollbox]').scrollbar();
|
||||
} else {
|
||||
$('[data-role=scrollbox]').scrollbar();
|
||||
}
|
||||
};
|
||||
|
||||
$.Metro.initSliders = function(area){
|
||||
if (area != undefined) {
|
||||
$(area).find('[data-role=slider]').slider();
|
||||
} else {
|
||||
$('[data-role=slider]').slider();
|
||||
}
|
||||
};
|
||||
|
||||
$.Metro.initTabs = function(area){
|
||||
if (area != undefined) {
|
||||
$(area).find('[data-role=tab-control]').tabcontrol();
|
||||
} else {
|
||||
$('[data-role=tab-control]').tabcontrol();
|
||||
}
|
||||
};
|
||||
|
||||
$.Metro.initTimes = function(area){
|
||||
if (area != undefined) {
|
||||
$(area).find('[data-role=times]').times();
|
||||
} else {
|
||||
$('[data-role=times]').times();
|
||||
}
|
||||
};
|
||||
|
||||
$.Metro.initTrees = function(area){
|
||||
if (area != undefined) {
|
||||
$(area).find('[data-role=treeview]').treeview();
|
||||
} else {
|
||||
$('[data-role=treeview]').treeview();
|
||||
}
|
||||
};
|
||||
|
||||
/*
|
||||
* Components in develop
|
||||
* */
|
||||
|
||||
$.Metro.initSteppers = function(area){
|
||||
if (area != undefined) {
|
||||
$(area).find('[data-role=stepper]').stepper();
|
||||
} else {
|
||||
$('[data-role=stepper]').stepper();
|
||||
}
|
||||
};
|
||||
|
||||
$.Metro.initStreamers = function(area){
|
||||
if (area != undefined) {
|
||||
$(area).find('[data-role=streamer]').streamer();
|
||||
} else {
|
||||
$('[data-role=streamer]').streamer();
|
||||
}
|
||||
};
|
||||
|
||||
$.Metro.initDragTiles = function(area){
|
||||
if (area != undefined) {
|
||||
$(area).find('[data-role=drag-drop]').dragtile();
|
||||
} else {
|
||||
$('[data-role=drag-drop]').dragtile();
|
||||
}
|
||||
};
|
||||
|
||||
$.Metro.initPulls = function(area){
|
||||
if (area != undefined) {
|
||||
$(area).find('[data-role=pull-menu], .pull-menu').pullmenu();
|
||||
} {
|
||||
$('[data-role=pull-menu], .pull-menu').pullmenu();
|
||||
}
|
||||
};
|
||||
|
||||
$.Metro.initPanels = function(area){
|
||||
if (area != undefined) {
|
||||
$(area).find('[data-role=panel]').panel();
|
||||
} {
|
||||
$('[data-role=panel]').panel();
|
||||
}
|
||||
};
|
||||
|
||||
$.Metro.initTileTransform = function(area){
|
||||
if (area != undefined) {
|
||||
$(area).find('[data-click=transform]').tileTransform();
|
||||
} {
|
||||
$('[data-click=transform]').tileTransform();
|
||||
}
|
||||
};
|
||||
|
||||
$.Metro.initAll = function(area) {
|
||||
$.Metro.initAccordions(area);
|
||||
$.Metro.initButtonSets(area);
|
||||
$.Metro.initCalendars(area);
|
||||
$.Metro.initCarousels(area);
|
||||
$.Metro.initCountdowns(area);
|
||||
$.Metro.initDatepickers(area);
|
||||
$.Metro.initDropdowns(area);
|
||||
$.Metro.initFluentMenus(area);
|
||||
$.Metro.initHints(area);
|
||||
$.Metro.initInputs(area);
|
||||
$.Metro.transformInputs(area);
|
||||
$.Metro.initListViews(area);
|
||||
$.Metro.initLives(area);
|
||||
$.Metro.initProgreeBars(area);
|
||||
$.Metro.initRatings(area);
|
||||
$.Metro.initScrolls(area);
|
||||
$.Metro.initSliders(area);
|
||||
$.Metro.initTabs(area);
|
||||
$.Metro.initTimes(area);
|
||||
$.Metro.initTrees(area);
|
||||
$.Metro.initSteppers(area);
|
||||
$.Metro.initStreamers(area);
|
||||
$.Metro.initDragTiles(area);
|
||||
$.Metro.initPulls(area);
|
||||
$.Metro.initPanels(area);
|
||||
$.Metro.initTileTransform(area);
|
||||
}
|
||||
})(jQuery);
|
||||
|
||||
$(function(){
|
||||
$.Metro.initAll();
|
||||
});
|
||||
|
||||
|
||||
$(function(){
|
||||
if (METRO_AUTO_REINIT) {
|
||||
//$(".metro").bind('DOMSubtreeModified', function(){ $.Metro.initAll(); });
|
||||
var originalDOM = $('.metro').html(),
|
||||
actualDOM;
|
||||
|
||||
setInterval(function () {
|
||||
actualDOM = $('.metro').html();
|
||||
|
||||
if (originalDOM !== actualDOM) {
|
||||
originalDOM = actualDOM;
|
||||
|
||||
$.Metro.initAll();
|
||||
}
|
||||
}, 500);
|
||||
}
|
||||
});
|
318
assets/js/metro/metro-input-control.js
Executable file
@ -0,0 +1,318 @@
|
||||
(function( $ ) {
|
||||
$.widget("metro.inputControl", {
|
||||
|
||||
version: "1.0.0",
|
||||
|
||||
options: {
|
||||
},
|
||||
|
||||
_create: function(){
|
||||
var that = this,
|
||||
control = this.element;
|
||||
|
||||
if (control.hasClass('text')) {
|
||||
this.initTextInput(control, that);
|
||||
} else if (control.hasClass('password')) {
|
||||
this.initPasswordInput(control, that);
|
||||
} else if (control.hasClass('checkbox') || control.hasClass('radio') || control.hasClass('switch')) {
|
||||
this.initCheckboxInput(control, that);
|
||||
} else if (control.hasClass('file')) {
|
||||
this.initFileInput(control, that);
|
||||
}
|
||||
},
|
||||
|
||||
initCheckboxInput: function(el, that) {
|
||||
},
|
||||
|
||||
initFileInput: function(el, that){
|
||||
var button, input, wrapper;
|
||||
wrapper = $("<input type='text' id='__input_file_wrapper__' readonly style='z-index: 1; cursor: default;'>");
|
||||
button = el.children('.btn-file');
|
||||
input = el.children('input[type="file"]');
|
||||
input.css('z-index', 0);
|
||||
wrapper.insertAfter(input);
|
||||
input.attr('tabindex', '-1');
|
||||
//button.attr('tabindex', '-1');
|
||||
button.attr('type', 'button');
|
||||
|
||||
input.on('change', function(){
|
||||
var val = $(this).val();
|
||||
if (val != '') {
|
||||
wrapper.val(val);
|
||||
}
|
||||
});
|
||||
|
||||
button.on('click', function(){
|
||||
input.trigger('click');
|
||||
});
|
||||
},
|
||||
|
||||
initTextInput: function(el, that){
|
||||
var button = el.children('.btn-clear'),
|
||||
input = el.children('input[type=text]');
|
||||
|
||||
//console.log(button.length);
|
||||
//button = el.children('.btn-clear');
|
||||
|
||||
if (button.length == 0) return;
|
||||
|
||||
button.attr('tabindex', '-1');
|
||||
button.attr('type', 'button');
|
||||
|
||||
button.on('click', function(){
|
||||
input = el.children('input');
|
||||
if (input.prop('readonly')) return;
|
||||
input.val('');
|
||||
input.focus();
|
||||
that._trigger("onClear", null, el);
|
||||
});
|
||||
|
||||
if (!input.attr("disabled")) input.on('click', function(){$(this).focus();});
|
||||
},
|
||||
|
||||
initPasswordInput: function(el, that){
|
||||
var button = el.children('.btn-reveal'),
|
||||
input = el.children('input[type=password]');
|
||||
var wrapper;
|
||||
|
||||
if (button.length == 0) return;
|
||||
|
||||
button.attr('tabindex', '-1');
|
||||
button.attr('type', 'button');
|
||||
|
||||
button.on('mousedown', function(e){
|
||||
input.attr('type', 'text');
|
||||
//e.preventDefault();
|
||||
|
||||
// wrapper = el.find(".__wrapper__").length == 0 ? $('<input type="text" class="__wrapper__" />') : el.find(".__wrapper__");
|
||||
//
|
||||
// input.hide();
|
||||
// wrapper.appendTo(that.element);
|
||||
// wrapper.val(input.val());
|
||||
//
|
||||
// that._trigger("onPasswordShow", null, that.element);
|
||||
});
|
||||
|
||||
button.on('mouseup, mouseleave, blur', function(e){
|
||||
input.attr('type', 'password').focus();
|
||||
//e.preventDefault();
|
||||
|
||||
|
||||
// input.show().focus();
|
||||
// wrapper.remove();
|
||||
//
|
||||
// that._trigger("onPasswordHide", null, that.element);
|
||||
});
|
||||
|
||||
if (!input.attr("disabled")) input.on('click', function(){$(this).focus();});
|
||||
},
|
||||
|
||||
_destroy: function(){
|
||||
|
||||
},
|
||||
|
||||
_setOption: function(key, value){
|
||||
this._super('_setOption', key, value);
|
||||
}
|
||||
});
|
||||
})( jQuery );
|
||||
|
||||
|
||||
(function( $ ) {
|
||||
$.widget("metro.inputTransform", {
|
||||
|
||||
version: "1.0.0",
|
||||
|
||||
options: {
|
||||
transformType: "text"
|
||||
},
|
||||
|
||||
_create: function(){
|
||||
var that = this,
|
||||
element = this.element,
|
||||
inputType;
|
||||
|
||||
|
||||
var checkTransform = element.parent().hasClass("input-control");
|
||||
if (checkTransform) return;
|
||||
|
||||
inputType = element.get(0).tagName.toLowerCase();
|
||||
|
||||
if (inputType == "textarea") {
|
||||
this.options.transformType = "textarea";
|
||||
} else if (inputType == "select") {
|
||||
this.options.transformType = "select";
|
||||
} else {
|
||||
if (element.data('transformType') != undefined) {
|
||||
this.options.transformType = element.data('transformType');
|
||||
} else {
|
||||
this.options.transformType = element.attr("type");
|
||||
}
|
||||
}
|
||||
|
||||
var control = undefined;
|
||||
|
||||
switch (this.options.transformType) {
|
||||
case "password": control = this._createInputPassword(); break;
|
||||
case "file": control = this._createInputFile(); break;
|
||||
case "checkbox": control = this._createInputCheckbox(); break;
|
||||
case "radio": control = this._createInputRadio(); break;
|
||||
case "switch": control = this._createInputSwitch(); break;
|
||||
case "select": control = this._createInputSelect(); break;
|
||||
case "textarea": control = this._createInputTextarea(); break;
|
||||
case "search": control = this._createInputSearch(); break;
|
||||
case "email": control = this._createInputEmail(); break;
|
||||
case "tel": control = this._createInputTel(); break;
|
||||
case "number": control = this._createInputNum(); break;
|
||||
default: control = this._createInputText();
|
||||
}
|
||||
|
||||
control.inputControl();
|
||||
},
|
||||
|
||||
_createInputTextarea: function(){
|
||||
var element = this.element;
|
||||
|
||||
var wrapper = $("<div/>").addClass("input-control").addClass("textarea");
|
||||
var clone = element.clone(true);
|
||||
var parent = element.parent();
|
||||
|
||||
clone.appendTo(wrapper);
|
||||
wrapper.insertBefore(element);
|
||||
|
||||
element.remove();
|
||||
|
||||
return wrapper;
|
||||
},
|
||||
|
||||
_createInputSelect: function(){
|
||||
var element = this.element;
|
||||
|
||||
var wrapper = $("<div/>").addClass("input-control").addClass("select");
|
||||
var clone = element.clone(true);
|
||||
var parent = element.parent();
|
||||
|
||||
clone.val(element.val()).appendTo(wrapper);
|
||||
wrapper.insertBefore(element);
|
||||
|
||||
element.remove();
|
||||
|
||||
return wrapper;
|
||||
},
|
||||
|
||||
_createInputSwitch: function(){
|
||||
var element = this.element;
|
||||
|
||||
var wrapper = $("<div/>").addClass("input-control").addClass("switch");
|
||||
var label = $("<label/>");
|
||||
var button = $("<span/>").addClass("check");
|
||||
var clone = element.clone(true);
|
||||
var parent = element.parent();
|
||||
var caption = $("<span/>").addClass("caption").html( element.data('caption') != undefined ? element.data('caption') : "" );
|
||||
|
||||
label.appendTo(wrapper);
|
||||
clone.appendTo(label);
|
||||
button.appendTo(label);
|
||||
caption.appendTo(label);
|
||||
|
||||
wrapper.insertBefore(element);
|
||||
element.remove();
|
||||
|
||||
return wrapper;
|
||||
},
|
||||
|
||||
_createInputCheckbox: function(){
|
||||
var element = this.element;
|
||||
|
||||
var wrapper = $("<div/>").addClass("input-control").addClass("checkbox");
|
||||
var label = $("<label/>");
|
||||
var button = $("<span/>").addClass("check");
|
||||
var clone = element.clone(true);
|
||||
var parent = element.parent();
|
||||
var caption = $("<span/>").addClass("caption").html( element.data('caption') != undefined ? element.data('caption') : "" );
|
||||
|
||||
label.appendTo(wrapper);
|
||||
clone.appendTo(label);
|
||||
button.appendTo(label);
|
||||
caption.appendTo(label);
|
||||
|
||||
wrapper.insertBefore(element);
|
||||
element.remove();
|
||||
|
||||
return wrapper;
|
||||
},
|
||||
|
||||
_createInputRadio: function(){
|
||||
var element = this.element;
|
||||
|
||||
var wrapper = $("<div/>").addClass("input-control").addClass("radio");
|
||||
var label = $("<label/>");
|
||||
var button = $("<span/>").addClass("check");
|
||||
var clone = element.clone(true);
|
||||
var parent = element.parent();
|
||||
var caption = $("<span/>").addClass("caption").html( element.data('caption') != undefined ? element.data('caption') : "" );
|
||||
|
||||
label.appendTo(wrapper);
|
||||
clone.appendTo(label);
|
||||
button.appendTo(label);
|
||||
caption.appendTo(label);
|
||||
|
||||
wrapper.insertBefore(element);
|
||||
element.remove();
|
||||
|
||||
return wrapper;
|
||||
},
|
||||
|
||||
_createInputSearch: function(){
|
||||
return this._createInputVal("text", "btn-search");
|
||||
},
|
||||
|
||||
_createInputNum: function(){
|
||||
return this._createInputVal("number", "btn-clear");
|
||||
},
|
||||
|
||||
_createInputTel: function(){
|
||||
return this._createInputVal("tel", "btn-clear");
|
||||
},
|
||||
|
||||
_createInputEmail: function(){
|
||||
return this._createInputVal("email", "btn-clear");
|
||||
},
|
||||
|
||||
_createInputText: function(){
|
||||
return this._createInputVal("text", "btn-clear");
|
||||
},
|
||||
|
||||
_createInputPassword: function(){
|
||||
return this._createInputVal("password", "btn-reveal");
|
||||
},
|
||||
|
||||
_createInputFile: function(){
|
||||
return this._createInputVal("file", "btn-file");
|
||||
},
|
||||
|
||||
_createInputVal: function(name, buttonName) {
|
||||
var element = this.element;
|
||||
|
||||
var wrapper = $("<div/>").addClass("input-control").addClass(name);
|
||||
var button = $("<button/>").addClass(buttonName);
|
||||
var clone = element.clone(true);
|
||||
var parent = element.parent();
|
||||
|
||||
clone.appendTo(wrapper);
|
||||
button.appendTo(wrapper);
|
||||
|
||||
wrapper.insertBefore(element);
|
||||
element.remove();
|
||||
|
||||
return wrapper;
|
||||
},
|
||||
|
||||
_destroy: function(){},
|
||||
|
||||
_setOption: function(key, value){
|
||||
this._super('_setOption', key, value);
|
||||
}
|
||||
})
|
||||
})( jQuery );
|
||||
|
53
assets/js/metro/metro-listview.js
Executable file
@ -0,0 +1,53 @@
|
||||
(function( $ ) {
|
||||
$.widget("metro.listview", {
|
||||
|
||||
version: "1.0.0",
|
||||
|
||||
options: {
|
||||
onGroupExpand: function(g){},
|
||||
onGroupCollapse: function(g){},
|
||||
onListClick: function(l){}
|
||||
},
|
||||
|
||||
_create: function(){
|
||||
var that = this, element = this.element;
|
||||
|
||||
element.children('.collapsed').children('.group-content').hide();
|
||||
|
||||
element.find('.group-title').on('click', function(e){
|
||||
var $this = $(this),
|
||||
group = $this.parent('.list-group'),
|
||||
group_content = group.children('.group-content');
|
||||
|
||||
group.toggleClass('collapsed');
|
||||
|
||||
if (group.hasClass('collapsed')) {
|
||||
group_content.slideUp();
|
||||
that.options.onGroupCollapse(group);
|
||||
} else {
|
||||
group_content.slideDown();
|
||||
that.options.onGroupExpand(group);
|
||||
}
|
||||
|
||||
e.preventDefault();
|
||||
});
|
||||
|
||||
element.find('.list').on('click', function(e){
|
||||
element.find('.list').removeClass('active');
|
||||
$(this).toggleClass('active');
|
||||
that.options.onListClick($(this));
|
||||
e.preventDefault();
|
||||
});
|
||||
},
|
||||
|
||||
_destroy: function(){
|
||||
|
||||
},
|
||||
|
||||
_setOption: function(key, value){
|
||||
this._super('_setOption', key, value);
|
||||
}
|
||||
})
|
||||
})( jQuery );
|
||||
|
||||
|
162
assets/js/metro/metro-live-tile.js
Executable file
@ -0,0 +1,162 @@
|
||||
(function( $ ) {
|
||||
$.widget("metro.livetile", {
|
||||
|
||||
version: "1.0.0",
|
||||
|
||||
options: {
|
||||
effect: 'slideLeft',
|
||||
period: 4000,
|
||||
duration: 700,
|
||||
easing: 'doubleSqrt'
|
||||
},
|
||||
|
||||
_frames: {},
|
||||
_currentIndex: 0,
|
||||
_interval: 0,
|
||||
_outPosition: 0,
|
||||
_size: {},
|
||||
|
||||
_create: function(){
|
||||
var that = this,
|
||||
element = this.element;
|
||||
|
||||
if (element.data('effect') != undefined) {this.options.effect = element.data('effect');}
|
||||
if (element.data('direction') != undefined) {this.options.direction = element.data('direction');}
|
||||
if (element.data('period') != undefined) {this.options.period = element.data('period');}
|
||||
if (element.data('duration') != undefined) {this.options.duration = element.data('duration');}
|
||||
if (element.data('easing') != undefined) {this.options.easing = element.data('easing');}
|
||||
|
||||
//this._frames = element.children(".tile-content, .event-content");
|
||||
this._frames = element.children("[class*='-content']");
|
||||
//console.log(this._frames);
|
||||
|
||||
if (this._frames.length <= 1) return;
|
||||
|
||||
$.easing.doubleSqrt = function(t) {return Math.sqrt(Math.sqrt(t));};
|
||||
|
||||
this._size = {
|
||||
'width': element.width(),
|
||||
'height': element.height()
|
||||
};
|
||||
|
||||
element.on('mouseenter', function(){
|
||||
that.stop();
|
||||
});
|
||||
|
||||
element.on('mouseleave', function(){
|
||||
that.start();
|
||||
});
|
||||
|
||||
this.start();
|
||||
},
|
||||
|
||||
start: function(){
|
||||
var that = this;
|
||||
this._interval = setInterval(function(){
|
||||
that._animate();
|
||||
}, this.options.period);
|
||||
},
|
||||
|
||||
stop: function(){
|
||||
clearInterval(this._interval);
|
||||
},
|
||||
|
||||
_animate: function(){
|
||||
var currentFrame = this._frames[this._currentIndex], nextFrame;
|
||||
this._currentIndex += 1;
|
||||
if (this._currentIndex >= this._frames.length) this._currentIndex = 0;
|
||||
nextFrame = this._frames[this._currentIndex];
|
||||
|
||||
switch (this.options.effect) {
|
||||
case 'slideLeft': this._effectSlideLeft(currentFrame, nextFrame); break;
|
||||
case 'slideRight': this._effectSlideRight(currentFrame, nextFrame); break;
|
||||
case 'slideDown': this._effectSlideDown(currentFrame, nextFrame); break;
|
||||
case 'slideUpDown': this._effectSlideUpDown(currentFrame, nextFrame); break;
|
||||
case 'slideLeftRight': this._effectSlideLeftRight(currentFrame, nextFrame); break;
|
||||
default: this._effectSlideUp(currentFrame, nextFrame);
|
||||
}
|
||||
},
|
||||
|
||||
_effectSlideLeftRight: function(currentFrame, nextFrame){
|
||||
if (this._currentIndex % 2 == 0)
|
||||
this._effectSlideLeft(currentFrame, nextFrame);
|
||||
else
|
||||
this._effectSlideRight(currentFrame, nextFrame);
|
||||
},
|
||||
|
||||
_effectSlideUpDown: function(currentFrame, nextFrame){
|
||||
if (this._currentIndex % 2 == 0)
|
||||
this._effectSlideUp(currentFrame, nextFrame);
|
||||
else
|
||||
this._effectSlideDown(currentFrame, nextFrame);
|
||||
},
|
||||
|
||||
_effectSlideUp: function(currentFrame, nextFrame){
|
||||
var _out = this._size.height;
|
||||
var options = {
|
||||
'duration': this.options.duration,
|
||||
'easing': this.options.easing
|
||||
};
|
||||
|
||||
$(currentFrame)
|
||||
.animate({top: -_out}, options);
|
||||
$(nextFrame)
|
||||
.css({top: _out})
|
||||
.show()
|
||||
.animate({top: 0}, options);
|
||||
},
|
||||
|
||||
_effectSlideDown: function(currentFrame, nextFrame){
|
||||
var _out = this._size.height;
|
||||
var options = {
|
||||
'duration': this.options.duration,
|
||||
'easing': this.options.easing
|
||||
};
|
||||
|
||||
$(currentFrame)
|
||||
.animate({top: _out}, options);
|
||||
$(nextFrame)
|
||||
.css({top: -_out})
|
||||
.show()
|
||||
.animate({top: 0}, options);
|
||||
},
|
||||
|
||||
_effectSlideLeft: function(currentFrame, nextFrame){
|
||||
var _out = this._size.width;
|
||||
var options = {
|
||||
'duration': this.options.duration,
|
||||
'easing': this.options.easing
|
||||
};
|
||||
|
||||
$(currentFrame)
|
||||
.animate({left: _out * -1}, options);
|
||||
$(nextFrame)
|
||||
.css({left: _out})
|
||||
.show()
|
||||
.animate({left: 0}, options);
|
||||
},
|
||||
|
||||
_effectSlideRight: function(currentFrame, nextFrame){
|
||||
var _out = this._size.width;
|
||||
var options = {
|
||||
'duration': this.options.duration,
|
||||
'easing': this.options.easing
|
||||
};
|
||||
|
||||
$(currentFrame)
|
||||
.animate({left: _out}, options);
|
||||
$(nextFrame)
|
||||
.css({left: -_out})
|
||||
.show()
|
||||
.animate({left: 0}, options);
|
||||
},
|
||||
|
||||
_destroy: function(){},
|
||||
|
||||
_setOption: function(key, value){
|
||||
this._super('_setOption', key, value);
|
||||
}
|
||||
})
|
||||
})( jQuery );
|
||||
|
||||
|
46
assets/js/metro/metro-loader.js
Executable file
@ -0,0 +1,46 @@
|
||||
var plugins = [
|
||||
'global',
|
||||
'core',
|
||||
'locale',
|
||||
'touch-handler',
|
||||
|
||||
'accordion',
|
||||
'button-set',
|
||||
'date-format',
|
||||
'calendar',
|
||||
'datepicker',
|
||||
'carousel',
|
||||
'countdown',
|
||||
'dropdown',
|
||||
'input-control',
|
||||
'live-tile',
|
||||
|
||||
'progressbar',
|
||||
'rating',
|
||||
'slider',
|
||||
'tab-control',
|
||||
'table',
|
||||
'times',
|
||||
'dialog',
|
||||
'notify',
|
||||
'listview',
|
||||
'treeview',
|
||||
'fluentmenu',
|
||||
'hint',
|
||||
'streamer',
|
||||
'stepper',
|
||||
'drag-tile',
|
||||
'scroll',
|
||||
'pull',
|
||||
'wizard',
|
||||
'panel',
|
||||
'tile-transform',
|
||||
|
||||
'initiator'
|
||||
|
||||
|
||||
];
|
||||
|
||||
$.each(plugins, function(i, plugin){
|
||||
$("<script/>").attr('src', 'js/metro/metro-'+plugin+'.js').appendTo($('head'));
|
||||
});
|
132
assets/js/metro/metro-locale.js
Executable file
@ -0,0 +1,132 @@
|
||||
(function($){
|
||||
$.Metro.currentLocale = 'en';
|
||||
|
||||
if (METRO_LOCALE != undefined) $.Metro.currentLocale = METRO_LOCALE; else $.Metro.currentLocale = 'en';
|
||||
//console.log(METRO_LOCALE, $.Metro.currentLocale);
|
||||
|
||||
$.Metro.Locale = {
|
||||
'en': {
|
||||
months: [
|
||||
"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December",
|
||||
"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
|
||||
],
|
||||
days: [
|
||||
"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday",
|
||||
"Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"
|
||||
],
|
||||
buttons: [
|
||||
"Today", "Clear", "Cancel", "Help", "Prior", "Next", "Finish"
|
||||
]
|
||||
},
|
||||
'fr': {
|
||||
months: [
|
||||
"Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre",
|
||||
"Jan", "Fév", "Mars", "Avr", "Mai", "Juin", "Juil", "Août", "Sept", "Oct", "Nov", "Déc"
|
||||
],
|
||||
days: [
|
||||
"Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi",
|
||||
"Di", "Lu", "Ma", "Me", "Je", "Ve", "Sa"
|
||||
],
|
||||
buttons: [
|
||||
"Aujourd'hui", "Effacer", "Annuler", "Aide", "Précedent", "Suivant", "Fin"
|
||||
]
|
||||
},
|
||||
'nl': {
|
||||
months: [
|
||||
"Januari", "Februari", "Maart", "April", "Mei", "Juni", "Juli", "Augustus", "September", "Oktober", "November", "December",
|
||||
"Jan", "Feb", "Mrt", "Apr", "Mei", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"
|
||||
],
|
||||
days: [
|
||||
"Zondag", "Maandag", "Dinsdag", "Woensdag", "Donderdag", "Vrijdag", "Zaterdag",
|
||||
"Zo", "Ma", "Di", "Wo", "Do", "Vr", "Za"
|
||||
],
|
||||
buttons: [
|
||||
"Vandaag", "Verwijderen", "Annuleren", "Hulp", "Vorige", "Volgende", "Einde"
|
||||
]
|
||||
},
|
||||
'ua': {
|
||||
months: [
|
||||
"Січень", "Лютий", "Березень", "Квітень", "Травень", "Червень", "Липень", "Серпень", "Вересень", "Жовтень", "Листопад", "Грудень",
|
||||
"Січ", "Лют", "Бер", "Кві", "Тра", "Чер", "Лип", "Сер", "Вер", "Жов", "Лис", "Гру"
|
||||
],
|
||||
days: [
|
||||
"Неділя", "Понеділок", "Вівторок", "Середа", "Четвер", "П’ятниця", "Субота",
|
||||
"Нд", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб"
|
||||
],
|
||||
buttons: [
|
||||
"Сьогодні", "Очистити", "Скасувати", "Допомога", "Назад", "Вперед", "Готово"
|
||||
]
|
||||
},
|
||||
'ru': {
|
||||
months: [
|
||||
"Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь",
|
||||
"Янв", "Фев", "Мар", "Апр", "Май", "Июн", "Июл", "Авг", "Сен", "Окт", "Ноя", "Дек"
|
||||
],
|
||||
days: [
|
||||
"Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота",
|
||||
"Вс", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб"
|
||||
],
|
||||
buttons: [
|
||||
"Сегодня", "Очистить", "Отменить", "Помощь", "Назад", "Вперед", "Готово"
|
||||
]
|
||||
},
|
||||
/** By NoGrief (nogrief@gmail.com) */
|
||||
'zhCN': {
|
||||
months: [
|
||||
"一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月",
|
||||
"一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"
|
||||
],
|
||||
days: [
|
||||
"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六",
|
||||
"日", "一", "二", "三", "四", "五", "六"
|
||||
],
|
||||
buttons: [
|
||||
"今日", "清除", "Cancel", "Help", "Prior", "Next", "Finish"
|
||||
]
|
||||
},
|
||||
'it': {
|
||||
months: [
|
||||
'Gennaio', 'Febbraio', 'Marzo', 'Aprile', 'Maggio', 'Giugno', 'Luglio', 'Agosto', 'Settembre', 'Ottobre', 'Novembre', 'Dicembre',
|
||||
'Gen',' Feb', 'Mar', 'Apr', 'Mag', 'Giu', 'Lug', 'Ago', 'Set', 'Ott', 'Nov', 'Dic'
|
||||
],
|
||||
days: [
|
||||
'Lunedì', 'Martedì', 'Mercoledì', 'Giovedì', 'Venerdì', 'Sabato', 'Domenica',
|
||||
'Lun', 'Mar', 'Mer', 'Gio', 'Ven', 'Sab', 'Dom'
|
||||
],
|
||||
buttons: [
|
||||
"Oggi", "Cancella", "Cancel", "Help", "Prior", "Next", "Finish"
|
||||
]
|
||||
},
|
||||
'de': {
|
||||
months: [
|
||||
"Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember",
|
||||
"Jan", "Feb", "Mrz", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"
|
||||
],
|
||||
days: [
|
||||
"Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag",
|
||||
"So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"
|
||||
],
|
||||
buttons: [
|
||||
"Heute", "Zurücksetzen", "Abbrechen", "Hilfe", "Früher", "Später", "Fertig"
|
||||
]
|
||||
},
|
||||
/** By Javier Rodríguez (javier.rodriguez at fjrodriguez.com) */
|
||||
'es': {
|
||||
months: [
|
||||
"Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre",
|
||||
"Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sept", "Oct", "Nov", "Dic"
|
||||
],
|
||||
days: [
|
||||
"Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado",
|
||||
"Do", "Lu", "Mar", "Mié", "Jue", "Vi", "Sáb"
|
||||
],
|
||||
buttons: [
|
||||
"Hoy", "Limpiar", "Cancel", "Help", "Prior", "Next", "Finish"
|
||||
]
|
||||
}
|
||||
};
|
||||
|
||||
$.Metro.setLocale = function(locale, data){
|
||||
$.Metro.Locale[locale] = data;
|
||||
};
|
||||
})(jQuery);
|
120
assets/js/metro/metro-notify.js
Executable file
@ -0,0 +1,120 @@
|
||||
(function($) {
|
||||
var _notify_container = false;
|
||||
var _notifies = [];
|
||||
|
||||
var Notify = {
|
||||
|
||||
_container: null,
|
||||
_notify: null,
|
||||
_timer: null,
|
||||
options: {
|
||||
icon: '', // to be implemented
|
||||
caption: '',
|
||||
content: '',
|
||||
shadow: true,
|
||||
width: 'auto',
|
||||
height: 'auto',
|
||||
style: false, // {background: '', color: ''}
|
||||
position: 'right', //right, left
|
||||
timeout: 3000
|
||||
},
|
||||
|
||||
init: function(options) {
|
||||
this.options = $.extend({}, this.options, options);
|
||||
this._build();
|
||||
return this;
|
||||
},
|
||||
|
||||
_build: function() {
|
||||
this._container = _notify_container || $("<div/>").addClass("metro notify-container").appendTo('body');
|
||||
_notify_container = this._container;
|
||||
var o = this.options;
|
||||
|
||||
if (o.content == '' || o.content == undefined) return false;
|
||||
|
||||
this._notify = $("<div/>").addClass("notify");
|
||||
|
||||
if (o.shadow) this._notify.addClass("shadow");
|
||||
if (o.style && o.style.background != undefined) this._notify.css("background-color", o.style.background);
|
||||
if (o.style && o.style.color != undefined) this._notify.css("color", o.style.color);
|
||||
|
||||
// add title
|
||||
if (o.caption != '' && o.caption != undefined) {
|
||||
$("<div/>").addClass("caption").html(o.caption).appendTo(this._notify);
|
||||
}
|
||||
// add content
|
||||
if (o.content != '' && o.content != undefined) {
|
||||
$("<div/>").addClass("content").html(o.content).appendTo(this._notify);
|
||||
}
|
||||
|
||||
if (o.width != 'auto') this._notify.css('min-width', o.width);
|
||||
if (o.height != 'auto') this._notify.css('min-height', o.height);
|
||||
|
||||
this._notify.hide().appendTo(this._container).fadeIn('slow');
|
||||
_notifies.push(this._notify);
|
||||
|
||||
this.close(o.timeout);
|
||||
|
||||
},
|
||||
|
||||
close: function(timeout) {
|
||||
this.clear();
|
||||
if(timeout == parseInt(timeout)) {
|
||||
var self = this
|
||||
this._timer = setTimeout(function() {
|
||||
self._timer = null;
|
||||
self._hide();
|
||||
}, timeout);
|
||||
return this;
|
||||
} else if(timeout == undefined) {
|
||||
return this._hide();
|
||||
}
|
||||
return this;
|
||||
},
|
||||
|
||||
clear: function() {
|
||||
if(this._timer != null) {
|
||||
clearTimeout(this._timer);
|
||||
this._timer = null;
|
||||
return this;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
},
|
||||
|
||||
_hide: function() {
|
||||
this.clear();
|
||||
|
||||
if(this._notify != undefined) {
|
||||
this._notify.hide('slow', function() {
|
||||
this.remove();
|
||||
_notifies.splice(_notifies.indexOf(this._notify), 1);
|
||||
});
|
||||
return this;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
},
|
||||
|
||||
closeAll: function() {
|
||||
_notifies.forEach(function(notEntry) {
|
||||
notEntry.hide('slow', function() {
|
||||
notEntry.remove();
|
||||
_notifies.splice(_notifies.indexOf(notEntry), 1);
|
||||
});
|
||||
});
|
||||
return this;
|
||||
}
|
||||
};
|
||||
|
||||
$.Notify = function(options) {
|
||||
return Object.create(Notify).init(options);
|
||||
}
|
||||
$.Notify.show = function(message, title) {
|
||||
return $.Notify({
|
||||
content: message,
|
||||
caption: title
|
||||
});
|
||||
};
|
||||
|
||||
})(jQuery);
|
41
assets/js/metro/metro-panel.js
Executable file
@ -0,0 +1,41 @@
|
||||
(function( $ ) {
|
||||
$.widget("metro.panel", {
|
||||
|
||||
version: "1.0.0",
|
||||
|
||||
options: {
|
||||
onCollapse: function(){},
|
||||
onExpand: function(){}
|
||||
},
|
||||
|
||||
_create: function(){
|
||||
var element = this.element, o = this.options,
|
||||
header = element.children('.panel-header'),
|
||||
content = element.children('.panel-content');
|
||||
|
||||
header.on('click', function(){
|
||||
content.slideToggle(
|
||||
'fast',
|
||||
function(){
|
||||
element.toggleClass('collapsed');
|
||||
if (element.hasClass('collapsed')) {
|
||||
o.onCollapse();
|
||||
} else {
|
||||
o.onExpand();
|
||||
}
|
||||
}
|
||||
);
|
||||
});
|
||||
},
|
||||
|
||||
_destroy: function(){
|
||||
|
||||
},
|
||||
|
||||
_setOption: function(key, value){
|
||||
this._super('_setOption', key, value);
|
||||
}
|
||||
})
|
||||
})( jQuery );
|
||||
|
||||
|
21
assets/js/metro/metro-plugin-template.js
Executable file
@ -0,0 +1,21 @@
|
||||
(function( $ ) {
|
||||
$.widget("metro.widget", {
|
||||
|
||||
version: "1.0.0",
|
||||
|
||||
options: {
|
||||
},
|
||||
|
||||
_create: function(){
|
||||
},
|
||||
|
||||
_destroy: function(){
|
||||
|
||||
},
|
||||
|
||||
_setOption: function(key, value){
|
||||
this._super('_setOption', key, value);
|
||||
}
|
||||
})
|
||||
})( jQuery );
|
||||
|
97
assets/js/metro/metro-progressbar.js
Executable file
@ -0,0 +1,97 @@
|
||||
(function( $ ) {
|
||||
$.widget("metro.progressbar", {
|
||||
|
||||
version: "1.0.1",
|
||||
|
||||
options: {
|
||||
value: 0,
|
||||
color: "bg-cyan",
|
||||
animate: false,
|
||||
max: 100,
|
||||
onchange: function(val){}
|
||||
},
|
||||
|
||||
_create: function(){
|
||||
var that = this,
|
||||
element = this.element,
|
||||
o = this.options;
|
||||
|
||||
if (element.data('value') != undefined) {
|
||||
this.value(element.data('value')+'%');
|
||||
}
|
||||
|
||||
if (element.data('color') != undefined) {
|
||||
o.color = element.data('color');
|
||||
}
|
||||
|
||||
if (element.data('animate') != undefined) {
|
||||
o.animate = element.data('animate');
|
||||
}
|
||||
|
||||
if (element.data('max') != undefined) {
|
||||
o.max = element.data('max');
|
||||
}
|
||||
o.max = o.max < 0 ? 0 : o.max;
|
||||
o.max = o.max > 100 ? 100 : o.max;
|
||||
|
||||
this._showBar();
|
||||
},
|
||||
|
||||
_showBar: function(newVal){
|
||||
//Default parameters
|
||||
newVal = newVal || this.options.value;
|
||||
|
||||
var element = this.element;
|
||||
|
||||
element.html('');
|
||||
|
||||
var bar = $("<div />");
|
||||
bar.addClass("bar");
|
||||
if (this.options.color.indexOf("bg-")+1)
|
||||
bar.addClass(this.options.color);
|
||||
else {
|
||||
bar.css('background', this.options.color);
|
||||
}
|
||||
bar.appendTo(element);
|
||||
if (this.options.animate) {
|
||||
bar.css('width', this.value() + '%').animate({ width: newVal + '%' });
|
||||
} else {
|
||||
bar.css('width', newVal + '%');
|
||||
}
|
||||
|
||||
this.options.onchange(this.value());
|
||||
},
|
||||
|
||||
value: function(val){
|
||||
if (val != undefined) {
|
||||
var parsedVal = parseInt(val);
|
||||
parsedVal = parsedVal > this.max ? this.max : parsedVal;
|
||||
parsedVal = parsedVal < 0 ? 0 : parsedVal;
|
||||
this._showBar(parsedVal);
|
||||
this.options.value = parsedVal;
|
||||
} else {
|
||||
return parseInt(this.options.value);
|
||||
}
|
||||
},
|
||||
|
||||
color: function(color){
|
||||
this.options.color = color;
|
||||
|
||||
if (this.options.color.indexOf("bg-")+1)
|
||||
this.element.find(".bar").addClass(this.options.color);
|
||||
else {
|
||||
this.element.find(".bar").css('background', this.options.color);
|
||||
}
|
||||
this._showBar();
|
||||
},
|
||||
|
||||
_destroy: function(){
|
||||
|
||||
},
|
||||
|
||||
_setOption: function(key, value){
|
||||
this._super('_setOption', key, value);
|
||||
}
|
||||
})
|
||||
})( jQuery );
|
||||
|
38
assets/js/metro/metro-pull.js
Executable file
@ -0,0 +1,38 @@
|
||||
(function( $ ) {
|
||||
$.widget("metro.pullmenu", {
|
||||
|
||||
version: "1.0.0",
|
||||
|
||||
options: {
|
||||
},
|
||||
|
||||
_create: function(){
|
||||
var that = this,
|
||||
element = this.element;
|
||||
|
||||
var menu = (element.data("relation") != undefined) ? element.data("relation") : element.parent().children(".element-menu, .horizontal-menu");
|
||||
|
||||
addTouchEvents(element[0]);
|
||||
|
||||
element.on("click", function(e){
|
||||
menu.slideToggle();
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
});
|
||||
|
||||
},
|
||||
|
||||
_destroy: function(){
|
||||
|
||||
},
|
||||
|
||||
_setOption: function(key, value){
|
||||
this._super('_setOption', key, value);
|
||||
}
|
||||
})
|
||||
})( jQuery );
|
||||
|
||||
$(window).resize(function(){
|
||||
var device_width = (window.innerWidth > 0) ? window.innerWidth : screen.width;
|
||||
if (device_width > 800) {$(".element-menu").show();} else {$(".element-menu").hide();}
|
||||
});
|